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

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

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

1. Настройка схемы компоновки данных (СКД)

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

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

2. Подготовка данных: Массив или Список значений?

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

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


// Предположим, МассивНоменклатуры мы получили ранее при чтении Excel
ЗначениеНоменклатуры = Новый СписокЗначений;
ЗначениеНоменклатуры.ЗагрузитьЗначения(МассивНоменклатуры);

3. Поиск и установка параметра в настройках

Рассмотрим различные подходы к поиску нужного параметра в настройках компоновщика. Часто разработчики обращаются к параметрам по индексу коллекции Элементы[0] или ищут по строковому имени через Найти("Номенклатура"). Посмотрим на пример такого не самого надежного кода:


// Устаревший или менее надежный подход
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Номенклатура");
ПараметрСКД.Значение = ЗначениеНоменклатуры;
ПараметрСКД.Использование = Истина;

Более правильным и устойчивым к ошибкам способом в платформе 1С является использование объекта ПараметрКомпоновкиДанных в связке с методом НайтиЗначениеПараметра. Разберем этот пример:


ИмяПараметра = Новый ПараметрКомпоновкиДанных("Номенклатура");
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ИмяПараметра);

Если ПараметрСКД <> Неопределено Тогда
    ПараметрСКД.Значение = ЗначениеНоменклатуры;
    ПараметрСКД.Использование = Истина; // Обязательно включаем использование параметра
КонецЕсли;

Также можно воспользоваться более лаконичным методом, если он доступен в вашем контексте:


КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Номенклатура"), ЗначениеНоменклатуры);

4. Пользовательские настройки против общих настроек

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

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

Проанализируем правильную логику работы, если параметр выведен на форму:

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

Пример реализации:


ИмяПараметра = Новый ПараметрКомпоновкиДанных("Номенклатура");
БазовыйПараметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ИмяПараметра);

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

Используя приведенный подход, мы гарантированно заполним параметр СКД, независимо от того, выведен ли он для редактирования пользователю или скрыт в общих настройках отчета.

← На главную