Top.Mail.Ru
Меню
Каталог Программы 1С Опыт и отзывы Услуги Компания Интересное Контакты

Программно открыть отчет СКД с отбором

Основатель и генеральный директор компании MoscowSoft, Сорокин Сергей
Сорокин Сергей, Генеральный директор MoscowSoft  17.10.2025 Актуальность проверена: 17.10.2025   5 мин.
Подобрать перенос данных 1С

Специализируемся на переносах данных 1С с 2015г.

Подобрать перенос данных 1С >>

Интеграция 1С с маркетплейсами

Специализируемся на интеграциях 1С с маркетплейсами с 2021г.

Изучить продукты >>

Содержание

Введение: понимаем, с чем мы работаем

Приветствую тебя, коллега! Сегодня мы с тобой разберем один из самых практичных вопросов в работе 1С-разработчика — как программно открыть отчет на Системе Компоновки Данных (СКД) с уже настроенным отбором. Поверь, это не просто теоретическое упражнение — умение делать это правильно пригодится тебе в каждом втором проекте.

СКД — это мощный инструмент 1С, который позволяет создавать гибкие отчеты. Но иногда пользователи не хотят каждый раз заходить в отчет и настраивать одни и те же отборы. Им нужна кнопка «нажал — получил готовый результат». Именно для таких случаев нам и нужно программное открытие отчетов с предустановленными настройками.

Базовые понятия: что нужно знать перед началом

Прежде чем мы погрузимся в код, давай разберемся с ключевыми понятиями, которые будут встречаться в наших примерах.

КомпоновщикНастроек — это основной объект, который управляет всеми настройками отчета. Именно через него мы можем программно устанавливать отборы, параметры и другие настройки.

Настройки компоновки данных — это структура, которая содержит все настройки отчета: группировки, отборы, сортировки, условное оформление.

Пользовательские настройки — это те настройки, которые может изменять пользователь в форме отчета. Они связаны с основными настройками специальными идентификаторами.

Отбор — это условие, которое ограничивает выборку данных в отчете. Отборы могут быть как жесткими (недоступными пользователю), так и мягкими (которые пользователь может изменить).

Способ первый: простое открытие с отбором через параметры формы

Начнем с самого простого и часто используемого способа. Этот метод отлично подходит, когда нужно быстро открыть отчет с базовым отбором :

&НаКлиенте
Процедура ОткрытьОтчетПоКлиенту(Команда)
	// Создаем структуру с условиями отбора
	УсловияОтбора = Новый Структура("Клиент", Элементы.Список.ТекущаяСтрока);
	
	// Формируем параметры для открытия формы
	ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", 
										УсловияОтбора, Истина);
	
	// Открываем форму отчета
	ОткрытьФорму("Отчет.ПродажиПоКлиентам.ФормаОтчета", ПараметрыФормы);
КонецПроцедуры

В этом примере мы используем два ключевых параметра :

  • Отбор — структура, где ключ — это имя поля отбора, а значение — искомое значение
  • СформироватьПриОткрытии — флаг, который говорит форме отчета сразу построить отчет после открытия

Этот способ прост, но имеет ограничения. Он подходит только для простых отборов типа «равно» и не дает возможности настроить другие виды сравнения.

Способ второй: работа с компоновщиком настроек напрямую

Когда нужна большая гибкость, мы работаем напрямую с компоновщиком настроек. Это более мощный способ, который позволяет настраивать не только отборы, но и другие параметры отчета :

&НаКлиенте
Процедура ОткрытьРасширенныйОтчет(Команда)
	// Получаем форму отчета
	ФормаОтчета = ПолучитьФорму("Отчет.ПродажиПоКлиентам.ФормаОтчета");
	
	// Получаем компоновщик настроек
	КомпоновщикНастроек = ФормаОтчета.Отчет.КомпоновщикНастроек;
	
	// Устанавливаем отбор
	УстановитьОтборСКД(КомпоновщикНастроек, "Клиент", Объект.Ссылка);
	УстановитьОтборСКД(КомпоновщикНастроек, "Период", 
						Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), 
												КонецМесяца(ТекущаяДата())));
	
	// Формируем отчет
	ФормаОтчета.СкомпоноватьРезультат();
	
	// Открываем форму
	ФормаОтчета.Открыть();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтборСКД(КомпоновщикНастроек, ИмяПоля, Значение)
	// Создаем поле компоновки данных
	ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
	
	// Добавляем новый элемент отбора
	НовыйОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(
					Тип("ЭлементОтбораКомпоновкиДанных"));
	
	// Настраиваем отбор
	НовыйОтбор.ЛевоеЗначение = ПолеОтбора;
	НовыйОтбор.ПравоеЗначение = Значение;
	НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	НовыйОтбор.Использование = Истина;
КонецПроцедуры

Здесь мы видим более гибкий подход. Мы можем устанавливать разные виды сравнения, добавлять несколько отборов, контролировать их использование.

Работа с различными видами сравнения

Одно из главных преимуществ прямой работы с компоновщиком — возможность использовать различные виды сравнения. Вот несколько практических примеров :

&НаКлиенте
Процедура УстановитьРазныеВидыОтбора(КомпоновщикНастроек)
	// Отбор "В списке" для нескольких значений
	МассивКлиентов = Новый Массив;
	МассивКлиентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ООО Рога"));
	МассивКлиентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ООО Копыта"));
	
	УстановитьОтборСВидомСравнения(КомпоновщикНастроек, "Клиент", 
									ВидСравненияКомпоновкиДанных.ВСписке, 
									МассивКлиентов);
	
	// Отбор "Больше" для суммы
	УстановитьОтборСВидомСравнения(КомпоновщикНастроек, "Сумма", 
									ВидСравненияКомпоновкиДанных.Больше, 
									100000);
	
	// Отбор "Содержит" для строки
	УстановитьОтборСВидомСравнения(КомпоновщикНастроек, "Комментарий", 
									ВидСравненияКомпоновкиДанных.Содержит, 
									"срочно");
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтборСВидомСравнения(КомпоновщикНастроек, ИмяПоля, 
											ВидСравнения, Значение)
	ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
	
	НовыйОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(
					Тип("ЭлементОтбораКомпоновкиДанных"));
	
	НовыйОтбор.ЛевоеЗначение = ПолеОтбора;
	НовыйОтбор.ВидСравнения = ВидСравнения;
	НовыйОтбор.ПравоеЗначение = Значение;
	НовыйОтбор.Использование = Истина;
КонецПроцедуры

Работа с параметрами отчета

Помимо отборов, часто нужно программно устанавливать параметры отчета. Это делается намного проще, чем с отборами :

&НаКлиенте
Процедура УстановитьПараметрыОтчета(КомпоновщикНастроек)
	// Установка периода отчета
	КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
		"НачалоПериода", НачалоМесяца(ТекущаяДата()));
	КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
		"КонецПериода", КонецМесяца(ТекущаяДата()));
	
	// Установка организации
	КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
		"Организация", ПараметрыСеанса.ТекущаяОрганизация);
КонецПроцедуры

С параметрами работать действительно проще — у них есть удобный метод УстановитьЗначениеПараметра, который сам найдет нужный параметр и установит значение.

Способ третий: формирование отчета на сервере

Иногда нужно не просто открыть форму отчета, а получить готовый табличный документ. Это полезно, когда отчет нужно отправить по почте, сохранить в файл или встроить в другую форму :

&НаКлиенте
Процедura ПолучитьОтчетВТабличныйДокумент(Команда)
	ТабДок = СформироватьОтчетНаСервере();
	ТабДок.Показать("Отчет по продажам " + Строка(Объект.Ссылка));
КонецПроцедуры

&НаСервере
Функция СформироватьОтчетНаСервере()
	// Создаем объект отчета
	ОтчетОбъект = Отчеты.ПродажиПоКлиентам.Создать();
	
	// Получаем настройки компоновщика
	НастройкиКД = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
	
	// Устанавливаем отбор
	НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(
					Тип("ЭлементОтбораКомпоновкиДанных"));
	НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Клиент");
	НовыйОтбор.ПравоеЗначение = Объект.Ссылка;
	НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	НовыйОтбор.Использование = Истина;
	
	// Загружаем настройки обратно в компоновщик
	ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);
	
	// Создаем табличный документ и компонуем результат
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
	
	Возврат ТабличныйДокумент;
КонецФункции

Этот способ хорош тем, что вся работа происходит на сервере, что быстрее и безопаснее. Полученный табличный документ можно использовать как угодно.

Работа с пользовательскими настройками

Один из самых сложных, но важных аспектов — работа с пользовательскими настройками. Дело в том, что отборы могут быть вынесены в пользовательские настройки, и тогда простое добавление отбора в основные настройки не сработает:

&НаКлиенте
Процедура УстановитьПользовательскийОтбор(КомпоновщикНастроек, ИмяПоля, Значение)
	// Сначала ищем отбор в основных настройках
	ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
	НайденныйОтбор = Неопределено;
	
	Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
		Если ЭлементОтбора.ЛевоеЗначение = ПолеОтбора Тогда
			НайденныйОтбор = ЭлементОтбора;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	// Если нашли отбор в основых настройках
	Если НайденныйОтбор <> Неопределено И 
		ЗначениеЗаполнено(НайденныйОтбор.ИдентификаторПользовательскойНастройки) Тогда
		
		// Ищем соответствующий элемент в пользовательских настройках
		ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
		ПользовательскийОтбор = ПользовательскиеНастройки.Элементы.Найти(
			НайденныйОтбор.ИдентификаторПользовательскойНастройки);
		
		Если ПользовательскийОтбор <> Неопределено Тогда
			ПользовательскийОтбор.Использование = Истина;
			ПользовательскийОтбор.ПравоеЗначение = Значение;
			ПользовательскийОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		КонецЕсли;
	Иначе
		// Если отбора нет в основных настройках, добавляем обычным способом
		НовыйОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(
						Тип("ЭлементОтбораКомпоновкиДанных"));
		НовыйОтбор.ЛевоеЗначение = ПолеОтбора;
		НовыйОтбор.ПравоеЗначение = Значение;
		НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		НовыйОтбор.Использование = Истина;
	КонецЕсли;
КонецПроцедуры

Этот код сначала проверяет, есть ли отбор в основных настройках и связан ли он с пользовательскими настройками. Если да, то устанавливает значение в пользовательских настройках. Если нет — добавляет новый отбор.

Работа с вариантами отчетов

Часто отчеты имеют несколько предустановленных вариантов. При программном открытии можно указать, какой именно вариант использовать:

&НаКлиенте
Процедура ОткрытьВариантОтчета(Команда)
	УсловияОтбора = Новый Структура("Клиент", Объект.Ссылка);
	
	ПараметрыФормы = Новый Структура();
	ПараметрыФормы.Вставить("Отбор", УсловияОтбора);
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
	ПараметрыФормы.Вставить("КлючВарианта", "ПоКлиентамДетально");
	
	ОткрытьФорму("Отчет.ПродажиПоКлиентам.ФормаОтчета", ПараметрыФормы);
КонецПроцедуры

Параметр "КлючВарианта" позволяет сразу открыть нужный вариант отчета, если он существует в схеме компоновки.

Передача пользовательских настроек при открытии

Более продвинутый способ — заранее сформировать пользовательские настройки и передать их в форму отчета:

&НаКлиенте
Процедура ОткрытьОтчетСПользовательскимиНастройками(Команда)
	ПользовательскиеНастройки = СформироватьПользовательскиеНастройки();
	
	ПараметрыФормы = Новый Структура();
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
	ПараметрыФормы.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
	
	ОткрытьФорму("Отчет.ПродажиПоКлиентам.ФормаОтчета", ПараметрыФормы);
КонецПроцедуры

&НаСервере
Функция СформироватьПользовательскиеНастройки()
	// Создаем объект отчета для получения компоновщика
	ОтчетОбъект = Отчеты.ПродажиПоКлиентам.Создать();
	КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
	
	// Устанавливаем параметр периода
	Для Каждого ПараметрСКД Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
		Если ТипЗнч(ПараметрСКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
			Если Строка(ПараметрСКД.Параметр) = "Период" Тогда
				ПараметрСКД.Значение = Новый СтандартныйПериод(
					НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
				ПараметрСКД.Использование = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат КомпоновщикНастроек.ПользовательскиеНастройки;
КонецФункции

Универсальная процедура для открытия отчетов

Давайте создадим универсальную процедуру, которая объединит все наши знания:

&НаКлиенте
Процедура ОткрытьОтчетУниверсально(ИмяОтчета, Отборы = Неопределено, 
									Параметры = Неопределено, КлючВарианта = Неопределено,
									СформироватьПриОткрытии = Истина) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", СформироватьПриОткрытии);
	
	// Если переданы простые отборы, используем их
	Если Отборы <> Неопределено Тогда
		ПараметрыФормы.Вставить("Отбор", Отборы);
	КонецЕсли;
	
	// Устанавливаем вариант отчета
	Если КлючВарианта <> Неопределено Тогда
		ПараметрыФормы.Вставить("КлючВарианта", КлючВарианта);
	КонецЕсли;
	
	// Если нужны сложные настройки, формируем их на сервере
	Если Параметры <> Неопределено Тогда
		ПользовательскиеНастройки = СформироватьСложныеНастройки(ИмяОтчета, 
																	Параметры);
		ПараметрыФормы.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
	КонецЕсли;
	
	ОткрытьФорму("Отчет." + ИмяОтчета + ".ФормаОтчета", ПараметрыФормы);
КонецПроцедуры

// Пример использования:
&НаКлиенте
Процедура ПримерИспользованияУниверсальнойПроцедуры(Команда)
	// Простой отбор
	Отборы = Новый Структура("Клиент", Объект.Ссылка);
	ОткрытьОтчетУниверсально("ПродажиПоКлиентам", Отборы);
	
	// С вариантом отчета
	ОткрытьОтчетУниверсально("ПродажиПоКлиентам", Отборы, , "Детализированный");
	
	// Со сложными параметрами
	СложныеПараметры = Новый Структура;
	СложныеПараметры.Вставить("Период", Новый СтандартныйПериод(НачалоГода(ТекущаяДата()), 
																КонецГода(ТекущаяДата())));
	ОткрытьОтчетУниверсально("ПродажиПоКлиентам", , СложныеПараметры);
КонецПроцедуры

Обработка ошибок и особые случаи

При программной работе с отчетами СКД важно предусмотреть обработку возможных ошибок:

&НаКлиенте
Процедура БезопасноОткрытьОтчет(Команда)
	Попытка
		// Проверяем существование отчета
		Если НЕ Метаданные.Отчеты.Найти("ПродажиПоКлиентам") <> Неопределено Тогда
			ПоказатьПредупреждение(, "Отчет не найден в конфигурации!");
			Возврат;
		КонецЕсли;
		
		// Проверяем права доступа
		Если НЕ ПравоДоступа("Просмотр", Метаданные.Отчеты.ПродажиПоКлиентам) Тогда
			ПоказатьПредупреждение(, "Недостаточно прав для открытия отчета!");
			Возврат;
		КонецЕсли;
		
		УсловияОтбора = Новый Структура("Клиент", Объект.Ссылка);
		ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", 
											УсловияОтбора, Истина);
		
		ОткрытьФорму("Отчет.ПродажиПоКлиентам.ФормаОтчета", ПараметрыФормы);
		
	Исключение
		ПоказатьПредупреждение(, "Ошибка при открытии отчета: " + 
								ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Оптимизация производительности

При работе с большими отчетами важно помнить о производительности:

&НаСервере
Функция СформироватьОптимизированныйОтчет()
	ОтчетОбъект = Отчеты.ПродажиПоКлиентам.Создать();
	
	// Отключаем ненужные группировки для ускорения
	НастройкиКД = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
	
	// Устанавливаем жесткие отборы для уменьшения выборки
	НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(
					Тип("ЭлементОтбораКомпоновкиДанных"));
	НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период");
	НовыйОтбор.ПравоеЗначение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()),
														КонецМесяца(ТекущаяДата()));
	НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	НовыйОтбор.Использование = Истина;
	
	// Отключаем подробные записи, если не нужны
	НастройкиКД.ВыводитьПодробныеЗаписи = Ложь;
	
	ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
	
	Возврат ТабличныйДокумент;
КонецФункции

Работа с внешними отчетами

Если ты работаешь с внешними отчетами, процедура немного отличается:

&НаСервере
Функция ПодключитьВнешнийОтчет(ИмяОтчета)
	Попытка
		ОтчетСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОтчета);
		
		Если ОтчетСсылка.Пустая() Тогда
			Возврат Ложь;
		КонецЕсли;
		
		ДвоичныеДанные = ОтчетСсылка.ХранилищеОбработки.Получить();
		АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
		
		ВнешниеОтчеты.Подключить(АдресХранилища, ИмяОтчета);
		Возврат Истина;
		
	Исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции

&НаКлиенте
Процедура ОткрытьВнешнийОтчет(Команда)
	Если ПодключитьВнешнийОтчет("МойВнешнийОтчет") Тогда
		УсловияОтбора = Новый Структура("Клиент", Объект.Ссылка);
		ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", 
											УсловияОтбора, Истина);
		
		ОткрытьФорму("ВнешнийОтчет.МойВнешнийОтчет.Форма", ПараметрыФормы);
	Иначе
		ПоказатьПредупреждение(, "Не удалось подключить внешний отчет!");
	КонецЕсли;
КонецПроцедуры

Практические советы и лучшие практики

Из моего опыта работы с СКД, вот несколько важных советов :

Всегда проверяй существование полей отбора. Если поле не существует в схеме компоновки, отчет упадет с ошибкой. Лучше заранее это проверить.

Используй серверные вызовы для сложной логики. Работа с компоновщиком настроек — это серверная операция, не пытайся делать это на клиенте.

Не забывай про права доступа. Проверяй, может ли пользователь открыть конкретный отчет.

Кэшируй настройки, если они используются часто. Создание объекта отчета и настройка компоновщика — довольно затратные операции.

Отладка и диагностика проблем

Когда что-то не работает, вот несколько способов найти проблему:

&НаСервере
Процедура ДиагностикаНастроекОтчета(ИмяОтчета)
	ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
	
	// Проверяем доступные поля отбора
	Для Каждого ПолеОтбора Из ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы Цикл
		Сообщить("Доступное поле отбора: " + Строка(ПолеОтбора.Поле));
	КонецЦикла;
	
	// Проверяем параметры
	Для Каждого Параметр Из ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы Цикл
		Сообщить("Параметр: " + Строка(Параметр.Параметр) + ", Значение: " + Строка(Параметр.Значение));
	КонецЦикла;
	
	// Проверяем существующие отборы
	Для Каждого Отбор Из ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
		Сообщить("Отбор: " + Строка(Отбор.ЛевоеЗначение) + " " + 
					Строка(Отбор.ВидСравнения) + " " + Строка(Отбор.ПравоеЗначение));
	КонецЦикла;
КонецПроцедуры

Заключение: собираем все вместе

Итак, мы разобрали различные способы программного открытия отчетов СКД с отбором. Каждый способ имеет свои преимущества и области применения:

  • Простое открытие через параметры формы — для быстрых задач с простыми отборами
  • Прямая работа с компоновщиком — для сложных случаев с гибкими настройками
  • Формирование на сервере — когда нужен готовый табличный документ
  • Работа с пользовательскими настройками — для интеграции с существующими настройками пользователя

Помни: правильный выбор метода зависит от конкретной задачи. Начинай с простого, усложняй только при необходимости. И не забывай про обработку ошибок — пользователи обязательно найдут способ сломать твой код, если ты этого не предусмотришь!

Программное открытие отчетов СКД — это мощный инструмент автоматизации, который значительно улучшает пользовательский опыт. Освоив эти техники, ты сможешь создавать по-настоящему удобные решения для своих пользователей.

MoscowSoft логотип

Нужна помощь?

Если не получается разобраться с вопросом самостоятельно, обратитесь к нам. Получите бесплатную консультацию эксперта!

Основатель и генеральный директор компании MoscowSoft, Сорокин Сергей
Сорокин Сергей, Генеральный директор MoscowSoft

Возврат к списку