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