При работе с программными продуктами 1С на базе обычных форм, такими как «Бухгалтерия предприятия 2.0», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1», пользователи могут столкнуться с критической ошибкой при попытке выгрузки или печати регламентированной отчетности. Особенно остро эта проблема проявилась в релизе 2.0.66.91.
В этой статье мы подробно разберем, почему возникает ошибка Метод объекта не обнаружен (ОписаниеРегОтчета), как проанализировать программный код и какие изменения необходимо внести в конфигурацию, чтобы восстановить работоспособность системы. Мы пройдем по шагам от диагностики до окончательного исправления кода.
Типичная ситуация выглядит следующим образом: бухгалтер пытается выгрузить подготовленный отчет (например, декларацию по алкогольной продукции или иную регламентированную форму), но система прерывает выполнение операции и выдает сообщение об ошибке следующего содержания:
{Обработка.ОбщиеОбъектыРегламентированнойОтчетности.Форма.УправлениеОтчетностью.Форма(3927)}: Метод объекта не обнаружен (ОписаниеРегОтчета)
ОписаниеОтчета = ОбщийМодульАЛКОВызовСервера.ОписаниеРегОтчета(Док);
Проанализируем контекст возникновения ошибки. Вызов функции происходит из формы обработки, при этом сам объект ОбщийМодульАЛКОВызовСервера определяется динамически с помощью функции Вычислить. Рассмотрим строки кода, которые вызывают сбой:
ОбщийМодульАЛКОВызовСервера = Вычислить("РегламентированнаяОтчетностьАЛКОВызовСервера");
ОписаниеОтчета = ОбщийМодульАЛКОВызовСервера.ОписаниеРегОтчета(Док);
На первый взгляд код кажется корректным, однако система сообщает, что в модуле РегламентированнаяОтчетностьАЛКОВызовСервера отсутствует функция ОписаниеРегОтчета. При этом, если мы откроем конфигуратор, мы увидим, что эта функция там есть и помечена ключевым словом Экспорт.
Давайте разберем, почему конфигурация «не видит» существующую функцию. Ключ к разгадке кроется в настройках общего модуля и использовании директив препроцессора. Проанализируем свойства модуля РегламентированнаяОтчетностьАЛКОВызовСервера. Обычно у него установлены флаги: Сервер и Вызов сервера.
Теперь заглянем внутрь самого модуля. В проблемном релизе код функции ОписаниеРегОтчета обернут в следующую конструкцию:
#Если ТолстыйКлиентОбычноеПриложение Тогда
Функция ОписаниеРегОтчета(ДокументРегОтчет) Экспорт
// Здесь логика получения описания отчета
Возврат Результат;
КонецФункции
#КонецЕсли
Выясним, что происходит в момент выполнения программы. Если ваша база данных работает в файловом режиме, ошибка может не проявляться, так как границы между клиентом и сервером в этом режиме размыты. Однако в клиент-серверном варианте (SQL), когда вызов происходит на стороне сервера, условие #Если ТолстыйКлиентОбычноеПриложение не выполняется. Сервер 1С:Предприятия не является «Толстым клиентом», поэтому для него весь код внутри этой директивы просто не существует. Отсюда и возникает сообщение о том, что метод не обнаружен.
Это классическая ошибка разработчиков типового решения, которые при обновлении механизмов алкогольной отчетности не учли контекст исполнения кода в серверной среде.
Рассмотрим основной способ исправления данной ошибки. Если вы не можете прямо сейчас обновить конфигурацию до исправленного релиза (например, 2.0.66.92), вам потребуется внести изменения вручную в конфигураторе. Обратите внимание: перед внесением изменений обязательно создайте резервную копию информационной базы!
Это самый правильный и быстрый метод. Нам нужно расширить область видимости функции, чтобы она была доступна и на стороне сервера.
РегламентированнаяОтчетностьАЛКОВызовСервера.ОписаниеРегОтчета.#Если ТолстыйКлиентОбычноеПриложение Тогда напишите:
#Если ТолстыйКлиентОбычноеПриложение Или Сервер Тогда
// ... текст функции ...
#КонецЕсли
Для обеспечения максимальной совместимости (например, если выгрузка будет инициирована через внешнее соединение или фоновое задание), рекомендуется использовать еще более полную конструкцию:
#Если ТолстыйКлиентОбычноеПриложение Или Сервер Или ВнешнееСоединение Тогда
Функция ОписаниеРегОтчета(ДокументРегОтчет) Экспорт
// Тело функции остается без изменений
КонецФункции
#КонецЕсли
Фирма 1С оперативно выпустила исправление этой ошибки. Если ваш программный продукт находится на поддержке, лучшим решением будет обновление до релиза 2.0.66.92 или выше для БП 2.0. В этих версиях разработчики уже привели директивы препроцессора в соответствие с требованиями клиент-серверной архитектуры.
Разберем интересный момент из Сообщения 1, где автор спрашивает о смысле строки Вычислить("РегламентированнаяОтчетностьАЛКОВызовСервера"). Посмотрим на ситуацию с точки зрения архитектора системы:
Использование метода Вычислить или Выполнить для получения ссылки на общий модуль применяется для обеспечения отложенного связывания. Это позволяет коду оставаться работоспособным, даже если в конкретной версии конфигурации данного модуля не существует. Это часто используется в универсальных механизмах отчетности, которые кочуют из одной конфигурации в другую (из БП в УПП и т.д.). Однако именно это усложняет диагностику, так как ошибка проявляется не в момент компиляции модуля, а непосредственно при выполнении кода в режиме «1С:Предприятие».
Проанализируем ситуацию, когда код уже исправлен, но ошибка продолжает возникать. Это может быть связано с кэшированием скомпилированных модулей на сервере. Рассмотрим алгоритм действий в этом случае:
Agent 1C:Enterprise, перейти в каталог сеансовых данных и удалить папки с временными файлами конфигурации.Подведем итог. Рассмотренная проблема является типичным примером ошибки «окружения», когда код успешно проходит тесты в файловой базе у разработчика, но «падает» в реальных условиях эксплуатации на SQL-сервере из-за жестких ограничений препроцессора. Своевременное добавление флага Сервер в условия видимости функций — залог стабильной работы регламентированной отчетности.