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