Как получить значения колонок из динамического списка в управляемой форме 1С 8.3?

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача прочитать данные из колонок таблицы формы (например, Дата, Номер или ФИО). В управляемых формах источником данных для таких таблиц выступает ДинамическийСписок. Особенность этого объекта заключается в том, что он не хранит все строки выборки в памяти целиком, а подгружает их динамически небольшими порциями для отображения пользователю.

Разберем различные сценарии получения значений: от считывания текущей активной строки до программной выгрузки всех отфильтрованных строк списка с использованием схемы компоновки данных (СКД).

Важная особенность: обращение через коллекцию «Элементы»

Частая ошибка начинающих разработчиков — попытка вызвать специальные методы динамического списка напрямую через реквизит формы. Методы для получения схемы компоновки и настроек вызываются исключительно у элемента формы (таблицы), связанного со списком, то есть через контекст Элементы.ИмяСписка, а не через основной реквизит формы.

Вариант 1. Получение данных текущей активной строки (на клиенте)

Если пользователю требуется получить данные только по одной строке, на которой в данный момент установлен курсор, удобнее всего использовать свойство элемента формы ТекущиеДанные.

Разберем по шагам, как это реализовать:

  1. Обратимся к свойству ТекущиеДанные таблицы формы.
  2. Проверим, что список не пуст и строка действительно выбрана (результат не равен Неопределено).
  3. Прочитаем нужные колонки напрямую по их именам.

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура ПолучитьДанныеТекущейСтроки()
    СтрокаСписка = Элементы.Список.ТекущиеДанные;
    
    Если СтрокаСписка <> Неопределено Тогда
        ЗначениеФИО = СтрокаСписка.ФИО;
        ЗначениеДата = СтрокаСписка.Дата;
        ЗначениеНомер = СтрокаСписка.Номер;
        
        Сообщить("Выбрана строка: " + Строка(ЗначениеФИО) + ", Номер: " + Строка(ЗначениеНомер));
    КонецЕсли;
КонецПроцедуры

Важно: если поле не выведено на форму визуально, платформа может исключить его из запроса динамического списка. Чтобы поле всегда присутствовало в ТекущиеДанные, в настройках реквизита списка в конфигураторе необходимо установить флаг «Использовать всегда».

Вариант 2. Получение значений для нескольких выделенных строк

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

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


&НаКлиенте
Процедура ОбработатьВыделенныеСтроки()
    МассивСсылок = Элементы.Список.ВыделенныеСтроки;
    
    Если МассивСсылок.Количество() > 0 Тогда
        ПолучитьДанныеПоМассивуНаСервере(МассивСсылок);
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПолучитьДанныеПоМассивуНаСервере(МассивСсылок)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Док.Дата КАК Дата,
        |	Док.Номер КАК Номер,
        |	Док.ФИО КАК ФИО
        |ИЗ
        |	Документ.НашДокумент КАК Док
        |ГДЕ
        |	Док.Ссылка В(&МассивСсылок)";
    
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Обработка полученных значений
    КонецЦикла;
КонецПроцедуры

Вариант 3. Получение всех строк динамического списка с учетом отборов и поиска

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

Разберем полный алгоритм выгрузки данных в таблицу значений:

  1. На клиенте или сервере получаем исполняемую схему и текущие настройки через Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных() и Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных().
  2. На сервере инициализируем КомпоновщикМакетаКомпоновкиДанных, создаем макет компоновки.
  3. С помощью ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений выводим результат в ТаблицаЗначений.

Посмотрим на пример серверной процедуры:


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

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

← На главную