Отправка данных из 1С:Предприятия 8.3 на внешний сервер: HTTP, файлы, COM и расписание
Содержание
Чаще всего текущие данные из 1С на удаленный сервер передают HTTP-запросом: объект HTTPСоединение отправляет JSON методом POST на адрес API, а регламентное задание повторяет отправку по расписанию. Если принимающая сторона не умеет HTTP, остаются файловый обмен через сетевую папку или FTP и прямое подключение по COM или ODBC.
Типичная ситуация: сайт или складская система должна каждые 10 минут получать свежие остатки и заказы из 1С:Бухгалтерии или УТ. Выгрузка вручную раз в день уже не устраивает. Механизмы ниже есть в самой платформе 8.3, поэтому работают в любой конфигурации. Отличается только место, куда вы встроите код: внешняя обработка, расширение или собственная доработка.
Какой способ передачи данных выбрать
Решение зависит от того, что стоит на другой стороне и как быстро данные должны туда попадать.
| Способ | Когда подходит | Слабые места |
|---|---|---|
| HTTP/HTTPS-запрос к API | у сервера есть REST API, нужна передача почти в реальном времени | нужен разбор ответов и повторы при сбоях |
| Файл в сетевой папке | обе стороны в одной локальной сети | права на папку, недописанные файлы |
| FTP/SFTP | сервер принимает файлы снаружи | у платформы нет встроенного SFTP |
| COM-соединение | приёмник — другая база 1С на Windows | только Windows, совпадение разрядности |
| ODBC/ADO | нужно писать прямо в таблицу внешней СУБД | жёсткая привязка к структуре чужой базы |
| HTTP-сервис или OData в 1С | сервер сам забирает данные из 1С | нужна публикация базы на веб-сервере |
Последняя строка — обратная схема. Не 1С толкает данные, а внешний сервер приходит за ними. Её выбирают, когда сервер «знает», когда ему нужны данные, а 1С держать отправку не должна.
💡 Если обе стороны — типовые конфигурации 1С, сначала посмотрите встроенную синхронизацию: Администрирование → Синхронизация данных. Готовый обмен через планы обмена и формат EnterpriseData надёжнее самописного кода.
Отправка данных на удаленный сервер HTTP-запросом
HTTP — основной способ передать данные из 1С на сервер с API. Порядок такой: собрать данные в структуру, сериализовать в JSON, отправить POST и проверить код ответа.
Пример процедуры, которая отправляет структуру с данными заказа:
Функция ОтправитьНаСервер(ДанныеДляОтправки) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
ТелоЗапроса = ЗаписьJSON.Закрыть();
SSL = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, SSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Заголовки.Вставить("Authorization", "Bearer " + ПолучитьТокенAPI());
Запрос = Новый HTTPЗапрос("/v1/orders", Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния > 299 Тогда
ВызватьИсключение СтрШаблон("Сервер вернул код %1: %2",
Формат(Ответ.КодСостояния, "ЧГ=0"), Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Возврат Ответ.ПолучитьТелоКакСтроку();
КонецФункции
Что здесь стоит запомнить:
- 🔐
ЗащищенноеСоединениеOpenSSLс сертификатами ОС включает HTTPS и проверку сертификата сервера. Без этого параметра соединение пойдёт по обычному HTTP. - ⏱ Шестой параметр
HTTPСоединение— таймаут в секундах. Без него зависший сервер может держать сеанс 1С очень долго. - 📦
ОтправитьДляОбработки— это POST. Для GET естьПолучить, для PUT —Записать. - 🧾
ИспользованиеByteOrderMark.НеИспользоватьубирает BOM в начале тела. Многие API на BOM отвечают ошибкой разбора JSON.
Как собрать текущие данные для отправки
Данные удобно брать запросом и складывать в структуру или массив структур. Ссылки на справочники в JSON не сериализуются напрямую, поэтому передавайте строковые значения: код, наименование, УникальныйИдентификатор() в виде строки. Даты — через XMLСтрока(Дата), тогда сервер получит формат ISO 8601.
Передавать только изменения
Гонять каждый раз все остатки — лишняя нагрузка. Два рабочих приёма:
- Хранить дату последней успешной отправки и выбирать документы, изменённые после неё.
- Завести план обмена с одним узлом «Сервер» и включить в него нужные объекты. Платформа сама будет регистрировать изменения, а после успешной отправки вы удаляете регистрацию методом
ПланыОбмена.УдалитьРегистрациюИзменений.
Второй вариант надёжнее: изменение не потеряется, даже если пользователь поправил документ задним числом.
Файловый обмен через сетевую папку и FTP
Файл — самый простой канал, когда API нет. 1С пишет XML, JSON или CSV, а программа на сервере забирает его по расписанию.
Сетевая папка
Файл формируют через ЗаписьJSON или ЗаписьXML с методом ОткрытьФайл, затем копируют по UNC-пути вида \\srv-exchange\in\orders.json.
Главная ловушка — права. В файловой базе файл пишет учётная запись пользователя Windows. В клиент-серверной серверный код выполняет рабочий процесс 1С, и доступ к папке нужен учётной записи, от которой запущена служба сервера 1С. Обычно это USR1CV8 или доменная учётная запись, указанная при установке.
Сетевой диск вида Z:\ в серверном коде не работает: службе не видны диски, подключённые пользователем. Пишите только полный UNC-путь.
Вторая ловушка — недописанный файл. Приёмник может схватить его, пока 1С ещё пишет. Решение простое: писать во временное имя orders.tmp, а после закрытия переименовать в orders.json через ПереместитьФайл. Приёмник забирает только *.json.
FTP
Для отправки по FTP в платформе есть объект FTPСоединение:
FTP = Новый FTPСоединение("ftp.example.ru", 21, "exchange", ПолучитьПарольFTP(), , Истина, 30);
FTP.Записать(ПутьКЛокальномуФайлу, "/in/orders.tmp");
FTP.Переместить("/in/orders.tmp", "/in/orders.json");
Шестой параметр Истина включает пассивный режим — без него соединение часто не проходит через NAT и межсетевые экраны. Встроенной поддержки SFTP у платформы нет. Если сервер принимает только SFTP, файл отправляют внешней утилитой, которую 1С запускает через ЗапуститьПриложение, или переходят на HTTPS.
Прямое подключение: COM-соединение и ODBC
Прямое соединение нужно, когда на другой стороне не сервис, а база: другая 1С или СУБД вроде MS SQL и PostgreSQL.
COM-соединение с другой базой 1С
COM работает только на Windows. Сначала регистрируют компонент comcntr.dll из каталога bin нужной версии платформы:
regsvr32 "C:\Program Files\1cv8\8.3.24.1691\bin\comcntr.dll"
Номер версии в пути подставьте свой. Командная строка запускается от имени администратора. Затем в коде:
Коннектор = Новый COMОбъект("V83.COMConnector");
Строка = "Srvr=""srv-1c"";Ref=""trade"";Usr=""Обмен"";Pwd=""" + ПолучитьПароль() + """;";
БазаПриемник = Коннектор.Connect(Строка);
Через БазаПриемник доступны справочники и документы второй базы, будто вы работаете в ней. Для файловой базы вместо Srvr и Ref указывают File=""D:\Bases\Trade"".
Три приёма, без которых COM не заработает:
- 🧩 Разрядность. 64-разрядный сервер 1С видит только 64-разрядный
comcntr.dll, 32-разрядный клиент — 32-разрядный. Регистрируют тот, что совпадает с процессом, из которого идёт вызов. - 🔢 Версия. Компонент регистрируется заново после каждого обновления платформы, иначе вызов уходит к старой версии.
- 🐢 Скорость. Каждое обращение к свойству — отдельный межпроцессный вызов. Тысячи строк по одной передавать медленно. Лучше вызывать в базе-приёмнике экспортную процедуру общего модуля с внешним соединением и передавать ей пакет.
ODBC и ADO к внешней СУБД
Если данные нужно положить в таблицу чужой СУБД, есть два пути. Первый — объект ADODB.Connection через Новый COMОбъект и обычный SQL INSERT. Второй, без COM, — внешние источники данных в конфигурации: подключаете таблицу через ODBC и работаете с ней как с объектом метаданных.
Никогда не пишите SQL-запросами напрямую в таблицы базы 1С. Платформа хранит данные в своей структуре, итоги регистров и блокировки обходятся, база разрушается без внешних признаков. В 1С данные попадают только через её объекты.
Как настроить передачу данных на сервер по расписанию
Ручную кнопку «Отправить» быстро забывают нажимать. Передачу ставят на автомат одним из способов.
Регламентное задание
Регламентное задание создают в Конфигураторе, в ветке Общие → Регламентные задания. В нём указывают метод общего модуля (модуль должен быть серверным) и расписание: например, каждые 600 секунд с 8:00 до 22:00.
Нюансы режимов работы:
- 🖥 Клиент-серверная база . Задания выполняет сервер 1С. Проверьте, что в свойствах базы в консоли администрирования кластера не стоит флаг «Блокировка регламентных заданий включена».
- 📁 Файловая база. Задания выполняются в сеансе одного из запущенных клиентов. Нет открытых сеансов — нет и отправки.
В типовых конфигурациях на БСП управлять заданиями удобно без Конфигуратора: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Там же видно время последнего запуска и текст ошибки.
Планировщик Windows
Для файловой базы, где никто не держит сеанс открытым, остаётся Планировщик заданий Windows. Он запускает 1С с внешней обработкой:
"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE /F "D:\Bases\Trade" /N "Обмен" /P "пароль" /Execute "D:\Exchange\SendData.epf" /DisableStartupMessages
Обработка в обработчике ПриОткрытии выполняет отправку и закрывает приложение через ЗавершитьРаботуСистемы(Ложь). Пароль в командной строке виден в настройках задачи — для этого пользователя выдайте только права на обмен.
Регистрация изменений и повторы
Расписание и выбор изменений связаны. При сбое отправки регистрацию не снимайте — объекты уйдут при следующем запуске. Так передача становится устойчивой без отдельной очереди.
Ошибки обмена и журнал регистрации
Код отправки всегда оборачивают в Попытка … Исключение. Иначе одна сетевая ошибка остановит регламентное задание, и вы узнаете об этом от менеджера сайта.
Попытка
ОтправитьНаСервер(Данные);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Обмен с сервером.Отправка",
УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
КонецПопытки;
Своё имя события через точку — Обмен с сервером.Отправка — позволяет отфильтровать записи в журнале. Журнал открывают в пользовательском режиме: Администрирование → Обслуживание → Журнал регистрации, отбор по событию.
Что ещё стоит логировать:
- 📌 код ответа сервера и первые 1–2 тысячи символов тела ответа;
- 📌 число переданных объектов и время отправки;
- 📌 идентификатор пакета, чтобы найти его на стороне сервера.
Тело запроса целиком в журнал не пишите: там могут быть персональные данные, а журнал читает любой администратор.
Защита данных при передаче на сервер
Данные из 1С — это цены, контрагенты, иногда сотрудники. Канал до сервера нужно закрыть так же серьёзно, как саму базу.
Канал
- 🔒 Только HTTPS. Обычный HTTP передаёт тело и токен открытым текстом.
- 🔒 Проверка сертификата сервера включена — это защита от подмены адреса.
- 🔒 Для FTP — FTPS или перевод на HTTPS. Пароль обычного FTP идёт открытым текстом.
Учётные данные
Токен и пароли не вписывайте в код и в константы, которые видны любому пользователю. В конфигурациях на БСП для этого есть безопасное хранилище: ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище и ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища. Доступ к нему есть только в привилегированном режиме.
Для обмена заведите отдельного пользователя 1С с ролью, которая читает только нужные объекты. Если токен утёк, его отзывают на сервере, не трогая рабочие учётные записи.
Сервер-приёмник
- 🛡 Разрешите приём только с внешнего IP вашей организации.
- 🛡 Делайте приём идемпотентным: повторный пакет с тем же идентификатором не создаёт дублей.
- 🛡 Персональные данные передавайте только в объёме, который нужен для задачи. Обработка таких данных на стороннем сервере подпадает под требования закона о персональных данных.
Частые вопросы
Можно ли отправлять данные на сервер из клиентского кода?
Как сделать, чтобы сервер сам забирал данные из 1С?
Администрирование → Публикация на веб-сервере. Дальше два варианта: свой HTTP-сервис в конфигурации или расширении либо стандартный интерфейс OData — флажок в окне публикации и настройка состава объектов.Работает ли HTTPСоединение через прокси?
ИнтернетПрокси. Задайте в нём адрес и порт прокси, логин и пароль, если они нужны.Как передать файл, а не JSON?
УстановитьИмяФайлаТела у HTTPЗапрос или через УстановитьТелоИзДвоичныхДанных. Заголовок Content-Type выставьте под тип файла, например application/pdf.Подойдёт ли это для 1С:Фреш или облачной базы?
Источники
- Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных»