Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Оприходование товара на основании документа Возврат от покупателей

Оприходование товара на основании документа Возврат от покупателей
Я
   Bon Jovi
 
11.06.20 - 15:36
Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Подскажите пожалуйста в следующем. Мне нужно создать обработку, с помощью которой я смогу создавать документы оприходования товара на основе не проведённого документа возврат от покупателей. То есть получать позиции и количество из документа возврат от покупателей плюс нужно рассчитать себе стоимость. То есть есть реализация проведённая, есть её не проведённый возврат. Нужно вместо возврат создать документ оприходования. Товар из регистра партии товаров на складах списывается через реализацию по принципу FIFO. Документ возврат от покупателей возвращает товар немного иначе, последний товар который был списан из реализации будет первым в возврате (ну и остальные партии по такому же принципу). То есть оприходование должно записывать партии в такой же очерёдности как документ возврат от покупателей. Подскажите, как реализовать.
Небольшие наработки:

ВЫБРАТЬ
    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    ВозвратТоваровОтПокупателяТовары.ДокументПартии КАК Реализация
ПОМЕСТИТЬ ЗапросПоВозврату
ИЗ
    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
ГДЕ
    ВозвратТоваровОтПокупателяТовары.Ссылка = &ДокументВозврата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗапросПоВозврату.Номенклатура КАК Номенклатура,
    ПартииТоваровНаСкладах.Количество КАК Количество,
    ПартииТоваровНаСкладах.Стоимость КАК Стоимость,
    ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования
ИЗ
    ЗапросПоВозврату КАК ЗапросПоВозврату
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
        ПО ЗапросПоВозврату.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
            И ЗапросПоВозврату.Реализация = ПартииТоваровНаСкладах.Регистратор

УПОРЯДОЧИТЬ ПО
    ДокументОприходования

Тестовый пример результата запроса:
https://ibb.co/Kwmrg71
   Злопчинский
 
1 - 11.06.20 - 16:19
провети возврат. получаем нужные партии и все данные.
скопировтаь ТЧ из возрата в Оприходование
распровести возврат.
   Злопчинский
 
2 - 11.06.20 - 16:20
но концепция пагубная. ибо по постановке вопроса видно, что вы "труситесь" над себестоимостью возвратов.
а впри той схеме что вы описали, у вас будетреализация. потом оприходованием (типа "первый возврат") - зато следующий возврат нихрена не знает про предыдущий возврат. и вся схема идет в п..у. Хотя несколько возвартов по однйо отгрузке редко, но концепция - кривая...
   Bon Jovi
 
3 - 11.06.20 - 16:24
(1) к сожалению, не подходит способ
   Bon Jovi
 
4 - 12.06.20 - 16:08
Нужно как сделать грамотный отбор после запроса,в котором будут сравниваться строки одной таблицы (возвраты) и другой (партий). Ну и одновременно высчитывать нужное количество из таблицы партий в таблицу возвратов.
Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    |    ВозвратТоваровОтПокупателяТовары.Количество КАК Количество,
    |    ВозвратТоваровОтПокупателяТовары.ДокументПартии КАК Реализация,
    |    ВозвратТоваровОтПокупателяТовары.Склад КАК Склад,
    |    ВозвратТоваровОтПокупателяТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения
    |ПОМЕСТИТЬ ЗапросПоВозврату
    |ИЗ
    |    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
    |ГДЕ
    |    ВозвратТоваровОтПокупателяТовары.Ссылка = &ДокументВозврата
    |;
    |
    ////////////////////////////////////////////////////////////­////////////////////

    |ВЫБРАТЬ
    |    ЗапросПоВозврату.Номенклатура КАК Номенклатура,
    |    ЗапросПоВозврату.Количество КАК КоличествоНоменклатурыВозврата,
    |    ПартииТоваровНаСкладах.Количество КАК Количество,
    |    ЗапросПоВозврату.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |    ПартииТоваровНаСкладах.Стоимость КАК Стоимость,
    |    ЗапросПоВозврату.Склад КАК Склад
    |ИЗ
    |    ЗапросПоВозврату КАК ЗапросПоВозврату
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |        ПО ЗапросПоВозврату.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
    |            И ЗапросПоВозврату.Реализация = ПартииТоваровНаСкладах.Регистратор
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура,
    |    ПартииТоваровНаСкладах.ДокументОприходования УБЫВ
    |АВТОУПОРЯДОЧИВАНИЕ";
    
    Запрос.УстановитьПараметр("ДокументВозврата", ДокументВозврата);
    Выборка = Запрос.Выполнить().Выбрать(); 
    
    ТЗНоменклатурыВозврата    = ДокументВозврата.Товары.Выгрузить();
        
    Отбор = Новый Структура();
    Отбор.Вставить("Номенклатура", Выборка.Номенклатура);
    Строка = ТЗНоменклатурыВозврата.НайтиСтроки(Отбор);
   mistеr
 
5 - 12.06.20 - 18:48
(1) Не из ТЧ нужно копировать, а из движений.
   Bon Jovi
 
6 - 17.06.20 - 10:03
(5) моё решение:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    |    ВозвратТоваровОтПокупателяТовары.ДокументПартии КАК Реализация,
    |    ВозвратТоваровОтПокупателяТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения
    |ПОМЕСТИТЬ ЗапросПоВозврату
    |ИЗ
    |    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
    |ГДЕ
    |    ВозвратТоваровОтПокупателяТовары.Ссылка = &ДокументВозврата
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ЗапросПоВозврату.Номенклатура КАК Номенклатура,
    |    ПартииТоваровНаСкладах.Количество КАК Количество,
    |    ЗапросПоВозврату.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |    ПартииТоваровНаСкладах.Стоимость КАК Стоимость,
    |    ПартииТоваровНаСкладах.Склад КАК Склад
    |ИЗ
    |    ЗапросПоВозврату КАК ЗапросПоВозврату
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |        ПО ЗапросПоВозврату.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
    |            И ЗапросПоВозврату.Реализация = ПартииТоваровНаСкладах.Регистратор
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура,
    |    ПартииТоваровНаСкладах.ДокументОприходования УБЫВ
    |АВТОУПОРЯДОЧИВАНИЕ";
    
    Запрос.УстановитьПараметр("ДокументВозврата", ДокументВозврата);
    
    ВыборкаВыгрузка = Запрос.Выполнить().Выгрузить();          
    
    НовыйДокумент = Документы.ОприходованиеТоваров.СоздатьДокумент();
    
    Для каждого СтрокаДокументаВозврата Из ДокументВозврата.Товары Цикл
        
        Массив = ВыборкаВыгрузка.НайтиСтроки(Новый Структура("Номенклатура", СтрокаДокументаВозврата.Номенклатура));
        НеобходимоеКоличество = СтрокаДокументаВозврата.Количество; 
        
        Для каждого СтрокаМассива Из Массив Цикл
            
            ТабличнаяЧасть = НовыйДокумент.Товары.Добавить();
            ТабличнаяЧасть.Номенклатура             = СтрокаМассива.Номенклатура;
            ТабличнаяЧасть.ЕдиницаИзмерения    = СтрокаМассива.ЕдиницаИзмерения;
            ТабличнаяЧасть.Коэффициент            = 1;                              
            
            Если НеобходимоеКоличество > СтрокаМассива.Количество Тогда
                НеобходимоеКоличество = НеобходимоеКоличество - СтрокаМассива.Количество;
                ТабличнаяЧасть.Количество         = СтрокаМассива.Количество;
                ТабличнаяЧасть.Цена                     = СтрокаМассива.Стоимость / СтрокаМассива.Количество;
                ТабличнаяЧасть.Сумма                 = СтрокаМассива.Стоимость;
            Иначе                  
                ТабличнаяЧасть.Количество         = НеобходимоеКоличество;
                ТабличнаяЧасть.Цена                     = СтрокаМассива.Стоимость / СтрокаМассива.Количество;
                ТабличнаяЧасть.Сумма                = ТабличнаяЧасть.Количество * ТабличнаяЧасть.Цена;
                НеобходимоеКоличество = 0;
                Прервать;
            КонецЕсли;
            
        КонецЦикла;        
        
    КонецЦикла;
    
    НовыйДокумент.Товары.Свернуть("Номенклатура, ЕдиницаИзмерения, Коэффициент, Цена, Сумма, Качество", "Количество");    
    НовыйДокумент.Дата                                            = ТекущаяДата();
    НовыйДокумент.Склад                                            = СтрокаДокументаВозврата.Склад;
    НовыйДокумент.ОтражатьВУправленческомУчете     = Истина;
    НовыйДокумент.Организация                                 = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ОсновнаяОрганизация");    
    НовыйДокумент.Записать();
    
КонецПроцедуры
   Джинн
 
7 - 17.06.20 - 10:07
Вы решили в доход это захреначить и налог на прибыль заплатить? Гениальный ход. И одноэснику есть чем заняться.
   eTmy
 
8 - 17.06.20 - 10:10
А если будет две нуменклатуры двумя строчками?) Не пугает связка вас?
   eTmy
 
9 - 17.06.20 - 10:10
(8) Одинаковые*

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