Имя: Пароль:
1C
1C 7.7
v7: Сохранение в .xlsx
0 vladko
 
27.10.25
14:52
Привет всем. До сих пор поддерживаю самописную конфигурацию на 7.7. Для сохранения больших отчетов используется инструмент сохранения в таблицы XLS от Che Burashka. А есть ли решение, чтобы сохранять сразу в XLSX?
1 Злопчинский
 
27.10.25
15:04
есть, поройся там на ИС
что-то типа "в эксель одной строкой"
.
и то, что ты упомянул в (0) - ему сто лет в обед (но все равно спасибо что юзаешь ее ;-)
можно перехватить "при сохранении" и сохранять через табличный документ йокселя
2 maxab72
 
27.10.25
15:00
можно через excel. соединиться ним по com.
3 Злопчинский
 
27.10.25
15:05
https://infostart.ru/1c/tools/1026032/
Внешняя компонента, умеет сохранять таблицы в формате xlsx, html и PDF. При загрузке перехватывает штатное интерактивное и программное сохранение в Excel, HTML и TXT. В диалоге выбора файла заменяет вариант выбора ".xls" на ".xlsx" и ".txt" на "PDF"
4 Злопчинский
 
27.10.25
15:06
сохраняй в xls, а расширение делай xlsx
$-) для тех кто обрабатывает эксель интерактивно - разницы не будет ;-)
5 vladko
 
27.10.25
15:10
(2) как вариант - надо обдумать :)
6 Злопчинский
 
27.10.25
15:10
тут еще вякого полезного/неочевидного по мелочи
https://forum.dorex.pro/index.php?topic=191.0
7 vladko
 
27.10.25
15:11
(3) - хорошее решение, надо будет присмотреться и скорее всего приобрести
8 vladko
 
27.10.25
15:15
Спасибо за помощь!
9 Sserj
 
27.10.25
15:17
(7) Приобрести конечно полезно. Но там же в истории изменений последним пунктом сказано. Так как не пользуется популярностью забирайте все как есть:
https://github.com/DmitryDreytser/v7Moxel
10 vladko
 
27.10.25
15:42
(9) Премного благодарен!
11 Garykom
 
гуру
27.10.25
15:55
12 vladko
 
27.10.25
16:34
Скачал исходники по ссылке из (9).
При попытке запустить register.cmd пишет, что нет в папке v7Moxel.dll :(
Кто-нибудь можете прислать эту ДЛЛку на
73z2bpwehynq@mail.ru ?
13 Bigbro
 
27.10.25
16:34
я большие отчеты сохранял в mxl а потом файл конвертором переводил в xlsx
намного быстрее получалось чем xls выгружать.
14 Sserj
 
27.10.25
16:45
(12) Это же гитхаб, там есть ссылка Releases.
качаешь последний релиз Release.v0.12.zip, там в архиве все есть.
https://github.com/DmitryDreytser/v7Moxel/releases
15 craxx
 
27.10.25
17:40
(0) Лет этак 12 назад пользовался Йокселем.
После в 7.7 не работал.
https://forum.infostart.ru/forum28/topic182580/
16 vladko
 
27.10.25
18:26
(14) Спасибо. Буду знать :)
17 MWWRuza
 
гуру
28.10.25
23:08
У меня, как-то так:
Процедуры/Функции в глобальном модуле
 
// В начале ГМ:
// 07.04,2025 Для сохранения больших таблиц в Exel-2007
Перем ConnectionXLSX		Экспорт; 
Перем CommandXLSX			Экспорт;

// Можно в конце:
// *************************ФункцииДляСокраненияВ_EXEL-2007****************

Функция ПодготовитьСтрокуКПечати(лСтрока)
	лРез = СокрЛП(лСтрока);
	лРез = СтрЗаменить(лРез,"'","");
	Возврат лРез;
КонецФункции

Функция ЭксельADO_Подключиться(лПутьКФайлу, ЧитЗаг = 0) Экспорт
	Если ЧитЗаг = 0 Тогда
		СтрокаПодключения 			= "
		|Provider=Microsoft.ACE.OLEDB.12.0; 
		|Data Source='" + лПутьКФайлу + "'; 
		|Extended Properties=""Excel 12.0 xml; HDR=YES"";";				   
	Иначе	
		СтрокаПодключения 			= "
		|Provider=Microsoft.ACE.OLEDB.12.0; 
		|Data Source='" + лПутьКФайлу + "'; 
		|Extended Properties=""Excel 12.0 xml; HDR=NO"";";		
	КонецЕсли;
	Попытка
		// Создаем соединение
		ConnectionXLSX			= СоздатьОбъект("ADODB.Connection");
		ConnectionXLSX.Open(СтрокаПодключения);
		CommandXLSX 			= СоздатьОбъект("ADODB.Command");
		CommandXLSX.ActiveConnection = ConnectionXLSX;
		CommandXLSX.CommandType = 1;
	Исключение
		Сообщить("Ошибка подключения к файлу Excel: " + ОписаниеОшибки());
		Возврат 0;
	КонецПопытки;
	Возврат 1;	
КонецФункции

Процедура ЭксельADO_Отключиться() Экспорт
	Состояние("Запись файла");
	CommandXLSX		= 0;
	Попытка
		ConnectionXLSX.Close();
	Исключение
	КонецПопытки;
	ConnectionXLSX 	= 0;
КонецПроцедуры

Функция СоздатьТаблицуСКолонками(ТЗ, ИмяЛиста, БезЗаголовков = 0) Экспорт  // Добавлен параметр БезЗаголовков
	СчКол 		= 0; 
	СтрДанных   = ""; 
	Если (ТЗ.КоличествоСтрок() = 0) И (БезЗаголовков = 1) Тогда
		Возврат 0;	
	КонецЕсли;
	Для СчКол = 1 По ТЗ.КоличествоКолонок() Цикл
		Тип		= "";
		Размер	= "";
		Точн	= "";
		Заг		= "";
		ТЗ.ПолучитьПараметрыКолонки(СчКол, Тип, Размер, Точн, Заг);
		Если БезЗаголовков = 1 Тогда	
			Заг	= СокрЛП(ТЗ.ПолучитьЗначение(1, СчКол));
		КонецЕсли;
		Если Тип = "Число" Тогда
			Если ПустоеЗначение(Точн) = 0 Тогда
				Если Точн > 0 Тогда
					ТипКол	= "float";
				Иначе	
					ТипКол	= "int";
				КонецЕсли;
			Иначе
				ТипКол	= "int";
			КонецЕсли;	
		Иначе
			ТипКол = "char(" + Размер + ")";
		КонецЕсли;
		СтрДанных	= СтрДанных + "[" + Заг + "] " + ТипКол + ", ";
	КонецЦикла;
	СтрДанных		= СокрЛП(СтрДанных);
	ДлинаСтрДанных	= СтрДлина(СтрДанных);
	СтрДанных		= Лев(СтрДанных, ДлинаСтрДанных - 1);
	СтрКоманды	= "CREATE TABLE [" + ИмяЛиста + "] (" + СтрДанных + ")";
	CommandXLSX.CommandText = СтрКоманды;
	CommandXLSX.Execute();	
	Возврат 1;
КонецФункции

Процедура ЭксельADO_ПечатьСтрок(ТЗ, ИмяЛиста, БезЗаголовков = 0, ЕстьШабл = 0) Экспорт
	Перем НазваниеКолонки, ШиринаКолонки, ТипПеременной, ДлинаПеременной,ФорматСтроки;
	Если ТЗ.КоличествоСтрок() = 0 Тогда
		Возврат;
	КонецЕсли;
	ВсегоСтрок	= ТЗ.КоличествоСтрок();	
	СчСтр 		= 0;
	СтарПроц	= 0; 
	Состояние("Идет вывод файла Excel, ожидайте...");
	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		СчСтр	= СчСтр + 1;
		Если СчСтр = 1 Тогда
			Если ЕстьШабл = 0 Тогда	
			 	СоздатьТаблицуСКолонками(ТЗ, СокрЛП(ИмяЛиста), БезЗаголовков);
			 	Если БезЗаголовков = 1 Тогда
			 		Продолжить;
			 	КонецЕсли;
		 	КонецЕсли;
		КонецЕсли; 
		ВывСтр	= СчСтр;
		ПроцентВыполнения 	= Окр(ВывСтр / ВсегоСтрок * 100);	
		Если СтарПроц <> ПроцентВыполнения Тогда
			ТекстСостояния 		= Шаблон("Вывод в файл Excel: [ПроцентВыполнения]% ([СчСтр]/[ВсегоСтрок])");	
			Состояние(ТекстСостояния); 
			СтарПроц	= ПроцентВыполнения;
		КонецЕсли;
		лСписокЗначенийКолонок 		= СоздатьОбъект("СписокЗначений");
		лСтрокаПараметров			= "";
		Для НомерКолонки = 1 По ТЗ.КоличествоКолонок() Цикл
			ИдентификаторКолонки 	= ТЗ.ПолучитьПараметрыКолонки(НомерКолонки,ТипПеременной,ДлинаПеременной,,НазваниеКолонки,ШиринаКолонки,ФорматСтроки);
			Если ШиринаКолонки <> -1 Тогда
				ЗначениеЯчейки 		= ТЗ.ПолучитьЗначение(СчСтр,НомерКолонки);
				Если ТипПеременной	= "Число" Тогда
					Если ДлинаПеременной = 1 Тогда					
						лСтрокаПараметров = лСтрокаПараметров + "'" + ?(ЗначениеЯчейки = 0,"ОК", "Ошибка") + "', ";
					Иначе
						ПечЗначение = Формат(ЗначениеЯчейки, ФорматСтроки);
						лСтрокаПараметров = лСтрокаПараметров + ПечЗначение + ", ";
					КонецЕсли;	
				ИначеЕсли ТипПеременной = "Документ" Тогда
					Попытка
						ПечЗначение 	= ЗначениеЯчейки.НомерДок;
					Исключение
						ПечЗначение		= "";
					КонецПопытки;
					лСписокЗначенийКолонок.ДобавитьЗначение();
					лСтрокаПараметров 	= лСтрокаПараметров + "'" + ПодготовитьСтрокуКПечати(ПечЗначение) + "', ";
				ИначеЕсли ТипПеременной	= "Дата" Тогда
					ПечЗначение 		= ?(ПустоеЗначение(ЗначениеЯчейки) = 1, "", Формат(ЗначениеЯчейки,"Д ДДММГГГГ"));
					лСтрокаПараметров 	= лСтрокаПараметров + "'" + ПечЗначение + "', "
				ИначеЕсли ТипПеременной = "Строка" Тогда
					ПечЗначение = СокрЛП(ЗначениеЯчейки);					
					лСтрокаПараметров 	= лСтрокаПараметров + "'" + ПодготовитьСтрокуКПечати(ПечЗначение) + "', ";
				Иначе
					ПечЗначение 		= ЗначениеЯчейки;						
					лСтрокаПараметров 	= лСтрокаПараметров + "'" + ПодготовитьСтрокуКПечати(ПечЗначение) + "', ";
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;	
		лСтрокаПараметров 	= Лев(лСтрокаПараметров, СтрДлина(лСтрокаПараметров) - 2); //убираем последнюю запятую
		CommandXLSX.CommandText = "INSERT INTO [" + ИмяЛиста+ "$] VALUES (" + лСтрокаПараметров + ")";
		CommandXLSX.Execute();
	КонецЦикла;
КонецПроцедуры

Функция Excel2007вТЗ(Файл)	Экспорт
	Рез 						= ЭксельADO_Подключиться(СокрЛП(Файл), 1); // второй параметр - читать заголовки
	Коннект						= ConnectionXLSX;
	axCatalog 					= СоздатьОбъект("ADOX.Catalog");
	axCatalog.ActiveConnection	= ConnectionXLSX;
	ListName					= axCatalog.Tables.Item(0).Name;
	Коннект.CursorLocation 		= 3;  // х.з. за чем, но без этого не верно определяет количество строк на листе...
	ТекстЗапроса 				= "SELECT * FROM [" + ListName + "]";
	RS							= СоздатьОбъект("ADODB.Recordset");
	RS.Open(ТекстЗапроса, Коннект);
	Если (RS.EOF = 1) ИЛИ (RS.BOF = 1) Тогда
		Сообщить("Нет строк в документе Excel!");
		// Закрытие объектов.
		RS.Close();
		ConnectionXLSX.Close();
		RS   			= 0;
		ConnectionXLSX 	= 0;		
	КонецЕсли;
	КолвоКолонокExcel 	= RS.Fields.Count;
	ТЗ 					= СоздатьОбъект("ТаблицаЗначений");
	СчКол				= 0;
	Для СчКол = 1 По КолвоКолонокExcel Цикл
		ИмяКол 			= СокрЛП(RS.Fields.Item(СчКол - 1).value);
		ПозДвоеточия 	= Найти(ИмяКол, ":");
		Если ПозДвоеточия > 0 Тогда
			ИмяКол		= Лев(ИмяКол, ПозДвоеточия - 1);	
		КонецЕсли;
		ИмяКол			= СтрЗаменить(ИмяКол, "-", "");
		ТЗ.НоваяКолонка(ИмяКол);
	КонецЦикла;
	RS.MoveNext();
	КолвоСтрокExcel 	= RS.RecordCount + 1;	
	НомерСтроки = 0;
	Пока RS.EOF() = 0 Цикл
		НомерСтроки	= НомерСтроки + 1;	
		ТЗ.НоваяСтрока();
		СчКол				= 0;
		Для СчКол = 1 По КолвоКолонокExcel Цикл
			ТЗ.УстановитьЗначение(НомерСтроки, СчКол, RS.Fields.Item(СчКол - 1).Value);	
		КонецЦикла;	
		RS.MoveNext();   // СледующаяСтрока.
	КонецЦикла;	
	// Закрытие объектов.
	RS.Close();
	ConnectionXLSX.Close();
	RS   					= 0;
	ConnectionXLSX 			= 0;
	Возврат ТЗ;	
КонецФункции

// Конец********************ФункцииДляСокраненияВ_EXEL-2007****************

Вызываю на сохранение:
        //Делаем заполнение ТЗ на основе полученных данных
        Если ЭксельADO_Подключиться(ИмяФайлаЭксель) = 0 Тогда
            Предупреждение("Ошибка подключения к Excel-файлу!",30);    
            Возврат 0;
        КонецЕсли;
Потом в цикле по ТЗ:
ЭксельADO_ПечатьСтрок(ТЗ, "Данные", Сч);

На чтение:
ТЗ                = Excel2007вТЗ(ОткрФайл);

Да, немного замороченные функции работы через ADO в ГМ... Но, без вских ВК и т.п...
Работает - мгновенно.
И использовать просто.
18 MWWRuza
 
гуру
28.10.25
23:43
Это программно. А Интерактивно, из меню печати - как в (1)...



Но, это у меня больше для PDF используется, типа сразу любую ПФ сохраняю в PDF. Работает, давно и хорошо, и реально - очень удобно. Всем конрагентам своим в PDF доки отсылаю* :-)


*(не рассказывайте мне про ЭДО, знаю, но у себя не испльзую - не те масштабы)