![]() |
|
Заполнение ТЧ с обработкой запроса | ☑ | ||
---|---|---|---|---|
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) Месяца два)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |