При разработке внешних обработок в управляемых формах 1С часто возникает задача: выполнить сложный запрос к базе данных на сервере, получить результат и передать его на клиент для дальнейшей обработки (например, для выгрузки в файл Excel). Разберем, почему данные могут «пропадать» и как правильно реализовать этот процесс.
Основная сложность заключается в архитектуре управляемого приложения. Когда вы создаете реквизит формы с типом Таблица значений, на клиенте он превращается в специальный объект ДанныеФормыКоллекция. Этот объект является «оберткой», и попытки работать с ним привычными методами (как с обычной ТаблицейЗначений на сервере) часто приводят к ошибкам или пустым результатам.
Важно помнить:
РеквизитФормыВЗначение работают только на сервере.Самый простой и эффективный способ для небольших объемов данных — это выгрузка результата запроса непосредственно в реквизит формы на сервере. Платформа 1С автоматически позаботится о передаче данных на клиент, если реквизит является частью формы.
Рассмотрим пример реализации:
&НаСервере
Процедура ЗаполнитьТЧНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
// Выгружаем результат напрямую в реквизит формы
// ВремТабЗнач — это реквизит формы с типом ТаблицаЗначений
ВремТабЗнач.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТЧ(Команда)
ЗаполнитьТЧНаСервере();
КонецПроцедуры
Если вам требуется сложная обработка данных на сервере (например, расчеты, удаление строк, специфическая сортировка), лучше использовать промежуточную ТаблицуЗначений, которую потом нужно «поместить» обратно в реквизит формы.
Разберем этот процесс по шагам:
РеквизитФормыВЗначение.ЗначениеВРеквизитФормы.Пример кода:
&НаСервере
Процедура ЗаполнитьВремТабЗначНаСервере()
// 1. Получаем объект таблицы
ТЗ = РеквизитФормыВЗначение("ВремТабЗнач", Тип("ТаблицаЗначений"));
// 2. Выполняем действия
Запрос = Новый Запрос("ВЫБРАТЬ Код ИЗ Справочник.Номенклатура");
ТЗ = Запрос.Выполнить().Выгрузить();
// 3. Загружаем обратно в реквизит формы
ЗначениеВРеквизитФормы(ТЗ, "ВремТабЗнач");
КонецПроцедуры
После выполнения серверной процедуры данные в реквизите ВремТабЗнач будут доступны на клиенте. Чтобы записать их в Excel, вы можете обращаться к коллекции напрямую через цикл:
// В коде на клиенте
Для Каждого Стр Из ВремТабЗнач Цикл
// Лист1 — ваш объект Excel
Лист1.Cells(СтрокаЛиста, 1).Value = Стр.Код;
КонецЦикла;
Если после выполнения кода вы видите, что данные на клиенте отсутствуют, проанализируйте следующее:
&НаСервере.ДанныеФормыКоллекция, поэтому методы Выгрузить() или Загрузить() для него доступны только в контексте, где платформа понимает этот тип (обычно это прямое использование в процедурах &НаСервере).Придерживаясь этих рекомендаций, вы сможете легко передавать любые табличные данные между сервером и клиентом, обеспечивая корректную работу ваших внешних обработок.