Имя: Пароль:
1C
1С v8
Выбрать все документы запросом
,
0 Reclaim
 
27.02.16
14:11
Здравствуйте! Есть запрос, в котором я перебираю все документы. Столкнулся с такой проблемой: в документах необходимо выбрать "Ответственного", причем в некоторых документах такого реквизита может не быть. Как можно задать в запросе проверку, что если реквизита нет, то вывести пустую строку, а если реквизит есть, то вывести данные.

Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ПустаяСтрока", "");
    Текст = "";
    
    Для Каждого Документ Из Метаданные.Документы Цикл
        
        Текст = Текст + "ВЫБРАТЬ
        |    " + Документ.Имя + ".Ссылка КАК Документ,
        |    " + Документ.Имя + ".Номер КАК Номер,
        |    " + Документ.Имя + ".Дата КАК Дата//,
        //|    ВЫБОР
        //|        КОГДА " + Документ.Имя + ".Ответственный
        //|            ТОГДА " + Документ.Имя + ".Ответственный
        //|        ИНАЧЕ
        //|    КОНЕЦ
        |ИЗ
        |    Документ." + Документ.Имя + " КАК " + Документ.Имя + " ОБЪЕДИНИТЬ ";
        
    КонецЦикла;
    
    Запрос.Текст = Лев(Текст, СтрДлина(Текст) - СтрДлина(" ОБЪЕДИНИТЬ "));
    
    Выборка = Запрос.Выполнить().Выбрать();
1 olegves
 
27.02.16
14:39
Выбор Когда ТипЗначения(Документ) = Тип("Документ без реквизита") Тогда "Пусто"

как-то так
2 alle68
 
27.02.16
14:43
(0) Это следует делать при конструировании текста запроса.
3 Radkt
 
27.02.16
15:42
(0)в запросе через точку ссылка.реквизит , если будет рекв то заполнено, если нет то NULL. Но судя по коду если уже начали собирать запрос циклом, то можно как в (1)
4 kosts
 
27.02.16
15:44
Выбор когда Док.Ссылка Ссылка Документ.Накладная Тогда Документ.Ответственный Иначе "" конец Как Ответственный

вроде так можно
5 kosts
 
27.02.16
15:58
(0) Если проблема именно в автоматическом определении документов то смотри "Метаданные".
Дословно не помню, что-то вроде такой конструкции

Для Каждого Метадок из Метаданные.Документы Цикл
    Если Метадок.Реквизиты.Найти("Ответственный") Тогда
        Сообщить(Метадок.Имя);
    КонецЕсли;
КонецЦикла;

Мог в каждой строке ошибиться, это для представления, как делать...
6 Reclaim
 
27.02.16
16:07
(5) Да, все верно, такое есть и можно сделать так:

    Для Каждого Документ Из Метаданные.Документы Цикл
        
        Если Документ.Реквизиты.Найти("Ответственный") = Неопределено Тогда
            Текст = Текст + "ВЫБРАТЬ
            |    " + Документ.Имя + ".Ссылка КАК Документ,
            |    " + Документ.Имя + ".Номер КАК Номер,
            |    " + Документ.Имя + ".Дата КАК Дата,
            |    &ПустаяСтрока КАК Ответственный
            |ИЗ
            |    Документ." + Документ.Имя + " КАК " + Документ.Имя + "
            |ГДЕ
            |    " + Документ.Имя + ".Дата МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ";    
        Иначе
            Текст = Текст + "ВЫБРАТЬ
            |    " + Документ.Имя + ".Ссылка КАК Документ,
            |    " + Документ.Имя + ".Номер КАК Номер,
            |    " + Документ.Имя + ".Дата КАК Дата,
            |    " + Документ.Имя + ".Ответственный КАК Ответственный
            |ИЗ
            |    Документ." + Документ.Имя + " КАК " + Документ.Имя + "
            |ГДЕ
            |    " + Документ.Имя + ".Дата МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ";
        КонецЕсли;
        
    КонецЦикла;

Но надо "Ответственного" выбрать одним запросом...
7 kosts
 
27.02.16
16:10
(6) Можно не конструировать запрос в строковой переменной.
Напиши запрос для одного документа, а потом в цикле аккуратно делай

Текст = Заменить(Текст, "Документ.Накладная", "Документ." + Документ.Имя);
8 Reclaim
 
27.02.16
16:22
(7) Идея отличная, но воспользоваться не могу. Нужно собирать запрос именно по метаданным, чтобы к разным конфигурациям подходил
9 alle68
 
27.02.16
16:39
(6) Задача решена. Что не так?
10 kosts
 
27.02.16
17:05
(8) Вот что я имел ввиду в (7). Как вариант, просто нагляднее. Для простого запроса может лишнее, для сложных запросов полезнее.

Для Каждого Документ Из Метаданные.Документы Цикл
    Текст = "ВЫБРАТЬ
            |    Документ.Ссылка КАК Документ,
            |    Документ.Номер КАК Номер,
            |    Документ.Дата КАК Дата,
            |    &Ответственный КАК Ответственный
            |ИЗ
            |    Документ.Накладная КАК Документ
            |ГДЕ
            |    Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода ";

    Текст = Заменить(Текст, "Документ.Накладная", "Документ." + Документ.Имя);
    Если Документ.Реквизиты.Найти("Ответственный") <> Неопределено Тогда
        Текст = Заменить(Текст, "&Ответственный", "Документ.Ответственный");
    КонецЕсли;

    ТекстЗапроса = ТекстЗапроса + Текст + " ОБЪЕДИНИТЬ ВСЕ ";
КонецЦикла;
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.