Обновление нетиповой конфигурации 1С — процедура, требующая максимальной концентрации. Стандартный рабочий процесс любого разработчика предполагает использование фильтра «Показывать только дважды измененные свойства» в окне сравнения и объединения. Однако на практике нередко возникает опасная ситуация: программист внес изменения в модуль (например, в процедуру ОбработкаПроведения документа), поставщик в новом релизе также переписал этот метод, но в фильтр дважды измененных объект не попал. Если довериться фильтру и применить объединение вслепую, пользовательские правки будут безвозвратно затерты кодом поставщика.
Разберем детально, почему так происходит, как функционирует механизм трехстороннего сравнения в платформе 1С:Предприятие, из-за чего объекты могут самопроизвольно возвращаться на полную поддержку («замочки») и какие регламенты позволяют гарантированно защитить доработки.
Проанализируем архитектуру механизма объединения конфигураций. В платформе 1С реализован алгоритм трехстороннего слияния (3-way merge). Для корректного определения конфликта платформа анализирует состояние трех конфигураций:
.cf или .cfu.Фильтр «Показывать только дважды измененные» выводит объект исключительно в том случае, когда зафиксированы одновременные расхождения в двух парах: Основная конфигурация относительно старого поставщика и Новый поставщик относительно старого поставщика. Выясним, почему этот алгоритм может дать сбой:
Конфигурация → Сравнить, объединить с конфигурацией из файла вместо штатного механизма поддержки Конфигурация → Поддержка → Обновить конфигурацию, конфигурация поставщика в базе осталась старой либо не обновилась вовсе. Для платформы изменения поставщика считаются отсутствующими, и объект классифицируется как измененный только пользователем.Нередко разработчики сталкиваются со связанной проблемой: после завершения объединения объекты конфигурации самопроизвольно переходят в статус «Не редактируется» (получают пиктограмму «замок»), хотя исходный код доработок может визуально остаться на месте. При следующем же обновлении такой заблокированный объект обновляется «в глухую», и весь доработанный код стирается.
Разберем по шагам, почему это происходит:
Объект поставщика не редактируется. Код модуля при этом сохраняется в текущей сессии, но метаданные блокируются.Если вы обнаружили, что измененные объекты встали на «замок» или пропали из фильтра конфликтов, выполним правильную последовательность действий:
.dt или бэкапа СУБД, сделанного строго до начала обновления.Конфигурация → Поддержка → Настройка поддержки
%LOCALAPPDATA%\1C\1cv8\ и %APPDATA%\1C\1cv8\, чтобы исключить влияние поврежденных кэшей структуры конфигурации.Конфигурация → Поддержка → Обновить конфигурацию. При появлении окна объединения перепроверим наличие объектов в дереве.Полагаться исключительно на фильтр «дважды измененные» в ответственных базах нельзя. Рассмотрим надежные инженерные практики, исключающие потерю функционала.
В платформе 1С встроен механизм вызова внешних утилит сравнения (KDiff3, Beyond Compare, Araxis Merge, P4Merge). Для их интеграции перейдем в конфигураторе:
Сервис → Параметры → вкладка Сравнение/объединение → Модули
Выберем внешнюю программу для трехстороннего объединения. В отличие от штатного парсера, внешние инструменты (например, KDiff3) выполняют математически строгое сопоставление трех файлов (Base — старый релиз поставщика, Mine — текущая база, Theirs — новый релиз поставщика) и физически не позволяют пропустить конфликт строк.
Перед началом любого обновления выполним превентивный контроль:
Настройка поддержки нажмем «Сравнить конфигурацию с конфигурацией поставщика».Действия → Отчет о сравнении конфигураций). Этот файл — точный реестр всех внесенных в систему доработок.Современным стандартом разработки в среде 1С является вынос изменений из основного модуля во внешние расширения (cfe). Если требуется модифицировать логику типового метода (например, ОбработкаПроведения), используем аннотацию &ИзменениеИКонтроль:
&Вместо("ОбработкаПроведения")
Процедура Расш_ОбработкаПроведения(Отказ, РежимПроведения)
#Вставка
// Наш кастомный алгоритм перед стандартным проведением
Если Не ПроверитьДополнительныеРеквизиты() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
#КонецВставки
#Удаление
// Типовой код, который необходимо отключить
#КонецУдаления
// Выполнение оставшегося типового кода поставщика
ПродолжитьВызов(Отказ, РежимПроведения);
КонецПроцедуры
Преимущество такого подхода заключается в том, что конфигурация базы данных остается на полной типовой поддержке без снятия с «замков». При очередном обновлении вендором тела процедуры платформа автоматически проверит директиву #Вставка/#Удаление: если сигнатура метода или окружающий код изменились, расширение выдаст ошибку валидации при проверке применимости, и разработчик гарантированно увидит необходимость адаптации кода без риска его случайной перезаписи.