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