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