К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как в 1С сравнить два файла: пошаговое руководство

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

Задача сравнения двух файлов в 1С возникает в самых разных ситуациях: нужно проверить, изменился ли выгруженный XML-файл обмена, найти различия между двумя версиями конфигурации, сверить табличные документы или просто убедиться, что два текстовых файла идентичны. Универсальной кнопки «сравнить файлы» в типовых прикладных решениях нет, поэтому способ зависит от типа файлов и от того, где выполняется сравнение — в конфигураторе, в пользовательском режиме или программно.

Для конфигураций и их частей в 1С есть встроенный механизм сравнения и объединения. Для текстовых и XML-файлов можно использовать программное чтение и построчный анализ на встроенном языке. Для табличных документов (MXL) существует отдельная функция сравнения. А если нужно лишь быстро проверить идентичность файлов, достаточно сравнить их хеш-суммы.

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

Определите тип файлов и цель сравнения

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

Типичные пары выглядят так: два CF-файла конфигураций, два XML-файла обмена данными, два текстовых лога, два табличных документа MXL, два CSV-файла выгрузки. Для каждой пары есть оптимальный метод, и попытка применить «не тот» инструмент либо даст неверный результат, либо вообще не сработает.

Файлы CF или CFUКонфигурации

Использовать только встроенное сравнение конфигуратором

XML, TXT, CSV, логиТекстовые данные

ЧтениеТекста, построчное сравнение или внешний diff

Только факт измененияДа/нет без деталей

Достаточно сравнить хеш-суммы

MXL, табличные документыПечатные формы

Программное сравнение областей табличного документа

Сравнение конфигураций штатными средствами

Если нужно сравнить два файла конфигурации (CF) или текущую конфигурацию базы с файлом, используется встроенный механизм. Откройте конфигуратор, загрузите конфигурацию базы, затем выберите в меню «Конфигурация» пункт «Сравнить, объединить с конфигурацией из файла» и укажите второй CF-файл. Платформа построит дерево объектов и отметит различия: изменённые, добавленные и удалённые объекты.

В окне сравнения можно раскрыть каждый объект и увидеть, что именно изменилось — свойства, формы, модули, макеты. Для модулей доступно детальное построчное сравнение текстов: двойной щелчок по модулю открывает окно с подсветкой отличающихся строк. Это самый удобный способ анализа чужих доработок перед обновлением.

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

Порядок действий для конфигураций
  1. 1
    Откройте конфигуратор и конфигурацию рабочей базы
  2. 2
    Меню: Конфигурация → Сравнить, объединить с конфигурацией из файла
  3. 3
    Выберите второй CF-файл и дождитесь построения дерева различий
  4. 4
    Раскройте изменённые объекты, для модулей откройте построчное сравнение
  5. 5
    При необходимости снимите флажки с объектов, которые переносить не нужно

Быстрая проверка идентичности через хеш-суммы

Когда нужно лишь ответить на вопрос «одинаковые ли файлы», построчное сравнение избыточно. Достаточно вычислить хеш-сумму каждого файла и сравнить два значения. Во встроенном языке 1С для этого есть объект ХешированиеДанных, поддерживающий алгоритмы MD5, SHA1 и SHA256.

Метод прост: создаёте объект хеширования, добавляете в него файл через метод ДобавитьФайл и получаете итоговое значение. Если хеши двух файлов совпали — файлы идентичны побайтово. Если различаются — файлы разные, но где именно различия, хеш не покажет.

bsl
Функция ХешФайла(ПутьКФайлу)
    Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
    Хеш.ДобавитьФайл(ПутьКФайлу);
    Возврат НРег(СтрЗаменить(Хеш.ХешСумма, " ", ""));
КонецФункции

// Использование:
Если ХешФайла("C:\файл1.xml") = ХешФайла("C:\файл2.xml") Тогда
    Сообщить("Файлы идентичны");
Иначе
    Сообщить("Файлы различаются");
КонецЕсли;

Учтите ограничение: хеширование чувствительно к любому байту. Два визуально одинаковых текстовых файла с разными окончаниями строк (CRLF и LF) или разной кодировкой дадут разные хеши. Поэтому «файлы разные» по хешу не всегда означает «различается содержательная часть».

Программное сравнение текстовых и XML-файлов

Для поиска конкретных различий текстовые файлы читают через объект ЧтениеТекста и сравнивают построчно. Это подходит для логов, CSV, простых XML, файлов печатных форм в текстовом виде. Код ниже выводит номера и содержимое различающихся строк.

bsl
Чтение1 = Новый ЧтениеТекста("C:\файл1.txt", КодировкаТекста.UTF8);
Чтение2 = Новый ЧтениеТекста("C:\файл2.txt", КодировкаТекста.UTF8);

НомерСтроки = 0;
Пока Истина Цикл
    Строка1 = Чтение1.ПрочитатьСтроку();
    Строка2 = Чтение2.ПрочитатьСтроку();
    Если Строка1 = Неопределено И Строка2 = Неопределено Тогда
        Прервать;
    КонецЕсли;
    НомерСтроки = НомерСтроки + 1;
    Если Строка1 <> Строка2 Тогда
        Сообщить("Строка " + НомерСтроки + ": [" + Строка1 + "] <> [" + Строка2 + "]");
    КонецЕсли;
КонецЦикла;
Чтение1.Закрыть();
Чтение2.Закрыть();

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

Для XML имеет смысл сравнивать не текст, а структуру: прочитать оба файла через ЧтениеXML или DOM-модель и сопоставить значения узлов. Текстовое сравнение XML даст ложные расхождения из-за разного форматирования, порядка атрибутов и пробелов, не влияющих на данные.

Сравнение табличных документов

Табличные документы в формате MXL (печатные формы, сохранённые отчёты) сравнивают программно: оба файла загружаются в объекты ТабличныйДокумент методом Прочитать, после чего по областям сопоставляется содержимое ячеек. Проходят циклом по строкам и колонкам области и сравнивают свойство Текст каждой ячейки.

Практический приём: перед сравнением стоит проверить габариты областей (ВысотаТаблицы и ШиринаТаблицы). Если они различаются, документы уже заведомо не идентичны, и дальнейший анализ можно вести только по пересечению областей. Для больших отчётов удобно не сравнивать каждую ячейку, а вычислить хеш от конкатенации всех значений — это быстрее.

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

Внешние инструменты как альтернатива

Не всегда рационально писать код в 1С. Если сравнение разовое и файлы текстовые, быстрее воспользоваться специализированными программами: WinMerge, KDiff3, Notepad++ с плагином Compare, Beyond Compare. Они показывают различия наглядно, с подсветкой и возможностью слияния, умеют игнорировать пробелы и регистр.

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

Сравнение вариантов

Сравнение конфигураций в конфигураторе

Только для CF/CFU и метаданных; детально, но не для данных и не для обычных файлов

Хеш-суммы в коде

Мгновенный ответ «одинаковы ли», но без деталей различий

Построчное сравнение через ЧтениеТекста

Гибко и встраивается в обработки; требует одинакового порядка строк и кодировки

Внешние diff-программы

Наглядно и без программирования; не автоматизируется внутри регламентных заданий без запуска внешнего ПО

Частые ошибки и ограничения

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

Вторая типичная проблема — попытка сравнить CF-файлы текстовыми инструментами. Это бинарные контейнеры: внешний diff покажет бессмысленный набор байтов. Для конфигураций существует только штатный механизм платформы либо выгрузка конфигурации в файлы XML (пакетный режим конфигуратора) с последующим сравнением уже текстовых выгрузок.

Типичные ошибки
01
Сравнение XML построчно — лавина ложных различий из-за форматирования и порядка атрибутов
02
Игнорирование кодировки — файлы с одинаковым содержимым признаются разными
03
Сравнение без учёта окончаний строк CRLF/LF — ложные расхождения после переноса файла между Windows и Linux
04
Попытка сравнить CF-файлы внешним diff — бессмысленный результат, нужен конфигуратор
05
Сравнение больших файлов целиком в памяти через Прочитать() — риск нехватки памяти, читайте построчно
Контрольные точки

Как проверить результат

Хеши совпали
Норма

Файлы побайтово идентичны, задача закрыта

Тревожный признак

Хеши разные — нужен детальный анализ различий

Построчное сравнение
Норма

Различий нет или они только в ожидаемых строках

Тревожный признак

Различия в каждой строке — проверьте кодировку и окончания строк

Сравнение конфигураций
Норма

Дерево различий построено, изменённые объекты соответствуют ожиданиям

Тревожный признак

Платформа не открывает файл — проверьте версию платформы, под которой сохранён CF

Часто задаваемые вопросы

Можно ли сравнить два файла в 1С без программирования?

Да, но частично. Конфигурации сравниваются через меню конфигуратора без единой строки кода. Для текстовых файлов без программирования придётся использовать внешние программы (WinMerge, Notepad++), открыв файлы в них напрямую. Штатной кнопки сравнения произвольных файлов в пользовательском режиме типовых конфигураций нет.

Как сравнить два XML-файла обмена данными?

Надёжнее всего сравнивать не текст, а данные: загрузите оба файла через ЧтениеXML и сопоставьте значения нужных узлов. Если нужен быстрый визуальный анализ, приведите оба файла к единому форматированию (например, отформатируйте в редакторе) и сравните внешним diff-инструментом — тогда различия будут только содержательными.

Почему одинаковые файлы показывают разные хеши?

Хеш чувствителен к каждому байту. Различия могут быть в кодировке (UTF-8 с BOM и без), в окончаниях строк (CRLF против LF), в невидимых символах. Откройте оба файла в редакторе, показывающем кодировку и служебные символы, и приведите их к единому виду.

Можно ли сравнить файлы на сервере 1С в регламентном задании?

Да. Код с ХешированиеДанных и ЧтениеТекста работает на сервере, если пути к файлам доступны серверному процессу (сетевые или локальные каталоги сервера). Внешние программы из регламентного задания запускать не стоит — это небезопасно и требует интерактивной сессии.

Как сравнить две версии конфигурации, если есть только базы, а не CF-файлы?

Выгрузите конфигурацию каждой базы в CF-файл (Конфигурация → Сохранить конфигурацию в файл), затем в конфигураторе одной из баз выполните сравнение с файлом второй. Либо используйте пакетный режим конфигуратора для выгрузки обеих конфигураций в XML-файлы и сравните полученные каталоги внешним инструментом.

Что делать, если файлы очень большие и сравнение «подвисает»?

Не читайте файл целиком методом Прочитать() — используйте построчное чтение в цикле, чтобы не загружать всё в память. Для проверки идентичности больших файлов хеширование работает эффективно, так как файл обрабатывается потоково. Если и этого недостаточно, сравнение лучше вынести во внешнюю утилиту.

Итог

Что важно запомнить

Выбор способа зависит от типа файла: конфигурации — штатным сравнением в конфигураторе, факт идентичности — хеш-суммами, текстовые файлы — построчным чтением, XML — сравнением структуры данных. Всегда проверяйте кодировку и делайте резервную копию перед объединением конфигураций.