При работе в 1С:Бухгалтерия предприятия 3.0 (на управляемых формах) программисты часто сталкиваются с необходимостью кастомизации регламентированной отчетности. Самый очевидный путь — выгрузить типовой отчет во внешний файл, доработать его и подключить обратно — часто оборачивается каскадом ошибок. Это происходит из-за того, что архитектура подсистемы отчетности в современных конфигурациях жестко завязана на метаданные и общие модули.
В этой статье мы подробно разберем, как адаптировать выгруженный отчет, чтобы он корректно открывался, заполнялся и сохранялся в информационной базе.
При попытке открыть внешний отчет система часто выдает ошибку: Поле объекта не обнаружено (ВнешнийРегламентированныйОтчет...). Проанализируем ситуацию: в типовом коде обращение к формам и параметрам идет через коллекцию Отчеты, где система ищет отчет по его имени в дереве метаданных. Когда мы запускаем отчет как внешний, он не входит в эту коллекцию под своим старым именем.
Рассмотрим, как изменить обращение к данным формы. Вместо прямой попытки получить данные из коллекции Отчеты[ИсточникОтчета], нам необходимо получить контекст самого внешнего объекта. Для этого используем метод РеквизитФормыВЗначение.
Посмотрим на пример исправления кода в модуле формы:
// Было:
// ЗначениеВДанныеФормы(Отчеты[ИсточникОтчета].ТаблицаФормОтчета, мТаблицаФормОтчета);
// Стало:
ОтчетОбъект = РеквизитФормыВЗначение("Объект");
ЗначениеВДанныеФормы(ОтчетОбъект.ТаблицаФормОтчета, мТаблицаФормОтчета);
Таким образом, мы заставляем систему брать таблицу форм непосредственно из модуля внешнего отчета, а не искать его в составе конфигурации.
Следующая проблема, с которой мы столкнемся — получение макетов (например, СоставПоказателей). По умолчанию типовой код снова попытается обратиться к менеджеру отчета в конфигурации. Если мы внесли изменения в макеты внешнего файла, система их просто «не увидит».
Выясним причину: в модуле формы часто встречается код вида Отчеты["ИмяОтчета"].ПолучитьМакет(...). Выполним следующие шаги для исправления:
ОтчетОбъект с типом ВнешнийОтчет.ИмяВашегоОтчета (или используем существующий основной реквизит Объект).Рассмотрим программную реализацию:
// Вместо обращения к дереву конфигурации:
// МакетСостава = Отчеты["РегламентированныйОтчетАлкоПриложение7"].ПолучитьМакет("СоставПоказателей");
// Используем текущий контекст внешнего отчета:
ОтчетДляМакета = РеквизитФормыВЗначение("Объект");
МакетСостава = ОтчетДляМакета.ПолучитьМакет("СоставПоказателей");
Этот подход гарантирует, что макет будет взят именно из вашего внешнего .erf файла, что критически важно при доработке алгоритмов заполнения или печатных форм.
Одной из самых сложных проблем является ошибка преобразования данных XDTO при попытке сохранить заполненный отчет. Ошибка может выглядеть как Ошибка преобразования данных XDTO: НачалоСвойства: v.... Проанализируем ситуацию подробнее.
Эта ошибка возникает в момент передачи данных с клиента на сервер при записи. В регламентированных отчетах подсистемы 1С данные форм часто содержат сложные структуры, которые при использовании внешнего отчета не могут быть правильно сериализованы. Это происходит потому, что общие модули конфигурации ожидают объекты определенных типов (привязанных к метаданным), а получают типы внешнего отчета.
Для решения этой проблемы необходимо:
ПередЗаписьюНаСервере и ПриЗаписиНаСервере в модуле формы.РегламентированнаяОтчетность, не передаются ссылки на сам внешний отчет как на объект метаданных.ДеревоЗначений или специфических XDTO-объектов. Часто помогает принудительная очистка временных структур данных в реквизитах формы перед вызовом стандартных процедур сохранения.Проанализируем разницу в архитектуре. В старых версиях 1С:Предприятие 8 (на обычных формах) регламентированный отчет был практически автономным: в нем содержалась вся логика печати, выгрузки и сохранения. В Бухгалтерии 3.0 отчет стал «тонким». Практически вся «математика» — формирование XML-файла выгрузки, проверка контрольных соотношений и даже процесс записи в регистры — вынесена в общие модули конфигурации.
Когда мы используем внешний отчет, связь с этими модулями нарушается, так как они жестко запрограммированы на работу с объектами из ветки Отчеты метаданных. Именно поэтому простым «сохранить как внешний отчет» здесь не обойтись — требуется глубокая правка кода модуля формы и модуля объекта.
Если ваша задача — автоматизировать заполнение (например, для алкогольных деклараций с тысячами строк), использование внешнего отчета может быть не самым оптимальным путем. Рассмотрим более современный метод — Расширение конфигурации:
&После расширяем процедуру заполнения или расчета данных.Преимущества этого метода:
- Отчет остается «родным» для системы, поэтому не возникнет проблем с XDTO и сохранением.
- Все механизмы выгрузки и криптографии (особенно важные для ФСРАР) продолжат работать в штатном режиме.
- Обновления конфигурации пройдут легче, так как вы не меняете код самого отчета внутри базы, а лишь дополняете его функционал.
Таким образом, если вам крайне необходимо использовать именно внешний файл, обязательно используйте РеквизитФормыВЗначение для подмены контекста менеджера отчета на контекст объекта. Это позволит обойти большинство ошибок инициализации форм и макетов.