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

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

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

Почему параметры не обновляются на форме отчета?

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

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

Чтобы данные появились на форме, нам необходимо:

  1. Найти параметр в базовых настройках СКД.
  2. Получить у него свойство ИдентификаторПользовательскойНастройки.
  3. По этому идентификатору найти соответствующий элемент в коллекции КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.
  4. Установить нужное значение и свойство Использование = Истина именно там.

Как правильно передать список строк в СКД?

Рассмотрим вторую ошибку. При попытке передать сразу несколько номеров телефонов, многие пытаются записать их в виде одной строки через точку с запятой, например: "+79965750399;+79963233700". Но СКД строго типизирована. Для нее это не список из двух номеров, а просто одна длинная текстовая строка.

Чтобы система поняла, что это именно список, выполним следующие шаги:

  1. Убедимся, что в самом запросе СКД используется условие вхождения в массив, например: ГДЕ НомерТелефона В (&НомераТелефонов).
  2. В программном коде создадим объект типа СписокЗначений или Массив.
  3. Заполним этот список строками по отдельности.

Посмотрим на пример формирования такого списка:


МойПараметр = Новый СписокЗначений;
МойПараметр.Добавить("+79965750399");
МойПараметр.Добавить("+79932222251");

Способ 1: Установка параметров без отображения пользователю (под капотом)

Если нам нужно просто применить номера телефонов при формировании отчета, и пользователю не обязательно видеть этот список в шапке, лучше всего использовать предопределенную процедуру ПриКомпоновкеРезультата в модуле объекта отчета. В этом случае мы жестко устанавливаем параметры в базовые настройки.

Пример кода в модуле объекта:


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

Способ 2: Установка параметров на форме (с обновлением интерфейса)

Если требуется, чтобы пользователь увидел загруженные телефоны, смог их проверить или отредактировать до нажатия кнопки "Сформировать", нам необходимо работать с формой и обновлять пользовательские настройки.

Рассмотрим пример, когда мы по кнопке загружаем данные и выводим их в параметр отчета на клиенте:


&НаКлиенте
Процедура ЗагрузитьТелефоны(Команда)
    
    // 1. Формируем список (можно получать с сервера, из Excel и т.д.)
    СписокТелефонов = Новый СписокЗначений;
    СписокТелефонов.Добавить("+79965750399");
    СписокТелефонов.Добавить("+79963233700");
    
    // 2. Ищем параметр в базовых настройках, чтобы получить его идентификатор
    ПараметрыОтчета = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
    ПараметрБазовый = ПараметрыОтчета.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НомераТелефонов"));
    
    Если ПараметрБазовый <> Неопределено Тогда
        // 3. Ищем элемент в пользовательских настройках по идентификатору
        ИДНастройки = ПараметрБазовый.ИдентификаторПользовательскойНастройки;
        ПараметрПользовательский = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИДНастройки);
        
        Если ПараметрПользовательский <> Неопределено Тогда
            // 4. Устанавливаем список и включаем использование
            ПараметрПользовательский.Значение = СписокТелефонов;
            ПараметрПользовательский.Использование = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

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

← На главную