Почему отчет СКД на управляемой форме требует ручной очистки параметров для формирования

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

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

Разберем причину: почему отчет «молчит» при первом запуске

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

Когда вы нажимаете на «крестик» в поле параметра на форме, вы фактически снимаете флаг Использование в настройках компоновки. СКД перестает учитывать этот параметр в условии ГДЕ, и отчет формируется без этой фильтрации. Выясним, как сделать так, чтобы пользователю не приходилось делать это вручную.

Решение 1: Настройка свойства «Запрещать незаполненные значения»

Проанализируем вкладку «Параметры» в схеме компоновки данных. У каждого параметра есть ряд свойств, которые влияют на поведение формы отчета. Одним из ключевых является флаг «Запрещать незаполненные значения».

  1. Откройте схему компоновки данных (закладка «Параметры»).
  2. Найдите параметры, которые вызывают проблему (чаще всего это ссылки на справочники или даты).
  3. Убедитесь, что галочка в колонке «Запрещать незаполненные значения» снята. Если она установлена, СКД заблокирует выполнение отчета до тех пор, пока значение не будет введено, даже если параметр не является обязательным для логики вашего запроса.

Решение 2: Использование фигурных скобок в тексте запроса

Это один из самых профессиональных и надежных способов управления параметрами в СКД. Рассмотрим ситуацию: если вы прописываете условие в запросе напрямую, например ГДЕ Склад = &Склад, этот параметр становится жестко обязательным на уровне SQL-запроса. Если он не заполнен, система выдаст ошибку или вернет пустую выборку.

Чтобы сделать параметр «умным» и необязательным, его необходимо заключить в фигурные скобки. Посмотрим на пример трансформации кода:

Обычный запрос (вызывает ошибку при пустом параметре):


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Количество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Склад = &Склад

Правильный запрос для СКД:


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Количество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    {Продажи.Склад.* КАК Склад}

В этом случае СКД сама проанализирует настройки компоновщика. Если пользователь установил галочку «Использовать» и выбрал склад — условие добавится в запрос. Если галочка снята или значение очищено — условие просто исчезнет из итогового текста запроса, и мы получим данные по всем складам без ошибок.

Решение 3: Управление свойством «Использование» в схеме

На той же закладке «Параметры» в СКД обратим внимание на колонку «Использование». Она может принимать значения: Всегда и Авто.

Постарайтесь установить значение Авто для всех необязательных фильтров.

Решение 4: Программная инициализация параметров при открытии

Иногда проблема кроется в том, что параметры должны быть заполнены по умолчанию (например, текущей датой или основным складом пользователя), но форма открывается с пустыми настройками. Мы можем форсировать заполнение параметров в модуле объекта отчета.

Проанализируем использование предопределенной процедуры ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    ПараметрПериод = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
    Если ПараметрПериод <> Неопределено И НЕ ПараметрПериод.Использование Тогда
        ПараметрПериод.Значение = ТекущаяДата();
        ПараметрПериод.Использование = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Решение 5: Работа с кэшем пользовательских настроек

Управляемые формы 1С обладают памятью. Если вы один раз запустили отчет, ввели параметр, а потом удалили его из схемы или изменили его тип, старое «битое» значение может сохраниться в системном хранилище настроек. При открытии форма пытается применить старую настройку к новой схеме, что вызывает конфликты.

В таких случаях помогает либо полное удаление настроек пользователя через Управление настройками, либо программный сброс настроек к стандартным в процедуре ПриСозданииНаСервере модуля формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем стандартные настройки, если отчет открывается впервые в сессии
    Если НЕ Параметры.Свойство("КлючНастроек") Тогда
        Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Отчет.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    КонецЕсли;
КонецПроцедуры

Подведем итоги

Для того чтобы отчет СКД на управляемых формах работал стабильно и не требовал «лишних телодвижений» от пользователя, придерживайтесь следующих правил:

  1. Всегда используйте фигурные скобки {} в тексте запроса для необязательных параметров.
  2. Проверяйте, чтобы для параметров не стоял флаг «Запрещать незаполненные значения», если они могут оставаться пустыми.
  3. Устанавливайте режим использования Авто в настройках схемы.
  4. Если параметр важен для первого запуска — инициализируйте его программно значениями по умолчанию.

Применение этих методов позволит вашим отчетам работать предсказуемо, а пользователям — получать данные сразу после нажатия кнопки «Сформировать».

← На главную