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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе в клиент-серверном варианте 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда данные, успешно помещенные во временное хранилище на сервере, внезапно "исчезают" при попытке их получения. Вместо ожидаемого массива, таблицы значений или двоичных данных функция ПолучитьИзВременногоХранилища возвращает Неопределено. Особенно остро эта проблема проявилась в типовых конфигурациях, таких как "Бухгалтерия предприятия 3.0", после перехода на платформу версии 8.3.12 и выше.

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

Различие в работе временного хранилища: Файловый vs Клиент-серверный режим

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

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

Анализ ошибки платформы в релизах 8.3.12 и 8.3.13

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

Решение: В таких случаях единственным надежным способом является обновление платформы до исправленных релизов (например, 8.3.12.1790, 8.3.13.1644 или актуальных версий 8.3.22+).

Влияние фоновых заданий на доступность данных

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

  1. Основной сеанс запускает фоновое задание.
  2. Фоновое задание скачивает данные и помещает их во временное хранилище.
  3. Фоновое задание возвращает адрес хранилища основному сеансу и завершается.
  4. Основной сеанс пытается прочитать данные по адресу.

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

Посмотрим на пример правильного помещения данных в фоновом задании:


// В коде фонового задания
ПоместитьВоВременноеХранилище(РезультатОбработки, АдресХранилища); 
// Где АдресХранилища был передан из формы как входной параметр

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

Проверка сериализуемости данных

Еще одна неочевидная причина — попытка поместить в хранилище несериализуемое значение. Хотя в обсуждении упоминался Массив, важно понимать, что находится внутри этого массива. Если в массиве содержится ссылка на объект, который не может быть сериализован (например, COM-объект, Файл или специфический системный объект, не поддерживающий XDTO), то в клиент-серверном режиме при попытке передать данные между процессами возникнет ошибка, и адрес обнулится.

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

Особенности времени жизни данных (Параметр "Адрес")

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

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

Вариант 2: Идентификатор формы.
ПоместитьВоВременноеХранилище(Данные, ЭтаФорма.УникальныйИдентификатор)
Это наиболее правильный путь для управляемых форм. Данные будут существовать, пока открыта форма.

Вариант 3: Явный адрес.
Мы можем заранее подготовить адрес и передавать его в процедуры:


Адрес = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор);
// Теперь передаем этот 'Адрес' в фоновое задание или на сервер

Проблемы с временными папками на сервере

В клиент-серверном варианте временное хранилище при достижении определенных объемов сбрасывается на диск в директорию сеанса (обычно это вложенные папки внутри snccntx в профиле пользователя, под которым запущен сервер 1С).

Рассмотрим возможные инфраструктурные причины:

Итоги и рекомендации

Если вы столкнулись с тем, что ПолучитьИзВременногоХранилища возвращает Неопределено только в клиент-серверном режиме, рекомендуем следующий план действий:

  1. Обновите платформу. Для релизов ветки 8.3.12 и 8.3.13 это первоочередное действие, так как баги с синхронизацией сеансовых данных в кластере были массовыми.
  2. Проверьте привязку к форме. Убедитесь, что при помещении данных во временное хранилище в качестве второго параметра передается ЭтаФорма.УникальныйИдентификатор.
  3. Проверьте состав данных. Убедитесь, что все элементы помещаемой структуры (массива, соответствия) являются сериализуемыми. Попробуйте использовать ЗначениеВРеквизитФормы или передачу через реквизиты, если это возможно, для диагностики.
  4. Настройте исключения антивируса. Добавьте папки с данными сервера 1С (папку srvinfo) в исключения сканирования.

Применение этих шагов позволит стабилизировать работу как типовых механизмов (вроде загрузки курсов валют), так и ваших собственных разработок в сложных клиент-серверных ландшафтах.

← На главную