Куда и чем выгружать значения из 1С: файл, COM, HTTP или РИБ

· 9 мин

Содержание

Передать данные из 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 сохраните табличный документ в формате «Текстовый документ» и проверьте разделитель, либо выгрузите программно через ЗаписьТекста.

Загрузка в типовые конфигурации:

  1. В БП 3.0 у справочника «Номенклатура» есть команда загрузки из файла. Она сопоставляет колонки файла с реквизитами и ищет дубли по наименованию или артикулу.
  2. В табличных частях документов поступления и реализации свежих релизов тоже есть загрузка из файла — ищите её в меню Ещё табличной части.
  3. Для остальных объектов используют универсальную обработку загрузки из табличного документа. Она подключается как внешняя.

Перед массовой загрузкой сделайте резервную копию базы. Отменить загрузку 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, электронная почта или прямое подключение через интернет к опубликованной базе.

Как устроено под капотом: план обмена регистрирует изменённые объекты для каждого узла. При обмене уходит только то, что изменилось с прошлого раза, а не вся база. Каждое сообщение нумеруется, и узел-получатель подтверждает приём.

Первая синхронизация — самая тяжёлая: сопоставляются все справочники. Запускайте её вне рабочего времени и проверяйте сопоставление контрагентов по ИНН и КПП, а не по наименованию.

Внешние обработки и расширения для своего формата

Когда формат нестандартный (банковский файл, выгрузка для маркетплейса, отчёт для головной компании), пишут свою обработку.

Два варианта:

  1. Внешняя обработка (.epf). Подключается без изменения конфигурации. В БП 3.0: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Её можно запускать по расписанию как регламентное задание, если в обработке описана такая команда.
  2. Расширение конфигурации (.cfe). Появились в платформе 8.3.6. Позволяют добавить свои объекты и HTTP-сервисы, не снимая конфигурацию с поддержки. Обновления типовой конфигурации ставятся как обычно.

Чем расширение удобнее обработки: код живёт внутри базы, к нему есть доступ из регламентных заданий и подписок на события. Например, при проведении реализации сразу отправлять её на сайт.

Частые ошибки при обмене и как их избежать

Диагностика: выберите симптом

Ещё две ошибки, которые не видны сразу:

  • 🔐 Обмен под администратором. Если пароль сменят, обмен встанет. Заводите служебного пользователя.
  • 📝 Нет журнала. Пишите каждый сбой в журнал регистрации со своим событием (как в примере с HTTPСоединение). Тогда отбор по событию в журнале за минуту покажет все ошибки обмена.

Как ускорить передачу больших объёмов данных

На 100 тысячах документов разница между аккуратным и прямолинейным обменом — часы.

  1. Читайте запросом, а не объектами. Выборка.Наименование из запроса в десятки раз быстрее, чем Ссылка.ПолучитьОбъект() в цикле.
  2. Передавайте только изменения. План обмена или своя метка «выгружено» убирает повторную выгрузку уже переданного.
  3. Режим загрузки. При записи принятых объектов ставьте Объект.ОбменДанными.Загрузка = Истина. Обработчики проверок в модуле объекта, где это условие учтено, пропускаются, запись идёт быстрее. Проверку данных тогда делайте до записи сами.
  4. Порции. Записывайте по 500–1000 объектов в одной транзакции. Одна транзакция на 100 000 объектов держит блокировки и при сбое откатывается целиком.
  5. Сжатие. Большой XML или JSON жмётся в ZIP через ЗаписьZipФайла в 5–10 раз — заметно для обмена через FTP или почту.
  6. Фон. Тяжёлый обмен запускайте регламентным заданием ночью, а не кнопкой у пользователя.

В режиме ОбменДанными.Загрузка = Истина типовые обработчики пропускают не только проверки, но и часть служебных действий при записи. После такой загрузки выборочно проверьте документы и при необходимости перепроведите их штатно.

Можно ли передать данные из 1С 8.3 в базу на 7.7?
Да, через файл (XML, DBF, текст) или COM-соединение к 7.7 (V77.Application). Штатной синхронизации между ними в типовых конфигурациях 8.3 нет.
Чем OData лучше своего HTTP-сервиса?
OData не требует программирования: достаточно открыть нужные объекты. Свой HTTP-сервис гибче — формат ответа и проверки вы задаёте сами.
Можно ли обмениваться данными из 1С в облаке (1С:Фреш)?
COM-соединение в облаке недоступно. Остаются файлы, штатная синхронизация и HTTP-обмены, которые поддерживает сервис.
Как передать значения между двумя формами внутри одной базы?
Это задача программирования формы: передайте значения через параметры открытия формы (ОткрытьФорму со структурой параметров) и получите их в ПриСозданииНаСервере.