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