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

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

1. Основы работы с параметрами СКД: структура и типы данных

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

  • 🔹 Имя — уникальный идентификатор (например, ПериодНачала)
  • 🔹 Тип значения — дата, число, строка, ссылка на справочник, булево и т.д.
  • 🔹 Значение по умолчанию — может быть статичным или динамически вычисляемым
  • 🔹 Видимость — отображается ли параметр в форме настройки отчета
  • 🔹 Множественность — может ли параметр принимать несколько значений (например, список организаций)

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

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

Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
⚠️ Внимание: Если параметр в СКД отмечен как Недоступен (свойство Доступность = Ложь), его значение нельзя изменить программно. Это частая причина ошибок при попытке заполнения"скрытых" параметров.
📊 Какой тип параметров СКД вы чаще всего заполняете программно?
Дата/время
Справочники (организации, номенклатура)
Булевы значения (флаги)
Числовые диапазоны
Другое

2. Способы программного заполнения параметров

Существует три основных подхода к заполнению параметров СКД, каждый из которых подходит для разных сценариев:

Способ Когда использовать Пример кода Ограничения
Прямое присваивание Простые параметры (дата, число, строка) Параметры.УстановитьЗначение("Период", ТекущаяДата) Не работает для сложных типов (массивы, таблицы)
Через коллекцию значений Множественные параметры (списки организаций, номенклатуры) Значение = Новый Массив;
Значение.Добавить(Справочники.Организации.НайтиПоНаименованию("ООО Ромашка"));
Параметры.УстановитьЗначение("Организации", Значение);
Требует предварительной подготовки данных
Динамическое вычисление Параметры, зависящие от других параметров или контекста Параметры.УстановитьЗначение("ДатаОкончания",
?((Параметры.ПолучитьЗначение("Период") = Неопределено)
ТекущаяДата,
КонецМесяца(Параметры.ПолучитьЗначение("Период"))));
Может усложнить поддержку кода

Наиболее универсальный метод — использование объекта КомпоновщикНастроек и его метода УстановитьЗначение. Пример базового заполнения:

// Получаем компоновщик настроек отчета

КомпоновщикНастроек = Отчет.КомпоновщикНастроек;

// Устанавливаем значение параметра"ПериодНачала"

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

"ПериодНачала",

НачалоМесяца(ТекущаяДата)

);

// Аналогично для параметра"Организация"

Организация = Справочники.Организации.НайтиПоНаименованию("ООО Альфа");

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

"Организация",

Организация

);

💡

Если параметр в СКД имеет тип СправочникСсылка.Организации, но вы передаете объект типа СправочникОбъект.Организации, получите ошибку. Всегда проверяйте соответствие типов через ТипЗнч

3. Работа с динамическими параметрами и фильтрами

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

  • 📅 Текущий месяц как период по умолчанию
  • 👤 Организацию пользователя из его профиля
  • 📊 Топ-5 номенклатуры по продажам за последний квартал

Для таких случаев используйте динамическое вычисление параметров. Пример кода для автозаполнения на основе данных пользователя:

// Получаем текущего пользователя

ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь;

// Находим его организацию (предполагаем, что она хранится в дополнительном реквизите)

ОрганизацияПользователя = ТекущийПользователь.Организация;

// Устанавливаем период: начало текущего месяца — сегодня

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

"ПериодНачала",

НачалоМесяца(ТекущаяДата)

);

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

"ПериодОкончания",

ТекущаяДата

);

// Если организация пользователя задана, используем её

Если ОрганизацияПользователя <> Неопределено Тогда

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

"Организация",

ОрганизацияПользователя

);

КонецЕсли;

Критическая особенность: если параметр в СКД имеет флаг"Множественный", его значение должно быть коллекцией (Массив, СписокЗначений или ТаблицаЗначений), даже если вы передаете один элемент. Например, для параметра"СписокОрганизаций" с флагом"Множественный" корректный код:

Организации = Новый Массив;

Организации.Добавить(Справочники.Организации.НайтиПоНаименованию("ООО Бета"));

Организации.Добавить(Справочники.Организации.НайтиПоНаименованию("ООО Гамма"));

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

"СписокОрганизаций",

Организации

);

⚠️ Внимание: При передаче коллекции значений в параметр СКД убедитесь, что все элементы коллекции имеют одинаковый тип. Например, нельзя в один параметр типа СправочникСсылка.Номенклатура передавать и ссылки на номенклатуру, и строки с наименованиями.

4. Заполнение параметров из внешних источников

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

4.1. Импорт параметров из файла JSON

Допустим, у вас есть JSON-файл с настройками отчета, который приходит из внешней системы. Чтобы загрузить параметры из него:

// Читаем JSON-файл

ТекстJSON = Новый ЧтениеТекста("C:\temp\parameters.json");

СтруктураПараметров = JSON.ПрочитатьJSON(ТекстJSON.Прочитать);

// Заполняем параметры СКД

Для Каждого Параметр Из СтруктураПараметров Цикл

ИмяПараметра = Параметр.Ключ;

ЗначениеПараметра = Параметр.Значение;

// Преобразуем строку в дату, если нужно

Если ТипЗнч(ЗначениеПараметра) = Тип("Строка") И СтрНачинаетсяС(ИмяПараметра,"Дата") Тогда

ЗначениеПараметра = СтрокаВДату(ЗначениеПараметра);

КонецЕсли;

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

ИмяПараметра,

ЗначениеПараметра

);

КонецЦикла;

4.2. Передача параметров из веб-формы (HTTP-сервис)

Если отчет запускается через HTTP-сервис или REST API, параметры могут приходить в теле запроса. Пример обработки:

// Получаем параметры из запроса (например, из POST-запроса)

Запрос = Новый HTTPЗапрос;

ПараметрыЗапроса = Запрос.ПолучитьПараметрыКакСтруктуру;

// Проверяем обязательные параметры

Если НЕ ПараметрыЗапроса.Свойство("dateFrom") Тогда

Возврат Новый HTTPОтвет(400,"Не указан параметр dateFrom");

КонецЕсли;

// Устанавливаем параметры в СКД

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

"ПериодНачала",

СтрокаВДату(ПараметрыЗапроса.dateFrom)

);

При работе с внешними источниками всегда валидируйте данные перед передачей в СКД. Например, проверяйте:

  • 🔢 Корректность формата дат (СтрокаВДату может выдать исключение)
  • 🔍 Существование ссылок на справочники (Справочники.Номенклатура.НайтиПоНаименованию может вернуть Неопределено)
  • 📏 Соответствие типов (например, число вместо строки)

Проверьте формат дат и чисел|Убедитесь, что справочные объекты существуют|Сопоставьте типы данных параметров СКД и передаваемых значений|Обработайте возможные исключения (например, Неопределено)|Проведите тестовое выполнение отчета с новыми параметрами-->

5. Типичные ошибки и их решения

Даже опытные разработчики сталкиваются с ошибками при программном заполнении параметров СКД. Вот TOP-5 проблем и способы их решения:

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

Особенно коварна ошибка, когда параметр визуально заполнен (видно в отладчике), но не применяется в отчете. Это обычно означает, что:

  • 🔗 Параметр не связан с полями отчета в схеме компоновки данных.
  • 🔄 Настройки отбора не обновлены после изменения параметров.
  • 🛠️ В коде отсутствует вызов КомпоновщикНастроек.Выполнить после заполнения параметров.

Чтобы диагностировать такие проблемы, используйте отладчик 1С с точкой останова на строке:

Отчет = КомпоновщикНастроек.Выполнить;

И проверьте, какие именно параметры передаются в компоновщик на момент выполнения.

Как проверить, какие параметры реально передаются в СКД?

В отладчике после заполнения параметров выполните код:

Для Каждого Параметр Из КомпоновщикНастроек.Настройки.ПараметрыДанных Цикл

Сообщить(Параметр.Имя +":" + Параметр.Значение);

КонецЦикла;

Это покажет актуальные значения всех параметров перед выполнением отчета.

6. Продвинутые сценарии: массовое заполнение и интеграция

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

  • 📂 Генерация отчетов по всем организациям за один запуск.
  • 📅 Формирование архива отчетов за несколько периодов (месяцев, кварталов).
  • 🔄 Интеграция с внешними системами, где параметры приходят пачками.

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

// Получаем список всех активных организаций

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Организация.Ссылка КАК Организация

|ИЗ

| Справочник.Организации КАК Организация

|ГДЕ

| Организация.ПометкаУдаления = ЛОЖЬ";

Результат = Запрос.Выполнить;

Выборка = Результат.Выбрать;

// Для каждой организации формируем отчет

Пока Выборка.Следующий Цикл

// Создаем новый компоновщик настроек (или сбрасываем текущий)

КомпоновщикНастроек = Отчет.КомпоновщикНастроек;

// Устанавливаем текущую организацию и период

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

"Организация",

Выборка.Организация

);

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

"ПериодНачала",

НачалоМесяца(ТекущаяДата)

);

// Выполняем отчет и сохраняем результат

РезультатОтчета = КомпоновщикНастроек.Выполнить;

РезультатОтчета.Сохранить(Каталог Temp +"Отчет_" + Выборка.Организация.Наименование +".mxl");

КонецЦикла;

Для интеграции с внешними системами (например, 1C:EDT или REST API) можно использовать сериализацию параметров в JSON/XML. Пример экспорта параметров СКД в JSON:

ПараметрыJSON = Новый Структура;

Для Каждого Параметр Из КомпоновщикНастроек.Настройки.ПараметрыДанных Цикл

// Преобразуем значение в строковый формат (например, дату в ISO-формат)

Если ТипЗнч(Параметр.Значение) = Тип("Дата") Тогда

ПараметрыJSON.Вставить(Параметр.Имя, Формат(Параметр.Значение,"ДФ=yyyy-MM-dd"));

Иначе

ПараметрыJSON.Вставить(Параметр.Имя, Параметр.Значение);

КонецЕсли;

КонецЦикла;

// Сериализуем в JSON

ТекстJSON = JSON.ЗаписатьJSON(ПараметрыJSON);

// Отправляем во внешнюю систему (пример для HTTPСервис)

HTTPЗапрос = Новый HTTPЗапрос("https://api.example.com/reports");

HTTPЗапрос.УстановитьТелоИзСтроки(ТекстJSON,"application/json");

HTTPОтвет = Новый HTTPСоединение.Получить(HTTPЗапрос);

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

7. Оптимизация и лучшие практики

Чтобы код заполнения параметров СКД был поддерживаемым и эффективным, следуйте этим рекомендациям:

  • 📌 Выносите логику заполнения в отдельные функции. Например:
    Процедура ЗаполнитьПараметрыОтчета(КомпоновщикНастроек, Организация, Период)
    

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

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

    КонецПроцедуры

  • 🔄 Используйте шаблоны параметров. Если у вас несколько отчетов с одинаковыми параметрами (например,"Период","Организация"), создайте универсальную процедуру заполнения.
  • 🛡️ Обрабатывайте исключения. Всегда оборачивайте заполнение параметров в Попытка...Исключение, особенно при работе с внешними данными.
  • 📝 Документируйте неочевидные параметры. Если параметр имеет сложную логику заполнения, добавьте комментарий в коде или в описание схемы СКД.

Пример оптимизированного кода с обработкой ошибок:

Процедура ЗаполнитьПараметрыСКД(КомпоновщикНастроек, СтруктураПараметров) Экспорт

Попытка

Для Каждого Параметр Из СтруктураПараметров Цикл

ИмяПараметра = Параметр.Ключ;

ЗначениеПараметра = Параметр.Значение;

// Проверяем существование параметра в СКД

Если НЕ КомпоновщикНастроек.Настройки.ПараметрыДанных.Свойство(ИмяПараметра) Тогда

Продолжить;

КонецЕсли;

// Преобразуем типы при необходимости

Если ТипЗнч(ЗначениеПараметра) = Тип("Строка") И

ТипЗнч(КомпоновщикНастроек.Настройки.ПараметрыДанных[ИмяПараметра].ТипЗначения) = Тип("Дата") Тогда

ЗначениеПараметра = СтрокаВДату(ЗначениеПараметра);

КонецЕсли;

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

ИмяПараметра,

ЗначениеПараметра

);

КонецЦикла;

Исключение

ЗаписатьЖурналРегистрации(

НСтр("ru ='Ошибка заполнения параметров СКД'"),

УровеньЖурналаРегистрации.Ошибка,

ПодробноеОписаниеОшибки(ИнформацияОбОшибке)

);

ВызватьИсключение;

КонецПопытки;

КонецПроцедуры

Также полезно кешировать часто используемые параметры, если они не меняются между запусками. Например, список всех организаций можно получить один раз и передавать в отчеты по ссылке.

💡

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

FAQ: Частые вопросы по программному заполнению параметров СКД

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

Если параметр СКД имеет тип"Массив" или отмечен как"Множественный", используйте Массив или СписокЗначений. Пример:

Запрос = Новый Запрос;

Запрос.Текст ="ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура.Ссылка КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг";

Результат = Запрос.Выполнить;

МассивНоменклатуры = Новый Массив;

Выборка = Результат.Выбрать;

Пока Выборка.Следующий Цикл

МассивНоменклатуры.Добавить(Выборка.Номенклатура);

КонецЦикла;

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

"СписокНоменклатуры",

МассивНоменклатуры

);

Можно ли программно установить значение параметра, который скрыт в форме отчета?

Да, но только если параметр не помечен как Недоступен в схеме СКД. Скрытые параметры (свойство Видимость = Ложь) можно заполнять программно:

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

"СкрытыйПараметр",

Истина

);

Если параметр недоступен (Доступность = Ложь), его значение изменить нельзя — это приведет к ошибке.

Как передать в параметр СКД таблицу значений?

Параметры СКД не поддерживают тип ТаблицаЗначений напрямую. Вместо этого:

  1. Создайте в схеме СКД параметр типа Структура или Массив.
  2. Преобразуйте таблицу значений в массив структур:
    МассивСтруктур = Новый Массив;
    

    Для Каждого Строка Из ТаблицаЗначений Цикл

    СтруктураСтроки = Новый Структура;

    СтруктураСтроки.Вставить("Поле1", Строка.Поле1);

    СтруктураСтроки.Вставить("Поле2", Строка.Поле2);

    МассивСтруктур.Добавить(СтруктураСтроки);

    КонецЦикла;

  3. Передайте массив в параметр СКД.

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

Почему после программного заполнения параметров отчет возвращает пустые данные?

Причин может быть несколько:

  1. Параметры не связаны с отбором. Проверьте в конфигураторе, используется ли параметр в настройках отбора схемы СКД.
  2. Не вызван метод Выполнить. После заполнения параметров обязательно выполните:
    Отчет = КомпоновщикНастроек.Выполнить;
  3. Ошибка в логике отбора. Например, если в параметре передается пустой массив, отбор может исключить все записи.
  4. Проблемы с правами. Убедитесь, что пользователь имеет права на данные, передаваемые в параметрах.

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

Как передать в параметр СКД значение по умолчанию, если оно не задано?

Используйте конструкцию с проверкой на Неопределено:

ЗначениеПараметра = Неопределено;

Если ПараметрыЗапроса.Свойство("Организация") Тогда

ЗначениеПараметра = ПараметрыЗапроса.Организация;

Иначе

// Получаем организацию по умолчанию (например, первую в списке)

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Организация.Ссылка КАК Организация ИЗ Справочник.Организации");

Результат = Запрос.Выполнить;

Если НЕ Результат.Пустой Тогда

ЗначениеПараметра = Результат.Выбрать.Организация;

КонецЕсли;

КонецЕсли;

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

"Организация",

ЗначениеПараметра

);