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