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