Почему не отрабатывает выражение КонецДня в параметрах СКД и как правильно настроить период?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Промышленность, строительство и АПК
← На главную

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

Разбор ошибки: функции языка 1С vs выражения СКД

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

Решение 1: Использование «Стандартного периода»

Самый правильный и профессиональный способ работы с датами в отчетах — это использование типа данных СтандартныйПериод. Когда пользователь выбирает период в стандартном поле ввода 1С, система автоматически «зашивает» в него точные границы:

Таким образом, вам не нужно принудительно «докручивать» время — оно уже корректно. Рассмотрим, как это внедрить в ваш отчет:

  1. Создайте параметр Период с типом данных СтандартныйПериод.
  2. В тексте запроса обращайтесь к нему напрямую, используя свойства объекта: &Период.ДатаНачала и &Период.ДатаОкончания.

Пример использования в запросе:


ВЫБРАТЬ
    ХозрасчетныйОбороты.СуммаОборот
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&Период.ДатаНачала, &Период.ДатаОкончания, , , , , , ) 
    КАК ХозрасчетныйОбороты

Решение 2: Отказ от избыточных параметров

Многие разработчики совершают ошибку, создавая дополнительные параметры НачПер и КонПер, а затем пытаясь связать их с основным периодом. Это усложняет структуру отчета и создает путаницу в передаче данных. Если вы уже используете СтандартныйПериод, удалите лишние параметры и используйте только один — это сделает ваш отчет чище и избавит от необходимости писать «выражения» для параметров.

Почему выражение в параметрах — это «минное поле»?

Рассмотрим несколько причин, почему работа с выражением параметра требует осторожности:

Рекомендации по отладке

Если отчет упорно выдает пустой результат, проанализируйте содержимое параметров перед выполнением запроса. Вы можете сделать это через отладчик в модуле объекта (если отчет реализован как внешний отчет):


// В модуле объекта
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    // Поставьте здесь точку останова и изучите КомпоновщикНастроек
    Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
    // Проверьте значения параметров перед тем, как они попадут в запрос
КонецПроцедуры

Подводя итог: самый надежный путь — это минимизация кода в выражениях параметров. Используйте СтандартныйПериод, передавайте его целиком в параметры данных, а в самом тексте запроса обращайтесь к ДатаНачала и ДатаОкончания. Это избавит вас от множества ошибок и сделает работу с отчетами 1С предсказуемой и удобной.

← На главную