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

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

Как загрузить файл в 1С программно

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

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

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

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

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

В клиент-серверной архитектуре 1С код формы выполняется на компьютере пользователя, а обращение к базе данных и файловой системе сервера — только в серверных процедурах. Прямой путь вида C:\Документы\прайс.xlsx, указанный в серверной процедуре, будет искаться на диске сервера, а не на машине пользователя.

Для передачи данных между контекстами платформа предоставляет временное хранилище — область памяти, доступную и клиенту, и серверу. Клиент помещает туда файл и получает адрес хранилища (строку вида e1cib/tempstorage/...), а серверная процедура извлекает данные по этому адресу.

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

Загрузка файла с диалогом выбора: НачатьПомещениеФайла

Метод НачатьПомещениеФайла — основной способ интерактивной загрузки в управляемом приложении. Он асинхронный: результат приходит в описание оповещения, а не возвращается напрямую. Это требование платформы, так как синхронные вызовы в веб-клиенте не поддерживаются.

Пример клиентской процедуры кнопки «Загрузить»:

&НаКлиенте

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

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

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

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

&НаКлиенте

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

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

Возврат; // пользователь отменил выбор

КонецЕсли;

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

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

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

Серверная часть получает данные по адресу хранилища:

&НаСервере

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

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

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

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

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

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

Порядок действий при интерактивной загрузке
  1. 1
    Создайте клиентскую процедуру команды и вызовите НачатьПомещениеФайла с описанием оповещения
  2. 2
    В процедуре оповещения проверьте параметр Результат — при отмене выбора он равен Ложь
  3. 3
    Передайте адрес временного хранилища и имя файла в серверную процедуру
  4. 4
    На сервере получите двоичные данные методом ПолучитьИзВременногоХранилища
  5. 5
    При необходимости запишите данные во временный файл и обработайте его
  6. 6
    Проверьте результат: данные записаны в базу или выведено сообщение об ошибке

Загрузка без диалога: пакетная обработка и НачатьПомещениеФайлов

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

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

Если файл уже находится на сервере (в каталоге, доступном учётной записи агента сервера 1С), клиентская передача вообще не требуется: серверная процедура читает файл напрямую через Новый ДвоичныеДанные(ПутьКФайлу) или текстовые объекты. Это самый быстрый вариант для регламентных загрузок по расписанию.

Сравнение способов загрузки

НачатьПомещениеФайла (интерактивно)

Пользователь выбирает файл в диалоге. Подходит для разовой загрузки в формах. Требует расширения работы с файлами в веб-клиенте.

НачатьПомещениеФайлов (пакетно)

Загрузка нескольких файлов за один вызов. Подходит для импорта наборов изображений и документов.

Чтение напрямую на сервере

Файл читается с диска сервера без участия клиента. Подходит для регламентных заданий и обменов, но требует доступа учётной записи сервера к каталогу.

ПоместитьФайл (синхронный)

Устаревший синхронный метод обычного приложения. В управляемых формах и веб-клиенте работает ограниченно или не работает вовсе.

Что делать с файлом на сервере: типовые сценарии обработки

Сохранение в присоединённые файлы

Чаще всего загруженный файл нужно привязать к объекту базы — элементу справочника или документу. В типовых конфигурациях на БСП для этого есть программный интерфейс РаботаСФайлами.ДобавитьФайл() (в новых версиях — модуль РаботаСФайлами). В собственных конфигурациях файл сохраняют в реквизит типа ХранилищеЗначения, упаковав двоичные данные в Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)).

Чтение табличных данных (Excel, MXL)

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

Загрузка изображений

Картинки из двоичных данных создаются конструктором Новый Картинка(ДвоичныеДанные). Для отображения в форме без записи в базу картинку помещают во временное хранилище методом ПоместитьВоВременноеХранилище и присваивают адрес реквизиту формы типа «Строка», связанному с полем картинки.

&НаСервере

Процедура ПоказатьКартинку(Адрес)

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

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

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

Загрузка файла на сервер напрямую: НачатьПомещениеФайлаНаСервер

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

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

&НаКлиенте

Процедура ЗагрузитьНаСерверНапрямую(Команда)

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

ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();

ПараметрыЗагрузки.Интерактивно = Истина;

ФайловаяСистемаКлиент.ЗагрузитьФайл(Оповещение, ПараметрыЗагрузки);

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

Программный интерфейс ФайловаяСистемаКлиент из БСП — рекомендуемая обёртка: она скрывает различия между тонким, толстым и веб-клиентом и корректно обрабатывает отказ от расширения работы с файлами.

Особенности веб-клиента и расширение работы с файлами

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

Проверить доступность расширения и предложить установку можно методами НачатьПодключениеРасширенияРаботыСФайлами и НачатьУстановкуРасширенияРаботыСФайлами. При использовании БСП эти проверки уже встроены в ФайловаяСистемаКлиент.

Ещё одно ограничение веб-клиента — объём передаваемых данных. Очень большие файлы (сотни мегабайт) могут не помещаться во временное хранилище или передаваться слишком долго. Для таких случаев файл лучше класть в сетевой каталог, доступный серверу, и читать напрямую на сервере.

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

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

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

Если файл записывается в базу, проверьте результат повторным чтением: извлеките данные из хранилища значений и сравните размер с исходным. Для изображений — отобразите картинку в форме, для табличных документов — выведите несколько ячеек в сообщение.

При ошибках «файл не найден» на сервере первым делом проверьте, в каком контексте выполняется код и чей это путь — клиента или сервера. При ошибках доступа к сетевому каталогу убедитесь, что у учётной записи, под которой работает агент сервера 1С, есть права на чтение этого каталога.

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

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

Адрес временного хранилища
Норма

Строка не пустая, ЭтоАдресВременногоХранилища(Адрес) возвращает Истина

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

Пустая строка или Неопределено — файл не был помещён

Двоичные данные на сервере
Норма

ТипЗнч = ДвоичныеДанные, Размер() больше нуля

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

Неопределено или нулевой размер — данные не дошли или хранилище очищено

Запись в базу
Норма

Повторное чтение из реквизита возвращает данные того же размера

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

Реквизит пуст или данные обрезаны

Доступ к сетевому каталогу
Норма

Серверная процедура читает файл без исключений

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

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

FAQ

Как загрузить файл в 1С без диалога выбора, если путь известен?

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

Почему в серверной процедуре возникает ошибка «файл не найден», хотя файл точно есть?

Серверная процедура выполняется на сервере 1С и видит его файловую систему, а не диск пользователя. Путь вида C:\Users\...\файл.xlsx на сервере не существует. Передавайте файл через временное хранилище с клиента, а не путь к нему.

Какой метод использовать вместо устаревшего ПоместитьФайл?

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

Как ограничить выбор файлов определённым форматом?

В интерактивном режиме платформа показывает стандартный диалог; фильтр задаётся через параметры диалога выбора файла (ДиалогВыбораФайла со свойством Фильтр, например: "Файлы Excel (.xlsx)|.xlsx"). Дополнительно проверяйте расширение в коде после выбора — пользователь может ввести имя вручную.

Чем НачатьПомещениеФайлаНаСервер отличается от НачатьПомещениеФайла?

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

Как загрузить большой файл, если веб-клиент не справляется?

Скопируйте файл в сетевой каталог, доступный серверу 1С, и читайте его напрямую в серверной процедуре — это исключает передачу данных через браузер. Альтернатива — разбить обмен на части через собственный механизм или использовать тонкий клиент, где ограничения мягче.

Итог

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

Загрузка файла в 1С строится по схеме: клиент помещает файл во временное хранилище (НачатьПомещениеФайла), сервер извлекает двоичные данные по адресу и обрабатывает их. Используйте асинхронные методы, всегда проверяйте отмену выбора и тип полученных данных, а для регламентных загрузок читайте файлы напрямую с диска сервера.