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