Имя: Пароль:
1C
1С v8
Списание/оприходование партий одним документом Ут 10.3
0 Boudybuilder
 
10.05.16
09:09
Здравствуйте.

Не могу никак решить задачу.
У нас есть документ Ремонт, который списывает товары со склада, по партиям и т.д... Но есть иногда потребность этим же типом документа возвращать эти товары на склад, которые находятся в ТЧ ТоварыВозврат.
Все хорошо работает если, отдельным документом списывать Товары или оприходововать ТоварыВозврат. Но если надо и то и другое, то наши возвраты проводятся, а типовые функции списания уже не делают движений.

Не важно, ставлю я свою процедуру до или после типовой процедуры проведения.


ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, Отказ, Заголовок); // Типовая - списание

// Наш код:
                Движения.ТоварыВНТТ.Записывать = Истина;
                Для Каждого Стр ИЗ ТоварыВозврат Цикл
                    д                            = Движения.ТоварыВНТТ.ДобавитьПриход();
                    д.Период                     = Дата;
                    д.Количество                 = стр.Количество;
                    д.Номенклатура               = стр.Номенклатура;
                    д.СерияНоменклатуры          = стр.СерияНоменклатуры;
                    д.Склад                      = Склад;
                    д.ХарактеристикаНоменклатуры = стр.ХарактеристикаНоменклатуры;
                    д.ЦенаВРознице               = стр.Цена;
                    д.ТоварТара                  = Перечисления.ТоварТара.Товар;
                КонецЦикла;
1 Звездец
 
10.05.16
09:11
Скорее всего забываешь записать. Лучше весь код покажи
2 Boudybuilder
 
10.05.16
09:12
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    Перем Заголовок, СтруктураШапкиДокумента, ТаблицаПоТоварам;
    
    Если мУдалятьДвижения Тогда
        ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ);
    КонецЕсли;
    
    ТабДвижРем = ПолучитьТаблицуДвиженийДока();
    мТекущаяСхемаНалогообложения = НалоговыйУчет.ПолучитьСхемуНалогообложения(Дата,Организация);
    ПодготовитьСтруктуруШапкиДокумента(Заголовок, СтруктураШапкиДокумента);
    ПроверитьЗаполнениеШапки(СтруктураШапкиДокумента, Отказ, Заголовок);
    УправлениеДопПравамиПользователей.ПроверитьДопустимостьЦенОтпуска(ЭтотОбъект, "Товары", Отказ);
    ПодготовитьТаблицыДокумента(СтруктураШапкиДокумента, ТаблицаПоТоварам);
    
    Для каждого Стр Из ТабДвижРем Цикл
        Если Стр.КолОст = 0 Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "ID: "+Стр.ID+" отсутствует на складе "+Склад;
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если Не Отказ Тогда
        // ВОЗВРАТ ТОВАРОВ НА СКЛАД
        // Снимем использованые комплектующие из ремонта и вернем их на склад
        Если ТоварыВозврат.Количество() > 0 Тогда
            // Оприходуем товары на НТТ
            Если Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда
                Движения.ТоварыВНТТ.Записывать = Истина;
                Для Каждого Стр ИЗ ТоварыВозврат Цикл
                    д                            = Движения.ТоварыВНТТ.ДобавитьПриход();
                    д.Период                     = Дата;
                    д.Количество                 = стр.Количество;
                    д.Номенклатура               = стр.Номенклатура;
                    д.СерияНоменклатуры          = стр.СерияНоменклатуры;
                    д.Склад                      = Склад;
                    д.ХарактеристикаНоменклатуры = стр.ХарактеристикаНоменклатуры;
                    д.ЦенаВРознице               = стр.Цена;
                    д.ТоварТара                  = Перечисления.ТоварТара.Товар;
                КонецЦикла;
            КонецЕсли;
            
            // Оприходуем партии товаров
            
            Запрос = Новый Запрос("ВЫБРАТЬ
            |    П.Номенклатура,
            |    П.ХарактеристикаНоменклатуры,
            |    П.СерияНоменклатуры,
            |    П.ДокументОприходования,
            |    П.СтатусПартии,
            |    П.Заказ,
            |    П.Качество,
            |    П.Стоимость / Д.Количество / Д.Коэффициент КАК Стоимость,
            |    П.КодОперации,
            |    П.СписаниеПартий,
            |    П.НомерКорСтроки,
            |    П.ДокументДвижения,
            |    П.ДокументДвиженияПериод,
            |    П.НомерСтрокиСписанныхТоваров,
            |    Д.Количество / Д.Коэффициент КАК Количество
            |ИЗ
            |    РегистрНакопления.ПартииТоваровНаСкладах КАК П
            |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ФанРемонтВнутренний.ТоварыВозврат КАК Д
            |        ПО П.Номенклатура = Д.Номенклатура
            |            И П.ХарактеристикаНоменклатуры = Д.ХарактеристикаНоменклатуры
            |            И П.Регистратор = Д.ДокументСписания
            |ГДЕ
            |    Д.Ссылка = &Ссылка");
            Запрос.УстановитьПараметр("Ссылка",Ссылка);
            тВозврат = Запрос.Выполнить().Выгрузить();
            
            Движения.ПартииТоваровНаСкладах.Записывать = Истина;
    
            Для Каждого Стр ИЗ тВозврат Цикл
                д                            = Движения.ПартииТоваровНаСкладах.ДобавитьПриход();
                д.Период                     = Дата;
                д.ДокументОприходования      = Стр.ДокументОприходования;
                д.Номенклатура               = Стр.Номенклатура;
                д.ХарактеристикаНоменклатуры = Стр.ХарактеристикаНоменклатуры;
                д.Количество                 = Стр.Количество;
                д.Стоимость                  = Стр.Стоимость;
            КонецЦикла;
        КонецЕсли;
        
        
        
        // Подготовим таблицу товаров для проведения.
        ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, СтруктураШапкиДокумента);
        СтруктураШапкиДокумента.Вставить("ПартияРемонта",ТабДвижРем[0].Документ);
        ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, Отказ, Заголовок);
    КонецЕсли;    
    
    
    //Регистр Стоимость Ремонтов
    Движения.ФанСтоимостьРемонтов.Записывать = Истина;
    Движения.ФанСтоимостьРемонтов.Очистить();
    Для Каждого Строка Из Товары Цикл
        Движение                                   = Движения.ФанСтоимостьРемонтов.Добавить();
        Движение.ВидДвижения                       = ВидДвиженияНакопления.Приход;
        Движение.Период                            = Дата;
        Движение.ID                                = ID;
        Движение.Работы                            = Строка.Работы;
        Движение.Сервис                            = Мастер;
        Движение.Цена                              = Строка.Сумма;
        Движение.ГарантийныйРемонт                 = ГарантийныйРемонт;
        Движение.НоменклатураРемонта               = Строка.Номенклатура;
        Движение.СерияНоменклатурыРемонта          = Строка.СерияНоменклатуры;
        Движение.ХарактеристикаНоменклатурыРемонта = Строка.ХарактеристикаНоменклатуры;
        Движение.Количество                        = Строка.Количество;
        Движение.ЕдиницаИзмерения                  = Строка.ЕдиницаИзмерения;
        Движение.ДокументОприходования             = СтруктураШапкиДокумента.ПартияРемонта;
        Движение.ГарантийныйСрок                   = ГарантийныйСрок;
    КонецЦикла;
    
    // регистр ФанСостояниеРемонтов
    Движения.ФанСостояниеРемонтов.Записывать = Истина;
    Движения.ФанСостояниеРемонтов.Очистить();
    Движение                     = Движения.ФанСостояниеРемонтов.Добавить();
    Движение.Период              = Дата;
    Движение.Состояние           = Состояние;
    Движение.ID                  = ID;
    Движение.ГарантийныйРемонт   = ГарантийныйРемонт;
    
    
    // Продажи /////////////////////////////////////////////
    Движения.Продажи.Записывать = Истина;
    Движения.Продажи.Очистить();
    Для Каждого Стр Из Товары Цикл
        Если Стр.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
            Продолжить;
        КонецЕсли;
        Д                            = Движения.Продажи.Добавить();
        Д.Период                     = Дата;
        Д.Организация                = Организация;
        Д.Подразделение              = ДокументОприходования.Подразделение;
        Д.Номенклатура               = Стр.Номенклатура;
        Д.ХарактеристикаНоменклатуры = Стр.ХарактеристикаНоменклатуры;
        Д.Контрагент                 = Контрагент;
        Д.Количество                 = Стр.Количество/Стр.Коэффициент;
        Д.ДокументПродажи            = Ссылка;
    КонецЦикла;
    
КонецПроцедуры
3 Масянька
 
10.05.16
09:13
(1) +100 (насчет всего кода).
А может ТЧ (куда пихается) уже пустая.
4 Boudybuilder
 
10.05.16
09:14
(3) Хотя что я там забыть могу, если при срабатывании моей процедуры, все ок, а не проводится типовая.

Может как то надо перед запуском моей процедуры типовую записать, что ли?

Моя как бы затирает расходные движения типовой.
5 Boudybuilder
 
10.05.16
09:15
(3)

Я свою процедуру пробовал ставить до или после типовой. Один результат.
6 Масянька
 
10.05.16
09:20
(5) А если ТоварыВозврат заменить на тВозврат?
7 Звездец
 
10.05.16
09:29
3 раза код просмотрел, а где собственно списание со склада?

возврат вижу, партии возврата вижу, продажи и фин состояние вижу. А списание то где? И вообще, почему ННТ используете, по мне как-то не очень такой выбор
8 Boudybuilder
 
10.05.16
09:44
(7) Нтт, ну понятно что не выбор, но пока так.

ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, Отказ, Заголовок);// Типовая - списание
9 Звездец
 
10.05.16
09:48
(8) отладчиком на нее и смотри что передается в этом случае
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.