Имя: Пароль:
1C
 
крутит цикл
0 Nemirov
 
27.04.20
10:54
Добрый день. Уже голова не варит 1с бухгалтерия при выполнении цикл не останавливается подскажите где я ошибку сделал

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка,
    |    ОтчетОРозничныхПродажах.Дата КАК Дата,
    |    ОтчетОРозничныхПродажахТовары.Субконто,
    |    ВЫБОР
    |        КОГДА ПриходныйКассовыйОрдер.Ссылка ЕСТЬ NULL
    |            ТОГДА ИСТИНА
    |        ИНАЧЕ ЛОЖЬ
    |    КОНЕЦ КАК ПроведенныеПКО
    |ИЗ
    |    Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
    |        ПО ПриходныйКассовыйОрдер.ДокументОснование = ОтчетОРозничныхПродажах.Ссылка,
    |    Документ.ОтчетОРозничныхПродажах.Товары КАК ОтчетОРозничныхПродажахТовары
    |ГДЕ
    |    ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
    
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл            
        ЕстьПКО = Документы.ПриходныйКассовыйОрдер.НайтиПоРеквизиту("ДокументОснование", ВыборкаДетальныеЗаписи.Ссылка);
        Если НЕ ВыборкаДетальныеЗаписи.ПроведенныеПКО Тогда
            Если ЭлементыФормы.БезПерезаписиДокумента.Значение = Ложь Тогда
                СуществующийДокумент = ЕстьПКО.ПолучитьОбъект();
                Если ЕстьПКО.ПометкаУдаления = Истина Тогда
                    Сообщить(" " + СуществующийДокумент + " " + "Помечен на удаление");
                    Продолжить;
                Иначе
                    СуществующийДокумент.Заполнить(ВыборкаДетальныеЗаписи.ссылка);
                    Субконто = ВыборкаДетальныеЗаписи.Субконто;
                    СуществующийДокумент.Дата =   ВыборкаДетальныеЗаписи.Дата;
                    СуществующийДокумент.ПринятоОт = ВыборкаДетальныеЗаписи.Субконто;
                    СуществующийДокумент.Записать(РежимЗаписиДокумента.Проведение);
                    Сообщить("" +СуществующийДокумент + " " + "Переписан",);
                КонецЕсли;
            Иначе
                Сообщить("Пропускаем существующие");
            КонецЕсли;
            Продолжить;
        КонецЕсли;
        
        Док = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
        Док.Заполнить(ВыборкаДетальныеЗаписи.ссылка);
        Док.Дата =   ВыборкаДетальныеЗаписи.Дата;
        Попытка
            Док.Записать(РежимЗаписиДокумента.Проведение);
            Сообщить("" + Док.ЭтотОбъект + " " + "создан");
        Исключение        
            Сообщить("" + ОписаниеОшибки() );
        КонецПопытки;
        
    КонецЦикла;
    Возврат;
    
КонецПроцедуры
1 RomanYS
 
27.04.20
10:58
(0) проблема не в цикле, а в запросе. Вот здесь
    |        ПО ПриходныйКассовыйОрдер.ДокументОснование = ОтчетОРозничныхПродажах.Ссылка,
    |    Документ.ОтчетОРозничныхПродажах.Товары КАК ОтчетОРозничныхПродажахТовары
2 Ненавижу 1С
 
гуру
27.04.20
10:58
(0) потому что ты постоянно перезаписываешь документ из выборки и ее сбиваешь, выгрузи результат в таблицу значений
3 Ненавижу 1С
 
гуру
27.04.20
10:59
+(1) ну это тоже ад
4 RomanYS
 
27.04.20
11:00
(2) Выборку запроса нельзя сбить записью документов. Это же не ДокументВыборка
5 dmpl
 
27.04.20
11:01
Может начинается битва обработчиков или подписок на события?
6 dmpl
 
27.04.20
11:02
Рекомендую включить замер производительности и посмотреть, где что крутится.
7 Franchiser
 
гуру
27.04.20
11:03
Итоги добавь
8 Franchiser
 
гуру
27.04.20
11:04
у тебя в запросе декартово произведение
9 Nemirov
 
27.04.20
11:05
Получилась такая беда я когда запрос изменил, добавив субконто, а остальное левым сединением может поэтому) просто до этого все нормально перезаписывалось. В отчете о розничных продаж когда вводишь эти накладные на основании, не заполняется от кого получено, единственный способ я так понял добавив субконто, я может не правильно соединение сделал? (8)
10 Nemirov
 
27.04.20
11:06
До этого запрос такой был

"ВЫБРАТЬ
    |    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка,
    |    ОтчетОРозничныхПродажах.Дата КАК Дата,
    |    ВЫБОР
    |        КОГДА ПриходныйКассовыйОрдер.Ссылка ЕСТЬ NULL
    |            ТОГДА ИСТИНА
    |        ИНАЧЕ ЛОЖЬ
    |    КОНЕЦ КАК ПроведенныеПКО
    |ИЗ
    |    Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
    |        ПО ПриходныйКассовыйОрдер.ДокументОснование = ОтчетОРозничныхПродажах.Ссылка
    |ГДЕ
    |    ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
11 Nemirov
 
27.04.20
11:07
Извиняюсь такой

    "ВЫБРАТЬ
    |    ОтчетОРозничныхПродажах.Ссылка,
    |    ОтчетОРозничныхПродажах.Дата,
    |    ВЫБОР
    |        КОГДА ПриходныйКассовыйОрдер.Ссылка ЕСТЬ NULL
    |            ТОГДА ИСТИНА
    |        ИНАЧЕ ЛОЖЬ
    |    КОНЕЦ КАК ПроведенныеПКО
    |ИЗ
    |    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
    |        ПО (ПриходныйКассовыйОрдер.ДокументОснование = ОтчетОРозничныхПродажах.Ссылка)
    |ГДЕ
    |    ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
12 ИУБиПовиц
 
27.04.20
11:11
У вас соединение изменилось.
А как вы определяете что именно цикл крутиться, т.е. до выборки вообще доходит? может просто тупо документов больше стало и запрос не успевает обработать?:)
13 RomanYS
 
27.04.20
11:11
(9) Да. Соединение ты сделал неправильно. Ты его вообще не сделал, а сделал (8)
14 Nemirov
 
27.04.20
11:37
(12)     Сообщить("" +СуществующийДокумент + " " + "Переписан",);  перезаписывает по кругу существующие.
15 Nemirov
 
27.04.20
11:37
(13) Вариант поправить помочь мои декарты есть?
16 Nemirov
 
27.04.20
11:38
(15) Может свернуть покажете как?
17 Ненавижу 1С
 
гуру
27.04.20
11:44
ну сделай хотя бы РАЗЛИЧНЫЕ
но вот интересно, что будет когда в одном документе будет разное ОтчетОРозничныхПродажахТовары.Субконто
18 ИУБиПовиц
 
27.04.20
11:52
(14) Ну на сколько я понимаю, перезаписывать будет сколько строк в документе. сделайте что ли обход по группировкам результат запроса, первым циклом по доку, вторым субконто выбираете
или максимум субконто, что б одно из субконтов из тч выбиралось
19 Nemirov
 
27.04.20
11:52
хорошо давай другим путем, если не субконто как определить какой структурной единице принадлежит документ отчет о розничных продажах) если справочника структурные единицы нет и единственное где указан чей документ это в субконто(17)
20 Nemirov
 
27.04.20
11:52
(18) Ладно спасибо
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн