Как отобразить список связанных документов в форме элемента справочника в 1С?

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

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

Способ 1. Использование динамического списка с произвольным запросом (Рекомендуемый)

Наиболее эффективным и правильным подходом для управляемых форм 1С является добавление реквизита формы с типом ДинамическийСписок.

Разберем по шагам порядок настройки формы:

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

ВЫБРАТЬ
	Ссылка КАК Документ,
	Дата КАК Дата,
	Номер КАК Номер,
	"Поступление товаров" КАК ВидДокумента
ИЗ
	Документ.ПоступлениеТоваровИУслуг
ГДЕ
	Корреспондент = &Корреспондент

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Ссылка,
	Дата,
	Номер,
	"Реализация товаров"
ИЗ
	Документ.РеализацияТоваровУслуг
ГДЕ
	Корреспондент = &Корреспондент

Перетаскиваем созданный реквизит в элементы формы для формирования таблицы.

Особенность открытия документов при произвольном запросе:

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


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

Установка параметра запроса:

Установку значения параметра запроса оптимально делать на сервере в обработчике ПриСозданииНаСервере. Это исключит лишние вызовы сервера и ускорит первичную отрисовку формы:


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

Способ 2. Использование объекта метаданных «Критерий отбора»

Рассмотрим удобный инструмент платформы, когда состав документов может меняться при развитии конфигурации.

  1. В дереве метаданных конфигуратора создаем объект Критерий отбора (например, ДокументыПоКорреспонденту).
  2. В свойствах критерия отбора указываем тип СправочникСсылка.Корреспонденты.
  3. На вкладке Состав отмечаем реквизиты документов, в которых используется данный справочник.
  4. В форму справочника добавляем реквизит с типом КритерийОтбораСписок.ДокументыПоКорреспонденту.

Преимущества: При добавлении новых документов с реквизитом корреспондента достаточно просто включить их в состав критерия в конфигураторе — менять программный код запросов на формах не требуется.

Ограничения: Запрос критерия отбора не использует порционное порционное считывание данных из базы, поэтому при наличии тысяч документов выборка может работать медленнее, чем динамический список.

Способ 3. Объединение в Журнал документов

Если список видов документов заранее известен и не велик, их можно объединить в объект метаданных Журнал документов.

  1. В журнале документов создается графа Корреспондент.
  2. На форму справочника выводится динамический список, основной таблицей которого указывается данный журнал.
  3. В событии ПриСозданииНаСервере устанавливается отбор по реквизиту Корреспондент.

Этот способ позволяет сохранить всю встроенную функциональность: отображение пиктограмм проведения/пометки удаления и стандартное контекстное меню открытия объектов.

Способ 4. Заполнение Таблицы Значений при открытии (Ограничения)

Иногда применяют метод создания таблицы значений на форме с выполнением запроса при открытии или с вызовом функции НайтиПоСсылкам.

Проанализируем, почему этот метод не рекомендуется использовать:

  1. Нагрузка на сеть и память: Заполнение таблицы значений передает весь объем найденных данных с сервера на клиент, увеличивая размер контекста формы и замедляя открытие.
  2. Производительность НайтиПоСсылкам: Метод НайтиПоСсылкам выполняет полное сканирование всех таблиц базы данных, где встречается ссылка. В рабочих базах с большим объемом данных это приводит к блокировкам и критической нагрузке на СУБД.

Способ 5. Использование типовых подсистем БСП

В типовых решениях (1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей и др.) на базе Библиотеки Стандартных Подсистем (БСП) выводить список связанных объектов можно с помощью штатной подсистемы Связанные документы. Это позволяет отображать структуру связей через панель навигации без необходимости разработки пользовательских запросов.

← На главную