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

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


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

сравнение двух mxl файлов с записью результата



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

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

---

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



   
ОтветитьЦитата