Передача данных между различными информационными базами «1С:Предприятие» — это классическая задача интеграции. Однако, когда процесс должен происходить полностью автоматически через РегламентныеЗадания, возникает ряд технических нюансов, связанных с серверным контекстом исполнения кода. В этой статье мы подробно разберем, как организовать надежный обмен файлами, когда и отправитель, и получатель работают в фоновом режиме на стороне сервера.
Рассмотрим стандартную ситуацию: в информационной базе «Источник» работает регламентное задание, которое формирует файл (например, выгрузку в формате XML, JSON или Excel). В базе «Приемник» также настроено регламентное задание, которое должно этот файл прочитать и обработать. Основная сложность заключается в том, что код выполняется на сервере под учетной записью службы 1С, и привычные пользователю методы (выбор файла через диалоговое окно или сохранение на рабочий стол) здесь недоступны.
Это самый простой и интуитивно понятный способ, который чаще всего используется в локальных сетях. Однако именно здесь программисты совершают больше всего ошибок. Разберем по шагам, как настроить этот процесс правильно.
Нюанс контекста безопасности
По умолчанию служба сервера 1С (часто это пользователь USR1CV8) работает под локальной системной учетной записью. Эта запись не имеет прав на доступ к сетевым ресурсам других компьютеров. Чтобы регламентное задание смогло записать файл в «шару», необходимо выполнить одно из условий:
Работа с путями (UNC)
Забудьте про использование букв дисков (например, Z:\Exchange\). Логические диски создаются в рамках сессии конкретного пользователя и не видны серверной службе. Всегда используйте полные UNC-пути. Проанализируем пример кода для записи файла:
ИмяПути = "\\Server-Data\Exchange\Export_Data.xml";
ДвоичныеДанныеФайла = СформироватьФайлВыгрузки(); // Ваша функция формирования данных
ДвоичныеДанныеФайла.Записать(ИмяПути);
При использовании Записать() на сервере система напрямую обращается к файловой системе. Если права настроены верно, файл появится в сетевом каталоге, откуда его сможет забрать «Приемник» аналогичным образом через ДвоичныеДанные = Новый ДвоичныеДанные(ИмяПути);.
Если базы находятся в разных сетях или вы хотите построить более современную и масштабируемую архитектуру, использование HTTP-сервисов будет лучшим решением. В этом случае база «Приемник» выступает в роли сервера, а «Источник» — в роли клиента.
Преимущества метода:
Рассмотрим пример отправки файла из базы «Источника»:
Соединение = Новый HTTPСоединение("server-priemnik.ru", , "Логин", "Пароль");
Запрос = Новый HTTPЗапрос("/v1/file_receiver");
Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеФайла);
Ответ = Соединение.ОтправитьДляОбъекта(Запрос, "POST");
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Обмен", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка передачи файла");
КонецЕсли;
Важный момент: При использовании классических ВебСервисы (SOAP) данные кодируются в Base64. Это увеличивает объем передаваемого трафика на 33% и создает нагрузку на память сервера. Для больших файлов лучше использовать именно HTTPСервисы, передавая двоичные данные напрямую в теле запроса.
В современных реалиях, особенно при работе в облачных инфраструктурах, удобно использовать S3-совместимые хранилища (например, Яндекс.Облако, AWS или локальный MinIO). Проанализируем схему работы:
Этот метод полностью решает проблему «где хранить», так как хранилище доступно из любой точки мира, где есть интернет, и обеспечивает высокую надежность хранения данных.
Старый и проверенный метод. В 1С для этого предназначен объект ФТПСоединение. Он позволяет регламентному заданию подключиться к удаленному серверу и выгрузить/загрузить файл. Это удобно, если у вас уже есть выделенный FTP-сервер для обмена данными с контрагентами или другими системами.
Соединение = Новый ФТПСоединение("ftp.myserver.ru", 21, "ftp_user", "password");
Соединение.УстановитьТекущийКаталог("/exchange/data");
Соединение.Записать(ИмяЛокальногоФайла, "data.xml");
Если ваша база 1С работает на кластере из нескольких серверов, нужно быть предельно осторожными с временными файлами. Выясним причину возможной ошибки: регламентное задание может начаться на сервере №1 и создать файл в локальном каталоге КаталогВременныхФайлов(), а попытка чтения (в другой базе или в этом же задании после перезапуска) может произойти на сервере №2, где этого файла нет.
Рекомендации для кластера:
Выбор метода зависит от вашей инфраструктуры:
USR1CV8).Помните, что при работе регламентных заданий критически важно логировать все этапы обмена в ЖурналРегистрации, так как визуально отследить ошибку в фоновом процессе невозможно.