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