Выгрузка из 1С в Excel: от кнопки «Сохранить» до COM и внешней обработки
Содержание
Чтобы импортировать данные из 1С в Excel, откройте отчёт или печатную форму, нажмите кнопку с дискетой (или главное меню ☰ → Файл → Сохранить как) и выберите тип файла «Лист Microsoft Excel 2007-…» (*.xlsx). Для любого списка документов или справочника сначала выполните Ещё → Вывести список…, а затем сохраните полученную таблицу тем же способом.
Для разовой задачи ручного сохранения достаточно. Программная выгрузка нужна, когда одну и ту же таблицу просят каждый день, когда данных больше, чем помещается в отчёт, или когда Excel должен сам забирать цифры из базы. Способы различаются тем, кто запускает выгрузку и что попадает в файл:
| Способ | Когда выбирать | Нужен программист | Ограничения |
|---|---|---|---|
| Сохранить отчёт или форму | разовая выгрузка готового отчёта | нет | только то, что показал отчёт |
Вывести список | реестр документов, справочник | нет | только колонки списка |
| Табличный документ в коде | регулярная выгрузка своего формата | да | нужна обработка |
| COM (Excel ↔ 1С) | Excel-модель, которая тянет данные из базы | да | только Windows, Excel на машине |
| CSV / XML | передача в другую программу, большие объёмы | да | без оформления |
1. Сохраняем отчёт или печатную форму в Excel
Любой отчёт в 1С 8.3 строится в виде табличного документа. Платформа умеет записывать его в формат Excel без сторонних программ — Excel на компьютере для этого даже не нужен.
Отчёт
- Сформируйте отчёт с нужным периодом и отборами — например,
Отчёты → Оборотно-сальдовая ведомостьв Бухгалтерии 3.0. - Щёлкните по самому отчёту, чтобы фокус был на таблице, а не на шапке с настройками.
- Нажмите кнопку с дискетой в панели отчёта. Если её не видно — откройте главное меню
☰ → Файл → Сохранить как. - В поле «Тип файла» выберите
Лист Microsoft Excel 2007-… (*.xlsx). - Укажите имя файла и папку, нажмите «Сохранить».
Формат *.xls (Excel 97) тоже есть в списке, но берите его только для очень старых программ. В нём предел — 65 536 строк, в xlsx — 1 048 576.
Печатная форма
Счёт, накладная, акт открываются в окне печати. В его командной панели тоже есть кнопка с дискетой: она предлагает список форматов, отмечаете галочкой xlsx и указываете папку. Если выделить несколько документов в списке и нажать «Печать», в один заход сохранятся все формы.
Кусок отчёта через буфер обмена
Нужны три строки, а не весь отчёт? Выделите ячейки мышью, нажмите Ctrl+C, перейдите в Excel и вставьте Ctrl+V. Формат ячеек частично перенесётся. Для чистых значений в Excel используйте «Специальная вставка → Значения».
Перед сохранением отчёта для анализа отключите в настройках группировки и промежуточные итоги. Плоская таблица без итоговых строк сразу годится для сводной таблицы и фильтров Excel.
2. Выгрузка списка документов и справочников в Excel
Список документов — это не отчёт, кнопки сохранения в нём нет. Зато есть команда, которая превращает любой список в табличный документ.
- Откройте нужный список: например,
Продажи → Реализация (акты, накладные, УПД)или справочникНоменклатура. - Установите отбор и сортировку, если нужна не вся база.
- Выполните
Ещё → Вывести список…. - В окне снимите галочки с лишних колонок, выберите вывод «Табличный документ» и нажмите «ОК».
- Сохраните полученную таблицу в
xlsx, как в разделе выше.
Колонок в выгрузке будет столько, сколько видно в списке. Если не хватает, например, ИНН контрагента или артикула, добавьте поле командой Ещё → Изменить форму… и повторите вывод.
Для справочника с иерархией (группы номенклатуры) переключите список в режим «Список» вместо «Дерево» — иначе выгрузятся только элементы текущей группы.
3. Как выгрузить данные из 1С в Excel программно через табличный документ
Когда выгрузку нужно повторять, проще один раз написать обработку. Основа та же — объект ТабличныйДокумент и его метод Записать. Шаблон оформления (шапка, ширина колонок, жирный шрифт) кладут в макет обработки, а данные выводят по строкам.
Пример без макета: таблица значений из запроса пишется в файл xlsx на сервере.
&НаСервере
Функция ВыгрузитьВExcelНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ЭтоГруппа";
Таблица = Запрос.Выполнить().Выгрузить();
ТабДок = Новый ТабличныйДокумент;
// Шапка
Для НомерКолонки = 1 По Таблица.Колонки.Количество() Цикл
ТабДок.Область(1, НомерКолонки).Текст = Таблица.Колонки[НомерКолонки - 1].Имя;
КонецЦикла;
// Данные
НомерСтроки = 1;
Для Каждого СтрокаТаблицы Из Таблица Цикл
НомерСтроки = НомерСтроки + 1;
Для НомерКолонки = 1 По Таблица.Колонки.Количество() Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст = СтрокаТаблицы[НомерКолонки - 1];
КонецЦикла;
КонецЦикла;
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункции
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Адрес = ВыгрузитьВExcelНаСервере();
ПолучитьФайл(Адрес, "Контрагенты.xlsx", Истина);
КонецПроцедуры
Почему файл сначала пишется на сервере, а потом передаётся: в клиент-серверной базе сервер 1С не видит диск пользователя. Временное хранилище и ПолучитьФайл доставляют файл в браузер или тонкий клиент.
Где ИНН может начинаться с нуля, присваивайте ячейке строку, а не число — тогда Excel не обрежет ноль. В примере ИНН и так строка, поэтому проблемы нет.
Шаблон с оформлением
Чтобы не задавать шрифты в коде, добавьте в обработку макет типа «Табличный документ». Нарисуйте в нём область «Шапка» и область «Строка» с параметрами [Наименование], [ИНН]. В коде получайте область Макет.ПолучитьОбласть("Строка"), заполняйте Область.Параметры и выводите ТабДок.Вывести(Область). Ширина колонок, рамки и форматы чисел из макета перейдут в Excel.
4. Выгрузка через COM-соединение: два направления
COM работает только в Windows и в двух вариантах. Не путайте их.
1С управляет Excel
1С запускает Excel как объект и заполняет ячейки напрямую. Это нужно, когда файл должен содержать то, чего не умеет табличный документ: формулы, несколько листов, готовую сводную таблицу в шаблоне клиента.
&НаКлиенте
Процедура ЗаполнитьExcel()
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
Лист.Cells(1, 1).Value = "Сумма";
Лист.Cells(2, 1).Value = 1500;
Лист.Cells(3, 1).Value = 2500;
Лист.Cells(4, 1).Formula = "=SUM(A2:A3)";
Книга.SaveAs("C:\Выгрузка\Итог.xlsx");
Excel.Quit();
КонецПроцедуры
Минусы: на машине должен стоять Excel, а запись по одной ячейке медленная — тысячи строк заполняются минутами. Не запускайте такой код на сервере 1С: офисные приложения не рассчитаны на работу без пользователя и зависают процессами EXCEL.EXE.
Excel забирает данные из 1С
Обратная схема: макрос VBA в Excel подключается к базе через V83.COMConnector и сам читает данные. Так строят управленческие модели, которые обновляются кнопкой.
Sub ЗагрузитьИз1С()
Dim Коннектор As Object, База As Object
Set Коннектор = CreateObject("V83.COMConnector")
Set База = Коннектор.Connect("File=""C:\Bases\Buh"";Usr=""Выгрузка"";Pwd=""пароль"";")
Dim Запрос As Object, Выборка As Object, i As Long
Set Запрос = База.NewObject("Запрос")
Запрос.Текст = "ВЫБРАТЬ Наименование, ИНН ИЗ Справочник.Контрагенты ГДЕ НЕ ЭтоГруппа"
Set Выборка = Запрос.Выполнить().Выбрать()
i = 1
Do While Выборка.Next()
Cells(i, 1).Value = Выборка.Наименование
Cells(i, 2).Value = Выборка.ИНН
i = i + 1
Loop
End Sub
Для серверной базы строка подключения выглядит так: Srvr="имя_сервера";Ref="имя_базы";Usr=...;Pwd=....
Компонента comcntr.dll регистрируется при установке платформы. Если CreateObject выдаёт ошибку, зарегистрируйте её вручную из командной строки администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"
Номер версии в пути подставьте свой. Разрядность Excel и платформы должна совпадать: 64-битному Excel нужна 64-битная платформа в Program Files, 32-битному — из Program Files (x86).
Заведите в 1С отдельного пользователя только с правом чтения нужных данных. Пароль в макросе хранится открытым текстом — любой, кто откроет файл, его увидит.
5. Экспорт данных в CSV и TXT
CSV — это текст, где значения разделены точкой с запятой. Excel открывает его без макросов, его понимают банки, маркетплейсы, CRM. Подходит для больших выгрузок: сотни тысяч строк пишутся быстрее, чем в табличный документ.
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, , , Символы.ПС);
ЗаписьТекста.ЗаписатьСтроку("Наименование;ИНН;Сумма");
Для Каждого Стр Из Таблица Цикл
ЗаписьТекста.ЗаписатьСтроку(СтрШаблон("%1;%2;%3",
СтрЗаменить(Стр.Наименование, ";", ","),
Стр.ИНН,
Формат(Стр.Сумма, "ЧРД=,; ЧГ=0")));
КонецЦикла;
ЗаписьТекста.Закрыть();
На что смотреть:
- 🔤 Кодировка.
КодировкаТекста.UTF8пишет в начало файла метку BOM, и современный Excel распознаёт кириллицу. Для старых программ, которые ждут Windows-1251, используйтеКодировкаТекста.ANSI. - ➗ Разделитель. Для русских региональных настроек Excel ожидает
;. Запятая сольёт все поля в одну колонку. - 💰 Числа.
Формат(Сумма, "ЧРД=,; ЧГ=0")убирает пробелы между разрядами и ставит запятую дробной части — Excel поймёт это как число. - ✂️ Точка с запятой внутри текста. Заменяйте её или заключайте значение в кавычки, иначе строка разъедется по колонкам.
TXT без разделителей нужен редко — обычно для загрузки в банковские программы с фиксированной шириной полей. Табличный документ тоже сохраняется в текст (ТипФайлаТабличногоДокумента.TXT или ANSITXT), но колонки при этом не разделяются точкой с запятой.
6. XML и универсальные коллекции
XML из 1С — формат обмена между базами, а не для чтения людьми. Excel откроет его как XML-таблицу, но вложенные структуры (документ с табличной частью) превратятся в неудобную плоскую простыню с повторами.
Когда XML всё-таки уместен:
- 📦 выгрузку принимает не Excel, а другая система, которая требует XML по схеме;
- 🔁 данные нужно потом загрузить обратно в 1С без потерь типов.
Для Excel промежуточным звеном лучше служит таблица значений — универсальная коллекция, которую возвращает запрос Выгрузить(). Её можно свернуть (Таблица.Свернуть("Контрагент", "Сумма")), отсортировать, отфильтровать в памяти и только потом вывести в табличный документ кодом из раздела 3. Дерево значений перед выводом разворачивайте в плоскую таблицу — Excel не хранит иерархию строк в виде дерева.
Если нужен именно XML для Excel, сохраните табличный документ в xlsx: внутри это тоже набор XML-файлов, но в стандарте, который Excel понимает без настроек.
7. Кодировка, спецсимволы и числа, которые не считаются
Большинство жалоб после выгрузки — не на 1С, а на то, как Excel прочитал файл. Выберите свой симптом:
Спецсимволы из наименований — кавычки-«ёлочки», переносы строк внутри комментария — в xlsx переносятся корректно. В CSV перенос строки внутри значения разорвёт запись, поэтому заменяйте Символы.ПС на пробел перед записью.
8. Автоматическая выгрузка: внешняя обработка и рассылка отчётов
Внешняя обработка
Код из разделов 3–5 оформляют во внешнюю обработку — файл .epf. Разово её открывают через ☰ → Файл → Открыть. Чтобы обработка была у всех пользователей под рукой, в Бухгалтерии 3.0 и других типовых на БСП её подключают в Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
Там же для обработки вида «Дополнительная обработка» можно настроить расписание: база сама будет выгружать файл, например, каждый день в 7:00 в сетевую папку. Для этого обработку пишут так, чтобы она работала на сервере без формы и сохраняла файл в каталог, доступный пользователю, от которого запущен сервер 1С.
Подключайте внешние обработки только из проверенного источника. Код в .epf выполняется с правами пользователя и может изменить или удалить данные.
Рассылка отчётов без программиста
Типовой механизм без единой строки кода: Администрирование → Печатные формы, отчеты и обработки → Рассылки отчетов. Создаёте рассылку, добавляете отчёты с нужными настройками, выбираете формат xlsx и способ доставки — в папку, на почту или FTP. Задаёте расписание — и ОСВ или остатки по складам каждое утро лежат в Excel-файле.
Рассылка выполняется регламентным заданием. В файловой базе такие задания работают, только пока кто-то из пользователей держит программу открытой, в клиент-серверной — по расписанию сервера.