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