Сравнение двух файлов в 1С 8.3: Конфигуратор, fc.exe, diff-утилиты и код

· 10 мин

Содержание

Сравнить два файла в 1С быстрее всего в Конфигураторе: меню Файл → Сравнить файлы, выбрать оба файла и нажать «Сравнить». Для модулей и выгрузок конфигурации удобнее внешняя программа (WinMerge, KDiff3), для пакетной проверки — системная утилита fc.exe, а если сравнение нужно внутри обработки — код на встроенном языке с построчным разбором или хешем.

Способ выбирают по типу файла. Тексты, модули и XML сравнивают построчно. Двоичные файлы (.dt, .cf, .1CD, архивы) построчно сравнивать бессмысленно: для них проверяют совпадение байтов, а содержимое конфигураций сравнивают штатным механизмом платформы.

Что сравниваемУдобный способЧто получите
Два текстовых файла, модуляКонфигуратор или diff-программаПодсветка изменённых строк
Сотни файлов в папкеfc.exe или скриптКод возврата и список отличий
Файлы внутри обработкиВстроенный языкТаблица различий, отчёт
.dt, .1CD, архивыХеш или fc /bТолько «равны / не равны»
.cf, расширения .cfeКонфигурация → Сравнить конфигурацииДерево изменённых объектов

Сравнение двух файлов прямо в Конфигураторе 1С

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

  1. Откройте базу в режиме Конфигуратора. Сама база не важна: файлы сравниваются с диска, конфигурация не меняется.
  2. Выберите в главном меню Файл → Сравнить файлы.
  3. Укажите первый и второй файл. Порядок влияет только на то, какой файл окажется слева.
  4. Нажмите «Сравнить». Откроется окно с двумя панелями, различающиеся строки подсвечены.

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

Если вы правите модуль в нескольких копиях базы, выгрузите его через контекстное меню модуля в текстовый файл и сравните с файлом из второй базы. Так видна разница ещё до объединения конфигураций.

Ограничение у встроенного средства одно, но существенное: оно показывает разницу, но не помогает с объединением трёх версий. Для трёхстороннего слияния нужна внешняя программа.

Утилита 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. Через выгрузку в файлы. Универсальный вариант для любого релиза:

  1. Выгрузите обе версии конфигурации в XML: Конфигурация → Выгрузить конфигурацию в файлы, каждую в свою папку.
  2. Откройте в WinMerge сравнение папок и выберите обе папки.
  3. Включите фильтр *.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:

  1. В Конфигураторе выберите Конфигурация → Сравнить конфигурации.
  2. В первом поле оставьте основную конфигурацию, во втором выберите «Файл конфигурации» и укажите .cf.
  3. Нажмите «ОК». Откроется дерево объектов, изменённые элементы отмечены.
  4. Двойной щелчок по модулю или форме открывает построчное сравнение именно этого объекта.

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

Сравнение расширений. Откройте Конфигурация → Расширения конфигурации, затем само расширение. В его окне доступны те же команды сравнения: можно сравнить расширение с файлом .cfe, например версию из рабочей базы с версией из разработки.

Для автоматизации расширения выгружают в файлы из командной строки и сравнивают как текст:

"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /DumpConfigToFiles "D:\Dump\Ext" -Extension "МоеРасширение"
Что именно вам нужно сравнить?

Отчёт о различиях: как сохранить и показать результат

Сравнение мало найти, его часто нужно передать коллеге или приложить к задаче.

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

Отчёт из своей обработки. Таблицу различий из кода удобно вывести в табличный документ с подсветкой:

Функция ОтчетОРазличиях(Различия)
	Отчет = Новый ТабличныйДокумент;
	Отчет.Область(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?
Выгрузите каждую в XML из командной строки Конфигуратора ключом /DumpExternalDataProcessorOrReportToFiles, каждую в свою папку. Получившиеся папки сравните в WinMerge.
Подходит ли сравнение файлов для проверки результата обмена?
Да, если обе стороны выгружают данные в одном формате и порядке. Чаще порядок объектов разный, тогда сравнивайте по содержимому, а не по позиции строк.
Какой хеш выбрать: MD5 или SHA256?
Для контроля целостности копий подойдут оба. SHA256 медленнее, но надёжнее; MD5 заметно быстрее на больших архивах.
Почему fc пишет, что файлы различаются, а diff-программа показывает одинаковые?
Скорее всего, в программе включено игнорирование пробелов, регистра или окончаний строк, а fc запущен без ключей /w и /c.