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