В разработке отчетов на системе компоновки данных (СКД) часто возникает задача сделать определенные параметры обязательными для заполнения. Например, если пользователь не укажет Тип цен или Период, отчет может выдать некорректные данные или вызвать ошибку в запросе. Рассмотрим подробно все способы реализации такой проверки: от простых настроек без программирования до гибкого управления в коде модулей.
Самый простой путь, не требующий написания кода, — это использование встроенных механизмов СКД. Разберем, как это настроить в конструкторе схемы.
ТипЦен).Важный нюанс: часто разработчики жалуются, что эта настройка «не работает». Проанализируем ситуацию: если параметр выведен в Пользовательские настройки, система может игнорировать этот флаг, так как приоритет отдается настройкам, которые пользователь видит на форме. Чтобы флаг сработал гарантированно, убедитесь, что в свойствах пользовательской настройки также не допущена возможность очистки.
Это наиболее универсальный и «правильный» метод с точки зрения архитектуры 1С. Проверка в модуле отчета сработает всегда: и при нажатии кнопки «Сформировать» на форме, и при программном вызове, и при запуске отчета в регламентном задании. При необходимости можно изучить комплексный пример программного формирования отчета на СКД с настройкой параметров и отборов.
Рассмотрим реализацию в модуле отчета. Нам понадобится предопределенная процедура ПриКомпоновкеРезультата. Выясним, как правильно обратиться к параметрам:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем значение параметра из пользовательских настроек,
// так как именно их меняет пользователь на форме
ПараметрТипЦен = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТипЦен");
// Проверяем, включено ли использование параметра и заполнено ли его значение
Если ПараметрТипЦен <> Неопределено Тогда
Если НЕ ПараметрТипЦен.Использование ИЛИ НЕ ЗначениеЗаполнено(ПараметрТипЦен.Значение) Тогда
Сообщить("Для формирования отчета необходимо заполнить параметр 'Тип цен'!");
СтандартнаяОбработка = Ложь; // Отменяем стандартный вывод отчета
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом примере мы используем СтандартнаяОбработка = Ложь. Это критически важно, так как это останавливает дальнейшее выполнение компоновки, если проверка не пройдена.
Если ваш параметр выведен в область быстрых настроек над отчетом, он попадает в коллекцию ПользовательскиеНастройки. В этом случае поиск значения в КомпоновщикНастроек.Настройки может вернуть пустоту, даже если пользователь что-то ввел. Проанализируем код для поиска в пользовательских настройках:
Функция НайтиЗначениеПараметраВПользовательскихНастройках(ИмяПараметра)
Идентификатор = Неопределено;
// Сначала найдем идентификатор настройки в основной схеме
Для Каждого Элемент Из КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы Цикл
Если Строка(Элемент.Параметр) = ИмяПараметра Тогда
Идентификатор = Элемент.ИдентификаторПользовательскойНастройки;
Прервать;
КонецЕсли;
КонецЦикла;
// Теперь ищем само значение в пользовательских настройках
Если ЗначениеЗаполнено(Идентификатор) Тогда
Для Каждого Настройка Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если Настройка.ИдентификаторПользовательскойНастройки = Идентификатор Тогда
Возврат Настройка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Если вы работаете в управляемом приложении, можно заставить саму платформу следить за заполнением. Рассмотрим по шагам:
Да. Это подсветит поле красным пунктиром.ЭтотОбъект.ПроверитьЗаполнение().Этот способ хорош тем, что он выдает стандартные системные сообщения, к которым привыкли пользователи 1С.
Разберем ситуацию, когда параметром является период. Простая функция ЗначениеЗаполнено(Период) может вернуть Истина, даже если даты внутри периода не установлены (так как сам объект СтандартныйПериод инициализирован). В этом случае нужно проверять конкретные границы:
Если НЕ ЗначениеЗаполнено(ПараметрПериод.Значение.ДатаНачала)
ИЛИ НЕ ЗначениеЗаполнено(ПараметрПериод.Значение.ДатаОкончания) Тогда
// Сообщаем об ошибке
КонецЕсли;
Также стоит помнить об особенностях платформы 8.3.13 и выше: если у параметра снята галочка «Использование», система может передавать в запрос пустую дату (01.01.0001). Программисту следует всегда проверять свойство Использование перед тем, как анализировать Значение.
Мы рассмотрели различные подходы к контролю параметров. Рекомендуемая стратегия: для простых отчетов используйте флаг Запрещать незаполненные значения в СКД. Для сложных отчетов с множеством условий используйте модуль отчета и процедуру ПриКомпоновкеРезультата. Это гарантирует надежность работы вашего решения в любых условиях эксплуатации.