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