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