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