Как реализовать регламентные задания, подписки на события и константы в расширениях 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Расширения конфигурации — это мощный инструмент кастомизации прикладных решений без снятия основной конфигурации с поддержки. Однако разработчики часто сталкиваются с тем, что в старых версиях платформы (до 8.3.18) многие привычные объекты, такие как РегламентныеЗадания, ПодпискиНаСобытия и Константы, были недоступны для создания непосредственно в расширении. В данной статье мы подробно разберем, как обойти эти ограничения на старых релизах и как правильно использовать возможности новых версий платформы.

Реализация регламентных заданий в расширениях

Разберем ситуацию, когда нам необходимо выполнять фоновые операции в рамках расширения, но платформа не позволяет добавить объект РегламентноеЗадание. Рассмотрим основной обходной путь — использование внешних обработок или существующих механизмов БСП.

Метод через внешнюю обработку-пустышку:

Проанализируем этот изящный способ. Мы создаем внешнюю обработку, которая регистрируется в справочнике «Дополнительные отчеты и обработки». Внутри этой обработки прописывается экспортная процедура, которая вызывает код из общего модуля нашего расширения. Таким образом, расписание настраивается для внешней обработки, а исполняемая логика полностью сосредоточена в расширении.

Прямая реализация в новых версиях:

Начиная с версии 8.3.18, регламентные задания можно создавать прямо в расширении. Рассмотрим алгоритм добавления:

  1. Добавляем новый объект РегламентноеЗадание в дерево расширения.
  2. В свойстве ИмяМетода указываем процедуру из общего модуля расширения. Важно: общий модуль должен иметь установленный флаг Сервер.
  3. Настраиваем расписание.

Эмуляция подписок на события через аннотации

Если версия вашей платформы ниже 8.3.18, использовать стандартный объект ПодпискаНаСобытие в расширении не получится. Однако мы можем заменить его механизмом перехвата вызовов в модулях объектов. Проанализируем, как это сделать программно.

Вместо создания отдельной подписки, мы расширяем модуль объекта (например, документа или справочника) и используем аннотации &Перед или &После для стандартных обработчиков событий, таких как ПередЗаписью или ПриУстановкеНовогоНомера.

Рассмотрим пример кода для логики, которая должна срабатывать при записи документа:


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Ваша логика, которая раньше была бы в подписке
    ИнтеграцияСВнешнейСистемой.ОтправитьДанные(ЭтотОбъект);
КонецПроцедуры

Этот подход полностью покрывает потребности подписок, хотя и требует заимствования модуля каждого конкретного объекта. В современных версиях платформы (8.3.18+) рекомендуется использовать штатный объект ПодпискаНаСобытие, который теперь доступен в расширениях и позволяет подписываться на события сразу нескольких типов объектов.

Работа с константами и альтернативные хранилища

До версии 8.3.20 добавление собственных констант в расширение было невозможно. Выясним, как организовать хранение настроек расширения другими способами.

Использование регистра сведений:

Наиболее надежный метод — создание собственного РегистрСведений (непериодического). Рассмотрим структуру такого регистра:

Использование Плана Видов Характеристик (ПВХ):

Если настроек много, удобнее создать ПВХ и регистр сведений, работающий по принципу «Ключ — Значение». Это позволит динамически добавлять новые «константы» без изменения структуры метаданных расширения.

Решение ошибок при подключении расширений и проблем совместимости

Часто при попытке загрузить расширение в другую базу возникает ошибка: «Используются возможности, недоступные в выбранном режиме». Проанализируем причину этой проблемы.

Основная причина заключается в несовпадении РежимСовместимости. Рассмотрим правила настройки:

  1. Режим совместимости расширения не может быть выше, чем режим совместимости основной конфигурации.
  2. Если основная конфигурация находится на поддержке и имеет режим 8.3.12, а вы разрабатываете расширение в платформе 8.3.15, по умолчанию расширение может установиться в режим 8.3.15. При попытке подключения в «предприятии» оно будет отвергнуто.
  3. Для исправления необходимо в свойствах самого расширения (в корне дерева метаданных) установить РежимСовместимости, равный режиму основной конфигурации (например, 8.3.12).

Важный нюанс: Если вы используете объекты, которые появились только в 8.3.18 (те же подписки или регламентные задания), но режим совместимости базы — 8.3.12, расширение не заработает даже при правильной установке свойств. В этом случае единственный выход — повышение режима совместимости основной конфигурации.

Исправление ошибок в запросах динамических списков

Разберем ситуацию, когда запрос в динамическом списке расширения выдает ошибку «Неверные параметры» при использовании арифметических операций или функций типа ВЫРАЗИТЬ.

Рассмотрим пример ошибочного кода в расширении:

ВЫРАЗИТЬ(ЕСТЬNULL(Цены.Цена, 0) * &Курс КАК ЧИСЛО(15, 2))

Выясним причину: если поле Цена не заимствовано в расширение с точным указанием типа, платформа может не понимать, как выполнять умножение на это поле в контексте расширения.

Алгоритм решения:

  1. Найдите объект в основной конфигурации, чьи реквизиты используются в запросе.
  2. Добавьте этот объект в расширение (заимствуйте).
  3. Обязательно заимствуйте все реквизиты, участвующие в математических операциях.
  4. Проверьте, чтобы в расширении у заимствованного реквизита был установлен флаг Проверять тип при подключении.

После того как типы будут жестко определены в пространстве имен расширения, конструктор запроса сможет корректно скомпилировать код динамического списка.

Безопасность данных в расширениях

Напоследок рассмотрим критически важный момент — хранение данных в собственных объектах расширения (свои справочники, регистры). Помните: если вы удалите расширение из списка в режиме «1С:Предприятие», все физические таблицы в СУБД, созданные этим расширением, будут удалены безвозвратно. Всегда делайте резервную копию базы данных перед манипуляциями с составом расширений, содержащих уникальные данные.

← На главную