Администрирование · 12 мин
Как получить файл с сервера 1С
Как получить файл с сервера 1С: через конфигуратор, веб-клиент, файловую шару и код на встроенном языке. Пошаговые инструкции, ограничения и типичные ошибки.
Задача «получить файл с сервера 1С» возникает в нескольких типовых ситуациях: пользователю нужно выгрузить отчёт или обработку, сформированную на сервере; разработчику — передать файл из серверной процедуры на клиент; администратору — забрать журнал, бэкап или файл обмена, лежащий в каталоге сервера. В каждом случае механизм разный, и ошибка в выборе приводит либо к неработающему коду, либо к дыре в безопасности.
Ключевой момент, который нужно понять сразу: в клиент-серверном режиме код на сервере и код на клиенте выполняются на разных машинах. Файл, созданный серверной процедурой, физически лежит на диске сервера, и клиент его «не видит», пока файл явно не будет передан. Поэтому прямое обращение к пути вида C:\... из клиентского кода не сработает — такой путь существует только на сервере.
Ниже разобраны основные способы получения файла: программная передача на клиент, работа через временное хранилище, доступ по сети к каталогу сервера и получение файлов из информационной базы. Для каждого способа указаны условия применения, ограничения и типичные ошибки.
Определяем, где находится файл и кто его запрашивает
Прежде чем выбирать инструмент, ответьте на три вопроса. Первый: файл лежит на диске сервера (результат выгрузки, лог, файл обмена) или хранится внутри информационной базы (присоединённый файл, двоичные данные в реквизите)? Второй: файл нужен пользователю в интерактивном режиме или его должен забрать другой программный код? Третий: работа происходит в тонком/толстом клиенте или в веб-клиенте, где возможности сильно ограничены?
От ответов зависит маршрут. Файл на диске сервера для пользователя передаётся через временное хранилище и диалог сохранения. Файл из базы сначала извлекается во временный каталог сервера, затем передаётся тем же способом. Для обмена между системами удобнее сетевой каталог или HTTP-сервис. В веб-клиенте единственный рабочий путь — передача через хранилище с последующим скачиванием браузером.
Как выбрать способ
Передача файла с сервера на клиент через временное хранилище
Штатный механизм платформы — временное хранилище. Серверная процедура помещает файл (или двоичные данные) в хранилище и возвращает клиенту адрес. Клиент по этому адресу забирает файл и сохраняет его локально. Так работают практически все типовые выгрузки: отчётов, печатных форм в файлы, обменов данными.
Типовая схема кода выглядит так. На сервере файл читается в двоичные данные и помещается в хранилище:
&НаСервере
Функция ПодготовитьФайлНаСервере(ПутьКФайлу)
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
Возврат Адрес;
КонецФункции
На клиенте файл запрашивается по полученному адресу:
&НаКлиенте
Процедура СохранитьФайл(Команда)
Адрес = ПодготовитьФайлНаСервере(ПутьНаСервере);
НачатьПолучениеФайлаССервера(Новый ОписаниеОповещения("ПослеПолучения", ЭтотОбъект), Адрес, "Выгрузка.xml");
КонецПроцедуры
Важная деталь: время жизни данных в хранилище ограничено. Если передать адрес без привязки к форме, хранилище очистится после завершения серверного вызова, и клиент получит ошибку. Поэтому вторым параметром ПоместитьВоВременноеХранилище передают уникальный идентификатор формы — тогда данные живут, пока открыта форма. Для длительного хранения адрес сохраняют в реквизит и получают файл позже.
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
НачатьПолучениеФайлаССервера(Оповещение, Адрес, ИмяФайла);Получение присоединённого файла из информационной базы
Если файл хранится в базе (например, в справочнике присоединённых файлов типовых конфигураций), его сначала нужно извлечь. В типовых решениях для этого есть функции работы с файлами — они возвращают двоичные данные или сразу адрес во временном хранилище. В самописной конфигурации двоичные данные обычно лежат в реквизите типа «ХранилищеЗначения».
Порядок действий в серверном коде: получить значение из хранилища значений методом Получить(), при необходимости записать данные во временный файл методом Записать(), поместить в хранилище и вернуть адрес клиенту. Дальше клиент сохраняет файл стандартно, как описано выше. Для больших файлов запись во временный каталог сервера предпочтительнее, чем передача целиком через память в одном вызове, — так меньше риск упереться в ограничения по объёму передаваемых данных.
Проверяйте, что файл действительно существует в базе: пустое хранилище значений вернёт Неопределено, и попытка записать его в файл вызовет исключение. Корректная обработка этой ситуации избавит пользователя от непонятных ошибок.
- 1Найдите объект с присоединённым файлом в базе
- 2Извлеките двоичные данные из хранилища значений методом Получить()
- 3Проверьте, что данные не равны Неопределено
- 4Поместите данные во временное хранилище с привязкой к форме
- 5На клиенте вызовите НачатьПолучениеФайлаССервера и укажите имя файла
- 6Проверьте, что файл сохранился и открывается
Доступ к файлу по сети: каталог сервера и общие ресурсы
Когда файл нужен не разовому пользователю, а другой системе или администратору, проще открыть сетевой доступ к каталогу на сервере. Это стандартная файловая шара Windows или NFS/SMB-ресурс на Linux. Клиент обращается к файлу по пути вида \\SERVER\Exchange\output.xml обычными средствами — проводником, скриптом или кодом 1С с явным указанием пути.
У способа есть жёсткие требования к безопасности. Давайте на шару только те права, которые реально нужны: чтение для потребителей файлов, запись — только учётной записи, под которой работает сервер 1С. Открытый на запись для всех каталог — типичный источник проблем: от случайного удаления файлов обмена до попадания вредоносного ПО на сервер. Учтите также, что серверный код 1С выполняется под учётной записью службы агента сервера, и именно ей нужны права на запись в каталог.
Ещё одно ограничение: сетевой путь должен быть одинаково доступен со всех рабочих процессов кластера, если их несколько. В кластере из нескольких серверов локальный диск одного из узлов не подходит — файл, записанный одним процессом, может оказаться недоступен другому. Используйте выделенный сетевой ресурс, единый для всего кластера.
Особенности работы в веб-клиенте
В веб-клиенте у кода нет прямого доступа ни к диску сервера, ни к диску пользователя. Единственный легальный путь получения файла — временное хранилище: сервер помещает файл, браузер скачивает его по адресу хранилища как обычную загрузку. Методы работы с файловой системой (Новый Файл, чтение каталогов) на клиенте в браузере недоступны.
Практическое следствие: если обработка должна работать и в тонком, и в веб-клиенте, весь код передачи файлов пишите через хранилище и асинхронные методы с оповещениями. Синхронные вызовы получения файлов в веб-клиенте не поддерживаются, и код, работающий в тонком клиенте, может молча не выполниться в браузере. Проверяйте оба режима перед сдачей доработки.
Получение служебных файлов: логи, выгрузки, бэкапы
Отдельный класс задач — файлы, которые нужны администратору: технологический журнал кластера, журнал регистрации, выгруженная база (.dt), файлы обмена. Здесь не нужен код 1С — файлы забираются средствами операционной системы с самого сервера или по сети.
Технологический журнал пишется в каталог, заданный в конфигурационном файле logcfg.xml; без него журнал не ведётся. Журнал регистрации в клиент-серверном режиме хранится в каталоге информационной базы кластера в формате 1Cv8.lgd — его можно открыть конфигуратором или выгрузить стандартной функцией. Файл .dt создаётся через конфигуратор (Администрирование → Выгрузить информационную базу) с указанием пути на диске — помните, что при запуске с клиентской машины путь относится к клиенту, а не к серверу.
Для регулярного забора файлов (например, ежедневных выгрузок обмена) настройте скрипт копирования по расписанию на самом сервере: планировщик заданий Windows или cron на Linux. Это надёжнее, чем заходить вручную, и исключает ситуацию, когда файл обмена неделями копится на сервере и никто его не забирает.
Как проверить результат
Файл открывается, размер больше нуля, содержимое соответствует ожиданию
Файл нулевого размера или не открывается — вероятно, хранилище очистилось до получения
Сервер вернул адрес хранилища, клиент сохранил файл без исключений
Ошибка «файл не обнаружен» — путь указан относительно клиента, а не сервера
Каталог открывается по UNC-пути с нужной учётной записью
Отказано в доступе — нет прав у учётной записи службы сервера 1С
Типичные ошибки и ограничения
Самая частая ошибка — путаница контекстов: серверная процедура записывает файл по пути, который существует только на клиенте, или наоборот. Симптом — ошибка «файл не обнаружен» при том, что файл визуально на месте. Лечится явным разделением: сервер работает только с серверными путями, передача на клиент — только через хранилище.
Вторая группа проблем — права. Код сервера выполняется под учётной записью службы агента сервера 1С (часто USR1CV8), и у неё может не быть доступа к «очевидным» каталогам вроде рабочего стола администратора. Третья типичная ситуация — попытка передать большой файл целиком через хранилище без привязки к форме: хранилище очищается, и клиент получает пустой результат. Наконец, в веб-клиенте любые прямые обращения к файловой системе заведомо обречены.
Частые вопросы
Как передать файл с сервера на клиент без диалога сохранения?
Используйте НачатьПолучениеФайлаССервера с явным указанием полного пути сохранения на клиенте и без вызова диалога. Учтите, что в веб-клиенте сохранение всегда идёт через механизм загрузки браузера, и полностью скрыть его от пользователя нельзя. В тонком клиенте автоматическое сохранение возможно, если у клиента есть права на целевой каталог.
Почему код работает в файловой базе, но не работает на сервере?
В файловом режиме клиент и «сервер» выполняются на одной машине, поэтому пути совпадают и ошибки контекста не проявляются. В клиент-серверном режиме серверная процедура видит только диски сервера. Разделите код: сервер готовит файл и возвращает адрес хранилища, клиент забирает файл по адресу.
Как получить файл, если работаю в веб-клиенте?
Только через временное хранилище: серверная процедура помещает файл по адресу, браузер скачивает его как обычную загрузку. Прямой доступ к файловой системе из веб-клиента невозможен по архитектурным причинам, обходных путей внутри платформы нет.
Куда сервер 1С пишет временные файлы?
В каталог временных файлов операционной системы той учётной записи, под которой работает служба агента сервера. Получить путь в коде можно функцией ПолучитьИмяВременногоФайла(). Рассчитывать на постоянное расположение не стоит: временные файлы подлежат удалению сразу после использования.
Как безопасно открыть каталог сервера для обмена файлами?
Создайте отдельный каталог вне системных папок и каталогов кластера, дайте право записи только учётной записи службы сервера 1С и право чтения — потребителям файлов. Не используйте для обмена каталог информационной базы, технологического журнала или резервных копий. Периодически очищайте каталог от устаревших файлов.
Что делать, если файл большой и не передаётся через хранилище?
Разбейте передачу на части: читайте файл порциями через ЧтениеДанных и собирайте на клиенте, либо переложите доставку на сетевой каталог или HTTP-сервис. Для файлов обмена большого объёма сетевой каталог обычно надёжнее, чем передача целиком через сеанс пользователя.
Что важно запомнить
Сервер и клиент 1С работают на разных машинах, поэтому файл с сервера всегда передают явно: через временное хранилище — для пользователя, через сетевой каталог — для систем и администраторов. Привязывайте хранилище к форме, проверяйте права учётной записи службы сервера и помните, что в веб-клиенте доступен только механизм скачивания через хранилище.