v8: Хитрый прием работы с табличными частями в запросе
Как в запросе отобрать только табличные части с указанным условием и не заполненные. | Автор статьи: Гений 1С | Редакторы: Последняя редакция №3 от 23.08.06 | |
Ключевые слова: табличная часть,запрос
Как то мне довелось править отчет, написанный не мной. Там выдался список всех сотрудников у которых есть дети, родившиеся после указанного года.
Ну и меня попросили переделать, чтобы в список попадали не только те сотрудники, у которых есть дети нужного возраста, но и сотрудники без детей и галочкой отмечать таких бездетных сотрудников.
Исходный запрос был таким:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Дети.(
Пол,
ГодРождения
) КАК Дети
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список
Можно было убрать условие где, тогда бы в результат попали все табличные части, даже не заполненные. Но тогда бы терялось удобство использования отбора и скорость отчета бы гораздо уменьшилась. Мне бы пришлось программно перебирать таблицу значений Дети и проверять год рождения.
В результате я изменил условие на противоположное и добился нужного:
ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник, Сотрудники.Дети.( Пол, ГодРождения ) КАК Дети ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ НЕ (Сотрудники.Дети.ГодРождения <= &ГодРождения) И Сотрудники.Ссылка В &Список
Для пустой табличной части условие в скобках давало ложь, НЕ превращало его в истину. Все нужные данные попадали.
На самом деле запрос касался не детей, а сотрудников, прошедших обучение (изученные предметы хранились в табличной части). Нужно было показать список всех сотрудников и отметить в этом списке предметы, которые были изучены за указанный период.
Идем дальше
Но лучше всего и надежнее использовать другой подход. Если уж вам хочется таблиц значений, нужно написать этот запрос так:
ВЫБРАТЬ Сотрудники.Сотрудник КАК Сотрудник, Дети.(Пол,ГодРождения) КАК Дети ИЗ Справочник.Сотрудники КАК Сотрудники ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ СотрудникиСрезПоследних.Сотрудник КАК Сотрудник, СотрудникиСрезПоследних.Сотрудник.Дети.(Пол,ГодРождения) КАК Дети ИЗ Справочник.Сотрудники ГДЕ Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список) КАК Сотрудники1 ПО Сотрудники.Сотрудник = Сотрудники1.Сотрудник ГДЕ Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список
То есть соединить справочник сотрудников с самим собой.
При этом в поле Дети будут уже не ТаблицаЗначений, а РезультатЗапроса (преобразуется к ТЗ методом Выгрузить). Но зато в тех таблицах, где нет данных, будут пустые таблицы значений.