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