При разработке учетных решений в среде 1С:Предприятие 7.7 часто возникает задача предоставить пользователю гибкий инструмент для поиска и анализа документов: возможность одновременно фильтровать список по контрагенту, организации, конкретной номенклатуре, диапазону сумм и статусам. Разберем, как устроена работа со штатными журналами платформы, с какими архитектурными ограничениями сталкивается разработчик и какие существуют способы для реализации полноценного журнала с множественными отборами.
Проанализируем возможности стандартных общих и специализированных журналов документов в 1С 7.7. Штатный механизм платформы имеет жесткие ограничения:
УстановитьОтбор() позволяет активировать отбор одновременно только по одной графе отбора, одному виду документа или одному реквизиту с установленным признаком отбора. Наложить несколько независимых фильтров штатными средствами одного журнала невозможно.Если перед нами стоит задача сделать журнал с несколькими независимыми фильтрами, потребуется использовать альтернативные подходы.
Рассмотрим наиболее производительный и современный метод реализации динамических журналов в 1С 7.7 — использование внешней компоненты 1С++ и визуального элемента управления ТабличноеПоле.
Этот подход позволяет построить журнал на базе отдельной обработки или формы отчета, используя прямые SQL-запросы к базе данных (через класс ODBCRecordSet).
Разберем по шагам логику реализации такого журнала:
ТабличноеПоле, а также поля ввода для установки необходимых фильтров (организация, клиент, товар, сумма «от» и «до», период).WHERE которого подставляются только заполненные пользователем условия.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*, поддержка пейджинга и постраничной загрузки данных.
Если конфигурация должна работать в строго штатном режиме без подключения сторонних DLL-библиотек, можно использовать механизм составных граф отбора. Данный вариант подходит только для фиксированного набора реквизитов (например, одновременный отбор по паре «Организация + Контрагент»).
Разберем порядок настройки:
ФильтрОргКонтрагент) с включенным признаком отбора, либо создается соответствующая графа отбора.ПриЗаписи() реализуется заполнение этого реквизита конкатенацией уникальных идентификаторов или кодов:
ФильтрОргКонтрагент = СокрЛП(Фирма.Код) + "/" + СокрЛП(Контрагент.Код);
УстановитьОтбор() по значению склеенной строки.Недостатки: данный способ крайне негибок, не позволяет строить произвольные комбинации условий, требует перепроведения существующих документов для первичного заполнения реквизита и не работает с числовыми интервалами или табличными частями.
Рассмотрим еще один полностью штатный вариант — создание формы с элементом ТаблицаЗначений. В этом случае документы выбираются стандартным объектом Запрос или выборкой ВыбратьДокументы(), после чего выгружаются в визуальную таблицу на форме обработки.
Посмотрим на пример обработки выбора строки для открытия документа:
Процедура ПриВыбореСтроки()
Если ТаблицаДокументов.ТекущаяСтрока() > 0 Тогда
ТекущийДок = ТаблицаДокументов.ПолучитьЗначение(ТаблицаДокументов.ТекущаяСтрока(), "Документ");
Если ПустоеЗначение(ТекущийДок) = 0 Тогда
ОткрытьФорму(ТекущийДок);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Особенности реализации: при использовании штатной таблицы значений без внешних компонентов вся выборка загружается в оперативную память клиента, что на больших интервалах дат может приводить к задержкам отображения данных. Поэтому при работе со средними и крупными базами наиболее оптимальным решением остается связка 1С++ и прямых запросов.