Книга знаний

1С:Предприятие / v8 / Приемы программирования

v8: Хитрый прием работы с табличными частями в запросе

Как в запросе отобрать только табличные части с указанным условием и не заполненные.Автор статьи: Гений 1С | Редакторы:
Последняя редакция №3 от 23.08.06 | История
URL: http://kb.mista.ru/article.php?id=235

Ключевые слова: табличная часть,запрос


Как то мне довелось править отчет, написанный не мной. Там выдался список всех сотрудников у которых есть дети, родившиеся после указанного года.

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

Исходный запрос был таким:


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Сотрудники.Дети.(
        Пол,
        ГодРождения
    ) КАК Дети
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список


Можно было убрать условие где, тогда бы в результат попали все табличные части, даже не заполненные. Но тогда бы терялось удобство использования отбора и скорость отчета бы гораздо уменьшилась. Мне бы пришлось программно перебирать таблицу значений Дети и проверять год рождения.

В результате я изменил условие на противоположное и добился нужного:

ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Сотрудники.Дети.(
        Пол,
        ГодРождения
    ) КАК Дети
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    НЕ (Сотрудники.Дети.ГодРождения <= &ГодРождения) И Сотрудники.Ссылка В &Список


Для пустой табличной части условие в скобках давало ложь, НЕ превращало его в истину. Все нужные данные попадали.

На самом деле запрос касался не детей, а сотрудников, прошедших обучение (изученные предметы хранились в табличной части). Нужно было показать список всех сотрудников и отметить в этом списке предметы, которые были изучены за указанный период.

Идем дальше


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

ВЫБРАТЬ
    Сотрудники.Сотрудник КАК Сотрудник,
    Дети.(Пол,ГодРождения) КАК Дети
ИЗ
    Справочник.Сотрудники КАК Сотрудники
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            СотрудникиСрезПоследних.Сотрудник КАК Сотрудник,
            СотрудникиСрезПоследних.Сотрудник.Дети.(Пол,ГодРождения) КАК Дети
        ИЗ
            Справочник.Сотрудники  
        ГДЕ
            Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список) КАК Сотрудники1  
        ПО Сотрудники.Сотрудник = Сотрудники1.Сотрудник ГДЕ Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список


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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика