Версия для печати темы (https://pro1c.org.ua/index.php?s=391863f86ec5e5a07185ed05d4678ff6&showtopic=33611)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Пересчет необходимого колва и суммы ТМЦ в РН (создаю программно!))

Автор: inna.innainna84 01.12.16, 2:41

Добрый вечер. Очень давно хотела обработку по Формированию РН из ТЗОстатков. Как смогла так и настряпала. Прошу не ругать меня.
1.Сначала я выбрала в ТЗКлиенты данные по контрагентам по 361 счету с отрицательным долгом
2.Набрала ВыбДок (это излишки по остаткам ТМЦ между Бух.базой и Складом и загрузила их в Расходную накладную по продажной цене)
3.Выгрузила эти излишки в ТЗОстатки
4.СоздатьОбъект("Документ.РасходнаяНакладная") и загружаю в ТЗОстатки
5. Необходимо их обработать
а)Если докРН.СуммаДокНал>докРН.Итог("СуммаСНДС") Тогда
Сообщить ("Нехватает товара!!!");
прерываю!!!!!!!
б) Если докРН.СуммаДокНал>докРН.Итог("СуммаСНДС") Тогда
и начинается самое ТРУДНОЕ 09000000.gif как расчитать ТекКво= если ТМЦ.БазЕдиница "шт". то ОКР, если "кг" оставляем как есть ("помогите расчитать нужное колво!!!!");
Я понимаю, что нужно пробежаться по строках в документе и убрать лишнее кво и вернуть его в ТЗОстатки для создания следующей РН !!!!!! 09000000.gif help.gif help.gif
Если не трудно подскажите

Процедура СоздатьДокРН()
  //=========================не трогать====================================================================        
                           //---1---//
//==========создаем расходныйе накладный по выбраным контрагентам==========  
                                         
        ТЗКлиенты.ВыбратьСтроки();
        Пока ТЗКлиенты.ПолучитьСтроку()=1 Цикл//1  начало
        докРН = СоздатьОбъект("Документ.РасходнаяНакладная");
        докРН.Новый();
        докРН.Фирма =          глВосстановитьЗначение(,"БазФирма");
        докРН.Валюта =         Константа.ОсновнаяВалюта;  
        докРН.Курс =           докРН.Валюта.Курс.Получить(докРН.ДатаДок);        
        докРН.ВидНДС =         докРН.Фирма.СтавкаНДС;
        докРН.ДатаДок =        ТекущаяДата();         
        докРН.Контрагент =        ТЗКлиенты.Контрагент;
        докРН.СуммаДокНал=     ТЗКлиенты.Долг;
        докРН.ВидТорговли =    докРН.Контрагент.ВидТорговли;    
        докРН.СчетКонтрагента =СчетПоКоду("361");
        докРН.МестоХранения =  ВыбСклад;    
//=========================не трогать====================================================================        
                     //----2----//
//==========создаем список ТМЦ в расходных накладных по выбраным контрагентам====  
        ТЗОстатки.ВыбратьСтроки();
        Пока ТЗОстатки.ПолучитьСтроку()=1 Цикл //2 начало
        докРН.НоваяСтрока();
        докРН.ТМЦ =         ТЗОстатки.ТМЦ;      
        докРН.Ед =          ТЗОстатки.Ед;
        докРН.Коэффициент = ТЗОстатки.Коэффициент;
        докРН.Кво =         ТЗОстатки.СписатьКво;        
        докРН.ЦенаСНДС =    ТЗОстатки.ЦенаСНДС;         
        докРН.СуммаСНДС =   докРН.Кво* докРН.ЦенаСНДС;
//=========================не трогать====================================================================
                      //----3----//
         Если докРН.СуммаДокНал>докРН.Итог("СуммаСНДС") Тогда
          Сообщить ("Нехватает товара!!!");  
          возврат;      
         КонецЕсли;  
//=========================не трогать====================================================================                    
        
        
        

                      //----4----//
//    как расчитать сколько нужно списать колва в РН !!!!!!!!!!!  
        Если докРН.СуммаДокНал>докРН.Итог("СуммаСНДС") Тогда  
    
        докРН.ВыбратьСтроки();
        Пока докРН.ПолучитьСтроку()=1 Цикл //3
    
        ИзлишекСуммы=докРН.СуммаДокНал-докРН.Итог("СуммаСНДС");    
        сообщить("излишек"+    ИзлишекСуммы);
        // не обходимо пробежаться по строках в документе и убрать лишее!!!!!!    
              текКолСтрокРН = ТЗОстатки.КоличествоСтрок();
        Для ы = 1 По текКолСтрокРН Цикл      
           
            ТекКво= если ТМЦ.БазЕдиница "шт". то ОКР, если "кг" оставляем как есть ("помогите расчитать нужное колво!!!!");     
        докРН.Кво =         ТекКво;        
        докРН.ЦенаСНДС =    ТЗОстатки.ЦенаСНДС;         
        докРН.СуммаСНДС =   докРН.Кво* докРН.ЦенаСНДС;
        
       КонецЦикла;        
       КонецЦикла;
       КонецЕсли;

                //----5----//
// возращаяю в таблицу ТЗОстатки-лишее кол-во товара из РН                
                
           докРН.ВыбратьСтроки();
            Пока докРН.ПолучитьСтроку()=1 Цикл //3                 
        
            ТЗОстатки.НоваяСтрока();          
        ТЗОстатки.СписатьКво=ТЗОстатки.СписатьКво-докРН.Кво;
        ТЗОстатки.СписатьЦенаСНДС= ТЗОстатки.ЦенаСНДС;
        ТЗОстатки.СписатьСумма= ТЗОстатки.СписатьКво*ТЗОстатки.СписатьЦенаСНДС;
        КонецЦикла;
        
                        
    
    
    
//=========================не трогать====================================================================    
        
        КонецЦикла;//2 конец     
        Сообщить(докРН.Контрагент);
        Сообщить("Итого"+докРН.Итог("СуммаСНДС"));           
    
    
    //=========================не трогать====================================================================        
        докРН.Записать();
        Сообщить(докРН.ТекущийДокумент()+"Создан!");
        Если флПроводить=1  Тогда
        докРН.Провести();
        Сообщить(докРН.ТекущийДокумент()+"Проведен!");                  
        КонецЕсли;  
    //====================================================================================================        
        КонецЦикла; //1 конец        
    КонецПроцедуры  
    
    //=====================================================================
    Процедура Удалить()
        Если ТЗОстатки.СписатьКво<=0 Тогда
            ТЗОстатки.УдалитьСтроку(ТЗОстатки.НомерСтроки);
        КонецЕсли;
    КонецПроцедуры



//=========================не трогать==================================================================== Это я пишу для себя пометки, люблю сначала все поломать,а потом 3 часа вспоминать.

Автор: inna.innainna84 01.12.16, 10:14

Процедура СоздатьДокРН()
  //=========================не трогать====================================================================        
                           //---1---//
//==========создаем расходныйе накладный по выбраным контрагентам==========  
                                         
        ТЗКлиенты.ВыбратьСтроки();
        Пока ТЗКлиенты.ПолучитьСтроку()=1 Цикл//1  начало
        докРН = СоздатьОбъект("Документ.РасходнаяНакладная");
        докРН.Новый();
        докРН.Фирма =          глВосстановитьЗначение(,"БазФирма");
        докРН.Валюта =         Константа.ОсновнаяВалюта;  
        докРН.Курс =           докРН.Валюта.Курс.Получить(докРН.ДатаДок);        
        докРН.ВидНДС =         докРН.Фирма.СтавкаНДС;
        докРН.ДатаДок =        ТекущаяДата();         
        докРН.Контрагент =        ТЗКлиенты.Контрагент;
        докРН.СуммаДокНал=     ТЗКлиенты.Долг;
        докРН.ВидТорговли =    докРН.Контрагент.ВидТорговли;    
        докРН.СчетКонтрагента =СчетПоКоду("361");
        докРН.МестоХранения =  ВыбСклад;    
//=========================не трогать====================================================================        
                     //----2----//
//==========создаем список ТМЦ в расходных накладных по выбраным контрагентам====  
        ТЗОстатки.ВыбратьСтроки();
        Пока ТЗОстатки.ПолучитьСтроку()=1 Цикл //2 начало
        докРН.НоваяСтрока();
        докРН.ТМЦ =         ТЗОстатки.ТМЦ;      
        докРН.Ед =          ТЗОстатки.Ед;
        докРН.Коэффициент = ТЗОстатки.Коэффициент;
        докРН.Кво =         ТЗОстатки.СписатьКво;        
        докРН.ЦенаСНДС =    ТЗОстатки.ЦенаСНДС;         
        докРН.СуммаСНДС =   докРН.Кво* докРН.ЦенаСНДС;
//=========================не трогать====================================================================
                      //----3----//
         Если докРН.СуммаДокНал>ТЗОстатки.Итог("СписатьКво") Тогда
          Сообщить (ТЗОстатки.Итог("СписатьКво"));    
          Сообщить ("Нехватает товара!!!");  
          возврат;      
         КонецЕсли;  
//=========================не трогать====================================================================                    
        
        
        

                      //----4----//
//    как расчитать сколько нужно списать колва в РН !!!!!!!!!!!  
        Если докРН.СуммаДокНал<докРН.Итог("СуммаСНДС") Тогда  
    
        докРН.ВыбратьСтроки();
        Пока докРН.ПолучитьСтроку()=1 Цикл //3
    
        ИзлишекСуммы=докРН.СуммаДокНал-докРН.Итог("СуммаСНДС");    
        сообщить("излишек"+    ИзлишекСуммы);
        // не обходимо пробежаться по строках в документе и убрать лишее!!!!!!    
        текКолСтрокРН = ТЗОстатки.КоличествоСтрок();
        Для ы = 1 По текКолСтрокРН Цикл      
           
        ТекКво= ОКР("помогите расчитать нужное колво!!!!");
        докРН.Кво =         ТекКво;        
        докРН.ЦенаСНДС =    ТЗОстатки.ЦенаСНДС;         
        докРН.СуммаСНДС =   докРН.Кво* докРН.ЦенаСНДС;
        
       КонецЦикла;        
       КонецЦикла;
       КонецЕсли;

                //----5----//
// возращаяю в таблицу ТЗОстатки-лишее кол-во товара из РН                
                
        докРН.ВыбратьСтроки();
        Пока докРН.ПолучитьСтроку()=1 Цикл //3                 
        
        ТЗОстатки.НоваяСтрока();          
        ТЗОстатки.СписатьКво=ТЗОстатки.СписатьКво-докРН.Кво;
        ТЗОстатки.СписатьЦенаСНДС= ТЗОстатки.ЦенаСНДС;
        ТЗОстатки.СписатьСумма= ТЗОстатки.СписатьКво*ТЗОстатки.СписатьЦенаСНДС;
        КонецЦикла;
        
                        
    
    
    
//=========================не трогать====================================================================    
        
        КонецЦикла;//2 конец     
        Сообщить(докРН.Контрагент);
        Сообщить("Итого"+докРН.Итог("СуммаСНДС"));           
    
    
    //=========================не трогать====================================================================        
        докРН.Записать();
        Сообщить(докРН.ТекущийДокумент()+"Создан!");
        Если флПроводить=1  Тогда
        докРН.Провести();
        Сообщить(докРН.ТекущийДокумент()+"Проведен!");                  
        КонецЕсли;  
    //====================================================================================================        
        КонецЦикла; //1 конец        
    КонецПроцедуры  
    
    //=====================================================================
    Процедура Удалить()
        Если ТЗОстатки.СписатьКво<=0 Тогда
            ТЗОстатки.УдалитьСтроку(ТЗОстатки.НомерСтроки);
        КонецЕсли;
    КонецПроцедуры


Немного изменила.

Автор: Acid 01.12.16, 10:48

Количество рассчитывается так :

Количество = Док.Количество * Док.Коэффициент


Автор: inna.innainna84 01.12.16, 11:05

После того как я загрузила из ТЗОстатков в РН мне необходимо пробежаться по строках в документе снизу в вверх и убрать лишние суммы и расчитать ТекКво= если ТМЦ.БазЕдиница "шт". то ОКР, если "кг" оставляем как есть ("помогите расчитать нужное колво!!!!"); чтобы расзницу по кво вернуть обратно в ТЗОстатки.
Acid @ Сегодня, 10:48 * ,

Автор: XBrut 01.12.16, 19:48

inna.innainna84 @ Сегодня, 11:05 * ,
Там же написано "не трогать" , а вы трогаете.

Автор: inna.innainna84 01.12.16, 20:22

не трогать писала я. Это мой код.XBrut @ Сегодня, 19:48 * ,

Автор: Vofka 02.12.16, 9:20

inna.innainna84 @ Вчера, 20:22 * ,
когда Жмете "ответ", то текст, который автоматически подставляется в форму, лучше оставлять в начале сообщения, а не в конце.

Автор: inna.innainna84 02.12.16, 13:36

Может нужно создать еще третью ТЗ и выгрузить туда Долги по клиенту и Остатки по ТМЦ? Может кто-то такое уже делал подскажите пожалуйста наглядный код.

Автор: inna.innainna84 03.12.16, 13:24

У меня получилось. Я это сделала!:32542460: 32542460.gif 32542460.gif inna.innainna84 @ Вчера, 13:36 * ,

Автор: inna.innainna84 03.12.16, 16:16

                  //----4----//  
            
//=========================не трогать====================================================================
    Если ДокРН.Итог("СуммаСНДС")<ДокРН.СуммаДокНал  Тогда//   **начало
        сообщить ("Не хватает товара!!");  
    иначе
        
        //правим суммы    
        Ном = ДокРН.КоличествоСтрок();
        Если Ном > 0 Тогда   //**1
            Пока  Ном > 0 Цикл
                ДокРН.ПолучитьСтрокуПоНомеру(Ном);
                Если ДокРН.Итог("СуммаСНДС")>ДокРН.СуммаДокНал  Тогда //**2                 
                    Дельта2=    ДокРН.Итог("СуммаСНДС")-ДокРН.СуммаДокНал;
                ДокРН.СуммаСНДС=ДокРН.Суммасндс-Дельта2;
                    
                    Если ДокРН.СуммаСНДС=0 Тогда
                        ДокРН.Удалитьстроку();
                    КонецЕсли;
                    
                    //**выбрает вессой или штучный товар и правим кво с условием                 
                    Если ДокРН.ТМЦ.Весовой = 0 тогда                          
                        ДокРН.Кво=Окр(ДокРН.СуммаСНДС/ДокРН.ЦенаСНДС);                         
                    иначе
                        ДокРН.Кво=ДокРН.СуммаСНДС/ДокРН.ЦенаСНДС;                             
                    КонецЕсли;//**выбрала
                    
                    ДокРН.ЦенаСНДС= ДокРН.СуммаСНДС/ДокРН.Кво;      
        
                    ДокРН.СуммаБезНДС=Формат(ДокРН.СуммаСНДС/1.2,"Ч12.2");                         
                    ДокРН.НДС= Формат(ДокРН.СуммаСНДС-ДокРН.СуммаБезНДС,"Ч12.2");
                    ДокРН.СуммаБезСкидки=ДокРН.СуммаБезНДС;                     
                КонецЕсли; //**2
                Ном = Ном-1;
                
            КонецЦикла;
        КонецЕсли; //**1         
    КонецЕсли; //*** начало

алгоритм подбора кол-ва и подгонка суммы в документе на согласно указанной ДокРН.СуммаДокНал (СуммаДокНал-это сумма переплаты по покупателю)

Автор: XBrut 04.12.16, 9:18

вай маладэц! если мне прийдётся подгонять цены товара под сумму оплаты. именно так и сделаю.

Автор: inna.innainna84 04.12.16, 14:34

Спасибо за "спасибо". С первым меня "Спасибо." XBrut @ Сегодня, 9:18 * ,

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua