Сравнение двух файлов в 1С 8.3: Конфигуратор, fc.exe, diff-утилиты и код
Содержание
Сравнить два файла в 1С быстрее всего в Конфигураторе: меню Файл → Сравнить файлы, выбрать оба файла и нажать «Сравнить». Для модулей и выгрузок конфигурации удобнее внешняя программа (WinMerge, KDiff3), для пакетной проверки — системная утилита fc.exe, а если сравнение нужно внутри обработки — код на встроенном языке с построчным разбором или хешем.
Способ выбирают по типу файла. Тексты, модули и XML сравнивают построчно. Двоичные файлы (.dt, .cf, .1CD, архивы) построчно сравнивать бессмысленно: для них проверяют совпадение байтов, а содержимое конфигураций сравнивают штатным механизмом платформы.
| Что сравниваем | Удобный способ | Что получите |
|---|---|---|
| Два текстовых файла, модуля | Конфигуратор или diff-программа | Подсветка изменённых строк |
| Сотни файлов в папке | fc.exe или скрипт | Код возврата и список отличий |
| Файлы внутри обработки | Встроенный язык | Таблица различий, отчёт |
| .dt, .1CD, архивы | Хеш или fc /b | Только «равны / не равны» |
| .cf, расширения .cfe | Конфигурация → Сравнить конфигурации | Дерево изменённых объектов |
Сравнение двух файлов прямо в Конфигураторе 1С
Платформа умеет сравнивать файлы без сторонних программ. Инструмент удобен, когда нужно быстро посмотреть разницу между двумя версиями модуля, выгруженного в текст, или двумя текстовыми логами.
- Откройте базу в режиме Конфигуратора. Сама база не важна: файлы сравниваются с диска, конфигурация не меняется.
- Выберите в главном меню
Файл → Сравнить файлы. - Укажите первый и второй файл. Порядок влияет только на то, какой файл окажется слева.
- Нажмите «Сравнить». Откроется окно с двумя панелями, различающиеся строки подсвечены.
Переходить между отличиями удобнее кнопками навигации окна, а не прокруткой: в длинном модуле изменённая строка легко теряется.
Если вы правите модуль в нескольких копиях базы, выгрузите его через контекстное меню модуля в текстовый файл и сравните с файлом из второй базы. Так видна разница ещё до объединения конфигураций.
Ограничение у встроенного средства одно, но существенное: оно показывает разницу, но не помогает с объединением трёх версий. Для трёхстороннего слияния нужна внешняя программа.
Утилита fc.exe: сравнение файлов из консоли и из кода 1С
fc.exe входит в состав Windows и ничего не требует. Запустите командную строку (Win+R → cmd) и выполните:
fc /n "C:\Exchange\old.xml" "C:\Exchange\new.xml"
Ключ /n выводит номера строк. Другие полезные ключи:
- 🔤
/c— не учитывать регистр букв; - ␣
/w— сжимать пробелы и табуляции, удобно для модулей с разными отступами; - 🌐
/u— сравнивать файлы как текст Unicode; - 🧱
/b— двоичное сравнение, побайтно; - 🔢
/lbN— размер буфера строк; если различий много иfcпрерывается с сообщением о «рассинхронизации», увеличьте его, например/lb500.
Утилита возвращает код: 0 — файлы одинаковые, 1 — есть различия, 2 — ошибка (файл не найден, нет доступа). На этом коде строят пакетные проверки.
@echo off
fc /b "D:\Backup\base_old.dt" "D:\Backup\base_new.dt" > nul
if %errorlevel%==0 echo Файлы совпадают
if %errorlevel%==1 echo Файлы различаются
if %errorlevel%==2 echo Ошибка доступа к файлам
Вызов fc.exe из обработки 1С
fc можно запустить из кода и прочитать результат. Вывод перенаправляем в файл, код возврата получаем через четвёртый параметр ЗапуститьПриложение:
Функция СравнитьЧерезFC(ПутьА, ПутьБ, ПутьОтчета)
Команда = СтрШаблон("cmd /c fc /n ""%1"" ""%2"" > ""%3""", ПутьА, ПутьБ, ПутьОтчета);
КодВозврата = 0;
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Возврат КодВозврата; // 0 - равны, 1 - различаются, 2 - ошибка
КонецФункции
Отчёт fc пишет в кодировке консоли, на русской Windows это OEM 866. Читайте его так: Новый ЧтениеТекста(ПутьОтчета, "cp866"), иначе кириллица превратится в кракозябры.
Код выполняется там, где запущен. В клиент-серверной базе серверная процедура видит диски сервера 1С, а не компьютера пользователя. Пути к файлам указывайте с учётом этого.
Подключение внешних diff-программ: WinMerge, KDiff3, Beyond Compare
Для ежедневной работы программиста внешняя программа сравнения удобнее встроенной. Она показывает разницу внутри строки, умеет сравнивать целые папки и делать трёхстороннее слияние.
| Программа | Лицензия | Сильная сторона |
|---|---|---|
| WinMerge | Бесплатная | Сравнение папок, фильтры по маскам |
| KDiff3 | Бесплатная | Трёхстороннее слияние (база, своя, чужая) |
| Beyond Compare | Платная | Сравнение таблиц, изображений, архивов |
| Meld | Бесплатная | Простой интерфейс, работа с git |
Есть два способа связать такую программу с 1С.
Способ 1. Через параметры Конфигуратора. В новых релизах платформы в окне Сервис → Параметры есть вкладка настроек сравнения и объединения. В ней указывают путь к исполняемому файлу внешней программы и шаблон параметров. После этого при сравнении модулей Конфигуратор передаёт тексты во внешнюю программу. Шаблон параметров берите из документации выбранной утилиты: у WinMerge и KDiff3 он разный.
Способ 2. Через выгрузку в файлы. Универсальный вариант для любого релиза:
- Выгрузите обе версии конфигурации в XML:
Конфигурация → Выгрузить конфигурацию в файлы, каждую в свою папку. - Откройте в WinMerge сравнение папок и выберите обе папки.
- Включите фильтр
*.bsl, если интересуют только модули, или*.xmlдля метаданных.
Выгрузка в файлы — основа хранения конфигураций в git. Положите выгрузку в репозиторий, и история изменений любого модуля будет видна обычным git diff.
Выгрузку можно запустить и без открытия Конфигуратора, из командной строки:
"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /N "Администратор" /P "" /DumpConfigToFiles "D:\Dump\Test" /Out "D:\Dump\log.txt"
Номер версии в пути замените на установленную у вас платформу.
Построчное сравнение текстовых файлов на встроенном языке
Когда сравнение нужно в самой программе — проверить загруженный прайс, сверить выгрузки обмена, — пишут обработку. Сначала читаем файл в массив строк:
Функция ПрочитатьСтроки(Путь, Кодировка = "UTF-8")
Результат = Новый Массив;
Чтение = Новый ЧтениеТекста(Путь, Кодировка);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Результат.Добавить(СокрП(Строка));
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Возврат Результат;
КонецФункции
ПрочитатьСтроку() возвращает Неопределено в конце файла, на этом и держится цикл. СокрП убирает хвостовые пробелы, чтобы они не давали ложных отличий.
Вариант 1: сравнение по позиции
Подходит, когда строки не добавляются и не удаляются, а только меняются: например, файл фиксированной структуры.
Функция РазличияПоПозиции(СтрокиА, СтрокиБ)
Различия = Новый ТаблицаЗначений;
Различия.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
Различия.Колонки.Добавить("ФайлА", Новый ОписаниеТипов("Строка"));
Различия.Колонки.Добавить("ФайлБ", Новый ОписаниеТипов("Строка"));
КоличествоА = СтрокиА.Количество();
КоличествоБ = СтрокиБ.Количество();
Для Индекс = 0 По Макс(КоличествоА, КоличествоБ) - 1 Цикл
ЗначениеА = ?(Индекс < КоличествоА, СтрокиА[Индекс], "<нет строки>");
ЗначениеБ = ?(Индекс < КоличествоБ, СтрокиБ[Индекс], "<нет строки>");
Если ЗначениеА <> ЗначениеБ Тогда
НоваяСтрока = Различия.Добавить();
НоваяСтрока.НомерСтроки = Индекс + 1;
НоваяСтрока.ФайлА = ЗначениеА;
НоваяСтрока.ФайлБ = ЗначениеБ;
КонецЕсли;
КонецЦикла;
Возврат Различия;
КонецФункции
ТаблицаЗначений недоступна в тонком клиенте, поэтому функцию размещают в серверном модуле или вызывают через &НаСервере.
Вариант 2: сравнение по содержимому
У позиционного сравнения есть слабое место. Вставили одну строку в начало — и все следующие строки «съехали», отчёт покажет различия по всему файлу. Если порядок строк не важен (списки кодов, номенклатуры, ИНН), считайте вхождения через Соответствие:
Функция СтрокиТолькоВПервом(СтрокиА, СтрокиБ)
Счетчик = Новый Соответствие;
Для Каждого Значение Из СтрокиБ Цикл
Было = Счетчик.Получить(Значение);
Счетчик.Вставить(Значение, ?(Было = Неопределено, 1, Было + 1));
КонецЦикла;
Результат = Новый Массив;
Для Каждого Значение Из СтрокиА Цикл
Было = Счетчик.Получить(Значение);
Если Было = Неопределено Или Было = 0 Тогда
Результат.Добавить(Значение);
Иначе
Счетчик.Вставить(Значение, Было - 1);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Вызвав функцию дважды — (А, Б) и (Б, А), — получите строки, которые есть только в первом и только во втором файле. Повторы учитываются: если в файле А строка встречается 3 раза, а в Б — 2, одна попадёт в результат.
Для настоящего diff с учётом вставок и удалений нужен алгоритм наибольшей общей подпоследовательности. На встроенном языке он пишется, но на файлах в десятки тысяч строк работает медленно. В таких случаях проще вызвать внешнюю утилиту.
Двоичные файлы, выгрузки .dt и файлы баз .1CD
Двоичный файл показывает только факт совпадения. Самый быстрый путь — сначала сравнить размер, затем хеш:
Функция ФайлыОдинаковые(ПутьА, ПутьБ)
ФайлА = Новый Файл(ПутьА);
ФайлБ = Новый Файл(ПутьБ);
Если ФайлА.Размер() <> ФайлБ.Размер() Тогда
Возврат Ложь;
КонецЕсли;
Возврат ХешФайла(ПутьА) = ХешФайла(ПутьБ);
КонецФункции
Функция ХешФайла(Путь)
Хеш = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеш.ДобавитьФайл(Путь);
Возврат Base64Строка(Хеш.ХешСумма);
КонецФункции
Хеш переводится в строку через Base64Строка, чтобы сравнивать обычные строки. Метод ДобавитьФайл читает файл потоком, поэтому даже файл в несколько гигабайт не загружается в память целиком.
Что важно знать про файлы 1С:
- 📦 Две выгрузки .dt одной и той же базы почти никогда не совпадают побайтно. В архив попадают служебные данные, и разница хеша ещё не значит, что данные разные.
- 🗄️ Файл базы 1Cv8.1CD сравнивать побайтно бессмысленно: страницы файла перестраиваются при каждой записи. Сравнивать нужно данные через отчёты или выгрузки.
- ✅ Хеш полезен для контроля копии. Скопировали .dt на другой сервер — сравните хеш оригинала и копии, чтобы убедиться, что файл не повредился при передаче.
Не открывайте рабочий 1Cv8.1CD внешними программами сравнения, пока с базой работают пользователи. Делайте копию файла и сравнивайте её.
Если нужно понять, чем различаются данные двух выгрузок .dt, загрузите их в две отдельные пустые базы и сравнивайте уже данные: отчётами, выгрузкой в XML или конфигурации — механизмом из следующего раздела.
Сравнение конфигураций .cf и расширений .cfe
Файлы .cf и .cfe — двоичные контейнеры. Их сравнивают не как файлы, а как конфигурации, с разбором по объектам.
Сравнение текущей конфигурации с файлом .cf:
- В Конфигураторе выберите
Конфигурация → Сравнить конфигурации. - В первом поле оставьте основную конфигурацию, во втором выберите «Файл конфигурации» и укажите .cf.
- Нажмите «ОК». Откроется дерево объектов, изменённые элементы отмечены.
- Двойной щелчок по модулю или форме открывает построчное сравнение именно этого объекта.
Так же сравнивают основную конфигурацию с конфигурацией базы данных или конфигурацией поставщика. Это удобный способ увидеть, какие изменения ещё не применены к базе.
Сравнение расширений. Откройте Конфигурация → Расширения конфигурации, затем само расширение. В его окне доступны те же команды сравнения: можно сравнить расширение с файлом .cfe, например версию из рабочей базы с версией из разработки.
Для автоматизации расширения выгружают в файлы из командной строки и сравнивают как текст:
"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /DumpConfigToFiles "D:\Dump\Ext" -Extension "МоеРасширение"
Файл → Сравнить файлы. Ничего ставить не нужно.fc.Конфигурация → Сравнить конфигурации, затем открывайте отличия по объектам.Отчёт о различиях: как сохранить и показать результат
Сравнение мало найти, его часто нужно передать коллеге или приложить к задаче.
Отчёт из окна сравнения конфигураций. В окне сравнения есть команда формирования отчёта о сравнении. В её настройках выбирают степень подробности: только список изменённых объектов или с текстами модулей. Отчёт выводится в текстовый или табличный документ и сохраняется в файл.
Отчёт из своей обработки. Таблицу различий из кода удобно вывести в табличный документ с подсветкой:
Функция ОтчетОРазличиях(Различия)
Отчет = Новый ТабличныйДокумент;
Отчет.Область(1, 1).Текст = "Строка";
Отчет.Область(1, 2).Текст = "Файл А";
Отчет.Область(1, 3).Текст = "Файл Б";
НомерСтрокиОтчета = 1;
Для Каждого Различие Из Различия Цикл
НомерСтрокиОтчета = НомерСтрокиОтчета + 1;
Отчет.Область(НомерСтрокиОтчета, 1).Текст = Формат(Различие.НомерСтроки, "ЧГ=0");
Отчет.Область(НомерСтрокиОтчета, 2).Текст = Различие.ФайлА;
Отчет.Область(НомерСтрокиОтчета, 3).Текст = Различие.ФайлБ;
Отчет.Область(НомерСтрокиОтчета, 2, НомерСтрокиОтчета, 3).ЦветФона = WebЦвета.СветлоРозовый;
КонецЦикла;
Возврат Отчет;
КонецФункции
Формат(..., "ЧГ=0") убирает пробел-разделитель групп разрядов: без него строка 1250 выведется как «1 250».
Готовый документ сохраняют методом Записать в .mxl, .xlsx или .pdf. Для журналов проверок достаточно текстового отчёта fc с кодом возврата: его легко разобрать скриптом.
Ошибки, из-за которых сравнение врёт
- 🔁 Разные переводы строк. Файл из Linux (LF) и из Windows (CRLF) выглядят одинаково, но
fc /bпокажет различия в каждой строке. Сравнивайте в текстовом режиме или приведите окончания строк к одному виду. - 🔤 Разная кодировка. Один файл в UTF-8, второй в Windows-1251 — кириллица не совпадёт нигде. При чтении в 1С указывайте кодировку явно во втором параметре
ЧтениеТекста. - 🏷️ Метка BOM. UTF-8 с BOM и без BOM различаются тремя байтами в начале. Хеши разные, хотя текст тот же.
- ↔️ Отступы. Табуляция против четырёх пробелов в модуле. Используйте
fc /wили опцию игнорирования пробелов в diff-программе. - 🖥️ Не тот компьютер. Серверный код ищет файл на сервере 1С и возвращает ошибку «файл не найден», хотя на рабочем месте пользователя файл есть.
Частые вопросы
Можно ли сравнить два файла Excel средствами 1С?
Прочитать и сравнивайте значения ячеек в цикле, либо сохраните листы в CSV и сравните как текст.Как сравнить две обработки .epf?
/DumpExternalDataProcessorOrReportToFiles, каждую в свою папку. Получившиеся папки сравните в WinMerge.Подходит ли сравнение файлов для проверки результата обмена?
Какой хеш выбрать: MD5 или SHA256?
Почему fc пишет, что файлы различаются, а diff-программа показывает одинаковые?
fc запущен без ключей /w и /c.