Как убрать лишние поля (характеристики) из СКД при программном формировании отчета?

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

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

Давайте разберем, как принудительно ограничить этот список и заставить систему работать так, как нужно нам.

Способ №1: Ограничение через настройки компоновщика

Одним из самых простых и эффективных методов является принудительная очистка настроек от недоступных элементов. Метод Восстановить у КомпоновщикаНастроек позволяет «отсечь» все лишнее, что не проходит проверку на доступность в рамках текущего контекста исполнения.

Рассмотрим, как это реализовать:


// Предположим, вы уже проинициализировали компоновщик
Объект.Компоновщик.Инициализировать(ИсточникНастроек);
Объект.Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

// Вызываем метод для удаления недоступных полей
Объект.Компоновщик.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);

Когда вы вызываете Восстановить с параметром ПроверятьДоступность, компоновщик удаляет из всех коллекций (отборы, выбор, порядок) те элементы, которые ссылаются на поля, не доступные для текущего пользователя или не соответствующие правам и функциональным опциям. Это отличный способ «почистить» структуру после загрузки настроек по умолчанию.

Способ №2: Отключение характеристик через секцию в запросе

Если вы хотите радикально пресечь попытки СКД искать характеристики в метаданных, можно использовать скрытую возможность языка запросов СКД — работу с секцией {ХАРАКТЕРИСТИКИ}. Даже если ваш набор данных формируется программно (тип НаборДанныхОбъект), наличие пустой или специально настроенной секции характеристик в тексте запроса полностью меняет поведение системы.

Чтобы характеристики не подтягивались автоматически, попробуйте явно объявить эту секцию:


// В тексте запроса или при описании набора данных
// укажите пустую конструкцию, чтобы заблокировать автопоиск:
{ХАРАКТЕРИСТИКИ
}

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

Способ №3: Программная фильтрация доступных полей

Если автоматические методы не дают нужного результата, всегда можно прибегнуть к «ручной» фильтрации коллекции доступных полей. После того как вы добавили свои поля в НаборДанных, коллекция ДоступныеПоляОтбора будет содержать избыточную информацию. Вы можете пройтись циклом по этой коллекции и удалить все, что не входит в ваш утвержденный список реквизитов.

Рассмотрим алгоритм действий:

  1. Инициализируйте КомпоновщикНастроек.
  2. Получите доступ к коллекции ДоступныеПоляОтбора (или ДоступныеПоляВыбора).
  3. Проведите обход коллекции: если путь к данным содержит лишние элементы (например, точки или части, указывающие на свойства), удалите такой элемент из коллекции.
  4. Примените полученные настройки.

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

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

← На главную