При разработке сложных механизмов на платформе 1С:Предприятие часто возникает задача передачи файлов из клиентской части системы в фоновое задание для их последующей обработки. Многих разработчиков ставит в тупик ситуация, когда адрес временного хранилища, полученный на клиенте, оказывается недоступным внутри кода фонового задания — метод ПолучитьИзВременногоХранилища возвращает Неопределено. Давайте разберемся, почему так происходит и какие существуют способы решения этой архитектурной задачи.
Временное хранилище в 1С привязано к конкретному сеансу работы пользователя и контексту формы. Когда вы помещаете файл во временное хранилище с помощью НачатьПомещениеФайла, создается временный объект, доступный для обращения только в пределах того сеанса, в котором он был создан.
Фоновое задание, в свою очередь, запускается в отдельном сеансе. С точки зрения безопасности и изоляции данных платформы, фоновое задание не имеет прав доступа к «чужой» области памяти (временному хранилищу основной формы). Именно поэтому при попытке чтения по адресу, переданному в качестве параметра, вы получаете пустое значение. Это не ошибка платформы, а особенность ее архитектуры, обеспечивающая стабильность и безопасность работы сервера.
Чтобы успешно передать файл для обработки в фоновом задании, необходимо изменить подход к передаче параметров. Мы рассмотрим самый надежный и распространенный метод — использование типа ДвоичныеДанные.
Вместо того чтобы надеяться на «ссылку» в виде адреса временного хранилища, мы должны передать непосредственно сам контент файла. Платформа 1С умеет сериализовать объект ДвоичныеДанные при передаче параметров в фоновое задание. Это гарантирует, что данные будут доставлены в изолированный сеанс фонового процесса.
Рассмотрим пошагово, как реализовать этот подход:
ДвоичныеДанные. Это делается непосредственно в процедуре завершения после выбора файла пользователем.ПрисоединенныеФайлы или отправке по API).Пример кода для реализации передачи через ДвоичныеДанные:
// В коде формы (Клиент)
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
// Читаем файл в двоичные данные, чтобы передать их напрямую
ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
ПараметрыЗапуска = Новый Структура;
ПараметрыЗапуска.Вставить("ДанныеФайла", ДанныеФайла);
// Запускаем фоновое задание, передавая объект напрямую
ИдентификаторЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска);
КонецПроцедуры
Использование ДвоичныеДанные имеет свои особенности, которые важно учитывать:
ДвоичныеДанные передаются как параметр вызова, очень большие файлы (размером в сотни мегабайт или гигабайты) могут вызвать ошибку нехватки оперативной памяти на сервере 1С.Если вы планируете работать с файлами очень большого объема, рекомендуем использовать комбинированный подход: вместо передачи данных в параметрах, сохраняйте файл во временный каталог на сервере (через Записать у объекта ДвоичныеДанные), а в параметры фонового задания передавайте только путь к этому файлу на диске сервера. В этом случае фоновое задание самостоятельно прочитает файл с диска, выполнит необходимые действия и удалит его после завершения обработки.
Подводя итог, проанализированная ситуация показывает, что попытка использования временного хранилища как средства коммуникации между сеансами является неверной практикой. Передача объектов напрямую или через промежуточное хранение на диске сервера обеспечит вашему коду стабильность и исключит появление ошибки Неопределено при обращении к данным.