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