Как в СКД настроить выбор договора в зависимости от выбранного контрагента?

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

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

В этой статье мы подробно разберем, как заставить СКД соблюдать иерархию «Владелец — Подчиненный» для полей отбора, используя стандартные механизмы платформы 1С:Предприятие 8.3.

Причина проблемы: Особенности составных типов (Субконто)

Разберем ситуацию: почему связь не работает «из коробки»? Поля Субконто1, Субконто2 и последующие в регистрах бухгалтерии имеют составной тип данных. Система не может заранее предугадать, какой именно справочник будет выбран в конкретной строке или отборе. Чтобы механизм Связи параметров выбора сработал, нам необходимо явно указать системе типы данных этих полей.

Рассмотрим по шагам, как настроить корректное поведение отборов.

Шаг 1. Типизация данных в запросе СКД

Первым делом проанализируем наш запрос. Для того чтобы СКД понимала, что в Субконто1 у нас всегда (или в рамках данного отчета) находится контрагент, а в Субконто2 — договор, лучше всего использовать оператор ВЫРАЗИТЬ. Это упростит дальнейшую настройку метаданных.

Посмотрим на пример фрагмента запроса:


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

Чтобы типизация была жесткой, изменим его следующим образом:


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

Это гарантирует, что в наборе данных СКД поля Контрагент и Договор получат конкретные ссылочные типы вместо Характеристика.ВидыСубконтоХозрасчетные.

Шаг 2. Ограничение типа в Наборе данных

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

  1. Перейдем на закладку Наборы данных.
  2. Найдем поле Договор (или Субконто2).
  3. В колонке Тип значения нажмем на кнопку выбора и оставим флажок только напротив справочника ДоговорыКонтрагентов.
  4. Повторим аналогичную операцию для поля Контрагент, ограничив его справочником Контрагенты.

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

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

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

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

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

Проанализируем результат: теперь, когда пользователь в окне отчета выберет контрагента «Ромашка», при нажатии на выбор договора система автоматически применит фильтр Владелец = "Ромашка".

Шаг 4. Очистка зависимых полей

Для улучшения пользовательского опыта полезно настроить автоматическую очистку. Представим ситуацию: пользователь выбрал контрагента «Альфа» и его договор №1. Затем он передумал и выбрал контрагента «Бетта». Если договор №1 останется в поле отбора, отчет может не выдать данных или выдать некорректный результат.

В окне Связи параметров выбора (там же, где мы настраивали Отбор.Владелец) есть колонка Очищать при изменении. Установите там флажок. Теперь при смене контрагента поле договора будет автоматически обнуляться, заставляя пользователя сделать корректный выбор.

Шаг 5. Нюансы использования видов сравнения

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

Если ваша задача требует обязательной фильтрации списка договоров по списку контрагентов, стандартными настройками Связи параметров выбора в СКД обойтись не получится — здесь потребуется создание собственной формы отчета и написание кода на языке 1С для обработки события выбора.

Резюме

Для реализации корректной привязки договора к контрагенту в СКД нам необходимо:

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

← На главную