При разработке расширений для конфигураций 1С часто возникает необходимость отреагировать на какое-либо системное событие, например, на запись документа или элемента справочника. Стандартным механизмом для этого являются подписки на события. Однако многие разработчики сталкиваются с ситуацией, когда в расширении кнопка «Добавить» в списке подписок просто неактивна. Разберем, почему так происходит и какие есть пути решения этой задачи. Если реакция на события необходима для передачи данных, используется автоматизация регулярного обмена данными между базами 1С по расписанию.
Главный фактор, влияющий на доступность создания подписок в расширении, — это версия платформы «1С:Предприятие» и установленный режим совместимости конфигурации.
Дело в том, что в ранних версиях платформы (например, 8.3.14, как в исходном вопросе) механизм расширений не поддерживал создание собственных объектов метаданных некоторых типов, включая подписки на события. Эта возможность появилась значительно позже.
Ключевой момент: возможность добавлять собственные подписки на события в расширениях появилась начиная с платформы версии 8.3.17 (конкретно — с релиза 8.3.17.1989).
Однако простого обновления платформы может быть недостаточно. Критически важную роль играет режим совместимости. Проанализируем ситуацию:
Решение: Чтобы активировать кнопку «Добавить», необходимо выполнить два условия:
Что делать, если обновить платформу или изменить режим совместимости нет возможности? В этом случае можно использовать другой мощный механизм расширений — расширение методов форм и модулей объектов. Это позволяет «встроиться» в выполнение стандартных процедур и функций.
Вместо создания подписки на событие ПередЗаписью или ПриЗаписи, мы можем расширить соответствующий обработчик в модуле самого объекта. Для этого используются аннотации &После, &Перед или &Вместо.
Посмотрим на пример. Допустим, нам нужно добавить свою логику перед и после записи документа. В расширении мы заимствуем нужный документ, создаем для него модуль и добавляем следующий код:
&После("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Здесь размещаем код, который должен выполниться
// после основного обработчика "ПередЗаписью".
// Например, можно вызвать общую процедуру из своего модуля.
МойОбщийМодуль.ВыполнитьПроверкиПередЗаписью(ЭтотОбъект, Отказ);
КонецПроцедуры
&После("ПриЗаписи")
Процедура Расш_ПриЗаписи(Отказ)
// Здесь размещаем код, который должен выполниться
// после основного обработчика "ПриЗаписи".
МойОбщийМодуль.ЗарегистрироватьИзменения(ЭтотОбъект);
КонецПроцедуры
Этот подход является надежной альтернативой и работает на более старых версиях платформы, позволяя достичь того же результата, что и подписка на событие.
Даже после того, как вы успешно создали подписку в расширении, могут возникнуть нюансы. Рассмотрим наиболее частые из них.
Это распространенная проблема. Вы создали подписку, в обычном режиме работы (тонкий или толстый клиент) все отрабатывает идеально, но при попытке провести документ через COM-соединение или веб-сервис система выдает ошибку, что метод обработчика не найден. Для верификации проводок, созданных такими обработчиками во внешних системах, предусмотрено автоматическое сравнение бухгалтерских и налоговых проводок между базами 1С.
Причина кроется в контексте выполнения. Для корректной работы обработчика подписки из расширения во внешнем соединении необходимо строго соблюсти несколько условий:
Экспорт.При настройке подписки в расширении возникает вопрос: какие объекты можно указывать в качестве источника? Здесь механизм очень гибкий.
Документ.РеализацияТоваровУслуг), так и собственные объекты, добавленные в этом же расширении.Важное ограничение: вы не можете заимствовать существующую подписку из основной конфигурации, чтобы изменить ее или добавить в нее свой обработчик. В расширении можно создать только новую, собственную подписку.
Когда на одно и то же событие (например, ПередЗаписью документа) есть обработчики в нескольких местах, важно понимать порядок их вызова. Он следующий:
ПередЗаписью() в модуле документа).Эта последовательность гарантирует, что логика расширения применяется поверх основной. Однако нужно помнить: если на предыдущем этапе (например, в подписке основной конфигурации) был установлен параметр Отказ = Истина, то ваш обработчик в расширении получит его уже в этом состоянии, и дальнейшая запись объекта будет отменена. Для практического исследования последовательности вызова системных процедур и событий платформы подойдёт обработка для изучения последовательности событий в 1С.