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

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

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

Причина проблемы: изоляция метаданных

Механизм расширений спроектирован так, чтобы изменения в расширении не конфликтовали с основной конфигурацией. Когда вы открываете конструктор запросов в расширении, он пытается построить дерево метаданных, основываясь только на содержимом самого расширения. Если ПланСчетов, РегистрНакопления или ПланВидовХарактеристик не заимствованы, конструктор «не знает» об их существовании, даже если в основной конфигурации они доступны.

Метод 1: Заимствование объектов в расширение

Если вам необходимо активно использовать объект в конструкторе (например, для настройки связей или отборов), самым простым решением будет заимствование объекта в расширение.

  1. Перейдите в дерево метаданных расширения.
  2. Добавьте необходимый объект (например, ПланСчетов.Хозрасчетный) через контекстное меню Добавить в расширение.
  3. Если используются специфические данные, такие как ВидыСубконто, убедитесь, что в свойствах плана счетов в расширении корректно указаны связанные объекты ПланВидовХарактеристик.
  4. Для регистров накопления, помимо самого регистра, иногда требуется заимствование его измерений и ресурсов, чтобы виртуальные таблицы (например, Обороты) стали доступны конструктору.

Важно: этот метод увеличивает объем вашего расширения и создает зависимость от изменений основной конфигурации. Используйте его только тогда, когда это действительно необходимо.

Метод 2: Написание запроса вручную (рекомендуемый подход)

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

Чтобы эффективно работать таким образом, воспользуйтесь следующим алгоритмом:

  1. Создайте внешнюю обработку в 1С.
  2. В этой обработке создайте запрос к нужным таблицам (конструктор во внешней обработке видит всю конфигурацию целиком).
  3. Проверьте корректность работы запроса и параметров во внешней обработке.
  4. Скопируйте текст готового запроса в модуль вашего расширения.

Даже если редактор кода будет подсвечивать текст как ошибку (потому что не видит таблицу в контексте расширения), запрос выполнится успешно в среде исполнения. Это позволяет избежать «замусоривания» расширения объектами, которые вы не меняете, а используете только для чтения.

Пример работы с виртуальными таблицами

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


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

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

Итоги и рекомендации

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

← На главную