Как использовать поля, добавленные в расширение, при работе с Системой Компоновки Данных (СКД)?

Программист 1С v8.3 (Управляемые формы)
← К списку

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

Мы рассмотрим несколько подходов к решению этой задачи, начиная с наиболее распространенного и проверенного метода.

1. Разработка схемы СКД в режиме 1С:Предприятие с последующим экспортом/импортом XML

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

  1. Создание запроса в консоли СКД или универсальном отчете.

    Начнем с создания запроса, который будет использовать наше поле из расширения. Для этого нам понадобится любая консоль СКД или универсальный отчет, работающий в режиме 1С:Предприятие. Например, мы можем использовать консоль запросов или универсальный отчет для построения схемы.

    Давайте посмотрим на пример запроса, где используется поле Расш_ПриказНаДоплатуДоСред, добавленное в расширении к документу КадровыйПереводСписком:

    
    ВЫБРАТЬ
        КадровыйПереводСпискомСотрудники.Ссылка КАК Ссылка,
        КадровыйПереводСпискомСотрудники.Сотрудник КАК Сотрудник,
        КадровыйПереводСпискомСотрудники.ДатаНачала КАК ДатаНачала,
        КадровыйПереводСпискомСотрудники.ДатаОкончания КАК ДатаОкончания,
        КадровыйПереводСпискомСотрудники.Расш_ПриказНаДоплатуДоСред КАК НЛЭ_ПриказНаДоплатуДоСред
    ИЗ
        Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники
    ГДЕ
        КадровыйПереводСпискомСотрудники.Сотрудник = &Сотрудник
        И КадровыйПереводСпискомСотрудники.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    

    Обратите внимание, как мы обращаемся к полю расширения: КадровыйПереводСпискомСотрудники.Расш_ПриказНаДоплатуДоСред. Платформа в пользовательском режиме понимает этот синтаксис и корректно извлекает данные.

  2. Настройка схемы компоновки данных.

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

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

    Важно: Все эти действия выполняются в режиме 1С:Предприятие, где платформа "видит" поля расширения.

  3. Сохранение схемы в XML.

    Когда схема СКД полностью настроена и протестирована в пользовательском режиме, мы сохраняем ее в файл формата XML. В большинстве консолей СКД и универсальных отчетов есть соответствующая кнопка или пункт меню "Сохранить схему в XML". Этот метод корректно работает на платформах 1С, начиная с версии 8.3.25 и выше, что подтверждается опытом разработчиков.

  4. Загрузка схемы из XML в конфигуратор.

    Теперь мы возвращаемся в конфигуратор. Откройте макет СКД вашего отчета или обработки. Вместо того чтобы создавать схему с нуля в конструкторе, мы используем функцию "Загрузить схему из XML".

    При загрузке XML-файла в конфигураторе вы можете столкнуться с предупреждениями или ошибками, указывающими на то, что поля из расширения не найдены. Не беспокойтесь! Эти ошибки, как правило, не являются критичными и отчет будет работать корректно в пользовательском режиме. Конфигуратор просто не всегда способен полностью провалидировать схему, содержащую поля расширений, на этапе загрузки.

    Особый случай: сброс ресурсов и формул. На некоторых более новых платформах (например, 8.3.21.1624) при загрузке схемы из XML могут "сбрасываться" поля ресурсов и их формулы. Для обхода этой проблемы разработчики предлагают использовать "заглушки" или создавать дополнительные наборы данных с фиктивными полями, чтобы сохранить формулы ресурсов. Это требует дополнительной внимательности при проверке схемы после импорта.

2. Программная модификация схемы СКД

Для более гибких сценариев, когда требуется динамически изменять схему СКД или встраивать ее в сложные алгоритмы, мы можем использовать программную модификацию. Этот метод доступен для платформ 1С, начиная с версии 8.3.15.1489.

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

Давайте рассмотрим концептуальный пример:


// Получаем схему компоновки данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
СхемаКомпоновкиДанных = КомпоновщикМакета.ПолучитьСхемуКомпоновкиДанных(Макет.СхемаСКД);

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

// Настраиваем компоновщик настроек
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
// ... далее применяем необходимые настройки, параметры и формируем отчет

Этот метод предоставляет максимальную гибкость, но требует более глубокого понимания программного API СКД.

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

Помимо основных решений, есть несколько моментов, которые мы должны учитывать:

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

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

← К списку