Преамбула.
При сохранение таблиц (формата MXL) из 1С в EXCEL часто наблюдается «обрезание» длинных строк (в ячейке MXL текст длиной скажем 300 символов, а в EXCEL уходит только 255). Наверно, есть много разных способов борьбы с этим злом, здесь представлен один из них.
Суть метода – сравнение текста в каждой ячейки таблицы 1С и соотвествующей ей ячейки файла EXCEL.
Обработка требует
— предварительного сохранения таблицы 1С в файл (на самом деле, мне прислали ряд таких файлов, и поставили задачу загнать все корректно в EXCEL – отсюда и подход реализации);
— наличие на компьютере установленного MS Office (так как используется OLE объект).
Работа с обработкой
На форме (рисунок 1) выбирается исходный MXL файл (поле «Входной файл») и окончательный фал EXCEL (поле «Выходной файл»).
Если файла EXCEL еще нет, то необходимо снять галочку «Не перезаписывать файл, а только обработать». В этом случае программа сама создаст EXCEL файл с указанным именем из файла MXL.
После выполнения корректировки EXCEL файла его можно или сразу записать, или открыть на просмотр (и потом уже если все в порядке записывать).
Реализация обработки.
На форме переманенные:
«ИмяВхФайла» — имя исходного MXL файла;
«ИмяВыхФайла» — имя конечного EXCEL файла;
«НеПерезаписывать» — галочка, решающая нужно ли предварительно создавать EXCEL файл из MXL;
«ЧтоДелатьСВыходным» — переключатель, определяет показать ли предварительно выходной файл или сразу записывать.
Сам код модуля обработки (если интересно)
--------------------------------------------------------------
Процедура ПроверкаЯчеекЭКСЕЛ(Таб,ЛистЕ,ТипФайлаEXCEL)
Если ТипЗначенияСтр(ЛистЕ) <> "OLE._Worksheet" тогда
возврат;
КонецЕсли;
МаксСтрок = Таб.ВысотаТаблицы();
Если МаксСтрок =0 Тогда
возврат;
КонецЕсли;
МаксКол = Таб.ШиринаТаблицы();
для стр = 1 по МаксСтрок цикл
Если стр%25=0 тогда
Состояние("Проверили "+Стр+" из "+МаксСтрок);
КонецЕсли;
для кол = 1 по МаксКол цикл
Текст_ = Таб.Область(Стр,кол).Текст;
ДлиннаСтр = стрДлина(Текст_);
Если ПустаяСтрока(Текст_)=1 Тогда
продолжить;
ИначеЕсли ДлиннаСтр
// ошибка может быть только начиная с 242, но возьмем чуть меньще
продолжить;
КонецЕсли;
Ячейка = ЛистЕ.Cells(стр,кол);
Ячейка.NumberFormat = "";
Ячейка.Value = Текст_;
ТипФайлаEXCEL = -4143;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура Сформировать()
Таб = СоздатьОбъект("Таблица");
Таб.Открыть(ИмяВхФайла);
ЕСли НеПерезаписывать=0 тогда
Таб.Записать(ИмяВыхФайла,1);
КонецЕСли;
ExcelApp = СоздатьОбъект("Excel.Application");
НовыеРабочиеКниги =ExcelApp.WorkBooks;
РабочаяКнига =НовыеРабочиеКниги.Add(ИмяВыхФайла);
ТипФайлаEXCEL = 39;
ПроверкаЯчеекЭКСЕЛ(Таб,ExcelApp.ActiveSheet,ТипФайлаEXCEL);
Если ЧтоДелатьСВыходным=1 Тогда
ExcelApp.ActiveWorkbook.SaveAs(ИмяВыхФайла,ТипФайлаEXCEL);
выход=ExcelApp.ActiveWindow.Close;
иначеЕСли ЧтоДелатьСВыходным=2 Тогда
ExcelApp.Visible = 1;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога,ФлагСтандОбр)
Если ИдентЭлемДиалога="ИмяВхФайла" Тогда
ИмяФайла = ИмяВхФайла;
Каталог = "";
Если ФС.ВыбратьФайл(0,ИмяФайла,Каталог,"Выберите файл","*.mxl|*.mxl","mxl")=1 Тогда
ИмяВхФайла = Каталог+ИмяФайла;
КонецЕсли;
ИначеЕсли ИдентЭлемДиалога="ИмяВыхФайла" Тогда
ИмяФайла = ИмяВыхФайла;
Каталог = "";
Если ФС.ВыбратьФайл(1,ИмяФайла,Каталог,"Выберите файл","*.xls|*.xls","xls")=1 Тогда
ИмяВыхФайла = Каталог+ИмяФайла;
КонецЕсли;
КонецЕсли;
КонецПРоцедуры
ЧтоДелатьСВыходным = 1;
--------------------------------------------------------------
PS. Подумал, может кто тоже сталкивался с такой проблемой – тогда пригодится, или на какие другие полезные мысли наведет 🙂