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