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