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