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