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