Как программно перебрать данные динамического списка в 1С 8.3?

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

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

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

Метод 1: Перебор выделенных строк (на стороне клиента)

Если ваша задача — обработать только те записи, которые пользователь выделил мышкой в таблице, мы можем воспользоваться свойством элемента формы ВыделенныеСтроки. Рассмотрим этот способ на примере. Проанализируем ситуацию: нам нужно передать данные выделенных строк на сервер для дальнейшей обработки.

Алгоритм действий:

  1. На клиенте получаем массив идентификаторов выделенных строк.
  2. Для каждого идентификатора получаем данные строки через метод ДанныеСтроки().
  3. Передаем собранные данные (например, массив ссылок) на сервер.

&НаКлиенте
Процедура ОбработатьВыделенныеСтроки(Команда)
    // Получаем элемент управления таблицей на форме
    ТаблицаСписка = Элементы.Список;
    ВыделенныеСтроки = ТаблицаСписка.ВыделенныеСтроки;
    
    МассивСсылок = Новый Массив;
    
    Для каждого Идентификатор Из ВыделенныеСтроки Цикл
        // Извлекаем данные конкретной строки по идентификатору
        ДанныеСтроки = ТаблицаСписка.ДанныеСтроки(Идентификатор);
        
        // Проверяем, что строка доступна (не пустая)
        Если ДанныеСтроки <> Неопределено Тогда
            МассивСсылок.Добавить(ДанныеСтроки.Ссылка);
        КонецЕсли;
    КонецЦикла;
    
    // Передаем массив на сервер для обработки
    ОбработатьДанныеНаСервере(МассивСсылок);
КонецПроцедуры

Стоит отметить, что метод ДанныеСтроки() работает только для тех записей, которые в данный момент загружены в кэш формы. Если пользователь выделил сотни строк прокруткой, этот метод — самый быстрый и надежный для клиентской части.

Метод 2: Получение всех строк списка через СКД (на стороне сервера)

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

Рассмотрим по шагам, как программно «выполнить» запрос динамического списка на сервере и выгрузить результат в таблицу значений.

Шаг 1: Получение исполняемой схемы и настроек

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

Шаг 2: Компоновка макета и выполнение

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


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

Важные нюансы и технические особенности

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

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

Параметры запроса:
Если ваш ДинамическийСписок построен на произвольном запросе с параметрами (например, &ДатаНачала), убедитесь, что они установлены. Метод ПолучитьИсполняемыеНастройкиКомпоновкиДанных обычно подхватывает их, но если параметры задаются программно при открытии формы через Список.Параметры.УстановитьЗначениеПараметра, может потребоваться их дополнительная проверка перед инициализацией процессора компоновки.

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

Пользовательский поиск:
Преимущество использования ПолучитьИсполняемыеНастройкиКомпоновкиДанных() заключается в том, что этот метод учитывает полнотекстовый поиск. Если пользователь ввел слово в строку поиска над списком, СКД автоматически применит эти условия, и вы получите именно те ссылки, которые человек видит в интерфейсе.

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

← На главную