Как передать данные из запроса на сервере в реквизиты формы для работы на клиенте?

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

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

Основные причины возникновения проблем

Основная сложность заключается в архитектуре управляемого приложения. Когда вы создаете реквизит формы с типом Таблица значений, на клиенте он превращается в специальный объект ДанныеФормыКоллекция. Этот объект является «оберткой», и попытки работать с ним привычными методами (как с обычной ТаблицейЗначений на сервере) часто приводят к ошибкам или пустым результатам.

Важно помнить:

  1. Клиентский код не имеет прямого доступа к серверным данным.
  2. Серверный контекст и клиентский контекст — это разные области памяти.
  3. Методы типа РеквизитФормыВЗначение работают только на сервере.

Решение 1: Заполнение коллекции реквизита формы на сервере

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

Рассмотрим пример реализации:


&НаСервере
Процедура ЗаполнитьТЧНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура.Код КАК Код
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура";
    
    // Выгружаем результат напрямую в реквизит формы
    // ВремТабЗнач — это реквизит формы с типом ТаблицаЗначений
    ВремТабЗнач.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТЧ(Команда)
    ЗаполнитьТЧНаСервере();
КонецПроцедуры

Решение 2: Использование методов преобразования данных

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

Разберем этот процесс по шагам:

  1. На сервере получаем «чистую» таблицу из формы методом РеквизитФормыВЗначение.
  2. Выполняем все необходимые манипуляции с этой таблицей.
  3. Возвращаем измененные данные в форму методом ЗначениеВРеквизитФормы.

Пример кода:


&НаСервере
Процедура ЗаполнитьВремТабЗначНаСервере()
    // 1. Получаем объект таблицы
    ТЗ = РеквизитФормыВЗначение("ВремТабЗнач", Тип("ТаблицаЗначений"));
    
    // 2. Выполняем действия
    Запрос = Новый Запрос("ВЫБРАТЬ Код ИЗ Справочник.Номенклатура");
    ТЗ = Запрос.Выполнить().Выгрузить();
    
    // 3. Загружаем обратно в реквизит формы
    ЗначениеВРеквизитФормы(ТЗ, "ВремТабЗнач");
КонецПроцедуры

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

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


// В коде на клиенте
Для Каждого Стр Из ВремТабЗнач Цикл
    // Лист1 — ваш объект Excel
    Лист1.Cells(СтрокаЛиста, 1).Value = Стр.Код;
КонецЦикла;

Что важно проверять при отладке?

Если после выполнения кода вы видите, что данные на клиенте отсутствуют, проанализируйте следующее:

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

← На главную