Как на начальной странице 1С связать список справочника и регистр сведений?

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

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

Для начала определимся с нашими объектами. Пусть у нас будут:

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

Решение 1: Программная установка параметра в запросе динамического списка

Этот способ был предложен автором в теме на форуме. Он является рабочим и достаточно простым для понимания. Суть метода заключается в том, что мы передаем в запрос списка регистра ссылку на текущий элемент справочника как параметр.

Рассмотрим по шагам:

  1. Создадим новую общую форму, назовем ее, например, "РабочийСтолОтзывы".
  2. Добавим на форму два реквизита типа ДинамическийСписок:
    • СписокСправочника. В качестве основной таблицы укажем Справочник.Отзывы.
    • СписокРегистра. В качестве основной таблицы укажем РегистрСведений.ИсторияОтзывов.
  3. Перетащим оба реквизита на форму, система создаст для них таблицы.
  4. Теперь настроим запрос для СпискаРегистра. Откроем его свойства, найдем "Настройка списка" и перейдем к тексту запроса. Нам нужно добавить условие отбора по измерению Отзыв.
    
    ВЫБРАТЬ
        ИсторияОтзывов.Период,
        ИсторияОтзывов.Отзыв,
        ИсторияОтзывов.Статус,
        ИсторияОтзывов.Комментарий
    ИЗ
        РегистрСведений.ИсторияОтзывов КАК ИсторияОтзывов
    ГДЕ
        ИсторияОтзывов.Отзыв = &Отзыв
    
    Здесь &Отзыв — это параметр, значение которого мы будем устанавливать программно. Платформа автоматически определит наличие параметра в запросе.
  5. Остался последний шаг — написать код, который будет обновлять этот параметр при смене строки в списке справочника. Выделим таблицу СписокСправочника на форме, перейдем в палитру свойств, на вкладку "События" и создадим обработчик для события ПриАктивизацииСтроки.
    
    &НаКлиенте
    Процедура СписокСправочникаПриАктивизацииСтроки(Элемент)
        // Элемент - это таблица на форме, в которой мы активировали строку.
        // Элемент.ТекущиеДанные содержит данные активированной строки.
        
        // Проверяем, что строка действительно выбрана, а не снято выделение.
        Если Элемент.ТекущиеДанные = Неопределено Тогда
            // Если ни одна строка не выбрана, можно либо очистить список регистра,
            // либо скрыть его. Установим параметр в пустое значение, чтобы список был пустым.
            СписокРегистра.Параметры.УстановитьЗначениеПараметра("Отзыв", Справочники.Отзывы.ПустаяСсылка());
        Иначе
            // Если строка выбрана, получаем из нее ссылку на элемент справочника.
            // Элемент.ТекущиеДанные.Ссылка - стандартный способ получить ссылку из данных динамического списка.
            СписокРегистра.Параметры.УстановитьЗначениеПараметра("Отзыв", Элемент.ТекущиеДанные.Ссылка);
        КонецЕсли;
    КонецПроцедуры
    

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

Решение 2: Декларативная настройка через "Связи параметров выбора" (рекомендуемый способ)

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

Проанализируем этот подход:

  1. Первые три шага выполняются так же, как и в предыдущем решении: создаем общую форму, добавляем два динамических списка и настраиваем для СпискаРегистра запрос с параметром &Отзыв.
  2. Далее начинается магия. Выделим на форме таблицу, которая отображает СписокРегистра.
  3. В палитре свойств этой таблицы найдем свойство СвязиПараметровВыбора и нажмем на кнопку с многоточием для открытия окна настройки.
  4. В открывшемся окне мы установим правило. Система уже знает, что у нашего списка есть параметр Отзыв. Нам нужно указать, откуда брать для него значение. В поле "Параметр" будет наш Отзыв. В поле "Элемент" мы должны указать источник данных. Нажмем "Выбрать" и найдем в дереве элементов формы поле Элементы.СписокСправочника.ТекущаяСтрока.
  5. После установки этой связи платформа будет автоматически делать то, что мы ранее писали в коде: при смене текущей строки в СпискеСправочника она будет брать ссылку на эту строку и передавать ее в параметр &Отзыв СпискаРегистра, после чего динамически обновит его.

Почему этот способ лучше?

Для большинства задач связывания списков на форме этот метод является предпочтительным.

Решение 3: Программная установка отбора

Есть еще один программный способ, который отличается от первого. Вместо того чтобы менять текст запроса и использовать параметры, мы можем оставить запрос "чистым", а фильтрацию накладывать с помощью механизма отборов системы компоновки данных (СКД), на которой и работают динамические списки.

Этот способ более гибкий, если требуется управлять несколькими условиями фильтрации, включать или отключать их.

Разберем по шагам:

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

В этом коде мы динамически конструируем объект ЭлементОтбораКомпоновкиДанных и добавляем его в коллекцию отборов списка. Платформа применит этот отбор при получении данных. Этот метод дает полный контроль над фильтрацией, но является более громоздким по сравнению с декларативной настройкой связей.

Подведем итог. Мы рассмотрели три способа решения одной задачи. Все они приводят к желаемому результату, но отличаются по подходу. Для простых связей "мастер-деталь" рекомендуется использовать механизм "Связи параметров выбора" как самый надежный, быстрый в реализации и не требующий программирования. Программные методы стоит применять в более сложных сценариях, когда требуется нетривиальная логика управления фильтрами.

← На главную