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