Почему при обновлении измененной конфигурации 1С остаются старые функции и как оптимизировать процесс сравнения

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

Обновление нетиповых (доработанных) конфигураций «1С:Предприятие» — это регулярная и зачастую весьма трудоемкая задача для разработчика. В процессе сопоставления объектов новой конфигурации поставщика и нашей рабочей базы мы регулярно сталкиваемся со странным поведением платформы: функции, которые вендор полностью удалил в новом релизе, упорно остаются в нашей конфигурации. Кроме того, процесс сравнения тяжелых конфигураций (таких как УправлениеТорговлей, ERP или КомплекснаяАвтоматизация) во встроенном инструменте может занимать долгие часы.

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

1. Логика трехстороннего сравнения: почему «1С» не удаляет устаревшие функции

Для начала проанализируем, почему при обновлении нетиповой конфигурации функции, удаленные вендором, не удаляются автоматически из нашего кода, а флажки объединения для них по умолчанию снимаются. Это поведение не является ошибкой платформы. Напротив, это фундаментальный механизм защиты авторского кода разработчика.

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

  1. Старая конфигурация поставщика (СКП) — исходный релиз вендора, на который ранее накатывались изменения.
  2. Новая конфигурация поставщика (НКП) — релиз, до которого мы обновляемся в данный момент.
  3. Основная конфигурация (ОК) — наша текущая рабочая база со всеми уникальными доработками и кастомным кодом.

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

Платформа сопоставляет изменения и видит следующую картину:

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

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

2. Ускоряем подготовку обновлений с помощью KDiff3

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

Рассмотрим подробнее преимущества использования KDiff3:

Для того чтобы интегрировать внешнюю утилиту в ваш рабочий процесс, выполним настройку по шагам:

  1. Скачайте и установите программу KDiff3 на ваш рабочий компьютер.
  2. Откройте Конфигуратор «1С:Предприятие».
  3. Перейдите в меню Сервис — Параметры.
  4. В открывшемся окне выберите вкладку Сравнение/объединение.
  5. Установите флажок Использовать внешнюю программу для сравнения/объединения текстовых файлов.
  6. В поле «Программа сравнения» укажите путь к исполняемому файлу утилиты (например, C:\Program Files\KDiff3\kdiff3.exe).
  7. В поле «Параметры» задайте шаблоны запуска для передачи файлов из Конфигуратора во внешнюю утилиту. Обычно платформа автоматически подставляет корректные ключи командной строки при выборе исполняемого файла.

После выполнения этих настроек при двойном клике по измененному текстовому модулю в окне сравнения и объединения конфигураций платформа будет автоматически запускать KDiff3, передавая туда исходные тексты для комфортного слияния.

3. Проблема фантомных изменений в формах: откуда берутся скрытые теги

Еще один частый повод для головной боли разработчиков при обновлении — это ситуации, когда управляемые формы отображаются в окне сравнения как «измененные», хотя никаких видимых доработок в них не производилось. Флажки объединения для таких форм автоматически сбрасываются платформой. При детальном анализе изменений через отчет сравнения выясняется, что все различия сводятся к изменению длинных строк с HTML/XML-тегами в заголовках, декорациях или подсказках реквизитов.

Выясним причину этого явления. Многие элементы интерфейса управляемых форм (особенно декорации с форматированным текстом и сложные подсказки) хранятся внутри файлов метаданных конфигурации в виде сериализованного XML/HTML-кода. В зависимости от версии платформы «1С» и операционной системы, генератор этого кода может вести себя по-разному:

Поскольку при обновлении платформа пытается сопоставить эти скрытые теги, она видит различие и предлагает разработчику принять решение, снимая флажок автоматического объединения. Принудительное объединение решает проблему лишь до первой перезаписи формы на другой версии платформы или другом компьютере разработчика, после чего скрытые теги снова перестраиваются, и при следующем обновлении форма вновь помечается как измененная.

Проанализируем методы борьбы с этой проблемой:

  1. Игнорирование некритичных изменений: Если при детальном сравнении формы вы видите изменения исключительно в служебных HTML-тегах форматированного текста подсказок или заголовков, смело пропускайте эти объекты. На реальную бизнес-логику и работоспособность интерфейса эти различия влияния не оказывают.
  2. Использование расширений конфигурации: Это самый надежный способ избежать проблем при обновлении интерфейса. Старайтесь не снимать типовые формы с поддержки ради изменения заголовков или добавления новых реквизитов. Все доработки интерфейса переносите в расширения. В этом случае типовые формы останутся на строгом контроле поставщика («на замке») и вообще не будут участвовать в процессе ручного сравнения и объединения, что сэкономит вам массу времени.
  3. Возврат объектов на строгую поддержку: Если формы были случайно сняты с поддержки (например, при массовом разрешении редактирования объектов), но никаких изменений вы в них не вносили, верните их в состояние «Редактируется с сохранением поддержки» (поставив замок обратно). Для этого выполните объединение с чистым файлом конфигурации поставщика (cf) вашего текущего релиза, указав для данных объектов режим «Взять из конфигурации поставщика».

4. Резюме и практические рекомендации

Подводя итог, выделим ключевые правила, которые помогут сделать процесс обновления нетиповых конфигураций быстрым и предсказуемым:

← На главную