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