Это старая версия документа.


Способ реализации внутренних перещений товаров

Описание ситуации:

  • требуется перемещение товаров с одного поднадзорного объекта на другой без смены владельца
  • операция отражается в 1С документом ПеремещениеТоваров (для примера)

Порядок изменений:

  1. Внести изменения в справочник АСП_ВидыДокументов1С:
    Наименование Вид документа Тип операции Код операции
    Перемещение ПеремещениеТоваров Исходящий
    Перемещение - отправка ПеремещениеТоваров Исходящий STEP1
    Перемещение - получение ПеремещениеТоваров Входящий STEP2
  2. Внести изменения в модуль АСП_Общие:
    1. Процедура СоздатьВетДокиПоОснованию:
      Функция СоздатьВетДокиПоОснованию(Обработка, Документ) Экспорт
      	
      	СписСерт = 0;
              // для перемещений перехватываем логику создания сертификатов и пускаем по сценарию STEP1
      	Если ТипЗнч(Документ) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
      		СписСерт = Обработка.СформироватьОбновитьСертификаты1С(Документ, ОперацияПоКоду("STEP1")).Количество();	
      	Иначе
      		СписСерт = СписСерт + Обработка.СформироватьОбновитьСертификаты1С(Документ).Количество();
      	КонецЕсли;	
      	Возврат СписСерт;
         
      КонецФункции
      
    2. Процедура ПровестиПоОснованию:
      Процедура ПровестиПоОснованию(Обработка, ВидДокумента, Документ) Экспорт
              // добавляем ВидДокумента во второй параметр для уточнённой выборки сертификатов по коду операции 
      	Если ВидДокумента.КодОперации = "STEP1" Тогда
      		СписВетДок = АСП_Функции.ПолучитьСписокВетДокументов(Документ, ВидДокумента);
      	Иначе
      		СписВетДок = АСП_Функции.ПолучитьСписокВетДокументов(Документ);
      	КонецЕсли;
      	  
      	Для Каждого ВетДок Из СписВетДок Цикл
      		Объект = ВетДок.ПолучитьОбъект();
      		Объект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
      	КонецЦикла;
      КонецПроцедуры
      
    3. Процедура ЗарегистрироватьПоОснованию:
      Процедура ЗарегистрироватьПоОснованию(Обработка, ВидДокумента, Документ) Экспорт
      	
      	//Перехватываем ВидДокумента для изменения сценария регистрации
      	Если ВидДокумента.Наименование = "Перемещение" Тогда
      	     Обработка.НачатьПоследовательнуюРегистрацию();
      		 Обработка.ЗарегистрироватьТранспортнуюПартию(Документ, ОперацияПоКоду("STEP1"));
      		 Обработка.ЗарегистрироватьВходящуюПартию(Документ, ОперацияПоКоду("STEP2"));
      		 Обработка.ЗавершитьПоследовательнуюРегистрацию();
      		 Возврат;
      	КонецЕсли;
      	 
      	// для остальных документов - обычный сценарий
      	Если ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Входящий Тогда
      		Обработка.ЗарегистрироватьВходящуюПартию(Документ);
      	ИначеЕсли ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Исходящий Тогда
      		Обработка.ЗарегистрироватьТранспортнуюПартию(Документ);
      	ИначеЕсли ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Производственный Тогда
      		Обработка.ЗарегистрироватьПроизводственнуюПартию(Документ);
      	ИначеЕсли ВидДокумента.ТипСертификата = Перечисления.АСП_ТипВетСертификата.Инвентаризация Тогда
      		Обработка.ЗарегистрироватьИнвентаризацию(Документ);
      	КонецЕсли;
      	
      КонецПроцедуры
      
    4. Процедура ДозаполнитьПоляВетСертификата1С:
      Процедура ДозаполнитьПоляВетСертификата1С(Ссылка, ОбъектСертификата) Экспорт
      	
      	Если  ОбъектСертификата.ВидДокумента.КодОперации = "STEP1" Тогда
      		ОбъектСертификата.Организация = Ссылка.СкладОтправитель;
      		ОбъектСертификата.Контрагент = Ссылка.СкладПолучатель;
      		Возврат;
      	ИначеЕсли   ОбъектСертификата.ВидДокумента.КодОперации = "STEP2" Тогда	
      		ОбъектСертификата.Организация = Ссылка.СкладПолучатель;
      		ОбъектСертификата.Контрагент = Ссылка.СкладОтправитель;
      	    Возврат;
      	КонецЕсли;
      
      	// далее оставляем тело процедуры
      	...
      КонецПроцедуры
      
    5. Процедура ДействияПередРегистрациейВетСертификата:
      Процедура ДействияПередРегистрациейВетСертификата(Основание, ВидДокумента) Экспорт
      	Если ВидДокумента.КодОперации = "STEP2" Тогда
      		СписПолучателей = АСП_Функции.ПолучитьСписокВетДокументов(Основание, ОперацияПоКоду("STEP2"));
      		Для Каждого Получатель Из СписПолучателей Цикл
      			 // нужно изменить обработчик и получить второй документ по первому;
      			СписОтправителей = АСП_Функции.ПолучитьСписокВетДокументов(Основание, ОперацияПоКоду("STEP1"), Получатель.Разрез);
      			Об = Получатель.ПолучитьОбъект();
      			//ОбъектДок = Документы.АСП_ВетеринарныйДокумент.НайтиПоНомеру(Ссылка.НомерВСД);
      			Об.ГУИДВходящегоВСД = СписОтправителей[0].ГУИД;
      			Об.Записать();
      		КонецЦикла;
      	КонецЕсли;
      КонецПроцедуры
      
    6. Процедура ДействияПослеПроведенияВетСертификата:
      Процедура ДействияПослеПроведенияВетСертификата(Ссылка, Движения) Экспорт
      	Если Ссылка.ВидДокумента.КодОперации = "STEP1" Тогда
      		//1. найти уже созданное
      		Основание = Ссылка.ДокументОснование;
      		Если ТипЗнч(Основание) = Тип("ДокументСсылка.АСП_ВетеринарныйДокумент") Тогда
      			Основание = Основание.ДокументОснование;
      		КонецЕсли;
      		Спис = АСП_Функции.ПолучитьСписокВетДокументов(Основание, ОперацияПоКоду("STEP2"), Ссылка.Разрез);
      		
      		Если Спис.Количество()=0 Тогда
      			Объект = Документы.АСП_ВетеринарныйДокумент.СоздатьДокумент();
      		Иначе
      			Объект = Спис[0].Ссылка.ПолучитьОбъект();
      		КонецЕсли;
      		
      		//2. заполнить по шаблону
      		Шаблон = АСП_Функции.НайтиШаблон(Ссылка.Ссылка, ОперацияПоКоду("STEP2"));
      		Если НЕ Шаблон = Неопределено Тогда
      			ЗаполнитьЗначенияСвойств(Объект, Шаблон);
      			Объект.Шаблон = Шаблон;
      		КонецЕсли;
      		Объект.Дата = Ссылка.Дата+1;
      		Объект.ВидДокумента = ОперацияПоКоду("STEP2");
      		Объект.ДокументОснование = Основание;
      		Объект.Контрагент = Ссылка.Организация;
      		Объект.Организация = Ссылка.Контрагент;
      		Объект.НомерВСД = Ссылка.НомерВСД;
      		Объект.ДатаВСД = Ссылка.ДатаВСД;
      		Объект.ДатаТТН = Ссылка.ДатаТТН;
      		Объект.НомерТТН = Ссылка.НомерТТН;
      		Объект.Разрез = Ссылка.Разрез;
      		
      		// запрос получения информации по партии
      		Запрос = Новый Запрос(
      			"ВЫБРАТЬ
      			|	АСП_ВходящиеПартии.Категория,
      			|	АСП_ВходящиеПартии.Номенклатура,
      			|	АСП_ВходящиеПартии.Единица,
      			|	АСП_ВходящиеПартии.Кратность,
      			|	АСП_ВходящиеПартии.Упаковка,
      			|	АСП_ВходящиеПартии.ДатаВыработки,
      			|	АСП_ВходящиеПартии.ДатаВыработкиКон,
      			|	АСП_ВходящиеПартии.ДатаПросрочки,
      			|	АСП_ВходящиеПартии.ДатаПросрочкиКон,
      			|	АСП_ВходящиеПартии.Маркировки,
      			|	АСП_ВходящиеПартии.Производитель
      			|ИЗ
      			|	РегистрСведений.АСП_ВходящиеПартии КАК АСП_ВходящиеПартии
      			|ГДЕ
      			|	АСП_ВходящиеПартии.НомерСтрокиТЧ = &НомерСтрокиТЧ
      			|	И АСП_ВходящиеПартии.Регистратор = &Регистратор");
      			
      		//3. перезаполнение таблицы товаров
      		Объект.Товары.Очистить();	
      		Для Каждого Движение Из Движения.АСП_СкладскиеЗаписи Цикл
      			Нов = Объект.Товары.Добавить();
      			Запрос.УстановитьПараметр("НомерСтрокиТЧ", Движение.НомерСтрокиТЧ);
      			Запрос.УстановитьПараметр("Регистратор", Движение.Сертификат);
      			Партия = Запрос.Выполнить().Выгрузить()[0];
      			ЗаполнитьЗначенияСвойств(Нов, Партия);
      			Нов.Количество = Движение.Количество;
      			Нов.КоличествоУпаковок = Движение.КоличествоУпаковок;
      		КонецЦикла;
      		
      		Объект.Записать();
      	КонецЕсли;
      КонецПроцедуры