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

Архитектура платформы строго разграничивает клиентскую и серверную части исполнения кода. Файловая система клиента и сервера — это разные пространства, доступ к которым регулируется контекстом выполнения. Прямое копирование пути «C:\Users\...\file.txt» в серверный код не сработает, так как сервер не увидит локальный диск пользователя.

Для решения задачи передачи данных используется механизм двоичных данных. Файл считывается на клиенте в оперативную память в виде объекта ДвоичныеДанные, после чего передается в серверный контекст, где записывается в нужное расположение. Этот подход универсален и работает как в тонком клиенте, так и в веб-клиенте.

Архитектурные особенности работы с файлами в 1С

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

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

⚠️ Внимание: При работе в режиме веб-клиента (через браузер) доступ к файловой системе клиента еще более ограничен. Браузер не позволит скрипту 1С просто так прочитать файл с диска без явного действия пользователя, такого как выбор файла через диалог открытия.

Основным посредником в этом процессе выступает объект ДвоичныеДанные. Он представляет собой контейнер, который может хранить содержимое файла в памяти. Этот объект является сериализуемым, что означает возможность его передачи через сеть между клиентом и сервером без потери целостности данных.

💡

Используйте тип ДвоичныеДанные как универсальный транспорт для любых файлов: изображений, документов Word, архивов ZIP или текстовых логов.

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

Чтение файла на стороне клиента

Первый этап процесса — это получение файла от пользователя. В тонком клиенте это обычно делается через стандартный диалог выбора файла. Пользователь видит привычное окно проводника Windows или интерфейса macOS и выбирает нужный документ.

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

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Заголовок = "Выберите файл для загрузки на сервер";

Диалог.Фильтр = "Текстовые файлы (.txt)|.txt|Все файлы (.)|.";

Если Диалог.Выбрать() Тогда

ПутьКФайлу = Диалог.ПолноеИмяФайла;

КонецЕсли;

После того как путь получен, необходимо считать содержимое файла. Для этого создается объект ЧтениеДвоичныхДанных. Он открывает поток чтения и загружает байты файла в объект ДвоичныеДанные. Важно закрыть поток чтения сразу после завершения операции, чтобы освободить системные ресурсы.

Полученный объект ДвоичныеДанные теперь находится в переменной клиентского контекста. Именно этот объект мы будем передавать на сервер. Обратите внимание, что сам путь к файлу на сервере использовать нельзя, передавать нужно только содержимое.

📊 Какой режим работы 1С вы используете чаще?
Тонкий клиент
Веб-клиент
Толстый клиент
Мобильное приложение

Существует нюанс при работе с кодировкой текстовых файлов. Если вы планируете обрабатывать текст на сервере, убедитесь, что чтение происходит с правильной кодировкой, либо передавайте файл как есть в бинарном виде и_decoding_уйте его уже на сервере, исходя из требований бизнес-логики.

Передача данных в серверный контекст

Чтобы передать объект ДвоичныеДанные на сервер, необходимо вызвать серверную процедуру или функцию из клиентского кода. Ключевым моментом здесь является использование ключевого слова Экспорт в объявлении серверной процедуры и передача объекта в качестве аргумента.

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

Пример вызова серверной процедуры выглядит следующим образом:

&НаКлиенте

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

// ... код выбора и чтения файла ...

ДвоичныеДанныеФайла = ПрочитатьДвоичныеДанные(ПутьКФайлу);

// Вызов серверной процедуры

ЗаписатьФайлНаСервере(ДвоичныеДанныеФайла, "отчет.txt");

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

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

⚠️ Внимание: Не пытайтесь передавать путь к файлу (строку) в серверную процедуру с расчетом, что сервер прочитает его. Это приведет к ошибке «Файл не найден», так как сервер будет искать файл на своем диске, а не на диске клиента.

Если требуется передать несколько файлов, можно использовать массив объектов ДвоичныеДанные или структуру, где ключом будет имя файла, а значением — его содержимое. Это позволит организовать пакетную загрузку документов одной операцией.

☑️ Алгоритм передачи файла

Выполнено: 0 / 5

Запись файла в серверное хранилище

Попав на сервер, данные необходимо сохранить в целевом расположении. Чаще всего целью является общая папка на файловом сервере, доступная всем пользователям, или каталог временных файлов сервера 1С. Для записи используется объект ЗаписьДвоичныхДанных.

При записи в общую папку важно учитывать права доступа учетной записи, от имени которой запущен сервис сервера 1С. Эта учетная запись должна иметь права на запись в целевой каталог операционной системы. Иначе операция завершится ошибкой доступа, даже если код написан верно.

&НаСервере

Процедура ЗаписатьФайлНаСервере(Данные, ИмяФайла) Экспорт

// Формируем полный путь на сервере

ПутьНаСервере = "D:\Shared\1C_Uploads\" + ИмяФайла;

Запись = Новый ЗаписьДвоичныхДанных(ПутьНаСервере, True);

Запись.Записать(Данные);

Запись.Закрыть();

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

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

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

Особенности записи в ХранилищеЗначения

При записи в базу данных размер файла увеличивает размер файла данных (.mdf/.ldf). Для файлов более 10 МБ рекомендуется хранить их в файловой системе, а в базе хранить только ссылку (путь).

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

Обработка ошибок и исключительных ситуаций

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

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

На сервере ошибки чаще связаны с правами доступа или отсутствием пути. Обработка исключений позволяет логировать эти события в журнал регистрации 1С для последующего анализа системным администратором.

Тип ошибки Где возникает Возможная причина Реакция системы
ФайлНеНайден Клиент Файл перемещен после выбора Сообщить пользователю
ОтказВДоступе Сервер Нет прав у службы 1С Запись в журнал, стоп
НедостаточноПамяти Сервер Слишком большой файл Прерывание сеанса
Монополизирован Клиент/Сервер Файл открыт на запись Повторить позже

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

💡

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

Особенности работы в веб-клиенте и мобильных приложениях

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

В веб-клиенте путь к файлу часто недоступен в виде строки файловой системы. Вместо этого файл сразу загружается во временное хранилище браузера и передается на сервер как поток или двоичные данные. Разработчик должен использовать методы, специфичные для работы с файлами в веб-среде.

Мобильные приложения 1С (на Android и iOS) также имеют свою песочницу файловой системы. Прямые пути вида C:\ там не работают. Необходимо использовать специальные методы платформы для доступа к галерее или документам устройства, которые возвращают данные в формате, пригодном для передачи на сервер.

⚠️ Внимание: Интерфейс и доступные методы могут меняться с обновлением платформы 1С и версий мобильных ОС. Всегда проверяйте документацию к конкретной версии платформы, если вы разрабатываете под мобильные устройства.

Для кроссплатформенной совместимости (чтобы код работал и в толстом, и в тонком, и в веб-клиенте) рекомендуется использовать универсальные объекты работы с файлами, предоставляемые библиотекой стандартных подсистем (БСП), если это возможно.

Оптимизация передачи больших объемов данных

При передаче файлов размером более 50-100 МБ стандартный механизм передачи объекта ДвоичныеДанные может стать узким местом. Данные полностью загружаются в оперативную память клиента, затем передаются по сети, буферизируются в памяти сервера и только потом записываются на диск.

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

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

💡

Для регулярной загрузки больших архивов рассмотрите возможность использования FTP-сервера или Web-сервиса, куда 1С будет отправлять только ссылку на файл, а не сам файл.

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

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

Если файл открыт на запись в другой программе (например, Excel), 1С не сможет его прочитать. Необходимо предложить пользователю закрыть файл или сохранить копию. Чтение файла, открытого только на чтение (просмотр), обычно возможно.

Можно ли передать файл без участия пользователя (автоматически)?

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

Где хранятся временные файлы при передаче?

На клиенте — во временной папке пользователя (%TEMP%). На сервере — во временной папке процесса rphost или в каталоге временных файлов, указанном в настройках кластера серверов 1С.

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

Используйте метод Размер() объекта Файл на клиенте перед чтением. Это поможет предупредить пользователя, если файл слишком велик, и избежать зависания интерфейса.

Поддерживается ли передача папок целиком?

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