Как работать с динамическим списком в 1С: обновление параметров и обработка события выбора

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

Работа с динамическими списками — одна из базовых задач при разработке управляемого интерфейса в «1С:Предприятие 8». Несмотря на кажущуюся простоту, программисты часто сталкиваются с нюансами, когда данные в списке не обновляются «сами собой» или когда стандартный двойной клик по строке не открывает нужную форму. В рамках данной статьи мы разберем эти ситуации на примере конфигурации УПП 1.3, рассмотрим механику работы параметров и научимся управлять поведением списка программно.

Проблема обновления данных при изменении параметров

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

Для того чтобы список отреагировал на изменение внешнего фильтра, необходимо в событии ПриИзменении элемента управления явно переустановить параметр запроса. Вызов простого обновления элемента формы Элементы.ИмяСписка.Обновить() в данном случае бесполезен, так как он лишь перерисовывает данные, уже имеющиеся в кэше, но не меняет условия самого запроса к базе данных.

Правильный алгоритм действий выглядит следующим образом:

  1. Определяем процедуру на сервере, которая будет обращаться к динамическому списку.
  2. Используем метод УстановитьЗначениеПараметра коллекции Параметры динамического списка.
  3. Передаем актуальное значение из реквизита формы.

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


&НаСервере
Процедура ОбновитьСписокНаСервере()
    // Параметр "Исполнитель" должен быть объявлен в тексте запроса динамического списка (секция ГДЕ)
    СписокЗадач.Параметры.УстановитьЗначениеПараметра("Исполнитель", Объект.Исполнитель);
КонецПроцедуры

&НаКлиенте
Процедура ИсполнительПриИзменении(Элемент)
    ОбновитьСписокНаСервере();
КонецПроцедуры

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

Особенности работы со сложными запросами и «Основной таблицей»

Динамический список работает максимально эффективно, когда у него указана Основная таблица. В этом случае платформа берет на себя все стандартные действия: открытие формы объекта, пометку на удаление, сортировку и отборы. Однако часто возникают задачи, где запрос списка является сложным (использует ОБЪЕДИНИТЬ, группировки или соединения с несколькими таблицами). В таких случаях поле Основная таблица остается пустым.

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

Настройка открытия формы по двойному клику

Рассмотрим по шагам, как реализовать «проваливание» в документ или задачу из списка со сложным запросом. Выясним причину, по которой стандартный механизм не срабатывает: при отсутствии основной таблицы текущая строка списка — это просто набор данных (структура), а не ссылка на конкретный объект метаданных.

Разберем программную реализацию в обработчике события Выбор:

  1. В свойствах таблицы на форме (элемент, отображающий динамический список) находим событие Выбор.
  2. Внутри обработчика обязательно устанавливаем СтандартнаяОбработка = Ложь. Это предотвратит попытки системы выполнить действие по умолчанию, которое в данном случае приведет к ошибке.
  3. Получаем данные текущей строки через Элементы.ИмяСписка.ТекущиеДанные.
  4. Используем метод ПоказатьЗначение или ОткрытьФорму.

Пример кода для открытия формы задачи:


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

Если вам требуется не просто открыть форму, а выполнить с ней дополнительные манипуляции (например, передать параметры при открытии), используйте метод ОткрытьФорму. Это позволит более гибко управлять поведением интерфейса.

Оптимизация и продвинутые настройки

Проанализируем ситуацию, когда динамический список начинает «тормозить» при прокрутке. Это часто случается в конфигурациях типа УПП или ERP при работе с большими объемами данных. Динамический список по умолчанию считывает данные порциями, но сложные соединения в произвольном запросе могут нивелировать это преимущество.

Советы по оптимизации:

Посмотрим на пример установки начальных параметров при открытии формы:


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

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

← На главную