Имя: Пароль:
1C
 
Чем плох такой код?
0 pro3ri
 
28.12.15
15:00
добрый день!
в обработке проведения док расходный ордер:

Если ТипЗнч(ДокументПередачи.ДокументОснование) = Тип("ДокументСсылка.СчетНаОплатуПокупателю") Тогда
        
            Сделка=ДокументПередачи.ДокументОснование.ЗаказПокупателя.Ссылка;
            
        ИначеЕсли ТипЗнч(ДокументПередачи.ДокументОснование) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
            
            Сделка=ДокументПередачи.ДокументОснование;
            
        КонецЕсли;

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

ТоварыСгруппировал = Товары.Выгрузить();
            
            ТоварыСгруппировал.Свернуть("Номенклатура, ЕдиницаИзмерения, Коэффициент, Цена", "Количество");
            Для каждого СтрокаТЧ из ТоварыСгруппировал Цикл

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

                    
                    Если Остатки.Количество()>0 Тогда
                        ОстатокЗаказа=Остатки[0].Количество;
                    Иначе
                        ОстатокЗаказа=0;
                    КонецЕсли;
                
                    Если ОстатокЗаказа>0 И ВсегоВРасходникеДолжноБыть>0 Тогда
                        СтрокаТЗ=ТаблицаПоТоварам.Добавить();

                        Если СтрокаНайденная.Размещение = Неопределено Тогда
                             СтрокаТЗ.Склад=СтрокаТЧ.Склад;
                        Иначе
                             СтрокаТЗ.Склад = СтрокаНайденная.Размещение;
                        КонецЕсли;

                        СтрокаТЗ.Номенклатура=СтрокаТЧ.Номенклатура;
                        СтрокаТЗ.ЕдиницаИзмерения=СтрокаТЧ.ЕдиницаИзмерения;
                        СтрокаТЗ.Цена=СтрокаТЧ.Цена;

                        Если ВсегоВРасходникеДолжноБыть>0  Тогда
                        
                            СтрокаТЗ.Количество =?(ВсегоВРасходникеДолжноБыть-ОстатокЗаказа>=0,ОстатокЗаказа,ВсегоВРасходникеДолжноБыть);
                            ВсегоВРасходникеДолжноБыть = ВсегоВРасходникеДолжноБыть - ОстатокЗаказа;
                        
                        КонецЕсли;
                        
                    КонецЕсли;    
                
                КонецЦикла;
                
            КонецЦикла;
            
            ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварам, ТаблицаДвижений);
        
            // Недостающие поля
            ТаблицаДвижений.ЗаполнитьЗначения(Сделка, "ЗаказПокупателя");
            ТаблицаДвижений.ЗаполнитьЗначения(ДоговорКонтрагента, "ДоговорКонтрагента");
            
            ТаблицаДвижений.ЗаполнитьЗначения(Перечисления.СтатусыПартийТоваров.Купленный, "СтатусПартии");
            
            НаборДвижений.мПериод          = Дата;
            НаборДвижений.мТаблицаДвижений = ТаблицаДвижений;
            
            // Проверка осатков при оперативном проведении.
            Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
                // Контроль объема отгрузки по заказу
                Движения.ЗаказыПокупателей.КонтрольПревышенияОбъемаЗаказа(ЭтотОбъект, СтруктураШапкиДокумента, "Товары", Отказ, Заголовок);
            КонецЕсли;
            
            Если Не Отказ Тогда
                Движения.ЗаказыПокупателей.ВыполнитьРасход();
            КонецЕсли;
            
            
            НаборДвижений = Движения.ТоварыВРезервеНаСкладах;

                // Получим таблицу значений, совпадающую со струкутрой набора записей регистра.
            ТаблицаДвижений = НаборДвижений.Выгрузить();

                // Заполним таблицу движений.
            ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварам, ТаблицаДвижений);

                // Недостающие поля.
            ТаблицаДвижений.ЗаполнитьЗначения(Сделка,"ДокументРезерва");

            НаборДвижений.мПериод            = Дата;
            НаборДвижений.мТаблицаДвижений   = ТаблицаДвижений;

                // Проверка осатков при оперативном проведении.
            Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
                НаборДвижений.КонтрольОстатков(ЭтотОбъект, "Товары", СтруктураШапкиДокумента, Отказ, Заголовок);
            КонецЕсли;
                
            Если Не Отказ Тогда
                Движения.ТоварыВРезервеНаСкладах.ВыполнитьРасход();
            КонецЕсли;
            
        КонецЕсли;

Я вижу то, что если документ был создан не на основании,
ОбработкаЗаполнения:

ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.ПредварительнаяНакладная") Тогда
        
        // Заполним реквизиты из стандартного набора.
        ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание);
        
        ВидОперации = Перечисления.ВидыОперацийРасходныйОрдер.РасходПоНакладной;

        ДокументПередачи = Основание;

Тогда резерв не спишется.
2 pro3ri
 
28.12.15
15:04
Я так понимаю нужно все данные тащить из документа в документ: заказ покупателя (тут указаны резервы) в предварительную накладную (резервы переносятся в табличной части); Она в расходный ордер соответсвенно тащит данные о резервах. Или допустимо использовать код выше?
НО, он работает...
4 Stim
 
28.12.15
15:11
(2) да
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший