Excel и база 1С 8.3: четыре способа получать и отправлять данные
Содержание
Подключиться к
1С из Excel можно двумя рабочими способами: макросом VBA через COM-объект V83.COMConnector или через Power Query по протоколу OData, если база опубликована на веб-сервере. Для разовых задач подключение не нужно вовсе: любой список и отчёт 1С сохраняется в .xlsx, а таблицы из Excel загружаются обратно штатными командами.
Выбор зависит от того, где стоит база, есть ли на компьютере платформа 1С и нужно ли писать данные обратно. Ниже каждый способ с настройкой, примером кода и ошибками, на которых обычно застревают.
Выгрузка из 1С в Excel и загрузка обратно без программирования
Половина задач «связать Excel и 1С» решается без единой строки кода. Платформа 8.3 сама сохраняет табличные документы в формат Excel.
Как выгрузить список или отчёт в .xlsx
- Откройте нужный список: номенклатуру, контрагентов, журнал документов .
- Нажмите
Ещё → Вывести список..., отметьте нужные колонки и нажмите «ОК». Откроется табличный документ. - Откройте главное меню (кнопка с тремя полосками в заголовке окна) и выберите
Файл → Сохранить как.... - В поле типа файла выберите «Лист Microsoft Excel 2007-…» с расширением
.xlsx.
Отчёты сохраняются так же: сформируйте отчёт, затем Файл → Сохранить как... или кнопка сохранения на панели отчёта. Комбинация Ctrl+S в открытом табличном документе делает то же самое.
Для быстрой вставки в уже открытую книгу выделите ячейки в табличном документе 1С, нажмите Ctrl+C и вставьте в Excel. Форматирование частично сохранится, числа останутся числами.
Как загрузить таблицу из Excel в 1С
- 📦 Справочники. В БП 3.0, УТ 11 и других конфигурациях на БСП в списке номенклатуры есть команда «Загрузить» (иногда спрятана в «Ещё»). Она открывает форму, куда вставляют колонки из Excel и сопоставляют их с реквизитами.
- 🧾 Табличные части документов. В поступлении и реализации у таблицы «Товары» есть команда загрузки из файла. Ищите её в меню «Ещё» над табличной частью.
- 🛠 Нестандартные случаи. Внешняя обработка «Загрузка данных из табличного документа» загружает почти в любой справочник, документ или регистр сведений
. Её распространяют вместе с материалами ИТС, открывается через
Файл → Открыть.
Перед загрузкой в справочник с тысячами строк сделайте резервную копию базы . Неверно сопоставленная колонка создаст сотни дублей, а удалять их придётся вручную.
Подключение к 1С из Excel через COM-соединение (VBA)
COM-соединение — это «внешнее соединение» с базой. Excel запускает внутри себя движок 1С, входит в базу под указанным пользователем и выполняет запросы на языке 1С. Окно программы при этом не открывается.
Что нужно подготовить
- 💻 На компьютере установлена платформа 1С той же версии, что и база (для клиент-серверной базы — та же сборка, что на сервере).
- 🔢 Разрядность платформы совпадает с разрядностью Excel. 64-битный Office работает только с 64-битной компонентой, 32-битный — с 32-битной. Разрядность Office видна в
Файл → Учётная запись → О программе Excel. - 📝 Компонента
comcntr.dllзарегистрирована в Windows. - 👤 В базе есть пользователь, у роли которого включено право «Внешнее соединение».
Регистрация компоненты выполняется в командной строке, запущенной от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1467\bin\comcntr.dll"
Номер версии в пути замените на свой. Для 32-битной платформы путь начинается с C:\Program Files (x86)\1cv8\. После обновления платформы компоненту регистрируют заново из папки новой версии.
Строка подключения
| База | Строка для метода Connect |
|---|---|
| Файловая | File="C:\Bases\Buh";Usr="Excel";Pwd="пароль"; |
| Клиент-серверная | Srvr="srv1c";Ref="buh";Usr="Excel";Pwd="пароль"; |
Ref — имя базы в кластере, а не её название в списке баз. Если сервер слушает нестандартный порт, его указывают через двоеточие: Srvr="srv1c:2541".
Пример макроса: номенклатура из 1С на лист Excel
Откройте редактор VBA (Alt+F11), вставьте модуль и код:
Sub LoadNomenclatureFrom1C()
Dim Connector As Object, Base As Object
Dim Q As Object, Sel As Object
Dim r As Long
Set Connector = CreateObject("V83.COMConnector")
Set Base = Connector.Connect("File=""C:\Bases\Buh"";Usr=""Excel"";Pwd=""пароль"";")
Set Q = Base.NewObject("Query")
Q.Text = "ВЫБРАТЬ Н.Код КАК Cd, Н.Наименование КАК Nm, Н.Артикул КАК Art " & _
"ИЗ Справочник.Номенклатура КАК Н ГДЕ НЕ Н.ЭтоГруппа"
Set Sel = Q.Execute().Select()
r = 2
Sheets(1).Range("A1:C1").Value = Array("Код", "Наименование", "Артикул")
Do While Sel.Next()
Sheets(1).Cells(r, 1).Value = Sel.Cd
Sheets(1).Cells(r, 2).Value = Sel.Nm
Sheets(1).Cells(r, 3).Value = Sel.Art
r = r + 1
Loop
Set Sel = Nothing: Set Q = Nothing
Set Base = Nothing: Set Connector = Nothing
End Sub
Полям в запросе даны латинские псевдонимы (Cd, Nm, Art), чтобы в VBA не писать кириллические имена свойств. Сам текст запроса и имя справочника остаются на русском: для этого в Windows должен стоять русский язык
для программ, не поддерживающих Юникод (Панель управления → Региональные стандарты → Дополнительно). Иначе кириллица в редакторе VBA превратится в знаки вопроса.
Тяжёлые запросы не стоит гонять в рабочее время. Внешнее соединение — полноценный сеанс в базе, он нагружает сервер так же, как пользователь, формирующий большой отчёт.
OData и ODBC: прямой запрос к данным 1С из Excel
Стандартный интерфейс OData и Power Query
Это самый удобный способ для регулярных отчётов: Excel сам забирает данные по ссылке и обновляет их кнопкой «Обновить всё». Платформа 1С на компьютере пользователя не нужна.
Порядок настройки:
- Опубликуйте базу на веб-сервере (IIS или Apache): в Конфигураторе
Администрирование → Публикация на веб-сервере, отметьте флажок публикации стандартного интерфейса OData. - Укажите, какие объекты доступны по OData. В БП 3.0 и других конфигурациях на БСП это делается в режиме «Предприятие»:
Администрирование → Синхронизация данных → Настройки стандартного интерфейса OData. Там же создаётся отдельный пользователь для внешнего доступа. - В Excel:
Данные → Получить данные → Из других источников → Из канала OData. - Введите адрес вида
http://server/buh/odata/standard.odata/, выберите обычную (Basic) авторизацию и логин с паролем пользователя из шага 2. - В навигаторе отметьте нужные наборы, например
Catalog_НоменклатураилиAccumulationRegister_..., и загрузите их на лист или в модель данных.
Имена наборов в OData английские по типу объекта: Catalog_ для справочников, Document_ для документов, InformationRegister_ и AccumulationRegister_ для регистров. Дальше Power Query фильтрует, объединяет и группирует данные без программирования.
ODBC-драйверы и SQL: когда это вообще возможно
Для баз 1С 8.3 нет ODBC-драйвера, который читал бы файловую базу
(1Cv8.1CD). Подключение через ODBC возможно только к клиент-серверной базе, и только к самой СУБД: MS SQL Server или PostgreSQL. В Excel это Данные → Получить данные → Из базы данных.
Проблемы у этого пути серьёзные:
- 🔒 Таблицы в СУБД названы служебными именами вроде
_Reference42и_Document118. Соответствие объектам конфигурации выдаёт методПолучитьСтруктуруХраненияБазыДанных(), и после каждого обновления конфигурации оно может измениться. - ⚖️ Лицензионное соглашение 1С ограничивает доступ к данным в обход платформы. Прежде чем строить на этом отчётность, уточните условия у своего партнёра 1С.
- 🧮 В таблицах нет итогов, вычисляемых полей и прав доступа 1С. Остатки и обороты придётся собирать самостоятельно.
| Способ | Когда подходит | Платформа на ПК | Запись в 1С | Главный риск |
|---|---|---|---|---|
| Сохранить как .xlsx | Разовая выгрузка | Нужна (обычный клиент) | Через загрузку | Ручная работа |
| COM из VBA | Регулярные выгрузки в локальной сети | Нужна, той же версии | Да | Пароль в макросе, разрядность |
| OData + Power Query | Обновляемые отчёты, удалённые сотрудники | Не нужна | Возможна, но редко используется | Публикация базы в сеть |
| ODBC к SQL | Аналитика по большой базе | Не нужна | Нет | Лицензия, нестабильные имена таблиц |
Как записать данные из Excel обратно в 1С
Для справочников и документов сначала пробуйте штатную загрузку из первого раздела. Она проверяет данные так же, как ручной ввод.
Макрос нужен, когда надо массово изменить реквизит у существующих элементов. Пример: в колонке A листа — коды номенклатуры, в колонке B — новые артикулы.
Sub UpdateArticlesIn1C()
Dim Connector As Object, Base As Object
Dim Ref As Object, Obj As Object
Dim r As Long
Set Connector = CreateObject("V83.COMConnector")
Set Base = Connector.Connect("File=""C:\Bases\Buh"";Usr=""Excel"";Pwd=""пароль"";")
r = 2
Do While Sheets(1).Cells(r, 1).Value <> ""
Set Ref = Base.Catalogs.Номенклатура.FindByCode(CStr(Sheets(1).Cells(r, 1).Value))
If Ref.IsEmpty() Then
Sheets(1).Cells(r, 3).Value = "не найден"
Else
Set Obj = Ref.GetObject()
Obj.Артикул = CStr(Sheets(1).Cells(r, 2).Value)
Obj.Write
Sheets(1).Cells(r, 3).Value = "записан"
End If
r = r + 1
Loop
Set Obj = Nothing: Set Ref = Nothing
Set Base = Nothing: Set Connector = Nothing
End Sub
FindByCode при отсутствии элемента возвращает пустую ссылку, поэтому перед записью проверяется IsEmpty(). В колонку C макрос пишет результат по каждой строке, чтобы после прогона было видно, что не нашлось.
Коды в БП 3.0 строковые, вида 00-00000123. Если Excel превратил их в числа и срезал нули, формат колонки нужно сменить на текстовый до вставки данных.
Запись через COM выполняет модуль объекта и проверки при записи, но не запускает логику формы. То, что программа заполняет при вводе в форме, макрос не заполнит. Сначала прогоните макрос на 5–10 строках в копии базы.
Ошибки подключения Excel к 1С и что с ними делать
Ещё одна частая ситуация — файловая база открыта в Конфигураторе. Пока там идёт обновление конфигурации или тестирование и исправление, внешнее соединение не установится. Дождитесь окончания операции.
Если COM не заработал совсем, а база файловая и платформу на ПК ставить нельзя, остаётся связка «выгрузка в .xlsx по расписанию». В 1С это делается регламентным заданием или внешней обработкой, которую пишет программист. Excel затем открывает свежий файл из общей папки.
Безопасность связки Excel и 1С
- 🔑 Отдельный пользователь. Заведите в 1С пользователя только для Excel с ролью на чтение нужных объектов. Права администратора ему не нужны.
- 🙈 Пароль не в коде. Пароль, записанный в макросе, прочитает любой, кто откроет редактор VBA. Запрашивайте его через
InputBoxпри запуске или защитите проект VBA паролем. - 🌐 OData не наружу. Публикацию с OData держите в локальной сети или за VPN. Если доступ из интернета всё-таки нужен, используйте только HTTPS.
- 🔌 Закрывайте соединение. Присвоение
Nothingвсем объектам в конце макроса освобождает сеанс. Зависшие сеансы занимают лицензии и мешают обновлению базы. - 📋 Запись — только после проверки. Макрос, который пишет в базу, сначала прогоняют на копии.