Расширение — отдельная маленькая конфигурация, которая накладывается на основную в момент запуска. Типовая при этом остаётся на полной поддержке и обновляется штатно, а ваши доработки живут отдельным файлом .cfe. Для УНФ это единственный разумный способ дорабатывать конфигурацию, если вы не готовы сопровождать её обновления вручную годами.
Создание расширения
Конфигуратор → «Конфигурация → Расширения конфигурации» → добавить. В свойствах задаются:
- Имя и синоним — понятные, с указанием задачи:
КонтрольСкидок, а неРасширение1; - Префикс — добавляется к именам ваших объектов и реквизитов, чтобы они не столкнулись с типовыми при обновлении;
- Назначение — «Дополнение» для новой функциональности, «Адаптация» для изменения поведения типовой, «Исправление» для временных патчей;
- Безопасный режим — расширение работает с ограничениями: без внешних компонент, COM и файловых операций. Снимать только осознанно.
Дальше нужные объекты типовой конфигурации заимствуются: в расширение попадает копия объекта с теми свойствами, которые вы собираетесь менять. Заимствовать «всё подряд» не надо — чем меньше заимствований, тем реже расширение ломается при обновлении.
Аннотации: чем они отличаются
| Аннотация | Когда выполняется | Типичное применение |
|---|---|---|
&Перед | До типовой процедуры | Дополнительная проверка, подготовка данных |
&После | После типовой процедуры | Дозаполнение, своя логика поверх результата |
&Вместо | Вместо типовой процедуры | Полная замена логики, вызов оригинала через ПродолжитьВызов |
&ИзменениеИКонтроль | Правка тела процедуры с контролем | Точечная замена фрагмента типового кода |
&Вместо — самый рискованный вариант: типовая процедура при обновлении изменится, а вы этого не заметите. Если без замены не обойтись, вызывайте оригинал явно.
Пример: контроль скидки при проведении
Задача: не проводить расходную накладную, если скидка по строке больше 30 процентов, а у пользователя нет соответствующего права.
&После("ОбработкаПроведения")
Процедура Расш_ОбработкаПроведения(Отказ, РежимПроведения)
Если Отказ Тогда
Возврат;
КонецЕсли;
ПредельныйПроцент = 30;
Для Каждого СтрокаЗапасов Из ЭтотОбъект.Запасы Цикл
Если СтрокаЗапасов.ПроцентСкидкиНаценки > ПредельныйПроцент Тогда
Отказ = Истина;
ТекстОшибки = СтрШаблон(
"Строка %1: скидка %2%% превышает предел %3%%.",
СтрокаЗапасов.НомерСтроки,
СтрокаЗапасов.ПроцентСкидкиНаценки,
ПредельныйПроцент);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки, ЭтотОбъект, "Запасы[" + (СтрокаЗапасов.НомерСтроки - 1) + "].ПроцентСкидкиНаценки");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Что здесь важно:
- имя процедуры в расширении своё, с префиксом; связь с типовой задаёт аннотация;
- проверка
Если Отказ Тогда Возврат— если типовая уже отказала в проведении, дальше работать не нужно; - имена реквизитов табличной части нужно взять из своей редакции конфигурации: они меняются от релиза к релизу;
- привязка сообщения к строке табличной части — пользователь щёлкнет по сообщению и попадёт в нужную ячейку.
Точечная правка через &ИзменениеИКонтроль
Когда нужно поменять несколько строк внутри длинной типовой процедуры, а не всю её целиком:
&ИзменениеИКонтроль("ЗаполнитьЦеныПоТипуЦен")
Процедура Расш_ЗаполнитьЦеныПоТипуЦен(ТипЦен)
#Вставка
Если Не ЗначениеЗаполнено(ТипЦен) Тогда
ТипЦен = Справочники.ТипыЦен.Основной;
КонецЕсли;
#КонецВставки
КонецПроцедуры
Смысл конструкции: платформа хранит эталон типового кода и при обновлении проверяет, изменился ли он. Если типовая процедура поменялась, вы получите предупреждение, а не тихо сломанную логику. Это главное преимущество перед &Вместо.
Расширение перестало применяться
Стандартное сообщение — «Ошибка применения расширения». Разбор по шагам:
- Открыть «Расширения конфигурации», посмотреть колонку состояния и текст ошибки.
- Чаще всего причина — заимствованный объект изменился в новом релизе типовой: удалён реквизит, изменилась сигнатура процедуры, переименована форма.
- Проверить контроль совместимости: заимствованные объекты сравниваются с основной конфигурацией.
- Поправить расширение в конфигураторе на копии базы, проверить, выложить.
Отсюда правило эксплуатации: после каждого обновления типовой конфигурации проверять расширения на тестовой копии до обновления рабочей базы. Обновление, при котором расширение отвалилось, останавливает работу так же надёжно, как сломанная база.
Правила, которые экономят время
- Одно расширение — одна задача. Пять маленьких понятнее одного огромного.
- Версионируйте
.cfe: выгружайте файл в репозиторий вместе с описанием изменений. - Комментируйте, зачем сделана доработка и по чьей просьбе. Через год это единственный источник правды.
- Не используйте расширения для того, что решается настройками. Типовая функциональность обновляется бесплатно, ваш код — нет.