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

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

В процессе сопровождения типовых конфигураций (например, УТ 11.3 или 11.4) разработчики часто сталкиваются с проблемой: после выполнения процедуры обновления через поддержку добавленные ранее в модули функции или процедуры бесследно исчезают. Это происходит даже в тех случаях, когда в окне сравнения и объединения кажется, что настройки выставлены верно. Проанализируем, почему так происходит, и разберем пошаговые инструкции, как сохранить свои доработки.

Понимаем механизм трехстороннего объединения

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

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

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

Настройка правил объединения в окне сравнения

Рассмотрим стандартный механизм настройки объединения. Когда вы открываете окно "Сравнение, объединение с конфигурацией из файла", важно обратить внимание не только на дерево объектов, но и на настройки режима объединения для каждого конкретного модуля.

Если вы видите, что функции пропадают, выполним следующие действия:

  1. Найдем в дереве объектов нужную форму или модуль.
  2. Нажмем правую кнопку мыши на объекте и выберем "Установить режим объединения для модулей...".
  3. Вместо режима "Заместить" обязательно выберем "Объединить".

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

Использование приоритета новой конфигурации и теги MRG

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

Рассмотрим пример того, как будет выглядеть ваш код в модуле после такого объединения:


//{{MRG[0.0.0.1] Платформа автоматически объединила изменения
//{{ВАШИ_ИЗМЕНЕНИЯ
Функция МояДобавленнаяФункция()
    // Ваш код здесь
КонецФункции
//}}ВАШИ_ИЗМЕНЕНИЯ
//}}MRG[0.0.0.1]

Важный момент: использование этого режима может привести к тому, что весь модуль будет "загажен" тегами {MRG}. Это затрудняет чтение кода, поэтому данный метод рекомендуется применять точечно — только для тех функций, где ваши правки пересекаются с правками поставщика (так называемые "дважды измененные объекты").

Применение внешних инструментов (KDiff3)

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

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

  1. Текст старого поставщика (Base).
  2. Текст нового поставщика (Theirs).
  3. Ваш текст (Yours).

В нижней части окна вы видите итоговый результат (Merge). Использование KDiff3 практически исключает случайное удаление функций, так как вы визуально контролируете каждое изменение и можете в один клик выбрать, какой блок кода оставить.

Специфика обновления УТ 11 (Переход на 54-ФЗ)

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

В таких случаях мы рекомендуем:

Стратегия на будущее: Расширения конфигурации

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

Вместо правки модуля формы в основной конфигурации, мы можем:

  1. Создать расширение.
  2. Добавить в него нужную форму.
  3. Написать свою функцию в модуле формы расширения.
  4. Использовать аннотации &Перед, &После или &Вместо для изменения поведения типовых процедур.

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

← На главную