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

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

При интеграции 1С с интернет-магазинами и внешними сайтами разработчики часто сталкиваются с ситуацией, когда в процессе обмена создаются новые реквизиты документов. Например, для документа Заказ клиента могут автоматически создаваться поля НомерЗаказаССайта и ДатаЗаказаССайта. Эти реквизиты создаются программно средствами подсистемы «Свойства» Библиотеки стандартных подсистем (БСП) и на самом деле являются дополнительными реквизитами.

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

Способ 1. Использование встроенного механизма «Характеристик» в СКД

Это самый правильный, быстрый и элегантный способ решения задачи в типовых конфигурациях (таких как ERP, Комплексная автоматизация, Управление торговлей, УНФ). Нам не придется переписывать основной запрос, вручную прописывать связи таблиц и бороться с дублированием строк в результате запроса. Платформа 1С сделает все за нас.

При использовании этого метода дополнительные реквизиты будут отображаться в СКД как стандартные поля документа. Пользователь сможет легко выбрать их в настройках отчета через «плюсик» у поля Заказ клиента.

Разберем по шагам, как настроить характеристики в схеме компоновки данных:

  1. Откроем нашу схему компоновки данных (СКД) и перейдем на вкладку «Характеристики».
  2. Добавим новую строку в таблицу настроек характеристик.
  3. Заполним параметры связи следующим образом:
    • Путь к данным (Тип): Указываем тип объекта, для которого мы хотим вытащить свойства. В нашем случае это ДокументСсылка.ЗаказКлиента.
    • Виды характеристик (Таблица): Выбираем таблицу плана видов характеристик, где хранятся сами свойства. Это ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.
    • Поле ключа: Указываем Ссылка.
    • Поле имени: Выбираем Наименование (или Заголовок для красивого отображения в отчете).
    • Поле типа значения: Выбираем ТипЗначения.
    • Значения характеристик (Таблица): Указываем табличную часть нашего объекта, где хранятся значения. Для заказа клиента это Документ.ЗаказКлиента.ДополнительныеРеквизиты.
    • Поле объекта: Поле связи в табличной части, обычно это Ссылка.
    • Поле вида: Поле, определяющее конкретное свойство, — Свойство.
    • Поле значения: Поле, хранящее само значение свойства, — Значение.

После этой настройки в дереве доступных полей СКД внутри поля ЗаказКлиента автоматически появятся наши виртуальные реквизиты НомерЗаказаССайта и ДатаЗаказаССайта. Платформа сама оптимизирует SQL-запрос к СУБД при формировании отчета.

Способ 2. Получение дополнительных реквизитов через ручной запрос

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

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

Проанализируем пример запроса, связывающего документ РеализацияТоваровУслуг с дополнительными реквизитами его основания (ЗаказКлиента):


ВЫБРАТЬ
    Реализация.Ссылка КАК РеализацияСсылка,
    Реализация.ЗаказКлиента КАК ЗаказКлиента,
    ЕСТЬNULL(ДопРеквизитНомер.Значение, "") КАК НомерЗаказаССайта,
    ЕСТЬNULL(ДопРеквизитДата.Значение, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаЗаказаССайта
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    
    // Получаем значение первого реквизита "Номер заказа"
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ДопРеквизитНомер
        ПО Реализация.ЗаказКлиента = ДопРеквизитНомер.Ссылка
        И ДопРеквизитНомер.Свойство.Имя = "НомерЗаказаССайта"
        
    // Получаем значение второго реквизита "Дата заказа"
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ДопРеквизитДата
        ПО Реализация.ЗаказКлиента = ДопРеквизитДата.Ссылка
        И ДопРеквизитДата.Свойство.Имя = "ДатаЗаказаССайта"
ГДЕ
    Реализация.Проведен

Обратите внимание на крайне важную деталь: В условиях соединения мы используем конструкцию ДопРеквизитНомер.Свойство.Имя = "НомерЗаказаССайта". Данное обращение по текстовому имени сработает только в том случае, если при создании дополнительного реквизита в пользовательском режиме (или кодом) на вкладке «Для разработчиков» было заполнено поле «Имя для разработчиков».

Если «Имя для разработчиков» не заполнено, то обращение по имени в запросе вернет пустой результат. В таком случае правильнее передавать ссылки на конкретные элементы плана видов характеристик через параметры запроса, как показано ниже:


ВЫБРАТЬ
    Реализация.Ссылка КАК РеализацияСсылка,
    ЕСТЬNULL(ДопРеквизитНомер.Значение, "") КАК НомерЗаказаССайта
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ДопРеквизитНомер
        ПО Реализация.ЗаказКлиента = ДопРеквизитНомер.Ссылка
        И ДопРеквизитНомер.Свойство = &СвойствоНомерЗаказа

Способ 3. Программное получение значений через API БСП

Если вам требуется получить значения дополнительных реквизитов программно в коде (например, при формировании печатной формы или при заполнении реквизитов другого документа на основе заказа), не стоит вручную писать запросы к табличным частям или перебирать их циклом. БСП предоставляет готовые оптимизированные методы общего модуля УправлениеСвойствами.

Посмотрим на пример программного получения свойств:


// Передаем ссылку на объект для получения всех его заполненных свойств в виде структуры
СвойстваОбъекта = УправлениеСвойствами.ЗначенияСвойств(СсылкаНаЗаказ);

// Теперь мы можем обратиться к конкретным свойствам по их именам для разработчиков
Если СвойстваОбъекта.Свойство("НомерЗаказаССайта") Тогда
    НомерНаСайте = СвойстваОбъекта.НомерЗаказаССайта;
КонецЕсли;

Если СвойстваОбъекта.Свойство("ДатаЗаказаССайта") Тогда
    ДатаНаСайте = СвойстваОбъекта.ДатаЗаказаССайта;
КонецЕсли;

Этот метод работает быстро, надежно и автоматически учитывает все особенности хранения данных платформой.

Важное различие: Дополнительные реквизиты против Дополнительных сведений

Перед тем как писать запрос, обязательно выясните, в каком виде хранятся ваши данные. В БСП существует два принципиально разных механизма:

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


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСведения
    ПО Реализация.ЗаказКлиента = ДопСведения.Объект
    И ДопСведения.Свойство.Имя = "НомерЗаказаССайта"

Выбирайте наиболее подходящий под ваши задачи способ интеграции свойств БСП. Для построения гибких отчетов всегда отдавайте приоритет использованию механизма характеристик СКД — это сэкономит ваше время и обеспечит максимальное удобство для конечных пользователей.

← На главную