Как программно сохранить табличный документ в excel 1с
Программно сохраняю прайс или отчет в формате XLSX методом табличного документа. Когда открываю файл, у него формат Общий. Это клиентов не устраивает. Поэтому и вопрос: Как сохранить табличный документ с форматом ячеек Тестовый?
v8: Табличный документ. Формат ячеек
(22) и далее
пысы: сам не пробовал
(1) отбой, не то
Похоже, только если формировать печатную форму через Excel.Application и с установкой у ячеек NumberFormat = «@»
(3) Я не хочу запускать Excel. В этом ограничение.
Приведенный пример только с использованием Excel
ВК из соседней ветки?
Сохраняем mxl в Excel 2007
(6) Там немного другое и для 8-ки пока не сделано
(7) Прижми в право или влево не помню
(8) Это не помогает после сохранения в Excel
(10) Не плохо. Осталось только к СКД прикрутить.
У меня прайс формируется в СКД. Как применить это из ссылки (10) ?
Обрабатываю полученный табличный документ кодом
МассивБулево = Новый Массив;
МассивБулево.Добавить(Тип(«Строка»));
ОписаниеТиповСтрока = Новый ОписаниеТипов(МассивБулево);
НомерКолонки=0;
Для а = 1 по Результат.ВысотаТаблицы Цикл
Для б=1 По Результат.ШиринаТаблицы Цикл
ТекстЯчейки=»»+Результат.Область(а,б,а,б).Текст;
Результат.Область(а,б,а,б).СодержитЗначение=Истина;
Результат.Область(а,б,а,б).ТипЗначения=ОписаниеТиповСтрока;
Результат.Область(а,б,а,б).Значение=ТекстЯчейки;
//Результат.Область(а,б,а,б).ФорматРедактирования=»»;
//Результат.Область(а,б,а,б).Формат=»строка»;
КонецЦикла;
КонецЦикла;
Но это не помогает
(12) (13) Одно не исключает другого. Правда, я подобное в шаблон типового отчета для ОФ добавлял(давно это было), там проще получилось. Пример:
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета);
ОбластьЗаголовка = Результат.Области.Найти(«Заголовок»);
ОбластьРезультата = Результат.Область(?(ОбластьЗаголовка <> Неопределено, ОбластьЗаголовка.Низ + 3, 1), 1, Результат.ВысотаТаблицы, Результат.ШиринаТаблицы);
ОбластьРезультата.СодержитЗначение = Истина;
ОбластьРезультата.ТипЗначения = Новый ОписаниеТипов(«Строка»);
В результате сделал через Excel, хотя не хотелось.
Excel = Новый COMОбъект(«Excel.Application»);
Excel.WorkBooks.Open(ИмяФайла);
Excel.Visible = 0;
Excel.ActiveWindow.DisplayWorkbookTabs = 1;
Excel.ActiveWindow.TabRatio = 0.6;
Excel.Cells.Select();
Excel.Selection.NumberFormat = «@»;
//FullName = Excel.ActiveWorkbook.FullName;
Excel.DisplayAlerts = false;
Если Расширение=»XLSX» Тогда
Excel.ActiveWorkbook.SaveAs(ИмяФайла, 51); // 18 — xls 97-2003; 51 — xlsx 2007-2013
Иначе
Excel.ActiveWorkbook.SaveAs(ИмяФайла, 18); // 18 — xls 97-2003; 51 — xlsx 2007-2013
КонецЕсли;
Excel.Application.Quit();// завершаем процесс Excel
Excel = Неопределено;
(15) Это не кошерно. Но (10) и (14) наконец-то дают надежду победить этот косяк Exell
апостроф в начало пробовали добавлять? ‘
(16) Я этим путём проходил. см (13). Но после сохранения табличного документа в Excel формат остаётся Общим. при этом в исходном файле mxl в каждой ячейке прописано значение как текст и свойство ячейки как и задумывалось было:
бластьРезультата.СодержитЗначение = Истина;
ОбластьРезультата.ТипЗначения = Новый ОписаниеТипов(«Строка»);
..
(17) я с этого начинал )
(17) Но не всем клиентам этот апостроф понравился. У них роботы обрабатывают файл и лезут глюки. Пришлось отказаться.
Единственно, что я еще не испытал, это использование макетов в СКД. У меня прайсы формируются через СКД. Потом сохраняются из полученного табличного документа в различные форматы средствами 1С.
(21) тогда, вероятно, если скопировать скдшный вывод в новый табдок, как в (13), то (10) заработает
(22) Пример кода или ссылка есть, как в СКД в макете установить вариант (10) ?
(23) НовыйТабличныйДокумент.Область(а,б,а,б).Текст = «» + Результат.Область(а,б,а,б).Текст
(0) в макете в параметрах ячейки содержит значение = истина, тип значения = строка
(24) (25) Мужики,я ЭТО делал. Попробуйте ПРОГРАММНО сохранить полученный табличный документ в Excel. А потом откройте. И увидите, что там формат Общий, а не Текстовый
(26) наверно только открывать экселькой файл после сохранения и проставлять
(27) От этого я хотел уйти, но пока остановился на этом варианте. При массовом формировании прайсов ожидаю сбоев. Ну, ладно. Посмотрю, что будет на практике.
Попробовал ручками в табличном документе, поставить в ячейке, которая содержит значение 00001,
.СодержитЗначение = Истина;
.Тип = Строка
Потом сохранил в формате Exell и у ячейки получился вполне нормальное значение «00001»
И это радует. Правда не понятно как это сделать в СКД, но хотя бы появился свет в конце туннеля.
(29) задача другая
ТСу (а точнее его заказчикам) нужно (зачем? — хз) чтобы формат ячейки в экселе был не Общий, и Текстовый.
про СодержитЗначение и Тип=Строка я еще в (1) ссылку приводил
(29) Программно в ТабДок это проставить можно и все ОК?
(26) А если программно сразу в Excel писать ?
Текстовый — понятно почему. Если в отчете 1с значение в ячейке табличного документа 0001, то при команде сохранить как Exell значение в ячейке Exell получается 1, с каким то левым форматом типа «00000000». Когда люди делают импорт из Exell, то и получают значение 1 вместо «0001». Это проблема Exell, с которой народ бьется уже лет 10.
Программно в ТабДок ставить можно, но это как-то не кошерно. Хочется в Построителе и в СКД как-то указать для ячейки .СодержитЗначение = Истина не анализируя сам ТабДок
Сохраняйте через Ado,тат тип ячейки можно точно задать.
(33) Свой макет поля должен помочь.
P.S. А еще длинные цифровые коды (типа номеров банковских счетов) превращаются в непотребство типа «1.24Е18». Это к вопросу «зачем».
На самом деле всё проще. В свойствах нужной ячейки в шаблоне поставьте признак «Содержит значение» и тип строка. Тогда при сохранении в Excel, ячейке сразу будет присваиваться тип строка.
(36) Приведи пример кода программной установки в табличный документ при формировании в СКД. Тут уже раза три спрашивал. Сам такого кода не смог родить.
Через использование Excel у меня получилось. Но желание обойтись без него окаянного не прошло.)
Попробовал на своей базе, все прекрасно получилось. В СКД формируется ТабличныйДокумент.
Перед сохранением ТабличногоДокумента в Exell Выполняется код:
ТипСтрока = Новый ОписаниеТипов(«Строка»);
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
ТекТекст = Ячейка.Текст;
Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда
//Первый символ «0» или строка содержит «e» и числа ( для «1.24Е18»)
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = ТипСтрока;
КонецЕСли;
КонецЦикла;
КонецЦикла;
Вполне возможно этот код выполнять просто после формирования ТабличногоДокумента, но до вывода на эеран. Тогда корректно работать
«Сохранить как»
(38) В какую процедуру ты разместил этот код?
Пока перед сохранением файла. У нас кнопочка сделана «Сохранить в Exell» когда сформирован табличныйДокумент
И еще добавил в Рассылку отчетов, опять же перед сохранением во временный файл
(40) У меня формирование идёт в режиме фонового задания. В интерактивном режиме этой проблемы нет. Меня интересует только программное сохранение. Приведенный код не работает на сервере. У меня не работает. Всё что предлагалось — интерактив. Или я не понял?
У меня тоже рассылка идет в Фоновом режиме.
(42) А формирование файла вручную?
У меня платформа 8.3.9. Может быть, из-за этого?
Я правда не проверил еще в Фоновом режиме 🙂 Но мне кажется должно работать. Там такой-же ТабличныйДокумент и команда ТабличныйДокумент.Записать(. )
У меня 8.3.8.2197
Формирование файла происходит так
табличныйДокумент.Записать(..)
Перед этим прохожу по ячейкам Табличного документа и где надо ставлю
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = ТипСтрока;
(45) С кода, который ты привёл, я начинал до сабжа, но у меня при этом формат оставался общим.
Так там хитро, формат остается «общий», но значение не конвертируется в число. Т.е если без преобразования делаешь, то из «0000001» получается формат = «000000000» значение = 1
а с преобразованием получается
формат = «общий» значение = «0000001»
Тоже самое с «1000e10»
без преобразования получается формат «общий» значение 1.00e10
c преобразованием формат «общий» значение «1000e10»
При этом Exell говорит на «0000001» что данная ячейка содержит значение в виде строка, и предлагает изменить его на число
У меня последняя задача была поставлена, чтобы не только значение было строка, но и формат Текстовый. Из-за этого копья ломались )) Через 1С не удалось, поэтому пока работает режим вызова Excel/
Продолжили тестирование, обнаружились некоторые странности. На некоторых артикулах типа «0AA-1BB23456″ не корректно переносилось в Excell, судя по всему в 1С начудили. Пришлось добавить строку в код » Ячейка.Текст = ТекТекст;» и получилось так.
ТипСтрока = Новый ОписаниеТипов(«Строка»);
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
ТекТекст = Ячейка.Текст;
Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда
//Первый символ «0» или строка содержит «e» и числа ( для «1.24Е18»)
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = ТипСтрока;
Ячейка.Текст = ТекТекст;
КонецЕСли;
КонецЦикла;
КонецЦикла;
И это работает нормально, для нашего полного набора артикулов автозапчастей (где-то в районе 100 тыс шт)
Для себя мы эту тему закрыли.
Как в 1С сохранить табличный документ в excel

Сохранить документ 1С в формате excel можно, если он имеет печатную форму. Сначала нужно вывести печатную форму на экран, нажав на кнопку Печать:

Далее надо нажать на кнопку с дискеткой:

Выбрать папку на компьютере, куда нужно сохранить файл. А также нужный формат файла. Нажать на кнопку Сохранить:

Таким же образом можно сохранять отчеты (например, ОСВ):

В таком случае кнопка с дискетой будет находиться в правом верхнем углу:

Нужно будет заполнить имя файла, а также выбрать нужный формат в следующей форме:

Сохранять в формате Excel можно также списки документов. Для этого любой список надо вывести на экране в табличный документ:

При этом можно отметить галками нужные колонки:

Далее сохранить в нужном формате, нажав на кнопку с дискетой в правом верхнем углу (также, как отчет):
Запись в файл Excel из табличного документа
Если провести опрос среди программистов 1С на тему «Как сохранить информацию из 1С в файл ексель», то большинство голосов, как мне кажется займет вариант с созданием объекта Excel.Application с последующим заполнением листа с помощью методов и свойств встроенного в Excel языка VBA. Но многие ли из вас помнят вышеупомянутые методы и свойства? А ведь между тем есть способ который позволяет сделать это гораздо проще, только с использованием языка программирования 1С.
Для этого достаточно сформировать ТабличныйДокумент (сделать это можно как с использованием макета табличного документа, так и программно), а потом просто записать его с помощью метода Записать() сразу в файл Excel, благо платформа без проблем позволяет это сделать. Напомню, что синтаксис этого метода выглядит следующим образом
Записать(ИмяФайла, ТипФайлаТаблицы)
ИмяФайла — строка в которой указан путь к файлу;
ТипФайлаТаблицы — тип файла в который мы будем записывать табличный документ.
Платформа 1С предоставляет следующие типы файлов:
- ANSITXT (ANSITXT)
- DOCX (DOCX)
- HTML (HTML)
- HTML3 (HTML3)
- HTML4 (HTML4)
- HTML5 (HTML5)
- MXL (MXL)
- MXL7 (MXL7)
- ODS (ODS)
- PDF (PDF)
- TXT (TXT)
- XLS (XLS)
- XLS95 (XLS95)
- XLS97 (XLS97)
- XLSX (XLSX)
Пример использования
В качестве примера создадим процедуру в которую в качестве параметра будет передаваться таблица значений, которую будем выводить в табличный документ, который в свою очередь будем сохранять в ексель.
Вот код этой процедуры
НомерСтроки ТабДок В общем то все элементарно. Пусть у нас есть вот такая таблица значений:
| Товар | Количество |
|---|---|
| Яблоки | 5 |
| Груши | 10 |

После того как прогнал ее через процедуру выше, получил вот такой результат в ексель
Достоинства метода
- Простота. Не требуется знаний VBA. Доступны синтаксический контроль и отладка кода в процессе написания.
- Не требуется наличия установленного Excel.
Недостатки метода
- Если макет достаточно сложный, есть вероятность, что он может сохраниться недостаточно корректно. Плюс могут возникать проблемы с форматом данных.
2 комментария на «“Запись в файл Excel из табличного документа”»
Всё бы ничего, да только через табличный документ нельзя сохранить формулы. А если они были в файле раньше, то после записи через табличный документ все пропадут.
Нефиговый недостаток)
Если макет достаточно сложный, есть вероятность, что он может сохраниться недостаточно корректно —
вот именно. Не сохраняется элементарное разделение табличного документа на страницы…уже все перепробовала, и .ВывестиГоризонтальныйРазделительСтраниц, и Таблица — настройки печати — вставить разрыв страницы, и указание в макете начала и конца страницы — ничего не помогает.
Программная запись в Excel данных и изображений
Из этой записи Вы узнаете 2 самых распространенных способа выгрузки данных в Excel. Мы рассмотрим эффективность и ограничения каждого метода, разберем нюансы записи, затронем некоторые моменты клиент-серверного взаимодействия.
- Выгрузка через Табличный документ
- Выгрузка через Excel
- Итоги
Для анализа способов записи мы создали обработку , которая записывает файл Excel в двух вариантах. Форма обработки показана ниже:

Обработка выполняет запись 3 строк, в каждой строке 5 значений и одна картинка. Код обработки может выполняться как на клиенте, так и на сервере.

Вы можете скачать обработку и ознакомиться с ее работой по ссылке:
Скачать “TNSoft.ru Примеры записи в Excel.epf”
Выгрузка через Табличный документ
Это один из самых простых способов записи в xlsx и xls. В 1С в этом варианте Вы будете работать с объектом ТабличныйДокумент. Ниже показан пример записи в табличный документ, который Вы также можете найти в прилагаемой выше обработке:
&НаКлиенте Процедура ВыполнитьЗаписьЧерезТабличныйДокумент() ТабДок = Новый ТабличныйДокумент; Для СтрокаНомер = 1 По 3 Цикл //Записываем значения строки Для КолонкаНомер = 1 По 5 Цикл Область = ТабДок.Область(СтрокаНомер, КолонкаНомер); Область.Текст = СтрокаНомер * КолонкаНомер; КонецЦикла; //Записываем изображение Область = ТабДок.Область(СтрокаНомер, 6); Область.Картинка = Элементы["Изображение" + СтрокаНомер].Картинка; КонецЦикла; ТипФайла = ТипФайлаТабличногоДокумента.XLSX; //Если запись в формате xls - тип файла ТипФайлаТабличногоДокумента.XLS97 ТабДок.Записать(Каталог + "\Тест.xlsx", ТипФайла); КонецПроцедуры
Плюсы данного метода записи:
- Не нужно устанавливать Excel на клиенте/сервере.
- Не нужно реализовывать масштабирование изображений — Вы устанавливаете только ширину/высоту ячейки.
- Высокая скорость записи т.к. не используется прослойка в виде COMОбъекта.
Минусы:
- Нет возможности устанавливать формулы для ячеек.
- Неконтролируемая конвертация табличного документа в документ Excel. Как пример — могут смещаться изображения.
Замер производительности показывает общее время записи 0,28 сек.

Выгрузка через Excel
В этом варианте запись выполняется с помощью COMОбъекта Excel — устанавливаем соединение с Excel, создаем книгу и размещаем данные на ее листах. Обязательно закрываем книгу и соединение!
&НаКлиенте Процедура ВыполнитьЗаписьЧерезExcel() Эксель = Новый COMОбъект("Excel.Application"); Эксель.DisplayAlerts = 0; Эксель.ScreenUpdating = 0; Эксель.EnableEvents = 0; Книга = Эксель.WorkBooks.Add(); Лист = Книга.WorkSheets(1); Для СтрокаНомер = 1 По 3 Цикл //Записываем значения строки Для КолонкаНомер = 1 По 5 Цикл Лист.Cells(СтрокаНомер, КолонкаНомер).Value = СтрокаНомер * КолонкаНомер; КонецЦикла; //Записываем изображение СтрокаКартинка = Элементы["Изображение" + СтрокаНомер].Картинка; ВременныйФайл = ПолучитьИмяВременногоФайла("" + СтрокаКартинка.Формат()); СтрокаКартинка.Записать(ВременныйФайл); ЛистИзображение = Лист.Shapes.AddPicture(ВременныйФайл, Ложь, Истина, Лист.Cells(СтрокаНомер, 6).Left + 1, Лист.Cells(СтрокаНомер, 6).Top + 1, -1, -1); ЛистИзображение.Placement = 1; ЛистИзображение.LockAspectRatio = 0; //Масштабирование изображения ЛистИзображение.Width = 47; ЛистИзображение.Height = 29; Лист.Rows(СтрокаНомер).RowHeight = 33; ЛистИзображение.Height = 29; УдалитьФайлы(ВременныйФайл); КонецЦикла; ТипФайла = 51; //Если запись в формате xls - тип файла -4143 Книга.SaveAs(Каталог + "\Тест.xlsx", ТипФайла); Попытка Книга.Close(Ложь); Эксель.DisplayAlerts = 1; Эксель.Quit(); Исключение Информация = ИнформацияОбОшибке(); Сообщить(Информация.Описание); КонецПопытки; КонецПроцедуры