Отчеты и Аналитика · 10 мин
Как сделать отбор обязательным в СКД 1С
Как сделать отбор обязательным в СКД 1С: настройка обязательных параметров, запрет пустых значений, проверка заполнения перед формированием отчета.
Обязательный отбор в системе компоновки данных (СКД) нужен тогда, когда отчет без указания пользователем конкретного значения теряет смысл: например, отчет по складу, который при пустом отборе попытается выгрузить данные по всей базе и «повесит» сеанс. В СКД есть несколько уровней решения — от простого свойства «Запрещать незаполненные значения» у параметра до программной проверки перед формированием.
Выбор способа зависит от того, где находится условие: в параметрах запроса, в отборах компоновки или в пользовательских настройках на форме отчета. У каждого варианта свои ограничения: свойство обязательности работает только для параметров, а для обычных элементов отбора придется использовать программную проверку или настройки быстрого доступа.
Ниже разобраны все рабочие подходы с конкретными шагами в конфигураторе, примерами кода и типичными ошибками, из-за которых «обязательный» отбор на практике оказывается необязательным.
Чем параметр отличается от отбора и почему это важно
В СКД условия задаются двумя разными механизмами. Параметры — это значения, которые подставляются прямо в текст запроса (например, &НачалоПериода, &Склад). Отборы — это условия, которые компоновщик добавляет к запросу динамически через закладку «Отбор» настроек. Эти механизмы ведут себя по-разному, и свойство обязательности существует только у параметров.
Если условие критично для работы отчета — правильнее оформить его как параметр запроса, а не как элемент отбора. Тогда вы получаете встроенную проверку платформы «из коробки», без единой строки кода. Элементы отбора пользователь может отключить флажком, и платформа не станет этому препятствовать.
Способ 1: свойство «Запрещать незаполненные значения» у параметра
Это основной и самый надежный способ. Откройте схему компоновки данных отчета, перейдите на закладку «Параметры» и найдите нужный параметр. В его свойствах установите флажок «Запрещать незаполненные значения» (в некоторых версиях платформы — «Запрет незаполненных значений»). После этого при попытке сформировать отчет с пустым параметром пользователь получит сообщение об ошибке, а отчет не начнет выполняться.
Обратите внимание на соседние свойства. «Ограничение доступности» убирает параметр из пользовательских настроек — он остается виден только разработчику. «Включать в доступные поля» определяет, можно ли использовать параметр в отборах и формулах. Для обязательного параметра, который пользователь должен заполнять, ограничение доступности включать не нужно.
Полезно задать параметру осмысленное значение по умолчанию: например, для периода — начало текущего месяца. Тогда отчет откроется уже с заполненным значением, а обязательность сработает только если пользователь сознательно очистит поле.
- 1Откройте схему компоновки данных отчета в конфигураторе
- 2Перейдите на закладку «Параметры»
- 3Выберите нужный параметр и установите флажок «Запрещать незаполненные значения»
- 4При необходимости задайте значение по умолчанию и заголовок
- 5Сохраните схему и проверьте формирование отчета с пустым значением
Способ 2: вычисляемый параметр периода через выражение
Частая ситуация: в запросе используется параметр виртуальной таблицы (например, Период у регистра накопления), и СКД автоматически создает для него параметр. Такие автоматические параметры тоже можно сделать обязательными — они отображаются в том же списке на закладке «Параметры».
Для дат удобно задавать значение через выражение на встроенном языке, например НачалоМесяца(ТекущаяДатаСеанса()). Для этого в поле «Значение» параметра укажите тип «Выражение» и введите формулу. Так отчет всегда открывается с актуальным периодом, а пользователь меняет его только при необходимости.
Способ 3: программная проверка перед формированием
Когда условие реализовано как элемент отбора (а не параметр), встроенного свойства обязательности нет. Решение — проверить настройки компоновщика в модуле объекта отчета в обработчике ПриКомпоновкеРезультата и при необходимости отказаться от формирования с понятным сообщением.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ОтборСклад = Неопределено;
Для Каждого Элемент Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад") Тогда
ОтборСклад = Элемент;
КонецЕсли;
КонецЦикла;
Если ОтборСклад = Неопределено
Или Не ОтборСклад.Использование
Или Не ЗначениеЗаполнено(ОтборСклад.ПравоеЗначение) Тогда
СтандартнаяОбработка = Ложь;
Сообщить("Не заполнен обязательный отбор по складу. Отчет не сформирован.");
Возврат;
КонецЕсли;
КонецПроцедурыУстановка СтандартнаяОбработка = Ложь полностью отменяет формирование, поэтому сообщение пользователю должно быть конкретным: какое поле не заполнено и где его найти. Размытое «заполните отборы» приводит к лишним обращениям в поддержку.
Учтите, что элементы отбора могут быть вложены в группы. Если структура отбора сложная, обход нужно делать рекурсивно или искать элемент через пользовательские настройки по идентификатору. Для простых отчетов с плоским списком отборов достаточно прямого перебора, как в примере.
Способ 4: обязательный отбор через пользовательские настройки
Компромиссный вариант — сделать отбор максимально заметным, чтобы пользователь не мог его «потерять». На закладке «Настройки» схемы компоновки в окне пользовательских настроек добавьте элемент отбора и установите ему режим редактирования «Быстрый доступ». Тогда поле отбора появится прямо на форме отчета рядом с кнопкой «Сформировать».
Сам по себе быстрый доступ не делает отбор обязательным, но в связке с программной проверкой из предыдущего раздела это дает хороший результат: поле всегда на виду, а попытка сформировать отчет с пустым значением корректно блокируется с объяснением причины.
Дополнительно можно задать отбору значение по умолчанию в настройках схемы — например, основной склад или текущую организацию. Тогда в большинстве случаев пользователю вообще не придется ничего заполнять вручную.
Сравнение способов
Самый простой и надежный. Работает только для параметров запроса, не для элементов отбора.
Универсальный вариант для любых условий, включая отборы. Требует кода и аккуратной обработки вложенных групп.
Не блокирует формирование, но снижает число ошибок. Подходит как дополнение к проверке.
Как выбрать подходящий способ
Правило простое: все, что можно превратить в параметр, должно стать параметром. Если условие участвует в запросе к виртуальной таблице или фильтрует итоговую выборку по конкретному значению — перенесите его в параметры и включите запрет незаполненных значений. Это работает на уровне платформы и не ломается при изменении настроек пользователем.
Программную проверку оставьте для случаев, когда условие нельзя выразить параметром: сложные комбинации отборов, взаимосвязанные условия («заполнен хотя бы один из двух отборов»), проверки по правам доступа. Не дублируйте оба механизма для одного и того же условия без необходимости — это усложняет поддержку.
Как выбрать действие
Проверка результата и типичные ошибки
После настройки проверьте три сценария: формирование с пустым значением (должна быть блокировка или понятное сообщение), формирование с заполненным значением (отчет строится корректно) и открытие отчета с сохраненным вариантом настроек (настройки не конфликтуют с обязательностью).
Отдельная ловушка — динамические списки и внешние отчеты. У внешних отчетов обработчик ПриКомпоновкеРезультата работает так же, но отладку нужно выполнять через подключение внешнего отчета в режиме предприятия, что замедляет цикл проверки. Для динамических списков на формах обязательность обычно реализуется через обработчики формы, а не через СКД напрямую.
Что важно запомнить
Обязательность «из коробки» есть только у параметров — включайте «Запрещать незаполненные значения». Для элементов отбора используйте программную проверку в ПриКомпоновкеРезультата, а быстрый доступ и значения по умолчанию применяйте как дополнение, а не замену проверки.
Частые вопросы
Почему флажок «Запрещать незаполненные значения» установлен, но отчет все равно формируется?
Чаще всего параметр не используется в тексте запроса или в настройках компоновки, поэтому платформа не передает его в компоновщик и проверка не выполняется. Проверьте, что параметр реально упоминается в запросе через конструкцию &ИмяПараметра и не отключен в пользовательских настройках.
Можно ли сделать обязательным обычный элемент отбора без кода?
Нет, штатного свойства обязательности у элементов отбора нет. Варианты без кода: перенести условие в параметр запроса или вынести отбор в быстрый доступ со значением по умолчанию. Полноценная блокировка формирования для отбора возможна только программно.
Как потребовать заполнить хотя бы один из двух отборов?
Только программно: в обработчике ПриКомпоновкеРезультата проверьте оба условия через «ИЛИ» и отмените стандартную обработку, если не заполнено ни одно. В сообщении перечислите оба варианта, чтобы пользователь понимал, что достаточно заполнить любой из них.
Работает ли обязательность параметра в отчетах на управляемых формах?
Да, свойство «Запрещать незаполненные значения» контролируется платформой независимо от типа клиента и формы. Проверка срабатывает при формировании отчета как в тонком, так и в веб-клиенте.
Что делать, если обязательный параметр мешает отладке схемы в консоли СКД?
В консоли компоновки заполните параметр вручную перед выполнением. Если нужно временно отключить обязательность, снимите флажок в копии схемы, а не в рабочей — иначе есть риск забыть вернуть настройку и отправить в эксплуатацию отчет без защиты от пустых значений.