При активном использовании расширений в конфигурации 1С, особенно если они содержат большое количество процедур и функций, переопределенных с помощью директивы &Вместо, процесс обновления конфигурации становится весьма трудоемким. Ручное сравнение каждой такой процедуры с ее аналогом в обновленной конфигурации поставщика является неэффективным и чревато ошибками. Давайте рассмотрим, как можно автоматизировать этот процесс, чтобы значительно сократить время и усилия, необходимые для поддержки актуальности ваших расширений.
Основная проблема, с которой мы сталкиваемся, заключается в том, что при каждом обновлении конфигурации типовые процедуры могут меняться. Если в расширении мы заменили такую процедуру целиком (с помощью &Вместо), нам необходимо выяснить, что именно изменилось в типовом коде, чтобы своевременно перенести эти изменения в наше расширение. Конфигурация, находящаяся на замке, является частой причиной использования &Вместо, поскольку прямое изменение типового кода невозможно или нежелательно.
Одним из наиболее эффективных и гибких решений для автоматизированного сравнения кода является использование платформы OneScript в связке с утилитой diff3cf. Этот инструмент позволяет сравнить три версии конфигураций: старую конфигурацию поставщика, новую конфигурацию поставщика и конфигурацию расширения, выявив изменения в перехваченных процедурах.
OneScript. Перейдите на официальный сайт OneScript и загрузите актуальную версию инсталлятора. Установите его, следуя инструкциям мастера установки.OneScript важно убедиться, что все прошло успешно. Откройте командную строку (или терминал) и выполните команду oscript -v. Если установка прошла корректно, вы увидите информацию о версии установленного OneScript. В некоторых случаях может потребоваться перезагрузка компьютера для корректной работы переменной среды PATH.OneScript мы можем установить утилиту diff3cf с помощью пакетного менеджера OPM (OneScript Package Manager). Откройте командную строку от имени администратора и выполните следующую команду:
opm install diff3cf
Эта команда загрузит и установит diff3cf и все необходимые зависимости.
diff3cf может не поддерживать директиву &ИзменениеИКонтроль из коробки, но это легко исправить. Нам потребуется внести небольшие изменения в исходный код утилиты.
Перейдите в папку, куда был установлен diff3cf. Обычно это C:\Program Files\OneScript\lib\diff3cf\src\. В этой папке найдите файл Классы\ПарсерМодулейРасширения.os. Откройте его в любом текстовом редакторе.
Внутри этого файла нам необходимо найти функции ПолучитьДирективыМетодов и ПрочитатьМетодыМодуля. В этих функциях добавьте поддержку директивы &ИзменениеИКонтроль по аналогии с уже существующими директивами. Это обычно сводится к добавлению пары строк кода, которые включают новую директиву в список распознаваемых. Например, в функции, которая определяет список директив, вы можете увидеть нечто подобное:
// ... другие директивы
МассивДиректив.Добавить("&Вместо");
МассивДиректив.Добавить("&Перед");
МассивДиректив.Добавить("&После");
// Добавляем нашу новую директиву
МассивДиректив.Добавить("&ИзменениеИКонтроль");
// ...
После внесения изменений сохраните файл. Это позволит diff3cf корректно анализировать процедуры, использующие &ИзменениеИКонтроль, что полезно для общего анализа, даже если наша основная задача — &Вместо.
Теперь, когда OneScript и diff3cf установлены и настроены, мы готовы к выполнению сравнения. Нам потребуются три конфигурации, выгруженные в формате XML-файлов:
E:\old_cfg).E:\new_cfg).E:\ext_cfg).Для выгрузки конфигураций в XML-файлы используйте стандартные возможности конфигуратора 1С: откройте конфигурацию (или расширение), перейдите в меню "Конфигурация" -> "Сохранить конфигурацию в файл..." и укажите путь к пустой папке.
diff3cf (или убедитесь, что путь к oscript добавлен в PATH) и выполните следующую команду:
diff3cf diff E:\old_cfg E:\new_cfg E:\ext_cfg E:\result.html
Где:
E:\old_cfg — путь к папке со старой конфигурацией поставщика.E:\new_cfg — путь к папке с новой конфигурацией поставщика.E:\ext_cfg — путь к папке с конфигурацией вашего расширения.E:\result.html — путь, по которому будет сгенерирован HTML-отчет с результатами сравнения.diff3cf сгенерирует HTML-файл. Откройте его в любом веб-браузере. В этом отчете вы найдете информацию о процедурах и функциях, которые были перехвачены с помощью &Вместо в вашем расширении и которые изменились в новой версии конфигурации поставщика. Это значительно упростит выявление критичных участков кода, требующих вашего внимания.Хотя OneScript с diff3cf предоставляет мощное автоматизированное решение, существуют и другие методы, а также полезные стратегии, которые могут быть применены в зависимости от ваших предпочтений и сложности задачи.
OneScript, можно использовать более традиционный подход с утилитами сравнения файлов.
&Вместо. Каждую такую процедуру можно сохранить в отдельный текстовый файл в специальной папке (например, Папка_1_Расширение).Папка_2_НоваяКонфигурация). Повторите этот шаг для предыдущего релиза конфигурации, сохранив файлы в третью папку (например, Папка_3_СтараяКонфигурация).KDiff3 (или TortoiseMerge, или любую другую утилиту для сравнения трех файлов/каталогов) для сравнения содержимого этих папок. Это позволит вам увидеть изменения между старой и новой версиями типовой процедуры, а также сравнить их с вашей версией в расширении. Это решение можно автоматизировать, написав свою обработку для выгрузки и парсинга, хотя это и будет "изобретением велосипеда" при наличии diff3cf.&Вместо.
Мы можем получить этот список, используя глобальный поиск в расширении по строке "&Вместо". Если расширений много или они очень большие, более эффективным будет выгрузить все расширения в файлы .cfe и выполнить глобальный поиск по содержимому этих файлов. Это даст нам отправную точку для дальнейшего анализа.
В контексте внесения изменений в типовой код очень важно выбирать правильный инструмент. Директива &Вместо, хотя и позволяет полностью заменить процедуру или функцию, часто приводит к описанным выше проблемам при обновлении, так как требует ручного переноса всех изменений типового кода в расширение.
Гораздо более предпочтительным вариантом является использование директивы &ИзменениеИКонтроль. Эта директива была специально создана для точечного внесения изменений в типовые процедуры без необходимости копировать всю процедуру целиком. Вместо этого вы указываете лишь те строки, которые хотите изменить, добавить или удалить. Преимущества &ИзменениеИКонтроль очевидны:
KDiff3 или TortoiseMerge, работают с такими изменениями намного эффективнее.Однако, как было верно отмечено в обсуждении, использование &ИзменениеИКонтроль может быть ограничено режимом совместимости конфигурации. В более старых режимах совместимости эта директива может быть недоступна. Если ваша конфигурация работает в режиме совместимости, не поддерживающем &ИзменениеИКонтроль, или если вы не можете изменить режим совместимости, то использование &Вместо может быть вынужденной мерой. В таких случаях автоматизированные средства сравнения, такие как diff3cf, становятся критически важными.
Для более глубокого и системного подхода к управлению изменениями и обновлениями в 1С-разработке мы можем рассмотреть следующие современные инструменты:
EDT встроены мощные механизмы сравнения и объединения, которые могут быть применены и для анализа изменений в заимствованном коде. Работа с исходным кодом в формате текстовых файлов и интеграция с системами контроля версий, такими как Git, значительно упрощают процесс контроля и обновления.Git, для хранения конфигурации и расширений в виде файлов может кардинально изменить подход к обновлениям. Выгружая различные версии конфигурации и расширения в репозиторий, мы получаем возможность использовать всю мощь инструментов сравнения (diff), встроенных в Git, для отслеживания изменений в заимствованных процедурах между релизами. Это делает процесс более наглядным и контролируемым, позволяя легко увидеть, кто, когда и что изменил в каждой версии кода.Выбирая подходящий инструмент или комбинацию инструментов, мы можем значительно упростить процесс обновления конфигураций 1С с расширениями, минимизировать риски и повысить качество разработки.