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