Как заставить внешнюю обработку видеть объекты расширений в СКД и программном коде?

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

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

Выясним причину: почему Конфигуратор «не видит» расширение

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

Поскольку Конфигуратор не может заранее предугадать, в какой именно базе и с каким набором расширений будет запущена обработка, он просто игнорирует все расширения при редактировании внешнего файла. В результате IntelliSense (подсказчик) выдает «пустоту», а конструктор запросов сообщает об отсутствии таблиц. При этом в режиме Предприятие все работает корректно, так как там контекст уже полностью собран. Однако разработка «вслепую», особенно в сложных отчетах СКД, превращается в настоящее испытание. Для составления и отладки запросов с учетом метаданных расширений подойдёт консоль запросов с конструктором в тонком клиенте.

Проблема СКД: когда пропадают доступные поля

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

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

Решение №1: Временный перенос в расширение (Метод «Песочницы»)

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

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

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

Решение №2: Использование 1C:EDT (Enterprise Development Tools)

Проанализируем более современный подход. Фирма «1С» активно развивает новую среду разработки на базе Eclipse — 1C:EDT. В отличие от классического Конфигуратора, в EDT реализована концепция проектов и зависимостей.

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

Если ваша компания перешла на EDT, эта проблема для вас практически перестает существовать.

Решение №3: Ручное описание полей и программная модификация

Рассмотрим ситуацию, когда нам нужно быстро внести правки и нет времени на перенос обработки. В этом случае придется работать «вручную». Посмотрим на пример того, как правильно описывать поля, чтобы СКД их не «потеряла»:

В конструкторе СКД на закладке Наборы данных нам необходимо добавить поле вручную. При этом крайне важно строго соблюдать следующие параметры:

  1. Имя — должно в точности совпадать с псевдонимом в запросе.
  2. Путь к данным — обычно совпадает с именем.
  3. Тип значения — это самый сложный момент. Так как типа из расширения нет в списке, иногда приходится оставлять его неопределенным или использовать составной тип, если это критично для связей.

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


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

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры

Решение №4: Фиктивные объекты в основной конфигурации

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

После создания «пустышки»:

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

Особенности выполнения в режиме «Предприятие»

Важно понимать, что все вышеописанные мучения касаются исключительно процесса разработки. Когда пользователь запускает внешнюю обработку через Файл -> Открыть или через справочник Дополнительные отчеты и обработки, платформа выполняет следующие действия:

  1. Собирает общий контекст метаданных (Конфигурация + все активные расширения).
  2. Компилирует код обработки в этом контексте.
  3. Выполняет запросы.

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

Подведем итоги

Работа с расширениями во внешних обработках требует от программиста определенной сноровки. Мы выяснили, что основная проблема кроется в изоляции контекста Конфигуратора. Для комфортной работы мы рекомендуем либо временно включать обработку в состав расширения, либо переходить на современные инструменты разработки, такие как 1C:EDT. Если же задача разовая — ручная правка запроса и описание полей в СКД остаются рабочим, хоть и трудозатратным вариантом. Для упрощения программной настройки схемы компоновки данных можно использовать модуль для программного формирования СКД.

← На главную