База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Как сравнить два mxl файла и записать результаты различий? › RE: Как сравнить два mxl файла и записать результаты различий?

Для сравнения двух файлов формата MXL (табличных документов 1С) с записью результата разногласий можно использовать следующий подход:
—
### Общая идея решения
1. Загрузить оба MXL файла в объекты ТабличногоДокумента.
2. Сравнить их построчно и поколоночно.
3. Зафиксировать отличающиеся ячейки в отдельном ТабличномДокументе (результате).
4. Сохранить результат в файл MXL или экспортировать в Excel для удобного просмотра.
—
### Примерный алгоритм на 1С (язык встроенных процедур):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
bsl // Функция сравнения двух табличных документов Функция СравнитьMXL(ТабДок1, ТабДок2) Экспорт Результат = Новый ТабличныйДокумент; // Определяем максимальное количество строк и колонок МаксСтрок = Максимум(ТабДок1.КоличествоСтрок(), ТабДок2.КоличествоСтрок()); МаксКолонок = Максимум(ТабДок1.КоличествоКолонок(), ТабДок2.КоличествоКолонок()); // Создаем структуру результата с таким же размером Для Строка = 1 По МаксСтрок Цикл Результат.ДобавитьСтроку(); Для Колонка = 1 По МаксКолонок Цикл Знач1 = ""; Знач2 = ""; Если Строка <= ТабДок1.КоличествоСтрок() И Колонка <= ТабДок1.КоличествоКолонок() Тогда Знач1 = ТабДок1.ПолучитьЯчейку(Строка, Колонка).Значение; КонецЕсли; Если Строка <= ТабДок2.КоличествоСтрок() И Колонка <= ТабДок2.КоличествоКолонок() Тогда Знач2 = ТабДок2.ПолучитьЯчейку(Строка, Колонка).Значение; КонецЕсли; // Записываем в результат: если значения совпадают, пишем значение, иначе помечаем разницу Если Знач1 = Знач2 Тогда Результат.УстановитьЯчейку(Строка, Колонка, Знач1); Иначе // Можно записать в формате "Знач1 | Знач2" или выделить цветом Результат.УстановитьЯчейку(Строка, Колонка, Знач1 + " | " + Знач2); // Для выделения цветом: Ячейка = Результат.ПолучитьЯчейку(Строка, Колонка); Ячейка.ЦветФона = Цвета.Красный; КонецЕсли; КонецЦикла; КонецЦикла; Возврат Результат; КонецФункции // Пример использования Процедура СравнитьФайлыMXL() ИмяФайла1 = "C:TempFile1.mxl"; ИмяФайла2 = "C:TempFile2.mxl"; ИмяРезультата = "C:TempResult.mxl"; ТабДок1 = Новый ТабличныйДокумент; ТабДок1.Прочитать(ИмяФайла1); ТабДок2 = Новый ТабличныйДокумент; ТабДок2.Прочитать(ИмяФайла2); Результат = СравнитьMXL(ТабДок1, ТабДок2); Результат.Записать(ИмяРезультата); Сообщить("Сравнение завершено. Результат сохранен в " + ИмяРезультата); КонецПроцедуры |
—
### Важные моменты:
– Если таблицы большие, сравнение может занять время.
– Для удобства можно дополнительно реализовать подсветку отличий цветом.
– Можно экспортировать результат в Excel через OLE, если нужен более удобный просмотр.
– Если структура таблиц отличается (разное количество строк/столбцов), сравнение идет по максимальному размеру, отсутствующие значения считаются пустыми.
—
### Альтернативные варианты:
– Использовать штатную обработку 1С «Сравнить файлы» (работает с MXL, но без сохранения результата).
– Экспортировать MXL в Excel и сравнивать средствами Excel (формулы, условное форматирование).
– Использовать внешние утилиты для сравнения Excel файлов.
—
Рекомендую посмотреть здесь:
https://infostart.ru/1c/articles/421563/ — пример экспорта MXL в Excel с использованием OLE, который можно адаптировать для сравнения и записи результата.
—
Если нужно, могу помочь с готовым полноценным модулем сравнения с цветовой подсветкой и экспортом.