Работа с файловой системой на стороне сервера — это базовая задача для любого разработчика 1С, особенно когда речь заходит о регламентных заданиях. Часто возникает ситуация, когда процедура, выполняемая по расписанию, должна подготовить отчет или выгрузку и отправить её на внешний ресурс. В этой статье мы подробно разберем, как правильно организовать процесс сохранения данных на диск и их последующую передачу по протоколу FTP, учитывая все нюансы клиент-серверной архитектуры.
Прежде всего, нам необходимо осознать ключевое ограничение: серверный код не имеет доступа к клиентскому окружению. Если ваша процедура выполняется в контексте регламентного задания, она «не знает» о существовании локальных дисков пользователя (например, диска «C:» на вашем компьютере) и не может вызвать функции из клиентских модулей. Рассмотрим, как обойти эти ограничения и правильно настроить среду для работы.
Проанализируем ситуацию с правами доступа. Сервер «1С:Предприятия» работает от имени специальной системной учетной записи (например, usr1cv8). Это означает, что любые операции с диском будут ограничены правами именно этой записи. Если вы планируете сохранять файлы в произвольную папку на сервере, убедитесь, что у данной учетной записи есть права на «Запись» и «Изменение» в этой директории.
Для временного хранения данных перед отправкой на FTP лучше всего использовать стандартные механизмы платформы. Это гарантирует, что ваш код будет работать корректно вне зависимости от того, на каком диске установлена операционная система. Разберем по шагам, как создать временный файл:
КаталогВременныхФайлов(), чтобы получить путь к системной временной папке сервера.ПолучитьИмяВременногоФайла() для генерации уникального имени, чтобы избежать конфликтов при одновременном выполнении нескольких заданий.Посмотрим на пример кода, который объединяет эти действия:
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
// Платформа сама подберет путь в КаталогВременныхФайлов()
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку("Данные для выгрузки");
ЗаписьТекста.Закрыть();
Если вы используете Библиотеку стандартных подсистем (БСП), можно воспользоваться более продвинутыми методами, такими как СтандартныеПодсистемыСервер.СоздатьКаталогВременныхФайлов(). Это позволит структурировать временные данные, создавая подпапки для конкретных задач.
После того как файл успешно сформирован и записан на серверный диск, его необходимо передать. Объект FTPСоединение отлично работает на сервере. Рассмотрим подробнее, на что стоит обратить внимание при написании кода отправки.
Важнейшим параметром является пассивный режим. В современных сетях серверы 1С часто находятся за брандмауэрами или NAT. Активный режим FTP в таких условиях работать не будет, так как он требует от FTP-сервера инициировать входящее соединение к серверу 1С. Всегда устанавливайте параметр ПассивноеСоединение в значение ИСТИНА.
Пример надежной реализации отправки файла:
ПараметрыФТП = Новый Структура("Хост, Порт, Пользователь, Пароль, Каталог", "ftp.example.com", 21, "admin", "password", "/uploads");
ПассивныйРежим = Истина;
Попытка
Соединение = Новый FTPСоединение(ПараметрыФТП.Хост, ПараметрыФТП.Порт, ПараметрыФТП.Пользователь, ПараметрыФТП.Пароль, , ПассивныйРежим);
Соединение.УстановитьТекущийКаталог(ПараметрыФТП.Каталог);
// ИмяФайла — это полный путь к файлу на диске сервера
Соединение.Записать(ИмяФайла, "export_data.xml");
// Обязательно удаляем временный файл после успешной отправки
УдалитьФайлы(ИмяФайла);
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаФайла", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Выясним причину возможных сбоев при работе с сетевыми ресурсами. Если вам нужно выгрузить файл не на FTP, а в общую сетевую папку (SMB), помните:
Z:\Public), так как они подключаются в сеансе пользователя, а не службы.\\ServerName\FolderName\File.txt.Проанализируем также ситуацию с протоколами. Стандартное FTPСоединение поддерживает обычный FTP и защищенный FTPS. Однако оно не поддерживает SFTP (SSH File Transfer Protocol). Если ваш контрагент требует использования SFTP, вам придется использовать внешние компоненты или запускать командную строку (например, через ЗапуститьПриложение с утилитой WinSCP или curl).
Если ваша задача подразумевает выгрузку гигабайтов данных, важно следить за оперативной памятью сервера. Не пытайтесь сначала сформировать огромную строку в памяти, а потом записать её в файл. Используйте потоковую запись с помощью объектов ЗаписьТекста, ЗаписьXML или ЗаписьДанных. Эти объекты записывают информацию на диск порциями, что позволяет держать потребление памяти на низком уровне независимо от размера итогового файла.
В современной среде сервер 1С часто работает под управлением Linux. Чтобы ваш код был универсальным, мы рекомендуем использовать функцию ПолучитьРазделительПути() вместо жестко прописанных слешей. Помним, что в Linux регистр символов в именах файлов имеет значение: File.txt и file.txt — это два разных файла.
Всегда используйте блок Попытка...Исключение...КонецПопытки. Работа с внешними ресурсами (диск, сеть, FTP) — это всегда зона риска. В блоке исключения обязательно фиксируйте ошибку в Журнале регистрации, чтобы администратор мог оперативно узнать о проблеме. И, конечно, не забывайте про вызов УдалитьФайлы(). Временные каталоги сервера могут быстро переполниться, если регламентные задания будут оставлять за собой «мусор».
Таким образом, мы рассмотрели полный цикл выгрузки: от создания временного файла с учетом прав доступа до его безопасной передачи по сети. Следуя этим правилам, вы обеспечите стабильную работу ваших фоновых процессов в 1С.