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