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