Как использовать данные из расширений в СКД и решить проблему видимости таблиц

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

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

Причина возникновения проблемы: конфликт пространств имен

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

Решение 1: Создание отчета внутри расширения

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

Решение 2: Использование консоли СКД и игнорирование ошибок

Если по каким-то причинам отчет должен оставаться внешним, воспользуемся следующим алгоритмом:

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

Как исправить проблему с отсутствием итогов по группировкам

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

Для исправления выполним следующие шаги:

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

Решение 3: Программная установка текста запроса

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


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

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

Важные рекомендации по хранению данных в расширениях

Проанализируем ситуацию с безопасностью данных. Важно помнить: если вы добавляете новые реквизиты или табличные части непосредственно в объекты (документы, справочники) через расширение, существует серьезный риск. При удалении расширения из информационной базы все данные, накопленные в этих полях, будут удалены безвозвратно из SQL-таблиц.

Поэтому рассмотрим более безопасную альтернативу:

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

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

← На главную