Разработка и Конфигурация · 12 мин
Как в 1С сравнить два файла: пошаговое руководство
Как в 1С сравнить два файла: текстовые, XML, табличные документы и конфигурации. Встроенные средства, код на встроенном языке и внешние программы.
Задача сравнения двух файлов в 1С возникает в самых разных ситуациях: нужно проверить, изменился ли выгруженный XML-файл обмена, найти различия между двумя версиями конфигурации, сверить табличные документы или просто убедиться, что два текстовых файла идентичны. Универсальной кнопки «сравнить файлы» в типовых прикладных решениях нет, поэтому способ зависит от типа файлов и от того, где выполняется сравнение — в конфигураторе, в пользовательском режиме или программно.
Для конфигураций и их частей в 1С есть встроенный механизм сравнения и объединения. Для текстовых и XML-файлов можно использовать программное чтение и построчный анализ на встроенном языке. Для табличных документов (MXL) существует отдельная функция сравнения. А если нужно лишь быстро проверить идентичность файлов, достаточно сравнить их хеш-суммы.
Ниже разобраны все основные сценарии: от простой проверки идентичности до построчного сравнения текстов и выбора внешних инструментов, когда штатных средств недостаточно.
Определите тип файлов и цель сравнения
Прежде чем выбирать инструмент, ответьте на два вопроса: что за файлы сравниваются и что должно получиться в результате. От этого зависит весь подход. Сравнение «идентичны или нет» требует только хеш-суммы и выполняется за секунды даже для больших файлов. Поиск конкретных различий построчно требует чтения содержимого и алгоритма сопоставления. Сравнение конфигураций требует штатного механизма платформы, потому что файлы CF — это бинарные контейнеры, бессмысленные для текстового сравнения.
Типичные пары выглядят так: два CF-файла конфигураций, два XML-файла обмена данными, два текстовых лога, два табличных документа MXL, два CSV-файла выгрузки. Для каждой пары есть оптимальный метод, и попытка применить «не тот» инструмент либо даст неверный результат, либо вообще не сработает.
Использовать только встроенное сравнение конфигуратором
ЧтениеТекста, построчное сравнение или внешний diff
Достаточно сравнить хеш-суммы
Программное сравнение областей табличного документа
Сравнение конфигураций штатными средствами
Если нужно сравнить два файла конфигурации (CF) или текущую конфигурацию базы с файлом, используется встроенный механизм. Откройте конфигуратор, загрузите конфигурацию базы, затем выберите в меню «Конфигурация» пункт «Сравнить, объединить с конфигурацией из файла» и укажите второй CF-файл. Платформа построит дерево объектов и отметит различия: изменённые, добавленные и удалённые объекты.
В окне сравнения можно раскрыть каждый объект и увидеть, что именно изменилось — свойства, формы, модули, макеты. Для модулей доступно детальное построчное сравнение текстов: двойной щелчок по модулю открывает окно с подсветкой отличающихся строк. Это самый удобный способ анализа чужих доработок перед обновлением.
Важно понимать: механизм сравнивает структуру метаданных и тексты модулей, но не данные информационной базы. Если нужно сравнить содержимое справочников или документов из двух разных баз, этот инструмент не подходит — потребуется выгрузка данных и их отдельный анализ.
- 1Откройте конфигуратор и конфигурацию рабочей базы
- 2Меню: Конфигурация → Сравнить, объединить с конфигурацией из файла
- 3Выберите второй CF-файл и дождитесь построения дерева различий
- 4Раскройте изменённые объекты, для модулей откройте построчное сравнение
- 5При необходимости снимите флажки с объектов, которые переносить не нужно
Быстрая проверка идентичности через хеш-суммы
Когда нужно лишь ответить на вопрос «одинаковые ли файлы», построчное сравнение избыточно. Достаточно вычислить хеш-сумму каждого файла и сравнить два значения. Во встроенном языке 1С для этого есть объект ХешированиеДанных, поддерживающий алгоритмы MD5, SHA1 и SHA256.
Метод прост: создаёте объект хеширования, добавляете в него файл через метод ДобавитьФайл и получаете итоговое значение. Если хеши двух файлов совпали — файлы идентичны побайтово. Если различаются — файлы разные, но где именно различия, хеш не покажет.
Функция ХешФайла(ПутьКФайлу)
Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
Хеш.ДобавитьФайл(ПутьКФайлу);
Возврат НРег(СтрЗаменить(Хеш.ХешСумма, " ", ""));
КонецФункции
// Использование:
Если ХешФайла("C:\файл1.xml") = ХешФайла("C:\файл2.xml") Тогда
Сообщить("Файлы идентичны");
Иначе
Сообщить("Файлы различаются");
КонецЕсли;Учтите ограничение: хеширование чувствительно к любому байту. Два визуально одинаковых текстовых файла с разными окончаниями строк (CRLF и LF) или разной кодировкой дадут разные хеши. Поэтому «файлы разные» по хешу не всегда означает «различается содержательная часть».
Программное сравнение текстовых и XML-файлов
Для поиска конкретных различий текстовые файлы читают через объект ЧтениеТекста и сравнивают построчно. Это подходит для логов, CSV, простых XML, файлов печатных форм в текстовом виде. Код ниже выводит номера и содержимое различающихся строк.
Чтение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 и метаданных; детально, но не для данных и не для обычных файлов
Мгновенный ответ «одинаковы ли», но без деталей различий
Гибко и встраивается в обработки; требует одинакового порядка строк и кодировки
Наглядно и без программирования; не автоматизируется внутри регламентных заданий без запуска внешнего ПО
Частые ошибки и ограничения
Самая распространённая ошибка — сравнение XML как обычного текста. Два функционально идентичных XML-файла, сформированных разными системами, почти всегда отличаются форматированием, и построчное сравнение выдаст сотни ложных различий. Разбирайте XML как структуру данных.
Вторая типичная проблема — попытка сравнить CF-файлы текстовыми инструментами. Это бинарные контейнеры: внешний diff покажет бессмысленный набор байтов. Для конфигураций существует только штатный механизм платформы либо выгрузка конфигурации в файлы XML (пакетный режим конфигуратора) с последующим сравнением уже текстовых выгрузок.
Как проверить результат
Файлы побайтово идентичны, задача закрыта
Хеши разные — нужен детальный анализ различий
Различий нет или они только в ожидаемых строках
Различия в каждой строке — проверьте кодировку и окончания строк
Дерево различий построено, изменённые объекты соответствуют ожиданиям
Платформа не открывает файл — проверьте версию платформы, под которой сохранён CF
Часто задаваемые вопросы
Можно ли сравнить два файла в 1С без программирования?
Да, но частично. Конфигурации сравниваются через меню конфигуратора без единой строки кода. Для текстовых файлов без программирования придётся использовать внешние программы (WinMerge, Notepad++), открыв файлы в них напрямую. Штатной кнопки сравнения произвольных файлов в пользовательском режиме типовых конфигураций нет.
Как сравнить два XML-файла обмена данными?
Надёжнее всего сравнивать не текст, а данные: загрузите оба файла через ЧтениеXML и сопоставьте значения нужных узлов. Если нужен быстрый визуальный анализ, приведите оба файла к единому форматированию (например, отформатируйте в редакторе) и сравните внешним diff-инструментом — тогда различия будут только содержательными.
Почему одинаковые файлы показывают разные хеши?
Хеш чувствителен к каждому байту. Различия могут быть в кодировке (UTF-8 с BOM и без), в окончаниях строк (CRLF против LF), в невидимых символах. Откройте оба файла в редакторе, показывающем кодировку и служебные символы, и приведите их к единому виду.
Можно ли сравнить файлы на сервере 1С в регламентном задании?
Да. Код с ХешированиеДанных и ЧтениеТекста работает на сервере, если пути к файлам доступны серверному процессу (сетевые или локальные каталоги сервера). Внешние программы из регламентного задания запускать не стоит — это небезопасно и требует интерактивной сессии.
Как сравнить две версии конфигурации, если есть только базы, а не CF-файлы?
Выгрузите конфигурацию каждой базы в CF-файл (Конфигурация → Сохранить конфигурацию в файл), затем в конфигураторе одной из баз выполните сравнение с файлом второй. Либо используйте пакетный режим конфигуратора для выгрузки обеих конфигураций в XML-файлы и сравните полученные каталоги внешним инструментом.
Что делать, если файлы очень большие и сравнение «подвисает»?
Не читайте файл целиком методом Прочитать() — используйте построчное чтение в цикле, чтобы не загружать всё в память. Для проверки идентичности больших файлов хеширование работает эффективно, так как файл обрабатывается потоково. Если и этого недостаточно, сравнение лучше вынести во внешнюю утилиту.
Что важно запомнить
Выбор способа зависит от типа файла: конфигурации — штатным сравнением в конфигураторе, факт идентичности — хеш-суммами, текстовые файлы — построчным чтением, XML — сравнением структуры данных. Всегда проверяйте кодировку и делайте резервную копию перед объединением конфигураций.