Расширения конфигурации — это мощный инструмент кастомизации прикладных решений без снятия основной конфигурации с поддержки. Однако разработчики часто сталкиваются с тем, что в старых версиях платформы (до 8.3.18) многие привычные объекты, такие как РегламентныеЗадания, ПодпискиНаСобытия и Константы, были недоступны для создания непосредственно в расширении. В данной статье мы подробно разберем, как обойти эти ограничения на старых релизах и как правильно использовать возможности новых версий платформы.
Разберем ситуацию, когда нам необходимо выполнять фоновые операции в рамках расширения, но платформа не позволяет добавить объект РегламентноеЗадание. Рассмотрим основной обходной путь — использование внешних обработок или существующих механизмов БСП.
Метод через внешнюю обработку-пустышку:
Проанализируем этот изящный способ. Мы создаем внешнюю обработку, которая регистрируется в справочнике «Дополнительные отчеты и обработки». Внутри этой обработки прописывается экспортная процедура, которая вызывает код из общего модуля нашего расширения. Таким образом, расписание настраивается для внешней обработки, а исполняемая логика полностью сосредоточена в расширении.
Прямая реализация в новых версиях:
Начиная с версии 8.3.18, регламентные задания можно создавать прямо в расширении. Рассмотрим алгоритм добавления:
РегламентноеЗадание в дерево расширения.ИмяМетода указываем процедуру из общего модуля расширения. Важно: общий модуль должен иметь установленный флаг Сервер.Если версия вашей платформы ниже 8.3.18, использовать стандартный объект ПодпискаНаСобытие в расширении не получится. Однако мы можем заменить его механизмом перехвата вызовов в модулях объектов. Проанализируем, как это сделать программно.
Вместо создания отдельной подписки, мы расширяем модуль объекта (например, документа или справочника) и используем аннотации &Перед или &После для стандартных обработчиков событий, таких как ПередЗаписью или ПриУстановкеНовогоНомера.
Рассмотрим пример кода для логики, которая должна срабатывать при записи документа:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Ваша логика, которая раньше была бы в подписке
ИнтеграцияСВнешнейСистемой.ОтправитьДанные(ЭтотОбъект);
КонецПроцедуры
Этот подход полностью покрывает потребности подписок, хотя и требует заимствования модуля каждого конкретного объекта. В современных версиях платформы (8.3.18+) рекомендуется использовать штатный объект ПодпискаНаСобытие, который теперь доступен в расширениях и позволяет подписываться на события сразу нескольких типов объектов.
До версии 8.3.20 добавление собственных констант в расширение было невозможно. Выясним, как организовать хранение настроек расширения другими способами.
Использование регистра сведений:
Наиболее надежный метод — создание собственного РегистрСведений (непериодического). Рассмотрим структуру такого регистра:
Расш1_НастройкиПараметров.Значение с типом ЛюбаяСсылка или конкретным нужным типом.МенеджерРегистра.Получить().Использование Плана Видов Характеристик (ПВХ):
Если настроек много, удобнее создать ПВХ и регистр сведений, работающий по принципу «Ключ — Значение». Это позволит динамически добавлять новые «константы» без изменения структуры метаданных расширения.
Часто при попытке загрузить расширение в другую базу возникает ошибка: «Используются возможности, недоступные в выбранном режиме». Проанализируем причину этой проблемы.
Основная причина заключается в несовпадении РежимСовместимости. Рассмотрим правила настройки:
РежимСовместимости, равный режиму основной конфигурации (например, 8.3.12).Важный нюанс: Если вы используете объекты, которые появились только в 8.3.18 (те же подписки или регламентные задания), но режим совместимости базы — 8.3.12, расширение не заработает даже при правильной установке свойств. В этом случае единственный выход — повышение режима совместимости основной конфигурации.
Разберем ситуацию, когда запрос в динамическом списке расширения выдает ошибку «Неверные параметры» при использовании арифметических операций или функций типа ВЫРАЗИТЬ.
Рассмотрим пример ошибочного кода в расширении:
ВЫРАЗИТЬ(ЕСТЬNULL(Цены.Цена, 0) * &Курс КАК ЧИСЛО(15, 2))
Выясним причину: если поле Цена не заимствовано в расширение с точным указанием типа, платформа может не понимать, как выполнять умножение на это поле в контексте расширения.
Алгоритм решения:
Проверять тип при подключении.После того как типы будут жестко определены в пространстве имен расширения, конструктор запроса сможет корректно скомпилировать код динамического списка.
Напоследок рассмотрим критически важный момент — хранение данных в собственных объектах расширения (свои справочники, регистры). Помните: если вы удалите расширение из списка в режиме «1С:Предприятие», все физические таблицы в СУБД, созданные этим расширением, будут удалены безвозвратно. Всегда делайте резервную копию базы данных перед манипуляциями с составом расширений, содержащих уникальные данные.