Приветствуем вас, уважаемые разработчики 1С! Работа с расширениями конфигурации прочно вошла в нашу повседневную практику. Это мощный и безопасный инструмент для кастомизации типовых решений без снятия их с поддержки. Однако при создании новых объектов метаданных (например, справочников) внутри расширения мы часто сталкиваемся со специфическим поведением платформы 1С:Предприятие. Типичные проблемы — невозможность выбрать новые таблицы в конструкторе запросов СКД внешнего отчета, а также ошибки вида "Интерактивные операции недоступны" и "Неизвестное имя формы" при попытке программно открыть форму нового объекта.
В этой статье мы подробно разберем, почему возникают эти сложности, как они связаны с архитектурой платформы и контекстом выполнения кода, а также рассмотрим пошаговые инструкции по их обходу и полному устранению.
Начнем с анализа первой проблемы: при попытке разработать внешний отчет с использованием схемы компоновки данных (СКД) конструктор запросов в Конфигураторе "не видит" наш новый справочник, созданный в расширении. Если же прописать имя таблицы вручную, система выдает ошибку о том, что таблица не найдена.
Выясним причину такого поведения. Дело в том, что когда мы открываем внешний отчет (файл с расширением .erf) в Конфигураторе, среда разработки считывает метаданные исключительно из основной конфигурации. Расширение конфигурации — это динамическая сущность. Платформа подключает его и объединяет его метаданные с основными только в режиме "1С:Предприятие" (при запуске пользовательского сеанса). В режиме разработки внешнего файла Конфигуратор физически "не знает" о существовании таблиц из расширения, поэтому валидация запроса завершается ошибкой.
Важное обновление платформы: Начиная с версии платформы 8.3.28, фирма "1С" добавила долгожданную поддержку объектов расширений во внешних отчетах и обработках непосредственно в Конфигураторе. Если вы работаете на этой версии или выше, объекты активных расширений базы данных будут доступны в конструкторе. Но что делать, если ваша база работает на более ранних версиях платформы (например, на 8.3.14 или 8.3.21)?
Разберем по шагам два проверенных решения этой проблемы для старых версий платформы:
Способ 1. Временное проектирование отчета внутри расширения
Справочник.показателиСоцзащиты) прекрасно виден в списке доступных таблиц. Настроим все необходимые связи, выберем поля и ресурсы..erf. Теперь этот внешний отчет можно смело запускать в режиме "1С:Предприятие". Поскольку при работе пользователя расширение активно, платформа успешно найдет все таблицы в базе данных и выполнит запрос без каких-либо ошибок.Способ 2. Проектирование схемы через Консоль СКД в пользовательском режиме
Если мы не хотим засорять дерево метаданных расширения временными объектами, мы можем использовать инструмент "Консоль отчетов" или "Консоль компоновки данных" непосредственно в режиме "1С:Предприятие":
Перейдем ко второй проблеме. Разработчик попытался программно открыть форму списка нового справочника из расширения с помощью следующего кода:
&НаСервере
Процедура СоответствиеУслугПоказателямНаСервере
Форма = Справочники.показателиСоцзащиты.ПолучитьФормуСписка;
Форма.Открыть;
КонецПроцедуры
При выполнении этого кода система выдает ошибку "Интерактивные операции недоступны". Проанализируем причину этой ошибки.
В управляемом приложении 1С действует строгое разделение контекста на клиентский (выполняемый на стороне пользователя, в веб-клиенте или тонком клиенте) и серверный (выполняемый на сервере приложений 1С:Предприятие). Интерактивные действия, такие как визуальное открытие окон, показ предупреждений, диалоги выбора файлов и вывод форм на экран, могут выполняться исключительно на клиенте (в процедурах с директивой &НаКлиенте).
Когда мы вызываем метод Открыть() у объекта формы внутри серверной процедуры (&НаСервере), платформа пытается отрисовать графический интерфейс на сервере, где визуальная оболочка отсутствует. Это и приводит к возникновению исключения. Кроме того, сам метод ПолучитьФорму() на сервере является устаревшим и не рекомендуется к использованию в управляемом интерфейсе.
Для правильного программного открытия формы нам необходимо перенести логику на клиентскую сторону. Рассмотрим, как должен выглядеть корректный код:
&НаКлиенте
Процедура СоответствиеУслугПоказателям(Команда)
// Открываем форму списка напрямую с клиента без захода на сервер
ОткрытьФорму("Справочник.показателиСоцзащиты.ФормаСписка");
EndProcedure
Использование глобального метода управляемого приложения ОткрытьФорму() на клиенте избавляет нас от необходимости получать объект формы на сервере и передавать его между контекстами, что существенно ускоряет работу интерфейса и предотвращает возникновение ошибок контекста.
При попытке применить метод ОткрытьФорму() разработчики часто сталкиваются со следующей ошибкой: "Неизвестное имя формы". Это происходит из-за неточного следования синтаксическим правилам платформы.
В некоторых советах на форумах предлагают использовать путь к форме вида: "Справочники.показателиСоцзащиты.ФормаСписка". Обратите внимание на слово "Справочники" во множественном числе.
В платформе 1С:Предприятие при обращении к метаданным через строковые пути в методах типа ОткрытьФорму(), ОткрытьФормуПараметры() или при указании типов данных, названия классов объектов метаданных всегда указываются в единственном числе. Проанализируем разницу:
"Справочники.показателиСоцзащиты.ФормаСписка" (платформа не сможет распознать тип метаданных "Справочники" в строковом параметре и выдаст ошибку "Неизвестное имя формы")."Справочник.показателиСоцзащиты.ФормаСписка" (используем класс "Справочник" в единственном числе).То же самое правило применимо и к другим объектам конфигурации: мы пишем "Документ.Продажи.ФормаСписка" вместо "Документы", "РегистрСведений.Цены.ФормаЗаписи" вместо "РегистрыСведений" и так далее.
Также важно учитывать правила обращения к произвольным (не основным) формам. Если вы создали в расширении форму списка и не назначили ее формой по умолчанию, либо хотите открыть специфическую форму (например, с именем ФормаСпискаДляСоцЗащиты), то в пути к форме необходимо явно указать ключевое слово .Форма.:
ОткрытьФорму("Справочник.показателиСоцзащиты.Форма.ФормаСпискаДляСоцЗащиты");
Если вы исправили синтаксис и контекст вызова, но форма все равно не открывается (или справочник не отображается в интерфейсе), обязательно проверьте права доступа и статус подключения расширения.
Посмотрим, какие шаги необходимо предпринять для проверки безопасности и прав:
ПолныеПрава или специальную пользовательскую роль) в расширение. Перейдите в свойства этой роли в расширении и установите флажки (права на "Чтение", "Просмотр", "Редактирование", "Ввод новых") напротив вашего нового справочника показателиСоцзащиты.Таким образом, соблюдение правильного контекста выполнения кода (вызов интерактивных методов только на клиенте), использование верного синтаксиса в единственном числе (Справочник вместо Справочники) и понимание принципов работы Конфигуратора с внешними отчетами позволяют быстро решить любые возникающие проблемы при интеграции новых объектов из расширений.