Формировать отчёт на СКД программно в 1С 8.3 приходится, когда результат компоновки нужен не в форме отчёта, а в коде: в обработке, в файле или в таблице значений для следующего шага. Ниже — серверный общий модуль под эти сценарии и разбор: как устроена цепочка объектов компоновки, как задать параметры и отборы из кода, как вывести результат в табличный документ или таблицу значений и на каких ошибках спотыкаются чаще всего.
Если пользователь ничего не настраивает и условие всегда одно, обычный Запрос проще и быстрее. Компоновка оправдана там, где нужны её сильные стороны: настройки, группировки, ресурсы, расшифровка.
Программное формирование — это конвейер из пяти объектов, каждый передаёт результат следующему:
| Шаг | Объект | Что делает |
|---|---|---|
| 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С: разместите задачу — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.