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