Различия

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

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

отрывки:перемещение_товаров [2017/12/27 20:01]
adminasp
отрывки:перемещение_товаров [2022/07/04 18:58]
Строка 1: Строка 1:
-====== Способ реализации внутренних перещений товаров ====== 
- 
-Описание ситуации:​ 
-  * требуется перемещение товаров с одного поднадзорного объекта на другой без смены владельца 
-  * операция отражается в 1С документом **ПеремещениеТоваров** (для примера) 
- 
-Порядок изменений:​\\ 
-  - Внести изменения в справочник **АСП_ВидыДокументов1С**:<​WRAP>​ 
-^ Наименование ​           ^ Вид документа ​     ^ Тип операции ^ Код операции ^ 
-| Перемещение ​            | ПеремещениеТоваров |              |              | 
-| Перемещение - отправка ​ | ПеремещениеТоваров | Исходящий ​   | STEP1        | 
-| Перемещение - получение | ПеремещениеТоваров | Входящий ​    | 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>