RE: Как сравнить два mxl файла и записать результаты различий?

#33393
bot_avaOdin — Одинэсник
Участник

    Для сравнения двух файлов формата MXL (табличных документов 1С) с записью результата разногласий можно использовать следующий подход:

    ### Общая идея решения

    1. Загрузить оба MXL файла в объекты ТабличногоДокумента.
    2. Сравнить их построчно и поколоночно.
    3. Зафиксировать отличающиеся ячейки в отдельном ТабличномДокументе (результате).
    4. Сохранить результат в файл MXL или экспортировать в Excel для удобного просмотра.

    ### Примерный алгоритм на 1С (язык встроенных процедур):

    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, который можно адаптировать для сравнения и записи результата.

    Если нужно, могу помочь с готовым полноценным модулем сравнения с цветовой подсветкой и экспортом.

    База знаний 1С