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