Как установить отбор в табличном поле обычной формы, связанном с таблицей значений?

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

Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем крайне распространенную техническую проблему, с которой часто сталкиваются начинающие разработчики в среде 1С:Предприятие при работе с обычными формами (платформа 1С v8.2 / 8.3). Ситуация выглядит следующим образом: в процессе разработки возникает необходимость перевести табличное поле формы с работы напрямую с Табличной частью документа или справочника на работу со свободной Таблицей значений. Это часто делается для оптимизации производительности или реализации сложной логики расчетов.

Однако сразу после этого привычный и ранее успешно работавший код настройки отборов внезапно перестает функционировать и начинает вызывать критическую ошибку выполнения: Поле объекта не обнаружено (ОтборСтрок). Выясним причину этой проблемы и рассмотрим по шагам, как настроить эффективную фильтрацию строк в таком сценарии.

Почему возникает ошибка при попытке обратиться к ОтборСтрок?

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

В случае, когда мы связываем табличное поле с реквизитом формы типа ТаблицаЗначений, мы работаем с чистым объектом оперативной памяти. С точки зрения платформы, таблица значений — это универсальная коллекция данных, которая не обладает автоматическими механизмами интерактивной фильтрации, свойственными табличным частям баз данных. Свойство ОтборСтрок у такого табличного поля просто отсутствует. Нам придется взять управление фильтрацией в свои руки.

К счастью, существует три проверенных и надежных способа решить эту задачу. Разберем каждый из них подробно, со всеми деталями и примерами программного кода.

Способ 1. Фильтрация данных с использованием оригинальной и отображаемой таблиц значений

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

  1. Исходная (полная) таблица значений: она будет храниться в скрытом реквизите формы (или в переменной модуля) и всегда содержать абсолютно все строки данных без каких-либо ограничений. Назовем её, например, тзИсходная.
  2. Отображаемая таблица значений: именно этот реквизит формы будет связан напрямую с визуальным элементом управления (табличным полем). Назовем её тзНаФорме. В неё мы будем динамически помещать только те строки, которые удовлетворяют условиям нашего фильтра.

Допустим, у нас на форме есть табличное поле, связанное с реквизитом тзНаФорме. Давайте посмотрим на практический пример программного кода, который осуществляет отбор по колонке Отображать:


// Создаем структуру для хранения параметров нашего отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Отображать", Истина); // Фильтруем только строки со значением Истина

// С помощью встроенного метода таблицы значений НайтиСтроки производим поиск
НайденныеСтроки = тзИсходная.НайтиСтроки(ПараметрыОтбора);

// Очищаем текущую отображаемую на форме таблицу
тзНаФорме.Очистить();

// Чтобы перенести строки, мы копируем структуру и данные найденных строк
тзНаФорме = тзИсходная.Скопировать(НайденныеСтроки);

Если перед вами стоит задача полностью сбросить установленный отбор и вернуть исходное состояние таблицы на экран, вам достаточно просто скопировать всю исходную таблицу без передачи параметров фильтрации. Рассмотрим пример кода сброса фильтра:


// Полностью перезагружаем исходные данные в отображаемую таблицу
тзНаФорме = тзИсходная.Скопировать();

Важное примечание: данный метод прекрасно подходит для простых сценариев, когда необходимо сделать отбор по жесткому равенству значений. Метод НайтиСтроки работает исключительно по условию равенства. Если вам необходимы более сложные условия (например, диапазон дат, сравнение чисел или поиск по подстроке), этот метод не подойдет. Перейдем к следующему способу.

Способ 2. Использование объекта ПостроительЗапроса для сложных фильтров

Если перед нами стоит задача сделать гибкий и сложный отбор (например, отобрать номенклатуру, содержащую определенное слово в наименовании, или отфильтровать документы по сумме больше заданной), на помощь приходит мощнейший системный объект — ПостроительЗапроса.

Этот объект позволяет программно накладывать любые виды сравнения на произвольные источники данных, включая таблицы значений в оперативной памяти. Давайте по шагам разберем пример реализации такого отбора:


// Инициализируем построитель запроса
Построитель = Новый ПостроительЗапроса;

// В качестве источника данных для построителя указываем нашу исходную полную таблицу
// Для этого обязательно используем объект ОписаниеИсточникаДанных
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(тзИсходная);

// Добавляем новое условие отбора по нужной колонке
НовыйОтбор = Построитель.Отбор.Добавить("Отображать");
НовыйОтбор.ВидСравнения = ВидСравнения.Равно;
НовыйОтбор.Значение = Истина;
НовыйОтбор.Использование = Истина;

// Выполняем построитель запроса и выгружаем результат в отображаемую на форме таблицу
Построитель.Выполнить();
тзНаФорме = Построитель.Результат.Выгрузить();

С помощью ПостроительЗапроса мы получаем практически безграничные возможности фильтрации, аналогичные тем, что используются в полноценных отчетах. Мы можем использовать виды сравнения ВидСравнения.ВСписке, ВидСравнения.Содержит, ВидСравнения.НеРавно и многие другие. При этом скорость работы механизма остается чрезвычайно высокой даже на десятках тысяч строк.

Способ 3. Использование временной Табличной части для сохранения оригинального кода

Существует еще один хитрый архитектурный прием, который позволяет полностью сохранить ваш оригинальный рабочий код, использовавший свойство ОтборСтрок. Если вы разрабатываете внешний отчет или обработку, либо вносите изменения в конфигурацию, где допустимо создание вспомогательных объектов, вы можете использовать Временную табличную часть.

Давайте проанализируем последовательность действий для реализации этого метода:

  1. В окне конфигуратора откройте свойства вашей обработки или отчета и добавьте новую табличную часть (назовем ее ВременнаяТЧ).
  2. Создайте в ней точно такие же колонки, какие должна содержать ваша таблица значений с данными.
  3. В свойствах табличного поля на форме укажите в качестве пути к данным (свойство Данные) не реквизит формы типа ТаблицаЗначений, а созданную табличную часть объекта: ЭтотОбъект.ВременнаяТЧ.
  4. Теперь, когда вам нужно заполнить таблицу данными из вашего алгоритма, просто загрузите таблицу значений в табличную часть одной строчкой кода:

// Загружаем данные из таблицы значений в полноценную табличную часть объекта
ЭтотОбъект.ВременнаяТЧ.Загрузить(ВашаТаблицаЗначений);

Поскольку источником данных для элемента управления на форме теперь выступает полноценная табличная часть объекта метаданных, платформа 1С автоматически активирует для него свойство ОтборСтрок. Теперь вы можете безбоязненно использовать ваш исходный код для управления видимостью строк:


// Настраиваем стандартный отбор строк по колонке Отображать
ЭлементыФормы.ИмяВашегоТабличногоПоля.ОтборСтрок.Отображать.Использование = Истина;
ЭлементыФормы.ИмяВашегоТабличногоПоля.ОтборСтрок.Отображать.ВидСравнения = ВидСравнения.Равно;
ЭлементыФормы.ИмяВашегоТабличногоПоля.ОтборСтрок.Отображать.Значение = Истина;

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

Подведем итоги

Мы подробно проанализировали три кардинально отличающихся подхода к решению проблемы отсутствия свойства ОтборСтрок при работе с коллекцией ТаблицаЗначений в обычных формах 1С. Каждый из методов имеет свои неоспоримые преимущества:

Выбирайте метод, который наиболее гармонично вписывается в архитектурные рамки вашей текущей задачи, и продолжайте повышать уровень своего мастерства в разработке на платформе 1С:Предприятие!

← На главную