Как программно установить отбор в СКД для внешнего отчета в УТ 11.4 и подружить его со «Стандартными настройками»?

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

Разработка внешних отчетов на схеме компоновки данных (СКД) для современных конфигураций, таких как 1С:Управление торговлей 11.4, 1С:ERP или 1С:Комплексная автоматизация, имеет свою специфику. Эти программы построены на базе Библиотеки стандартных подсистем (БСП). Интеграция с БСП накладывает жесткие правила на работу с формами и настройками отчетов. Простая вставка кода «в лоб» часто приводит к тому, что отборы либо не работают, либо ломают стандартный интерфейс пользователя.

В этой статье мы подробно разберем, почему стандартные подходы могут давать сбой, как правильно связать модуль объекта отчета с формами БСП и как установить отборы так, чтобы они корректно сбрасывались при нажатии кнопки «Стандартные настройки».

Почему не вызывается процедура ПриСозданииНаСервере в модуле объекта?

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

Выясним причину этой проблемы. Дело в том, что модуль объекта отчета не связан с формой напрямую на уровне платформы. В БСП за работу отчетов отвечает единая общая форма. Чтобы эта общая форма начала транслировать свои события в модуль вашего внешнего отчета, необходимо явно зарегистрировать эту связь в системе.

Рассмотрим по шагам, как заставить общую форму вызывать процедуры в модуле объекта нашего отчета:

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

Только после выполнения этих двух условий общая форма БСП при своем создании выполнит вызов вашей процедуры ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт, расположенной в модуле объекта.

Почему ПриКомпоновкеРезультата — не лучший выбор для интерактивных отборов?

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


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

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

Способ 1. Статическая настройка отборов в СКД без использования кода

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

Разберем этот процесс по шагам:

  1. Откроем СКД вашего отчета и перейдем на вкладку «Настройки».
  2. В нижней части экрана выберем вкладку «Отбор» и добавим туда нужные поля (например, Склад со значением "Основной склад").
  3. Выделим добавленный элемент отбора и нажмем на кнопку «Свойства элемента пользовательской настройки» (иконка с изображением шестеренки в нижнем левом углу панели настроек).
  4. В открывшемся диалоговом окне установим флаг «Включать в пользовательские настройки». Здесь же можно указать режим отображения (например, «Быстрый доступ», чтобы отбор сразу выводился в шапке отчета).

При таком подходе при первом открытии отчета пользователь сразу увидит заполненный отбор. Он сможет легко изменить его значение или вовсе отключить его. При нажатии на кнопку «Стандартные настройки» система автоматически вернет настройки компоновщика к вашей дефолтной схеме.

Способ 2. Программная динамическая установка отборов через механизмы БСП

Что делать, если значение отбора должно определяться динамически в момент запуска (например, текущий авторизованный пользователь, текущая дата или результат выполнения какого-то запроса)? Использовать статические настройки схемы в таком случае невозможно.

Для решения этой задачи в БСП предусмотрено специальное событие — ПриЗагрузкеПользовательскихНастроекНаСервере. Особенность этого события в том, что оно вызывается системой только при инициализации отчета и при нажатии пользователем кнопки «Стандартные настройки». В обычный момент формирования отчета оно не срабатывает, что позволяет пользователю комфортно менять параметры «на лету».

Рассмотрим пример реализации этого механизма в модуле объекта отчета:

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

Этот способ является наиболее гибким и методологически верным при разработке в среде БСП. Программно установленные таким образом отборы корректно прописываются непосредственно в пользовательские настройки формы. Они выводятся в интерфейсе, могут быть отредактированы пользователем в процессе работы с отчетом, и гарантированно возвращаются к первоначальным динамическим значениям при сбросе настроек к стандартным.

← На главную