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