При работе с актуальными релизами конфигурации 1С:Управление производственным предприятием (УПП), начиная с версии 1.3.196.х, многие технические специалисты сталкиваются с досадной проблемой. При попытке создания или формирования новых регламентированных отчетов (особенно это касается алкогольной продукции) система внезапно прерывает работу с ошибкой: Метод объекта не обнаружен (ПредставлениеАдресаВФормате9Запятых). Ситуация осложняется тем, что официальная поддержка не всегда может воспроизвести это поведение на своих тестовых стендах.
В этой статье мы подробно разберем, почему возникает этот конфликт, проанализируем архитектурные особенности «гибридного» режима работы УПП и найдем эффективные способы устранения ошибки.
Давайте проанализируем ситуацию. Конфигурация УПП 1.3 исторически построена на обычных формах. Однако фирма «1С» активно внедряет в нее новые подсистемы и отчеты, разработанные уже на управляемых формах (УФ). Это касается, например, отчета РегламентированныйОтчетАлкоПриложение19 (Приложение №1: производство и оборот алкогольной продукции).
Проблема кроется в механизме компиляции кода. Функция ПредставлениеАдресаВФормате9Запятых, которая отвечает за формирование строкового представления адреса для отчетности, обычно располагается в одном из общих модулей (например, ОбщегоНазначения или специализированных модулях по работе с контактной информацией). В типовом решении код этой функции обернут в директиву препроцессора:
#Если ТолстыйКлиентОбычноеПриложение Тогда
Функция ПредставлениеАдресаВФормате9Запятых(ПараметрыАдреса) Экспорт
// Логика формирования адреса
КонецФункции
#КонецЕсли
Когда вы запускаете УПП в режиме «Толстый клиент (обычное приложение)», кажется, что всё должно работать. Но новые отчеты на управляемых формах работают в ином контексте. При открытии управляемой формы в сеансе обычного приложения выполнение некоторых процедур может инициироваться на стороне сервера или в контексте управляемого приложения. В этот момент препроцессор «скрывает» функцию, так как условие #Если ТолстыйКлиентОбычноеПриложение не выполняется для текущего контекста вызова. Результат — система «не видит» метод и выдает ошибку.
Рассмотрим подробнее, почему возникают разногласия с линией консультаций ИТС. Существует несколько факторов, влияющих на проявление бага:
/AppAutoCheckMode могут изменять логику работы препроцессора.Самый простой и эффективный способ исправить ошибку — это расширить область видимости функции ПредставлениеАдресаВФормате9Запятых. Нам нужно сделать так, чтобы она была доступна и серверу, и управляемому приложению, так как современные отчеты обращаются к ней именно оттуда.
Выполним следующие шаги:
ОбщегоНазначения или РаботаСАдресами).ПредставлениеАдресаВФормате9Запятых.Рекомендуемый вариант исправления кода:
#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение ИЛИ Сервер Тогда
Функция ПредставлениеАдресаВФормате9Запятых(ПараметрыАдреса) Экспорт
// Код функции остается без изменений
КонецФункции
#КонецЕсли
После такого изменения управляемая форма отчета сможет успешно вызвать метод вне зависимости от того, в каком режиме запущен основной интерфейс программы.
Если вы не хотите вносить изменения в типовую конфигурацию (чтобы не усложнять процесс последующих обновлений), воспользуемся механизмом расширений. Это более современный и правильный подход для исправления ошибок вендора.
Разберем алгоритм действий по шагам:
&НаСервере или &НаКлиентеНаСервереБезКонтекста в зависимости от логики вызова.&Вместо, чтобы перехватить вызов оригинальной функции.Пример кода в расширении:
&Вместо("ПредставлениеАдресаВФормате9Запятых")
Функция ИСПР_ПредставлениеАдресаВФормате9Запятых(ПараметрыАдреса)
// Копируем сюда оригинальный код функции или вызываем оригинал,
// если контекст позволяет (ПродолжитьВызов)
Возврат ОбщегоНазначения.ПредставлениеАдресаВФормате9Запятых(ПараметрыАдреса);
КонецФункции
Важный нюанс: при использовании расширений убедитесь, что у расширения снят флаг «Безопасный режим», иначе доступ к некоторым экспортным методам общих модулей может быть ограничен.
После внесения правок необходимо проверить работу отчета. Проанализируем правильный порядок проверки:
РегламентированныйОтчетАлкоПриложение19, а не версия «до 2021 г.»).Если форма открылась без системного сообщения «Метод объекта не обнаружен», значит, мы верно определили конфликт контекстов и успешно его устранили. Теперь отчетность будет формироваться корректно, используя стандартные механизмы обработки адресов, заложенные в конфигурации.
Подводя итог, можно сказать, что подобные ошибки — это следствие «болезни роста» старых конфигураций, которые вынуждены поддерживать новые технологии. Своевременный анализ директив препроцессора позволяет быстро локализовать проблему и вернуть работоспособность критически важным участкам учета.