При попытке открыть или сформировать внешний отчет в 1С разработчики и пользователи нередко сталкиваются с синтаксической ошибкой компиляции модуля:
{ВнешнийОтчет.КредиторскаяЗадолженность.МодульОбъекта(1111,26)}: Тип не определен (НастройкаПериода)
НастройкаПериода = Новый <<?>>НастройкаПериода;
Проанализируем природу этой ошибки, выясним, в каких контекстах доступен объект НастройкаПериода, и разберем по шагам все варианты устранения проблемы.
Для понимания источника проблемы рассмотрим особенности платформы 1С:Предприятие 8:
НастройкаПериода. Данный тип относится к интерфейсным механизмам обычных форм и доступен исключительно в контексте Толстый клиент (обычное приложение). Он принципиально не поддерживается на Сервере, в Тонком клиенте, Веб-клиенте, а также в режиме Толстый клиент (управляемое приложение).МодульОбъекта внешнего отчета в управляемом приложении или в клиент-серверной архитектуре компилируется на стороне сервера. Так как тип НастройкаПериода на сервере отсутствует, компилятор платформы выдает ошибку неопределенного типа при попытке инициализации объекта через конструктор Новый.Если отчет дорабатывается под современные конфигурации на управляемых формах, наиболее корректным решением является отказ от устаревшего объекта НастройкаПериода в пользу типа СтандартныйПериод. Тип СтандартныйПериод доступен во всех контекстах (Сервер, Модуль объекта, Тонкий и Толстый клиент) и содержит стандартные свойства ДатаНачала и ДатаОкончания.
Посмотрим на пример адаптации кода модуля объекта:
// Создание и заполнение стандартного периода
ПериодОтчета = Новый СтандартныйПериод;
ПериодОтчета.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
// Получение граничных дат для параметров запроса или СКД
ДатаНачала = ПериодОтчета.ДатаНачала;
ДатаОкончания = ПериодОтчета.ДатаОкончания;
Если отчет должен оставаться универсальным и поддерживать запуск как в обычном, так и в управляемом интерфейсе, необходимо ограничить компиляцию фрагментов кода с помощью директив препроцессора. Разберем, как это реализовать:
#Если ТолстыйКлиентОбычноеПриложение Тогда
НастройкаПериода = Новый НастройкаПериода;
// Логика работы с диалогом настройки периода в обычном приложении
#Иначе
// Альтернативная логика для сервера и управляемого клиента
ПериодОтчета = Новый СтандартныйПериод;
#КонецЕсли
Использование директивы #Если ТолстыйКлиентОбычноеПриложение Тогда предотвращает проверку и компиляцию недоступного типа данных при выполнении кода на сервере или в управляемом сеансе.
Вызов диалоговых окон (например, метода Редактировать() объекта НастройкаПериода) не должен находиться в МодульОбъекта. Интерактивная работа с пользователем должна происходить исключительно на клиенте в модуле формы отчета.
ДатаНачала, ДатаОкончания) или заполненную структуру параметров в модуль объекта отчета.Если отчет разработан исключительно для старых версий типовых конфигураций на обычных формах и менять его программный код не планируется, необходимо обеспечить запуск информационной базы в соответствующем режиме:
/RunModeOrdinaryApplication.