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

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

При разработке отчетов на схеме компоновки данных (СКД), особенно для регистров бухгалтерии, разработчики часто сталкиваются с необходимостью связать два параметра или отбора. Классический пример: связь полей Контрагент и Договор. Мы ожидаем, что при выборе контрагента в списке договоров будут отображаться только те договоры, которые принадлежат именно этому контрагенту (отбор по владельцу). Однако на практике стандартная настройка связей параметров выбора часто отказывается работать, из-за чего пользователю выводится полный список договоров по всей базе данных.

В этой статье мы подробно разберем, почему возникает эта проблема, как правильно настроить связи параметров выбора для субконто на уровне схемы компоновки данных без написания лишнего кода, а также выясним, есть ли реальная разница в производительности между использованием жестких параметров в запросе и стандартных отборов СКД.

Почему не работает стандартная связь для субконто?

Основная сложность при работе с субконто заключается в том, что субконто в планах счетов 1С имеет составной тип данных, базирующийся на Плане видов характеристик (ПВХ). Для платформы поля Субконто1, Субконто2 и так далее являются неопределенными до тех пор, пока система не обратится к конкретному счету. Из-за этой неопределенности стандартный механизм связи параметров выбора на форме не понимает, к какому именно справочнику обращаться и по какому владельцу делать фильтрацию.

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

Шаг 1. Явное приведение типов в тексте запроса

Если мы выбираем данные непосредственно из виртуальных таблиц регистра бухгалтерии (например, остатки или обороты), поля субконто возвращаются с составным типом данных. Чтобы СКД однозначно понимала, с какими типами мы работаем, необходимо применить оператор ВЫРАЗИТЬ непосредственно в тексте запроса.

Рассмотрим пример исходного запроса, где выбираются остатки по счету:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
    ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
    ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки

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


ВЫБРАТЬ
    ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
    ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
    ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки

После этого СКД получит типизированные поля Контрагент и Договор вместо универсальных и неопределенных Субконто1 и Субконто2.

Шаг 2. Настройка типов данных на вкладке "Наборы данных"

Несмотря на то, что мы применили оператор ВЫРАЗИТЬ в запросе, СКД может все еще сомневаться в типах полей при автоматическом построении метаданных. Поэтому перейдем на вкладку Наборы данных и найдем наши поля:

  1. В строке поля Контрагент в колонке Тип значения принудительно укажем тип СправочникСсылка.Контрагенты.
  2. В строке поля Договор укажем тип СправочникСсылка.ДоговорыКонтрагентов.

Это гарантирует, что система на уровне метаданных схемы компоновки будет точно знать структуру используемых объектов.

Шаг 3. Настройка связей параметров выбора

Теперь перейдем к непосредственной настройке логики фильтрации. Настроить связь параметров выбора можно как для параметров отчета (на вкладке Параметры), так и для полей набора данных (на вкладке Наборы данных), в зависимости от того, как именно пользователь задает условия в отчете.

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

  1. Найдите параметр Договор.
  2. В колонке Параметры редактирования нажмите на многоточие.
  3. В открывшемся окне найдите свойство Связи параметров выбора.
  4. Добавьте новую строку:
    • В колонке Имя параметра редактирования укажите значение Отбор.Владелец. Это стандартное имя отбора для подчиненных справочников в платформе 1С.
    • В колонке Поле источника укажите путь к значению контрагента. Важно: для параметров СКД здесь нужно прописать полный путь с префиксом, а именно ПараметрыДанных.Контрагент. Без этого префикса платформа на клиенте не сможет сопоставить данные.

Если же вы настраиваете отбор через стандартные настройки компоновки на вкладке Настройки -> Отбор, аналогичную связь параметров выбора нужно прописать на вкладке Наборы данных для поля Договор. В этом случае в поле источника указывается просто имя поля — Контрагент.

Важные платформенные ограничения, о которых нужно знать

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

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

Параметры запроса против Отборов СКД: что быстрее?

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

Существует распространенное заблуждение, что если не указать параметры в самом запросе, то СУБД сначала выберет абсолютно все данные из базы (например, все движения по всем контрагентам), а затем СКД программно отфильтрует этот огромный массив в памяти компьютера. Это не так.

Процессор компоновки данных 1С — это крайне интеллектуальный механизм. Перед отправкой запроса в СУБД он выполняет синтаксический анализ схемы и динамически модифицирует итоговый SQL-запрос. Все установленные пользователем отборы СКД автоматически транслируются в параметры СУБД и внедряются непосредственно в условия ГДЕ или в параметры виртуальных таблиц (таких как ОстаткиИОбороты).

Поэтому в простых запросах (выборка из одной физической или виртуальной таблицы) производительность отбора СКД и явного параметра запроса будет абсолютно одинаковой.

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

  1. Использование временных таблиц (ВТ). Если ваш запрос в СКД состоит из пакета запросов с промежуточными временными таблицами, стандартные отборы СКД накладываются только на самый финальный запрос пакета. Это означает, что промежуточные ВТ будут собирать избыточные данные со всей базы данных без какой-либо фильтрации, что приведет к катастрофическому падению производительности. В таких схемах передача параметров непосредственно в условия создания временных таблиц является строго обязательной.
  2. Оптимизация планов запросов СУБД. Явное указание параметров в условиях виртуальных таблиц позволяет СУБД (будь то MS SQL Server или PostgreSQL) более предсказуемо строить планы запросов и гарантированно задействовать индексы таблиц. При динамическом формировании текста запроса компоновщиком СКД в редких случаях возможна ситуация, когда СУБД выберет неоптимальный индекс, что увеличит время выполнения отчета.

Таким образом, для простых отчетов рекомендуется использовать стандартные отборы СКД — это упрощает интерфейс и дает пользователю максимальную гибкость. Для сложных аналитических отчетов с тяжелыми пакетами запросов и временными таблицами необходимо сочетать использование жестких параметров запроса для оптимизации и механизмы СКД для представления данных.

← На главную