Две версии внешней обработки: как найти каждое отличие в коде, формах и макетах

· 10 мин

Содержание

Сравнить две обработки в 1С 8.3 быстрее всего прямо в Конфигураторе: меню Файл → Сравнить файлы, указать два файла .epf (или .erf для отчётов) — платформа покажет дерево объектов с отличиями, а по двойному щелчку откроет сравнение модулей построчно. Для регулярной работы надёжнее другой путь: выгрузить обе обработки в файлы XML и BSL и сравнивать их любым diff-инструментом или через git.

Частое заблуждение — открыть два файла .epf в WinMerge или Total Commander и смотреть на результат. Внешняя обработка хранится в двоичном контейнере, поэтому такое сравнение скажет только «файлы разные». Где именно и что поменялось, оно не покажет. Даже одна и та же обработка, пересохранённая без правок, может дать другой набор байтов.

Когда сравнивать обработки и что именно вы ищете

Задача «сравнить» бывает разной, и от неё зависит инструмент. Перед стартом определите, какой у вас случай.

  • 🔍 Подрядчик прислал новую версию. Нужно понять, что он изменил, и не сломал ли рабочее.
  • 🧩 Две копии без истории. В папке лежат Загрузка_v2.epf и Загрузка_final.epf, и никто не помнит, какая актуальная.
  • 🛡️ Проверка перед запуском. Обработку скачали или получили по почте, и надо убедиться, что внутри нет лишнего кода.
  • 🔁 Перенос доработки. Свою правку нужно повторить в свежей версии обработки от поставщика.
  • 📦 Контроль целостности. Надо подтвердить, что файл на сервере тот же, что прошёл проверку.

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

Какая у вас задача?

Быстрая оценка: хеш файла и визуальный осмотр

Самый быстрый ответ на вопрос «это одна и та же обработка?» — контрольная сумма. В Windows она считается встроенными средствами, без 1С.

В PowerShell:

Get-FileHash "C:\Обработки\Загрузка_v2.epf" -Algorithm SHA256
Get-FileHash "C:\Обработки\Загрузка_final.epf" -Algorithm SHA256

В обычной командной строке:

certutil -hashfile "C:\Обработки\Загрузка_v2.epf" SHA256

Если суммы совпали, файлы одинаковые, дальше сравнивать нечего. Если разные — это ещё не значит, что изменился код. Обработку могли просто открыть и сохранить в Конфигураторе другой версии платформы.

Храните хеш проверенной версии рядом с ней — например, в файле Загрузка.epf.sha256. Через полгода не придётся вспоминать, ту ли обработку вы проверяли.

Визуальный осмотр — второй быстрый способ. Откройте обе обработки в Конфигураторе через Файл → Открыть и сравните дерево: реквизиты, табличные части, формы, макеты, команды. Добавленная форма или новый макет видны сразу. Правку внутри модуля так не найти — для этого нужен следующий шаг.

Сравнение обработок в Конфигураторе

Встроенный механизм Конфигуратора — основной способ для разового сравнения. Он работает и с внешними обработками, и с внешними отчётами.

Пошагово

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

Механизм Сравнить файлы понимает и обычные текстовые файлы, и табличные документы .mxl. Удобно, когда нужно сравнить выгруженный макет печатной формы.

Что видно, а что нет

Что сравниваетсяВидно в КонфигуратореКомментарий
Модуль объектаДа, построчноОсновное место логики
Модули формДа, построчноОбработчики кнопок и событий формы
Элементы формыДаДобавленные и удалённые поля, группы, кнопки
Реквизиты и табличные частиДаНовые реквизиты, смена типа
МакетыЧастичноТабличный макет можно открыть и сравнить отдельно
Защищённый паролем модульНетБез пароля текст недоступен

Сравнение в Конфигураторе — это просмотр. Ничего не объединяйте и не сохраняйте поверх рабочего файла, пока не решили, какая версия правильная. Сначала сделайте копию обоих .epf.

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

Выгрузка обработки в файлы и сравнение diff-инструментом

С платформы 8.3.8 внешнюю обработку можно выгрузить в набор файлов: XML-описания объектов и модули .bsl в виде обычного текста. После этого две версии сравниваются как две папки — любым инструментом: WinMerge, KDiff3, Beyond Compare, встроенным diff в VS Code или git.

Выгрузка через Конфигуратор вручную

Откройте обработку в Конфигураторе. В меню Файл есть команда выгрузки во внешние файлы (в контекстном меню корневого элемента обработки — тоже). Укажите пустую папку. Повторите для второй версии в другую папку.

Выгрузка из командной строки

Пакетный режим Конфигуратора позволяет сделать то же без открытия окна. Нужна любая информационная база — например, пустая файловая:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "C:\Bases\Empty" /DisableStartupDialogs ^
  /DumpExternalDataProcessorOrReportToFiles "C:\Diff\v2\Загрузка.xml" "C:\Обработки\Загрузка_v2.epf" ^
  /Out "C:\Diff\dump_v2.log"

Подставьте свой номер платформы в путь к 1cv8.exe. Первый параметр команды — путь к корневому XML-файлу выгрузки, второй — сама обработка. Обратная команда /LoadExternalDataProcessorOrReportFromFiles собирает .epf из файлов.

Выгружайте обе версии одной и той же версией платформы. Иначе в XML появятся отличия в служебных атрибутах формата, и полезные изменения утонут в шуме.

Что получится в папке

Выгрузка в иерархическом формате выглядит примерно так:

  • Загрузка.xml — описание обработки: реквизиты, табличные части, ссылки на формы и макеты;
  • Загрузка\Ext\ObjectModule.bsl — модуль объекта;
  • Загрузка\Forms\Форма\Ext\Form.xml — состав элементов формы;
  • Загрузка\Forms\Форма\Ext\Form\Module.bsl — модуль формы;
  • Загрузка\Templates\... — макеты.

Теперь откройте обе папки в WinMerge (Файл → Открыть, обе папки, флажок «Включить вложенные папки»). Программа покажет, какие файлы различаются, а внутри — построчно.

Утилиты без Конфигуратора

Если Конфигуратора под рукой нет, контейнер можно разобрать сторонними открытыми утилитами. Самая известная — v8unpack: она распаковывает .epf в папку с модулями. Формат её результата отличается от официальной выгрузки, поэтому сравнивайте только версии, разобранные одним инструментом. Точные ключи запуска смотрите в справке утилиты (v8unpack без параметров выводит список).

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

Код — только часть обработки. Часто отличие прячется в форме: добавили поле, поменяли тип реквизита, скрыли кнопку. В выгрузке это видно в XML.

Форма

Файл Form.xml описывает элементы, их порядок, свойства и привязку к реквизитам. При сравнении ищите:

  • 🧱 новые и удалённые элементы — поля, группы, кнопки командной панели;
  • 🔗 смену DataPath — поле теперь показывает другой реквизит;
  • 👁️ свойства видимости и доступности;
  • ⚙️ назначенные обработчики событий — по ним видно, какая процедура модуля срабатывает на кнопку.

Каждому элементу формы платформа присваивает числовой идентификатор. Если разработчик пересобрал форму, идентификаторы сдвинутся, и diff покажет «изменилось всё». Смотрите на имена и свойства элементов, а не на номера.

Реквизиты и табличные части

Они описаны в корневом XML. Самые опасные изменения — смена типа реквизита и удаление колонки табличной части. Обработка с такой правкой может перестать открывать сохранённые настройки пользователей.

Макеты

Табличные макеты сравнивайте не через XML, а в самой платформе. Сохраните макет из каждой версии в файл .mxl и откройте оба через Файл → Сравнить файлы в Конфигураторе. Так видно отличия по ячейкам и областям, а не в разметке.

Проверка чужой обработки перед запуском

Отдельный сценарий — проверить, что внутри обработки, полученной со стороны. Здесь сравнение идёт не с другой версией, а с ожиданием: что обработка должна делать.

Не запускайте незнакомую обработку в рабочей базе, пока не прочитали код. Открытие через Файл → Открыть в режиме 1С:Предприятие выполняет код формы. Открытие в Конфигураторе — нет, это безопасный просмотр.

Что искать в выгруженных модулях поиском по папке:

Что найтиЗачем
УдалитьОбъекты, .Удалить()Массовое удаление данных
ЗапуститьПриложение, КомандаСистемыЗапуск внешних программ
HTTPСоединение, FTPСоединениеПередача данных наружу
ПривилегированныйРежимОбход прав пользователя
Выполнить(, Вычислить(Код, который собирается на лету и не виден при чтении
ПользователиИнформационнойБазыСоздание пользователей, смена паролей

Сами по себе эти слова не значат вредоносность: загрузка из банка легально ходит по HTTP. Но каждое такое место надо прочитать и понять, зачем оно там.

Перед первым запуском чужой обработки
Выполнено: 0 / 5

Как поставить сравнение на поток: git и автоматическая выгрузка

Когда обработок десятки и правят их несколько человек, ручное сравнение перестаёт работать. Решение — хранить исходники в git и смотреть изменения как в любом другом проекте.

Схема работы

  1. Заведите репозиторий, где каждая обработка лежит выгруженной в свою папку.
  2. Перед коммитом выгружайте .epf в файлы — вручную, bat-скриптом или хуком git.
  3. Изменения смотрите через git diff, в веб-интерфейсе GitLab или Gitea, либо в VS Code.
  4. Для сборки рабочего файла используйте обратную команду /LoadExternalDataProcessorOrReportFromFiles.

Простой скрипт для выгрузки всех обработок из папки:

@echo off
set V8="C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe"
set IB=C:\Bases\Empty
for %%f in (C:\Обработки\*.epf) do (
  %V8% DESIGNER /F "%IB%" /DisableStartupDialogs ^
    /DumpExternalDataProcessorOrReportToFiles "C:\Repo\src\%%~nf\%%~nf.xml" "%%f" ^
    /Out "C:\Repo\dump.log" -NoTruncate
)

Строка с -NoTruncate дописывает лог, а не перезаписывает его на каждой обработке. Конфигуратор в пакетном режиме запускается заново для каждого файла, поэтому на 50 обработок уйдёт несколько минут.

Готовые инструменты

  • 🛠️ 1C:EDT — среда разработки на Eclipse, работает с исходниками в файлах и с git напрямую.
  • 🧰 vanessa-runner (OneScript) — набор команд для сборки и разборки обработок в CI. Список команд выдаёт vrunner help.
  • 🔧 Хуки git на OneScript — при коммите автоматически раскладывают .epf в исходники, чтобы diff был виден без ручных действий.

Добавьте в репозиторий файл .gitattributes и задайте единый перевод строк для *.bsl и *.xml. Иначе после правки на другом компьютере git покажет изменёнными все строки модуля.

Из-за чего сравнение врёт: шум и ложные отличия

Большинство «странных» результатов сравнения объясняются техническими причинами, а не правками кода.

  • 🔢 Разные версии платформы при выгрузке. XML отличается служебными атрибутами формата. Выгружайте одной версией.
  • ↩️ Перевод строк и кодировка. Один файл в CRLF, другой в LF — и весь модуль «изменён». В WinMerge включите игнорирование различий в переводах строк, в git — .gitattributes.
  • 🆔 Идентификаторы элементов формы. После пересборки формы номера сдвигаются. Сравнивайте имена.
  • 🔒 Пароль на модуль. Защищённый модуль не выгружается в текст. Нужен пароль от автора, без него доступно только сравнение структуры.
  • 📄 Разные форматы выгрузки. Иерархический и плоский формат дают разную структуру папок. Выбирайте один и придерживайтесь его.
  • 🧪 Сравнение разных инструментов. Папка от v8unpack и папка от Конфигуратора не совпадут даже для одного файла.

Если после всех настроек diff всё равно показывает изменённым каждый файл — проверьте пробелы в начале строк. Табуляция против пробелов тоже даёт сплошную подсветку. В WinMerge и KDiff3 есть опция игнорировать пробельные символы.

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

Можно ли сравнить внешнюю обработку с обработкой внутри конфигурации?
Да, но в два шага. Встроенную обработку сохраните во внешний файл через контекстное меню объекта в дереве конфигурации, затем сравните два .epf обычным способом.
Почему хеш разный, а Конфигуратор отличий не показывает?
Файл пересохранили без изменений по сути — например, в другой версии платформы. Содержимое то же, контейнер другой. Ориентируйтесь на результат содержательного сравнения.
Нужна ли лицензия, чтобы сравнивать обработки в Конфигураторе?
Нужна платформа с возможностью запустить Конфигуратор. Сами diff-инструменты вроде WinMerge и git бесплатны и лицензии 1С не требуют.
Как сравнить внешние отчёты?
Так же, как обработки. Файлы .erf поддерживаются и в Файл → Сравнить файлы, и в пакетной выгрузке той же командой.
Можно ли объединить две версии обработки?
Удобнее всего через выгрузку: объедините изменения в файлах (WinMerge или git merge), а затем соберите .epf обратной командой. Готовый файл обязательно откройте в Конфигураторе и проверьте синтаксис модулей.