К статье
Практический материал

Отчеты и Аналитика · 10 мин

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

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

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

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

Ниже разобраны все рабочие подходы с конкретными шагами в конфигураторе, примерами кода и типичными ошибками, из-за которых «обязательный» отбор на практике оказывается необязательным.

Чем параметр отличается от отбора и почему это важно

В СКД условия задаются двумя разными механизмами. Параметры — это значения, которые подставляются прямо в текст запроса (например, &НачалоПериода, &Склад). Отборы — это условия, которые компоновщик добавляет к запросу динамически через закладку «Отбор» настроек. Эти механизмы ведут себя по-разному, и свойство обязательности существует только у параметров.

Если условие критично для работы отчета — правильнее оформить его как параметр запроса, а не как элемент отбора. Тогда вы получаете встроенную проверку платформы «из коробки», без единой строки кода. Элементы отбора пользователь может отключить флажком, и платформа не станет этому препятствовать.

Способ 1: свойство «Запрещать незаполненные значения» у параметра

Это основной и самый надежный способ. Откройте схему компоновки данных отчета, перейдите на закладку «Параметры» и найдите нужный параметр. В его свойствах установите флажок «Запрещать незаполненные значения» (в некоторых версиях платформы — «Запрет незаполненных значений»). После этого при попытке сформировать отчет с пустым параметром пользователь получит сообщение об ошибке, а отчет не начнет выполняться.

Обратите внимание на соседние свойства. «Ограничение доступности» убирает параметр из пользовательских настроек — он остается виден только разработчику. «Включать в доступные поля» определяет, можно ли использовать параметр в отборах и формулах. Для обязательного параметра, который пользователь должен заполнять, ограничение доступности включать не нужно.

Полезно задать параметру осмысленное значение по умолчанию: например, для периода — начало текущего месяца. Тогда отчет откроется уже с заполненным значением, а обязательность сработает только если пользователь сознательно очистит поле.

Как включить обязательный параметр
  1. 1
    Откройте схему компоновки данных отчета в конфигураторе
  2. 2
    Перейдите на закладку «Параметры»
  3. 3
    Выберите нужный параметр и установите флажок «Запрещать незаполненные значения»
  4. 4
    При необходимости задайте значение по умолчанию и заголовок
  5. 5
    Сохраните схему и проверьте формирование отчета с пустым значением

Способ 2: вычисляемый параметр периода через выражение

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

Для дат удобно задавать значение через выражение на встроенном языке, например НачалоМесяца(ТекущаяДатаСеанса()). Для этого в поле «Значение» параметра укажите тип «Выражение» и введите формулу. Так отчет всегда открывается с актуальным периодом, а пользователь меняет его только при необходимости.

Способ 3: программная проверка перед формированием

Когда условие реализовано как элемент отбора (а не параметр), встроенного свойства обязательности нет. Решение — проверить настройки компоновщика в модуле объекта отчета в обработчике ПриКомпоновкеРезультата и при необходимости отказаться от формирования с понятным сообщением.

bsl
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    ОтборСклад = Неопределено;
    Для Каждого Элемент Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
        Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад") Тогда
            ОтборСклад = Элемент;
        КонецЕсли;
    КонецЦикла;

    Если ОтборСклад = Неопределено
        Или Не ОтборСклад.Использование
        Или Не ЗначениеЗаполнено(ОтборСклад.ПравоеЗначение) Тогда

        СтандартнаяОбработка = Ложь;
        Сообщить("Не заполнен обязательный отбор по складу. Отчет не сформирован.");
        Возврат;
    КонецЕсли;

КонецПроцедуры

Установка СтандартнаяОбработка = Ложь полностью отменяет формирование, поэтому сообщение пользователю должно быть конкретным: какое поле не заполнено и где его найти. Размытое «заполните отборы» приводит к лишним обращениям в поддержку.

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

Способ 4: обязательный отбор через пользовательские настройки

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

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

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

Сравнение способов

Свойство параметра «Запрещать незаполненные значения»

Самый простой и надежный. Работает только для параметров запроса, не для элементов отбора.

Программная проверка в ПриКомпоновкеРезультата

Универсальный вариант для любых условий, включая отборы. Требует кода и аккуратной обработки вложенных групп.

Быстрый доступ + значение по умолчанию

Не блокирует формирование, но снижает число ошибок. Подходит как дополнение к проверке.

Как выбрать подходящий способ

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

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

Маршрут решения

Как выбрать действие

Условие подставляется в запрос как конкретное значениеСделайте его параметром и включите «Запрещать незаполненные значения»
Условие — обычный элемент отбора, который пользователь может отключитьДобавьте проверку в ПриКомпоновкеРезультата с отказом от формирования
Нужно, чтобы поле было всегда на виду, но жесткая блокировка не требуетсяВынесите отбор в быстрый доступ и задайте значение по умолчанию
Обязательна хотя бы одна из нескольких настроекТолько программная проверка с условием «ИЛИ» по всем вариантам

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Свойство «Запрещать незаполненные значения» установлено, но параметр не используется в запросе — проверка не срабатывает, потому что параметр не передается в компоновку
02
Ожидание обязательности от элемента отбора — у отборов такого свойства нет, пользователь просто снимает флажок использования
03
Программная проверка ищет элемент отбора только на верхнем уровне и не находит его внутри группы — проверка молча пропускается
04
Сообщение об ошибке не указывает, какое именно поле заполнить — пользователь не понимает причину отказа
05
Значение по умолчанию задано в схеме, но сохраненный вариант отчета его переопределяет пустым значением

Отдельная ловушка — динамические списки и внешние отчеты. У внешних отчетов обработчик ПриКомпоновкеРезультата работает так же, но отладку нужно выполнять через подключение внешнего отчета в режиме предприятия, что замедляет цикл проверки. Для динамических списков на формах обязательность обычно реализуется через обработчики формы, а не через СКД напрямую.

Итог

Что важно запомнить

Обязательность «из коробки» есть только у параметров — включайте «Запрещать незаполненные значения». Для элементов отбора используйте программную проверку в ПриКомпоновкеРезультата, а быстрый доступ и значения по умолчанию применяйте как дополнение, а не замену проверки.

Частые вопросы

Почему флажок «Запрещать незаполненные значения» установлен, но отчет все равно формируется?

Чаще всего параметр не используется в тексте запроса или в настройках компоновки, поэтому платформа не передает его в компоновщик и проверка не выполняется. Проверьте, что параметр реально упоминается в запросе через конструкцию &ИмяПараметра и не отключен в пользовательских настройках.

Можно ли сделать обязательным обычный элемент отбора без кода?

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

Как потребовать заполнить хотя бы один из двух отборов?

Только программно: в обработчике ПриКомпоновкеРезультата проверьте оба условия через «ИЛИ» и отмените стандартную обработку, если не заполнено ни одно. В сообщении перечислите оба варианта, чтобы пользователь понимал, что достаточно заполнить любой из них.

Работает ли обязательность параметра в отчетах на управляемых формах?

Да, свойство «Запрещать незаполненные значения» контролируется платформой независимо от типа клиента и формы. Проверка срабатывает при формировании отчета как в тонком, так и в веб-клиенте.

Что делать, если обязательный параметр мешает отладке схемы в консоли СКД?

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