Как правильно обновлять расширения в 1С при изменении кода основной конфигурации?

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

При работе с расширениями в системе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда после обновления основной конфигурации (вендора) расширение перестает работать или начинает вести себя некорректно. Особенно остро эта проблема стоит, если в расширении использовалась директива &Вместо для полной подмены типовой логики. В данной статье мы подробно разберем технологии и методики, которые позволяют эффективно обновлять расширения, минимизируя ручной труд и риск возникновения ошибок.

Проблема использования директивы &Вместо

Рассмотрим стандартную ситуацию: вы создали расширение и перенесли в него функцию из общего модуля, добавив директиву &Вместо. Теперь ваша функция полностью замещает типовую. Однако с выходом нового релиза разработчик конфигурации внес в оригинальную функцию изменения — добавил новые проверки, исправил ошибки или изменил алгоритм расчета. Ваше расширение об этом «не знает» и продолжает исполнять старый код, который вы скопировали в него несколько месяцев назад.

Проанализируем последствия такого подхода. Если в новом релизе 1С добавила в метод критически важную проверку безопасности или расчет налогов, ваше расширение просто проигнорирует эти изменения. Это может привести к повреждению данных или некорректной отчетности. Именно поэтому использование &Вместо считается «крайней мерой».

Решение 1: Использование аннотации &ИзменениеИКонтроль

Самый эффективный и современный способ решения проблемы — использование аннотации &ИзменениеИКонтроль (&ChangeAndValidate). Это специализированный инструмент платформы, созданный специально для контроля изменений в основной конфигурации. Разберем по шагам, как это работает.

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

Пример использования аннотации:


&ИзменениеИКонтроль("РассчитатьСуммуДокумента")
Процедура Расшир_РассчитатьСуммуДокумента(Параметры)
    // Код оригинальной функции до изменений
    Сумма = Параметры.Цена * Параметры.Количество;
    
    #Вставить
    // Наши правки: добавляем учет дополнительной скидки
    Сумма = Сумма - Параметры.Скидка;
    #КонецВставки

    #Удалить
    // Если нам нужно исключить какой-то старый код вендора
    Сообщить("Старый алгоритм выполнен");
    #КонецУдаления
КонецПроцедуры

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

Решение 2: Переход на &Перед и &После с использованием ПродолжитьВызов()

Если логика задачи позволяет, мы рекомендуем всегда отдавать предпочтение директивам &Перед или &После. В этом случае основной код вендора выполняется штатно, а вы лишь добавляете свои действия до или после него. Это гарантирует, что все обновления типового функционала будут применяться автоматически.

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


&Вместо("ОпределитьТипЦен")
Функция Расшир_ОпределитьТипЦен(Склад)
    // Выполняем типовой код вендора
    Результат = ПродолжитьВызов(Склад);
    
    // Добавляем свою логику поверх типовой
    Если Склад.Регион = "Север" Тогда
        Результат = Справочники.ТипыЦен.Оптовая;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Такой подход сохраняет «цепочку» вызовов. Если в будущем вендор обновит функцию ОпределитьТипЦен, ваш ПродолжитьВызов() выполнит уже обновленную версию, а ваша надстройка останется актуальной.

Решение 3: Методика ручного сравнения и обновления

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

  1. Сравнение конфигураций: Запускаем сравнение текущей основной конфигурации с новым релизом поставщика.
  2. Фильтрация изменений: Настраиваем фильтр так, чтобы видеть только те объекты, которые включены в ваше расширение.
  3. Анализ процедур: Если мы видим, что в общем модуле, который мы расширяли, изменился код интересующей нас функции, фиксируем этот факт.
  4. Параллельная корректировка: Открываем два окна в Конфигураторе — в одном код новой основной конфигурации, в другом — код функции в расширении.
  5. Перенос изменений: Вручную переносим новшества вендора в код расширения, сохраняя при этом свои доработки.

Важно отметить преимущество расширений в контексте обновлений: файл основной конфигурации (например, УТ 11) может весить около 1 Гб в развернутом виде, а со снятым «замком» процесс сравнения и объединения занимает длительное время. Расширения же имеют небольшой объем, что значительно ускоряет работу программиста и упрощает поддержку базы в актуальном состоянии.

Инструменты автоматизации в Конфигураторе

Проанализируем встроенные средства 1С, которые помогают контролировать расширения. Не забывайте использовать следующие функции:

Использование «Точек расширения» БСП

Современные типовые решения (ERP, УТ 11, БП 3.0) построены на базе Библиотеки стандартных подсистем (БСП). Разработчики 1С заранее предусматривают специальные «переопределяемые» модули (например, ОбщегоНазначенияПереопределяемый).

Разберем, почему это важно: вместо того чтобы расширять сложное «ядро» системы, проверьте, нет ли в нужном вам месте вызова процедуры из переопределяемого модуля. Если такая точка есть, правильнее будет расширить именно её. Эти модули специально предназначены для кастомизации, и их структура меняется крайне редко, что делает ваше расширение практически «неубиваемым» при обновлениях.

Резюме: Для эффективного обновления расширений старайтесь уходить от слепого копирования кода с директивой &Вместо. Используйте &ИзменениеИКонтроль для точечных правок, &После для дополнения логики и всегда проверяйте возможность применения расширения после наката нового релиза основной конфигурации.

← На главную