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

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

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

Реализация через объект «Набор записей»

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

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

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

Пример кода для настройки и чтения данных:


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

Почему это решение может быть неоптимальным?

Хотя метод с «Набором записей» позволяет вывести данные, он имеет существенный недостаток: форма справочника становится «тяжелой». При каждом открытии карточки номенклатуры система вынуждена выполнять серверный вызов и считывать данные из регистра. Это замедляет работу интерфейса, особенно если записей в регистре много, а пользователь не всегда открывает карточку для редактирования этих данных.

Рекомендованный архитектурный подход: использование гиперссылки

В типовых конфигурациях 1С рекомендуется придерживаться принципа «легких форм». Если данные регистра не являются критически важными для каждого просмотра карточки, лучше всего вывести на форму гиперссылку. При нажатии на неё будет открываться отдельная форма списка регистра сведений, отфильтрованная по текущему элементу справочника.

Преимущества данного подхода:

Как реализовать переход к регистру по гиперссылке?

Чтобы реализовать этот сценарий, выполните следующие действия:

  1. На форму справочника добавьте реквизит с типом «Строка» (заголовок гиперссылки) или используйте кнопку с видом «Гиперссылка».
  2. В обработчике нажатия на гиперссылку используйте метод ОткрытьФорму().
  3. В качестве параметра передайте отбор:

&НаКлиенте
Процедура ДопустимыеНаценкиНажатие(Элемент)
    ПараметрыОтбора = Новый Структура("Номенклатура", Объект.Ссылка);
    ОткрытьФорму("РегистрСведений.ДопустимыйДиапазонНаценки.ФормаСписка", 
                  Новый Структура("Отбор", ПараметрыОтбора));
КонецПроцедуры

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

← На главную