Имя: Пароль:
1C
 
Как сделать запрос по всем документам с отбором по сериям и номенклатуре?
0 gabd_marat
 
13.03.20
09:07
Добрый день! Можете подсказать как сделать запрос по всем документам с отбором по сериям и номенклатуре
1 dka80
 
13.03.20
09:10
Нужно больше деталей: что значит все документы? Прием сотрудника на работу и Требование накладная? Где серии? В табличной части или в реквизитах документа? Может все-таки посмотреть какие регистры двигают документы и по регистру собрать?
2 d4rkmesa
 
13.03.20
09:12
(0) В языке запросов 1С нет понятия "все документы". Если только есть критерии отбора, но там специфическое применение.
3 dka80
 
13.03.20
09:14
(2) тем не менее, это не мешает динамически сформировать текст запроса по метаданным и получить запрос по всем документам
4 gabd_marat
 
13.03.20
09:32
Или можно как то циклом сделать запрос по метаданным где в табл части используется номенклатура и серии, потом через отладчик получить массив данных?
5 gabd_marat
 
13.03.20
09:32
(3) Есть примеры?
6 gabd_marat
 
13.03.20
09:36
(2) Список документов не известен где используется эта номенклатура с сериями. Серия и номенклатура в табличной части документа.
7 Йохохо
 
13.03.20
09:36
(4) покажи что получилось по одному документу
запрос по метаданным, данные из отладчика, кто то наступил на пятницу тринадцатое
8 ДенисЧ
 
13.03.20
09:40
(6) Вообще ниезвестен? Или только тебе?
9 welwel
 
13.03.20
09:42
(5) http://bit.ly/2wScT9D
Первая ссылка на мисту
10 dka80
 
13.03.20
09:48
Ищи в яндексе обход дерева метаданных
11 gabd_marat
 
13.03.20
13:41
Вроде что то получилось

Процедура КнопкаВыполнитьНажатие(Кнопка)
Итерация = 0;
Запрос = Новый Запрос;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "ВЫБРАТЬ Таблицы.Номенклатура,
|Таблицы.СерияНоменклатуры,
|Таблицы.Ссылка
|ПОМЕСТИТЬ ВременнаяТаблица ИЗ (
    |";
Для Каждого Документ Из Метаданные.Документы Цикл
    
       //Сообщить("---------------------------

       //|Документ: "+Документ.Имя);
        к1 = 0;
        к2 = 0;
    Для Каждого ТабличнаяЧасть Из Документ.ТабличныеЧасти Цикл
       //Сообщить("ТабличнаяЧасть: "+ТабличнаяЧасть.Имя);
        к1 = 0;
        к2 = 0;
        Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
           //Сообщить("Реквизит: "+Реквизит.Имя);

            Если Реквизит.Имя = "СерияНоменклатуры" Тогда
               //Сообщить("------- Хоп");          
               к1 = 1;
            КонецЕсли;

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

                Итерация = ?(Итерация = 0,1,1);
        к1 = 0;
        к2 = 0;
            
        КонецЕсли;
        
        
    КонецЦикла;
КонецЦикла;
Запрос.Текст = Запрос.Текст + "
    |) КАК Таблицы";
//Сообщить(Запрос.Текст);

ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
//Для Каждого Строка Из ТаблицаЗначений Цикл

//    Сообщить(Строка(Строка.Номенклатура) + " — " + Строка(Строка.Документ));
//КонецЦикла;

//Сообщить(ТаблицаЗначений.Количество());
Запрос1 = Новый Запрос;
Запрос1.Текст = "
    |ВЫБРАТЬ Номенклатура.Ссылка
    |ИЗ Справочник.Номенклатура КАК Номенклатура
    |ГДЕ Номенклатура.Ссылка НЕ В (&ТЗ)
    |УПОРЯДОЧИТЬ ПО Номенклатура.Ссылка.Наименование";
Запрос1.УстановитьПараметр("ТЗ",ТаблицаЗначений);
ТаблицаЗначений1 = Запрос1.Выполнить().Выгрузить();
Для Каждого Строка Из ТаблицаЗначений Цикл
    Сообщить(Строка(Строка.Ссылка));
КонецЦикла;
Сообщить(ТаблицаЗначений1.Количество());
КонецПроцедуры (10) (10)
12 gabd_marat
 
13.03.20
13:43
Делаю точку остановки на строке ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
не могу получить элементы таблицы значений, почему?
13 ДенисЧ
 
13.03.20
13:45
(12) Потому что у тебя
|ПОМЕСТИТЬ ВременнаяТаблица ИЗ (
14 gabd_marat
 
13.03.20
13:52
(13) Мне получается нужно сделать запрос к тз и добавить отбор по номенклатуре и серии?
15 ДенисЧ
 
13.03.20
14:00
(14) Если платформа новая - то в отладчике можешь посмотреть в запросе менеджер временных таблиц, там есть временные таблицы, оттуда можно посмотреть
16 gabd_marat
 
13.03.20
15:03
8.3.1534 (15)
17 gabd_marat
 
13.03.20
15:04
Где смотреть ?
18 ДенисЧ
 
13.03.20
15:08
(17) (17) На запрос в отладчике встань и поразворачивай плюсики - увидишь
19 gabd_marat
 
13.03.20
16:41
Получилось , вот

Процедура КнопкаВыполнитьНажатие(Кнопка)
Итерация = 0;
Запрос = Новый Запрос;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "ВЫБРАТЬ Таблицы.Номенклатура,
|Таблицы.СерияНоменклатуры,
|Таблицы.Ссылка
|ПОМЕСТИТЬ ВременнаяТаблица ИЗ (
    |";
Для Каждого Документ Из Метаданные.Документы Цикл
    
       //Сообщить("---------------------------

       //|Документ: "+Документ.Имя);
        к1 = 0;
        к2 = 0;
    Для Каждого ТабличнаяЧасть Из Документ.ТабличныеЧасти Цикл
       //Сообщить("ТабличнаяЧасть: "+ТабличнаяЧасть.Имя);
        к1 = 0;
        к2 = 0;
        Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
           //Сообщить("Реквизит: "+Реквизит.Имя);

            Если Реквизит.Имя = "СерияНоменклатуры" Тогда
               //Сообщить("------- Хоп");          
               к1 = 1;
            КонецЕсли;

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

                Итерация = ?(Итерация = 0,1,1);
        к1 = 0;
        к2 = 0;
            
        КонецЕсли;
        
        
    КонецЦикла;
КонецЦикла;
Запрос.Текст = Запрос.Текст + "
    |) КАК Таблицы ;
    |ВЫБРАТЬ ВременнаяТаблица.Номенклатура,
    |ВременнаяТаблица.Ссылка КАК Ссылка,
    |ВременнаяТаблица.СерияНоменклатуры КАК СерияНоменклатуры
    |ИЗ ВременнаяТаблица КАК ВременнаяТаблица
|ГДЕ ВременнаяТаблица.Номенклатура.Ссылка = &СсылкаНоменклатура
|УПОРЯДОЧИТЬ ПО ВременнаяТаблица.Ссылка";
Запрос.УстановитьПараметр("СсылкаНоменклатура",Справочники.Номенклатура.НайтиПоКоду("Н0021225"));
Запрос.УстановитьПараметр("СерияНоменклатуры",Справочники.СерииНоменклатуры.НайтиПоКоду("000030631",Истина));
//Сообщить(Запрос.Текст);

ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой