Связь Excel и 1С:Предприятия 8.3: от сохранения отчёта до живого подключения к базе
Содержание
Подключить Excel к
1С 8.3 можно четырьмя способами. Разовая выгрузка: любой отчёт или список сохраняется в .xlsx через Главное меню → Файл → Сохранить как. Загрузка из книги в 1С: команда загрузки в табличной части документа или код на ТабличныйДокумент.Прочитать(). «Живые» данные в Excel: стандартный интерфейс OData и Power Query. Автоматизация в обе стороны: COM-соединение V83.COMConnector или объект Excel.Application.
Выбор зависит от того, как часто нужен обмен данными и кто его настраивает. Бухгалтеру хватит первых двух вариантов. Сводная таблица, которая сама обновляется из базы каждое утро, — это уже OData или ODBC, и тут нужен администратор.
Выгрузка из 1С в Excel без настроек и программирования
Любая печатная форма, отчёт или список в 1С — это табличный документ. Его можно сохранить в формате Excel за пару кликов.
Отчёт или печатная форма
- Сформируйте отчёт (например, оборотно-сальдовую ведомость).
- Нажмите кнопку сохранения на панели отчёта (значок дискеты) или откройте
Главное меню (☰) → Файл → Сохранить как. - В поле типа файла выберите
Лист Microsoft Excel 2007-... (*.xlsx). - Укажите папку и имя, нажмите «Сохранить».
💡 Для быстрого переноса без файла выделите область в отчёте, нажмите Ctrl+C и вставьте в Excel через Ctrl+V. Форматирование и объединённые ячейки обычно сохраняются.
Список документов или справочника
Списки (журнал документов , справочник «Номенклатура») напрямую не сохраняются. Сначала их выводят в табличный документ:
- Откройте список, при необходимости настройте отбор.
- Нажмите
Ещё → Вывести список.... - Отметьте нужные колонки, нажмите «ОК».
- Сохраните получившийся документ в
.xlsx, как отчёт выше.
⚠️ Выводятся только колонки, которые есть в форме списка. Если нужного реквизита нет — сначала добавьте его через Ещё → Изменить форму.
Когда вывода списка мало
Для выборки с условиями и группировками удобнее «Универсальный отчёт» (есть в типовых на БСП, ищется через Все функции или поиск по меню) или конструктор отчёта на СКД. Отчёт на СКД тоже сохраняется в Excel тем же способом.
Загрузка данных из Excel в 1С
Обратное направление сложнее: 1С должна понять, какая колонка что значит, и найти ссылки на справочники.
Штатная загрузка в типовых конфигурациях
В 1С:Бухгалтерии 3.0 и УТ 11 у табличных частей документов поступления и реализации, а также в списке номенклатуры есть команда Загрузить (в некоторых формах она спрятана в меню Ещё). Работает так:
- Нажмите
Загрузить— откроется окно с пустой таблицей. - Скопируйте строки из Excel и вставьте в это окно через
Ctrl+V. - На следующем шаге сопоставьте колонки: «Номенклатура», «Количество», «Цена».
- Программа покажет, какие позиции нашлись, какие нет. Ненайденные можно создать или сопоставить вручную.
💡 Сопоставление по артикулу надёжнее, чем по наименованию. «Бумага А4 Снегурочка» и «Бумага А4, Снегурочка» для 1С — разные строки.
Загрузка кодом через табличный документ
Платформа 8.3 сама читает .xlsx в табличный документ, Excel на компьютере не нужен. Это основа большинства внешних обработок загрузки. Пример серверной процедуры: файл передан через временное хранилище, из второй строки читаются артикул и количество.
&НаСервере
Функция ПрочитатьКнигуExcel(АдресФайла)
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
ДвоичныеДанные.Записать(ИмяФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст);
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
ТекстКоличества = СтрЗаменить(ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2).Текст, " ", "");
НоваяСтрока = Результат.Добавить();
НоваяСтрока.Артикул = Артикул;
Попытка
НоваяСтрока.Количество = Число(СтрЗаменить(ТекстКоличества, ",", "."));
Исключение
НоваяСтрока.Количество = 0;
КонецПопытки;
КонецЦикла;
УдалитьФайлы(ИмяФайла);
Возврат Результат;
КонецФункции
Дальше по артикулу ищут номенклатуру (Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ...)) и заполняют документ. Значение СпособЧтенияЗначенийТабличногоДокумента.Значение важно: так читаются сами числа и даты, а не их отображение с форматом ячейки.
Прямое подключение Excel к базе 1С через ODBC
Встроенного ODBC-драйвера у платформы 1С 8.3 нет. Прямой доступ возможен только для клиент-серверной базы: Excel подключается не к 1С, а к СУБД под ней — MS SQL Server или PostgreSQL.
Как это настраивается
- 🗄️ MS SQL Server. В Excel:
Данные → Получить данные → Из базы данных → Из базы данных SQL Server. Укажите сервер и имя базы. - 🐘 PostgreSQL. Установите драйвер psqlODBC, создайте источник в «Администраторе источников данных ODBC» Windows (
odbcad32) и подключитесь черезДанные → Получить данные → Из других источников → Из ODBC. - 🔐 Учётная запись. Заведите в СУБД отдельного пользователя только с правом чтения. Не давайте Excel логин, под которым работает сервер 1С.
Почему это последний вариант
Таблицы в СУБД называются не «Контрагенты», а _Reference45, поля — _Fld1234. Сопоставление имён возвращает функция встроенного языка ПолучитьСтруктуруХраненияБазыДанных(). После обновления конфигурации номера могут поменяться, и запросы в книге сломаются.
Никогда не пишите в базу 1С напрямую через SQL: платформа не узнает об изменениях, итоги регистров и ссылки разойдутся. Тяжёлые выборки по рабочей базе в рабочее время тормозят пользователей. Безопаснее читать с копии базы или реплики.
Для файловой базы (1Cv8.1CD) ODBC-подключения нет. Для неё используйте OData или регулярную выгрузку.
Microsoft Query, Power Query и OData: данные из 1С, которые обновляются сами
Microsoft Query — старый мастер Excel для запросов к ODBC-источнику. В современных версиях Excel он скрыт: включите Файл → Параметры → Данные → Показать устаревшие мастера импорта данных, после чего появится Данные → Получить данные → Устаревшие мастера → Из Microsoft Query. Он работает с тем же ODBC-источником, что и в предыдущем разделе, и позволяет написать SQL-запрос с параметром из ячейки.
Для 1С удобнее связка OData + Power Query. Она работает и с файловой, и с клиент-серверной базой и отдаёт данные в понятных именах объектов конфигурации.
Шаг 1. Публикация базы с интерфейсом OData
- На компьютере с веб-сервером (IIS или Apache) запустите Конфигуратор от имени администратора Windows.
- Откройте
Администрирование → Публикация на веб-сервере. - Отметьте флажок «Публиковать стандартный интерфейс OData» и нажмите «Опубликовать».
Шаг 2. Состав интерфейса
По умолчанию через OData не доступен ни один объект. Состав задаётся в самой базе. В типовых конфигурациях на БСП это делается в разделе Администрирование → Синхронизация данных, по ссылке настройки стандартного интерфейса OData (название ссылки может отличаться в зависимости от релиза). Отметьте нужные справочники, документы и регистры.
Шаг 3. Пользователь для Excel
Создайте в 1С отдельного пользователя с правами только на чтение нужных объектов и с аутентификацией 1С:Предприятия. Под ним Excel будет забирать данные.
Шаг 4. Подключение в Excel
Данные → Получить данные → Из других источников → Из канала OData.- Адрес вида
http://server/buh/odata/standard.odata/(здесьbuh— имя публикации). - Способ входа «Базовый», логин и пароль пользователя 1С из шага 3.
- В навигаторе выберите сущность, например
Catalog_КонтрагентыилиAccumulationRegister_ТоварыНаСкладах. - Нажмите «Преобразовать данные», уберите лишние колонки и загрузите на лист.
Для автообновления откройте Данные → Запросы и подключения, свойства запроса, и включите «Обновлять при открытии файла» или «Обновлять каждые N минут».
💡 Тянуть таблицу документа целиком на десятки тысяч строк долго. Добавьте фильтр по дате в Power Query на первом шаге: фильтр уходит в запрос к 1С, и сервер отдаёт только нужный период.
COM-соединение: автоматизация обмена между Excel и 1С
COM подходит, когда обмен нужно запускать кнопкой или по расписанию. Работает только в Windows. Направлений два.
Из Excel в 1С: V83.COMConnector
Макрос VBA открывает базу и выполняет запрос. Компонента comcntr.dll ставится вместе с платформой. Если её нет в реестре, зарегистрируйте от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1342\bin\comcntr.dll"
Номер платформы подставьте свой. Разрядность компоненты должна совпадать с разрядностью Excel: для 32-битного Office регистрируйте comcntr.dll из C:\Program Files (x86)\1cv8\....
Sub ЗагрузитьКонтрагентов()
Dim Connector As Object, Base As Object, Query As Object, Sel As Object
Dim r As Long
Set Connector = CreateObject("V83.COMConnector")
Set Base = Connector.Connect("File=""D:\Bases\Buh"";Usr=""Excel"";Pwd=""123"";")
Set Query = Base.NewObject("Query")
Query.Text = "ВЫБРАТЬ Наименование КАК Name, ИНН КАК INN " & _
"ИЗ Справочник.Контрагенты ГДЕ НЕ ЭтоГруппа"
Set Sel = Query.Execute().Select()
Columns(2).NumberFormat = "@"
r = 2
Do While Sel.Next()
Cells(r, 1).Value = Sel.Name
Cells(r, 2).Value = Sel.INN
r = r + 1
Loop
Set Sel = Nothing: Set Query = Nothing: Set Base = Nothing
End Sub
Для клиент-серверной базы строка соединения выглядит так: Srvr="server1c";Ref="buh";Usr="Excel";Pwd="123";. Псевдонимы КАК Name нужны, чтобы обращаться к полям выборки латиницей. Текстовый формат второй колонки сохраняет ведущие нули ИНН.
⚠️ COM-соединение — полноценный сеанс в базе. Учитывайте его при подсчёте лицензий и не держите соединение открытым дольше, чем идёт выгрузка.
Из 1С в Excel: Excel.Application
Обратный путь — 1С управляет Excel. Нужен установленный Excel, код выполняется на клиенте под Windows:
&НаКлиенте
Процедура ПрочитатьЧерезExcel(ПутьКФайлу)
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Данные = Книга.Worksheets(1).UsedRange.Value.Выгрузить();
Книга.Close(Ложь);
Excel.Quit();
// Данные — массив колонок: Данные[0][0] — ячейка A1
КонецПроцедуры
Главный приём: не читайте ячейки по одной через Cells(...). Каждое обращение — межпроцессный вызов, и 10 000 строк читаются минутами. UsedRange.Value отдаёт весь диапазон одним вызовом как COMSafeArray, а .Выгрузить() превращает его в массив 1С.
Сегодня этот способ нужен редко: для чтения .xlsx хватает ТабличныйДокумент.Прочитать(). COM к Excel оставляют для макросов, формул и форматирования, которых нет в табличном документе.
Какой способ подключения Excel к 1С выбрать
| Способ | Когда подходит | Кто настраивает | Ограничения и риски |
|---|---|---|---|
Сохранить как .xlsx | Разовая выгрузка отчёта или списка | Пользователь | Данные устаревают сразу после выгрузки |
| Команда «Загрузить» | Заполнить документ строками из файла | Пользователь | Только объекты, где команда есть |
ТабличныйДокумент.Прочитать() | Регулярная загрузка прайсов, остатков | Программист | Нужна внешняя обработка |
| OData + Power Query | Сводные и дашборды, обновляемые из базы | Администратор | Веб-сервер, настройка состава, нагрузка на базу |
| ODBC к СУБД | Тяжёлая аналитика по клиент-серверной базе | Администратор СУБД | Внутренние имена таблиц, только чтение |
COM (V83.COMConnector) | Макрос, кнопка в Excel, обмен по расписанию | Программист | Только Windows, разрядность, лицензия на сеанс |
Простое правило: нужно один раз — сохраняйте файл. Нужно каждый день — OData. Нужно писать в базу из Excel — только через COM или обработку, где запись идёт объектами 1С, а не SQL.
Ошибки при подключении Excel к 1С и что с ними делать
Частые вопросы
Можно ли редактировать данные 1С прямо в Excel, как в таблице базы?
Нужна ли отдельная лицензия 1С для OData или COM-подключения?
Работает ли OData с базой в облаке 1С:Фреш?
Почему при сохранении в Excel получается `.xls`, а не `.xlsx`?
*.xlsx в списке типов файла: он лучше переносит длинные таблицы и не ограничен 65 536 строками.