Программирование в 1С

Временное хранилище 1С: как передать таблицу значений по адресу

Коротко

Создайте таблицу на сервере, поместите её во временное хранилище и передайте строку-адрес. Для следующего серверного вызова используйте UUID формы либо иной UUID с явной уборкой; отсутствие второго параметра не означает хранение до конца сеанса.

Таблицу читайте на сервере через ПолучитьИзВременногоХранилища, а после однократной передачи удаляйте через УдалитьИзВременногоХранилища. Адрес работает в текущем сеансе, не в произвольном сеансе Консоли.

Временное хранилище 1С: таблица значений между вызовами формы

Минимальный рецепт ниже выполняет два разных серверных вызова. В первом создаётся таблица в памяти, во втором читается по адресу и удаляется. Клиент получает только адрес, затем число строк — не ТаблицаЗначений.

Подготовка: отдельная управляемая форма тестовой обработки без основного реквизита документа. Добавьте реквизит ЧислоСтрок типа Число, выведите его на форму. Создайте команду ПроверитьПередачу, назначьте одноимённый обработчик и добавьте кнопку команды. Код вставьте в модуль этой формы. Исходных данных из базы не требуется.

&НаКлиенте
Процедура ПроверитьПередачу(Команда)
    // Адрес создан только этой командой в текущем сеансе.
    Адрес = ПодготовитьТаблицуНаСервере();
    ЧислоСтрок = ПрочитатьИУдалитьНаСервере(Адрес);
КонецПроцедуры

&НаСервере
Функция ПодготовитьТаблицуНаСервере()
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Метка");
    СтрокаДанных = Таблица.Добавить();
    СтрокаДанных.Метка = "Проба";
    Возврат ПоместитьВоВременноеХранилище(Таблица, УникальныйИдентификатор);
КонецФункции

&НаСервереБезКонтекста
Функция ПрочитатьИУдалитьНаСервере(Знач Адрес)
    // Получатель владеет уборкой адреса после однократного чтения.
    Таблица = ПолучитьИзВременногоХранилища(Адрес);
    УдалитьИзВременногоХранилища(Адрес);
    Возврат Таблица.Количество();
КонецФункции
ПоместитьВоВременноеХранилище
Данныесериализуемая таблица на сервере
Адресздесь — UUID экземпляра формы
→ Строка — новый адрес

Ожидаемый результат: после одного нажатия ЧислоСтрок = 1. В хранилище больше нет созданной копии: получатель удалил её до подсчёта. Локальная переменная Таблица после чтения остаётся пригодной для работы — удаление адреса не отменяет уже полученное значение. Это ожидаемый результат по контрактам API, а не журнал живого прогона.

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

Второй параметр: UUID формы, иной UUID или адрес

Сигнатура: ПоместитьВоВременноеХранилище(<Данные>, <Адрес>). Данные обязательны; второй параметр необязателен и имеет тип УникальныйИдентификатор или Строка. Функция возвращает строковый адрес, а не GUID.

  • UUID формы: свойство УникальныйИдентификатор без скобок и без Новый. Значение привязано к этому экземпляру формы и автоматически удаляется после её закрытия. UUID объекта справочника не становится UUID формы.
  • Иной UUID: например, Новый УникальныйИдентификатор(). Если идентификатор не принадлежит форме, значение хранится до завершения сеанса, если его не удалить раньше. Это не создаёт новый сеанс и не разрешает доступ из другого сеанса.
  • Ранее выданный адрес: строка для помещения нового значения по существующему адресу, а не строковое представление GUID. Для адреса, привязанного к форме, сохраняется её срок жизни. Передача адреса уже удалённого значения вызывает исключение; после удаления адрес нужно сбросить.

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

Срок жизни без второго параметра

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

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

Логическое удаление значения не равнозначно немедленному освобождению занимаемого места на диске: сеансовые данные очищаются сборщиком мусора платформы. Адрес не служит постоянным хранилищем для записи в документ или регистр.

Серверный контекст: где получить таблицу

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

В примере &НаСервере нужен для доступа к свойству формы УникальныйИдентификатор. В &НаСервереБезКонтекста свойств формы нет, зато переданного адреса достаточно для чтения. Если UUID формы нужен внеконтекстному коду, передайте его явно параметром.

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

Реквизит управляемой формы с типом ТаблицаЗначений представлен данными формы — это не клиентская ТЗ. Если исходная таблица уже отображена на форме, сначала преобразуйте её на сервере с контекстом формы; текущий минимальный пример обходит эту отдельную задачу, создавая ТЗ непосредственно на сервере.

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

Автономный серверный сценарий без формы

Вставьте следующий блок в область исполняемого кода серверной Консоли либо в тело серверной процедуры тестовой обработки. Не объединяйте его с модулем формы выше. Подтвердите серверный режим выполнения; реквизиты формы и конфигурационные данные не нужны. Если Консоль имеет отдельное поле результата, укажите переменную ЧислоСтрок штатным способом этого инструмента.

// Самостоятельный серверный блок: не модуль формы.
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Метка");
СтрокаДанных = Таблица.Добавить();
СтрокаДанных.Метка = "Проба";

// Новый UUID не является идентификатором открытой формы.
Адрес = ПоместитьВоВременноеХранилище(Таблица, Новый УникальныйИдентификатор());
ПолученнаяТаблица = ПолучитьИзВременногоХранилища(Адрес);
УдалитьИзВременногоХранилища(Адрес);
Адрес = "";
ЧислоСтрок = ПолученнаяТаблица.Количество();
Получить / удалить
Адрессобственный адрес текущего серверного исполнения
Получить → Произвольный
Удалить → процедура без результата

Ожидаемый результат: ЧислоСтрок = 1, Адрес = пустая строка, полученная таблица содержит строку с Метка = «Проба». Созданное значение удалено до подсчёта. Ошибки не перехватываются: при ошибке чтения выполнение прервётся исходным исключением и до удаления не дойдёт; при ошибке удаления выполнение прервётся на удалении. Уборка при ошибке или аварийном завершении не гарантируется; не удалённое значение ограничено сеансовым сроком жизни.

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

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

  • На изолированной форме нажмите ПроверитьПередачу: поле ЧислоСтрок должно стать равным 1. В отладчике проверьте, что адрес — строка, а Таблица внутри обеих серверных функций — ТаблицаЗначений.
  • В том же сеансе остановитесь перед удалением: полученная ТаблицаЗначений должна содержать одну колонку Метка и одну строку со значением «Проба». Сохраните исходный адрес в отладчике. После удаления проверьте через ПолучитьИзВременногоХранилища отсутствие ранее помещённой таблицы по этому адресу; отдельно убедитесь, что уже полученная локальная таблица сохранила строку. Проверка формата адреса не доказывает наличие или отсутствие данных.
  • В автономном исполнении сохраните исходный адрес в отладчике до его сброса. После блока ожидаются ЧислоСтрок = 1 и Адрес = пустая строка; отдельно проверьте отсутствие ранее помещённой таблицы по сохранённому адресу в этом же сеансе и сохранность строки «Проба» в ПолученнаяТаблица. Повторите успешный сценарий формы: каждый новый адрес должен быть освобождён. Сброс переменной адреса сам по себе не доказывает очистку.

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

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

Дополнительные источники: 1C-Only: адрес, UUID и явная очистка; about1c: создание и заполнение таблицы значений.

Частые ошибки при передаче ТЗ по адресу

  • Таблица возвращается тонкому клиенту. Читайте и обрабатывайте ТЗ на сервере; клиенту возвращайте поддерживаемое представление, как число строк в примере.
  • Адрес пропал между вызовами. Проверьте второй параметр и открыта ли форма-владелец. Отсутствие параметра не гарантирует срок жизни до конца сеанса.
  • Новый UUID принят за UUID формы. Новый УникальныйИдентификатор создаёт другой идентификатор, а свойство УникальныйИдентификатор относится к текущему экземпляру формы.
  • Свойство формы читается без контекста. Перенесите получение UUID в контекстный серверный код или передайте его параметром.
  • Получатель читает данные после закрытия отправителя. Не привязывайте результат к форме, которая закроется до чтения.
  • Запись по удалённому адресу. Очистите переменную адреса и создайте новое размещение; проверка вида строки сама по себе не доказывает наличие данных.
  • Адрес передан в другой сеанс. Обычное чтение не работает. Платформа предусматривает специальную передачу результата фонового задания в родительский сеанс; это отдельный протокол, а не общий доступ к чужому хранилищу.

Частые вопросы о временном хранилище

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

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

Чем UUID формы отличается от нового UUID?

Свойство УникальныйИдентификатор привязывает значение к экземпляру формы и его закрытию. Новый UUID, не принадлежащий форме, оставляет значение до завершения сеанса, если не удалить его раньше.

Что будет, если не указать второй параметр?

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

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф