Как быстро сравнить процедуры/функции расширения с директивой &Вместо с обновленной конфигурацией 1С?

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

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

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

Основное решение: Автоматическое сравнение с OneScript и diff3cf

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

Разберем по шагам процесс установки OneScript

  1. Загрузка OneScript: Прежде всего, нам понадобится установить среду выполнения OneScript. Перейдите на официальный сайт OneScript и загрузите актуальную версию инсталлятора. Установите его, следуя инструкциям мастера установки.
  2. Проверка установки: После завершения установки OneScript важно убедиться, что все прошло успешно. Откройте командную строку (или терминал) и выполните команду oscript -v. Если установка прошла корректно, вы увидите информацию о версии установленного OneScript. В некоторых случаях может потребоваться перезагрузка компьютера для корректной работы переменной среды PATH.

Установка и настройка утилиты diff3cf

  1. Установка diff3cf через OPM: После успешной установки OneScript мы можем установить утилиту diff3cf с помощью пакетного менеджера OPM (OneScript Package Manager). Откройте командную строку от имени администратора и выполните следующую команду: opm install diff3cf

    Эта команда загрузит и установит diff3cf и все необходимые зависимости.

  2. Исправление скрипта для поддержки директивы &ИзменениеИКонтроль: На момент написания этого материала утилита diff3cf может не поддерживать директиву &ИзменениеИКонтроль из коробки, но это легко исправить. Нам потребуется внести небольшие изменения в исходный код утилиты.

    Перейдите в папку, куда был установлен diff3cf. Обычно это C:\Program Files\OneScript\lib\diff3cf\src\. В этой папке найдите файл Классы\ПарсерМодулейРасширения.os. Откройте его в любом текстовом редакторе.

    Внутри этого файла нам необходимо найти функции ПолучитьДирективыМетодов и ПрочитатьМетодыМодуля. В этих функциях добавьте поддержку директивы &ИзменениеИКонтроль по аналогии с уже существующими директивами. Это обычно сводится к добавлению пары строк кода, которые включают новую директиву в список распознаваемых. Например, в функции, которая определяет список директив, вы можете увидеть нечто подобное:

    
    // ... другие директивы
    МассивДиректив.Добавить("&Вместо");
    МассивДиректив.Добавить("&Перед");
    МассивДиректив.Добавить("&После");
    // Добавляем нашу новую директиву
    МассивДиректив.Добавить("&ИзменениеИКонтроль");
    // ...
    

    После внесения изменений сохраните файл. Это позволит diff3cf корректно анализировать процедуры, использующие &ИзменениеИКонтроль, что полезно для общего анализа, даже если наша основная задача — &Вместо.

Порядок использования diff3cf для сравнения

Теперь, когда OneScript и diff3cf установлены и настроены, мы готовы к выполнению сравнения. Нам потребуются три конфигурации, выгруженные в формате XML-файлов:

  1. Выгрузка конфигураций в XML:
    • Старая конфигурация поставщика: Это версия конфигурации, на которую основывалось ваше расширение до текущего обновления. Выгрузите ее в файлы (например, в папку E:\old_cfg).
    • Новая конфигурация поставщика: Это та обновленная конфигурация, с которой вы сравниваете. Выгрузите ее в файлы (например, в папку E:\new_cfg).
    • Конфигурация расширения: Ваше расширение. Выгрузите его в файлы (например, в папку E:\ext_cfg).

    Для выгрузки конфигураций в XML-файлы используйте стандартные возможности конфигуратора 1С: откройте конфигурацию (или расширение), перейдите в меню "Конфигурация" -> "Сохранить конфигурацию в файл..." и укажите путь к пустой папке.

  2. Запуск команды diff3cf: Откройте командную строку в папке, где установлена утилита 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-отчет с результатами сравнения.
  3. Анализ отчета: После выполнения команды diff3cf сгенерирует HTML-файл. Откройте его в любом веб-браузере. В этом отчете вы найдете информацию о процедурах и функциях, которые были перехвачены с помощью &Вместо в вашем расширении и которые изменились в новой версии конфигурации поставщика. Это значительно упростит выявление критичных участков кода, требующих вашего внимания.

Альтернативные подходы и полезные стратегии

Хотя OneScript с diff3cf предоставляет мощное автоматизированное решение, существуют и другие методы, а также полезные стратегии, которые могут быть применены в зависимости от ваших предпочтений и сложности задачи.

  1. Сравнение с помощью KDiff3 и файловых выгрузок: Если вы предпочитаете ручной контроль или не хотите настраивать OneScript, можно использовать более традиционный подход с утилитами сравнения файлов.
    1. Выгрузка расширения в файлы: Сначала выгрузите ваше расширение в файлы. Затем вам потребуется распарсить файлы модулей, чтобы получить список всех процедур и функций, заимствованных с помощью директивы &Вместо. Каждую такую процедуру можно сохранить в отдельный текстовый файл в специальной папке (например, Папка_1_Расширение).
    2. Выгрузка текущей и предыдущей конфигурации: Выгрузите текущую конфигурацию поставщика в файлы. Затем найдите в соответствующих файлах модулей те процедуры и функции, которые совпадают по именам с заимствованными из расширения. Сохраните их в другую папку (например, Папка_2_НоваяКонфигурация). Повторите этот шаг для предыдущего релиза конфигурации, сохранив файлы в третью папку (например, Папка_3_СтараяКонфигурация).
    3. Использование KDiff3 для сравнения: После подготовки трех наборов файлов вы можете использовать утилиту KDiff3 (или TortoiseMerge, или любую другую утилиту для сравнения трех файлов/каталогов) для сравнения содержимого этих папок. Это позволит вам увидеть изменения между старой и новой версиями типовой процедуры, а также сравнить их с вашей версией в расширении. Это решение можно автоматизировать, написав свою обработку для выгрузки и парсинга, хотя это и будет "изобретением велосипеда" при наличии diff3cf.
  2. Стратегия предварительного анализа конфигурации поставщика: Прежде чем углубляться в сравнение кода расширения, мы можем сначала сравнить старую и новую конфигурации поставщика. Если процедура, которую мы подменили в расширении, не изменилась в новом релизе основной конфигурации, то и наше расширение в этой части править не нужно. Это позволяет нам сосредоточиться только на тех процедурах, которые действительно были модифицированы в типовом решении.
  3. Формирование списка заимствованных процедур: Для любого подхода нам понадобится список процедур и функций, которые были перехвачены с помощью &Вместо.

    Мы можем получить этот список, используя глобальный поиск в расширении по строке "&Вместо". Если расширений много или они очень большие, более эффективным будет выгрузить все расширения в файлы .cfe и выполнить глобальный поиск по содержимому этих файлов. Это даст нам отправную точку для дальнейшего анализа.

Рекомендации по использованию директив: &ИзменениеИКонтроль против &Вместо

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

Гораздо более предпочтительным вариантом является использование директивы &ИзменениеИКонтроль. Эта директива была специально создана для точечного внесения изменений в типовые процедуры без необходимости копировать всю процедуру целиком. Вместо этого вы указываете лишь те строки, которые хотите изменить, добавить или удалить. Преимущества &ИзменениеИКонтроль очевидны:

Однако, как было верно отмечено в обсуждении, использование &ИзменениеИКонтроль может быть ограничено режимом совместимости конфигурации. В более старых режимах совместимости эта директива может быть недоступна. Если ваша конфигурация работает в режиме совместимости, не поддерживающем &ИзменениеИКонтроль, или если вы не можете изменить режим совместимости, то использование &Вместо может быть вынужденной мерой. В таких случаях автоматизированные средства сравнения, такие как diff3cf, становятся критически важными.

Современные инструменты для разработки 1С

Для более глубокого и системного подхода к управлению изменениями и обновлениями в 1С-разработке мы можем рассмотреть следующие современные инструменты:

  1. 1С:EDT (Enterprise Development Tools): Эта современная среда разработки предоставляет более продвинутые возможности для работы с расширениями по сравнению с традиционным конфигуратором. В EDT встроены мощные механизмы сравнения и объединения, которые могут быть применены и для анализа изменений в заимствованном коде. Работа с исходным кодом в формате текстовых файлов и интеграция с системами контроля версий, такими как Git, значительно упрощают процесс контроля и обновления.
  2. "Снегопат" и плагины: Инструмент "Снегопат" с его плагинами является мощным помощником для разработчиков. Существуют плагины, которые могут автоматически анализировать код в расширениях, выявлять изменения в типовых процедурах и функциях, а также осуществлять поиск заимствованных методов, формируя списки переопределенных процедур. Это избавляет от необходимости выполнять ручной поиск.
  3. Системы контроля версий (Git): Использование систем контроля версий, таких как Git, для хранения конфигурации и расширений в виде файлов может кардинально изменить подход к обновлениям. Выгружая различные версии конфигурации и расширения в репозиторий, мы получаем возможность использовать всю мощь инструментов сравнения (diff), встроенных в Git, для отслеживания изменений в заимствованных процедурах между релизами. Это делает процесс более наглядным и контролируемым, позволяя легко увидеть, кто, когда и что изменил в каждой версии кода.

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

← На главную