В процессе сопровождения типовых конфигураций (например, УТ 11.3 или 11.4) разработчики часто сталкиваются с проблемой: после выполнения процедуры обновления через поддержку добавленные ранее в модули функции или процедуры бесследно исчезают. Это происходит даже в тех случаях, когда в окне сравнения и объединения кажется, что настройки выставлены верно. Проанализируем, почему так происходит, и разберем пошаговые инструкции, как сохранить свои доработки.
Для начала разберем, как платформа 1С принимает решение о том, оставить кусок кода или удалить его. Современная платформа 8.3 использует механизм трехстороннего сравнения. В этом процессе участвуют три конфигурации:
.cfu или .cf, на которую вы переходите).Ситуация осложняется, когда фирма "1С" в новом релизе проводит рефакторинг. Если поставщик удалил функцию (например, как это произошло с функцией ПараметрыЧека при переходе на новые механизмы работы с онлайн-кассами), а вы в своей основной конфигурации эту функцию изменяли или рассчитывали на ее наличие, платформа видит конфликт. Если не задать явное правило, алгоритм может посчитать, что целевое состояние объекта — это его отсутствие, как в новой версии поставщика.
Рассмотрим стандартный механизм настройки объединения. Когда вы открываете окно "Сравнение, объединение с конфигурацией из файла", важно обратить внимание не только на дерево объектов, но и на настройки режима объединения для каждого конкретного модуля.
Если вы видите, что функции пропадают, выполним следующие действия:
Проанализируем работу фильтров. В верхней части окна есть кнопка с изображением шестеренки. Нам необходимо зайти в настройки и убедиться, что параметр "Разрешать удаление объектов основной конфигурации" настроен осознанно. Если эта опция включена, и функция отсутствует в новой конфигурации поставщика, платформа с высокой вероятностью ее удалит.
Выясним причину, почему иногда советуют использовать настройку "Объединить с приоритетом новой конфигурации поставщика". Этот режим позволяет системе автоматически внедрить изменения от 1С, но при этом сохранить ваш код, выделив его специальными комментариями.
Рассмотрим пример того, как будет выглядеть ваш код в модуле после такого объединения:
//{{MRG[0.0.0.1] Платформа автоматически объединила изменения
//{{ВАШИ_ИЗМЕНЕНИЯ
Функция МояДобавленнаяФункция()
// Ваш код здесь
КонецФункции
//}}ВАШИ_ИЗМЕНЕНИЯ
//}}MRG[0.0.0.1]
Важный момент: использование этого режима может привести к тому, что весь модуль будет "загажен" тегами {MRG}. Это затрудняет чтение кода, поэтому данный метод рекомендуется применять точечно — только для тех функций, где ваши правки пересекаются с правками поставщика (так называемые "дважды измененные объекты").
Профессиональный подход к обновлению сильно измененных конфигураций подразумевает отказ от встроенного текстового сравнения 1С в пользу внешних утилит, таких как KDiff3 или P3Merge. Разберем, в чем их преимущество.
Встроенный механизм 1С часто теряет контекст, если код был перемещен внутри файла. Внешние инструменты позволяют видеть три панели одновременно:
В нижней части окна вы видите итоговый результат (Merge). Использование KDiff3 практически исключает случайное удаление функций, так как вы визуально контролируете каждое изменение и можете в один клик выбрать, какой блок кода оставить.
Рассмотрим ситуацию автора темы подробнее. В версиях УТ 11.3.4 происходил массовый перенос логики формирования чеков из модулей форм в общие модули (рефакторинг под онлайн-кассы). Если вы добавили функцию ПараметрыЧека в форму, а 1С перенесла вызов этой логики в МенеджерОборудованияВызовСервера, то простая вставка функции обратно в форму может не решить проблему, так как она больше не вызывается системой.
В таких случаях мы рекомендуем:
Чтобы навсегда забыть о проблеме "исчезающего кода" при обновлениях, проанализируем возможность использования расширений. Это наиболее современный и безопасный способ модификации типовых решений.
Вместо правки модуля формы в основной конфигурации, мы можем:
&Перед, &После или &Вместо для изменения поведения типовых процедур.При таком подходе обновление основной конфигурации (через cfu) никак не затронет ваш код, так как он физически находится в другом слое данных. Это существенно сокращает время на поддержку и исключает риск потери критически важных функций.