Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 10:49

Обход запроса

Автор trialex3, 22 авг 2018, 11:09

0 Пользователей и 1 гость просматривают эту тему.

trialex3

Добрый день! прошу помощи.
Есть запрос с группировкой.
скрин результата
Мне надо его обойти и записать каждую группировку в документ, в табличную часть.
Результат = Запрос.Выполнить();

ВыборкаГруппировка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаГруппировка.Следующий() Цикл

ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
ТабЧасть = Док.СписокИзделий.Добавить();
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сч = 0;//счетчик изделий из запроса
Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл
Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;
Сч = Сч+1;
КонецЦикла;

КонецЦикла;
Док.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Он записывает 2 документа, но в каждой только по 1-ой строке. Где ошибка?

LexaK


Пока ВыборкаГруппировка.Следующий() Цикл
...
ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
//ТабЧасть = Док.СписокИзделий.Добавить(); // отсюда убрать
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сч = 0;//счетчик изделий из запроса
    Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл
        ТабЧасть = Док.СписокИзделий.Добавить(); // сюда вставить
        Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;       
        Сч = Сч+1;       
    КонецЦикла;
КонецЦикла;
Док.Записать(РежимЗаписиДокумента.Запись);   
...


попробуйте так
если помогло нажмите: Спасибо!

trialex3

Цитата: LexaK от 22 авг 2018, 11:20

Пока ВыборкаГруппировка.Следующий() Цикл
...
ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
//ТабЧасть = Док.СписокИзделий.Добавить(); // отсюда убрать
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сч = 0;//счетчик изделий из запроса
    Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл
        ТабЧасть = Док.СписокИзделий.Добавить(); // сюда вставить
        Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;       
        Сч = Сч+1;       
    КонецЦикла;
КонецЦикла;
Док.Записать(РежимЗаписиДокумента.Запись);   
...


попробуйте так
Да помогло, спасибо. Воспользуюсь вашими знаниями еще раз, если вы не против)
Скажите, как можно ограничить создание строк в документе определенным числом? То есть как только в группировке создается документ, система начинает считать и как только число созданных строк достигнет например 5ти то система закроет этот документ и начнет новый?

LexaK

блин, ну это же элементарная математика!


ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
//ТабЧасть = Док.СписокИзделий.Добавить(); // отсюда убрать
лкПредел = 5;
...
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сч = 0;//счетчик изделий из запроса
    лкСтрок = 0;//количество строк в текущем документе
    Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл  //почему не - Для ... по ... Цикл
        ТабЧасть = Док.СписокИзделий.Добавить(); // сюда вставить
        Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;       
        Сч = Сч+1;       
        лкСтрок  = лкСтрок + 1;
        Если лкСтрок = лкПредел Тогда
            //достигли предела, записываем старый документ
            Док.Записать(РежимЗаписиДокумента.Запись);   
            //и создаем новый
            Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
            Док.Дата = ТекущаяДата();
            //сбрасываем счетчик
            лкСтрок = 0;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;
//здесь можно добавить проверку пустой документ или нет, сами добавите?
Док.Записать(РежимЗаписиДокумента.Запись);   
...

примерно так, возможны варианты
если помогло нажмите: Спасибо!

trialex3

Цитата: LexaK от 22 авг 2018, 11:50
блин, ну это же элементарная математика!


ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
//ТабЧасть = Док.СписокИзделий.Добавить(); // отсюда убрать
лкПредел = 5;
...
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сч = 0;//счетчик изделий из запроса
    лкСтрок = 0;//количество строк в текущем документе
    Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл  //почему не - Для ... по ... Цикл
        ТабЧасть = Док.СписокИзделий.Добавить(); // сюда вставить
        Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;       
        Сч = Сч+1;       
        лкСтрок  = лкСтрок + 1;
        Если лкСтрок = лкПредел Тогда
            //достигли предела, записываем старый документ
            Док.Записать(РежимЗаписиДокумента.Запись);   
            //и создаем новый
            Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
            Док.Дата = ТекущаяДата();
            //сбрасываем счетчик
            лкСтрок = 0;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;
//здесь можно добавить проверку пустой документ или нет, сами добавите?
Док.Записать(РежимЗаписиДокумента.Запись);   
...

примерно так, возможны варианты
Проверку на пустой документ вы имеете ввиду это?
Если НЕ Док.Пустой() Тогда
Док.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
А в каких случаях ок пустой может быть?
Добавлено: 22 авг 2018, 12:14


Хотя у дока нет функции пустой...
Добавлено: 22 авг 2018, 12:26


решил вот так
Если НЕ Док.СписокИзделий.Количество()=0 Тогда
Док.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

Добавлено: 22 авг 2018, 12:33


Цитата: LexaK от 22 авг 2018, 11:50примерно так, возможны варианты
Поставил для проверки цифру 3. Строчек 9. По идее должно быть 5 документов. Но документов 4. в одном из них 3 строчки как то получилось...


Добавлено: 22 авг 2018, 12:37


а если поставить цифру 3 то вообще 2 документа создается с 7 и 2 строчками, по группировкам
Добавлено: 22 авг 2018, 14:11


Цитата: LexaK от 22 авг 2018, 11:50примерно так, возможны варианты
ВыборкаГруппировка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаГруппировка.Следующий() Цикл

ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сч = 0;//счетчик изделий из запроса
ЛкСтрок = 0;//количество строк в текущем документе
Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл
ТабЧасть = Док.СписокИзделий.Добавить();
Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;
Сч = Сч+1;
ЛкСтрок  = ЛкСтрок + 1;
Если ЛкСтрок = КоличествоВПаспорте Тогда
            //достигли предела, записываем старый документ
            Док.Записать(РежимЗаписиДокумента.Запись);   
            //и создаем новый
            Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
            Док.Дата = ТекущаяДата();
            //сбрасываем счетчик
            лкСтрок = 0;
        КонецЕсли;
КонецЦикла;
КонецЦикла;
Если НЕ Док.СписокИзделий.Количество()=0 Тогда
Док.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЦикла;

Вроде как проблема в условии Если ЛкСтрок = КоличествоВПаспорте Тогда. строчка всего одна может быть и тогда цикл заканчивается и лкСтрок обнуляется.

Добавлено: 22 авг 2018, 14:41


Вообщем решил это так.
Результат = Запрос.Выполнить();

ВыборкаГруппировка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Признак = ложь;
Пока ВыборкаГруппировка.Следующий() Цикл
   
ВыборкаДетальныеЗаписи = ВыборкаГруппировка.Выбрать();
Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сч = 0;//счетчик изделий из запроса
Если Признак = Истина Тогда
Признак = Ложь;
Иначе
ЛкСтрок = 0;//количество строк в текущем документе
КонецЕсли;

Пока НЕ Сч = ВыборкаДетальныеЗаписи.Количество Цикл
ТабЧасть = Док.СписокИзделий.Добавить();
Табчасть.Характеристика = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;
Сч = Сч+1;
ЛкСтрок  = ЛкСтрок + 1;
Если ЛкСтрок = КоличествоВПаспорте Тогда
            //достигли предела, записываем старый документ
            Док.Записать(РежимЗаписиДокумента.Запись);   
            //и создаем новый
            Док = Документы.АР_ПаспортаИзделий.СоздатьДокумент();
            Док.Дата = ТекущаяДата();
            //сбрасываем счетчик
            лкСтрок = 0;
Признак = Ложь;
Иначе Признак = Истина;
        КонецЕсли;
КонецЦикла;
КонецЦикла;
Если НЕ Док.СписокИзделий.Количество()=0 Тогда
Док.Записать(РежимЗаписиДокумента.Запись);
ЛкСтрок = 0;
КонецЕсли;
КонецЦикла;

понимаю что решение скорее всего ужасное и неправильное. Господа программисты, поправьте сей ужас если можете.

LexaK

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

trialex3

К сожалению обход по группировкам очень нужен)

Теги:  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск