Как обойти все строки динамического списка

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

Иногда возникает задача полностью обойти весь динамический список и провести с его строками какие-то операции. Но тут возникает проблема: динамический список нигде не хранится целиком (на то он и динамический). Строки динамического списка подгружаются постепенно, порциями. Таким образом, у динамического списка нет итератора, с помощью которого можно было бы его обойти целиком, итоговое количество строк также неизвестно.

Решить эту проблему можно выполнив запрос, аналогичный тому, который выполняется динамическим списком. Но в этом случае, в дополнение к тексту запроса, нужно еще получить и учесть все отборы, сортировки и прочие параметры, которые установил пользователь.

К счастью, начиная с версии платформы 1С:Предприятие 8.3.6.1977, доступен более простой способ.

Условия задачи:

  • Список — элемент управляемой формы, в который выводится динамический список.
  • Функция должна преобразовать динамический список в таблицу значений.
  • Функция должна выполняться на сервере.
&НаСервере
Функция ДинамическийСписокВТаблицуЗначений ()

//Получаем схема компановки данных (здесь хранится текст запроса)
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();

//Получаем настройки пользователя (отборы, сортировки и т.п.)
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

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

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

//Возвращаем полученную таблицу значений
Возврат Результат;

КонецФункции

Вот и все. Кстати, еще один плюс данного метода в том, что он работает довольно быстро, даже если строк в динамическом списке много.

Как обойти все строки динамического списка: 2 комментария

  1. Игорь

    У дин.списка есть событие ПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    Пар. Строки есть итератором

    1. Сергей

      А там разве все строки дин. списка будут доступны? Вроде бы только часть, которая отображается, а остальных строк не будет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *