СКД программно: формирование отчёта, параметры и отборы

Дата: 18.09.2026 23:23:09
СКД
Отчеты
Компоновка данных
Таблица значений
Управляемые формы
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

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

Когда отчёт на СКД формируют из кода

  • Обработка показывает данные с отбором, который пользователь настраивает сам, и переписывать запрос под каждое новое условие не хочется.
  • Нужен результат существующего отчёта с его группировками и вычисляемыми полями — в файле, письме или в следующем шаге обработки.
  • Отчёту нужны данные, которых нет в базе: таблица из Excel, ответ внешнего сервиса, расчёт на встроенном языке.
  • Нужно выгрузить содержимое динамического списка с учётом отборов пользователя.
  • Стандартное формирование отчёта надо переопределить — например, подставить параметр, который пользователь не должен видеть.

Если пользователь ничего не настраивает и условие всегда одно, обычный Запрос проще и быстрее. Компоновка оправдана там, где нужны её сильные стороны: настройки, группировки, ресурсы, расшифровка.

Цепочка объектов компоновки

Программное формирование — это конвейер из пяти объектов, каждый передаёт результат следующему:

ШагОбъектЧто делает
1СхемаКомпоновкиДанныхОписывает данные: наборы, поля, параметры, ресурсы. Берётся из макета или создаётся кодом.
2КомпоновщикНастроекКомпоновкиДанныхХранит настройки: выбранные поля, отбор, порядок, структуру группировок, значения параметров.
3КомпоновщикМакетаКомпоновкиДанныхПо схеме и настройкам строит макет компоновки — план, какие запросы выполнить и как разложить результат.
4ПроцессорКомпоновкиДанныхИсполняет макет: выполняет запросы, подключает внешние наборы, считает итоги.
5ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент или ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначенийЗабирает готовые элементы результата и складывает их в табличный документ, таблицу или дерево значений.

В тонком и веб-клиенте из этой цепочки доступен только компоновщик настроек — для редактирования отбора на форме. Всё остальное работает на сервере.

Как сформировать отчёт СКД программно: общий модуль

Чтобы не копировать одну и ту же цепочку в каждую обработку, заведите общий модуль СКДПрограммно с флажком «Сервер» и без флажка «Вызов сервера». Нужна платформа 8.3.6 или новее с режимом совместимости конфигурации не ниже 8.3.6 — из-за СтрРазделить; замена для старых режимов указана в шапке модуля.

// Общий модуль СКДПрограммно.
// Свойства модуля: Сервер - Истина, Вызов сервера - Ложь,
// Внешнее соединение - по желанию.
// Платформа 8.3.6 и выше, режим совместимости конфигурации не ниже 8.3.6 (СтрРазделить).
// Для более старого режима совместимости замените СтрРазделить
// на СтрЗаменить + СтрПолучитьСтроку.

#Область ПрограммныйИнтерфейс

// Создает схему компоновки по тексту запроса.
// Поля набора данных определяются по тексту запроса автоматически.
//
// Параметры:
//  ТекстЗапроса - Строка - текст запроса, допускается расширение языка запросов СКД ({...}).
//
// Возвращаемое значение:
//  СхемаКомпоновкиДанных
//
Функция СхемаИзТекстаЗапроса(ТекстЗапроса) Экспорт

	Схема = Новый СхемаКомпоновкиДанных;

	Источник = Схема.ИсточникиДанных.Добавить();
	Источник.Имя = "ИсточникДанных1";
	Источник.ТипИсточникаДанных = "Local";

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

	Возврат Схема;

КонецФункции

// Создает компоновщик настроек по схеме и загружает в него вариант по умолчанию.
//
// Параметры:
//  Схема - СхемаКомпоновкиДанных
//
// Возвращаемое значение:
//  КомпоновщикНастроекКомпоновкиДанных
//
Функция КомпоновщикНастроек(Схема) Экспорт

	Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
	Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
	Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);

	Возврат Компоновщик;

КонецФункции

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

	Настройки = Компоновщик.Настройки;
	Настройки.Выбор.Элементы.Очистить();
	Настройки.Структура.Очистить();

	Если ПустаяСтрока(ИменаПолей) Тогда
		Для Каждого ДоступноеПоле Из Настройки.Выбор.ДоступныеПоляВыбора.Элементы Цикл
			// Папки и поля-таблицы (табличные части) в плоскую выгрузку не берем.
			Если Не ДоступноеПоле.Папка И Не ДоступноеПоле.Таблица Тогда
				ДобавитьВыбранноеПоле(Настройки, ДоступноеПоле.Поле);
			КонецЕсли;
		КонецЦикла;
	Иначе
		Для Каждого ИмяПоля Из СтрРазделить(ИменаПолей, ",", Ложь) Цикл
			ДобавитьВыбранноеПоле(Настройки, Новый ПолеКомпоновкиДанных(СокрЛП(ИмяПоля)));
		КонецЦикла;
	КонецЕсли;

	// Группировка без полей группировки - это "Детальные записи".
	Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	Группировка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));

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

// Устанавливает значение параметра данных и включает его использование.
// Если параметра с таким именем нет, вызывает исключение.
// Параметр с флагом "Ограничение использования" в настройки не попадает:
// его значение задают в схеме (Схема.Параметры).
//
// Параметры:
//  Настройки    - НастройкиКомпоновкиДанных
//  ИмяПараметра - Строка
//  Значение     - Произвольный
//
Процедура УстановитьПараметр(Настройки, ИмяПараметра, Значение) Экспорт

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

	Если ЗначениеПараметра = Неопределено Тогда
		ВызватьИсключение "В настройках СКД нет параметра """ + ИмяПараметра
			+ """. Проверьте имя и флаг ""Ограничение использования"" в схеме";
	КонецЕсли;

	ЗначениеПараметра.Значение = Значение;
	ЗначениеПараметра.Использование = Истина;

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

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

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

	Возврат Элемент;

КонецФункции

// Выполняет компоновку и выводит результат в табличный документ.
//
// Параметры:
//  Схема             - СхемаКомпоновкиДанных
//  Настройки         - НастройкиКомпоновкиДанных
//  ТабличныйДокумент - ТабличныйДокумент - очищается перед выводом.
//  ДанныеРасшифровки - ДанныеРасшифровкиКомпоновкиДанных, Неопределено
//  ВнешниеНаборы     - Структура, Неопределено - таблицы для наборов данных-объектов.
//
Процедура ВывестиВТабличныйДокумент(Схема, Настройки, ТабличныйДокумент,
	ДанныеРасшифровки = Неопределено, ВнешниеНаборы = Неопределено) Экспорт

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);

	Процессор = Новый ПроцессорКомпоновкиДанных;
	Процессор.Инициализировать(МакетКомпоновки, ВнешниеНаборы, ДанныеРасшифровки, Истина);

	ТабличныйДокумент.Очистить();
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
	ПроцессорВывода.Вывести(Процессор);

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

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

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,
		Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

	Процессор = Новый ПроцессорКомпоновкиДанных;
	Процессор.Инициализировать(МакетКомпоновки, ВнешниеНаборы, , Истина);

	Если КакДерево Тогда
		Результат = Новый ДеревоЗначений;
	Иначе
		Результат = Новый ТаблицаЗначений;
	КонецЕсли;

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(Результат);
	ПроцессорВывода.Вывести(Процессор);

	Возврат Результат;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ДобавитьВыбранноеПоле(Настройки, Поле)

	ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	ВыбранноеПоле.Поле = Поле;
	ВыбранноеПоле.Использование = Истина;

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

#КонецОбласти

На что обратить внимание в коде

  • ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию) — без неё компоновщик пустой. Настройки по умолчанию — это основной вариант, собранный в конструкторе схемы.
  • ПолучитьНастройки() вместо свойства Настройки — метод возвращает копию с влитыми пользовательскими и фиксированными настройками. Там же живут быстрые отборы, выставленные в форме отчёта.
  • Пятый параметр Выполнить — тип генератора. Для табличного документа его не передают, для таблицы и дерева значений нужен ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений: такой макет содержит только данные, без оформления.
  • Четвёртый параметр Инициализировать — возможность использования внешних функций. Истина разрешает вызывать экспортные функции общих модулей в выражениях вычисляемых полей и ресурсов.
  • ДанныеРасшифровки нужны, только если пользователь будет кликать по ячейкам отчёта. Один и тот же объект передаётся и в Выполнить, и в Инициализировать.

Откуда взять схему

Из макета отчёта или обработки

Схема — обычный макет типа «Схема компоновки данных». Из серверного кода её получают через менеджер: Отчеты.ИмяОтчета.ПолучитьМакет(ИмяМакета). В модуле объекта отчёта или обработки достаточно ПолучитьМакет(ИмяМакета), в модуле формы обработки — РеквизитФормыВЗначение("Объект").ПолучитьМакет(...). Метод возвращает копию: менять схему в коде можно, макет в конфигурации не изменится. Имя основной схемы отчёта берите из метаданных (свойство ОсновнаяСхемаКомпоновкиДанных), а не строкой: макет могли переименовать.

Типичный пример — форма обработки с полем табличного документа и кнопкой «Сформировать». Клиентский обработчик только вызывает сервер:

// Модуль формы обработки.
// Реквизиты формы: ДатаОстатков (Дата), Склад (СправочникСсылка.Склады),
// Результат (ТабличныйДокумент) - выведен на форму полем табличного документа.

&НаКлиенте
Процедура Сформировать(Команда)

	СформироватьНаСервере();

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

&НаСервере
Процедура СформироватьНаСервере()

	// Отчет ОстаткиТоваров и его параметр Период - для примера, подставьте свои.
	ИмяСхемы = Метаданные.Отчеты.ОстаткиТоваров.ОсновнаяСхемаКомпоновкиДанных.Имя;
	Схема = Отчеты.ОстаткиТоваров.ПолучитьМакет(ИмяСхемы);
	Компоновщик = СКДПрограммно.КомпоновщикНастроек(Схема);
	Настройки = Компоновщик.ПолучитьНастройки();

	// Остатки(&Период) не включают саму границу-дату: берем начало следующего дня,
	// чтобы попали и движения, проведенные в 23:59:59.
	СКДПрограммно.УстановитьПараметр(Настройки, "Период", КонецДня(ДатаОстатков) + 1);

	Если ЗначениеЗаполнено(Склад) Тогда
		СКДПрограммно.ДобавитьОтбор(Настройки.Отбор, "Склад", Склад);
	КонецЕсли;

	СКДПрограммно.ВывестиВТабличныйДокумент(Схема, Настройки, Результат);

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

Из текста запроса

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

У такой схемы есть подвох: варианта по умолчанию нет — ни выбранных полей, ни структуры. Если сразу отправить её на вывод, получите пустой результат и никакой ошибки. Эту дыру закрывает НастроитьДетальныеЗаписи: она добавляет выбранные поля и одну группировку без полей, то есть «Детальные записи».

// Модуль объекта обработки или серверный общий модуль:
// таблица значений на тонкий клиент не передается.
Функция ПродажиЗаПериод(НачалоПериода, КонецПериода) Экспорт

	// Регистр Продажи с ресурсами Количество и Сумма - для примера.
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	Продажи.Номенклатура КАК Номенклатура,
	|	Продажи.КоличествоОборот КАК Количество,
	|	Продажи.СуммаОборот КАК Сумма
	|ИЗ
	|	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи";

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

	Настройки = Компоновщик.ПолучитьНастройки();
	СКДПрограммно.УстановитьПараметр(Настройки, "НачалоПериода", НачалоДня(НачалоПериода));
	СКДПрограммно.УстановитьПараметр(Настройки, "КонецПериода", КонецДня(КонецПериода));

	Возврат СКДПрограммно.ВыгрузитьРезультат(Схема, Настройки);

КонецФункции

Параметры и отборы СКД программно

Значения параметров лежат в Настройки.ПараметрыДанных. Короткий вариант — Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Дата): использование он включает сам, но не сообщает, нашёлся ли параметр с таким именем. Поэтому модуль сначала ищет параметр через НайтиЗначениеПараметра и при опечатке вызывает исключение — не придётся гадать, почему отчёт пустой. Виды параметров, стандартный период и параметры с ограничением использования подробно разобраны в статье про параметры СКД.

Отбор в настройках — дерево из элементов и групп. По умолчанию элементы верхнего уровня объединяются через И, для ИЛИ и НЕ добавляют группу. Несколько частых вариантов:

// Склад в списке
СписокСкладов = Новый СписокЗначений;
СписокСкладов.ЗагрузитьЗначения(МассивСкладов);
СКДПрограммно.ДобавитьОтбор(Настройки.Отбор, "Склад", СписокСкладов,
	ВидСравненияКомпоновкиДанных.ВСписке);

// Номенклатура внутри группы справочника (с подчиненными группами)
СКДПрограммно.ДобавитьОтбор(Настройки.Отбор, "Номенклатура", ГруппаНоменклатуры,
	ВидСравненияКомпоновкиДанных.ВИерархии);

// Группа ИЛИ: наименование или артикул содержат строку поиска
ГруппаИли = Настройки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаИли.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ГруппаИли.Использование = Истина;
СКДПрограммно.ДобавитьОтбор(ГруппаИли, "Номенклатура.Наименование", СтрокаПоиска,
	ВидСравненияКомпоновкиДанных.Содержит);
СКДПрограммно.ДобавитьОтбор(ГруппаИли, "Номенклатура.Артикул", СтрокаПоиска,
	ВидСравненияКомпоновкиДанных.Содержит);

Имя поля в Новый ПолеКомпоновкиДанных(...) — это путь к данным в схеме (колонка «Путь» на закладке «Наборы данных»), а не заголовок колонки отчёта. Реквизиты ссылочных полей пишутся через точку. Проверить, что поле существует, можно так: Компоновщик.Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных("Склад")) вернёт Неопределено, если такого поля нет.

Параметр и отбор — не одно и то же. Параметр подставляется в запрос как есть, например дата для виртуальной таблицы остатков. Отбор — условие на поле, которое компоновка сама встраивает в запрос или применяет к результату. Дату остатков делайте параметром, склад или контрагента — отбором.

Переопределение формирования в модуле отчёта

Если отчёт уже есть и нужно лишь вмешаться в его формирование, код пишут в модуле объекта отчёта, в обработчике ПриКомпоновкеРезультата. Обязательно установите СтандартнаяОбработка = Ложь, иначе после вашего кода платформа выполнит ещё и стандартную компоновку.

// Модуль объекта отчета
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	// Та же схема, по которой инициализирован КомпоновщикНастроек отчета.
	// ПолучитьМакет возвращает копию, поэтому менять ее безопасно.
	Схема = ПолучитьМакет(Метаданные().ОсновнаяСхемаКомпоновкиДанных.Имя);

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

	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	СКДПрограммно.ВывестиВТабличныйДокумент(Схема, Настройки, ДокументРезультат, ДанныеРасшифровки);

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

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

Вывод результата в таблицу значений

Функция ВыгрузитьРезультат возвращает данные компоновки без оформления. Что нужно знать о результате:

  • Таблица значений принимает только одноуровневую структуру: одна группировка, обычно детальные записи. Если в варианте есть вложенные группировки, передайте КакДерево = Истина и получите дерево с той же иерархией.
  • Колонки создаются по выбранным полям. Для полей через точку имя колонки отличается от пути, поэтому перед обращением по имени посмотрите фактические имена в отладчике.
  • Условное оформление, заголовки и форматы в коллекцию не попадают — только значения.

Таблица на форме с отбором, как в отчёте

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

// Модуль формы обработки.
// Реквизиты формы: КомпоновщикОтбора (КомпоновщикНастроекКомпоновкиДанных),
// АдресСхемы (Строка), Товары (ТаблицаЗначений: Номенклатура, Количество, Сумма).
// Макет обработки СхемаОтбора: вариант по умолчанию - только детальные записи.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СхемаОтбора");
	АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);

	КомпоновщикОтбора.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
	КомпоновщикОтбора.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);

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

&НаКлиенте
Процедура Заполнить(Команда)

	ЗаполнитьНаСервере();

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

&НаСервере
Процедура ЗаполнитьНаСервере()

	Схема = ПолучитьИзВременногоХранилища(АдресСхемы);
	Данные = СКДПрограммно.ВыгрузитьРезультат(Схема, КомпоновщикОтбора.ПолучитьНастройки());

	Товары.Очистить();
	Для Каждого СтрокаДанных Из Данные Цикл
		ЗаполнитьЗначенияСвойств(Товары.Добавить(), СтрокаДанных);
	КонецЦикла;

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

Чтобы отбор появился на форме, перетащите в элементы КомпоновщикОтбора.Настройки.Отбор — платформа создаст готовую таблицу редактирования условий.

Данные динамического списка

Динамический список сам построен на компоновке, поэтому его данные выгружаются той же цепочкой. С версии 8.3.6 схему и настройки списка отдают методы ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных() элемента Элементы.Список. Отборы пользователя в них уже учтены, флажок «Произвольный запрос» роли не играет. Выгрузится весь список под отбором, а не порция строк на экране. Если пользователь сгруппировал список через «Ещё → Настроить список», передавайте КакДерево = Истина: многоуровневый результат в таблицу значений не выводится.

// Модуль формы с динамическим списком Список.
&НаСервере
Процедура ОбработатьДанныеСписка()

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

	// Пользователь мог сгруппировать список - тогда результат многоуровневый
	// и выгружать его нужно в дерево значений.
	ЕстьВложенность = Ложь;
	Для Каждого ЭлементСтруктуры Из Настройки.Структура Цикл
		Если ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаКомпоновкиДанных")
			И ЭлементСтруктуры.Структура.Количество() > 0 Тогда
			ЕстьВложенность = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Данные = СКДПрограммно.ВыгрузитьРезультат(Схема, Настройки, ЕстьВложенность);

	// Дальше - обработка на сервере: таблица и дерево значений
	// на тонкий клиент не передаются.

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

Подстраховка на случай пустой структуры и другие подводные камни — в статье об отборе динамического списка.

Типичные ошибки

  • «Тип не определен (КомпоновщикМакетаКомпоновкиДанных)» — код выполняется на клиенте. Перенесите формирование в процедуру &НаСервере или в серверный общий модуль.
  • Пустой отчёт без ошибок — в настройках нет структуры или выбранных полей. Для схемы из текста запроса вызовите НастроитьДетальныеЗаписи, для схемы из макета проверьте вариант по умолчанию в конструкторе.
  • Ошибка о том, что не установлено значение параметра — параметр есть в запросе, но в настройках не задан или у него снят флаг использования. Проверьте имя и Использование. Если в схеме у параметра стоит «Ограничение использования», в настройки он не попадает вовсе, и значение задают в самой схеме: Схема.Параметры.Найти("ДатаОтчета").Значение = ТекущаяДатаСеанса().
  • Ошибка при выводе в таблицу значений — макет собран без типа генератора для коллекции значений либо в структуре несколько уровней группировок.
  • Отбор «не работает» — поле указано заголовком вместо пути или отбор добавлен в Компоновщик.Настройки, а на вывод ушла копия, полученная через ПолучитьНастройки() раньше. Меняйте тот объект настроек, который передаёте в Выполнить.
  • Не открывается расшифровкаДанныеРасшифровки не переданы в Выполнить или в Инициализировать. В собственной форме их вдобавок надо сохранить во временное хранилище и обработать событие ОбработкаРасшифровки поля табличного документа.

Частые вопросы

Как сформировать отчёт по другому варианту настроек?

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

Можно ли выполнить компоновку на клиенте?

В тонком и веб-клиенте — нет. Формирование выносят в процедуру &НаСервере или в серверный общий модуль, а табличный документ, если он реквизит формы, возвращается на клиент вместе с формой.

Как сделать отбор по списку значений?

Вид сравнения ВСписке, а в ПравоеЗначениеСписокЗначений. Массив в список переводится одной строкой: СписокЗначений.ЗагрузитьЗначения(Массив). Для групп справочника с подчинёнными элементами есть ВСпискеПоИерархии.

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

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

Когда проще заказать

Если отчёт требует нескольких связанных наборов, расчётов на встроенном языке, собственной расшифровки или регулярной выгрузки, а тратить день на отладку компоновки некогда, отдайте задачу программисту. На 1c-only.ru это делают в рамках разработки отчётов и обработок 1С: разместите задачу — оценка бесплатная, ответ в течение рабочего дня.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.