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