Сравнение двух обработок 1С: модули, формы и автоматизация

· 9 мин

Содержание

Пришли две версии одной обработки .epf — от подрядчика и своя доработанная, — и нужно понять, что в них разошлось. Напрямую файлы не сравнишь: .epf это бинарный контейнер, и любой текстовый диф покажет только «файлы различны».

Рабочий путь: выгрузить каждую обработку в набор текстовых файлов (Файл → Выгрузить в файлы… в Конфигураторе) и сравнить получившиеся каталоги — тексты модулей .bsl и XML форм — обычным инструментом сравнения. Для одного модуля быстрее открыть оба и свести их через Файл → Сравнить файлы….

Ниже разберём все способы сравнить две обработки в 1С 8.3: штатные средства Конфигуратора, внешние диф-утилиты, сравнение форм и команд, а также как поставить обработки на версионный контроль, чтобы различия считались автоматически.

Что внутри обработки и что имеет смысл сравнивать

Обработка 1С это не один файл с кодом, а структура из нескольких частей. При сравнении двух .epf расхождения ищут в:

  • 🧩 модуле объекта — основной код обработки;
  • 🪟 формах — реквизиты формы, элементы, их свойства и модули форм;
  • ⚙️ командах — список команд и их модули;
  • 📑 реквизитах и табличных частях — состав, типы, порядок;
  • 🖼 макетах — печатные формы, схемы компоновки данных;
  • 🔧 свойствах самой обработки — имя, синоним, настройки.

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

Сравнение текстов модулей в Конфигураторе

Если расхождения нужно увидеть только в коде — например, в модуле объекта, — проще всего остаться в Конфигураторе.

  1. Откройте первую обработку через Файл → Открыть и выберите .epf.
  2. Откройте её модуль объекта или модуль формы.
  3. Сохраните текст модуля в файл (скопируйте содержимое в текстовый редактор либо выгрузите обработку в файлы — см. следующий раздел).
  4. То же проделайте со второй обработкой.
  5. Вызовите Файл → Сравнить файлы…, укажите два сохранённых текста — Конфигуратор покажет построчные различия с подсветкой.

Инструмент Сравнить файлы работает с любыми текстовыми файлами и подсвечивает добавленные, удалённые и изменённые строки. Для одного-двух модулей этого достаточно, отдельные утилиты ставить не нужно.

Встроенное сравнение не понимает структуру обработки: оно видит просто текст. Если в двух версиях код одинаковый, но по-разному отформатирован (отступы, переносы), диф покажет расхождения там, где логики они не меняют.

Выгрузка обработки в файлы: сравниваем всё содержимое

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

  1. Откройте обработку в Конфигураторе.
  2. Выберите Файл → Выгрузить в файлы… (в части релизов пункт может называться близко по смыслу — суть в выгрузке объекта в каталог).
  3. Укажите пустой каталог — например, C:\compare\v1.
  4. Повторите для второй обработки в каталог C:\compare\v2.

На выходе получите дерево: тексты модулей в файлах .bsl (или .txt с модулями в старых релизах), описание форм и реквизитов в .xml, макеты отдельными файлами. Модуль объекта, модули форм, каждая форма со своим описанием, список реквизитов и табличных частей — всё раскладывается по вложенным папкам с говорящими именами. Теперь две папки сравниваются как обычные каталоги — любой диф-инструмент покажет, какие файлы добавились, исчезли или изменились, и по каждому файлу даст построчную разницу.

Преимущество способа — наглядная карта изменений. Вы сразу видите не только «код поменялся», но и в какой именно форме, в каком модуле и в каком реквизите. Для разбора доработок от стороннего разработчика это обычно единственный способ понять полный объём правок, а не только то, что бросается в глаза при запуске.

Этот способ закрывает сразу всё: и код, и формы, и состав реквизитов видны в одном сравнении. Это основной метод, когда обработки заметно разошлись и нужно свести изменения.

Выгрузка в файлы обратима: отредактированный каталог загружается назад командой Файл → Загрузить из файлов…. Так можно не просто сравнить, но и перенести отдельные правки из одной версии в другую.

Внешние утилиты для сравнения текстов и каталогов

Штатное Сравнить файлы сравнивает по одному файлу. Для дерева выгрузки удобнее специализированные диф-программы:

  • 🔵 WinMerge — бесплатная, сравнивает и файлы, и папки целиком, подсвечивает различия, умеет объединять изменения.
  • 🟢 Beyond Compare — платная, с трёхсторонним сравнением и правилами игнорирования (пробелы, регистр).
  • 🟡 KDiff3, Meld — бесплатные кроссплатформенные аналоги.
  • 🟣 Notepad++ с плагином Compare — для быстрого сравнения двух открытых текстов.

Порядок тот же: выгрузите обе обработки в файлы, затем в диф-программе откройте сравнение двух каталогов v1 и v2. Инструмент построит список различающихся файлов, а по каждому покажет изменённые строки.

Внешние утилиты не знают про структуру 1С: они сравнивают текст. Ложные расхождения из-за разных окончаний строк (CRLF и LF) или кодировки убираются в настройках сравнения — включите игнорирование пробелов и приведение переносов.

Как сравнить формы, команды и реквизиты

Код — не единственное, что меняется. Часто правят именно формы: добавляют поле, меняют свойство элемента, переписывают обработчик.

После выгрузки в файлы каждая форма представлена своим XML (описание элементов и реквизитов) и отдельным текстом модуля формы. Сравнение этих файлов между каталогами v1 и v2 покажет:

  • добавленные или удалённые элементы и реквизиты формы;
  • изменённые свойства (видимость, доступность, привязки);
  • расхождения в модуле формы — построчно, как обычный код;
  • различия в списке команд и их модулях.

На практике именно в формах прячется большая часть расхождений. Простой пример: в одной версии у поля ввода выставлена Доступность = Ложь, в другой — Истина. В XML формы это одна строка, и диф подсветит её сразу; визуально же, не открывая обе формы рядом, такую разницу легко пропустить. То же с добавленным обработчиком события: он виден в модуле формы как новый метод и как привязка в описании элемента.

Для командной разработки и наглядного сравнения форм удобна среда 1C:EDT: она хранит всю конфигурацию и внешние обработки как текстовые файлы проекта, поэтому различия версий видны штатными средствами редактора и системы контроля версий без ручной выгрузки.

Если нужно сравнить не две версии, а обработку с тем, что лежит в общем хранилище или репозитории, — об этом в разделе про автоматизацию ниже: там сравнение берёт на себя система версий.

Какой способ выбрать: таблица методов

СпособЧто сравниваетКогда удобенОграничения
Файл → Сравнить файлы в Конфигураторедва текста (модули)быстрый взгляд на кодпо одному файлу, только текст
Выгрузка в файлы + диф каталоговвсё: модули, формы, реквизиты, макетыполное сравнение двух версийнужен внешний диф для дерева
Внешние утилиты (WinMerge, Beyond Compare)тексты и целые каталогинаглядно, можно объединять правкине понимают структуру 1С
1C:EDTпроект целиком как тексткомандная работа, сравнение с веткойтребует установки и импорта
Git / CI + выгрузкаистория версий во временикоманда, автоматизациянужна первичная настройка
Какой способ сравнения выбрать под вашу задачу?

Автоматизация: версионирование обработок и CI/CD

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

Схема такая:

  1. Обработку при каждом изменении выгружают в файлы — вручную или пакетно.
  2. Выгрузку коммитят в Git. Текстовые .bsl и .xml отлично версионируются: diff между коммитами и есть сравнение версий.
  3. На сервере CI (GitLab CI, Jenkins и подобные) шаг автоматически собирает .epf из файлов и, при необходимости, прогоняет проверки.

Пакетная выгрузка и сборка выполняются Конфигуратором из командной строки. Разворачивание обработки в файлы и обратная сборка делаются параметрами пакетного режима DESIGNER:

"C:\Program Files\1cv8\...\1cv8.exe" DESIGNER /F"C:\base" /N"user" /P"pass" ^
  /DumpExternalDataProcessorOrReportToFiles "C:\compare\v1" "C:\proc\v1.epf"

Обратная операция — сборка .epf из каталога — выполняется парным параметром загрузки из файлов. Точный синтаксис и полный список параметров всегда сверяйте в справке: запустите 1cv8 /? или откройте раздел по пакетному запуску Конфигуратора, не полагаясь на память по одному примеру.

Для командной работы пригождаются утилиты сообщества (например, precommit1c, gitsync), которые автоматизируют выгрузку обработок в текст при коммите. А 1C:EDT изначально держит проект в текстовом виде, поэтому вписывается в Git и CI без промежуточной выгрузки.

Что имеет смысл класть в репозиторий по каждой обработке:

  • 📂 выгрузку в файлы — тексты модулей и XML форм как источник правды;
  • 📝 короткое описание изменения в сообщении коммита — зачем правили;
  • 🏷 тег или ветку на версию, которую отдали в продуктив, чтобы потом сравнить с ней доработки.

Как только обработки живут в репозитории, вопрос «чем отличаются две версии» закрывается командой git diff между коммитами или ветками — отдельные инструменты сравнения уже не нужны.

Нюансы интерпретации различий и частые ошибки

Сравнение показывает строки, а понять, что из них важно, — отдельная задача. На что смотреть:

  • 🧷 Бинарный .epf не сравнивается напрямую. Попытка открыть два .epf в текстовом дифе даёт «файлы различны» без деталей. Сначала выгрузка в файлы — потом сравнение.
  • 🔁 Разный порядок после пересохранения. После открытия и сохранения в разных релизах платформы XML может отличаться порядком узлов или служебными идентификаторами. Такие расхождения часто «ложные» — логика не менялась.
  • ↩️ Окончания строк и кодировка. CRLF против LF или разная кодировка подсвечивают файл как полностью изменённый. Включите в дифе игнорирование переносов и пробелов.
  • 🧮 Служебные идентификаторы (GUID). Внутренние идентификаторы объектов могут различаться, хотя смысла не несут. Не принимайте их за содержательную правку.
  • 📦 Версия платформы влияет на формат выгрузки. Выгружайте обе обработки одной версией платформы — иначе часть различий окажется в формате файлов, а не в вашем коде. Сравнивайте, когда номер платформы у обеих выгрузок одинаков.
  • 🧾 Обработка и отчёт. Для отчётов .erf всё работает так же, меняется только тип файла.

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

Частые вопросы

Можно ли сравнить два файла `.epf` напрямую, не выгружая в файлы?
Нет. .epf это бинарный контейнер, и текстовый диф покажет только факт различия без деталей. Для построчного сравнения обработку сначала выгружают в файлы либо сравнивают тексты модулей через Файл → Сравнить файлы.
Чем сравнение обработок отличается от сравнения конфигураций?
У конфигураций есть штатная команда Конфигурация → Сравнить, объединить…. Для внешней обработки её нет — поэтому сравнивают либо тексты модулей, либо каталоги, полученные выгрузкой в файлы.
Как сравнить обработку с её версией из хранилища или Git?
Если обработка версионируется, сравнение делает сама система контроля версий: в Git это git diff между коммитами, в 1C:EDT — сравнение с базовой ревизией. Отдельно выгружать и сводить файлы не нужно.
Видны ли в сравнении свойства формы и порядок реквизитов?
Да, если сравнивать выгрузку в файлы: формы и реквизиты лежат в XML, и диф покажет изменённые свойства, добавленные и удалённые элементы. Сравнение только текста модуля этого не даст.
Нужна ли одинаковая версия платформы для корректного сравнения?
Желательно. Выгрузка разными версиями платформы может отличаться форматом файлов и порядком узлов, из-за чего появятся расхождения, не связанные с вашими правками. Выгружайте обе обработки платформой с одинаковым номером.