Как проверить заполнение параметра в отчете СКД перед формированием

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

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

Способ 1. Декларативная проверка в схеме компоновки

Самый простой путь, не требующий написания кода, — это использование встроенных механизмов СКД. Разберем, как это настроить в конструкторе схемы.

  1. Откроем схему компоновки данных и перейдем на закладку Параметры.
  2. Найдем нужный параметр (например, ТипЦен).
  3. В колонке Запрещать незаполненные значения установим флажок.

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

Способ 2. Использование модуля отчета (событие ПриКомпоновкеРезультата)

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

Рассмотрим реализацию в модуле отчета. Нам понадобится предопределенная процедура ПриКомпоновкеРезультата. Выясним, как правильно обратиться к параметрам:


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

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

В этом примере мы используем СтандартнаяОбработка = Ложь. Это критически важно, так как это останавливает дальнейшее выполнение компоновки, если проверка не пройдена.

Способ 3. Проверка через Пользовательские настройки

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


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

Способ 4. Визуальная проверка на форме (Managed Forms)

Если вы работаете в управляемом приложении, можно заставить саму платформу следить за заполнением. Рассмотрим по шагам:

  1. Если параметр СКД связан с реквизитом формы, в свойствах этого реквизита установите Проверка заполнения в значение Выдавать ошибку.
  2. В свойствах элемента формы (поля ввода) установите АвтоОтметкаНезаполненного в значение Да. Это подсветит поле красным пунктиром.
  3. Перед вызовом формирования отчета выполните метод ЭтотОбъект.ПроверитьЗаполнение().

Этот способ хорош тем, что он выдает стандартные системные сообщения, к которым привыкли пользователи 1С.

Способ 5. Нюансы для типа «СтандартныйПериод» и платформы 8.3.13+

Разберем ситуацию, когда параметром является период. Простая функция ЗначениеЗаполнено(Период) может вернуть Истина, даже если даты внутри периода не установлены (так как сам объект СтандартныйПериод инициализирован). В этом случае нужно проверять конкретные границы:


Если НЕ ЗначениеЗаполнено(ПараметрПериод.Значение.ДатаНачала) 
   ИЛИ НЕ ЗначениеЗаполнено(ПараметрПериод.Значение.ДатаОкончания) Тогда
    // Сообщаем об ошибке
КонецЕсли;

Также стоит помнить об особенностях платформы 8.3.13 и выше: если у параметра снята галочка «Использование», система может передавать в запрос пустую дату (01.01.0001). Программисту следует всегда проверять свойство Использование перед тем, как анализировать Значение.

Резюме

Мы рассмотрели различные подходы к контролю параметров. Рекомендуемая стратегия: для простых отчетов используйте флаг Запрещать незаполненные значения в СКД. Для сложных отчетов с множеством условий используйте модуль отчета и процедуру ПриКомпоновкеРезультата. Это гарантирует надежность работы вашего решения в любых условиях эксплуатации.

← На главную