Как программно открыть отчет СКД с установленными отборами и автоматическим формированием?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей программного вызова типового отчета (например, в конфигурации ЗУП 3.1) с передачей в него определенных параметров и отборов. Типичная ситуация: форма открывается, настройки визуально присутствуют, но отчет остается пустым до тех пор, пока пользователь вручную не нажмет кнопку "Сформировать".

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

Почему отчет открывается пустым? Выясняем причину

Основная причина проблемы заключается в архитектуре управляемых форм и библиотеке стандартных подсистем (БСП). Когда мы получаем форму отчета программно через ПолучитьФорму() или ОткрытьФорму(), система инициализирует объект отчета и его КомпоновщикНастроек. Однако в современных конфигурациях настройки разделены на три уровня:

  1. Основные настройки: те, что заданы в схеме компоновки данных (СКД) или программно в коде.
  2. Пользовательские настройки: именно те значения, которые пользователь видит на форме в шапке или в окне настроек.
  3. Фиксированные настройки: жесткие ограничения, которые нельзя изменить в интерфейсе.

Если мы программно меняем значение в Отчет.КомпоновщикНастроек.Настройки, но при этом данный параметр выведен в пользовательские настройки, форма при открытии может приоритезировать ПользовательскиеНастройки, которые остались пустыми или содержат значения по умолчанию. В результате СкомпоноватьРезультат() выполняется по некорректным данным.

Разбор по шагам: Правильный метод через параметры формы

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

Проанализируем пример кода, который решает задачу установки периода и отбора по организации:


// 1. Подготавливаем уникальный идентификатор, чтобы не открыть старую копию формы
УникальныйИдентификатор = Новый УникальныйИдентификатор();

// 2. Формируем структуру параметров
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("КлючВарианта", "9617e7c9-11c5-4a3c-b069-dba5c36c8b9a");

// 3. Работа с отбором (упрощенный метод)
Отбор = Новый Структура("Организация", СсылкаНаОрганизацию);
ПараметрыФормы.Вставить("Отбор", Отбор);

// 4. Открываем форму
ОткрытьФорму("Отчет.ОтчетыПоСотрудникам.Форма", ПараметрыФормы, , УникальныйИдентификатор);

Использование параметра СформироватьПриОткрытии сообщает системе, что после инициализации всех настроек необходимо сразу инициировать процедуру компоновки. Параметр Отбор в виде структуры — это "быстрый" способ, который БСП автоматически транслирует в настройки компоновщика.

Синхронизация пользовательских настроек

Если упрощенный метод через структуру Отбор не подходит (например, нужен сложный вид сравнения "В списке" или работа с вложенными параметрами), необходимо программно подготовить объект ПользовательскиеНастройкиКомпоновкиДанных.

Разберем ситуацию, когда нам нужно установить параметр "Период" и убедиться, что он отобразится в интерфейсе отчета:


ОтчетОбъект = Отчеты.ОтчетыПоСотрудникам.Создать();
Компоновщик = ОтчетОбъект.КомпоновщикНастроек;
Схема = ОтчетОбъект.СхемаКомпоновкиДанных;

// Находим идентификатор пользовательской настройки для параметра "Период"
ИдентификаторНастройки = Компоновщик.Настройки.ПараметрыДанных.Элементы.Найти("Период").ИдентификаторПользовательскойНастройки;

// Если настройка найдена, устанавливаем её значение в Пользовательских настройках
Если ЗначениеЗаполнено(ИдентификаторНастройки) Тогда
    ЭлементНастройки = Компоновщик.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторНастройки);
    Если ЭлементНастройки <> Неопределено Тогда
        ЭлементНастройки.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
        ЭлементНастройки.Использование = Истина;
    КонецЕсли;
КонецЕсли;

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

ОткрытьФорму("Отчет.ОтчетыПоСотрудникам.Форма", ПараметрыФормы, , Истина);

Здесь важно обратить внимание на ИдентификаторПользовательскойНастройки. В СКД настройки параметров и отборов могут быть "вынесены" для редактирования пользователем. Если мы меняем значение просто в Настройках, а в ПользовательскихНастройках этот элемент остается со значением по умолчанию, система проигнорирует наш программный ввод.

Работа с типом СтандартныйПериод

Проанализируем распространенную ошибку: передачу обычной даты в параметр, который ожидает СтандартныйПериод. В типовых отчетах (ЗУП, ERP, БП) период — это почти всегда объект с двумя датами (начало и конец). Если записать туда просто ТекущаяДата(), отчет либо выдаст ошибку, либо не применит фильтр вовсе.

Всегда используйте конструктор: Новый СтандартныйПериод(ДатаНачала, ДатаКонца). Если нужно установить отчет на конкретный день, обе даты должны соответствовать этому дню (начало и конец дня).

Использование фиксированных настроек

Если ваша задача — сделать расшифровку, в которой пользователь не должен иметь возможности менять установленный вами отбор (например, отчет должен строго показывать данные по конкретному сотруднику), используйте ФиксированныеНастройки.

Рассмотрим, как это реализовать:


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

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", НастройкиФикс);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

ОткрытьФорму("Отчет.НужныйОтчет.Форма", ПараметрыФормы);

Фиксированные настройки накладываются на отчет "поверх" всех остальных. Они не видны в стандартном окне пользовательских настроек, что защищает результат от случайного искажения пользователем.

Важные нюансы и рекомендации

Подводя итог, можно сказать: наиболее надежный способ программного формирования отчета в современных конфигурациях 1С — это использование структуры параметров формы при её открытии. Прямое обращение к объекту Отчет и его компоновщику через ПолучитьФорму().Отчет часто приводит к конфликтам с механизмами автоматического сохранения и восстановления настроек БСП.

← На главную