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

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

При разработке прикладных решений на управляемых формах (включая интерфейс «Такси») часто возникает задача отображения связанных данных. Классический пример: привязка периодических сведений к объекту справочника (например, список экспедиторов, закрепленных за определенной географической зоной доставки). В обычных формах 1С:Предприятия 7.7 и 8.2 разработчики привыкли использовать встроенные табличные поля, однако на управляемой платформе 1С 8.3 действуют другие механизмы клиент-серверного взаимодействия.

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

Вариант 1. Использование динамического списка с отбором

Динамический список — это стандартный инструмент платформы для отображения списочных данных. Однако при его настройке для регистра сведений важно учитывать поведение платформы при редактировании данных.

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

Пошагово разберем порядок действий:

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

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

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

Вариант 2. Редактирование непосредственно в сетке формы через реквизит «ТаблицаЗначений»

Если бизнес-логика требует редактирования данных прямо в строках таблицы (in-place) без открытия вспомогательных диалоговых окон, лучшим архитектурным решением будет использование реквизита формы с типом ТаблицаЗначений. В этом случае данные вычитываются при открытии и сохраняются в регистр в момент записи справочника.

Разберем реализацию этого механизма:

  1. В реквизитах формы добавим реквизит ТаблицаЭкспедиторов с типом ТаблицаЗначений. Добавим в него колонки Период (тип Дата) и Экспедитор (тип СправочникСсылка.ФизическиеЛица).
  2. Разместим таблицу на форме и настроим видимость колонок.
  3. В модуле формы опишем считывание данных из регистра при открытии формы:

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЭкспедиторыЗон.Период КАК Период,
        |	ЭкспедиторыЗон.Экспедитор КАК Экспедитор
        |ИЗ
        |	РегистрСведений.ЭкспедиторыЗон КАК ЭкспедиторыЗон
        |ГДЕ
        |	ЭкспедиторыЗон.Зона = &Зона";
    
    Запрос.УстановитьПараметр("Зона", Объект.Ссылка);
    ТаблицаЭкспедиторов.Загрузить(Запрос.Выполнить().Выгрузить());
    
КонецПроцедуры

Теперь обеспечим сохранение внесенных пользователем изменений при записи объекта справочника с помощью набора записей регистра:


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

При таком подходе пользователь работает с табличной частью привычным образом: строки добавляются, меняются и удаляются непосредственно на форме объекта.

Вариант 3. Использование навигационной панели и свойства «Ведущее»

Проанализируем типовой платформенный механизм перехода к подчиненным данным через панель навигации формы:

  1. В конфигураторе откроем свойства регистра сведений, найдем измерение Зона.
  2. Установим свойство Ведущее в значение Истина. Это указывает платформе, что запись регистра не имеет смысла без конкретного объекта справочника, а при удалении элемента справочника связанные записи удалятся автоматически.
  3. Откроем редактор формы справочника, перейдем на вкладку Командный интерфейс.
  4. В группе «Панель навигации — Перейти» найдем команду открытия регистра сведений и убедимся, что для нее включена видимость.

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

← На главную