Как решить проблемы с использованием нового справочника из расширения во внешнем отчете СКД и при открытии его формы?

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

Приветствуем вас, уважаемые разработчики 1С! Работа с расширениями конфигурации прочно вошла в нашу повседневную практику. Это мощный и безопасный инструмент для кастомизации типовых решений без снятия их с поддержки. Однако при создании новых объектов метаданных (например, справочников) внутри расширения мы часто сталкиваемся со специфическим поведением платформы 1С:Предприятие. Типичные проблемы — невозможность выбрать новые таблицы в конструкторе запросов СКД внешнего отчета, а также ошибки вида "Интерактивные операции недоступны" и "Неизвестное имя формы" при попытке программно открыть форму нового объекта.

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

Часть 1. Почему внешний отчет на СКД не видит справочник из расширения?

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

Выясним причину такого поведения. Дело в том, что когда мы открываем внешний отчет (файл с расширением .erf) в Конфигураторе, среда разработки считывает метаданные исключительно из основной конфигурации. Расширение конфигурации — это динамическая сущность. Платформа подключает его и объединяет его метаданные с основными только в режиме "1С:Предприятие" (при запуске пользовательского сеанса). В режиме разработки внешнего файла Конфигуратор физически "не знает" о существовании таблиц из расширения, поэтому валидация запроса завершается ошибкой.

Важное обновление платформы: Начиная с версии платформы 8.3.28, фирма "1С" добавила долгожданную поддержку объектов расширений во внешних отчетах и обработках непосредственно в Конфигураторе. Если вы работаете на этой версии или выше, объекты активных расширений базы данных будут доступны в конструкторе. Но что делать, если ваша база работает на более ранних версиях платформы (например, на 8.3.14 или 8.3.21)?

Разберем по шагам два проверенных решения этой проблемы для старых версий платформы:

Способ 1. Временное проектирование отчета внутри расширения

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

Способ 2. Проектирование схемы через Консоль СКД в пользовательском режиме

Если мы не хотим засорять дерево метаданных расширения временными объектами, мы можем использовать инструмент "Консоль отчетов" или "Консоль компоновки данных" непосредственно в режиме "1С:Предприятие":

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

Часть 2. Исправление ошибки "Интерактивные операции недоступны" при открытии формы

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


&НаСервере
Процедура СоответствиеУслугПоказателямНаСервере
    Форма = Справочники.показателиСоцзащиты.ПолучитьФормуСписка;
    Форма.Открыть;
КонецПроцедуры

При выполнении этого кода система выдает ошибку "Интерактивные операции недоступны". Проанализируем причину этой ошибки.

В управляемом приложении 1С действует строгое разделение контекста на клиентский (выполняемый на стороне пользователя, в веб-клиенте или тонком клиенте) и серверный (выполняемый на сервере приложений 1С:Предприятие). Интерактивные действия, такие как визуальное открытие окон, показ предупреждений, диалоги выбора файлов и вывод форм на экран, могут выполняться исключительно на клиенте (в процедурах с директивой &НаКлиенте).

Когда мы вызываем метод Открыть() у объекта формы внутри серверной процедуры (&НаСервере), платформа пытается отрисовать графический интерфейс на сервере, где визуальная оболочка отсутствует. Это и приводит к возникновению исключения. Кроме того, сам метод ПолучитьФорму() на сервере является устаревшим и не рекомендуется к использованию в управляемом интерфейсе.

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


&НаКлиенте
Процедура СоответствиеУслугПоказателям(Команда)
    // Открываем форму списка напрямую с клиента без захода на сервер
    ОткрытьФорму("Справочник.показателиСоцзащиты.ФормаСписка");
EndProcedure

Использование глобального метода управляемого приложения ОткрытьФорму() на клиенте избавляет нас от необходимости получать объект формы на сервере и передавать его между контекстами, что существенно ускоряет работу интерфейса и предотвращает возникновение ошибок контекста.

Часть 3. Исправление ошибки "Неизвестное имя формы" и синтаксические тонкости

При попытке применить метод ОткрытьФорму() разработчики часто сталкиваются со следующей ошибкой: "Неизвестное имя формы". Это происходит из-за неточного следования синтаксическим правилам платформы.

В некоторых советах на форумах предлагают использовать путь к форме вида: "Справочники.показателиСоцзащиты.ФормаСписка". Обратите внимание на слово "Справочники" во множественном числе.

В платформе 1С:Предприятие при обращении к метаданным через строковые пути в методах типа ОткрытьФорму(), ОткрытьФормуПараметры() или при указании типов данных, названия классов объектов метаданных всегда указываются в единственном числе. Проанализируем разницу:

То же самое правило применимо и к другим объектам конфигурации: мы пишем "Документ.Продажи.ФормаСписка" вместо "Документы", "РегистрСведений.Цены.ФормаЗаписи" вместо "РегистрыСведений" и так далее.

Также важно учитывать правила обращения к произвольным (не основным) формам. Если вы создали в расширении форму списка и не назначили ее формой по умолчанию, либо хотите открыть специфическую форму (например, с именем ФормаСпискаДляСоцЗащиты), то в пути к форме необходимо явно указать ключевое слово .Форма.:

ОткрытьФорму("Справочник.показателиСоцзащиты.Форма.ФормаСпискаДляСоцЗащиты");

Часть 4. Проверка прав доступа и активности расширения

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

Посмотрим, какие шаги необходимо предпринять для проверки безопасности и прав:

  1. Проверка заимствования ролей: При создании нового объекта в расширении пользователи не увидят его, пока им не будут явно даны права. Для этого заимствуйте основную роль пользователей (например, ПолныеПрава или специальную пользовательскую роль) в расширение. Перейдите в свойства этой роли в расширении и установите флажки (права на "Чтение", "Просмотр", "Редактирование", "Ввод новых") напротив вашего нового справочника показателиСоцзащиты.
  2. Проверка активности расширения в режиме "Предприятие": Перейдите в пользовательском режиме в меню "Функции для технического специалиста" -> "Управление расширениями конфигурации" (или "Администрирование" -> "Печатные формы, отчеты и обработки" -> "Расширения"). Убедитесь, что ваше расширение подключено успешно. Если напротив него горит красный или серый значок, значит, расширение не применилось. Причиной может быть несоответствие режима совместимости (например, у основной конфигурации стоит 8.3.14, а у расширения указана другая версия) или нарушение контроля логической целостности.
  3. Безопасный режим: Обратите внимание на флажок "Безопасный режим" в настройках подключения расширения. В безопасном режиме некоторые операции могут блокироваться платформой. Если ваше расширение выполняет сложные вызовы, попробуйте временно отключить безопасный режим для проверки работы справочника.

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

← На главную