Автоматизация бизнеса

Установка, настройка, внедрение и сопровождение любых конфигураций на платформе 1С:Предприятие. 

e-mail: info@programmist1c.ru

Минимальный объем работ от 50 000 рублей
  •   Удаленный админ
  •   Карта сайта
  •   Контакты


  • Поиск
     

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

    Как в запросе отобрать только табличные части с указанным условием и не заполненные.
    Автор статьи: Гений 1С | Редакторы:
    Последняя редакция №3 от 23.08.06 |


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


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

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

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


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


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

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

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


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

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

    Идем дальше


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

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


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


    30.11.16 | 20:25


    28.11.16 | 09:22


    26.11.16 | 08:19


    22.11.16 | 20:17


    19.11.16 | 10:14


    18.11.16 | 20:09




    Внедрение 1С Автоматизация 1С Доработка 1С Сопровождение 1С Обслуживание 1С Программирование 1С 8 Hастройка 1С Карта сайта Контакты