Как в 1С написать запрос к справочнику другого расширения или использовать его в СКД

Программист IT и автоматизация бизнеса
← На главную

При активной разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью разделения логики на несколько расширений. Возникает классическая ситуация: в Расширении №1 создан новый справочник или добавлены реквизиты, а в Расширении №2 необходимо построить отчет или выполнить запрос к этим данным. Основная сложность заключается в том, что Конструктор запросов в Конфигураторе «не видит» объекты «чужого» расширения, что вводит многих в заблуждение о невозможности такой операции.

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

Способ 1: Прямое написание текста запроса (ручной ввод)

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

Проанализируем алгоритм действий:

  1. Откроем модуль в Расширении №2, где планируется вызов.
  2. Вместо использования Конструктора запросов напишем текст запроса вручную.
  3. Используем стандартный синтаксис обращения к объекту, как если бы он был в основной конфигурации.

Пример программного обращения к справочнику ДополнительныеХарактеристики, который был создан в другом расширении:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ДопХарактеристики.Ссылка КАК Ссылка,
    |   ДопХарактеристики.Наименование КАК Наименование
    |ИЗ
    |   Справочник.ДополнительныеХарактеристики КАК ДопХарактеристики";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Способ 2: Настройка механизма зависимостей расширений

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

Выясним, как настроить зависимость, чтобы Расширение №2 понимало структуру Расширения №1:

  1. В дереве конфигурации откроем список расширений.
  2. Перейдем в свойства Расширения №2.
  3. Найдем пункт Зависимости и нажмем «Открыть».
  4. Добавим в список Расширение №1.

Что это дает? Во-первых, платформа будет строго контролировать порядок загрузки: родительское расширение всегда включится раньше зависимого. Во-вторых, это упрощает обращение к экспортным методам общих модулей. Если в Расширении №1 есть общий модуль с методом ПолучитьДанные(), то в Расширении №2 вы сможете вызвать его напрямую, при условии, что настроена зависимость.

Способ 3: Использование объектов другого расширения в СКД

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

Рассмотрим наиболее надежный метод — Внешние наборы данных. Этот способ позволяет полностью избежать конфликтов в конфигураторе.

Разберем по шагам, как это реализовать:

  1. В схеме СКД создадим Набор данных - объект и назовем его, например, ТаблицаИзДругогоРасширения.
  2. Добавим в этот набор поля с именами и типами, которые соответствуют реквизитам справочника из другого расширения.
  3. В модуле объекта отчета (или в обработке формирования) перехватим событие формирования и передадим данные программно.

Пример кода для передачи данных в СКД:


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

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

Способ 4: Метод с использованием Консоли СКД (для правки XML)

Если вам все же необходимо использовать Набор данных - запрос внутри СКД, существует «хакерский» метод через выгрузку схемы. Рассмотрим его:

  1. Используйте обработку «Консоль системы компоновки данных» (доступна на ИТС).
  2. В режиме «Предприятие» создайте запрос к нужному справочнику. Там он будет доступен для выбора.
  3. Настройте все поля, связи и ресурсы.
  4. Выгрузите готовую схему в файл .xml.
  5. В Конфигураторе загрузите этот файл в ваш отчет.

Внимание: После загрузки схемы в Конфигураторе нельзя открывать конструктор запроса в этом наборе данных. Если вы случайно его откроете и нажмете «ОК», платформа перепроверит метаданные, не найдет справочник из другого расширения и «затрет» ваш запрос. Любые правки текста запроса в этом случае нужно делать либо в текстовом редакторе XML, либо повторно через консоль в режиме «Предприятие».

Важные рекомендации по архитектуре

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

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

← На главную