В процессе разработки часто возникает задача заполнения табличной части документа данными, которые уже реализованы в типовом отчете на базе Системы Компоновки Данных (СКД). Разберем, как подойти к этой задаче профессионально, где искать источники данных и как правильно организовать программный вызов.
Прежде чем приступать к программному вызову отчета, важно понять, откуда он берет информацию. В типовых конфигурациях, таких как Бухгалтерия для Казахстана или ЗУП, отчеты часто имеют сложную структуру наборов данных. Чтобы «подсмотреть» логику, выполним следующие шаги:
СформироватьОтчетНаСервере в модуле формы отчета. Именно здесь инициализируются параметры компоновки.БухгалтерскиеОтчетыВызовСервера.СформироватьОтчет, чтобы понять, как формируется структура параметров отчета.Консолью системы компоновки данных. В ней можно увидеть итоговый макет, который генерируется после применения всех пользовательских отборов.Хотя технически возможно программно запустить ПроцессорКомпоновкиДанных и вывести результат в таблицу значений, мы рекомендуем использовать этот подход только для ознакомления. Важное предостережение: использование готового отчета для заполнения документа делает ваш код «хрупким». Если пользователь изменит настройки отчета, добавит группировку или исключит поле, ваш алгоритм перестанет работать.
Лучшим решением будет:
Запрос.Если задача все же требует вывода результата СКД в таблицу, разберем программный механизм. Для этого нам понадобится цепочка объектов платформы.
Рассмотрим по шагам логику реализации:
КомпоновщикМакетаКомпоновкиДанных для генерации макета.Выполнить, передав в качестве пятого параметра тип ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений. Это критически важно, иначе платформа подготовит данные для табличного документа, а не для таблицы значений.ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Пример программного формирования:
// Инициализация схемы и настроек
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Процессоры компоновки и вывода
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
При работе с этим методом необходимо учитывать специфические ограничения, которые накладывает платформа 1С:
ТаблицуЗначений.Мы проанализировали процесс работы с отчетами на СКД. Главный вывод: не стремитесь «переиспользовать» готовый отчет внутри кода документа. Лучше один раз потратить время на отладку запроса, вынесенного в отдельный метод модуля, чем зависеть от изменений в настройках типового отчета. Используйте Инструменты разработчика или штатную Консоль СКД, чтобы увидеть реальный текст запроса, который 1С отправляет к базе данных, и переносите его в свой код для максимальной производительности и надежности.