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