При разработке в экосистеме 1С:Предприятие 8.3 программисты часто сталкиваются с неприятной особенностью: внешняя обработка (файл .epf), открытая в Конфигураторе, абсолютно «не знает» о существовании объектов, созданных или измененных в расширениях конфигурации. Это проявляется в отсутствии контекстной подсказки, невозможности выбрать поля расширения в конструкторе запросов и, что самое критичное, в «слепоте» системы компоновки данных (СКД). Давайте подробно разберем, почему так происходит, и какие стратегии разработки помогут нам преодолеть эти ограничения.
Для начала проанализируем ситуацию с точки зрения архитектуры платформы. Когда мы открываем внешний файл в обычном Конфигураторе, среда разработки загружает контекст основной метаданных конфигурации. Расширения же являются динамическими слоями, которые могут быть подключены, отключены или наложены друг на друга в разных комбинациях в режиме Предприятие.
Поскольку Конфигуратор не может заранее предугадать, в какой именно базе и с каким набором расширений будет запущена обработка, он просто игнорирует все расширения при редактировании внешнего файла. В результате IntelliSense (подсказчик) выдает «пустоту», а конструктор запросов сообщает об отсутствии таблиц. При этом в режиме Предприятие все работает корректно, так как там контекст уже полностью собран. Однако разработка «вслепую», особенно в сложных отчетах СКД, превращается в настоящее испытание. Для составления и отладки запросов с учетом метаданных расширений подойдёт консоль запросов с конструктором в тонком клиенте.
Рассмотрим подробнее работу с СКД во внешней обработке. Если мы пишем запрос к объекту из расширения, конструктор запроса выдаст ошибку. Если мы проигнорируем ее и напишем запрос вручную, возникнет следующая сложность: на закладке Наборы данных поля не попадут в список доступных автоматически. Это происходит из-за того, что механизм компоновки при проверке метаданных ориентируется на жесткую структуру основной конфигурации.
Важный нюанс: даже если вы вручную заполните список полей, любое повторное открытие конструктора запроса может привести к тому, что система пометит эти поля как ошибочные или вовсе их удалит. Это делает визуальную настройку варианта отчета практически невозможной.
Разберем самый популярный среди разработчиков способ обхода проблемы. Чтобы получить полноценный доступ ко всем визуальным конструкторам, выполним следующие шаги:
Этот метод позволяет сохранить «чистоту» основной конфигурации, при этом не лишая себя удобств визуальной разработки.
Проанализируем более современный подход. Фирма «1С» активно развивает новую среду разработки на базе Eclipse — 1C:EDT. В отличие от классического Конфигуратора, в EDT реализована концепция проектов и зависимостей.
Если мы добавим внешнюю обработку в проект, который имеет настроенную зависимость от проекта расширения, среда разработки будет корректно подтягивать метаданные. Рассмотрим, как это работает:
Справочник.ИмяИзРасширения.Если ваша компания перешла на EDT, эта проблема для вас практически перестает существовать.
Рассмотрим ситуацию, когда нам нужно быстро внести правки и нет времени на перенос обработки. В этом случае придется работать «вручную». Посмотрим на пример того, как правильно описывать поля, чтобы СКД их не «потеряла»:
В конструкторе СКД на закладке Наборы данных нам необходимо добавить поле вручную. При этом крайне важно строго соблюдать следующие параметры:
Чтобы избежать проблем с визуальным редактором, можно прибегнуть к программному формированию схемы. Разберем небольшой пример кода, который можно разместить в модуле объекта обработки для динамической настройки компоновщика:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Здесь мы можем программно донастроить поля,
// которые не видит конфигуратор в визуальном режиме
НаборДанных = Схема.НаборыДанных.НаборДанных1;
ПолеИзРасширения = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеИзРасширения.Поле = "НовыйРеквизитИзРасширения";
ПолеИзРасширения.ПутьКДанным = "НовыйРеквизитИзРасширения";
ПолеИзРасширения.Заголовок = "Реквизит из расширения";
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Существует еще один метод, который мы назовем «методом заглушек». Если расширение добавляет новый реквизит в существующий справочник, мы можем временно создать такой же реквизит в основной конфигурации (не обновляя базу данных в режиме Enterprise).
После создания «пустышки»:
Внимание: этот метод требует осторожности, так как можно случайно зафиксировать изменения в основной конфигурации, чего делать не рекомендуется при использовании расширений.
Важно понимать, что все вышеописанные мучения касаются исключительно процесса разработки. Когда пользователь запускает внешнюю обработку через Файл -> Открыть или через справочник Дополнительные отчеты и обработки, платформа выполняет следующие действия:
Поэтому в рантайме (во время выполнения) никаких проблем не возникнет. Вызовы типа ОбъектИзРасширения = Справочники.МойСправочникИзРасширения.СоздатьЭлемент() отработают идеально, даже если Конфигуратор подчеркивал этот код красным.
Работа с расширениями во внешних обработках требует от программиста определенной сноровки. Мы выяснили, что основная проблема кроется в изоляции контекста Конфигуратора. Для комфортной работы мы рекомендуем либо временно включать обработку в состав расширения, либо переходить на современные инструменты разработки, такие как 1C:EDT. Если же задача разовая — ручная правка запроса и описание полей в СКД остаются рабочим, хоть и трудозатратным вариантом. Для упрощения программной настройки схемы компоновки данных можно использовать модуль для программного формирования СКД.