Куда и чем выгружать значения из 1С: файл, COM, HTTP или РИБ
Содержание
Передать данные из 1С можно пятью путями: файлом (Excel, CSV, XML, JSON), через COM-соединение, через HTTP-сервис или веб-сервис, штатной синхронизацией между базами (включая РИБ) и внешней обработкой. Для разовой выгрузки до нескольких тысяч строк хватает файла. Для регулярного обмена с сайтом или сторонней программой берите HTTP. Для двух баз 1С в одной сети — штатную синхронизацию в Администрирование → Синхронизация данных.
Выбор зависит от трёх вещей: как часто нужна передача значений, кто на другой стороне (1С или нет) и сколько данных. Всё, что ниже, относится к платформе 8.3 и типовым конфигурациям на ней: Бухгалтерии 3.0, ЗУП 3.1, УТ 11.
Какой способ обмена данными выбрать
Сначала сравните способы по задаче. Ошибка на этом шаге стоит дороже всего: COM-соединение, поднятое ради одной выгрузки в месяц, потом годами ломается при каждом обновлении платформы.
| Способ | Когда подходит | Кто на другой стороне | Риски |
|---|---|---|---|
| Ручной ввод, копирование | До 20–30 записей, разово | Человек | Опечатки, нет журнала |
| Файл XLSX/CSV | Разовая выгрузка, прайс, справочник | Excel, любая программа | Кодировка, форматы дат и чисел |
| Файл XML/JSON | Обмен с учётными системами | Программа с описанным форматом | Расхождение схемы |
| COM-соединение | Скрипт или программа на Windows читает базу | Python, C#, VBScript, другая 1С | Разрядность, версия платформы |
| HTTP-сервис, OData, веб-сервис | Сайт, мобильное приложение, интеграции по сети | Любая система с HTTP | Публикация, безопасность |
| Синхронизация данных, РИБ | Две и более базы 1С | 1С | Коллизии, сбой нумерации сообщений |
| Внешняя обработка, расширение | Нестандартный формат, своя логика | Любая | Совместимость с обновлениями |
Ручная передача значений: когда программировать не стоит
Если нужно перенести 15 контрагентов или поправить цены у 30 позиций, ручной ввод быстрее любой настройки. Час работы оператора дешевле, чем день программиста и тестирование.
Что ускоряет ручную работу:
- 📋 Копирование документа. В списке документов выделите строку и нажмите
F9— откроется копия с заполненными реквизитами. - 🔗 Ввод на основании. Из заказа сразу создаётся реализация, из поступления — оплата. Значения переходят без перепечатки.
- ✏️ Групповое изменение реквизитов. Обработка меняет одно поле у сотен элементов разом. В БП 3.0 она есть в разделе
Администрирование → Обслуживание. - 📊 Сохранение табличного документа. Любой отчёт или печатную форму можно сохранить в XLSX, PDF или MXL командой сохранения на панели формы.
Любой список (справочник, журнал документов) тоже выгружается в табличный документ: в меню Ещё формы списка есть команда вывода списка. Дальше его можно сохранить как Excel-файл.
Перед выводом списка настройте колонки и отбор. В файл попадут ровно те поля и строки, что видны на экране.
Выгрузка и загрузка через файлы: XLSX, CSV, XML, JSON
Файл — самый понятный способ передать данные из 1С в программу, которая не умеет подключаться к базе напрямую.
Excel и CSV
Выгрузка: отчёт или список → сохранить как XLSX. Для CSV сохраните табличный документ в формате «Текстовый документ» и проверьте разделитель, либо выгрузите программно через ЗаписьТекста.
Загрузка в типовые конфигурации:
- В БП 3.0 у справочника «Номенклатура» есть команда загрузки из файла. Она сопоставляет колонки файла с реквизитами и ищет дубли по наименованию или артикулу.
- В табличных частях документов поступления и реализации свежих релизов тоже есть загрузка из файла — ищите её в меню
Ещётабличной части. - Для остальных объектов используют универсальную обработку загрузки из табличного документа. Она подключается как внешняя.
Перед массовой загрузкой сделайте резервную копию базы. Отменить загрузку 5 000 элементов нечем, кроме восстановления копии.
XML и JSON
Для обмена между учётными системами годятся XML и JSON. Для 1С ↔ 1С есть единый формат EnterpriseData: его используют типовые синхронизации и обработка «Универсальный обмен данными в формате XML».
Простая программная выгрузка в JSON выглядит так:
Данные = Новый Массив;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Строка = Новый Структура("code, name", СокрЛП(Выборка.Код), Выборка.Наименование);
Данные.Добавить(Строка);
КонецЦикла;
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\Exchange\items.json", КодировкаТекста.UTF8);
ЗаписатьJSON(Запись, Данные);
Запись.Закрыть();
В ЗаписатьJSON передавайте только структуры, массивы, строки, числа, даты и булево. Ссылку на элемент справочника напрямую в JSON не записать: берите код, наименование или УникальныйИдентификатор().
Для XML объект целиком сериализуется через СериализаторXDTO или глобальную ЗаписатьXML(). Такой файл прочитает только база с той же структурой метаданных.
COM-соединение: подключение внешней программы к базе
COM-соединение даёт внешней программе на Windows прямой доступ к базе: запросы, чтение и запись объектов. Работает через компонент comcntr.dll из каталога bin установленной платформы.
Регистрация компонента
Обычно компонент регистрируется при установке платформы. Если программа его не находит, зарегистрируйте вручную из командной строки с правами администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"
Номер версии в пути подставьте свой. Разрядность компонента должна совпадать с разрядностью программы, которая его вызывает: 32-битный скрипт не увидит 64-битный comcntr.dll.
Пример подключения
Коннектор = Новый COMОбъект("V83.COMConnector");
База = Коннектор.Connect("File=""D:\Bases\Trade"";Usr=""Обмен"";Pwd=""пароль"";");
// для клиент-серверной базы:
// База = Коннектор.Connect("Srvr=""srv1c"";Ref=""trade"";Usr=""Обмен"";Pwd=""пароль"";");
Запрос = База.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Контрагенты.ИНН, Контрагенты.Наименование ИЗ Справочник.Контрагенты КАК Контрагенты";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.ИНН + " " + Выборка.Наименование);
КонецЦикла;
Тот же код почти дословно пишется на Python (win32com.client.Dispatch("V83.COMConnector")) или C#.
Что учитывать:
- 🔢 Для клиент-серверной базы версия
comcntr.dllна клиенте должна совпадать с версией сервера 1С. - 🧩 Общие модули доступны через COM, только если у модуля включено свойство «Внешнее соединение».
- 👤 Заведите отдельного пользователя для обмена с минимальными правами. Пароль администратора в скрипте — плохая идея.
- 🐢 Каждое обращение к свойству — вызов через границу процессов. Тяните данные одним запросом, а не перебором объектов.
HTTP-сервисы, OData и веб-сервисы: обмен по сети
Если на другой стороне сайт, мобильное приложение или облачная система, нужен обмен по HTTP. COM здесь не годится: он работает только на Windows и только локально или в доверенной сети.
Три варианта
- 🌐 HTTP-сервис — свой REST-интерфейс в конфигурации или расширении. Вы сами решаете, какие адреса и какой JSON отдавать.
- 📂 Стандартный интерфейс OData — платформа отдаёт объекты по адресу
/odata/standard.odata/без программирования. Состав доступных объектов задаётся отдельно, по умолчанию он пуст. - 📜 Веб-сервис (SOAP) — для систем, которые требуют WSDL. Сейчас чаще выбирают HTTP-сервисы.
Все три требуют публикации базы на веб-сервере (IIS или Apache). Публикацию делают из Конфигуратора: Администрирование → Публикация на веб-сервере, либо утилитой webinst.
Когда 1С сама отправляет данные
Обратная схема: 1С по расписанию шлёт данные во внешний API. Для этого есть объект HTTPСоединение:
SSL = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, SSL);
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Обмен.Сайт", УровеньЖурналаРегистрации.Ошибка, , ,
"Код ответа " + Формат(Ответ.КодСостояния, "ЧГ=0") + ": " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Шестой параметр — таймаут в секундах. Без него зависший сервер на другой стороне повесит регламентное задание надолго.
Публикуя базу в интернет, закройте её от прямого доступа: только HTTPS, отдельный пользователь с правами на нужные объекты, ограничение по IP на веб-сервере.
Синхронизация между базами 1С и распределённая информационная база
Когда обе стороны — 1С, программировать почти ничего не нужно. В типовых конфигурациях готовые обмены настраиваются в Администрирование → Синхронизация данных.
Типовые связки:
- 🔄 БП 3.0 ↔ ЗУП 3.1 — из ЗУП в бухгалтерию уходят начисления, взносы и НДФЛ для отражения в учёте.
- 🔄 БП 3.0 ↔ УТ 11 — документы продаж и закупок переходят в бухгалтерию.
- 🏢 РИБ — несколько копий одной конфигурации (центр и филиалы). Подчинённый узел создаётся из начального образа, изменения конфигурации тоже приходят из центра.
Канал передачи сообщений выбирается при настройке: общий сетевой каталог, FTP, электронная почта или прямое подключение через интернет к опубликованной базе.
Как устроено под капотом: план обмена регистрирует изменённые объекты для каждого узла. При обмене уходит только то, что изменилось с прошлого раза, а не вся база. Каждое сообщение нумеруется, и узел-получатель подтверждает приём.
Первая синхронизация — самая тяжёлая: сопоставляются все справочники. Запускайте её вне рабочего времени и проверяйте сопоставление контрагентов по ИНН и КПП, а не по наименованию.
Внешние обработки и расширения для своего формата
Когда формат нестандартный (банковский файл, выгрузка для маркетплейса, отчёт для головной компании), пишут свою обработку.
Два варианта:
- Внешняя обработка (
.epf). Подключается без изменения конфигурации. В БП 3.0:Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Её можно запускать по расписанию как регламентное задание, если в обработке описана такая команда. - Расширение конфигурации (
.cfe). Появились в платформе 8.3.6. Позволяют добавить свои объекты и HTTP-сервисы, не снимая конфигурацию с поддержки. Обновления типовой конфигурации ставятся как обычно.
Чем расширение удобнее обработки: код живёт внутри базы, к нему есть доступ из регламентных заданий и подписок на события. Например, при проведении реализации сразу отправлять её на сайт.
Частые ошибки при обмене и как их избежать
Ещё две ошибки, которые не видны сразу:
- 🔐 Обмен под администратором. Если пароль сменят, обмен встанет. Заводите служебного пользователя.
- 📝 Нет журнала. Пишите каждый сбой в журнал регистрации со своим событием (как в примере с
HTTPСоединение). Тогда отбор по событию в журнале за минуту покажет все ошибки обмена.
Как ускорить передачу больших объёмов данных
На 100 тысячах документов разница между аккуратным и прямолинейным обменом — часы.
- Читайте запросом, а не объектами.
Выборка.Наименованиеиз запроса в десятки раз быстрее, чемСсылка.ПолучитьОбъект()в цикле. - Передавайте только изменения. План обмена или своя метка «выгружено» убирает повторную выгрузку уже переданного.
- Режим загрузки. При записи принятых объектов ставьте
Объект.ОбменДанными.Загрузка = Истина. Обработчики проверок в модуле объекта, где это условие учтено, пропускаются, запись идёт быстрее. Проверку данных тогда делайте до записи сами. - Порции. Записывайте по 500–1000 объектов в одной транзакции. Одна транзакция на 100 000 объектов держит блокировки и при сбое откатывается целиком.
- Сжатие. Большой XML или JSON жмётся в ZIP через
ЗаписьZipФайлав 5–10 раз — заметно для обмена через FTP или почту. - Фон. Тяжёлый обмен запускайте регламентным заданием ночью, а не кнопкой у пользователя.
В режиме ОбменДанными.Загрузка = Истина типовые обработчики пропускают не только проверки, но и часть служебных действий при записи. После такой загрузки выборочно проверьте документы и при необходимости перепроведите их штатно.
Можно ли передать данные из 1С 8.3 в базу на 7.7?
Чем OData лучше своего HTTP-сервиса?
Можно ли обмениваться данными из 1С в облаке (1С:Фреш)?
Как передать значения между двумя формами внутри одной базы?
ОткрытьФорму со структурой параметров) и получите их в ПриСозданииНаСервере.