Почему в расширении 1С не видны виртуальные таблицы регистров и как это исправить?

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

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

Причина 1: Недостаточный состав полей метаданных в расширении

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

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

Причина 2: Специфика регистров бухгалтерии и субконто

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

  1. План счетов, который используется в этом регистре.
  2. Планы видов характеристик (ПВХ), на которых строятся виды субконто.

Без этих объектов платформа не может сопоставить типы данных, и виртуальные таблицы будут либо недоступны, либо не будут содержать специфических полей (например, Субконто1).

Решение 3: Использование внешних инструментов для подготовки запроса

Если Конструктор запроса в конфигураторе продолжает игнорировать таблицы, можно воспользоваться "окольными" путями, которые часто применяются опытными разработчиками:

Решение 4: Программное формирование данных (Метод "Заглушки")

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

Посмотрим на пример реализации этого метода. В самой схеме СКД вы описываете запрос к какой-нибудь простой таблице (например, Справочник.Номенклатура), создавая нужные псевдонимы полей. А основной сбор данных выполняете программно:


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

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

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

Дополнительные рекомендации

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

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

← На главную