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