Появилась старая как мир задачка программно из 1С сохранять большие отчеты в xlsx для стороннего анализа.
v7moxel пока нет возможности поставить, там WinServer2003, Yoksel, кажется сохраняет только в xls (97-2003).
Пока записываю xls из 1С, поэтому открываю в Excel и перезаписываю уже в xlsx
ИмяФайла = ПолноеИмяФайлаБезРаcширения + ".xls";
Т.Записать(ИмяФайла,1);
ВходExcel = СоздатьОбъект("Excel.Application");
ВходExcel.DisplayAlerts=0;//не показывать всякие ненужные предупреждения
ВходExcel.ScreenUpdating=0;//не обновлять экран при работе макроса
ВходExcel.Application.Workbooks.Open(ИмяФайла,0);//0-не пересчитывать ссылки,
ВходExcel.ActiveWorkBook.SaveAs(ПолноеИмяФайлаБезРаcширения,51);//Книга по умолчанию *.xlsx
ВходExcel.ActiveWorkBook.Close();
ВходExcel = "";
ФС.УдалитьФайл(ИмяФайла);
Ну понятно, что при записи из 1С есть проблема с обрезание до 65535 строк.
Есть какие-то способы сохранить mxl в современный xlsx программно?
это не подойдет https://infostart.ru/1c/tools/1026032/
?
Цитата: Злоп от 11 июня 2026, 22:29это не подойдет https://infostart.ru/1c/tools/1026032/
?
Вполне подойдет, но надо понимать, что вид таблицы не будет идентичным родному. Сейчас посмотрел и увидел, что автор компоненты дорабатывал ее в этой части, но я еще не протестировал, только скачал. Раньше масштаб сохраненных файлов сильно отличался от оригинального. Может сейчас стало лучше.
Цитата: Злоп от 11 июня 2026, 22:29это не подойдет
не подойдёт потому что:
Цитата: Харлампий Дымба от 11 июня 2026, 21:03v7moxel пока нет возможности поставить, там WinServer2003
Из описания v7moxel: "...Для работы требуется .Net Framework v4.6.2..." - а эта версия не встает на WinServer2003, так что v7moxel там не запустить.
Понятно, что я решу проблему, например:
Способ 1: кусками по 65535 строк сохранять таблицу, а потом объединять несколько xls в один xlsx уже движком Excel);
Способ 2: прогнуть админов на обновление ОС - и поставить v7moxel.
Но возможно у кого-нибудь найдётся решение поизящнее
У меня вот такой код работает в глобальнике с использование Йоксель:
Процедура ПриЗаписиТаблицы(КонтТаб, ИмяФайла, ФорматФайла, СтандартнаяОбработка)
Если ФорматФайла = 1 Тогда // xls
// Если КонтТаб.ВысотаТаблицы() > 100 Тогда
СтандартнаяОбработка = 0;
ТабличныйДокумент = СоздатьОбъект("ТабличныйДокумент");
ТабличныйДокумент.ЗагрузитьИзТаблицы(КонтТаб);
ТабличныйДокумент.Записать(ИмяФайла,"xls");
// КонецЕсли;
КонецЕсли;
КонецПроцедуры
Тут xls
A нужен xlsx
Цитата: АЛьФ от 15 июня 2026, 13:04У меня вот такой код работает в глобальнике с использование Йоксель:
Ну это, как я понимаю, чтобы избежать ошибки сохранения больших таблиц в Excel - патч от ромикса уже закрывает эту дырку.
Исходной проблемы не решает - Йоксель не сохраняет в формате xlsx и ограничен 65536 строками.
Но в целом, изящно - буду теперь делать такой перехват, вместо вывода "Сохранить через Yoksel" в отдельный пункт меню, как у меня было раньше.
Правда без постобработки КонвертеромExcel у меня полученный файл в Excel 201Х не открывается- кракозябничает. Так что сначала записываю в mxl, а потом так (кусок обработки с сайта Йокселя, насколько я помню):
Конвертер = СоздатьОбъект ("КонвертерExcel");
Книга = Конвертер.Создать ();
Начало = 1;
Пока КоличествоСтрок > 0 Цикл
Документ = СоздатьОбъект ("ТабличныйДокумент");
Документ.Открыть (ИмяВременногоФайла);
Если Начало = 0 Тогда
Документ.УдалитьСтроки (1, 65536);//без ограничения
Документ.Записать (ИмяВременногоФайла);
Иначе
Начало = 0;
КонецЕсли;
Книга.Листы.Добавить (ИмяЛиста + НомерЛиста, Документ);
КоличествоСтрокВДокументе = Документ.ВысотаТаблицы ();
ЗаписаноСтрок = Мин (65536, КоличествоСтрокВДокументе);
КоличествоСтрок = КоличествоСтрок - Мин (КоличествоСтрок, ЗаписаноСтрок); // на всякий случай
НомерЛиста = НомерЛиста + 1;
КонецЦикла;
Книга.ПараметрыКонвертера.ЧислаВыравненыПоПравомуКраю = 1;
Книга.ПараметрыКонвертера.РаспознаватьЧисловыеЗначения = 1;
Книга.Записать (ВыбИмяФайла);
Тут большая таблица бьётся на листы по 65536 строк - потом можно будет пересобрать уже exceleм
Цитата: Харлампий Дымба от 15 июня 2026, 23:54Ну это, как я понимаю, чтобы избежать ошибки сохранения больших таблиц в Excel - патч от ромикса уже закрывает эту дырку.
Это разные форматы файлов. 1С сохраняет в формат 95 года, а Йоксель в формат 97 года. В раннем формате длина строк ячеек была ограничена 255 символами. Ну и ограничение количества строк в 16384
А мы решали проблему выгрузкой через базу v8
Функция СохранитьБольшойMXL(ПутьКФайлу) Экспорт
Перем ТабДок;
Если Инициализация82()=-1 Тогда
Возврат -1;
КонецЕсли;
ТабДок = V8Object.NewObject("ТабличныйДокумент");
ФайлЭксел = Лев(СК(ПутьКФайлу), СтрДлина(СК(ПутьКФайлу))-4);
ФайлЭксел=ФайлЭксел+".xls";
Если (Отладка=1)Или(ЭтоАвтомат=1) Тогда Сообщить("Сохраняю большую таблицу в "+ФайлЭксел); КонецЕсли;
Попытка
ТабДок.Прочитать(ПутьКФайлу);
ТабДок.Записать(ФайлЭксел,"xlsx");
ТабДок = 0;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
V8Object = "";
Возврат ФайлЭксел;
КонецФункции
Она вызвается так
Если (Табл2.ВысотаТаблицы()<65535)И(ЭкспортЧерезV8=0) Тогда
Табл2.Записать(Путь1,1); // стандартное 1С-ное сохранение
ПутьИт=Строка(Путь1)+".xls";
Иначе
СообщитьвФайл("Сохраняем большой MXL через V8 т.к. строк в файле "+Табл2.ВысотаТаблицы()+", ЭкспортЧерезV8="+ЭкспортЧерезV8,ИмяФайла);
Табл2.Записать(Путь1,0);
ПутьИт=СохранитьБольшойMXL(Путь1+".mxl"); //Иногда может слететь лицензия на V8 и не будет тогда записывать.
Цитата: alyuev от 16 июня 2026, 14:40А мы решали проблему выгрузкой через базу v8
Наверное, самый разумный способ (если есть v8) - так не будет и потерь данных в ячейке (mxl -> xls режет до 255 символов).
Цитата: Ветер в поле от 16 июня 2026, 11:22Ну и ограничение количества строк в 16384
Не, 65536 строк 1с штатно сохраняет спокойно в формате xls. Может, конечно, это какой-то из установленных докторов лечит вместе с фиксом ошибки сохранения. Видимо это имелись в виду столбцы, а не строки.
у завалах у меня лежит экзешник xls2xlsx.exe
Писал Кирпич с Мисты
Выгружаем из 1С в EXCEL с помощью ADO. Часть II
https://www.obrabotki.com/1s-excel-ado-2/
СтрокаПодключения = "
|Provider=Microsoft.Jet.OLEDB.4.0;
|Data Source="+ИмяФайлаЭксельНовый+";
|Extended Properties=""Excel 8.0;HDR=YES"";";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаПодключения;
Connection.Open();
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "CREATE TABLE [МояТаблица]
|(Символьный char(255), Дата date, Целый int, Дробный float)";
Command.Execute();
Command.CommandText = "INSERT INTO [МояТаблица]
|(Символьный, Дата, Целый, Дробный)
|values ('АБВГДЕЁ', '12/4/1955', '1234567', '12345,6789')";
Command.Execute();
Command = Неопределено;
Connection.Close();
Из своего опыта
Функция ПолучитьКоннектExcel(пИмяФайла)
лРез = СоздатьОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + пИмяФайла + "; Extended Properties=""Excel $ver$.0 ;HDR=NO;IMEX=1"";";
СтрокаПодключения12 = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + пИмяФайла + "; Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1"";";
СтрокаПодключенияACE= "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + пИмяФайла + "; Extended Properties=""Excel 12.0 ;HDR=NO;IMEX=1;""";
Попытка
лРез.Open(СтрокаПодключения12);
Возврат лРез;
Исключение
ОписаниеОш = ОписаниеОшибки();
Сообщить(ОписаниеОш);
КонецПопытки;
Попытка
лРез.Open(СтрокаПодключенияACE);
Возврат лРез;
Исключение
ОписаниеОш = ОписаниеОшибки();
Сообщить(ОписаниеОш);
КонецПопытки;
Для Версия = 8 По 15 Цикл
//подключение к источнику данных
ТекСтрокаПодключения = СтрЗаменить(СтрокаПодключения, "$ver$", Строка(Версия));
Попытка
лРез.Open(ТекСтрокаПодключения);
Возврат лРез;
Исключение
ОписаниеОш = ОписаниеОшибки();
Сообщить(ОписаниеОш);
КонецПопытки;
КонецЦикла;
КонецФункции