Как использовать встроенный регламентированный отчет в качестве внешнего в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Налоговый учет
← На главную

При работе в 1С:Бухгалтерия предприятия 3.0 (на управляемых формах) программисты часто сталкиваются с необходимостью кастомизации регламентированной отчетности. Самый очевидный путь — выгрузить типовой отчет во внешний файл, доработать его и подключить обратно — часто оборачивается каскадом ошибок. Это происходит из-за того, что архитектура подсистемы отчетности в современных конфигурациях жестко завязана на метаданные и общие модули.

В этой статье мы подробно разберем, как адаптировать выгруженный отчет, чтобы он корректно открывался, заполнялся и сохранялся в информационной базе.

Разбор первой ошибки: Поле объекта не обнаружено (ИсточникОтчета)

При попытке открыть внешний отчет система часто выдает ошибку: Поле объекта не обнаружено (ВнешнийРегламентированныйОтчет...). Проанализируем ситуацию: в типовом коде обращение к формам и параметрам идет через коллекцию Отчеты, где система ищет отчет по его имени в дереве метаданных. Когда мы запускаем отчет как внешний, он не входит в эту коллекцию под своим старым именем.

Рассмотрим, как изменить обращение к данным формы. Вместо прямой попытки получить данные из коллекции Отчеты[ИсточникОтчета], нам необходимо получить контекст самого внешнего объекта. Для этого используем метод РеквизитФормыВЗначение.

Посмотрим на пример исправления кода в модуле формы:


// Было:
// ЗначениеВДанныеФормы(Отчеты[ИсточникОтчета].ТаблицаФормОтчета, мТаблицаФормОтчета);

// Стало:
ОтчетОбъект = РеквизитФормыВЗначение("Объект"); 
ЗначениеВДанныеФормы(ОтчетОбъект.ТаблицаФормОтчета, мТаблицаФормОтчета);

Таким образом, мы заставляем систему брать таблицу форм непосредственно из модуля внешнего отчета, а не искать его в составе конфигурации.

Обращение к макетам внешнего отчета

Следующая проблема, с которой мы столкнемся — получение макетов (например, СоставПоказателей). По умолчанию типовой код снова попытается обратиться к менеджеру отчета в конфигурации. Если мы внесли изменения в макеты внешнего файла, система их просто «не увидит».

Выясним причину: в модуле формы часто встречается код вида Отчеты["ИмяОтчета"].ПолучитьМакет(...). Выполним следующие шаги для исправления:

  1. Добавим на форму реквизит ОтчетОбъект с типом ВнешнийОтчет.ИмяВашегоОтчета (или используем существующий основной реквизит Объект).
  2. Заменим получение макета через менеджер отчета на получение через объект.

Рассмотрим программную реализацию:


// Вместо обращения к дереву конфигурации:
// МакетСостава = Отчеты["РегламентированныйОтчетАлкоПриложение7"].ПолучитьМакет("СоставПоказателей");

// Используем текущий контекст внешнего отчета:
ОтчетДляМакета = РеквизитФормыВЗначение("Объект"); 
МакетСостава = ОтчетДляМакета.ПолучитьМакет("СоставПоказателей");

Этот подход гарантирует, что макет будет взят именно из вашего внешнего .erf файла, что критически важно при доработке алгоритмов заполнения или печатных форм.

Решение ошибки преобразования данных XDTO при сохранении

Одной из самых сложных проблем является ошибка преобразования данных XDTO при попытке сохранить заполненный отчет. Ошибка может выглядеть как Ошибка преобразования данных XDTO: НачалоСвойства: v.... Проанализируем ситуацию подробнее.

Эта ошибка возникает в момент передачи данных с клиента на сервер при записи. В регламентированных отчетах подсистемы 1С данные форм часто содержат сложные структуры, которые при использовании внешнего отчета не могут быть правильно сериализованы. Это происходит потому, что общие модули конфигурации ожидают объекты определенных типов (привязанных к метаданным), а получают типы внешнего отчета.

Для решения этой проблемы необходимо:

Почему в версии 3.0 это сложнее, чем в 2.0?

Проанализируем разницу в архитектуре. В старых версиях 1С:Предприятие 8 (на обычных формах) регламентированный отчет был практически автономным: в нем содержалась вся логика печати, выгрузки и сохранения. В Бухгалтерии 3.0 отчет стал «тонким». Практически вся «математика» — формирование XML-файла выгрузки, проверка контрольных соотношений и даже процесс записи в регистры — вынесена в общие модули конфигурации.

Когда мы используем внешний отчет, связь с этими модулями нарушается, так как они жестко запрограммированы на работу с объектами из ветки Отчеты метаданных. Именно поэтому простым «сохранить как внешний отчет» здесь не обойтись — требуется глубокая правка кода модуля формы и модуля объекта.

Альтернативный подход: использование расширений

Если ваша задача — автоматизировать заполнение (например, для алкогольных деклараций с тысячами строк), использование внешнего отчета может быть не самым оптимальным путем. Рассмотрим более современный метод — Расширение конфигурации:

  1. Создаем новое расширение.
  2. Добавляем в него нужный регламентированный отчет.
  3. Через механизм &После расширяем процедуру заполнения или расчета данных.

Преимущества этого метода: - Отчет остается «родным» для системы, поэтому не возникнет проблем с XDTO и сохранением. - Все механизмы выгрузки и криптографии (особенно важные для ФСРАР) продолжат работать в штатном режиме. - Обновления конфигурации пройдут легче, так как вы не меняете код самого отчета внутри базы, а лишь дополняете его функционал.

Таким образом, если вам крайне необходимо использовать именно внешний файл, обязательно используйте РеквизитФормыВЗначение для подмены контекста менеджера отчета на контекст объекта. Это позволит обойти большинство ошибок инициализации форм и макетов.

← На главную