К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С 8: как передать файл с клиента на сервер

Как передать файл с клиента на сервер в 1С 8: ПоместитьФайл, временное хранилище, НачатьПомещениеФайла, примеры кода, типичные ошибки и ограничения.

В клиент-серверном режиме 1С:Предприятие 8 код выполняется на двух сторонах: тонкий или толстый клиент работает на компьютере пользователя, а сервер 1С — на отдельной машине. Файл, который пользователь выбрал на своём диске, серверу напрямую недоступен: у него нет доступа к локальной файловой системе клиента. Поэтому передача файла с клиента на сервер — типовая задача при загрузке прайсов, импорте выписок, прикреплении сканов документов.

Платформа предлагает для этого встроенный механизм временного хранилища: файл сначала помещается в хранилище с клиента, а затем сервер забирает его оттуда по специальному адресу. Такой подход работает в любых клиентах — тонком, толстом, веб-клиенте — и не требует общих сетевых папок.

Ниже разобраны основные способы передачи: классический ПоместитьФайл, асинхронный НачатьПомещениеФайла, работа с ДвоичныеДанные на сервере, а также ограничения, ошибки и проверка результата.

Как устроена передача файла между клиентом и сервером

Временное хранилище — это область памяти на сервере 1С, куда клиент может поместить данные и получить в ответ уникальный адрес (строку вида e1cib/tempstorage/...). Пока адрес существует, серверный код может извлечь данные по нему. Это единственный штатный способ передать произвольный файл, не прибегая к внешним компонентам или общим каталогам.

Важно понимать направление движения данных. Методы помещения файла выполняются на клиенте, потому что именно клиент имеет доступ к локальному диску пользователя. Серверная процедура не может «сходить» за файлом на компьютер пользователя — она только забирает уже помещённые данные по адресу.

Время жизни данных в хранилище по умолчанию ограничено сеансом, но при помещении из формы можно привязать данные к уникальному идентификатору формы — тогда они будут удалены при её закрытии. Это важно для больших файлов: забытые данные в хранилище расходуют память сервера.

Способ 1. ПоместитьФайл — простой синхронный вариант

Метод ПоместитьФайл подходит для толстого клиента и небольших файлов. Он открывает диалог выбора файла, передаёт его в хранилище и возвращает адрес. В тонком и веб-клиенте синхронные вызовы могут быть недоступны или требовать расширения работы с файлами.

Типовой код на клиенте выглядит так:

&НаКлиенте

Процедура ЗагрузитьФайл(Команда)

Адрес = "";

ВыбранноеИмя = "";

Если ПоместитьФайл(Адрес, , ВыбранноеИмя, Истина, УникальныйИдентификатор) Тогда

ЗагрузитьФайлНаСервере(Адрес, ВыбранноеИмя);

КонецЕсли;

КонецПроцедуры

Серверная процедура получает данные по адресу и сохраняет их, например, во временный файл для дальнейшей обработки:

&НаСервере

Процедура ЗагрузитьФайлНаСервере(Адрес, ИмяФайла)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");

ДвоичныеДанные.Записать(ИмяВременногоФайла);

// дальнейшая обработка: чтение XML, загрузка табличного документа и т.д.

КонецПроцедуры

Обратите внимание на четвёртый параметр Интерактивно = Истина — он включает диалог выбора файла. Если имя файла уже известно (например, путь получен ранее), диалог можно не показывать.

Способ 2. НачатьПомещениеФайла — асинхронная модель

В тонком и веб-клиенте платформа настоятельно рекомендует асинхронные методы. НачатьПомещениеФайла не блокирует интерфейс и работает через описание оповещения: после завершения передачи вызывается указанная процедура.

&НаКлиенте

Процедура ЗагрузитьФайл(Команда)

Описание = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);

НачатьПомещениеФайла(Описание, , , Истина, УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмя, ДопПараметры) Экспорт

Если Результат Тогда

ЗагрузитьФайлНаСервере(Адрес, ВыбранноеИмя);

КонецЕсли;

КонецПроцедуры

Асинхронный вариант — правильный выбор для управляемых форм и веб-клиента. Синхронные вызовы в современных режимах запуска часто запрещены настройкой РежимИспользованияСинхронныхВызововРасширенийИВнешнихКомпонент, и код просто не выполнится.

Способ 3. ПоместитьФайлВоВременноеХранилище и передача без диалога

Если файл на клиенте уже сформирован программно (например, отчёт сохранён во временный файл или данные получены как ДвоичныеДанные), диалог не нужен. Используйте НачатьПомещениеФайлаВоВременноеХранилище или поместите данные напрямую:

&НаКлиенте

Процедура ПередатьДанные(Команда)

ДвоичныеДанные = Новый ДвоичныеДанные("C:\temp\price.xlsx");

Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

ОбработатьНаСервере(Адрес);

КонецПроцедуры

Здесь файл читается с диска клиента в объект ДвоичныеДанные и помещается в хранилище. Сервер получает те же двоичные данные по адресу. Такой вариант удобен для пакетной обработки нескольких файлов: можно в цикле поместить их в хранилище и передать на сервер массив адресов.

Порядок действий для передачи файла
  1. 1
    На клиенте вызовите НачатьПомещениеФайла (или ПоместитьФайл) с указанием УникальныйИдентификатор формы
  2. 2
    В обработчике оповещения проверьте Результат = Истина и получите Адрес
  3. 3
    Передайте адрес в серверную процедуру как параметр
  4. 4
    На сервере вызовите ПолучитьИзВременногоХранилища(Адрес) и получите ДвоичныеДанные
  5. 5
    Запишите данные во временный файл методом Записать() или обработайте в памяти
  6. 6
    После обработки удалите данные вызовом УдалитьИзВременногоХранилища(Адрес)

Обработка файла на сервере и ограничения

На сервере данные из хранилища приходят как ДвоичныеДанные. Дальше возможны два пути: записать их во временный файл и работать привычными объектами (ЧтениеXML, ТабличныйДокумент, ЧтениеТекста) или обработать в памяти через потоки (ПотокВПамяти, ЧтениеДанных).

Учитывайте ограничения сервера. Временный файл создаётся в каталоге временных файлов сервера 1С — у учётной записи, под которой работает агент сервера, должны быть права на запись туда. После обработки временные файлы стоит удалять явно через УдалитьФайлы(), особенно при массовой загрузке.

Для очень больших файлов (сотни мегабайт) передача через хранилище нагружает память сервера: данные целиком размещаются в оперативной памяти. В таких случаях стоит рассмотреть альтернативы — загрузку порциями, использование томов хранения файлов или передачу через общий сетевой ресурс, доступный и клиенту, и серверу.

Типичные ошибки и их причины

Самая частая проблема — попытка прочитать файл на сервере по клиентскому пути. Код вида ДвоичныеДанные = Новый ДвоичныеДанные("C:\Users\...\file.xlsx") в серверной процедуре завершится ошибкой, потому что на сервере такого пути нет. Файл всегда сначала помещается в хранилище с клиента.

Вторая типичная ошибка — потеря адреса между вызовами. Если поместить файл в хранилище без привязки к форме и обратиться к нему в другом сеансе, данных уже не будет. Передавайте адрес в серверную процедуру сразу, в рамках одного сценария.

Третья группа ошибок связана с веб-клиентом: без установленного расширения работы с файлами браузер не даст доступа к файловой системе. Пользователь увидит предложение установить расширение — это нормальное поведение платформы, а не сбой.

Типичные ошибки
01
Чтение файла по клиентскому пути на сервере — ошибка доступа, файл нужно сначала поместить в хранилище
02
Использование синхронного ПоместитьФайл при запрещённых синхронных вызовах — исключение в тонком и веб-клиенте
03
Передача адреса хранилища между сеансами — данные уже удалены, ПолучитьИзВременногоХранилища вернёт Неопределено
04
Отсутствие очистки хранилища и временных файлов — рост потребления памяти и дискового пространства сервера
05
Игнорирование параметра Результат в оповещении — обработка пустого адреса при отмене выбора файла

Проверка результата и диагностика

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

Если ПолучитьИзВременногоХранилища возвращает Неопределено, проверьте: тот ли адрес передан, не истёк ли срок жизни данных, не был ли хранилище очищено раньше. Для отладки полезно временно выводить размер полученных данных через ДвоичныеДанные.Размер() — нулевой размер указывает на проблему ещё на этапе помещения.

Контрольные точки

Как проверить результат

Возврат ПолучитьИзВременногоХранилища
Норма

Объект ДвоичныеДанные с размером больше нуля

Тревожный признак

Неопределено — адрес неверен или данные удалены

Размер полученных данных
Норма

Совпадает с размером исходного файла на клиенте

Тревожный признак

Ноль или меньше исходного — передача прервана

Запись во временный файл на сервере
Норма

Файл создан, открывается для чтения

Тревожный признак

Ошибка доступа — нет прав у учётной записи сервера 1С

Повторная загрузка
Норма

Каждая загрузка обрабатывается независимо

Тревожный признак

Старые данные — хранилище не очищается

FAQ

Можно ли передать файл с сервера на клиент?

Да, механизм зеркальный: сервер помещает данные в хранилище через ПоместитьВоВременноеХранилище, а клиент получает их методом ПолучитьИзВременногоХранилища или сохраняет через НачатьПолучениеФайла с диалогом сохранения.

Работает ли ПоместитьФайл в веб-клиенте?

Только при установленном расширении работы с файлами и если конфигурация разрешает синхронные вызовы. Надёжнее использовать асинхронный НачатьПомещениеФайла — он работает во всех клиентах.

Как передать сразу несколько файлов?

Используйте НачатьПомещениеФайлов — метод принимает массив описаний передаваемых файлов и в оповещении возвращает массив помещённых файлов с адресами. Адреса передаются на сервер списком для циклической обработки.

Как долго живут данные во временном хранилище?

По умолчанию — до конца сеанса. Если при помещении указан уникальный идентификатор формы, данные удаляются при её закрытии. Явно удалить данные можно методом УдалитьИзВременногоХранилища.

Что делать, если файл очень большой?

Разбейте загрузку на части, либо используйте общий сетевой каталог, доступный и клиенту, и серверу: клиент копирует файл туда, а сервер читает его напрямую. Это снимает нагрузку на память сервера 1С.

Почему ПолучитьИзВременногоХранилища возвращает Неопределено?

Причины: передан неверный адрес, данные уже удалены (закрыта форма, завершён сеанс или вызвано УдалитьИзВременногоХранилища), либо помещение файла было отменено пользователем, а результат не проверен.

Итог

Что важно запомнить

Передача файла с клиента на сервер в 1С 8 всегда идёт через временное хранилище: клиент помещает файл и получает адрес, сервер извлекает данные по адресу. Для управляемых форм и веб-клиента используйте асинхронный НачатьПомещениеФайла, проверяйте результат помещения и очищайте хранилище после обработки.