Как связать регистр сведений со справочником и настроить автоматический отбор на управляемой форме?

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

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

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

Метод 1. Настройка связи через «Ведущее» измерение (Стандартный механизм 1С)

Это самый быстрый, надежный и рекомендуемый платформой способ интеграции. Платформа 1С «из коробки» умеет генерировать связи между объектами метаданных, если правильно настроить свойства их связей.

Давайте разберем по шагам, как настроить этот механизм в конфигураторе:

  1. Откроем конфигуратор и найдем наш регистр сведений (например, ПрограммныеПродуктыКонтрагентов).
  2. Перейдем на вкладку «Данные» и откроем свойства измерения, которое ссылается на справочник (в нашем примере это измерение Контрагент с типом СправочникСсылка.Контрагенты).
  3. В палитре свойств найдем флаг «Ведущее» и установим его в значение Истина.
  4. Перейдем на вкладку «Основные» самого регистра сведений и убедимся, что установлен флаг «Использовать стандартные команды». Без этого флага платформа не сможет автоматически построить интерфейсные элементы.

Важно понимать последствия установки свойства «Ведущее»:

Во-первых, платформа автоматически добавит гиперссылку перехода к этому регистру в командный интерфейс (панель навигации в верхней части формы) справочника-владельца. При нажатии на эту ссылку откроется список записей регистра, отфильтрованный исключительно по текущему контрагенту. Более того, при создании новой записи в открывшемся списке поле Контрагент заполнится текущим значением автоматически.

Во-вторых, помните о каскадном удалении. Установка свойства «Ведущее» жестко связывает жизненный цикл записи регистра с элементом справочника. Если пользователь удалит элемент справочника Контрагенты, система автоматически и без дополнительных предупреждений удалит все связанные записи в регистре сведений. Это позволяет избежать появления «битых» ссылок в базе данных.

Что делать, если ссылка не появилась на форме?

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

  1. Откроем управляемую форму элемента справочника в конфигураторе.
  2. В левой верхней части редактора формы перейдем на вкладку «Командный интерфейс».
  3. Развернем группу «Перейти».
  4. Найдем команду нашего регистра сведений и установим для нее флаг в колонке «Видимость».

Метод 2. Вывод регистра на форму элемента через Динамический список

Иногда пользователям неудобно переходить по ссылкам в панели навигации формы, и они хотят видеть список связанных записей непосредственно на вкладке внутри самой карточки контрагента. В этом случае стандартный переход нам не подходит, и мы будем использовать механизм динамического списка. Для реализации подобного интерфейса подойдёт пример связывания главной и подчиненной таблиц на управляемых формах.

Рассмотрим по шагам, как внедрить такой список на форму элемента справочника:

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

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


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

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

Метод 3. Автозаполнение контрагента при создании новых записей из списка

Один из самых частых вопросов программистов: «Как сделать так, чтобы при нажатии кнопки "Создать" в списке регистра поле "Контрагент" в новой записи заполнялось автоматически?»

Если мы используем динамический список, настроенный по Методу 2, у нас есть два простых пути решения этой задачи без написания сложного программного кода:

  1. Использование свойства «Заполнять из данных заполнения»: В конфигураторе откройте структуру регистра сведений, перейдите к измерению Контрагент и в палитре его свойств установите флаг «Заполнять из данных заполнения» в значение Истина. Платформа 1С проанализирует отборы динамического списка, из которого инициировано создание. Если в списке установлен фиксированный отбор (как мы настроили в Методе 2), платформа автоматически подставит значение этого отбора в новую запись.
  2. Настройка связей параметров выбора на форме: В редакторе формы выделите созданную нами таблицу формы (которая отображает динамический список). В палитре свойств этой таблицы найдите свойство «Параметры выбора» или «Связи параметров выбора». Вы можете связать параметры создания новой записи напрямую с реквизитом Объект.Ссылка текущей формы справочника.

Метод 4. Программный вызов формы списка с фиксированным отбором

Рассмотрим альтернативный сценарий. Что делать, если мы не хотим загромождать интерфейс формы элемента справочника лишними списками и таблицами, но при этом стандартная панель навигации по каким-то причинам нам не подходит? Мы можем вынести на форму простую кнопку (команду) «Программные продукты» и открывать список регистра программно с жестко заданным отбором.

Для реализации этого подхода выполним следующие действия:

  1. Создадим на управляемой форме справочника команду, перетащим ее на форму в виде кнопки.
  2. В модуле формы опишем обработчик этой команды на клиенте:

&НаКлиенте
Процедура ПрограммныеПродуктыНажатие(Кнопка)
    
    // Проверяем, записан ли текущий объект справочника
    Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
        Предупреждение("Для просмотра связанных программных продуктов необходимо сначала записать контрагента!");
        Возврат;
    КонецЕсли;
    
    // Нам необходимо передать параметры отбора в открываемую форму списка.
    // Для этого формируем структуру, где ключ — имя измерения регистра, а значение — ссылка.
    СтруктураОтбора = Новый Структура("Контрагент", Объект.Ссылка);
    
    // Платформа 1С ожидает параметры отбора в виде структуры внутри другой структуры под ключом "Отбор"
    ПараметрыФормы = Новый Структура("Отбор", СтруктураОтбора);
    
    // Открываем стандартную форму списка регистра сведений, передавая подготовленные параметры
    ОткрытьФорму("РегистрСведений.ПрограммныеПродуктыКонтрагентов.ФормаСписка", ПараметрыФормы);
    
КонецПроцедуры

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

Резюме и рекомендации

Каждый из рассмотренных способов имеет свои преимущества в зависимости от бизнес-требований проекта:

← На главную