При активной разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью разделения логики на несколько расширений. Возникает классическая ситуация: в Расширении №1 создан новый справочник или добавлены реквизиты, а в Расширении №2 необходимо построить отчет или выполнить запрос к этим данным. Основная сложность заключается в том, что Конструктор запросов в Конфигураторе «не видит» объекты «чужого» расширения, что вводит многих в заблуждение о невозможности такой операции.
В этой статье мы подробно разберем, как обойти ограничения платформы, правильно настроить зависимости и успешно обращаться к данным между расширениями в коде и в системе компоновки данных (СКД).
Разберем ситуацию, когда нам нужно программно получить данные. Главное правило, которое стоит запомнить: отсутствие объекта в Конструкторе запросов не означает невозможность обращения к нему в коде. Платформа 1С на этапе выполнения (Runtime) оперирует единым пространством имен метаданных, где все расширения уже объединены с основной конфигурацией.
Проанализируем алгоритм действий:
Пример программного обращения к справочнику ДополнительныеХарактеристики, который был создан в другом расширении:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДопХарактеристики.Ссылка КАК Ссылка,
| ДопХарактеристики.Наименование КАК Наименование
|ИЗ
| Справочник.ДополнительныеХарактеристики КАК ДопХарактеристики";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Рассмотрим важный нюанс: если вы попробуете открыть этот текст через Конструктор запросов, система выдаст ошибку «Таблица не найдена». Это нормальное поведение. Не сохраняйте запрос через конструктор, если он содержит обращения к объектам других расширений, иначе текст будет очищен. Рекомендуется использовать внешние консоли запросов в режиме «Предприятие» для отладки таких текстов, а затем копировать готовый текст в конфигуратор.
Начиная с версии платформы 8.3.14, задача взаимодействия между расширениями стала более структурированной. Если в ранних версиях (как 8.3.12) расширения были «равноправными» и слабо связанными, то теперь мы можем явно указать иерархию.
Выясним, как настроить зависимость, чтобы Расширение №2 понимало структуру Расширения №1:
Что это дает? Во-первых, платформа будет строго контролировать порядок загрузки: родительское расширение всегда включится раньше зависимого. Во-вторых, это упрощает обращение к экспортным методам общих модулей. Если в Расширении №1 есть общий модуль с методом ПолучитьДанные(), то в Расширении №2 вы сможете вызвать его напрямую, при условии, что настроена зависимость.
Работа с Системой компоновки данных (СКД) вызывает больше всего трудностей, так как отчеты в расширениях часто требуют визуальной настройки. Если мы просто добавим запрос с «чужим» справочником в набор данных, отчет может не открыться в конфигураторе.
Рассмотрим наиболее надежный метод — Внешние наборы данных. Этот способ позволяет полностью избежать конфликтов в конфигураторе.
Разберем по шагам, как это реализовать:
ТаблицаИзДругогоРасширения.Пример кода для передачи данных в СКД:
// В модуле отчета
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем таблицу данных ручным запросом
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.СпецОбъектИзРасширения1");
ТаблицаДанных = Запрос.Выполнить().Выгрузить();
// Подготавливаем внешние наборы данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаИзДругогоРасширения", ТаблицаДанных);
// Запускаем компоновку
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот подход считается эталонным, так как он обеспечивает максимальную стабильность. Конфигуратор не «ругается» на отсутствие таблиц, а логика получения данных скрыта в коде, где вы вольны писать любые запросы к любым расширениям.
Если вам все же необходимо использовать Набор данных - запрос внутри СКД, существует «хакерский» метод через выгрузку схемы. Рассмотрим его:
.xml.Внимание: После загрузки схемы в Конфигураторе нельзя открывать конструктор запроса в этом наборе данных. Если вы случайно его откроете и нажмете «ОК», платформа перепроверит метаданные, не найдет справочник из другого расширения и «затрет» ваш запрос. Любые правки текста запроса в этом случае нужно делать либо в текстовом редакторе XML, либо повторно через консоль в режиме «Предприятие».
Проанализируем ситуацию с точки зрения долгосрочной поддержки. Постоянные прямые запросы между расширениями могут привести к так называемому «аду зависимостей». Чтобы этого избежать, придерживайтесь следующих правил:
Справочнику.Х из другого расширения, создайте в первом расширении общий модуль с экспортной функцией, которая возвращает таблицу значений или структуру данных.Таким образом, несмотря на отсутствие визуальной поддержки в конструкторах, механизмы 1С позволяют организовать полноценное взаимодействие между расширениями. Выбор метода зависит от ваших задач: для простых операций достаточно ручного написания текста запроса, а для сложных отчетов лучше использовать внешние наборы данных СКД.