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