Как исправить ошибку «Тип не определен (НастройкаПериода)» при открытии отчета в 1С?

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

При попытке открыть или сформировать внешний отчет в 1С разработчики и пользователи нередко сталкиваются с синтаксической ошибкой компиляции модуля:

{ВнешнийОтчет.КредиторскаяЗадолженность.МодульОбъекта(1111,26)}: Тип не определен (НастройкаПериода)
НастройкаПериода = Новый <<?>>НастройкаПериода;

Проанализируем природу этой ошибки, выясним, в каких контекстах доступен объект НастройкаПериода, и разберем по шагам все варианты устранения проблемы.

Причины возникновения ошибки

Для понимания источника проблемы рассмотрим особенности платформы 1С:Предприятие 8:

  1. Ограничение контекста типа НастройкаПериода. Данный тип относится к интерфейсным механизмам обычных форм и доступен исключительно в контексте Толстый клиент (обычное приложение). Он принципиально не поддерживается на Сервере, в Тонком клиенте, Веб-клиенте, а также в режиме Толстый клиент (управляемое приложение).
  2. Контекст компиляции модуля объекта. Код МодульОбъекта внешнего отчета в управляемом приложении или в клиент-серверной архитектуре компилируется на стороне сервера. Так как тип НастройкаПериода на сервере отсутствует, компилятор платформы выдает ошибку неопределенного типа при попытке инициализации объекта через конструктор Новый.
  3. Разница между толстым клиентом управляемого и обычного приложения. Запуск базы с помощью толстого клиента в конфигурации с управляемым интерфейсом переводит сеанс в контекст управляемого приложения. Даже при запуске в толстом клиенте объектная модель обычного интерфейса не инициализируется.

Способ 1. Замена на универсальный тип «СтандартныйПериод»

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

Посмотрим на пример адаптации кода модуля объекта:


// Создание и заполнение стандартного периода
ПериодОтчета = Новый СтандартныйПериод;
ПериодОтчета.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;

// Получение граничных дат для параметров запроса или СКД
ДатаНачала = ПериодОтчета.ДатаНачала;
ДатаОкончания = ПериодОтчета.ДатаОкончания;

Способ 2. Использование инструкций препроцессора

Если отчет должен оставаться универсальным и поддерживать запуск как в обычном, так и в управляемом интерфейсе, необходимо ограничить компиляцию фрагментов кода с помощью директив препроцессора. Разберем, как это реализовать:


#Если ТолстыйКлиентОбычноеПриложение Тогда
    НастройкаПериода = Новый НастройкаПериода;
    // Логика работы с диалогом настройки периода в обычном приложении
#Иначе
    // Альтернативная логика для сервера и управляемого клиента
    ПериодОтчета = Новый СтандартныйПериод;
#КонецЕсли

Использование директивы #Если ТолстыйКлиентОбычноеПриложение Тогда предотвращает проверку и компиляцию недоступного типа данных при выполнении кода на сервере или в управляемом сеансе.

Способ 3. Перенос интерактивных вызовов в модуль формы

Вызов диалоговых окон (например, метода Редактировать() объекта НастройкаПериода) не должен находиться в МодульОбъекта. Интерактивная работа с пользователем должна происходить исключительно на клиенте в модуле формы отчета.

  1. В модуле формы отчета организуем выбор или настройку периода пользователем.
  2. Передаем уже вычисленные даты (ДатаНачала, ДатаОкончания) или заполненную структуру параметров в модуль объекта отчета.
  3. В модуле объекта выполняем только алгоритмы формирования выборки и компоновки данных без обращения к интерфейсным типам.

Способ 4. Запуск информационной базы в режиме обычного приложения

Если отчет разработан исключительно для старых версий типовых конфигураций на обычных формах и менять его программный код не планируется, необходимо обеспечить запуск информационной базы в соответствующем режиме:

  1. В окне запуска 1С:Предприятия откроем свойства информационной базы (кнопка Изменить).
  2. В поле Дополнительные параметры запуска укажем ключ командной строки: /RunModeOrdinaryApplication.
  3. Если доступен Конфигуратор, проверим свойства корневого узла конфигурации: свойство Основной режим запуска должно иметь значение Обычное приложение.
← На главную