Последние сообщения

#1
7.7 / Re: Сохранить mxl в Excel
Последний ответ от leov-001 - Вчера в 11:23
Выгружаем из 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(ТекСтрокаПодключения);
            Возврат лРез;
        Исключение
            ОписаниеОш = ОписаниеОшибки();
			Сообщить(ОписаниеОш);
        КонецПопытки;
	КонецЦикла;
КонецФункции
#2
7.7 / Re: Определить актуальность ТА...
Последний ответ от Злоп - 17 июня 2026, 19:59
Цитата: Ветер в поле от 09 июня 2026, 18:11Красивое решение! Пожалуй на нем стоит и остановиться.

Внедрил в "продакшен"
#3
7.7 / Re: Сохранить mxl в Excel
Последний ответ от Злоп - 17 июня 2026, 00:58
у завалах у меня лежит экзешник xls2xlsx.exe
Писал Кирпич с Мисты
#4
7.7 / Re: Обсуждение накопленного
Последний ответ от Харлампий Дымба - 16 июня 2026, 23:30
Битый час пытался воткнуть, что сломалось в Отладчике - оказалось багофича 1с:
Отладчик не видит локальные переменные глобального модуля в глобальных процедурах и функциях, вызванных из других мест.
При попытке вычислить выражение даёт ошибку типа:
"ЛокальнаяПеременнаяГлобальногоМодуля = Ошибка в выражении!"
При этом всё нормально работает, переменная имеет значение. Но вот Отладчик её отказывается показывать.

Чтоб было понятнее - глобальный модуль такой:
Перем ЛокальнаяПеременнаяГлобальногоМодуля;
Процедура Проверка() Экспорт
    ЛокальнаяПеременнаяГлобальногоМодуля = 1;
КонецПроцедуры
ЛокальнаяПеременнаяГлобальногоМодуля = 0;

Вызов из обработки такой:
Процедура Сформировать()
    Проверка()
КонецПроцедуры

Похожая фишка, насколько помню, есть и объекта "Запрос", но вот на такой каприз Отладчика до сего дня не натыкался.


#5
7.7 / Re: Отчетность в 7.7 1кв
Последний ответ от Харлампий Дымба - 16 июня 2026, 22:27
ФНС утвердил новый формат выгрузки бухгалтерской отчетности - всех изменений что я увидел - поменяли ВерсФорм с 5.10 на 5.11 и увеличили во всех пояснениях размерность строки с 4 до 10 символов. Т.е. никаких особых доработок не потребуется.
#6
7.7 / Re: Сохранить mxl в Excel
Последний ответ от Харлампий Дымба - 16 июня 2026, 22:04
Цитата: alyuev от 16 июня 2026, 14:40А мы решали проблему выгрузкой через базу v8
Наверное, самый разумный способ (если есть v8) - так не будет и потерь данных в ячейке (mxl -> xls режет до 255 символов).

Цитата: Ветер в поле от 16 июня 2026, 11:22Ну и ограничение количества строк в 16384
Не, 65536 строк 1с штатно сохраняет спокойно в формате xls. Может, конечно, это какой-то из установленных докторов лечит вместе с фиксом ошибки сохранения. Видимо это имелись в виду столбцы, а не строки.


#7
7.7 / Re: Сохранить mxl в Excel
Последний ответ от alyuev - 16 июня 2026, 14:40
А мы решали проблему выгрузкой через базу 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 и не будет тогда записывать.
#8
7.7 / Re: Сохранить mxl в Excel
Последний ответ от Ветер в поле - 16 июня 2026, 11:22
Цитата: Харлампий Дымба от 15 июня 2026, 23:54Ну это, как я понимаю, чтобы избежать ошибки сохранения больших таблиц в Excel - патч от ромикса уже закрывает эту дырку.

Это разные форматы файлов. 1С сохраняет в формат 95 года, а Йоксель в формат 97 года. В раннем формате длина строк ячеек была ограничена 255 символами. Ну и ограничение количества строк в 16384
#9
7.7 / Re: Сохранить mxl в Excel
Последний ответ от Харлампий Дымба - 15 июня 2026, 23:54
Цитата: АЛьФ от 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м
#10
7.7 / Re: Форам.ПолучитьАтрибут("Тут...
Последний ответ от Злоп - 15 июня 2026, 23:41
Ну, с вк и я могу.
Без вк - пришлось сделать и чтение и присвоение через Шаблон