Как настроить отбор строк в таблице на управляемой форме 1С при выборе строки в другой таблице?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на управляемых формах 1С часто возникает задача организации взаимосвязи двух таблиц значений. Например, при активизации строки в первой таблице (мастер-таблице) требуется моментально отфильтровать данные во второй таблице (подчиненной) без вызова тяжелых серверных процедур. Разберем по шагам, как правильно реализовать такой динамический отбор на стороне клиента, какие механизмы для этого предоставляет платформа 1С и с какими ограничениями можно столкнуться.

Использование свойства ОтборСтрок таблицы формы

Для быстрой фильтрации строк в таблице, выведенной на управляемую форму, у элемента формы типа ТаблицаФормы существует специальное свойство — ОтборСтрок. Оно позволяет установить клиентский отбор по значениям колонок таблицы без перезаполнения самого реквизита формы.

Рассмотрим базовый пример установки фильтра. Допустим, в обработчике события ПриАктивизацииСтроки первой таблицы мы получаем текущую выделенную строку и устанавливаем отбор для второй таблицы:


&НаКлиенте
Процедура ТаблицаИсточникПриАктивизацииСтроки(Элемент)
    
    ТекущиеДанные = Элементы.ТаблицаИсточник.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Устанавливаем отбор по значению реквизита "Приказ"
    Отбор = Новый ФиксированнаяСтруктура("Приказ", ТекущиеДанные.Приказ);
    Элементы.ТаблицаПриемник.ОтборСтрок = Отбор;

КонецПроцедуры

В приведенном коде мы создаем объект ФиксированнаяСтруктура, где именем ключа выступает имя колонки целевой таблицы, а значением — отбираемое значение из текущей строки таблицы-источника.

Как отключить или сбросить отбор строк

Когда выделение с первой таблицы снимается или необходимо снова показать все записи в целевой таблице, созданный отбор требуется очистить. Выполнить сброс фильтрации можно двумя способами:

  1. Передать пустой объект ФиксированнаяСтруктура: Элементы.ТаблицаПриемник.ОтборСтрок = Новый ФиксированнаяСтруктура();
  2. Присвоить свойству ОтборСтрок значение Неопределено: Элементы.ТаблицаПриемник.ОтборСтрок = Неопределено;

Оба варианта отменяют фильтрацию на форме и возвращают отображение всех строк таблицы.

Ограничения механизма ОтборСтрок и способы их обхода

При использовании свойства ОтборСтрок необходимо учитывать несколько ключевых особенностей платформы 1С:

1. Ограничение по типам условий: Свойство ОтборСтрок поддерживает отбор только по строгому равенству конкретных значений. Через ФиксированнаяСтруктура нельзя задать сложную логику («больше», «меньше»), диапазоны или отбор по списку значений.

2. Производительность: Фильтрация выполняется на стороне клиента. Если таблица содержит тысячи строк, частое изменение отбора может вызывать задержки в работе формы.

Если вам требуется наложить сложный отбор (например, по диапазону или списку значений), проанализируем эффективный обходной путь с использованием вспомогательной колонки:

  1. Добавим в реквизит формы целевой таблицы служебную колонку Видимость с типом Булево. Выводить её в элементы формы не обязательно.
  2. При открытии формы наложим постоянный отбор на элемент таблицы:
    
    Элементы.ТаблицаПриемник.ОтборСтрок = Новый ФиксированнаяСтруктура("Видимость", Истина);
    
  3. В событии ПриАктивизацииСтроки таблицы-источника выполним проход по строкам подчиненной таблицы и установим значение флага Видимость в Истина или Ложь по любой сложной логике.

Такой подход позволяет накладывать абсолютно любые критерии фильтрации и при этом сохранять быстродействие штатного клиентского отбора строк.

Важные правила безопасности при написании кода

Посмотрим на практические нюансы, которые уберегут форму от критических ошибок в режиме 1С:Предприятие:

  1. Проверка на Неопределено: В обработчике события ПриАктивизацииСтроки обязательно проверяйте значение ТекущиеДанные. Если таблица окажется пустой, прямое обращение к свойствам приведет к ошибке вызова метода.
  2. Соответствие имен: Ключ в объекте ФиксированнаяСтруктура должен строго совпадать с именем колонки таблицы значений (реквизита формы), по которой выполняется отбор.
← На главную