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

Подскажите новичку.

Автор Derguncik, 09 фев 2023, 14:42

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

Derguncik

Добрый день, всех заранее благодарю за помощь. Такой вопрос. Мучаюсь с задачами по спецу и застрял в непонятной мне ситуации. Имеется расходная накладная , она двигает регистр в приход(долг покупателя растет) .  Имеется документ "приход денег" контрагент приносит нам деньги, документ должен покрыть долги и если денег слишком много, записать эти деньги в аванс(пустой проект). Все пишется как надо, кроме последней итерации цикла, она просто не пишется, но при этом все данные (если смотреть через отладку) подтягиваются корректно, всю голову сломал и не вижу ошибки. Как быть, куда смотреть, благодарю.
Процедура ОбработкаПроведения(Отказ, Режим)

Движения.Взаиморасчеты.Записывать = Истина;
Движения.Взаиморасчеты.Записать();
Движения.Взаиморасчеты.Записывать = Истина;


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

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
КСписанию = Сумма;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Движение = Движения.Взаиморасчеты.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Накладная = ВыборкаДетальныеЗаписи.Накладная;
Движение.Валюта = ВыборкаДетальныеЗаписи.Валюта;

СписатьОсталось= мин(КСписанию, ВыборкаДетальныеЗаписи.СуммаОстатокВРублях);
Если СписатьОсталось =  ВыборкаДетальныеЗаписи.СуммаОстатокВрублях  Тогда

Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток;

Иначе
Движение.Сумма = Окр(ВыборкаДетальныеЗаписи.СуммаОстатокВрублях / ВыборкаДетальныеЗаписи.Курс,2);

КонецЕСли;

КСписанию = КСписанию - СписатьОсталось;
КонецЦикла;

Если КСписанию <> 0 Тогда

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Накладная = Ссылка.Пустая();
Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
Движение.Сумма  = КСписанию;

КонецЕсли;
КонецПроцедуры
 

Снимок экрана 2023-02-09 143255.pngСнимок экрана 2023-02-09 143342.png   

LexaK

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

        СписатьОсталось = мин(КСписанию, ВыборкаДетальныеЗаписи.СуммаОстатокВРублях);
        Если СписатьОсталось =  ВыборкаДетальныеЗаписи.СуммаОстатокВрублях  Тогда
           
            Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток;
           
        Иначе
            //Движение.Сумма = Окр(ВыборкаДетальныеЗаписи.СуммаОстатокВрублях / ВыборкаДетальныеЗаписи.Курс,2);
            Движение.Сумма = Окр(СписатьОсталось / ВыборкаДетальныеЗаписи.Курс,2);
           
        КонецЕСли;
       
        КСписанию = КСписанию - СписатьОсталось;
    КонецЦикла;

//только если еще остался остаток
    Если КСписанию > 0 Тогда
       
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Контрагент = Контрагент;
        Движение.Накладная = Неопределено; //Ссылка.Пустая();
        Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
        Движение.Сумма  = КСписанию;
       
КонецЕсли;     

КонецПроцедуры
 
если помогло нажмите: Спасибо!

Derguncik

LexaK, Спасибо, но последняя итерация все так же пропадает. Думаю может уже просто кэш почистить ui;;t;

LexaK

Цитата: Derguncik от 09 фев 2023, 15:24LexaK, Спасибо, но последняя итерация все так же пропадает. Думаю может уже просто кэш почистить ui;;t;
если в процессе списания КСписанию  уходит в 0. то все остальные строчки пропускаются!
пройдите этот код под отладчиком! (пропадать ни чего не должно)
если помогло нажмите: Спасибо!

Derguncik

LexaK, Да, я понимаю, на последней итерации КСписанию остается 920 тысяч(считается правильно) , они и идут в аванс, но в регистр не попадает последняя запись перед авансом, должно было списаться 5 тысяч долларов, в движения эти данные попадают, но по итогу одной записи не хватает. Отладчиком уже вдоль и поперек прошел, не понимаю что нет так  :dfbbdrfb: На 4 поступления должно быть 4 списания + аванс, а получается 3 списания + аванс

LexaK

, аааа, так в аванс надо строчку же добавлять!!!!
вот он последнюю и затирал
   //только если еще остался остаток
    Если КСписанию > 0 Тогда

       ////Строчку надо добавить!!!!!       
        Движение = Движения.Взаиморасчеты.Добавить();

        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Контрагент = Контрагент;
        Движение.Накладная = Неопределено; //Ссылка.Пустая();
        Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
        Движение.Сумма  = КСписанию;
       
    КонецЕсли;     
если помогло нажмите: Спасибо!

Derguncik

LexaK, Емае, сидеть 2 часа из-за одной строчки, благодарю!

Теги:

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

Рейтинг@Mail.ru

Поиск