Как реализовать журнал документов с несколькими фильтрами в 1С:Предприятии 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Ограничения стандартных журналов в платформе 1С 7.7

Проанализируем возможности стандартных общих и специализированных журналов документов в 1С 7.7. Штатный механизм платформы имеет жесткие ограничения:

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

Если перед нами стоит задача сделать журнал с несколькими независимыми фильтрами, потребуется использовать альтернативные подходы.

Способ 1. Использование внешней компоненты 1С++ и элемента «ТабличноеПоле»

Рассмотрим наиболее производительный и современный метод реализации динамических журналов в 1С 7.7 — использование внешней компоненты 1С++ и визуального элемента управления ТабличноеПоле.

Этот подход позволяет построить журнал на базе отдельной обработки или формы отчета, используя прямые SQL-запросы к базе данных (через класс ODBCRecordSet).

Разберем по шагам логику реализации такого журнала:

  1. На форму внешней обработки помещается элемент ТабличноеПоле, а также поля ввода для установки необходимых фильтров (организация, клиент, товар, сумма «от» и «до», период).
  2. При изменении любого из параметров отбора формируется динамический SQL-запрос, в секцию WHERE которого подставляются только заполненные пользователем условия.
  3. Запрос отправляется через объект ODBCRecordSet, а результат связывается с провайдером данных табличного поля.

Посмотрим на пример формирования динамического текста запроса для компоненты 1С++:


ТекстЗапроса = "
|SELECT
|    Жур.IDDOC as [Документ $Документ],
|    Жур.IDDOCDEF as [Документ_вид],
|    Жур.DATE_TIME_IDDOC as ДатаДок,
|    Жур.DOCNO as НомерДок,
|    Шапка.SP100 as [Контрагент $Справочник.Контрагенты],
|    Шапка.SP105 as СуммаДокумента
|FROM
|    _1SJOURN as Жур
|INNER JOIN
|    DH102 as Шапка ON Шапка.IDDOC = Жур.IDDOC
|WHERE
|    Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата
|    AND Жур.CLOSED & 1 = 1";

Если ВыбКонтрагент.Выбран() = 1 Тогда
    ТекстЗапроса = ТекстЗапроса + "
    |    AND Шапка.SP100 = :ВыбКонтрагент";
КонецЕсли;

Если СуммаОт > 0 Тогда
    ТекстЗапроса = ТекстЗапроса + "
    |    AND Шапка.SP105 >= :СуммаОт";
КонецЕсли;

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

Способ 2. Составные графы отбора (штатный обходной путь)

Если конфигурация должна работать в строго штатном режиме без подключения сторонних DLL-библиотек, можно использовать механизм составных граф отбора. Данный вариант подходит только для фиксированного набора реквизитов (например, одновременный отбор по паре «Организация + Контрагент»).

Разберем порядок настройки:

  1. В конфигураторе в структуру метаданных шапки документов добавляется служебный строковый реквизит фиксированной длины (например, ФильтрОргКонтрагент) с включенным признаком отбора, либо создается соответствующая графа отбора.
  2. В модуле документа в предопределенной процедуре ПриЗаписи() реализуется заполнение этого реквизита конкатенацией уникальных идентификаторов или кодов: ФильтрОргКонтрагент = СокрЛП(Фирма.Код) + "/" + СокрЛП(Контрагент.Код);
  3. В журнале документов отбор устанавливается методом УстановитьОтбор() по значению склеенной строки.

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

Способ 3. Кастомный журнал на базе «ТаблицыЗначений»

Рассмотрим еще один полностью штатный вариант — создание формы с элементом ТаблицаЗначений. В этом случае документы выбираются стандартным объектом Запрос или выборкой ВыбратьДокументы(), после чего выгружаются в визуальную таблицу на форме обработки.

Посмотрим на пример обработки выбора строки для открытия документа:


Процедура ПриВыбореСтроки()
    Если ТаблицаДокументов.ТекущаяСтрока() > 0 Тогда
        ТекущийДок = ТаблицаДокументов.ПолучитьЗначение(ТаблицаДокументов.ТекущаяСтрока(), "Документ");
        Если ПустоеЗначение(ТекущийДок) = 0 Тогда
            ОткрытьФорму(ТекущийДок);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

← На главную