Как установить отбор в обычном списке документов по результатам запроса?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В разработке на обычных формах 1С часто возникает задача: отфильтровать список документов (например, заказов покупателей) по критериям, которых нет в реквизитах самого документа. Типичный пример — отображение заказов, оплаченных за определенный интервал времени, когда факт и дата оплаты фиксируются в других документах или регистрах накопления. Разберем, как реализовать такой отбор с помощью произвольного запроса и встроенных механизмов работы с табличным полем.

Принцип работы отбора в обычных формах

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

  1. Выполнить запрос и получить массив или таблицу ссылок на требуемые документы.
  2. Выгрузить полученные ссылки в объект СписокЗначений.
  3. Установить в коллекции Отбор табличного поля условие по полю Ссылка с видом сравнения ВидСравнения.ВСписке.

Пошаговая реализация установки отбора

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

Разберем программный код установки отбора:


// 1. Формируем и выполняем запрос
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   ВзаиморасчетыСКонтрагентами.Сделка КАК Ссылка
    |ИЗ
    |   РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами
    |ГДЕ
    |   ВзаиморасчетыСКонтрагентами.Период МЕЖДУ &ДатаНач И &ДатаКон
    |   И ВзаиморасчетыСКонтрагентами.Сделка ССЫЛКА Документ.ЗаказПокупателя";

Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаОкончания));

РезультатЗапроса = Запрос.Выполнить();

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

// 3. Устанавливаем отбор в табличном поле ДокументСписок
ДокументСписок.Отбор.Ссылка.Установить(ВидСравнения.ВСписке, СписокСсылок);

Проанализируем ключевые методы, использованные в коде:

  1. Быстрая выгрузка колонки: Конструкция РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка") возвращает массив ссылок, который метод ЗагрузитьЗначения() сразу загружает в СписокЗначений без обхода строк в цикле.
  2. Метод Установить(): Метод ДокументСписок.Отбор.Ссылка.Установить(...) заменяет раздельное заполнение свойств ВидСравнения, Значение и Использование = Истина. Это делает код более компактным и исключает ошибки инициализации.
  3. Обработка пустой выборки: Если запрос не нашел ни одного документа и в отбор передан совершенно пустой СписокЗначений, платформа может проигнорировать условие и отобразить полный список записей. Передача Документы.ЗаказПокупателя.ПустаяСсылка() гарантирует, что журнал останется пустым.

Снятие установленного отбора

Для возврата журнала к стандартному отображению документов достаточно отключить использование отбора по полю Ссылка:

ДокументСписок.Отбор.Ссылка.Использование = Ложь;

Ограничения и риски производительности

При использовании фильтрации через список ссылок важно учитывать архитектурные особенности платформы 1С и СУБД:

  1. Ограничение на количество элементов: При виде сравнения ВидСравнения.ВСписке платформа формирует SQL-запрос с конструкцией IN (...). Если результат запроса возвращает более 1000–2000 документов, навигация по журналу существенно замедляется, а на некоторых серверах баз данных может возникнуть аппаратная ошибка переполнения параметров.
  2. Нагрузка на память: Выгрузка сотен тысяч ссылок на сторону клиента создает избыточную нагрузку на рабочую станцию.

Альтернативные варианты реализации

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

  1. Использование Таблицы Значений на форме: Стандартный элемент ДокументСписок заменяют на ТабличноеПоле с типом данных ТаблицаЗначений. Запрос напрямую выгружает данные в эту таблицу. Для открытия карточки документа назначается обработчик события Выбор с вызовом ОткрытьЗначение(Элемент.ТекущиеДанные.Ссылка).
  2. Хранение состояния в регистре сведений: Если признак (например, «Оплачен полностью») требуется отслеживать постоянно, создают непериодический регистр сведений. При проведении документов оплаты статус заказа записывается в регистр. В таком случае отбор можно настроить штатными критериями отбора без динамических запросов в коде формы.
← На главную