Как организовать работу внешней обработки с объектами из расширения конфигурации?

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

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

Метод 1. Разработка "внутри" расширения с последующей выгрузкой

Самый простой и логичный способ — временно перенести процесс разработки в контекст самого расширения. Проанализируем этот алгоритм:

  1. В дереве конфигурации расширения перейдем в раздел Обработки и создадим новый объект.
  2. Внутри этой обработки нам будут доступны все типы данных, которые определены как в основной конфигурации, так и в текущем расширении. Мы сможем использовать конструктор запросов, выбирать типы для реквизитов форм и пользоваться автодополнением кода.
  3. После завершения разработки нажмем правой кнопкой мыши на обработку в дереве расширения и выберем пункт "Сохранить как внешнюю обработку...".

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

Метод 2. Использование конструктора запросов через подмену текста

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

В тексте запроса вместо реального имени регистра (например, РегистрСведений.КМО_ДанныеМедицинскихКнижек) используем имя-заглушку, которое конструктор воспримет как временную таблицу. После выхода из конструктора программно заменим заглушку на реальное имя объекта. Посмотрим на пример реализации:


Запрос = Новый Запрос;
// В конструкторе пишем запрос к ВтМойРегистр, как к временной таблице
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ВтМойРегистр.ФизическоеЛицо КАК ФизическоеЛицо,
    |   МАКСИМУМ(ВтМойРегистр.Период) КАК Период
    |ИЗ
    |   ВтМойРегистр КАК ВтМойРегистр
    |СГРУППИРОВАТЬ ПО
    |   ВтМойРегистр.ФизическоеЛицо";

// Подменяем заглушку на реальный путь к объекту из расширения перед выполнением
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВтМойРегистр", "РегистрСведений.КМО_ДанныеМедицинскихКнижек.СрезПоследних(&ДатаСреза, )");
Результат = Запрос.Выполнить();

Этот способ позволяет использовать всю мощь визуального проектирования запросов, не обращая внимания на отсутствие объектов в метаданных конфигуратора.

Метод 3. Сохранение типов данных на управляемой форме

Часто возникает проблема: мы создали реквизит формы во внешней обработке (разрабатывая её внутри расширения), указали тип СправочникСсылка.НашСправочникИзРасширения, но после сохранения в файл .erf тип реквизита "слетает" и превращается в Строка или Неопределено. Выясним причину: конфигуратор при сохранении проверяет валидность типов, и, не найдя объекта в основной базе, обнуляет его.

Для решения этой проблемы проанализируем ситуацию с программным назначением типов. Нам нужно:

  1. Установить реквизиту формы тип Произвольный в конфигураторе.
  2. У элемента формы (поля ввода) снять флаг "Выбирать тип".
  3. Программно назначить тип при открытии формы, используя ОписаниеТипов.

Пример кода в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Динамически определяем тип из расширения по строковому имени
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("СправочникСсылка.Расш1_НоменклатураПроданная"));
    НовоеОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
    
    // Если объект существует, назначаем его пустую ссылку реквизиту
    Если Не ЗначениеЗаполнено(Объект.СсылкаНаОбъектРасширения) Тогда
        // Используем ПредопределенноеЗначение для получения пустой ссылки объекта расширения
        Объект.СсылкаНаОбъектРасширения = ПредопределенноеЗначение("Справочник.Расш1_НоменклатураПроданная.ПустаяСсылка");
    КонецЕсли;
    
КонецПроцедуры

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

Метод 4. Работа с Системой компоновки данных (СКД)

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

Рекомендуем следующие подходы:

Метод 5. Особенности регламентных заданий в безопасном режиме

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

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

  1. В карточке дополнительной обработки в интерфейсе системы установлен режим "Небезопасный" (Разрешить доступ к внешним ресурсам).
  2. В коде обработки не используется явная установка безопасного режима через УстановитьБезопасныйРежим(Истина).
  3. При обращении к метаданным расширения используется полное имя с учетом префикса, например: РегистрыСведений.Префикс_ИмяРегистра.

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

← На главную