Имя: Пароль:
1C
1С v8
Заполнение ТЧ с обработкой запроса
0 IIroxod4uk
 
08.10.22
18:51
Делаю во внешней обработке. С помощью запроса получил данные, которые нужны. Надо заполнить ТЧ документов.
Текст запроса
ВЫБРАТЬ
    питДанныеПродажФронтаОплаты.Ссылка КАК Ссылка,
    питДанныеПродажФронтаОплаты.ВидОплаты КАК ВидОплаты,
    питДанныеПродажФронтаОплаты.СуммаОплаты КАК СуммаОплаты
ПОМЕСТИТЬ ВТ_ВсеЧеки
ИЗ
    Документ.питДанныеПродажФронта.Оплаты КАК питДанныеПродажФронтаОплаты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ВсеЧеки.Ссылка КАК Ссылка,
    КОЛИЧЕСТВО(ВТ_ВсеЧеки.ВидОплаты) КАК КоличествоВидовОплат
ПОМЕСТИТЬ ВТ_ДвойныеОплаты
ИЗ
    ВТ_ВсеЧеки КАК ВТ_ВсеЧеки
ГДЕ
    ВТ_ВсеЧеки.ВидОплаты.питВидОперации = &питВидОперацииРеализацияКонтрагенту

СГРУППИРОВАТЬ ПО
    ВТ_ВсеЧеки.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ВТ_ВсеЧеки.ВидОплаты) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ВсеЧеки.Ссылка КАК Ссылка,
    ВТ_ВсеЧеки.ВидОплаты КАК ВидОплаты,
    ВТ_ВсеЧеки.СуммаОплаты КАК СуммаОплаты
ПОМЕСТИТЬ ВТ_ОплатыПоЧекам
ИЗ
    ВТ_ВсеЧеки КАК ВТ_ВсеЧеки
ГДЕ
    НЕ ВТ_ВсеЧеки.Ссылка В
                (ВЫБРАТЬ
                    ВТ_ДвойныеОплаты.Ссылка КАК Ссылка
                ИЗ
                    ВТ_ДвойныеОплаты КАК ВТ_ДвойныеОплаты)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ОплатыПоЧекам.Ссылка КАК Ссылка,
    ВТ_ОплатыПоЧекам.ВидОплаты КАК ВидОплаты,
    ВТ_ОплатыПоЧекам.СуммаОплаты КАК СуммаОплаты,
    ВЫБОР
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаВозврат)
            ТОГДА ЗНАЧЕНИЕ(Документ.ВозвратТоваровОтКлиента.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ВыпускПродукции)
            ТОГДА ЗНАЧЕНИЕ(Документ.питВыпускБлюд.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаПредоплата)
                И ВТ_ОплатыПоЧекам.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.питТипыОплат.Наличные)
            ТОГДА ЗНАЧЕНИЕ(Документ.ПриходныйКассовыйОрдер.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаПредоплата)
                И НЕ ВТ_ОплатыПоЧекам.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.питТипыОплат.Наличные)
            ТОГДА ЗНАЧЕНИЕ(Документ.ОперацияПоПлатежнойКарте.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаВозвратПредоплаты)
                И ВТ_ОплатыПоЧекам.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.питТипыОплат.Наличные)
            ТОГДА ЗНАЧЕНИЕ(Документ.РасходныйКассовыйОрдер.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаВозвратПредоплаты)
                И НЕ ВТ_ОплатыПоЧекам.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.питТипыОплат.Наличные)
            ТОГДА ЗНАЧЕНИЕ(Документ.ОперацияПоПлатежнойКарте.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаОтмена)
                ИЛИ ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.Списание)
            ТОГДА ЗНАЧЕНИЕ(Документ.ВнутреннееПотреблениеТоваров.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.Списание)
                ИЛИ ВТ_ОплатыПоЧекам.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.питХозяйственныеОперации.ДанныеПродажФронтаОтмена)
            ТОГДА ЗНАЧЕНИЕ(Документ.ВнутреннееПотреблениеТоваров.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.Реализация)
                    И ВТ_ОплатыПоЧекам.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.питТипыОплат.питЗачетАванса)
                ИЛИ ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.РеализацияОптовая)
            ТОГДА ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.Реализация)
                    И ВТ_ОплатыПоЧекам.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.питТипыОплат.питЗачетАванса)
                ИЛИ ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.РеализацияОптовая)
            ТОГДА ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)
        КОГДА ВТ_ОплатыПоЧекам.ВидОплаты.питВидОперации = ЗНАЧЕНИЕ(Перечисление.питВидыОперацийПоЗагрузкеДанныхПродаж.Реализация)
            ТОГДА ЗНАЧЕНИЕ(Документ.ОтчетОРозничныхПродажах.ПустаяСсылка)
        ИНАЧЕ ЗНАЧЕНИЕ(Документ.ОтчетОРозничныхПродажах.ПустаяСсылка)
    КОНЕЦ КАК ТипТиповогоДокумента
ПОМЕСТИТЬ ВТ_СоединениеСРегистром
ИЗ
    ВТ_ОплатыПоЧекам КАК ВТ_ОплатыПоЧекам
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_СоединениеСРегистром.Ссылка КАК Чеки,
    ВТ_СоединениеСРегистром.ВидОплаты КАК ВидОплаты,
    ВТ_СоединениеСРегистром.СуммаОплаты КАК СуммаОплаты,
    ЕСТЬNULL(питУчетДанныхПродаж.ДокументПриемник, 0) КАК ДокументПриемник
ИЗ
    ВТ_СоединениеСРегистром КАК ВТ_СоединениеСРегистром
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.питУчетДанныхПродаж КАК питУчетДанныхПродаж
        ПО (питУчетДанныхПродаж.ДокументРегистратор = ВТ_СоединениеСРегистром.Ссылка)
            И (ТИПЗНАЧЕНИЯ(питУчетДанныхПродаж.ДокументПриемник) = ТИПЗНАЧЕНИЯ(ВТ_СоединениеСРегистром.ТипТиповогоДокумента))
ГДЕ
    питУчетДанныхПродаж.ДокументПриемник.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

С помощью выборки обхожу ТЧ и добавляю новые записи

Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ДокСсылка = Выборка.ДокументПриемник;
        Если ДокСсылка = 0 Тогда
            Продолжить;
        Иначе
            ДокОбъект = ДокСсылка.ПолучитьОбъект();
            //ДокОбъект.СМ_ВидыОплаты.Очистить();
            
            стр = ДокОбъект.СМ_ВидыОплаты.Добавить();
            стр.ВидОплаты = Выборка.ВидОплаты;
            стр.Сумма = Выборка.СуммаОплаты;
            Попытка
                ДокОбъект.Записать();
            Исключение
                ЗаписьЖурналаРегистрации("Обработка ",,,," не записал " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
            КонецПопытки
        КонецЕсли;
    КонецЦикла;
Но заполнение происходит очень медленно. Понимаю, что я записываю каждую строку каждый раз в цикле. Выношу из цикла записывает - только последний документ.
Что я делаю не так?
Тухлые яйца, пожалуйста, только учусь..
1 onetone
 
08.10.22
18:53
Группировку по документу в запросе, а потом уже два цикла, один по документы, а второй по строкам документа.
2 IIroxod4uk
 
08.10.22
19:31
{ВнешняяОбработка.СМ_ВидыОплаты.Форма.Форма.Форма(125)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
            ДокОбъект = ДокСсылка.ПолучитьОбъект();
по причине:
Конфликт блокировок при выполнении транзакции:
Нарушение целостности чтения объекта базы данных из-за параллельного изменения объекта другим сеансом

Второй цикл, я так понял, делать так
        Для Каждого стр из ДокОбъект.СМ_ВидыОплаты Цикл
                стр = ДокОбъект.СМ_ВидыОплаты.Добавить();
                стр.ВидОплаты = Выборка.ВидОплаты;
                стр.Сумма = Выборка.СуммаОплаты;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Попытка
        ДокОбъект.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("Обработка ",,,," не записал " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки
3 vicof
 
08.10.22
20:17
(2) Блокировки тоже нужно ставить
4 IIroxod4uk
 
08.10.22
20:48
(3) Поставил.
Для Каждого стр из ДокОбъект.СМ_ВидыОплаты Цикл

Так, теперь не понимаю откуда брать данные, чтобы заполнить строки. В цикл тупо не заходит, потому что в стр ничего нет.
5 Мимохожий Однако
 
09.10.22
09:42
(4) Пришло время включить отладку и шагать от начала процедур
6 IIroxod4uk
 
10.10.22
09:42
(5) Видимо, пора завязывать с 1С. Ничего не получается..
7 Мимохожий Однако
 
10.10.22
09:50
(6) Давно ли связался ? )
8 IIroxod4uk
 
10.10.22
09:52
(7) Месяца два)