Вход | Регистрация
 

БП3: Как лучше решить ситуацию с возвратами не день-в-день по ОРП

БП3: Как лучше решить ситуацию с возвратами не день-в-день по ОРП
Я
   Гений 1С
 
23.12.21 - 16:18
Типовым обменом из Розницы в БП3 приходят ОРП.
Там не заполнена на закладке возвраты колонка "Дата реализации".
Возвраты на этой странице - задним числом.
Если не ставить дату реализации, себестоимость не рассчитывается.
Можно конечно, написать обработку по простановке даты реализации в БП3 (по последней продаже).
Но это так себе костыль.
А нормальное решение есть.
В рознице в ОРП дата реализации не фиксируется.
   mikecool
 
1 - 23.12.21 - 16:20
"А нормальное решение есть. " расскажи, не томи
   Гений 1С
 
2 - 23.12.21 - 16:20
(1) это вопрос
   vovastar
 
3 - 23.12.21 - 16:21
(0) пиши костыль, тебе же надо выполнить свой девиз "Даешь 500 костылей в год!"
   Гений 1С
 
4 - 23.12.21 - 16:34
(3) я то что, это всё противная 1с. ;-)
   azernot
 
5 - 23.12.21 - 16:38
Под "нормальным решением" каждый может понимать что-то своё.
Если уж разбираться, то необходимо для начала понять "А для чего же нужна дата продажи для возвратов не день-в-день?"

А нужна она именно для того, чтобы определить какая была себестоимость продажи, чтобы вернуть именно эту себестоимость.

Однако, если например, это возврат продажи, которая находится за рамками данной базы (осуществлена до начала учёта в этой базе), то такая дата всё равно не поможет.
Или если заполнять всегда некоей датой последней продажи, то легко может получиться, что по одному и тому же товару, продаж по себестоимости было на Х, а возвратов на Y, в то время как количество товаров   в продажах и возврате - одинаковое, при этом X<>Y. Приемлемо ли это?

Т.е. сначала нужно определиться с приемлемой учётной методикой определения себестоимости возвращаемых не день-в-день товаров, когда дата продажи - неизвестна, и только после этого приступать к реализации этой методики в 1С.
   Гений 1С
 
6 - 23.12.21 - 16:40
(5) если бы в рознице фиксировалась дата реализации в ТЧ возвраты и эта дата ходила бы по обмену в БП3, это было бы замечательное решение от 1С, а не "нормальное", увы и ах, от 1С ожидать даже нормальных решений не приходится.
   azernot
 
7 - 23.12.21 - 16:41
(6) В рознице в ЧекеККМ есть "ЧекККМПродажа"
   Гений 1С
 
8 - 23.12.21 - 16:45
(7) Есть. Только насколько я понял, ТЧ возвраты не хранит в себе чека возврата.
   Гений 1С
 
9 - 23.12.21 - 16:48
Т.е. чек возврата привязан к чеку ОРП, в чеке возврата есть ссылка на чек продажи.
но в ОРП только возвращенный товар.
это надо идти от товара к чеку возврата, потом к чеку продажи, в общем, делать хитрое разворачивание.
А ведь возвращено может быть 2 товара разными чеками продажи, придется разбивать ОРП на две строки и более...
А потом еще как-то через Enterprise Data протаскивать колонку дата продажи из Розницы в БП.
   azernot
 
10 - 23.12.21 - 17:16
(9) Всё это уже реализовано в правилах обмена (макет у узла "ОбменРозницаБухгалтерияПредприятия30")
   Krendel
 
11 - 23.12.21 - 17:46
Хорошо к клиенту сходил, аж взял 4 задачи
   Гений 1С
 
12 - 23.12.21 - 17:49
(10) что всё это?
   azernot
 
13 - 23.12.21 - 18:00
(12) Обращение к чекам, вытягивание даты продажи, группировка, передача в ТЧ "Возвраты" ОРП.
   Гений 1С
 
14 - 23.12.21 - 18:06
(13) да ладно, ты гонишь, тогда почему эта колонка пустая в БП3?
   Гений 1С
 
15 - 23.12.21 - 18:07
(10) и потом там разве КД2 а не ED?
   azernot
 
16 - 23.12.21 - 18:07
(14) Ты программист или кто?
   ДенисЧ
 
17 - 23.12.21 - 18:10
(16) Это ты геню спрашиваешь? Он же дипломированный вирусолог, а не программист...
   Гений 1С
 
18 - 23.12.21 - 18:14
(16) только ради вас залез в конфигутор розницы.
Да, в правилах обмена ОбменРозницаБухгалтерияПредприятия30 это есть, да только обмен с БП3 не по плану обмена идет, а через ED по плану обмена СинхронизацияДанныхЧерезУниверсальныйФормат.

Так что вы меня дезинформировали.

Хотя этот код есть в обычных планах обмена, но в ED его не протолкнули...
|ВЫБРАТЬ
|    ЧекККМТовары.Номенклатура КАК Номенклатура,
|    ЧекККМТовары.Характеристика КАК Характеристика,
|    СУММА(ЧекККМТовары.Количество) КАК Количество,
|    ЧекККМТовары.Цена КАК Цена,
|    СУММА(ЧекККМТовары.Сумма) КАК Сумма,
|    ЧекККМТовары.СтавкаНДС КАК СтавкаНДС,
|    СУММА(ЧекККМТовары.СуммаНДС) КАК СуммаНДС,
|    ЧекККМ.ДатаПродажи КАК ДатаРеализации,
|    ЧекККМ.НомерЧекаККМ КАК НомерФискальногоЧека,
|    ВЫБОР
|        КОГДА &amp;ПередаватьЦеныХарактеристик
|            ТОГДА ВЫБОР
|                    КОГДА ЧекККМТовары.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|                        ТОГДА ЛОЖЬ
|                    ИНАЧЕ ИСТИНА
|                КОНЕЦ
|        ИНАЧЕ ЛОЖЬ
|    КОНЕЦ КАК ПередатьИсходящиеДанные,
|    ВЫБОР
|        КОГДА СпрНоменклатура.СтранаПроисхождения = ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка)
|            ТОГДА ЗНАЧЕНИЕ(Справочник.СтраныМира.РОССИЯ)
|        ИНАЧЕ СпрНоменклатура.СтранаПроисхождения
|    КОНЕЦ КАК СтранаПроисхождения
|ИЗ
|    Документ.ЧекККМ.Товары КАК ЧекККМТовары
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
|            Док.Ссылка КАК Ссылка,
|            Док.ВидОперации КАК ВидОперации,
|            Док.ДатаПродажи,
|            Док.НомерЧекаККМ
|        ИЗ
|            ТаблицаПромежуточная КАК Док
|        ГДЕ
|            Док.ЭтоВозвратПослеЗакрытияСмены) КАК ЧекККМ
|        ПО ЧекККМТовары.Ссылка = ЧекККМ.Ссылка
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
|        ПО (СпрНоменклатура.Ссылка = ЧекККМТовары.Номенклатура)
|ГДЕ
|    ЧекККМТовары.Ссылка.ОтчетОРозничныхПродажах = &amp;Ссылка
|    И СпрНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
|
|СГРУППИРОВАТЬ ПО
|    ЧекККМТовары.Номенклатура,
|    ЧекККМТовары.Характеристика,
|    ЧекККМТовары.Цена,
|    ЧекККМТовары.СтавкаНДС,
|    ЧекККМ.ДатаПродажи,
|    ЧекККМ.НомерЧекаККМ,
|    ВЫБОР
|        КОГДА СпрНоменклатура.СтранаПроисхождения = ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка)
|            ТОГДА ЗНАЧЕНИЕ(Справочник.СтраныМира.РОССИЯ)
|        ИНАЧЕ СпрНоменклатура.СтранаПроисхождения
|    КОНЕЦ
|;

   Смотрящий
 
19 - 23.12.21 - 18:20
(0) Небольшая правка в РМК розницы решит все эти траблы - генерируй не чек возврата а возврат от покупателя если не день в день
   Гений 1С
 
20 - 23.12.21 - 18:21
(19) ничёси небольшая правка, гггг
   Гений 1С
 
21 - 23.12.21 - 18:22
(19) ты забываешь еще что возврат этот надо пробить по кассе. переобучить кассиров и тп. и это ради вшивой себестоимости. нет.
   vovastar
 
22 - 23.12.21 - 18:25
(21) а как же выставить клиенту чек на 300 часов?
   azernot
 
23 - 23.12.21 - 18:25
(18) >Так что вы меня дезинформировали.
Мы дезинформировали?!
Т.е. ты вместо специального узла ОбменРозницаБухгалтерияПредприятия30, используешь неспециальный СинхронизацияДанныхЧерезУниверсальныйФормат, и чего-то ещё хочешь?
Да иди ты в пень.
   Смотрящий
 
24 - 23.12.21 - 18:27
(21) Ты о (0) спрашивал про нормальное решение. Ну нет так нет. Эбитесь с выгрузками
   Гений 1С
 
25 - 23.12.21 - 18:48
(23) азер, вы когда в последний раз обмены настраивали? имхо, непрофессионализм детектед. Какой в одно место КД2 в современных облачных базах, аллё
   azernot
 
26 - 23.12.21 - 18:49
(25) Я их в типовых вообще ни разу не настраивал.
Но я умею читать код.
   Гений 1С
 
27 - 23.12.21 - 18:50
(26) вот то то оно и заметно. Ну ка, теоретический вопрос - чем обмен по КД3 удобнее обмена по Кд2 чисто в административном ключе?
   azernot
 
28 - 23.12.21 - 18:52
(27) Мне вообще пох.
Я вижу, что типовая розница осуществляет обмен с БП30 в формате EnterpriseData, из узла ОбменРозницаБухгалтерияПредприятия30.
   Гений 1С
 
29 - 23.12.21 - 18:53
(28) садись, два. ED - это КД3, а не КД2. You are fired. Ляпнули вообще неграмотно
   Гений 1С
 
30 - 23.12.21 - 18:55
Хотя если честно, я думал, что КД2 уже не применяется в типовых, гм. Даже удивительно что он еще жив. Во Фреше его точно не применяют по соображениям безопасности. А вот в конфе оказывается еще он остался.
Но у КД2 есть фатальный недостаток - он заточен на конкретную конфу источника и получателя. Поэтому любое несогласованное обновление баз из обмена может остановить обмен.
 
 
   azernot
 
31 - 23.12.21 - 18:57
(29) :)
Всё так, всё верно, я совершенно неграмотен и непрофессионален.
Однако я знаю, как решать проблему сабжа, а ты - нет. Живи с этим.
   Гений 1С
 
32 - 23.12.21 - 18:58
(31) знаем мы таких решателей. Придет, поменяет КД3 на КД2 и принесет клиенту гемора новый вагон. ага
   vovastar
 
33 - 23.12.21 - 19:00
(32) сказал производитель велосипедов и ушел искать очередные квадратные колеса)))
   Гений 1С
 
34 - 26.12.21 - 17:22
(33) почти доделал обработку по простановке даты реализации. Там слишком жесткий контроль в бп3.
Например
Продажа 1 января 18 штук
Продажа 1 февраля 20 штук
Возврат 10 февраля 16 штук дата реализации 1 февраля - проведется
Возврат 12 февраля 15 штук дата реализации 1 февраля - не проведется, учтется и возврат от 10 февраля, т.е. не хватит 11 штук.
Придется все же точно рассчитывать дату реализации, хотя у клиента и мало возвратов, но такое не исключено.

Кстати, если 10 февраля возвращается условно 30 штук, то нужно расписать в ОРП в две строки:
Возврат 10 февраля 20 штук дата реализации 1 февраля
Возврат 10 февраля 10 штук дата реализации 1 января


А наш пример надо расписать так:
Возврат 10 февраля 16 штук дата реализации 1 февраля 
Возврат 12 февраля 4  штук дата реализации 1 февраля 
Возврат 12 февраля 11 штук дата реализации 1 января
   vovastar
 
35 - 26.12.21 - 17:28
(34) это точно не квадрат. Такой геометрической фигуры еще не известно человечеству.
   Ненавижу 1С
 
36 - 26.12.21 - 17:29
(34) ну и с помощью какого механизма производится контроль количества возврата?
   Гений 1С
 
37 - 26.12.21 - 17:49
(36) не анализировал
   Ненавижу 1С
 
38 - 26.12.21 - 17:52
(37) это пять я считаю - ты как задачу то решаешь тогда?
   vovastar
 
39 - 26.12.21 - 17:53
(38) когда производители костылей о чем то думали? Ты такой странный..
   Гений 1С
 
40 - 26.12.21 - 18:54
(38) как решаю? Очень просто. Подбираю подходящие для данного возврата ОРП. Запросами в цикле, но там скорость не критична. Еще вопросы?

Контроль со стороны 1С происходит тут, модуль УчетТоваров:
Функция ПодготовитьТаблицуВозвращенныеСписанныеТовары(ТаблицаТовары, ТаблицаСчетаУчетаТоваров, ТаблицаСписокНоменклатуры, ТаблицаРеквизиты, Отказ) Экспорт

    Если Не ЗначениеЗаполнено(ТаблицаТовары)
     Или Не ЗначениеЗаполнено(ТаблицаРеквизиты) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    ТаблицаРезультата = ПолучитьПустуюТаблицуСписанныеТовары();
    
    Реквизиты = ТаблицаРеквизиты[0];
    
    Если Не Реквизиты.УказанДокументОтгрузки
     Или Не ЗначениеЗаполнено(ТаблицаСчетаУчетаТоваров) Тогда
        ОбщегоНазначенияБПВызовСервера.ЗагрузитьВТаблицуЗначений(ТаблицаТовары, ТаблицаРезультата);
        Возврат ТаблицаРезультата;
    КонецЕсли;
    
    СтруктураСчетовДляЗапроса = РазделитьСчетаУчетаПоПартионномуУчету(ТаблицаСчетаУчетаТоваров);
    ЕстьСчетаПартионные   = СтруктураСчетовДляЗапроса.СчетаПартионные.Количество() <> 0;
    ЕстьСчетаНеПартионные = СтруктураСчетовДляЗапроса.СчетаНеПартионные.Количество() <> 0;
    Если Не ЕстьСчетаПартионные И Не ЕстьСчетаНеПартионные Тогда
        ОбщегоНазначенияБПВызовСервера.ЗагрузитьВТаблицуЗначений(ТаблицаТовары, ТаблицаРезультата);
        Возврат ТаблицаРезультата;
    КонецЕсли;
    
    Параметры = ПодготовитьПараметрыТаблицыВозвращенныеСписанныеТовары(ТаблицаТовары, ТаблицаСчетаУчетаТоваров, ТаблицаСписокНоменклатуры, ТаблицаРеквизиты);
    Реквизиты = Параметры.Реквизиты[0];
    
    ДатаДокументаРеализации = Реквизиты.ДатаДокументаРеализации;
    
    Если НачалоДня(Реквизиты.Период) < НачалоДня(ДатаДокументаРеализации) Тогда
        
            ТекстСообщения = НСтр("ru = 'Возврат по документу ""%1"" не может быть раньше %2 г.'");
            ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                ТекстСообщения,
                СокрЛП(Реквизиты.Сделка),
                Формат(ДатаДокументаРеализации, "ДФ=дд.MM.yyyy"));
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                ТекстСообщения,
                Реквизиты.Регистратор,
                "Дата",
                "Объект",
                Отказ);
        
        ОбщегоНазначенияБПВызовСервера.ЗагрузитьВТаблицуЗначений(ТаблицаТовары, ТаблицаРезультата);
        Возврат ТаблицаРезультата;
        
    Иначе
        
        ВозвратПрошлогоМесяца = НачалоМесяца(Реквизиты.Период) <> НачалоМесяца(ДатаДокументаРеализации);
    
    КонецЕсли; 
    

    ВедетсяСуммовойУчетПоСкладам = БухгалтерскийУчет.ВедетсяСуммовойУчетПоСкладам(ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
    
    МетаданныеСделки = Реквизиты.Сделка.Метаданные();
    ЕстьСкладОтгрузки = ОбщегоНазначения.ЕстьРеквизитОбъекта("Склад", МетаданныеСделки);
    ЕстьПодразделениеОтгрузки = БухгалтерскийУчетПереопределяемый.ВестиУчетПоПодразделениям()
        И ОбщегоНазначения.ЕстьРеквизитОбъекта("ПодразделениеОрганизации", МетаданныеСделки);
    
    РеквизитыСделки = Новый Структура();
    Если ЕстьСкладОтгрузки Тогда
        РеквизитыСделки.Вставить("Склад");
    КонецЕсли;
    Если ЕстьПодразделениеОтгрузки Тогда
        РеквизитыСделки.Вставить("ПодразделениеОрганизации");
    КонецЕсли;

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

    |    СУММА(ВТ_СписанныеТовары.СуммаНУ) КАК СуммаНУ,// Остаток (сумма) по данным НУ для расчета с/стоимости возврата  в разрезе номенклатура/партия

    |    СУММА(ВТ_СписанныеТовары.СуммаПР) КАК СуммаПР,
    |    СУММА(ВТ_СписанныеТовары.СуммаВР) КАК СуммаВР,
    |    СУММА(ВТ_СписанныеТовары.Количество) КАК Количество,  // Остаток (количество) по данным БУ для расчета с/стоимости возврата  в разрезе номенклатура/партия

    |    СУММА(ВТ_СписанныеТовары.КоличествоОтгружено) КАК КоличествоОтгружено// Остаток (количество) который можно вернуть по конкретной реализации

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

    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Организация",        Реквизиты.Организация);
    Запрос.УстановитьПараметр("Регистратор",        Реквизиты.Сделка);
    Запрос.УстановитьПараметр("СчетКтПартионный",   СтруктураСчетовДляЗапроса.СчетаПартионные);
    Запрос.УстановитьПараметр("СчетКтНеПартионный", СтруктураСчетовДляЗапроса.СчетаНеПартионные);
    Запрос.УстановитьПараметр("НачТекущегоМесяца",  НачалоМесяца(Реквизиты.Период));
    Запрос.УстановитьПараметр("КонДата",            Реквизиты.Период);
    Запрос.УстановитьПараметр("НачМесяцаРеализации",НачалоМесяца(ДатаДокументаРеализации));    
    Запрос.УстановитьПараметр("КонМесяцаРеализации",КонецМесяца(ДатаДокументаРеализации));
    Запрос.УстановитьПараметр("Товары",             Параметры.СписокНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
    Запрос.УстановитьПараметр("СкладОтгрузки",      СкладОтгрузки);
    Запрос.УстановитьПараметр("ПодразделениеОтгрузки",ПодразделениеОтгрузки);

    // Виды субконто при отсутствии партионного учета.

    ВидыСубконтоБезПартий = Новый Массив;
    ВидыСубконтоБезПартий.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
    Если ИспользоватьОтборПоСкладуОтгрузки Тогда
        ВидыСубконтоБезПартий.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);
    КонецЕсли;
    Запрос.УстановитьПараметр("ВидыСубконтоБезПартий", ВидыСубконтоБезПартий);

    // Виды субконто при количественном учете по складам.

    ВидыСубконтоБезПартийСклады = Новый Массив;
    ВидыСубконтоБезПартийСклады.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
    ВидыСубконтоБезПартийСклады.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);
    Запрос.УстановитьПараметр("ВидыСубконтоБезПартийСклады", ВидыСубконтоБезПартий);

    // Виды субконто с учетом партий.

    ВидыСубконтоПартий = Новый Массив;
    ВидыСубконтоПартий.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
    ВидыСубконтоПартий.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Партии);
    Если ИспользоватьОтборПоСкладуОтгрузки Тогда
        ВидыСубконтоПартий.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);
    КонецЕсли;
    Запрос.УстановитьПараметр("ВидыСубконтоПартий", ВидыСубконтоПартий);

    // Всегда 3 вида субконто.

    ВидыСубконтоПартийСклады = Новый Массив;
    ВидыСубконтоПартийСклады.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
    ВидыСубконтоПартийСклады.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Партии);
    ВидыСубконтоПартийСклады.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);
    Запрос.УстановитьПараметр("ВидыСубконтоПартийСклады", ВидыСубконтоПартийСклады);
    
    Запрос.УстановитьПараметр("ЭтотВозврат", Реквизиты.Регистратор);

    ТаблицаОтгрузок = Запрос.Выполнить().Выгрузить();

    Для каждого СтрокаВозврата Из Параметры.ТаблицаТовары Цикл

        КоличествоНеПодобраноПартии = СтрокаВозврата.Количество;

        ОтгруженныеПартии = ТаблицаОтгрузок.НайтиСтроки(Новый Структура("Номенклатура, СчетУчета", СтрокаВозврата.Номенклатура, СтрокаВозврата.СчетУчета));
        Для каждого СтрокаОтгрузки Из ОтгруженныеПартии Цикл
            
            // Весь товар по партии реализованный в исходном документе - возвращен

            Если СтрокаОтгрузки.КоличествоОтгружено = 0 Тогда
                Продолжить;
            КонецЕсли; 
            
            НоваяСтрока = ТаблицаРезультата.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаВозврата);
            НоваяСтрока.Партия = СтрокаОтгрузки.Партия;
            НоваяСтрока.Сделка = Реквизиты.Сделка;
            
            КоличествоВозвращено = Мин(КоличествоНеПодобраноПартии, СтрокаОтгрузки.КоличествоОтгружено);

            Если КоличествоВозвращено >= СтрокаОтгрузки.Количество Тогда
                // Текущий возврат больше или равен остатку по партии (с учетом отгрузки и предыдущих возвратов), 

                // что привело к полному возврату всей партии.

                
                НоваяСтрока.Количество         = СтрокаОтгрузки.Количество;
                НоваяСтрока.СуммаСписания      = СтрокаОтгрузки.Сумма;
                НоваяСтрока.СуммаСписанияНУ    = СтрокаОтгрузки.СуммаНУ;
                НоваяСтрока.СуммаСписанияПР    = СтрокаОтгрузки.СуммаПР;
                НоваяСтрока.СуммаСписанияВР    = СтрокаОтгрузки.СуммаВР;
                НоваяСтрока.СуммаКорСписанияНУ = СтрокаОтгрузки.СуммаНУ;
                НоваяСтрока.СуммаКорСписанияПР = СтрокаОтгрузки.СуммаПР;
                НоваяСтрока.СуммаКорСписанияВР = СтрокаОтгрузки.СуммаВР;
            Иначе
                // Частичный возврат партии.

                НоваяСтрока.Количество         = КоличествоВозвращено;
                Коэфф                          = КоличествоВозвращено / СтрокаОтгрузки.Количество;
                НоваяСтрока.СуммаСписания      = Окр(СтрокаОтгрузки.Сумма   * Коэфф, 2);
                НоваяСтрока.СуммаСписанияНУ    = Окр(СтрокаОтгрузки.СуммаНУ * Коэфф, 2);
                НоваяСтрока.СуммаСписанияПР    = Окр(СтрокаОтгрузки.СуммаПР * Коэфф, 2);
                НоваяСтрока.СуммаСписанияВР    = Окр(СтрокаОтгрузки.СуммаВР * Коэфф, 2);
                НоваяСтрока.СуммаКорСписанияНУ = НоваяСтрока.СуммаСписанияНУ;
                НоваяСтрока.СуммаКорСписанияПР = НоваяСтрока.СуммаСписанияПР;
                НоваяСтрока.СуммаКорСписанияВР = НоваяСтрока.СуммаСписанияВР;
            КонецЕсли;
            
            Если ВозвратПрошлогоМесяца Тогда
                НоваяСтрока.Себестоимость = НоваяСтрока.СуммаСписания;
            КонецЕсли;

            КоличествоНеПодобраноПартии = КоличествоНеПодобраноПартии - НоваяСтрока.Количество;
            
            СтрокаОтгрузки.Количество             = СтрокаОтгрузки.Количество - НоваяСтрока.Количество;
            СтрокаОтгрузки.КоличествоОтгружено     = СтрокаОтгрузки.КоличествоОтгружено - НоваяСтрока.Количество;
            СтрокаОтгрузки.Сумма                 = СтрокаОтгрузки.Сумма - НоваяСтрока.СуммаСписания;
            СтрокаОтгрузки.СуммаНУ                 = СтрокаОтгрузки.СуммаНУ - НоваяСтрока.СуммаСписанияНУ;
            СтрокаОтгрузки.СуммаПР                 = СтрокаОтгрузки.СуммаПР - НоваяСтрока.СуммаСписанияПР;
            СтрокаОтгрузки.СуммаВР                 = СтрокаОтгрузки.СуммаВР - НоваяСтрока.СуммаСписанияВР;
            
            Если КоличествоНеПодобраноПартии = 0 Тогда
                Прервать;
            КонецЕсли;

        КонецЦикла;

        // Если в документе указан документ реализации по которому было отгружено больше,

        // чем возвращается, то эту разницу отнесем на пустую партию.

        Если КоличествоНеПодобраноПартии > 0 Тогда
            ТекстСообщения = НСтр("ru = 'Документом ""%1"" было реализовано ""%2"" на ""%3"" ед. меньше, чем возвращается.'");
            ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                ТекстСообщения,
                СокрЛП(Реквизиты.Сделка),
                СтрокаВозврата.Номенклатура,
                КоличествоНеПодобраноПартии);
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                ТекстСообщения,
                Реквизиты.Регистратор,
                СтрокаВозврата.ИмяСписка+"[" + Формат(СтрокаВозврата.НомерСтроки - 1, "ЧН=0; ЧГ=")+"].Количество",
                "Объект",
                Отказ);
        КонецЕсли;

    КонецЦикла;

    Возврат ТаблицаРезультата;

КонецФункции


   Ненавижу 1С
 
41 - 26.12.21 - 19:04
(40) 1с контролирует возможность количества возвратов по датам? И ты изобретаешь параллельный велосипед. А зачем? К тому же какая гарантия, что твой эмпирический метод не будет противоречить контролю со стороны 1с?
   Гений 1С
 
42 - 26.12.21 - 19:25
(41) гарантия очень простая - продаж больше чем возвратов и я смогу распределить даты реализации по этим продажам.
   Ненавижу 1С
 
43 - 26.12.21 - 20:09
(42) ты сам себе противоречишь: "Придется все же точно рассчитывать дату реализации, хотя у клиента и мало возвратов, но такое не исключено."
   Гений 1С
 
44 - 27.12.21 - 13:03
Гм, странное дело, столкнулся с тем, что на некоторых позициях при установке даты не проводится, хотя реализация есть и нигде не задействована, возможно надо предварительно закрыть месяц.
   Гений 1С
 
45 - 27.12.21 - 13:03
возможно, поможет предварительное закрытие месяца (восстановятся партии товаров по 41-счету)
   Гений 1С
 
46 - 17.01.22 - 13:06
Гм, разобрался. Причина была банальна, кроется в этих строчках:

ИспользоватьОтборПоСкладуОтгрузки = ВедетсяСуммовойУчетПоСкладам И ЕстьСкладОтгрузки

Конкретно склад в ОРП вовзрата должен соответствовать складу в ОРП продажи, поэтому и не билось.

Поправлю обработку, добавлю отчет по складу, вышлю отчет клиенту.

Правда, как быть клиентно-ориентированным компаниям, которые делают возвраты с других складов, 1С "как обычно" не озаботилась. Проблемы бизнеса бухгалтерию не волнуют, ОГА.


Список тем форума
 
Здесь можно задать вопрос "Как сделать?" и получить кучу ответов, что тебе это делать не надо. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.