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