Почему возникает ошибка "Значение не является значением объектного типа (ДатаНачала)" при открытии отчета и как её исправить?

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

При разработке и внедрении новых отчетов в конфигурации, использующие Библиотеку стандартных подсистем (БСП), разработчики часто сталкиваются со специфической ошибкой в общем модуле ОтчетыСервер. Ошибка вида "Значение не является значением объектного типа (ДатаНачала)" обычно возникает в момент инициализации формы отчета или при попытке системы программно сформировать заголовок. Проблема заключается в том, что программный код БСП ожидает получить объект типа СтандартныйПериод, но вместо него получает Неопределено, Ложь или значение другого типа.

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

Разберем причину ошибки в контексте БСП

Для начала выясним причину, по которой код обращается к свойству ДатаНачала. В типовых конфигурациях (таких как УНФ, УТ 11, ERP или КА) за формирование печатных форм и работу с настройками отвечает модуль ОтчетыСервер. Когда отчет открывается, система анализирует параметры Схемы компоновки данных (СКД). Если в настройках отчета присутствует параметр с именем Период или СтандартныйПериод, БСП пытается извлечь из него даты начала и окончания для вывода в заголовок отчета.

Рассмотрим фрагмент кода, на котором обычно происходит остановка:


// Фрагмент типичного кода БСП
НачалоПериода = СвойстваНастройки.Значение.ДатаНачала;
КонецПериода  = СвойстваНастройки.Значение.ДатаОкончания;

Если СвойстваНастройки.Значение оказывается пустым (Неопределено), обращение к свойству через точку вызывает исключение. Это происходит потому, что механизм БСП "увидел" параметр периода, но не смог получить его корректную структуру.

Проанализируем настройки параметров в СКД

Одной из наиболее частых причин является путаница в именах параметров. Давайте посмотрим на пример запроса, который может вызвать проблему:


ВЫБРАТЬ
    Запасы.Период,
    Запасы.Количество
ИЗ
    РегистрНакопления.Запасы КАК Запасы
ГДЕ
    Запасы.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

В данном случае в СКД создаются два независимых параметра: &ДатаНачала и &ДатаОкончания. Однако, если в этой же схеме или в пользовательских настройках "затесался" параметр с именем Период, система БСП может попытаться использовать его как основной. Если при этом Период не заполнен или имеет тип, отличный от СтандартныйПериод, возникнет ошибка.

Что нужно проверить в конструкторе СКД:

  1. Перейдите на закладку Параметры.
  2. Проверьте наличие параметра с именем Период. Если вы используете &ДатаНачала и &ДатаОкончания напрямую в запросе, убедитесь, что тип данных у них строго ограничен значением Дата.
  3. Если вы хотите использовать удобный выбор периода (весь месяц, прошлый квартал и т.д.), лучше создать один параметр Период с типом СтандартныйПериод, а в выражениях для &ДатаНачала и &ДатаОкончания прописать &Период.ДатаНачала и &Период.ДатаОкончания соответственно.
  4. Обратите внимание на флаг Ограничение доступности. Если параметр Период скрыт от пользователя, но система пытается к нему обратиться программно, это может привести к передаче Неопределено.

Выясним причину появления значения "Ложь"

Иногда в отладчике можно увидеть, что значение параметра равно Ложь. Это верный признак того, что в системе произошел конфликт типов. Проанализируем ситуацию: если в СКД параметр помечен как доступный для списка значений или имеет составной тип, а БСП ожидает конкретный объект, может произойти некорректное приведение типов при инициализации настроек по умолчанию.

Также проверьте колонку Выражение. Если там написано &СтандартныйПериод.ДатаНачала, а сам &СтандартныйПериод в этот момент не инициализирован (пуст), платформа может вернуть Ложь или Неопределено при попытке вычисления выражения.

Устраним проблему с кешированием настроек

Часто бывает так: вы исправили отчет в конфигураторе, загрузили его, но ошибка сохраняется. Почему? Ответ кроется в Хранилище настроек. 1С сохраняет последние использованные настройки отчета для каждого пользователя индивидуально.

Если вы запускали "битую" версию отчета, система запомнила некорректную структуру параметров. При новом запуске она пытается применить старые (ошибочные) настройки к новой схеме. Чтобы решить эту проблему, выполните следующие действия:

  1. Откройте отчет в режиме "1С:Предприятие".
  2. Нажмите кнопку Еще (или "Все действия").
  3. Выберите пункт Установить стандартные настройки.
  4. Если отчет вообще не открывается из-за ошибки, воспользуйтесь формой управления настройками пользователей (в разделе Администрирование) и очистите настройки для данного конкретного отчета.

Рассмотрим влияние интеграции внешнего отчета

Если вы разрабатываете отчет как внешний (.erf), а затем добавляете его в справочник Дополнительные отчеты и обработки, имейте в виду особенности регистрации. При загрузке файла в справочник система считывает параметры и сохраняет их в реквизитах справочника или в системных таблицах БСП.

Посмотрим на алгоритм правильного обновления:

При изменении состава параметров в конфигураторе недостаточно просто заменить файл в справочнике. Рекомендуется:

Подведем итог и составим правильную структуру параметров

Чтобы избежать подобных ошибок в будущем, рекомендуется придерживаться следующей структуры в СКД для отчетов на БСП:

  1. Создаем основной параметр СтандартныйПериод (имя может быть любым, например, ПериодОтчета).
  2. Устанавливаем для него Значение по умолчанию (например, "Этот месяц"). Это критически важно, чтобы свойство Значение в СвойстваНастройки никогда не было пустым.
  3. Для технических параметров &ДатаНачала и &ДатаОкончания, которые используются в тексте запроса, устанавливаем флаг Ограничение доступности.
  4. В поле Выражение для &ДатаНачала пишем &ПериодОтчета.ДатаНачала, а для &ДатаОкончания — &ПериодОтчета.ДатаОкончания.

Такой подход гарантирует, что программный код БСП всегда найдет объект нужного типа, а пользователь получит удобный интерфейс для выбора дат.

← На главную