При разработке расширений конфигурации разработчики нередко сталкиваются с ситуацией, когда требуется изменить логику типового общего модуля без снятия конфигурации с поддержки. Однако возможности механизма расширений напрямую зависят от установленного режима совместимости конфигурации. Разберем платформенные ограничения директив расширений, выясним причины сбоев регламентных заданий взаиморасчетов и рассмотрим все доступные варианты решения проблемы.
Проанализируем работу платформы 1С:Предприятие версии 8.3.8. В данном режиме совместимости механизм расширений имел жесткие рамки:
&Вместо, &Перед и &После для процедур и функций серверных общих модулей не поддерживаются — данный функционал полноценно появился только в платформе 8.3.9.&Вместо для метода общего модуля в режиме совместимости 8.3.8 приведет к синтаксической ошибке при проверке или применении расширения.Таким образом, полностью заглушить вызов процедуры общего модуля (например, вставить Возврат; в начало метода ПроверитьДатуЗапрета()) исключительно средствами расширения в режиме совместимости 8.3.8 технически невозможно.
Выясним механику возникновения ошибки в типовых конфигурациях (в частности, в «1С:Управление торговлей 11.3»). Предупреждение о печати счета-фактуры по устаревшим данным неразрывно связано с механизмом отложенного проведения и онлайн-взаиморасчетов:
ПроверитьДатуЗапрета() в модуле РаспределениеВзаиморасчетов выбрасывает исключение при попытке фонового пересчета движений прошлых дат.Самый безопасный и методически верный подход, не требующий изменения конфигурации и снятия совместимости, — правильная настройка подсистемы «Даты запрета изменения»:
Если требуется отменить выполнение стандартного действия при работе пользователя в форме, в режиме совместимости 8.3.8 доступно управление обработчиками событий формы через специальный метод УстановитьВыполнениеОбработчиковСобытия.
Посмотрим на пример переопределения логики события формы в модуле расширения:
&Вместо("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Отменяем выполнение типового обработчика формы
УстановитьВыполнениеОбработчиковСобытия(ЭтотОбъект, "ПриСозданииНаСервере", Ложь);
// Выполняем собственную адаптированную логику
Расш_ИнициализацияФормыСервер();
КонецПроцедуры
Однако данный метод применим только к событиям форм и элементов управления, но не позволяет перехватить фоновые серверные процедуры общих модулей.
Если настройка дат запрета не решает задачу и требуется гарантированно исключить проверку в фоновом задании до обновления на старшие релизы (УТ 11.4 / 11.5), оптимальным решением является точечная доработка основной конфигурации:
РаспределениеВзаиморасчетов.ПроверитьДатуЗапрета() и добавим условие на проверку фонового режима либо заблокируем вызов исключения:
Процедура ПроверитьДатуЗапрета(ПараметрыРасчета) Экспорт
// Пропускаем проверку даты запрета при автоматическом фоновом пересчете
Если ПараметрыРасчета.Свойство("ФоновыйПересчет") И ПараметрыРасчета.ФоновыйПересчет Тогда
Возврат;
КонецЕсли;
// Типовой код проверки даты запрета
// ...
КонецПроцедуры
Принудительное изменение режима совместимости конфигурации в свойствах корня (например, выставление 8.3.9 или «Не использовать») не рекомендуется, так как библиотеки стандартных подсистем (БСП) старых версий могут вызывать критические ошибки при вызовах функций проверки прав (таких как РольДоступна()) и динамических списков.
Рекомендуемым долгосрочным решением является плановое обновление конфигурации до актуальных версий линейки УТ 11.4 или УТ 11.5. В них режим совместимости повышен штатно, алгоритмы распределения движений переработаны, а механизм расширений позволяет безопасно модифицировать серверные процедуры любых общих модулей с помощью аннотации &Вместо.