Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда обновление сильно доработанной типовой конфигурации превращается в многочасовой разбор конфликтов при сравнении и объединении. Стандартное комментирование старых участков кода вида //Было и //Стало загромождает модули, а интерактивные правки элементов управляемых форм требуют постоянного ручного восстановления после каждого релиза поставщика.
Разберем комплексный подход и набор практических правил, которые позволяют существенно сократить трудозатраты на сопровождение и свести процесс обновления к минимуму ручных операций.
Одной из самых трудоемких задач при обновлении типовых решений является объединение изменений в формах. Если форма изменена интерактивно в дереве метаданных, типовое обновление часто перезаписывает пользовательские доработки, либо приводит к смещению элементов интерфейса.
Рассмотрим правильный подход: форму следует оставлять на полной поддержке поставщика, а все новые элементы управления (поля ввода, кнопки, группы, команды) создавать и настраивать исключительно программным способом в обработчиках события ПриСозданииНаСервере.
Посмотрим на пример программного добавления реквизита и элемента формы:
&НаСервере
Процедура МойПрефикс_ДобавитьЭлементыНаФорму(Форма)
// Добавление нового реквизита формы
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы("МойПрефикс_КомментарийКонтролера", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(200)),, "Комментарий контролера"));
Форма.ИзменитьРеквизиты(МассивРеквизитов);
// Создание элемента управления и привязка к реквизиту
НовыйЭлемент = Форма.Элементы.Добавить("МойПрефикс_ПолеКомментарий", Тип("ПолеФормы"), Форма.Элементы.ГруппаДополнительно);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "МойПрефикс_КомментарийКонтролера";
КонецПроцедуры
Для централизованного внедрения таких процедур в типовых конфигурациях на базе БСП можно использовать вызовы из переопределяемых служебных модулей либо специализированных общих процедур инициализации форм, что полностью исключает снятие самой формы с поддержки.
Внесение правок в модули объектов (документов, справочников) напрямую в типовые процедуры (например, ПередЗаписью или ОбработкаПроведения) приводит к возникновению дважды измененных процедур при каждом обновлении.
Проанализируем шаги по правильному выносу бизнес-логики:
ПодпискаНаСобытие. Источником указывается нужный документ или справочник, а обработчиком — процедура из вашего собственного общего модуля. Модуль объекта в этом случае остается на типовой поддержке без единого изменения.Расширения конфигурации позволяют дорабатывать функционал вообще без снятия основной конфигурации с поддержки. Однако при некорректном использовании расширения могут выдавать ошибки при обновлении релиза (так называемое «отваливание» расширений). Чтобы этого избежать, соблюдаем следующие правила:
&Перед и &После: использование аннотации &Вместо опасно тем, что при изменении количества параметров или логики метода в новом релизе типовой конфигурации расширение перестанет работать. Если применение &Вместо необходимо, обязательно используем конструкцию ПродолжитьВызов().Стандартный встроенный механизм сравнения и объединения модулей 1С сравнивает текущее состояние модуля с новым состоянием от поставщика, что часто порождает конфликты типа [mrg] внутри методов и требует ручной вычистки. Для автоматизации этого процесса платформа 1С:Предприятие 8.3 поддерживает интеграцию со сторонними утилитами трехстороннего слияния, такими как KDiff3.
Выясним, как работает трехстороннее сравнение (3-way merge):
Для подключения утилиты перейдем в меню конфигуратора: Сервис — Параметры — Общие — Сравнение/объединение, где в качестве внешней программы сравнения модулей указывается путь к исполняемому файлу kdiff3.exe с соответствующими параметрами командной строки.
Разберем базовые правила оформления метаданных, снижающие риски коллизий:
Префикс_СрокДоставки). Это предотвратит конфликт имен, если в следующем релизе разработчики типового решения добавят реквизит с аналогичным названием.Переопределяемый, например, ОбщегоНазначенияПереопределяемый). Они штатно предназначены для внедрения алгоритмов и не затираются при стандартном обновлении.Соблюдение этих правил и сочетание программной модификации, подписок на события и внешних инструментов слияния позволяет сократить время регулярного обновления конфигураций в несколько раз.