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

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

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

Рассмотрим подробно причины такого поведения платформы 1С и разберем по шагам, как правильно заполнять параметры компоновки данных и передавать их в форму отчета.

Причины проблемы

Разберем основные причины, почему изменения в отбор не выводятся на форму:

  1. Разделение настроек и пользовательских настроек: Визуальные элементы отборов, вынесенные на форму для пользователя, связаны с коллекцией ПользовательскиеНастройки, а не с базовой коллекцией Настройки. Если изменить элемент только в КомпоновщикНастроек.Настройки, платформа обновит внутреннее значение схемы, но не обновит элементы управления на форме.
  2. Различие контекстов форм: Экземпляр КомпоновщикНастроек в форме настроек и КомпоновщикНастроек в основной форме отчета — это разные объекты. Изменение настроек в одном контексте не обновляет автозаполнением данные в другом без явной передачи.
  3. Связь через уникальный идентификатор: Если элемент отбора создается программно в основных настройках, платформа должна связать его с пользовательскими настройками через свойство ИдентификаторПользовательскойНастройки.

Шаг 1. Программное заполнение отбора в КомпоновщикеНастроек

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


РезультатЗапроса = ЗапросНоменклатуры.Выполнить().Выгрузить();

Если РезультатЗапроса.Количество() > 0 Тогда

    СписокНоменклатуры = Новый СписокЗначений;
    Для Каждого ЭлементТаблицы Из РезультатЗапроса Цикл
        СписокНоменклатуры.Добавить(ЭлементТаблицы.Номенклатура);
    КонецЦикла;

    ПолеОтбора = Новый ПолеКомпоновкиДанных("Номенклатура");

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

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

            Прервать;
        КонецЕсли;
    КонецЦикла;

КонецЕсли;

Шаг 2. Передача измененных настроек из формы настроек в форму отчета

Проанализируем порядок обмена данными между формой настроек и основной формой отчета:

  1. В обработчике закрытия формы настроек или по нажатию кнопки «Применить» вызовем механизм оповещения системы с помощью процедуры Оповестить(), передав обновленный КомпоновщикНастроек или непосредственно структуру отборов.
  2. В основной форме отчета перехватим событие в процедуре ОбработкаОповещения().
  3. В основной форме обновим КомпоновщикНастроек отчета полученными данными, используя метод ЗагрузитьНастройки() или ЗагрузитьПользовательскиеНастройки().

Таким образом, для успешного отображения программных отборов СКД необходимо синхронизировать свойства Настройки и ПользовательскиеНастройки компоновщика, а также корректно передавать обновленные данные между формами.

← На главную