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

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

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

Метод 1. Настройка параметров выбора в схеме СКД

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

Рассмотрим по шагам, как это реализовать:

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

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

Метод 2. Использование условий в тексте запроса

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

Проанализируем пример запроса, который эффективно решает эту задачу:


ВЫБРАТЬ
    ТЧ.Сотрудник КАК Сотрудник,
    ТЧ.Ответственный КАК Ответственный
ИЗ
    Документ.НазначениеЗадач.Сотрудники КАК ТЧ
ГДЕ
    ТЧ.Ответственный = ИСТИНА

Однако, как справедливо замечено в обсуждении, простая проверка ГДЕ Ответственный = ИСТИНА может работать некорректно, если поле содержит значение NULL (например, при левом соединении). В таких случаях рекомендуется использовать конструкцию ЕСТЬИСТИНА:


ГДЕ
    ЕСТЬИСТИНА ТЧ.Ответственный

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

Метод 3. Создание вычисляемого поля для фильтрации

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

Рассмотрим алгоритм действий:

  1. Перейдем на закладку Вычисляемые поля.
  2. Добавим поле с именем ТолькоОтветственные.
  3. В выражении пропишем логику: ВЫБОР КОГДА Ответственный ТОГДА Сотрудник ИНАЧЕ НЕОПРЕДЕЛЕНО КОНЕЦ.
  4. В настройках отчета (закладка Отбор) предложим пользователю использовать именно это поле.

Таким образом, если пользователь выберет условие "Заполнено" для поля ТолькоОтветственные, система автоматически отсечет всех сотрудников, у которых чек-бокс не установлен.

Метод 4. Ограничение выбора через «Связи параметров выбора»

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

Разберем, как это работает: в настройках поля Сотрудник мы указываем связь по полю Подразделение. Теперь, если в отчете выбран "Цех №1", в списке выбора сотрудников для отбора система покажет только тех, кто работает в этом цеху И является ответственным (при условии совмещения с Методом 1).

Метод 5. Программная установка отбора в модуле отчета

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

Рассмотрим пример кода, который принудительно добавляет условие по ответственному лицу:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем настройки пользователя
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Находим или добавляем элемент отбора
    ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ответственный");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Истина;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    
    // Выполняем стандартную компоновку с новыми настройками
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

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

Выясним причины возможных ошибок

При работе с чек-боксами в ТЧ часто возникает проблема "дублирования" или "пустых строк". Это происходит, если запрос построен по всей табличной части без группировки. Если один сотрудник в одном документе отмечен как ответственный, а в другом — нет, обычный отбор может вывести обе строки или ни одной.

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

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

← На главную