При обновлении типовых конфигураций «1С:Предприятие» (в частности, «Бухгалтерия предприятия, редакция 3.0» начиная с релиза 3.0.79.14 и выше) разработчики часто сталкиваются с критическими ошибками компиляции в своих расширениях. Программа блокирует запуск и выдает сообщения об отсутствии модулей или функций, связанных с аббревиатурой МОТП. Давайте подробно разберем, почему возникает эта ошибка и как корректно переписать код в расширении, чтобы вернуть систему в рабочее состояние.
Обычно ошибка проявляет себя при попытке запустить информационную базу или выполнить проверку конфигурации. В окне сообщений об ошибках появляются следующие строки:
{Расширение1 Документ.ОплатаУслугЖКХ.Форма.ФормаДокументаОбщая.Форма(2333,56)}: Переменная не определена (ИнтеграцияМОТПВызовСервера)
КонтролироватьСтатусыКодовМаркировкиВРозницеМОТП = <<?>>ИнтеграцияМОТПВызовСервера.ИспользуетсяРегистрацияРозничныхПродажМОТП(Объект.Дата); (Проверка: Сервер)
{Расширение1 Документ.ОплатаУслугЖКХ.Форма.ФормаДокументаОбщая.Форма(2334,2)}: Процедура или функция с указанным именем не определена (ИспользуетсяРегистрацияРозничныхПродажМОТП)
<<?>>ИспользуетсяРегистрацияРозничныхПродажМОТП(Объект.Дата); (Проверка: Сервер)
Проблема заключается в том, что в коде формы документа (в данном случае ОплатаУслугЖКХ) содержатся обращения к общему модулю ИнтеграцияМОТПВызовСервера и его экспортному методу ИспользуетсяРегистрацияРозничныхПродажМОТП. После обновления системы этот модуль и его методы перестали существовать.
Для понимания природы ошибки обратимся к изменениям в законодательстве и архитектуре программных продуктов 1С. Ранее для мониторинга оборота табачной продукции использовалась отдельная обособленная подсистема МОТП (Мониторинг оборота табачной продукции). Со временем государственная система маркировки расширилась на обувь, одежду, лекарства, шины, парфюмерию и другие товарные группы под эгидой единого оператора «Честный Знак».
В связи с этим фирма «1С» провела масштабный глобальный рефакторинг своих конфигураций:
ИнтеграцияМОТПВызовСервера, а также сопутствующий модуль ИнтеграцияМОТПКлиентСерверПовтИсп были нацело удалены из типового решения.ИнтеграцияИСМПВызовСервера.Попытка интуитивно заменить имя функции на аналогичное, например ИспользуетсяРегистрацияРозничныхПродажИСМП, ни к чему не приведет. Архитектура контроля маркировки изменилась: теперь эти параметры проверяются на уровне настроек сканирования ИС МП и констант информационной базы, а старые точечные функции контроля по дате стали неактуальны.
Функция ИспользуетсяРегистрацияРозничныхПродажМОТП(Объект.Дата) в старых релизах проверяла, наступила ли уже законодательно установленная дата начала обязательной маркировки табака на момент проведения документа. Для большинства видов табачной продукции этот срок наступил еще 1 июля 2020 года.
Так как этот период давно остался в прошлом, любая динамическая проверка дат документов текущего периода гарантированно вернет значение Истина. Это дает нам простое и изящное решение проблемы.
Рассмотрим три основных способа адаптации вашего программного кода под новые реалии типовой конфигурации. Выберите наиболее подходящий под ваши бизнес-процессы вариант.
Поскольку обязательная маркировка табака уже давно действует в полной мере, нам больше не требуется динамически обращаться к общим модулям и проверять дату документа. Мы можем напрямую присвоить переменной значение булева типа.
Проанализируем старый код:
КонтролироватьСтатусыКодовМаркировкиВРозницеМОТП = ИнтеграцияМОТПВызовСервера.ИспользуетсяРегистрацияРозничныхПродажМОТП(Объект.Дата);
ИспользуетсяРегистрацияРозничныхПродажМОТП(Объект.Дата);
Заменим его в модуле расширения на следующий безопасный вариант:
КонтролироватьСтатусыКодовМаркировкиВРозницеМОТП = Истина;
Обратите внимание, что вторую строчку, содержащую дублирующий вызов несуществующей процедуры, мы просто удаляем из кода, так как она не несет никакой полезной нагрузки и является пережитком старых релизов.
Если вам требуется сохранять гибкость и проверять, ведется ли вообще учет маркированной продукции в вашей информационной базе (вдруг опция отключена в настройках администрирования), следует обратиться к актуальной функциональной опции единой подсистемы ИС МП.
Замените старые строки кода следующим выражением:
КонтролироватьСтатусыКодовМаркировкиВРозницеМОТП = ПолучитьФункциональнуюОпцию("ВестиУчетМаркируемойПродукцииИСМП");
Метод ПолучитьФункциональнуюОпцию() является стандартным методом платформы 1С и гарантирует стабильную работу механизма, возвращая Истина или Ложь в зависимости от настроек программы, без обращения к удаленным общим модулям.
Давайте проанализируем контекст вызова этой ошибки. В примере автора темы сбой происходит в документе ОплатаУслугЖКХ. Логично предположить, что при оплате коммунальных услуг розничная продажа и контроль статусов маркированного табака или обуви вообще не производятся.
Скорее всего, разработчик-предшественник создавал форму чека или печатную форму ЖКХ путем копирования стандартных процедур фискализации розничной продажи из документов типа «Реализация товаров» или «Розничная продажа (чек)». Вместе с рабочим кодом в расширение перекочевали лишние куски логики, которые не используются.
Если это так, то самым правильным решением будет полностью удалить или закомментировать эти строчки кода в расширении:
// Эти строки больше не требуются для документа оплаты услуг ЖКХ
// КонтролироватьСтатусыКодовМаркировкиВРозницеМОТП = ...
// ИспользуетсяРегистрацияРозничныхПродажМОТП(...);
Это позволит облегчить код расширения, избавит систему от лишних серверных вызовов и предотвратит появление подобных ошибок при последующих обновлениях конфигурации на новые релизы.