|
|
|
v7: Сохранение в .xlsx ↓Ø (Волшебник 18.11.2025 00:01) | ☑ | ||
|---|---|---|---|---|
|
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 доки отсылаю* :-) *(не рассказывайте мне про ЭДО, знаю, но у себя не испльзую - не те масштабы) |
|||
|
19
MadDAD
05.11.25
✎
15:35
|
(18) Думал уже никто и не использует :)
|
|||
|
20
MWWRuza
гуру
05.11.25
✎
16:08
|
(19) Не... Я использую, регулярно, и всем советую, кто еще с клюшками работает :-)
Спасибо! |
|||
|
21
Злопчинский
05.11.25
✎
22:41
|
(18) Интересно, в PDF как рисунок сохраняет (как йоксель) или нормально?
|
|||
|
22
MadDAD
05.11.25
✎
22:44
|
(21) как текст.
|
|||
|
23
MadDAD
05.11.25
✎
22:45
|
Сначала форматирует в html а потом в pdf. Из-за того что не картинка бывают неточности.
|
|||
|
24
MadDAD
05.11.25
✎
22:53
|
(14) а мог бы и позолотить ручку :) надо собранные бинари выкладывать на ИС :)
|
|||
|
25
MadDAD
14.11.25
✎
20:25
|
Компонента обновлена
* Исправлено уползание картинок в html/pdf * Чуть уточнен авторасчет высоты строки в htm/pdf Кто на каких ОС использует? В будущем планирую отказаться от wkhtmltopdf в пользу виндового webView для сохранения pdf. А значит минимальная операционка будет win10 |
|||
|
26
Волшебник
14.11.25
✎
20:29
|
(25) Хотите лэндинг-пейдж на мисте? Стукнитесь в Телеграм @staswiz
Это бесплатно |
|||
|
27
MadDAD
14.11.25
✎
20:41
|
(26) Я обновляю бесплатную компоненту в лучшем случае раз в год, да и в скором времени она скорее всего станет не актуальна, т.к. клюшки отомрут. Пока что не нужно. Может в будущем под что-то другое.
|
|||
|
28
Волшебник
14.11.25
✎
20:48
|
(27) Не торопитесь отказываться. Раз в год для мисты это вполне регулярно. Форуму уже 23 года.
Подготовьте ветку, дайте ссылки на свой сайт. Это же будет для Вас бесплатно. Вы ничего не теряете, а только приобретаете |
|||
|
29
Garykom
гуру
14.11.25
✎
20:52
|
Может вместо ВК сделать все же утилиту командной строки?
Для конвертации MXL в разные форматы Будет намного универсальней и более востребованно Особенно если добавить туда не только mxl->xls|xlsx или mxl->pdf Но и xls|xlxs->pdf или банальный xls<->xlsx А еще про html не забыть, часто требуется |
|||
|
30
MadDAD
15.11.25
✎
11:44
|
(29) это неплохой вариант, делается просто. Тогда нужно будет добавить поддержку мокселя v8.
А разве "работа с файлами" так не умеет? |
|||
|
31
MadDAD
15.11.25
✎
11:45
|
(28) спасибо:) наверное так и сделаю.
|
|||
|
32
MWWRuza
гуру
15.11.25
✎
12:33
|
(25) Кто на каких ОС использует?
У меня лично Win7 32бита... Да, понимаю, что устаревшая система, да еще и 32 бита... Но, так сложилось. У клиентов - зоопарк, от такой-же, до Win-11 разных разрядностей. (25) А значит минимальная операционка будет win10 Ну, ничего страшного, текущая версия то будет работать, и ладно. Меня более чем устраивает. |
|||
|
33
MadDAD
16.11.25
✎
11:46
|
(32) можно оставить как есть
|
|||
|
34
Кирпич
16.11.25
✎
20:42
|
(30) работа с файлами из командной строки ничего не делает. Делал когда то утилитку mxl->xlsx для v8. Но я только данные выдирал, без форматирования. Помню, был гемор с форматом mxl V8. Форматов v8 оказывается несколько.
|
|||
|
35
Vovik
16.11.25
✎
22:03
|
(2) Кстати да. Напомнил мне это:
https://infostart.ru/1c/tools/155192/ |
|||
|
36
MadDAD
17.11.25
✎
11:41
|
(34) В текущем состоянии можно собрать проект TaskRunnner из репы на гитхабе и он выполняет именно то что нужно. На входе - моксель, имя файла для экспорта и количество потоков для конвертации.
Но тут нюанс - моксель не содержит параметры печати страницы, поэтому там все поля и прочее по дефолту. Из плюсов - его можно собрать в X64 и забыть про ограничения по памяти для 1С при сохранении. Либу для pdf только тоже нужно взять x64 |
|||
|
37
MadDAD
17.11.25
✎
19:14
|
(34) Наработками по формату mxl для v8 не поделитесь?
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |