Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
отрывки:перемещение_товаров [2017/12/27 19:10]
adminasp
отрывки:перемещение_товаров [2018/05/03 11:04]
juravka
Строка 1: Строка 1:
-====== Способ реализации внутренних перещений товаров ======+====== Способ реализации внутренних перемещений товаров ======
  
 Описание ситуации:​ Описание ситуации:​
-  * требуется перемещение товаров с одного поднадзорного объекта на другой ​со сменой владельца ​или без+  * требуется перемещение товаров с одного поднадзорного объекта на другой ​без ​смены владельца
   * операция отражается в 1С документом **ПеремещениеТоваров** (для примера)   * операция отражается в 1С документом **ПеремещениеТоваров** (для примера)
  
-Порядок изменений:​ +Порядок изменений:​\\ 
-  ​-- Внести изменения в справочник **АСП_ВидыДокументов1С**:​ +  - Внести изменения в справочник **АСП_ВидыДокументов1С**:​<​WRAP>​ 
-^ Наименование ^ Вид документа ^ Тип операции ^ Код операции ^ +^ Наименование ​           ^ Вид документа ​     ^ Тип операции ^ Код операции ^ 
-|Перемещение |ПеремещениеТоваров | | | +| Перемещение ​            ​| ПеремещениеТоваров | Исходящий ​   ​             
-|Перемещение - отправка |ПеремещениеТоваров |Исходящий |STEP1| +| Перемещение - отправка ​ | ПеремещениеТоваров | Исходящий ​   | STEP1        
-|Перемещение - получение |ПеремещениеТоваров |Входящий |STEP2|+| Перемещение - получение | ПеремещениеТоваров | Входящий ​    ​| STEP2        | 
 +</​WRAP>​ 
 +  - Внести изменения в модуль **[[компоненты:​асп_общие|АСП_Общие]]**:​ 
 +    - Процедура **СоздатьВетДокиПоОснованию**:<​1c>​Функция СоздатьВетДокиПоОснованию(Обработка,​ Документ) Экспорт 
 +  
 + СписСерт = 0; 
 +        // для перемещений перехватываем логику создания сертификатов и пускаем по сценарию STEP1 
 + Если ТипЗнч(Документ) = Тип("​ДокументСсылка.ПеремещениеТоваров"​) Тогда 
 + СписСерт = Обработка.СформироватьОбновитьСертификаты1С(Документ,​ ОперацияПоКоду("​STEP1"​)).Количество();​  
 + Иначе 
 + СписСерт = СписСерт + Обработка.СформироватьОбновитьСертификаты1С(Документ).Количество();​ 
 + КонецЕсли;​  
 + Возврат СписСерт;​ 
 +    
 +КонецФункции 
 +</​1c>​ 
 +    - Процедура **ПровестиПоОснованию**:<​1c>​Процедура ПровестиПоОснованию(Обработка,​ ВидДокумента,​ Документ) Экспорт 
 +        // добавляем ВидДокумента во второй параметр для уточнённой выборки сертификатов по коду операции  
 + Если ВидДокумента.КодОперации = "​STEP1"​ Тогда 
 + СписВетДок = АСП_Функции.ПолучитьСписокВетДокументов(Документ,​ ВидДокумента);​ 
 + Иначе 
 + СписВетДок = АСП_Функции.ПолучитьСписокВетДокументов(Документ);​ 
 + КонецЕсли;​ 
 +    
 + Для Каждого ВетДок Из СписВетДок Цикл 
 + Объект = ВетДок.ПолучитьОбъект();​ 
 + Объект.Записать(РежимЗаписиДокумента.Проведение,​ РежимПроведенияДокумента.Неоперативный);​ 
 + КонецЦикла;​ 
 +КонецПроцедуры 
 +</​1c>​ 
 +    - Процедура **ЗарегистрироватьПоОснованию**:<​1c>​Процедура ЗарегистрироватьПоОснованию(Обработка,​ ВидДокумента,​ Документ) Экспорт 
 +  
 + //​Перехватываем ВидДокумента для изменения сценария регистрации 
 + Если ВидДокумента.Наименование = "​Перемещение"​ Тогда 
 +      ​Обработка.НачатьПоследовательнуюРегистрацию();​ 
 + Обработка.ЗарегистрироватьТранспортнуюПартию(Документ,​ ОперацияПоКоду("​STEP1"​));​ 
 + Обработка.ЗарегистрироватьВходящуюПартию(Документ,​ ОперацияПоКоду("​STEP2"​));​ 
 + Обработка.ЗавершитьПоследовательнуюРегистрацию();​ 
 + Возврат;​ 
 + КонецЕсли;​ 
 +  
 + // для остальных документов - обычный сценарий 
 + Если ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Входящий Тогда 
 + Обработка.ЗарегистрироватьВходящуюПартию(Документ);​ 
 + ИначеЕсли ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Исходящий Тогда 
 + Обработка.ЗарегистрироватьТранспортнуюПартию(Документ);​ 
 + ИначеЕсли ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Производственный Тогда 
 + Обработка.ЗарегистрироватьПроизводственнуюПартию(Документ);​ 
 + ИначеЕсли ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Инвентаризация Тогда 
 + Обработка.ЗарегистрироватьИнвентаризацию(Документ);​ 
 + КонецЕсли;​ 
 +  
 +КонецПроцедуры 
 +</​1c>​ 
 +    - Процедура **ДозаполнитьПоляВетСертификата1С**:<​1c>​Процедура ДозаполнитьПоляВетСертификата1С(Ссылка,​ ОбъектСертификата) Экспорт 
 +  
 + Если ​ ОбъектСертификата.ВидДокумента.КодОперации = "​STEP1"​ Тогда 
 + ОбъектСертификата.Организация = Ссылка.СкладОтправитель;​ 
 + ОбъектСертификата.Контрагент = Ссылка.СкладПолучатель;​ 
 + Возврат;​ 
 + ИначеЕсли ​  ​ОбъектСертификата.ВидДокумента.КодОперации = "​STEP2"​ Тогда  
 + ОбъектСертификата.Организация = Ссылка.СкладПолучатель;​ 
 + ОбъектСертификата.Контрагент = Ссылка.СкладОтправитель;​ 
 +     Возврат;​ 
 + КонецЕсли;​ 
 + 
 + // далее оставляем тело процедуры 
 + ... 
 +КонецПроцедуры 
 +</​1c>​ 
 +    - Процедура **ДействияПередРегистрациейВетСертификата**:<​1c>​Процедура ДействияПередРегистрациейВетСертификата(Основание,​ ВидДокумента) Экспорт 
 + Если ВидДокумента.КодОперации = "​STEP2"​ Тогда 
 + СписПолучателей = АСП_Функции.ПолучитьСписокВетДокументов(Основание,​ ОперацияПоКоду("​STEP2"​));​ 
 + Для Каждого Получатель Из СписПолучателей Цикл 
 + // нужно изменить обработчик и получить второй документ по первому;​ 
 + СписОтправителей = АСП_Функции.ПолучитьСписокВетДокументов(Основание,​ ОперацияПоКоду("​STEP1"​),​ Получатель.Разрез);​ 
 + Об = Получатель.ПолучитьОбъект();​ 
 + //​ОбъектДок = Документы.АСП_ВетеринарныйДокумент.НайтиПоНомеру(Ссылка.НомерВСД);​ 
 + Об.ГУИДВходящегоВСД = СписОтправителей[0].ГУИД;​ 
 + Об.Записать();​ 
 + КонецЦикла;​ 
 + КонецЕсли;​ 
 +КонецПроцедуры 
 +</​1c>​ 
 +    - Процедура **ДействияПослеПроведенияВетСертификата**:<​1c>​Процедура ДействияПослеПроведенияВетСертификата(Ссылка,​ Движения) Экспорт 
 + Если Ссылка.ВидДокумента.КодОперации = "​STEP1"​ Тогда 
 + //1. найти уже созданное 
 + Основание = Ссылка.ДокументОснование;​ 
 + Если ТипЗнч(Основание) = Тип("​ДокументСсылка.АСП_ВетеринарныйДокумент"​) Тогда 
 + Основание = Основание.ДокументОснование;​ 
 + КонецЕсли;​ 
 + Спис = АСП_Функции.ПолучитьСписокВетДокументов(Основание,​ ОперацияПоКоду("​STEP2"​),​ Ссылка.Разрез);​ 
 +  
 + Если Спис.Количество()=0 Тогда 
 + Объект = Документы.АСП_ВетеринарныйДокумент.СоздатьДокумент();​ 
 + Иначе 
 + Объект = Спис[0].Ссылка.ПолучитьОбъект();​ 
 + КонецЕсли;​ 
 +  
 + //2. заполнить по шаблону 
 + Шаблон = АСП_Функции.НайтиШаблон(Ссылка.Ссылка,​ ОперацияПоКоду("​STEP2"​));​ 
 + Если НЕ Шаблон = Неопределено Тогда 
 + ЗаполнитьЗначенияСвойств(Объект,​ Шаблон);​ 
 + Объект.Шаблон = Шаблон;​ 
 + КонецЕсли;​ 
 + Объект.Дата = Ссылка.Дата+1;​ 
 + Объект.ВидДокумента = ОперацияПоКоду("​STEP2"​);​ 
 + Объект.ДокументОснование = Основание;​ 
 + Объект.Контрагент = Ссылка.Организация;​ 
 + Объект.Организация = Ссылка.Контрагент;​ 
 + Объект.НомерВСД = Ссылка.НомерВСД;​ 
 + Объект.ДатаВСД = Ссылка.ДатаВСД;​ 
 + Объект.ДатаТТН = Ссылка.ДатаТТН;​ 
 + Объект.НомерТТН = Ссылка.НомерТТН;​ 
 + Объект.Разрез = Ссылка.Разрез;​ 
 +  
 + // запрос получения информации по партии 
 + Запрос = Новый Запрос( 
 + "​ВЫБРАТЬ 
 + | АСП_ВходящиеПартии.Категория,​ 
 + | АСП_ВходящиеПартии.Номенклатура,​ 
 + | АСП_ВходящиеПартии.Единица,​ 
 + | АСП_ВходящиеПартии.Кратность,​ 
 + | АСП_ВходящиеПартии.Упаковка,​ 
 + | АСП_ВходящиеПартии.ДатаВыработки,​ 
 + | АСП_ВходящиеПартии.ДатаВыработкиКон,​ 
 + | АСП_ВходящиеПартии.ДатаПросрочки,​ 
 + | АСП_ВходящиеПартии.ДатаПросрочкиКон,​ 
 + | АСП_ВходящиеПартии.Маркировки,​ 
 + | АСП_ВходящиеПартии.Производитель 
 + |ИЗ 
 + | РегистрСведений.АСП_ВходящиеПартии КАК АСП_ВходящиеПартии 
 + |ГДЕ 
 + | АСП_ВходящиеПартии.НомерСтрокиТЧ = &​НомерСтрокиТЧ 
 + | И АСП_ВходящиеПартии.Регистратор = &​Регистратор"​);​ 
 +  
 + //3. перезаполнение таблицы товаров 
 + Объект.Товары.Очистить();​  
 + Для Каждого Движение Из Движения.АСП_СкладскиеЗаписи Цикл 
 + Нов = Объект.Товары.Добавить();​ 
 + Запрос.УстановитьПараметр("​НомерСтрокиТЧ",​ Движение.НомерСтрокиТЧ);​ 
 + Запрос.УстановитьПараметр("​Регистратор",​ Движение.Сертификат);​ 
 + Партия = Запрос.Выполнить().Выгрузить()[0];​ 
 + ЗаполнитьЗначенияСвойств(Нов,​ Партия);​ 
 + Нов.Количество = Движение.Количество;​ 
 + Нов.КоличествоУпаковок = Движение.КоличествоУпаковок;​ 
 + КонецЦикла;​ 
 +  
 + Объект.Записать();​ 
 + КонецЕсли;​ 
 +КонецПроцедуры 
 +</1c>