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