Товарно-транспортная накладная ЕГАИС (входящая) / Модуль менеджера

файл
#Область ОбработчикиСобытий

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	ИнтеграцияЕГАИСВызовСервера.ПриПолученииФормыДокумента(
		"ТТНВходящаяЕГАИС",
		ВидФормы,
		Параметры,
		ВыбраннаяФорма,
		ДополнительнаяИнформация,
		СтандартнаяОбработка);
	
КонецПроцедуры

#КонецОбласти

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДействияПриОбменеЕГАИС

// Статус после подготовки к передаче данных
//
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Ссылка на документ
//  Операция - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция ЕГАИС
// 
// Возвращаемое значение:
//  см. РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыКПередаче
//
Функция СтатусПослеПодготовкиКПередачеДанных(ДокументСсылка, Операция) Экспорт
	
	Если Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНПодтверждение Тогда
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыКПередаче(
			ДокументСсылка,
			Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияКПередаче);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНРасхождения Тогда
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыКПередаче(
			ДокументСсылка,
			Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийКПередаче);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНОтказ Тогда
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыКПередаче(
			ДокументСсылка,
			Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаКПередаче);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН Тогда
		
		ТекущееСостояние = РегистрыСведений.СтатусыДокументовЕГАИС.ТекущееСостояние(ДокументСсылка);
		
		Если ТекущееСостояние.Статус = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Отменен
			Или ТекущееСостояние.Статус = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаОшибка Тогда
			ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыКПередаче(
				ДокументСсылка,
				Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаКПередаче);
		Иначе
			ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыКПередаче(
				ДокументСсылка,
				Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияКПередаче);
		КонецЕсли;
		
	Иначе
		ВызватьИсключение ОбщегоНазначенияИС.ТекстИсключенияОбработкиСтатуса(ДокументСсылка, Операция);
	КонецЕсли;
	
	Возврат ПараметрыОбновления;
	
КонецФункции

// Статус после передачи данных
//
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Ссылка на документ
//  Операция - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция ЕГАИС
//  СтатусОбработки - ПеречислениеСсылка.СтатусыОбработкиСообщенийЕГАИС - Статус обработки сообщения
// 
// Возвращаемое значение:
//  см. РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусы
//
Функция СтатусПослеПередачиДанных(ДокументСсылка, Операция, СтатусОбработки) Экспорт
	
	Если СтатусОбработки = Неопределено Тогда
		СтатусОбработки = Перечисления.СтатусыОбработкиСообщенийЕГАИС.ПереданоВУТМ;
	КонецЕсли;
	
	Если Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНПодтверждение Тогда
		
		СтатусыБазовыйПроцесс = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
		
		СтатусыБазовыйПроцесс.Принят = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияПереданВУТМ;
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПолученЕГАИС);
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПроведенЕГАИС);
		
		СтатусыБазовыйПроцесс.Ошибка = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияОшибка;
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусы(ДокументСсылка, СтатусОбработки, СтатусыБазовыйПроцесс);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНРасхождения Тогда
		
		СтатусыБазовыйПроцесс = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
		
		СтатусыБазовыйПроцесс.Принят = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийПереданВУТМ;
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПолученЕГАИС);
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПроведенЕГАИС);
		
		СтатусыБазовыйПроцесс.Ошибка = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийОшибка;
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусы(ДокументСсылка, СтатусОбработки, СтатусыБазовыйПроцесс);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНОтказ Тогда
		
		СтатусыБазовыйПроцесс = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
		
		СтатусыБазовыйПроцесс.Принят = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаПереданВУТМ;
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПолученЕГАИС);
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПроведенЕГАИС);
		
		СтатусыБазовыйПроцесс.Ошибка = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаОшибка;
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной);
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусы(ДокументСсылка, СтатусОбработки, СтатусыБазовыйПроцесс);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН Тогда
		
		ТекущееСостояние = РегистрыСведений.СтатусыДокументовЕГАИС.ТекущееСостояние(ДокументСсылка);
		
		СтатусыБазовыйПроцесс = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
		
		Если ТекущееСостояние.Статус = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаКПередаче Тогда
			СтатусыБазовыйПроцесс.Принят = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаПереданВУТМ;
		Иначе
			СтатусыБазовыйПроцесс.Принят = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияПереданВУТМ;
		КонецЕсли;
		
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПолученЕГАИС);
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПроведенЕГАИС);
		
		Если ТекущееСостояние.Статус = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаКПередаче Тогда
			СтатусыБазовыйПроцесс.Ошибка = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаОшибка;
		Иначе
			СтатусыБазовыйПроцесс.Ошибка = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка;
		КонецЕсли;
		
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
		СтатусыБазовыйПроцесс.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусы(ДокументСсылка, СтатусОбработки, СтатусыБазовыйПроцесс);
		
	Иначе
		ВызватьИсключение ОбщегоНазначенияИС.ТекстИсключенияОбработкиСтатуса(ДокументСсылка, Операция);
	КонецЕсли;
	
	Возврат ПараметрыОбновления;
	
КонецФункции

// Статус после получения данных из ЕГАИС.
//
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Документ, для которого требуется обновить статус.
//  Операция - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция обмена с ЕГАИС.
//  ДополнительныеПараметры - Неопределено - отсутствуют
//                          - Структура    - возможные дополнительные параметры:
//   * СтатусОбработки - ПеречислениеСсылка.СтатусыОбработкиСообщенийЕГАИС - Статус обработки сообщения.
//   * ОперацияКвитанции - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция, на которую получена квитанция.
// 
// Возвращаемое значение:
//  см. РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыПриПолученииКвитанции
//
Функция СтатусПослеПолученияДанных(ДокументСсылка, Операция, ДополнительныеПараметры = Неопределено) Экспорт
	
	СтатусыАктТТНПодтверждение = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
	СтатусыАктТТНПодтверждение.Принят           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Подтвержден;
	СтатусыАктТТНПодтверждение.Обрабатывается   = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияОбрабатываетсяЕГАИС;
	СтатусыАктТТНПодтверждение.ОтменаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ОтмененПоставщиком;
	СтатусыАктТТНПодтверждение.ОшибкаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияОшибка;
	СтатусыАктТТНПодтверждение.Ошибка           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияОшибка;
	СтатусыАктТТНПодтверждение.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
	СтатусыАктТТНПодтверждение.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
	СтатусыАктТТНПодтверждение.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.НеТребуется);
	СтатусыАктТТНПодтверждение.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыАктТТНПодтверждение.УведомлениеОРегистрацииДвижения = Ложь;
	
	СтатусыАктТТНРасхождения = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
	СтатусыАктТТНРасхождения.Принят           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПодтвержденСРасхождениями;
	СтатусыАктТТНРасхождения.Обрабатывается   = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийОбрабатываетсяЕГАИС;
	СтатусыАктТТНРасхождения.ОтменаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ОтмененПоставщиком;
	СтатусыАктТТНРасхождения.ОшибкаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийОшибка;
	СтатусыАктТТНРасхождения.Ошибка           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийОшибка;
	СтатусыАктТТНРасхождения.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
	СтатусыАктТТНРасхождения.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
	СтатусыАктТТНРасхождения.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.НеТребуется);
	СтатусыАктТТНРасхождения.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыАктТТНРасхождения.УведомлениеОРегистрацииДвижения = Ложь;
	
	СтатусыАктТТНОтказ = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
	СтатусыАктТТНОтказ.Принят           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Отменен;
	СтатусыАктТТНОтказ.Обрабатывается   = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаОбрабатываетсяЕГАИС;
	СтатусыАктТТНОтказ.ОтменаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Отменен;
	СтатусыАктТТНОтказ.ОшибкаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаОшибка;
	СтатусыАктТТНОтказ.Ошибка           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаОшибка;
	СтатусыАктТТНОтказ.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной);
	СтатусыАктТТНОтказ.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
	СтатусыАктТТНОтказ.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.НеТребуется);
	СтатусыАктТТНОтказ.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыАктТТНОтказ.ОтменаПроведенияДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.НеТребуется);
	СтатусыАктТТНОтказ.ОтменаПроведенияДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыАктТТНОтказ.УведомлениеОРегистрацииДвижения = Ложь;
	
	СтатусыЗапросНаОтменуПроведения = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
	СтатусыЗапросНаОтменуПроведения.Принят           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПринятИзЕГАИС;
	СтатусыЗапросНаОтменуПроведения.Обрабатывается   = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОбрабатываетсяЕГАИС;
	СтатусыЗапросНаОтменуПроведения.ОтменаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПринятИзЕГАИС;
	СтатусыЗапросНаОтменуПроведения.ОшибкаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка;
	СтатусыЗапросНаОтменуПроведения.Ошибка           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка;
	СтатусыЗапросНаОтменуПроведения.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыЗапросНаОтменуПроведения.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
	СтатусыЗапросНаОтменуПроведения.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
	СтатусыЗапросНаОтменуПроведения.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной);
	СтатусыЗапросНаОтменуПроведения.ОтменаПроведенияДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
	СтатусыЗапросНаОтменуПроведения.ОтменаПроведенияДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной);
	СтатусыЗапросНаОтменуПроведения.УведомлениеОРегистрацииДвижения = Ложь;
	
	СтатусыЗапросНаОтменуПроведенияОтказ = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
	СтатусыЗапросНаОтменуПроведенияОтказ.Принят           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Подтвержден;
	СтатусыЗапросНаОтменуПроведенияОтказ.Обрабатывается   = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОбрабатываетсяЕГАИС;
	СтатусыЗапросНаОтменуПроведенияОтказ.ОшибкаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка;
	СтатусыЗапросНаОтменуПроведенияОтказ.Ошибка           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка;
	СтатусыЗапросНаОтменуПроведенияОтказ.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыЗапросНаОтменуПроведенияОтказ.ОшибкаДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОтменитеОперацию);
	СтатусыЗапросНаОтменуПроведенияОтказ.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.НеТребуется);
	СтатусыЗапросНаОтменуПроведенияОтказ.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	СтатусыЗапросНаОтменуПроведенияОтказ.УведомлениеОРегистрацииДвижения = Ложь;
	
	ВыполнитьРасчетТекущегоСостояния = Истина;
	Если ДополнительныеПараметры <> Неопределено
		И ДополнительныеПараметры.Свойство("ТекущееСостояние")
		И ДополнительныеПараметры.ТекущееСостояние <> Неопределено Тогда
		ВыполнитьРасчетТекущегоСостояния = ДополнительныеПараметры.ТекущееСостояние;
	КонецЕсли;
	
	Если Операция = Перечисления.ВидыДокументовЕГАИС.ТТН
		Или Операция = Перечисления.ВидыДокументовЕГАИС.УведомлениеОРегистрацииДвиженияТТН Тогда
		
		Если (ДополнительныеПараметры <> Неопределено) И (ДополнительныеПараметры.ДокументОбъект <> Неопределено) Тогда
			ЗавершенаПроверкаИПодбор = ЗавершенаПроверкаИПодбор(ДополнительныеПараметры.ДокументОбъект);
		Иначе
			ЗавершенаПроверкаИПодбор = ЗавершенаПроверкаИПодбор(ДокументСсылка);
		КонецЕсли;
		
		СтатусыБазовыйПроцесс = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
		СтатусыБазовыйПроцесс.Принят = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПринятИзЕГАИС;
		Если НЕ ЗавершенаПроверкаИПодбор Тогда
			СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ВыполнитеПроверку);
		Иначе 
			СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
		КонецЕсли;
		СтатусыБазовыйПроцесс.ПринятДействия.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной);
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусы(
			ДокументСсылка,
			Перечисления.СтатусыОбработкиСообщенийЕГАИС.ПринятИзЕГАИС,
			СтатусыБазовыйПроцесс);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.КвитанцияАктаРасхожденийОтказ Тогда
		
		Статусы = СтатусыАктТТНРасхождения;
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыПриПолученииКвитанции(
			ДокументСсылка,
			"КвитанцияПроведенЕГАИС", Перечисления.СтатусыОбработкиСообщенийЕГАИС.ДокументОтменен,
			Статусы, Ложь);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.КвитанцияАктаРасхожденийПодтверждение Тогда
		
		Статусы = СтатусыАктТТНРасхождения;
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыПриПолученииКвитанции(
			ДокументСсылка,
			"КвитанцияПроведенЕГАИС", Перечисления.СтатусыОбработкиСообщенийЕГАИС.ДокументПроведен,
			Статусы, Ложь);
			
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.КвитанцияЗапросаНаОтменуПроведенияТТНОтказ Тогда
		
		Статусы = СтатусыЗапросНаОтменуПроведенияОтказ;
		
		ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыПриПолученииКвитанции(
			ДокументСсылка,
			"КвитанцияПроведенЕГАИС", Перечисления.СтатусыОбработкиСообщенийЕГАИС.ДокументПроведен,
			Статусы, Ложь);
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.КвитанцияПолученЕГАИС Тогда
		
		Статусы = Неопределено;
		Если ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.АктТТНПодтверждение Тогда
			
			Статусы = СтатусыАктТТНПодтверждение;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.АктТТНРасхождения Тогда
			
			Статусы = СтатусыАктТТНРасхождения;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.АктТТНОтказ Тогда
			
			Статусы = СтатусыАктТТНОтказ;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН Тогда
			
			ТекущееСостояние = РегистрыСведений.СтатусыДокументовЕГАИС.ТекущееСостояние(ДокументСсылка);
			Если ТекущееСостояние.Статус = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаПереданВУТМ Тогда
				Статусы = СтатусыЗапросНаОтменуПроведения;
				Статусы.Обрабатывается   = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаОбрабатываетсяЕГАИС;
				Статусы.ОшибкаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаОшибка;
				Статусы.Ошибка           = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуАктаОтказаОшибка;
			Иначе
				Статусы = СтатусыЗапросНаОтменуПроведения;
			КонецЕсли;
			
		Иначе
			ВызватьИсключение ОбщегоНазначенияИС.ТекстИсключенияОбработкиСтатуса(ДокументСсылка, Операция);
		КонецЕсли;
		
		Если Статусы <> Неопределено Тогда
			ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыПриПолученииКвитанции(
				ДокументСсылка,
				"КвитанцияПолученЕГАИС", ДополнительныеПараметры.СтатусОбработки,
				Статусы, ВыполнитьРасчетТекущегоСостояния);
		КонецЕсли;
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.КвитанцияПроведенЕГАИС Тогда
		
		Статусы = Неопределено;
		Если ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.АктТТНПодтверждение Тогда
			
			Статусы = СтатусыАктТТНПодтверждение;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.АктТТНРасхождения Тогда
			
			Статусы = СтатусыАктТТНРасхождения;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.АктТТНОтказ Тогда
			
			Статусы = СтатусыАктТТНОтказ;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН Тогда
			
			Статусы = СтатусыЗапросНаОтменуПроведения;
			
		ИначеЕсли ДополнительныеПараметры.ОперацияКвитанции = Неопределено
			И ДополнительныеПараметры.СтатусОбработки = Перечисления.СтатусыОбработкиСообщенийЕГАИС.ДокументРаспроведен Тогда
			
			СтатусыРаспроведение = РегистрыСведений.СтатусыДокументовЕГАИС.СтруктураСтатусы();
			СтатусыРаспроведение.ОтменаПроведения = Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ОтмененПоставщиком;
			
			Статусы = СтатусыРаспроведение;
			
		Иначе
			ВызватьИсключение ОбщегоНазначенияИС.ТекстИсключенияОбработкиСтатуса(ДокументСсылка, Операция);
		КонецЕсли;
		
		Если Статусы <> Неопределено Тогда
			ПараметрыОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.РассчитатьСтатусыПриПолученииКвитанции(
				ДокументСсылка,
				"КвитанцияПроведенЕГАИС", ДополнительныеПараметры.СтатусОбработки,
				Статусы, ВыполнитьРасчетТекущегоСостояния);
		КонецЕсли;
		
	ИначеЕсли Операция = Перечисления.ВидыДокументовЕГАИС.ИсторияСправок2ПоТТН Тогда
	Иначе
		ВызватьИсключение ОбщегоНазначенияИС.ТекстИсключенияОбработкиСтатуса(ДокументСсылка, Операция);
	КонецЕсли;
	
	Возврат ПараметрыОбновления;
	
КонецФункции

//Обновить статус после подготовки к передаче данных
//
//Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Ссылка на документ
//  Операция - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция ЕГАИС
//  ДополнительныеПараметры - Неопределено, Структура - Дополнительные параметры обновления статуса
//
//Возвращаемое значение:
//  ПеречислениеСсылка.СтатусыОбработкиТТНВходящейЕГАИС - Новый статус.
//
Функция ОбновитьСтатусПослеПодготовкиКПередачеДанных(ДокументСсылка, Операция, ДополнительныеПараметры = Неопределено) Экспорт
	
	ПараметрыОбновления = СтатусПослеПодготовкиКПередачеДанных(ДокументСсылка, Операция);
	
	Если ПараметрыОбновления = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	НовыйСтатусПослеОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.ОбновитьСтатус(
		ДокументСсылка,
		ПараметрыОбновления, ДополнительныеПараметры);
	
	Возврат НовыйСтатусПослеОбновления;
	
КонецФункции

//Обновить статус после передачи данных
//
//Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Ссылка на документ
//  Операция - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция ЕГАИС
//  СтатусОбработки - ПеречислениеСсылка.СтатусыОбработкиСообщенийЕГАИС - Статус обработки сообщения
//  ДополнительныеПараметры - Неопределено, Структура - Дополнительные параметры обновления статуса
//
//Возвращаемое значение:
//  ПеречислениеСсылка.СтатусыОбработкиТТНВходящейЕГАИС - Новый статус.
//
Функция ОбновитьСтатусПослеПередачиДанных(ДокументСсылка, Операция, СтатусОбработки, ДополнительныеПараметры = Неопределено) Экспорт
	
	ПараметрыОбновления = СтатусПослеПередачиДанных(ДокументСсылка, Операция, СтатусОбработки);
	
	Если ПараметрыОбновления = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	НовыйСтатусПослеОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.ОбновитьСтатус(
		ДокументСсылка,
		ПараметрыОбновления, ДополнительныеПараметры);
	
	Возврат НовыйСтатусПослеОбновления;
	
КонецФункции

//Обновить статус после получения данных из ЕГАИС.
//
//Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Документ, для которого требуется обновить статус.
//  Операция - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция обмена с ЕГАИС.
//  ДополнительныеПараметры - Неопределено - нет
//                          - Структура    - со свойствами:
//   * СтатусОбработки - ПеречислениеСсылка.СтатусыОбработкиСообщенийЕГАИС - Статус обработки сообщения.
//   * ОперацияКвитанции - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция, на которую получена квитанция.
// 
//Возвращаемое значение:
//  ПеречислениеСсылка.СтатусыОбработкиТТНВходящейЕГАИС - Новый статус.
//
Функция ОбновитьСтатусПослеПолученияДанных(ДокументСсылка, Операция, ДополнительныеПараметры = Неопределено) Экспорт
	
	ПараметрыОбновления = СтатусПослеПолученияДанных(ДокументСсылка, Операция, ДополнительныеПараметры);
	
	Если ПараметрыОбновления = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	НовыйСтатусПослеОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.ОбновитьСтатус(
		ДокументСсылка,
		ПараметрыОбновления, ДополнительныеПараметры);
	
	Возврат НовыйСтатусПослеОбновления;
	
КонецФункции

//Изменяет и возвращает статус документа ЕГАИС.
//
//Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Документ, для которого требуется обновить статус.
//  ПараметрыОбновления - Структура - со свойствами:
//   * НовыйСтатус - ПеречислениеСсылка.СтатусыИнформированияЕГАИС - Новый статус.
//   * ДальнейшееДействие1 - ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - Дальнейшее действие 1.
//   * ДальнейшееДействие2 - ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - Дальнейшее действие 2.
//   * ДальнейшееДействие3 - ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - Дальнейшее действие 3.
//  ДополнительныеПараметры - Неопределено - нет
//                          - Структура    - со свойствами:
//   * СтатусОбработки - ПеречислениеСсылка.СтатусыОбработкиСообщенийЕГАИС - Статус обработки сообщения.
//   * ОперацияКвитанции - ПеречислениеСсылка.ВидыДокументовЕГАИС - Операция, на которую получена квитанция.
//
//Возвращаемое значение:
//  ПеречислениеСсылка.СтатусыИнформированияЕГАИС - новый статус документа ЕГАИС.
//
Функция ОбновитьСтатус(ДокументСсылка, ПараметрыОбновления, ДополнительныеПараметры) Экспорт
	
	НовыйСтатусПослеОбновления = РегистрыСведений.СтатусыДокументовЕГАИС.ОбновитьСтатус(
		ДокументСсылка,
		ПараметрыОбновления, ДополнительныеПараметры);
	
	Возврат НовыйСтатусПослеОбновления;
	
КонецФункции

// Получить последовательность операций в течении жизненного цикла документа.
//
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Документ, для которого требуется обновить статус.
// 
// Возвращаемое значение:
//  ТаблицаЗначений - см. функцию ОбменДаннымиЕГАИС.ПустаяТаблицаПоследовательностьОпераций().
//
Функция ПоследовательностьОпераций(ДокументСсылка) Экспорт
	
	Таблица = ОбменДаннымиЕГАИС.ПустаяТаблицаПоследовательностьОпераций();
	
	Исходящий = Перечисления.ТипыЗапросовИС.Исходящий;
	Входящий  = Перечисления.ТипыЗапросовИС.Входящий;
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 0,  Входящий,  Перечисления.ВидыДокументовЕГАИС.ТТН);
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 0,  Входящий,  Перечисления.ВидыДокументовЕГАИС.УведомлениеОРегистрацииДвиженияТТН);
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 0,  Входящий,  Перечисления.ВидыДокументовЕГАИС.ИсторияСправок2ПоТТН);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, -1, Входящий,  Перечисления.ВидыДокументовЕГАИС.КвитанцияПроведенЕГАИС); // Отмена накладной
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, -2, Входящий,  Перечисления.ВидыДокументовЕГАИС.КвитанцияВходящейТранспортнойНакладной);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 0,  Исходящий, Перечисления.ВидыДокументовЕГАИС.АктТТН, ДокументСсылка);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 1,  Исходящий, Перечисления.ВидыДокументовЕГАИС.АктТТНОтказ,,,Ложь);
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 2,  Исходящий, Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН, ДокументСсылка);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 2,  Исходящий, Перечисления.ВидыДокументовЕГАИС.АктТТНПодтверждение);
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 2,  Исходящий, Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН, ДокументСсылка);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 3,  Исходящий, Перечисления.ВидыДокументовЕГАИС.АктТТНРасхождения);
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 3,  Входящий,  Перечисления.ВидыДокументовЕГАИС.КвитанцияАктаРасхождений);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 31, Входящий,  Перечисления.ВидыДокументовЕГАИС.КвитанцияАктаРасхожденийОтказ);
	
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 32, Входящий,  Перечисления.ВидыДокументовЕГАИС.КвитанцияАктаРасхожденийПодтверждение);
	ОбменДаннымиЕГАИС.ДобавитьОперациюВПоследовательность(Таблица, 32, Исходящий, Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН, ДокументСсылка);
	
	Возврат Таблица;
	
КонецФункции

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

#КонецОбласти

#Область Статусы

//Возвращает статус по умолчанию.
//
//Возвращаемое значение:
//  ПеречислениеСсылка.СтатусыОбработкиТТНВходящейЕГАИС - Статус по умолчанию.
//
Функция СтатусПоУмолчанию() Экспорт
	
	Возврат Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПринятИзЕГАИС;
	
КонецФункции

// Возвращает статусы ошибок.
//
// Возвращаемое значение:
//  Массив из ПеречислениеСсылка.СтатусыОбработкиТТНВходящейЕГАИС - Статусы ошибок.
//
Функция СтатусыОшибок() Экспорт
	
	Статусы = Новый Массив;
	
	Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктПодтвержденияОшибка);
	Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктРасхожденийОшибка);
	Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.АктОтказаОшибка);
	Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка);
	
	Возврат Статусы;
	
КонецФункции

// Возвращает конечные статусы.
// 
// Параметры:
//  ТребуетсяПовторноеОформление - Булево - Требуется повторное оформление
// 
// Возвращаемое значение:
//  Массив из ПеречислениеСсылка.СтатусыОбработкиТТНВходящейЕГАИС - Конечные статусы.
Функция КонечныеСтатусы(ТребуетсяПовторноеОформление = Истина) Экспорт
	
	Статусы = Новый Массив;
	
	Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Отменен);
	Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ОтмененПоставщиком);
	Если Не ТребуетсяПовторноеОформление Тогда
		Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Подтвержден);
		Статусы.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПодтвержденСРасхождениями);
	КонецЕсли;
	
	Возврат Статусы;
	
КонецФункции

// Возвращает дальнейшее действие по умолчанию.
// 
// Возвращаемое значение:
//  ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - Дальнейшее действие по-умолчанию.
//
Функция ДальнейшееДействиеПоУмолчанию() Экспорт
	
	Возврат Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение;
	
КонецФункции

#КонецОбласти

#Область ПанельОбменСЕГАИС

// Возвращает массив дальнейших действий с документом, требующих участия пользователя
// 
// Возвращаемое значение:
// 	Массив из ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - дальшейшие действия
//
Функция ВсеТребующиеДействия() Экспорт
	
	МассивДействий = Новый Массив;
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ВыполнитеПроверку);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучениеАктПодтверждения);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучениеАктРасхождений);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ВыполнитеОбмен);
	
	Возврат МассивДействий;
	
КонецФункции

// Все требующие ожидания.
// 
// Возвращаемое значение:
//  Массив из ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - Все требующие ожидания
Функция ВсеТребующиеОжидания() Экспорт
	
	МассивДействий = Новый Массив;
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПередачуДанныхРегламентнымЗаданием);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПолученЕГАИС);
	МассивДействий.Добавить(Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОжидайтеПолучениеКвитанцииПроведенЕГАИС);
	
	Возврат МассивДействий;
	
КонецФункции

// Возвращает текст запроса для получения количества документов для отработки
// 
// Возвращаемое значение:
//  Строка - Текст запроса
//
Функция ТекстЗапросаПанельОбменСЕГАИСОтработайте() Экспорт
	
	ТекстЗапроса = "
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	КОЛИЧЕСТВО (РАЗЛИЧНЫЕ СтатусыДокументовЕГАИС.Документ) КАК КоличествоДокументов
	|ИЗ
	|	РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|	Документ.ТТНВходящаяЕГАИС КАК ТТНВходящаяЕГАИС
	|ПО
	|	СтатусыДокументовЕГАИС.Документ = ТТНВходящаяЕГАИС.Ссылка
	|ГДЕ
	|	ТТНВходящаяЕГАИС.Ссылка ЕСТЬ НЕ NULL
	|	И НЕ ТТНВходящаяЕГАИС.ПометкаУдаления
	|	И СтатусыДокументовЕГАИС.ДальнейшееДействие1 В(&ВсеТребующиеДействия)
	|	И (ТТНВходящаяЕГАИС.Грузополучатель В(&ОрганизацияЕГАИС)
	|		ИЛИ &БезОтбораПоОрганизацииЕГАИС)
	|	И (ТТНВходящаяЕГАИС.Ответственный = &Ответственный
	|		ИЛИ &Ответственный = НЕОПРЕДЕЛЕНО)
	|";
	Возврат ТекстЗапроса;
	
КонецФункции

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

#КонецОбласти

#Область СообщенияЕГАИС

// Сообщение к передаче XML
//
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС  - Ссылка на документ.
//  ДальнейшееДействие - ПеречислениеСсылка.ДальнейшиеДействияПоВзаимодействиюЕГАИС - Операция ЕГАИС.
//  ДополнительныеПараметры - Неопределено, Структура - дополнительные параметры формирования сообщения XML.
// Возвращаемое значение:
//  Строка - Текст сообщения XML
//
Функция СообщениеКПередачеXML(ДокументСсылка, ДальнейшееДействие, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если ДальнейшееДействие = Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучение Тогда
		
		ЕстьРасхождения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументСсылка, "ЕстьРасхождения");
		
		Если ЕстьРасхождения Тогда
			Возврат АктРасхожденийXML(ДокументСсылка);
		Иначе
			Возврат АктПодтвержденияXML(ДокументСсылка);
		КонецЕсли;
		
	ИначеЕсли ДальнейшееДействие = Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучениеАктПодтверждения Тогда
		
		Возврат АктПодтвержденияXML(ДокументСсылка);
		
	ИначеЕсли ДальнейшееДействие = Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ПодтвердитеПолучениеАктРасхождений Тогда
		
		Возврат АктРасхожденийXML(ДокументСсылка);
		
	ИначеЕсли ДальнейшееДействие = Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ОткажитесьОтНакладной Тогда
		
		Возврат АктОтказаXML(ДокументСсылка);
		
	ИначеЕсли ДальнейшееДействие = Перечисления.ДальнейшиеДействияПоВзаимодействиюЕГАИС.ЗапроситеОтменуПроведения Тогда
		
		Возврат ЗапросНаОтменуПроведенияXML(ДокументСсылка);
		
	КонецЕсли;
	
КонецФункции

// Входящее сообщение.
// 
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Документ ссылка
// 
// Возвращаемое значение:
//  СправочникСсылка.ЕГАИСПрисоединенныеФайлы
Функция ВходящееСообщение(ДокументСсылка) Экспорт
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ЕГАИСПрисоединенныеФайлы.Ссылка        КАК Ссылка,
	|	ЕГАИСПрисоединенныеФайлы.ВладелецФайла КАК ОрганизацияЕГАИС
	|ИЗ
	|	Справочник.ЕГАИСПрисоединенныеФайлы КАК ЕГАИСПрисоединенныеФайлы
	|ГДЕ
	|	ЕГАИСПрисоединенныеФайлы.Документ = &Документ
	|	И ЕГАИСПрисоединенныеФайлы.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Входящий)
	|	И ЕГАИСПрисоединенныеФайлы.Операция = ЗНАЧЕНИЕ(Перечисление.ВидыДокументовЕГАИС.ТТН)
	|");
	
	Запрос.УстановитьПараметр("Документ", ДокументСсылка);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	Иначе
		ВызватьИсключение НСтр("ru='Не найдено входящее сообщение обмена'");
	КонецЕсли;
	
КонецФункции

// Входящее дерево упаковок.
// 
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС
//  Товары - Неопределено - Товары
// 
// Возвращаемое значение:
//  Структура - Входящее дерево упаковок:
// * ДеревоУпаковок - ДеревоЗначений
// * ТоварыБезАкцизныхМарок - ТаблицаЗначений
Функция ВходящееДеревоУпаковок(ДокументСсылка, Товары = Неопределено) Экспорт
	
	ТоварыБезАкцизныхМарок = Новый ТаблицаЗначений;
	ТоварыБезАкцизныхМарок.Колонки.Добавить("АлкогольнаяПродукция");
	ТоварыБезАкцизныхМарок.Колонки.Добавить("Справка2");
	ТоварыБезАкцизныхМарок.Колонки.Добавить("Количество");
	ТоварыБезАкцизныхМарок.Колонки.Добавить("Номенклатура");
	ТоварыБезАкцизныхМарок.Колонки.Добавить("Характеристика");
	ТоварыБезАкцизныхМарок.Колонки.Добавить("Серия");
	
	ДеревоУпаковок = Новый ДеревоЗначений;
	ДеревоУпаковок.Колонки.Добавить("Штрихкод");
	ДеревоУпаковок.Колонки.Добавить("ТипУпаковки");
	ДеревоУпаковок.Колонки.Добавить("АлкогольнаяПродукция");
	ДеревоУпаковок.Колонки.Добавить("Справка2");
	ДеревоУпаковок.Колонки.Добавить("Номенклатура");
	ДеревоУпаковок.Колонки.Добавить("Характеристика");
	ДеревоУпаковок.Колонки.Добавить("Серия");
	
	Если Товары = Неопределено Тогда
		
		Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	ТТНВходящаяЕГАИСТовары.ИдентификаторСтроки  КАК ИдентификаторСтроки,
		|	ТТНВходящаяЕГАИСТовары.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
		|	ТТНВходящаяЕГАИСТовары.Номенклатура         КАК Номенклатура,
		|	ТТНВходящаяЕГАИСТовары.Характеристика       КАК Характеристика,
		|	ТТНВходящаяЕГАИСТовары.Серия                КАК Серия,
		|	ТТНВходящаяЕГАИСТовары.Справка2             КАК Справка2,
		|	ТТНВходящаяЕГАИСТовары.Количество           КАК Количество,
		|	ЕСТЬNULL(ТТНВходящаяЕГАИСТовары.АлкогольнаяПродукция.ВидПродукции.Маркируемый, ЛОЖЬ) КАК Маркируемый
		|ИЗ
		|	Документ.ТТНВходящаяЕГАИС.Товары КАК ТТНВходящаяЕГАИСТовары
		|ГДЕ
		|	ТТНВходящаяЕГАИСТовары.Ссылка = &Ссылка
		|");
		
		Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
		
		ТаблицаТовары = Запрос.Выполнить().Выгрузить();
		
	Иначе
		
		ТаблицаТовары = Товары;
		
	КонецЕсли;
	
	Результат = ДанныеДокументаТТНv3(ДокументСсылка);
	
	Если Результат <> Неопределено
		И (Результат.ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3
			Или Результат.ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V4) Тогда
		
		Для Каждого ЭлементДанных Из Результат.Данные.Content.Position Цикл
			
			MarkInfo = ЭлементДанных.InformF2.MarkInfo;
			
			ШтрихкодыУпаковкиСправки2 = Новый Соответствие;
			КоличествоАкцизныхМарок = 0;
			
			СтрокаТЧ = ТаблицаТовары.Найти(ЭлементДанных.Identity, "ИдентификаторСтроки");
			
			Если MarkInfo <> Неопределено Тогда
				
				Для Каждого boxpos Из MarkInfo.boxpos Цикл
					
					ШтрихкодУпаковки = Строка(boxpos.boxnumber);
					
					ДанныеШтрихкодаУпаковки = Новый Структура;
					ДанныеШтрихкодаУпаковки.Вставить("АкцизныеМарки", Новый Массив);
					
					Если СтрокаТЧ <> Неопределено Тогда
						ДанныеШтрихкодаУпаковки.Вставить("АлкогольнаяПродукция", СтрокаТЧ.АлкогольнаяПродукция);
						ДанныеШтрихкодаУпаковки.Вставить("Справка2",             СтрокаТЧ.Справка2);
						ДанныеШтрихкодаУпаковки.Вставить("Номенклатура",         СтрокаТЧ.Номенклатура);
						ДанныеШтрихкодаУпаковки.Вставить("Характеристика",       СтрокаТЧ.Характеристика);
						ДанныеШтрихкодаУпаковки.Вставить("Серия",                СтрокаТЧ.Серия);
					Иначе
						ДанныеШтрихкодаУпаковки.Вставить("АлкогольнаяПродукция");
						ДанныеШтрихкодаУпаковки.Вставить("Справка2");
						ДанныеШтрихкодаУпаковки.Вставить("Номенклатура");
						ДанныеШтрихкодаУпаковки.Вставить("Характеристика");
						ДанныеШтрихкодаУпаковки.Вставить("Серия");
					КонецЕсли;
					
					//Неименованных коробок может быть несколько, они гарантированно на верхнем уровне
					Если Не ЗначениеЗаполнено(ШтрихкодУпаковки) И ШтрихкодыУпаковкиСправки2.Получить(ШтрихкодУпаковки)<>Неопределено Тогда
						ДобавленыРанее = ШтрихкодыУпаковкиСправки2.Получить(ШтрихкодУпаковки).АкцизныеМарки;
						Для Каждого КодАкцизнойМарки Из ДобавленыРанее Цикл
							ДанныеШтрихкодаУпаковки.АкцизныеМарки.Добавить(КодАкцизнойМарки);
						КонецЦикла;
					КонецЕсли;
					
					Если boxpos.amclist <> Неопределено Тогда
						Для Каждого КодАкцизнойМарки Из boxpos.amclist.amc Цикл
							ДанныеШтрихкодаУпаковки.АкцизныеМарки.Добавить(КодАкцизнойМарки);
							КоличествоАкцизныхМарок = КоличествоАкцизныхМарок + 1;
						КонецЦикла;
					КонецЕсли;
					
					ШтрихкодыУпаковкиСправки2.Вставить(ШтрихкодУпаковки, ДанныеШтрихкодаУпаковки);
					
				КонецЦикла;
				
			КонецЕсли;
			
			Если ЭлементДанных.Quantity <> КоличествоАкцизныхМарок
				И СтрокаТЧ <> Неопределено Тогда
				СтрокаТаблицы = ТоварыБезАкцизныхМарок.Добавить();
				СтрокаТаблицы.АлкогольнаяПродукция = СтрокаТЧ.АлкогольнаяПродукция;
				СтрокаТаблицы.Справка2             = СтрокаТЧ.Справка2;
				СтрокаТаблицы.Количество           = ЭлементДанных.Quantity - КоличествоАкцизныхМарок;
				СтрокаТаблицы.Номенклатура         = СтрокаТЧ.Номенклатура;
				СтрокаТаблицы.Характеристика       = СтрокаТЧ.Характеристика;
				СтрокаТаблицы.Серия                = СтрокаТЧ.Серия;
			КонецЕсли;
			
			Если ЭлементДанных.boxInfo <> Неопределено Тогда
				
				ДобавитьУпаковкиВДерево(ДеревоУпаковок, ЭлементДанных.boxInfo.boxtree, ШтрихкодыУпаковкиСправки2);
				
			КонецЕсли;
			
			Если ШтрихкодыУпаковкиСправки2.Количество() <> 0 Тогда
				
				КодыУпаковок = Новый Массив;
				
				Для Каждого КлючЗначение Из ШтрихкодыУпаковкиСправки2 Цикл
					
					ДанныеУпаковки = Новый Структура;
					ДанныеУпаковки.Вставить("bl", Неопределено);
					ДанныеУпаковки.Вставить("boxnum", Новый Массив);
					ДанныеУпаковки.boxnum.Добавить(КлючЗначение.Ключ);
					
					КодыУпаковок.Добавить(ДанныеУпаковки);
					
				КонецЦикла;
				
				ДобавитьУпаковкиВДерево(ДеревоУпаковок, КодыУпаковок, ШтрихкодыУпаковкиСправки2);
				
			КонецЕсли;
			
		КонецЦикла;
		
	Иначе
		
		Для Каждого СтрокаТЧ Из ТаблицаТовары Цикл
			
			СтрокаТаблицы = ТоварыБезАкцизныхМарок.Добавить();
			СтрокаТаблицы.АлкогольнаяПродукция = СтрокаТЧ.АлкогольнаяПродукция;
			СтрокаТаблицы.Справка2             = СтрокаТЧ.Справка2;
			СтрокаТаблицы.Количество           = СтрокаТЧ.Количество;
			СтрокаТаблицы.Номенклатура         = СтрокаТЧ.Номенклатура;
			СтрокаТаблицы.Характеристика       = СтрокаТЧ.Характеристика;
			СтрокаТаблицы.Серия                = СтрокаТЧ.Серия;
			
		КонецЦикла;
		
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ДеревоУпаковок",         ДеревоУпаковок);
	Результат.Вставить("ТоварыБезАкцизныхМарок", ТоварыБезАкцизныхМарок);
	
	Возврат Результат;
	
КонецФункции

// Входящие акцизные марки.
// 
// Параметры:
//  ДокументСсылка - ДокументСсылка.ТТНВходящаяЕГАИС - Документ ссылка
//  Товары - Неопределено, ТаблицаЗначений - Товары
// 
// Возвращаемое значение:
//  ТаблицаЗначений - Входящие акцизные марки:
// * Справка2 - СправочникСсылка.Справки2ЕГАИС - 
// * Штрихкод - Строка - 
Функция ВходящиеАкцизныеМарки(ДокументСсылка, Товары = Неопределено) Экспорт
	
	Если Товары = Неопределено Тогда
		Товары = ИнтеграцияЕГАИС.Справки2ПоДокументу(ДокументСсылка);
	КонецЕсли;
	
	АкцизныеМарки = Новый ТаблицаЗначений;
	АкцизныеМарки.Колонки.Добавить("Справка2", Новый ОписаниеТипов("СправочникСсылка.Справки2ЕГАИС"));
	АкцизныеМарки.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(200)));
	
	Результат = ДанныеДокументаТТНv3(ДокументСсылка);
	
	Если Результат <> Неопределено
		И (Результат.ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3
			Или Результат.ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V4) Тогда
		
		Для Каждого ЭлементДанных Из Результат.Данные.Content.Position Цикл
			
			MarkInfo = ЭлементДанных.InformF2.MarkInfo;
			
			СтрокаТЧ = Товары.Найти(ЭлементДанных.Identity, "ИдентификаторСтроки");
			Если СтрокаТЧ <> Неопределено Тогда
				Справка2 = СтрокаТЧ.Справка2;
			Иначе
				Справка2 = Неопределено;
			КонецЕсли;
			
			Если MarkInfo <> Неопределено Тогда
				
				Для Каждого boxpos Из MarkInfo.boxpos Цикл
					
					Если boxpos.amclist <> Неопределено Тогда
						Для Каждого КодАкцизнойМарки Из boxpos.amclist.amc Цикл
							НоваяСтрока = АкцизныеМарки.Добавить();
							НоваяСтрока.Справка2 = Справка2;
							НоваяСтрока.Штрихкод = КодАкцизнойМарки;
						КонецЦикла;
					КонецЕсли;
					
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат АкцизныеМарки;
	
КонецФункции

#КонецОбласти

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Списки) Экспорт

	Списки.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)
	|	И ЗначениеРазрешено(ТорговыйОбъект)
	|	И ВЫБОР
	|		КОГДА Грузоотправитель.Сопоставлено И Грузоотправитель.СоответствуетОрганизации
	|			ТОГДА ЗначениеРазрешено(Грузоотправитель.Контрагент)
	|		КОГДА Грузоотправитель.Сопоставлено И НЕ Грузоотправитель.СоответствуетОрганизации
	|			ТОГДА ЗначениеРазрешено(Грузоотправитель.ТорговыйОбъект)
	|		ИНАЧЕ ИСТИНА
	|	КОНЕЦ
	|	И ВЫБОР
	|		КОГДА Грузополучатель.Сопоставлено И Грузополучатель.СоответствуетОрганизации
	|			ТОГДА ЗначениеРазрешено(Грузополучатель.Контрагент)
	|		КОГДА Грузополучатель.Сопоставлено И НЕ Грузополучатель.СоответствуетОрганизации
	|			ТОГДА ЗначениеРазрешено(Грузополучатель.ТорговыйОбъект)
	|	ИНАЧЕ ИСТИНА
	|	КОНЕЦ";

КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область СообщенияЕГАИС

Функция АктПодтвержденияXML(ДокументСсылка)
	
	СообщенияXML = Новый Массив;
	
	Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНПодтверждение;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЕГАИСПрисоединенныеФайлы.Документ           КАК Ссылка,
	|	КОЛИЧЕСТВО(ЕГАИСПрисоединенныеФайлы.Ссылка) КАК ПоследнийНомер
	|ПОМЕСТИТЬ Версии
	|ИЗ
	|	Справочник.ЕГАИСПрисоединенныеФайлы КАК ЕГАИСПрисоединенныеФайлы
	|ГДЕ
	|	ЕГАИСПрисоединенныеФайлы.Документ = &Ссылка
	|	И ЕГАИСПрисоединенныеФайлы.Операция = &Операция
	|	И ЕГАИСПрисоединенныеФайлы.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Исходящий)
	|СГРУППИРОВАТЬ ПО
	|	ЕГАИСПрисоединенныеФайлы.Документ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Шапка.Номер                        КАК Номер,
	|	Шапка.Дата                         КАК Дата,
	|	ЕСТЬNULL(Версии.ПоследнийНомер, 0) КАК ПоследнийНомерВерсии,
	|	Шапка.ДокументОснование            КАК ДокументОснование,
	|	
	|	Шапка.ИдентификаторЕГАИС                    КАК ИдентификаторЕГАИС,
	|	ВЫРАЗИТЬ(Шапка.Комментарий КАК Строка(500)) КАК Комментарий,
	|	
	|	Шапка.Грузополучатель               КАК ОрганизацияЕГАИС,
	|	Шапка.Грузополучатель.Код           КАК ИдентификаторФСРАР,
	|	Шапка.Грузоотправитель.ФорматОбмена КАК ФорматОбменаГрузоотправителя,
	|	Шапка.Грузополучатель.ФорматОбмена  КАК ФорматОбменаГрузополучателя,
	|	Шапка.ФорматОбмена                  КАК ФорматОбмена,
	|	Шапка.Ответственный                 КАК Ответственный,
	|	ВЫБОР
	|		КОГДА Шапка.Грузополучатель.ИНН = Шапка.Грузоотправитель.ИНН
	|			ТОГДА ЛОЖЬ
	|		ИНАЧЕ Не Шапка.ТоварВПутиПринадлежитГрузополучателю
	|	КОНЕЦ КАК СменаСобственника
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС КАК Шапка,
	|		ЛЕВОЕ СОЕДИНЕНИЕ Версии КАК Версии
	|		ПО Шапка.Ссылка = Версии.Ссылка
	|ГДЕ
	|	Шапка.Ссылка = &Ссылка
	|");
	
	Запрос.УстановитьПараметр("Ссылка",   ДокументСсылка);
	Запрос.УстановитьПараметр("Операция", Операция);
	
	Шапка = Запрос.Выполнить().Выбрать();
	
	Если Не Шапка.Следующий() Тогда
		
		СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
		СообщениеXML.Документ = ДокументСсылка;
		СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
			Операция, ДокументСсылка);
		
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Нет данных для выгрузки.'"));
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	НомерВерсии = Шапка.ПоследнийНомерВерсии + 1;
	ФорматОбмена = ФорматОбмена(Шапка);

	СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
	СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
		Операция, ДокументСсылка, НомерВерсии);
	
	ПространствоИмен = Перечисления.ВидыДокументовЕГАИС.ПространствоИмен(Операция, ФорматОбмена);
	ИмяТипа          = Перечисления.ВидыДокументовЕГАИС.ТипЕГАИС(Операция, ФорматОбмена);
	
	Если ПространствоИмен = Неопределено
		Или ИмяТипа = Неопределено Тогда
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
			СообщениеXML,
			СтрШаблон(НСтр("ru = 'Операция не поддерживается в версии формата обмена: %1.'"), ФорматОбмена));
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
	КонецЕсли;
	
	#Область АктТТНПодтверждение
	
	Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V1 Тогда
		
		#Область ФорматОбмена_V1
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "awb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Accepted",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		#КонецОбласти
		
	ИначеЕсли ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V2 Тогда
		
		#Область ФорматОбмена_V2
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v2");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "awb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Accepted",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		#КонецОбласти
		
	Иначе
		
		Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3 Тогда
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v3");
		Иначе
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v4");
		КонецЕсли;
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "awb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Accepted",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		Если ФорматОбмена <> Перечисления.ФорматыОбменаЕГАИС.V3 Тогда
			
			АктXDTO.Transport = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Transport");
			Если Шапка.СменаСобственника Тогда
				АктXDTO.Transport.ChangeOwnership = "IsChange";
			Иначе
				АктXDTO.Transport.ChangeOwnership = "NotChange";
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	#КонецОбласти
	
	ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(АктXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
	
	СообщениеXML.ТекстСообщенияXML = ТекстСообщенияXML;
	СообщениеXML.ТипСообщения      = Перечисления.ТипыЗапросовИС.Исходящий;
	СообщениеXML.ОрганизацияЕГАИС  = Шапка.ОрганизацияЕГАИС;
	СообщениеXML.Операция          = Операция;
	СообщениеXML.ФорматОбмена      = ФорматОбмена;
	СообщениеXML.Документ          = ДокументСсылка;
	СообщениеXML.ДокументОснование = Шапка.ДокументОснование;
	СообщениеXML.Версия            = НомерВерсии;
	
	СообщенияXML.Добавить(СообщениеXML);
	
	Возврат СообщенияXML;
	
КонецФункции

Функция АктРасхожденийXML(ДокументСсылка)
	
	СообщенияXML = Новый Массив;
	
	Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНРасхождения;
	
	ТекстыЗапроса = Новый СписокЗначений;
	
	ТекстыЗапроса.Добавить(
		"ВЫБРАТЬ
		|	ЕГАИСПрисоединенныеФайлы.Документ           КАК Ссылка,
		|	КОЛИЧЕСТВО(ЕГАИСПрисоединенныеФайлы.Ссылка) КАК ПоследнийНомер
		|ПОМЕСТИТЬ Версии
		|ИЗ
		|	Справочник.ЕГАИСПрисоединенныеФайлы КАК ЕГАИСПрисоединенныеФайлы
		|ГДЕ
		|	ЕГАИСПрисоединенныеФайлы.Документ = &Ссылка
		|	И ЕГАИСПрисоединенныеФайлы.Операция = &Операция
		|	И ЕГАИСПрисоединенныеФайлы.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Исходящий)
		|СГРУППИРОВАТЬ ПО
		|	ЕГАИСПрисоединенныеФайлы.Документ
		|;
		|
		|//#РезультатЗапроса#////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Шапка.Номер                        КАК Номер,
		|	Шапка.Дата                         КАК Дата,
		|	ЕСТЬNULL(Версии.ПоследнийНомер, 0) КАК ПоследнийНомерВерсии,
		|	Шапка.ДокументОснование            КАК ДокументОснование,
		|	
		|	Шапка.ИдентификаторЕГАИС                    КАК ИдентификаторЕГАИС,
		|	ВЫРАЗИТЬ(Шапка.Комментарий КАК Строка(500)) КАК Комментарий,
		|	
		|	Шапка.Грузополучатель               КАК ОрганизацияЕГАИС,
		|	Шапка.Грузополучатель.Код           КАК ИдентификаторФСРАР,
		|	Шапка.Грузоотправитель.ФорматОбмена КАК ФорматОбменаГрузоотправителя,
		|	Шапка.Грузополучатель.ФорматОбмена  КАК ФорматОбменаГрузополучателя,
		|	Шапка.ФорматОбмена                  КАК ФорматОбмена,
		|	Шапка.Ответственный                 КАК Ответственный
		|ИЗ
		|	Документ.ТТНВходящаяЕГАИС КАК Шапка,
		|		ЛЕВОЕ СОЕДИНЕНИЕ Версии КАК Версии
		|		ПО Шапка.Ссылка = Версии.Ссылка
		|ГДЕ
		|	Шапка.Ссылка = &Ссылка
		|",
		"Шапка");
	
	ТекстыЗапроса.Добавить(
		"ВЫБРАТЬ
		|	Товары.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
		|	Товары.Номенклатура         КАК Номенклатура,
		|	Товары.Характеристика       КАК Характеристика,
		|	Товары.Серия                КАК Серия,
		|	Товары.НомерСтроки          КАК НомерСтроки,
		|	Товары.ИдентификаторСтроки  КАК ИдентификаторСтроки,
		|	Товары.Справка2             КАК Справка2,
		|	Товары.Количество           КАК Количество,
		|	Товары.КоличествоФакт       КАК КоличествоФакт
		|ПОМЕСТИТЬ ВТТовары
		|ИЗ
		|	Документ.ТТНВходящаяЕГАИС.Товары КАК Товары
		|ГДЕ
		|	Товары.Ссылка = &Ссылка");
	
	ТекстыЗапроса.Добавить(
		ИнтеграцияЕГАИС.ТекстЗапросаВТКоэффициентыПересчетаВЕдиницыЕГАИС(
			"ВТТовары",
			"ВТКоэффициентыПересчетаВЕдиницыЕГАИС"));
	
	ТекстыЗапроса.Добавить(
		"ВЫБРАТЬ
		|	Товары.НомерСтроки                   КАК НомерСтроки,
		|	Товары.ИдентификаторСтроки           КАК ИдентификаторСтроки,
		|	Товары.Справка2                      КАК Справка2,
		|	Товары.Справка2.РегистрационныйНомер КАК НомерСправки2,
		|	Товары.АлкогольнаяПродукция          КАК АлкогольнаяПродукция,
		|	Товары.Количество                    КАК Количество,
		|	Товары.КоличествоФакт                КАК КоличествоФакт,
		|	
		|	ЕСТЬNULL(ЕдиницыЕГАИС.ПроверятьОбъемДАЛ, ЛОЖЬ) КАК ПроверятьОбъемДАЛ,
		|	ЕСТЬNULL(ЕдиницыЕГАИС.ОбъемДАЛ, 0)             КАК ОбъемДАЛ
		|ИЗ
		|	ВТТовары КАК Товары
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКоэффициентыПересчетаВЕдиницыЕГАИС КАК ЕдиницыЕГАИС
		|		ПО ЕдиницыЕГАИС.АлкогольнаяПродукция = Товары.АлкогольнаяПродукция
		|		 И ЕдиницыЕГАИС.Номенклатура = Товары.Номенклатура
		|		 И ЕдиницыЕГАИС.Характеристика = Товары.Характеристика
		|		 И ЕдиницыЕГАИС.Серия = Товары.Серия
		|",
		"Товары");
	
	ПараметрыФормированияТекстаЗапроса = ШтрихкодированиеЕГАИС.ПараметрыФормированияТекстаЗапросаВложенныхШтрихкодов();
	ПараметрыФормированияТекстаЗапроса.ДокументСсылка                  = ДокументСсылка;
	ПараметрыФормированияТекстаЗапроса.ИспользоватьИдентификаторСтроки = Ложь;
	ПараметрыФормированияТекстаЗапроса.ИмяПоляОрганизацияЕГАИС         = "Грузополучатель";
	ТекстыЗапроса.Добавить(
		ШтрихкодированиеЕГАИС.ТекстЗапросаВложенныхШтрихкодовПоДокументу(ПараметрыФормированияТекстаЗапроса),
		"ВложенныеШтрихкоды");
	
	ПустыеЗначенияНоменклатуры = ИнтеграцияИС.НезаполненныеЗначенияОпределяемогоТипа(Метаданные.ОпределяемыеТипы.Номенклатура);
	
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Ссылка",                     ДокументСсылка);
	Запрос.УстановитьПараметр("Операция",                   Операция);
	Запрос.УстановитьПараметр("ПустыеЗначенияНоменклатуры", ПустыеЗначенияНоменклатуры);
	РезультатыЗапроса = ОбщегоНазначенияИС.ВыполнитьПакетЗапросов(Запрос, ТекстыЗапроса);
	
	//@skip-warning
	Шапка  = РезультатыЗапроса["Шапка"].Выбрать();
	//@skip-warning
	Товары = РезультатыЗапроса["Товары"].Выгрузить();
	
	Если Не Шапка.Следующий()
		Или Товары.Количество() = 0 Тогда
		
		СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
		СообщениеXML.Документ = ДокументСсылка;
		СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
			Операция, ДокументСсылка);
		
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Нет данных для выгрузки.'"));
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	Если Товары.Итог("КоличествоФакт") = 0 Тогда
		
		СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
		СообщениеXML.Документ = ДокументСсылка;
		СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
			Операция, ДокументСсылка);
		
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
			СообщениеXML,
			НСтр("ru = 'Некорректная операция. Для передачи факта отказа необходимо воспользоваться командой ""Отказаться от накладной"".'"));
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	Если Товары.Итог("КоличествоФакт") = Товары.Итог("Количество") Тогда
		
		ПрерватьВыполнение = Ложь;
		Для Каждого СтрокаТЧ Из Товары Цикл
			Если СтрокаТЧ.КоличествоФакт <> СтрокаТЧ.Количество Тогда
				ПрерватьВыполнение = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если Не ПрерватьВыполнение Тогда
			
			СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
			СообщениеXML.Документ = ДокументСсылка;
			СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
				Операция, ДокументСсылка);
			
			ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
				СообщениеXML,
				НСтр("ru = 'Некорректная операция. Для передачи факта полного подтверждения необходимо воспользоваться командой ""Принять без расхождений"".'"));
			
			СообщенияXML.Добавить(СообщениеXML);
			Возврат СообщенияXML;
			
		КонецЕсли;
		
	КонецЕсли;
	
	НомерВерсии = Шапка.ПоследнийНомерВерсии + 1;
	ФорматОбмена = ФорматОбмена(Шапка);

	СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
	СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
		Операция, ДокументСсылка, НомерВерсии);
	
	ПространствоИмен = Перечисления.ВидыДокументовЕГАИС.ПространствоИмен(Операция, ФорматОбмена);
	ИмяТипа          = Перечисления.ВидыДокументовЕГАИС.ТипЕГАИС(Операция, ФорматОбмена);
	
	Если ПространствоИмен = Неопределено
		Или ИмяТипа = Неопределено Тогда
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
			СообщениеXML,
			СтрШаблон(НСтр("ru = 'Операция не поддерживается в версии формата обмена: %1.'"), ФорматОбмена));
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
	КонецЕсли;
	
	#Область АктТТНРасхождения
	
	Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V1 Тогда
		
		#Область ФорматОбмена_V1
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "rwb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Accepted",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			НомерСтроки = Формат(СтрокаТЧ.НомерСтроки, "ЧГ=0");
			
			Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "PositionType");
			
			Если СтрокаТЧ.ПроверятьОбъемДАЛ
				И Не ЗначениеЗаполнено(СтрокаТЧ.ОбъемДАЛ) Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, СтрШаблон(НСтр("ru = 'Для номенклатуры в строке %1 не установлен объем в декалитрах.'"), НомерСтроки));
			КонецЕсли;
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity",     СтрокаТЧ.ИдентификаторСтроки, СообщениеXML, 5);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "InformBRegId", СтрокаТЧ.НомерСправки2,       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "RealQuantity", СтрокаТЧ.КоличествоФакт,      СообщениеXML);
			
			АктXDTO.Content.Position.Добавить(Position);
			
			Если СтрокаТЧ.КоличествоФакт > СтрокаТЧ.Количество Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
					СтрШаблон(
						НСтр("ru = 'По алкогольной продукции %1 (номер справки 2: %2) фактическое количество (%3) превышает количество в ТТН (%4).'"),
						СтрокаТЧ.АлкогольнаяПродукция,
						СтрокаТЧ.НомерСправки2,
						СтрокаТЧ.КоличествоФакт,
						СтрокаТЧ.Количество));
			КонецЕсли;
			
		КонецЦикла;
		
		#КонецОбласти
		
	ИначеЕсли ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V2 Тогда
		
		#Область ФорматОбмена_V2
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v2");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "rwb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Differences",            СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			НомерСтроки = Формат(СтрокаТЧ.НомерСтроки, "ЧГ=0");
			
			Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "PositionType");
			
			Если СтрокаТЧ.ПроверятьОбъемДАЛ
				И Не ЗначениеЗаполнено(СтрокаТЧ.ОбъемДАЛ) Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, СтрШаблон(НСтр("ru = 'Для номенклатуры в строке %1 не установлен объем в декалитрах.'"), НомерСтроки));
			КонецЕсли;
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity",      СтрокаТЧ.ИдентификаторСтроки, СообщениеXML, 5);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "InformF2RegId", СтрокаТЧ.НомерСправки2,       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "RealQuantity",  СтрокаТЧ.КоличествоФакт,      СообщениеXML);
			
			АктXDTO.Content.Position.Добавить(Position);
			
			Если СтрокаТЧ.КоличествоФакт > СтрокаТЧ.Количество Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
					СтрШаблон(
						НСтр("ru = 'По алкогольной продукции %1 (номер справки 2: %2) фактическое количество (%3) превышает количество в ТТН (%4).'"),
						СтрокаТЧ.АлкогольнаяПродукция,
						СтрокаТЧ.НомерСправки2,
						СтрокаТЧ.КоличествоФакт,
						СтрокаТЧ.Количество));
			КонецЕсли;
			
		КонецЦикла;
		
		#КонецОбласти
		
	Иначе
		
		ВходящиеАкцизныеМарки = ВходящиеАкцизныеМарки(ДокументСсылка, Товары);
		ВходящиеАкцизныеМарки.Индексы.Добавить("Справка2");
		
		//@skip-warning
		Выборка = РезультатыЗапроса["ВложенныеШтрихкоды"].Выбрать();
		ВложенныеШтрихкодыУпаковок = ШтрихкодированиеЕГАИС.ВложенныеШтрихкодыУпаковокПоВыборкеИМенеджеруВТ(
			Выборка, МенеджерВременныхТаблиц);
		
		ЗначенияШтрихкодов = ВложенныеШтрихкодыУпаковок.МаркированныеТовары;
		ЗначенияШтрихкодов.Индексы.Добавить("Штрихкод");
		
		Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3 Тогда
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v3");
		Иначе
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v4");
		КонецЕсли;
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "rwb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Differences",            СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			НомерСтроки = Формат(СтрокаТЧ.НомерСтроки, "ЧГ=0");
			
			Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "PositionType");
			
			Если СтрокаТЧ.ПроверятьОбъемДАЛ
				И Не ЗначениеЗаполнено(СтрокаТЧ.ОбъемДАЛ) Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, СтрШаблон(НСтр("ru = 'Для номенклатуры в строке %1 не установлен объем в декалитрах.'"), НомерСтроки));
			КонецЕсли;
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity",      СтрокаТЧ.ИдентификаторСтроки, СообщениеXML, 5);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "InformF2RegId", СтрокаТЧ.НомерСправки2,       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "RealQuantity",  СтрокаТЧ.КоличествоФакт,      СообщениеXML);
			
			АктXDTO.Content.Position.Добавить(Position);
			
			Если СтрокаТЧ.КоличествоФакт > СтрокаТЧ.Количество Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
					СтрШаблон(
						НСтр("ru = 'По алкогольной продукции %1 (номер справки 2: %2) фактическое количество (%3) превышает количество в ТТН (%4).'"),
						СтрокаТЧ.АлкогольнаяПродукция,
						СтрокаТЧ.НомерСправки2,
						СтрокаТЧ.КоличествоФакт,
						СтрокаТЧ.Количество));
			КонецЕсли;
			
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("Справка2", СтрокаТЧ.Справка2);
			НайденныеСтроки = ВходящиеАкцизныеМарки.НайтиСтроки(ПараметрыОтбора);
			
			КоличествоАкцизныхМарок = НайденныеСтроки.Количество();
			
			Если КоличествоАкцизныхМарок > 0 Тогда
				
				Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
					
					Если ЗначенияШтрихкодов.Найти(НайденнаяСтрока.Штрихкод, "Штрихкод") <> Неопределено Тогда
						Продолжить;
					КонецЕсли;
					
					Если Position.MarkInfo = Неопределено Тогда
						Position.MarkInfo = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "MarkInfo");
					КонецЕсли;
					
					Position.MarkInfo.amc.Добавить(НайденнаяСтрока.Штрихкод);
					
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если ФорматОбмена <> Перечисления.ФорматыОбменаЕГАИС.V3 Тогда
			
			АктXDTO.Transport = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Transport");
			АктXDTO.Transport.ChangeOwnership = "IsChange";
			
		КонецЕсли;
		
	КонецЕсли;
	
	#КонецОбласти
	
	ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(АктXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
	
	СообщениеXML.ТекстСообщенияXML = ТекстСообщенияXML;
	СообщениеXML.ТипСообщения      = Перечисления.ТипыЗапросовИС.Исходящий;
	СообщениеXML.ОрганизацияЕГАИС  = Шапка.ОрганизацияЕГАИС;
	СообщениеXML.Операция          = Операция;
	СообщениеXML.ФорматОбмена      = ФорматОбмена;
	СообщениеXML.Документ          = ДокументСсылка;
	СообщениеXML.ДокументОснование = Шапка.ДокументОснование;
	СообщениеXML.Версия            = НомерВерсии;
	
	СообщенияXML.Добавить(СообщениеXML);
	
	Возврат СообщенияXML;
	
КонецФункции

Функция АктОтказаXML(ДокументСсылка)
	
	СообщенияXML = Новый Массив;
	
	Операция = Перечисления.ВидыДокументовЕГАИС.АктТТНОтказ;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЕГАИСПрисоединенныеФайлы.Документ      КАК Ссылка,
	|	КОЛИЧЕСТВО(ЕГАИСПрисоединенныеФайлы.Ссылка) КАК ПоследнийНомер
	|ПОМЕСТИТЬ Версии
	|ИЗ
	|	Справочник.ЕГАИСПрисоединенныеФайлы КАК ЕГАИСПрисоединенныеФайлы
	|ГДЕ
	|	ЕГАИСПрисоединенныеФайлы.Документ = &Ссылка
	|	И ЕГАИСПрисоединенныеФайлы.Операция = &Операция
	|	И ЕГАИСПрисоединенныеФайлы.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Исходящий)
	|СГРУППИРОВАТЬ ПО
	|	ЕГАИСПрисоединенныеФайлы.Документ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Шапка.Номер                        КАК Номер,
	|	Шапка.Дата                         КАК Дата,
	|	ЕСТЬNULL(Версии.ПоследнийНомер, 0) КАК ПоследнийНомерВерсии,
	|	Шапка.ДокументОснование            КАК ДокументОснование,
	|	
	|	Шапка.ИдентификаторЕГАИС   КАК ИдентификаторЕГАИС,
	|	ВЫРАЗИТЬ(Шапка.Комментарий КАК Строка(500)) КАК Комментарий,
	|	
	|	Шапка.Грузополучатель               КАК ОрганизацияЕГАИС,
	|	Шапка.Грузополучатель.Код           КАК ИдентификаторФСРАР,
	|	Шапка.Грузоотправитель.ФорматОбмена КАК ФорматОбменаГрузоотправителя,
	|	Шапка.Грузополучатель.ФорматОбмена  КАК ФорматОбменаГрузополучателя,
	|	Шапка.ФорматОбмена                  КАК ФорматОбмена,
	|	Шапка.Ответственный                 КАК Ответственный
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС КАК Шапка,
	|		ЛЕВОЕ СОЕДИНЕНИЕ Версии КАК Версии
	|		ПО Шапка.Ссылка = Версии.Ссылка
	|ГДЕ
	|	Шапка.Ссылка = &Ссылка
	|");
	
	Запрос.УстановитьПараметр("Ссылка",   ДокументСсылка);
	Запрос.УстановитьПараметр("Операция", Операция);
	
	Шапка = Запрос.Выполнить().Выбрать();
	
	Если Не Шапка.Следующий() Тогда
		
		СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
		СообщениеXML.Документ = ДокументСсылка;
		СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
			Операция, ДокументСсылка);
		
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Нет данных для выгрузки.'"));
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	НомерВерсии = Шапка.ПоследнийНомерВерсии + 1;
	ФорматОбмена = ФорматОбмена(Шапка);
	
	СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
	СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
		Операция, ДокументСсылка, НомерВерсии);
	
	ПространствоИмен = Перечисления.ВидыДокументовЕГАИС.ПространствоИмен(Операция, ФорматОбмена);
	ИмяТипа          = Перечисления.ВидыДокументовЕГАИС.ТипЕГАИС(Операция, ФорматОбмена);
	
	Если ПространствоИмен = Неопределено
		Или ИмяТипа = Неопределено Тогда
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
			СообщениеXML,
			СтрШаблон(НСтр("ru = 'Операция не поддерживается в версии формата обмена: %1.'"), ФорматОбмена));
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
	КонецЕсли;
	
	#Область АктТТНОтказ
	
	Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V1 Тогда
		
		#Область ФорматОбмена_V1
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "cwb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Rejected",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		#КонецОбласти
		
	ИначеЕсли ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V2 Тогда
		
		#Область ФорматОбмена_V2
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v2");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "cwb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Rejected",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		#КонецОбласти
		
	Иначе
		
		Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3 Тогда
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v3");
		Иначе
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "WayBillActType_v4");
		КонецЕсли;
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", ИнтеграцияЕГАИС.НовыйИдентификаторДокумента(ДокументСсылка, "cwb"), СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "IsAccept",  "Rejected",               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ACTNUMBER", СокрЛП(Шапка.Номер),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate",   ТекущаяДатаСеанса(),      СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "WBRegId",   Шапка.ИдентификаторЕГАИС, СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",      Шапка.Комментарий,        СообщениеXML);
		
		Если ФорматОбмена <> Перечисления.ФорматыОбменаЕГАИС.V3 Тогда
			
			АктXDTO.Transport = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Transport");
			АктXDTO.Transport.ChangeOwnership = "NotChange";
			
		КонецЕсли;
		
	КонецЕсли;
	
	#КонецОбласти
	
	ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(АктXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
	
	СообщениеXML.ТекстСообщенияXML = ТекстСообщенияXML;
	СообщениеXML.ТипСообщения      = Перечисления.ТипыЗапросовИС.Исходящий;
	СообщениеXML.ОрганизацияЕГАИС  = Шапка.ОрганизацияЕГАИС;
	СообщениеXML.Операция          = Операция;
	СообщениеXML.ФорматОбмена      = ФорматОбмена;
	СообщениеXML.Документ          = ДокументСсылка;
	СообщениеXML.ДокументОснование = Шапка.ДокументОснование;
	СообщениеXML.Версия            = НомерВерсии;
	
	СообщенияXML.Добавить(СообщениеXML);
	
	Возврат СообщенияXML;
	
КонецФункции

Функция ЗапросНаОтменуПроведенияXML(ДокументСсылка)
	
	СообщенияXML = Новый Массив;
	
	Операция = Перечисления.ВидыДокументовЕГАИС.ЗапросНаОтменуПроведенияТТН;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЕГАИСПрисоединенныеФайлы.Документ КАК Ссылка,
	|	КОЛИЧЕСТВО(ЕГАИСПрисоединенныеФайлы.Ссылка) КАК ПоследнийНомер
	|ПОМЕСТИТЬ Версии
	|ИЗ
	|	Справочник.ЕГАИСПрисоединенныеФайлы КАК ЕГАИСПрисоединенныеФайлы
	|ГДЕ
	|	ЕГАИСПрисоединенныеФайлы.Документ = &Ссылка
	|	И ЕГАИСПрисоединенныеФайлы.Операция = &Операция
	|	И ЕГАИСПрисоединенныеФайлы.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Исходящий)
	|СГРУППИРОВАТЬ ПО
	|	ЕГАИСПрисоединенныеФайлы.Документ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Шапка.Номер                        КАК Номер,
	|	Шапка.Дата                         КАК Дата,
	|	ЕСТЬNULL(Версии.ПоследнийНомер, 0) КАК ПоследнийНомерВерсии,
	|	Шапка.ДокументОснование            КАК ДокументОснование,
	|	
	|	Шапка.ИдентификаторЕГАИС            КАК ИдентификаторЕГАИС,
	|	Шапка.Грузополучатель               КАК ОрганизацияЕГАИС,
	|	Шапка.Грузополучатель.Код           КАК ИдентификаторФСРАР,
	|	Шапка.Грузоотправитель.ФорматОбмена КАК ФорматОбменаГрузоотправителя,
	|	Шапка.Грузополучатель.ФорматОбмена  КАК ФорматОбменаГрузополучателя,
	|	Шапка.ФорматОбмена                  КАК ФорматОбмена,
	|	Шапка.Ответственный                 КАК Ответственный
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС КАК Шапка,
	|		ЛЕВОЕ СОЕДИНЕНИЕ Версии КАК Версии
	|		ПО Шапка.Ссылка = Версии.Ссылка
	|ГДЕ
	|	Шапка.Ссылка = &Ссылка
	|");
	
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Запрос.УстановитьПараметр("Операция", Операция);
	
	Шапка = Запрос.Выполнить().Выбрать();
	
	Если Не Шапка.Следующий()  Тогда
		
		СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
		СообщениеXML.Документ = ДокументСсылка;
		СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
			Операция, ДокументСсылка);
		
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Нет данных для выгрузки.'"));
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	НомерВерсии = Шапка.ПоследнийНомерВерсии + 1;
	ФорматОбмена = ФорматОбмена(Шапка);
	
	СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
	СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
		Операция, ДокументСсылка, НомерВерсии);
	
	ПространствоИмен = Перечисления.ВидыДокументовЕГАИС.ПространствоИмен(Операция, ФорматОбмена);
	ИмяТипа          = Перечисления.ВидыДокументовЕГАИС.ТипЕГАИС(Операция, ФорматОбмена);
	
	Если ПространствоИмен = Неопределено
		Или ИмяТипа = Неопределено Тогда
		ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
			СообщениеXML,
			СтрШаблон(НСтр("ru = 'Операция не поддерживается в версии формата обмена: %1.'"), ФорматОбмена));
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
	КонецЕсли;
	
	ЗапросXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "RequestRepealWB");
	
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "ClientId",      Шапка.ИдентификаторФСРАР, СообщениеXML);
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "RequestNumber", СокрЛП(Шапка.Номер),      СообщениеXML);
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "RequestDate",   ТекущаяДатаСеанса(),      СообщениеXML);
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "WBRegId",       Шапка.ИдентификаторЕГАИС, СообщениеXML);
	
	ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(ЗапросXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
	
	СообщениеXML.ТекстСообщенияXML = ТекстСообщенияXML;
	СообщениеXML.ТипСообщения      = Перечисления.ТипыЗапросовИС.Исходящий;
	СообщениеXML.ОрганизацияЕГАИС  = Шапка.ОрганизацияЕГАИС;
	СообщениеXML.Операция          = Операция;
	СообщениеXML.ФорматОбмена      = ФорматОбмена;
	СообщениеXML.Документ          = ДокументСсылка;
	СообщениеXML.ДокументОснование = Шапка.ДокументОснование;
	СообщениеXML.Версия            = НомерВерсии;
	
	СообщенияXML.Добавить(СообщениеXML);
	
	Возврат СообщенияXML;
	
КонецФункции

#КонецОбласти

#Область СканированиеАлкогольнойПродукции

Функция ШтрихкодыУпаковок(ДокументСсылка, ЗаполнитьСправки2ИзРегистра = Ложь) Экспорт
	
	Возврат ШтрихкодированиеЕГАИС.ВложенныеШтрихкодыУпаковокПоДокументу(ДокументСсылка, ЗаполнитьСправки2ИзРегистра);
	
КонецФункции

#Область ЗавершениеСканированияАлкогольнойПродукции

// Заполняет табличную часть АкцизныеМарки входящей ТТН.
//
// Параметры:
//  ДокументОбъект - ДокументОбъект.ТТНВходящаяЕГАИС - заполняемый документ.
//  ДеревоУпаковок - ДеревоЗначений - дерево, полученное из обработки "ПроверкаКоличества".
//   УпаковкаВерхнегоУровня - СправочникСсылка.ШтрихкодыУпаковокТоваров - транспортная упаковка верхнего уровня.
//
Процедура ЗаполнитьАкцизныеМарки(ДокументОбъект, ДеревоУпаковок, УпаковкаВерхнегоУровня = Неопределено) Экспорт
	
	Для Каждого СтрокаДерева Из ДеревоУпаковок.Строки Цикл
		
		Если СтрокаДерева.ТипУпаковки = Перечисления.ПрочиеЗоныПересчетаАлкогольнойПродукции.БутылкиБезКоробки Тогда
			
			ЗаполнитьАкцизныеМарки(
				ДокументОбъект, СтрокаДерева,
				УпаковкаВерхнегоУровня);
			
			Продолжить;
			
		КонецЕсли;
		
		Если УпаковкаВерхнегоУровня = Неопределено
			И СтрокаДерева.ТипУпаковки <> Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
			УпаковкаВерхнегоУровняСтрокиДерева = СтрокаДерева.ШтрихкодУпаковки;
		Иначе
			УпаковкаВерхнегоУровняСтрокиДерева = УпаковкаВерхнегоУровня;
		КонецЕсли;
		
		Если СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
			КоличествоАкцизныхМарок = 1;
		Иначе
			КоличествоАкцизныхМарок = СтрокаДерева.КоличествоАкцизныхМарок;
		КонецЕсли;
		
		Если СтрокаДерева.Справка2 <> Неопределено И КоличествоАкцизныхМарок > 0 Тогда
			
			СтрокаТЧАкцизныеМарки = ДокументОбъект.АкцизныеМарки.Добавить();
			СтрокаТЧАкцизныеМарки.АкцизнаяМарка = СтрокаДерева.ШтрихкодУпаковки;
			СтрокаТЧАкцизныеМарки.Справка2      = СтрокаДерева.Справка2;
			СтрокаТЧАкцизныеМарки.Количество    = КоличествоАкцизныхМарок;
			
			Если СтрокаДерева.ШтрихкодУпаковки <> УпаковкаВерхнегоУровняСтрокиДерева Тогда
				СтрокаТЧАкцизныеМарки.ШтрихкодУпаковки = УпаковкаВерхнегоУровняСтрокиДерева;
			КонецЕсли;
			
		Иначе
			
			Если УпаковкаВерхнегоУровняСтрокиДерева = Неопределено
				И СтрокаДерева.ТипУпаковки <> Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
				УпаковкаВерхнегоУровняСтрокиДерева = СтрокаДерева.ШтрихкодУпаковки;
			КонецЕсли;
			
			ЗаполнитьАкцизныеМарки(
				ДокументОбъект, СтрокаДерева,
				УпаковкаВерхнегоУровняСтрокиДерева);
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

// Заполняет колонку КоличествоФакт в табличной части Товары входящей ТТН.
//
// Параметры:
//  ДокументОбъект - ДокументОбъект.ТТНВходящаяЕГАИС - заполняемый документ.
//  ДеревоУпаковок - ДеревоЗначений - дерево, полученное из обработки "ПроверкаКоличества".
//  ТаблицаНеМаркируемойПродукции - ТаблицаЗначений - таблица, полученная из обработки "ПроверкаКоличества".
//
Процедура ЗаполнитьФактическоеКоличество(ДокументОбъект, ДеревоУпаковок, ТаблицаНеМаркируемойПродукции) Экспорт

	ТаблицаКоличеств = Новый ТаблицаЗначений();
	ТаблицаКоличеств.Колонки.Добавить("Справка2", Новый ОписаниеТипов("СправочникСсылка.Справки2ЕГАИС"));
	ТаблицаКоличеств.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ТаблицаКоличеств.Индексы.Добавить("Справка2");
	
	РассчитатьКоличествоМаркируемойПродукции(ДеревоУпаковок.Строки, ТаблицаКоличеств);
	
	ДобавитьКоличествоНемаркируемойПродукции(ТаблицаНеМаркируемойПродукции, ТаблицаКоличеств);
	
	Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл
		Если ЗначениеЗаполнено(СтрокаТовары.Справка2) Тогда
			СтрокаТовары.КоличествоФакт = 0;
		Иначе
			Продолжить;
		КонецЕсли;
		
		СтруктураПоиска = Новый Структура("Справка2", СтрокаТовары.Справка2);
		СтрокиКоличествПоСправке2 = ТаблицаКоличеств.НайтиСтроки(СтруктураПоиска);
		
		Для Каждого СтрокаКоличества Из СтрокиКоличествПоСправке2 Цикл
			СтрокаТовары.КоличествоФакт = СтрокаТовары.КоличествоФакт + СтрокаКоличества.Количество;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебнаяЗавершениеСканированияАлкогольнойПродукции

Функция ЗавершенаПроверкаИПодбор(Документ) Экспорт
	
	Если ТипЗнч(Документ) = Тип("ДокументСсылка.ТТНВходящаяЕГАИС") Тогда
		СтатусПроверкиИПодбора = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ, "СтатусПроверкиИПодбора");
	Иначе
		СтатусПроверкиИПодбора = Документ.СтатусПроверкиИПодбора;
	КонецЕсли;
	
	Возврат СтатусПроверкиИПодбора = Перечисления.СтатусыПроверкиИПодбораИС.Завершено;
	
КонецФункции

Процедура РассчитатьКоличествоМаркируемойПродукции(СтрокиДерева, ТаблицаКоличеств)
	
	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		Если ЗначениеЗаполнено(СтрокаДерева.Справка2) Тогда
			Если СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
				КоличествоАкцизныхМарок = 1;
			Иначе
				КоличествоАкцизныхМарок = СтрокаДерева.КоличествоАкцизныхМарок;
			КонецЕсли;
			
			НоваяСтрока = ТаблицаКоличеств.Добавить();
			НоваяСтрока.Справка2 = СтрокаДерева.Справка2;
			НоваяСтрока.Количество = КоличествоАкцизныхМарок;
		ИначеЕсли СтрокаДерева.Строки.Количество() > 0 Тогда
			РассчитатьКоличествоМаркируемойПродукции(СтрокаДерева.Строки, ТаблицаКоличеств);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Процедура ДобавитьКоличествоНемаркируемойПродукции(ТаблицаНеМаркируемойПродукции, ТаблицаКоличеств)
	
	Для Каждого СтрокаНеМаркируемойПродукции Из ТаблицаНеМаркируемойПродукции Цикл
		Если НЕ ЗначениеЗаполнено(СтрокаНеМаркируемойПродукции.Справка2) Тогда
			Продолжить;
		КонецЕсли;
		
		СтруктураПоиска = Новый Структура("Справка2", СтрокаНеМаркируемойПродукции.Справка2);
		СтрокиКоличествПоСправке2 = ТаблицаКоличеств.НайтиСтроки(СтруктураПоиска);
		
		Если СтрокиКоличествПоСправке2.Количество() = 0 Тогда
			СтрокаКоличества = ТаблицаКоличеств.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаКоличества, СтруктураПоиска);
		Иначе
			СтрокаКоличества = СтрокиКоличествПоСправке2[0];
		КонецЕсли;
		
		СтрокаКоличества.Количество = СтрокаКоличества.Количество + СтрокаНеМаркируемойПродукции.КоличествоФактическое;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ЗавершениеПроверкиИПодбораМаркируемойПродукции

// Отражает результаты проверки и подбора в документе, из которого была вызвана соответствующая форма.
//
// Параметры:
// 	ПараметрыОкончанияПроверки - см. ОбработкаМенеджер.ПроверкаИПодборАлкогольнойПродукцииЕГАИС.ЗафиксироватьРезультатПроверкиИПодбора
Процедура ОтразитьРезультатыПроверкиИПодбора(ПараметрыОкончанияПроверки) Экспорт
	
	ТаблицаНеМаркируемойПродукции = ПараметрыОкончанияПроверки.ТаблицаНеМаркируемойПродукции;
	ДеревоМаркируемойПродукции    = ПараметрыОкончанияПроверки.ДеревоМаркируемойПродукции;
	
	ДокументОбъект = ПараметрыОкончанияПроверки.ПроверяемыйДокумент.ПолучитьОбъект();
	ДокументОбъект.СтатусПроверкиИПодбора = Перечисления.СтатусыПроверкиИПодбораИС.Завершено;
	
	Если ПараметрыОкончанияПроверки.АдресРезультатовПроверки = Неопределено Тогда
		ДокументОбъект.ДанныеПроверкиИПодбора = Новый ХранилищеЗначения(Неопределено);
	Иначе
		ДокументОбъект.ДанныеПроверкиИПодбора = ПараметрыОкончанияПроверки.АдресРезультатовПроверки;
	КонецЕсли;
	
	ДокументОбъект.АкцизныеМарки.Очистить();
	
	ЗаполнитьАкцизныеМарки(ДокументОбъект, ДеревоМаркируемойПродукции);
	ЗаполнитьФактическоеКоличество(ДокументОбъект, ДеревоМаркируемойПродукции, ТаблицаНеМаркируемойПродукции);
	
	Если ДокументОбъект.Проведен Тогда
		Если ДокументОбъект.ПроверитьЗаполнение() Тогда
			ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
		Иначе
			ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
		КонецЕсли;
	Иначе
		ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
	КонецЕсли;
	
	ПараметрыОбновленияСтатуса = ОбменДаннымиЕГАИС.ПараметрыОбновленияСтатуса();
	ПараметрыОбновленияСтатуса.ОбновлятьДвижения = Ложь;
	ПараметрыОбновленияСтатуса.СтатусОбработки   = Перечисления.СтатусыОбработкиСообщенийЕГАИС.ПринятИзЕГАИС;
	ПараметрыОбновленияСтатуса.ДокументОбъект    = ДокументОбъект;
	
	ОбновитьСтатусПослеПолученияДанных(ДокументОбъект.Ссылка, Перечисления.ВидыДокументовЕГАИС.ТТН, ПараметрыОбновленияСтатуса);
	
КонецПроцедуры

#КонецОбласти

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных;

КонецФункции

Процедура ИнициализироватьДанныеДокумента(ДокументСсылка, ДополнительныеСвойства, Регистры = Неопределено) Экспорт
	
	////////////////////////////////////////////////////////////////////////////
	// Создадим запрос инициализации движений
	
	Запрос = Новый Запрос;
	ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
	
	////////////////////////////////////////////////////////////////////////////
	// Сформируем текст запроса
	
	ТекстыЗапроса = Новый СписокЗначений;
	ТекстЗапросаТаблицаОстаткиАлкогольнойПродукцииЕГАИС(Запрос, ТекстыЗапроса, Регистры);
	ТекстЗапросаТаблицаДвиженияСерийТоваров(Запрос, ТекстыЗапроса, Регистры);
	
	ИнтеграцияИС.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);
	
КонецПроцедуры

Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
	
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДанныеШапки.Дата                    КАК Период,
	|	ДанныеШапки.Ссылка                  КАК Ссылка,
	|	ДанныеШапки.Грузополучатель         КАК Грузополучатель,
	|	ДанныеШапки.ДатаРегистрацииДвижений КАК ДатаРегистрацииДвижений,
	|	ДанныеШапки.ЕстьРасхождения         КАК ЕстьРасхождения,
	|	СтатусыДокументовЕГАИС.Статус       КАК СтатусОбработки
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС КАК ДанныеШапки
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
	|		ПО СтатусыДокументовЕГАИС.Документ = ДанныеШапки.Ссылка
	|ГДЕ
	|	ДанныеШапки.Ссылка = &Ссылка";
	
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	Запрос.УстановитьПараметр("Период",                  Реквизиты.Период);
	Запрос.УстановитьПараметр("Ссылка",                  Реквизиты.Ссылка);
	Запрос.УстановитьПараметр("УдалитьСтатусОбработки",  Реквизиты.СтатусОбработки);
	Запрос.УстановитьПараметр("Грузополучатель",         Реквизиты.Грузополучатель);
	Запрос.УстановитьПараметр("ДатаРегистрацииДвижений", Реквизиты.ДатаРегистрацииДвижений);
	Запрос.УстановитьПараметр("ЕстьРасхождения",         Реквизиты.ЕстьРасхождения);
	
	Запрос.УстановитьПараметр("СтатусыДвиженийСвободныйОстаток", СтатусыДвиженийСвободныйОстаток());
	Запрос.УстановитьПараметр("СтатусыДвиженийКоличество",       СтатусыДвиженийКоличество());
	
КонецПроцедуры

Функция ТекстЗапросаТаблицаОстаткиАлкогольнойПродукцииЕГАИС(Запрос, ТекстыЗапроса, Регистры)
	
	ИмяРегистра = "ОстаткиАлкогольнойПродукцииЕГАИС";
	
	Если НЕ ИнтеграцияИС.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
		Возврат "";
	КонецЕсли;
	
	Если НЕ ИнтеграцияЕГАИС.ЕстьТаблицаЗапроса("ВТТовары", ТекстыЗапроса) Тогда
		ТекстЗапросаВТТовары(Запрос, ТекстыЗапроса);
	КонецЕсли;
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
	|	&Период                                КАК Период,
	|	&Грузополучатель                       КАК ОрганизацияЕГАИС,
	|	ТаблицаТовары.АлкогольнаяПродукция     КАК АлкогольнаяПродукция,
	|	ТаблицаТовары.Справка2                 КАК Справка2,
	|	ВЫБОР КОГДА &ЕстьРасхождения ТОГДА
	|		ТаблицаТовары.КоличествоФакт
	|	ИНАЧЕ
	|		ТаблицаТовары.Количество
	|	КОНЕЦ                                  КАК СвободныйОстаток,
	|	0                                      КАК Количество,
	|	ТаблицаТовары.НомерСтроки              КАК НомерСтроки
	|ИЗ
	|	ВТТовары КАК ТаблицаТовары
	|ГДЕ
	|	&УдалитьСтатусОбработки В(&СтатусыДвиженийСвободныйОстаток)
	|	И ВЫБОР КОГДА &ЕстьРасхождения ТОГДА
	|		ТаблицаТовары.КоличествоФакт
	|	ИНАЧЕ
	|		ТаблицаТовары.Количество
	|	КОНЕЦ <> 0
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
	|	&ДатаРегистрацииДвижений               КАК ДатаРегистрацииДвижений,
	|	&Грузополучатель                       КАК ОрганизацияЕГАИС,
	|	ТаблицаТовары.АлкогольнаяПродукция     КАК АлкогольнаяПродукция,
	|	ТаблицаТовары.Справка2                 КАК Справка2,
	|	0                                      КАК СвободныйОстаток,
	|	ВЫБОР КОГДА &ЕстьРасхождения ТОГДА
	|		ТаблицаТовары.КоличествоФакт
	|	ИНАЧЕ
	|		ТаблицаТовары.Количество
	|	КОНЕЦ                                  КАК Количество,
	|	ТаблицаТовары.НомерСтроки              КАК НомерСтроки
	|ИЗ
	|	ВТТовары КАК ТаблицаТовары
	|ГДЕ
	|	&ДатаРегистрацииДвижений <> ДАТАВРЕМЯ(1,1,1)
	|	И &УдалитьСтатусОбработки В(&СтатусыДвиженийКоличество)
	|	И ВЫБОР КОГДА &ЕстьРасхождения ТОГДА
	|		ТаблицаТовары.КоличествоФакт
	|	ИНАЧЕ
	|		ТаблицаТовары.Количество
	|	КОНЕЦ <> 0
	|";
	
	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	
	Возврат ТекстЗапроса;
	
КонецФункции

Функция ТекстЗапросаВТТовары(Запрос, ТекстыЗапроса)
	
	ИмяРегистра = "ВТТовары";
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ТаблицаТовары.Ссылка               КАК Ссылка,
	|	ТаблицаТовары.НомерСтроки          КАК НомерСтроки,
	|	ТаблицаТовары.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
	|	ТаблицаТовары.Номенклатура         КАК Номенклатура,
	|	ТаблицаТовары.Характеристика       КАК Характеристика,
	|	ТаблицаТовары.Серия                КАК Серия,
	|	ТаблицаТовары.Количество           КАК Количество,
	|	ТаблицаТовары.КоличествоФакт       КАК КоличествоФакт,
	|	ТаблицаТовары.Справка2             КАК Справка2
	|ПОМЕСТИТЬ ВТТовары
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС.Товары КАК ТаблицаТовары
	|ГДЕ
	|	ТаблицаТовары.Ссылка = &Ссылка";
	
	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	
	Возврат ТекстЗапроса;
	
КонецФункции

Функция СтатусыДвиженийСвободныйОстаток()
	
	Результат = Новый Массив;
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Подтвержден);
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПодтвержденСРасхождениями);
	
	Возврат Результат;
	
КонецФункции

Функция СтатусыДвиженийКоличество()
	
	Результат = Новый Массив;
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Подтвержден);
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ПодтвержденСРасхождениями);
	
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияКПередаче);
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияПереданВУТМ);
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОбрабатываетсяЕГАИС);
	Результат.Добавить(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.ЗапросНаОтменуПроведенияОшибка);
	
	Возврат Результат;
	
КонецФункции

Функция ТекстЗапросаТаблицаДвиженияСерийТоваров(Запрос, ТекстыЗапроса, Регистры)
	
	ИмяРегистра = "ДвиженияСерийТоваров";
	
	Если Не ИнтеграцияИС.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
		Возврат "";
	КонецЕсли; 
	
	ТекстЗапроса = "";
	ИнтеграцияЕГАИСПереопределяемый.ПриЗаполненииТекстаЗапросаДвижениеСерийТоваров(ТекстЗапроса, Метаданные.Документы.ТТНВходящаяЕГАИС.Имя);
	
	Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
		ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

#КонецОбласти

#Область Серии

//Имена реквизитов, от значений которых зависят параметры указания серий
//
//	Возвращаемое значение:
//		Строка - имена реквизитов, перечисленные через запятую
//
Функция ИменаРеквизитовДляЗаполненияПараметровУказанияСерий() Экспорт
	
	Возврат ИнтеграцияИС.ИменаРеквизитовДляЗаполненияПараметровУказанияСерий(Метаданные.Документы.ТТНВходящаяЕГАИС);
	
КонецФункции

// Возвращает параметры указания серий для товаров, указанных в документе.
//
// Параметры:
//  Объект	 - Структура - структура значений реквизитов объекта, необходимых для заполнения параметров указания серий.
// 
// Возвращаемое значение:
//  см. ИнтеграцияИС.ПараметрыУказанияСерий
//
Функция ПараметрыУказанияСерий(Объект) Экспорт
	
	Возврат ИнтеграцияИС.ПараметрыУказанияСерий(Метаданные.Документы.ТТНВходящаяЕГАИС, Объект);
	
КонецФункции

//Возвращает текст запроса для расчета статусов указания серий
//
//Параметры:
//   ПараметрыУказанияСерий - см. ИнтеграцияИС.ПараметрыУказанияСерий
//
//Возвращаемое значение:
//   Строка - текст запроса
//
Функция ТекстЗапросаЗаполненияСтатусовУказанияСерий(ПараметрыУказанияСерий) Экспорт
	
	Возврат ИнтеграцияИС.ТекстЗапросаЗаполненияСтатусовУказанияСерий(Метаданные.Документы.ТТНВходящаяЕГАИС, ПараметрыУказанияСерий);

КонецФункции

#КонецОбласти

#Область ВводНаОсновании

Функция ТекстЗапросаПередачиВРегистры2и3НаОснованииТТНВходящей() Экспорт
	
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	ТТНВходящая.Ссылка          КАК ДокументОснование,
	|	НЕ ТТНВходящая.Проведен     КАК ЕстьОшибкиПроведен,
	|	ТТНВходящая.Грузополучатель КАК ОрганизацияЕГАИС
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС КАК ТТНВходящая
	|ГДЕ
	|	ТТНВходящая.Ссылка = &ДокументОснование
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицаДокументы.Ссылка КАК Ссылка
	|ПОМЕСТИТЬ ВТОформленныеДокументы
	|ИЗ
	|	Документ.ПередачаВРегистр2ЕГАИС КАК ТаблицаДокументы
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
	|		ПО (СтатусыДокументовЕГАИС.Документ = ТаблицаДокументы.Ссылка)
	|ГДЕ
	|	ТаблицаДокументы.ДокументОснование = &ДокументОснование
	|	И ТаблицаДокументы.Ссылка <> &ПередачаВРегистр2
	|	И ТаблицаДокументы.Проведен
	|	И НЕ СтатусыДокументовЕГАИС.Статус В (&КонечныеСтатусы)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТабличнаяЧасть.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
	|	ТабличнаяЧасть.Номенклатура         КАК Номенклатура,
	|	ТабличнаяЧасть.Характеристика       КАК Характеристика,
	|	ТабличнаяЧасть.Серия                КАК Серия,
	|	ТабличнаяЧасть.Справка2             КАК Справка2,
	|	ВЫБОР
	|		КОГДА ТабличнаяЧасть.Ссылка.ЕстьРасхождения
	|			ТОГДА ТабличнаяЧасть.КоличествоФакт
	|		ИНАЧЕ ТабличнаяЧасть.Количество
	|	КОНЕЦ КАК Количество
	|ПОМЕСТИТЬ ВТТовары
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС.Товары КАК ТабличнаяЧасть
	|ГДЕ
	|	ТабличнаяЧасть.Ссылка = &ДокументОснование
	|	И ТабличнаяЧасть.Справка2 <> ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка)
	|	И ТабличнаяЧасть.АлкогольнаяПродукция.ВидПродукции.Маркируемый = Ложь
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|"
	+
	ИнтеграцияЕГАИС.ТекстЗапросаВТКоэффициентыПересчетаВЕдиницыЕГАИС(,,Истина)
	+"
	|ВЫБРАТЬ
	|	ТабличнаяЧасть.Номенклатура         КАК Номенклатура,
	|	ТабличнаяЧасть.Характеристика       КАК Характеристика,
	|	ТабличнаяЧасть.Серия                КАК Серия,
	|	&ПустаяУпаковка                     КАК Упаковка,
	|	ТабличнаяЧасть.Количество / Коэффициенты.Коэффициент КАК Количество,
	|	ТабличнаяЧасть.Количество / Коэффициенты.Коэффициент КАК КоличествоУпаковок,
	|	ТабличнаяЧасть.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
	|	ТабличнаяЧасть.Справка2             КАК Справка2,
	|	Коэффициенты.ПроверятьОбъемДАЛ И (Коэффициенты.ОбъемДАЛ = 0) КАК ЕстьОшибкиНеупакованнаяПродукция
	|ПОМЕСТИТЬ ВТТоварыКОформлению
	|ИЗ
	|	ВТТовары КАК ТабличнаяЧасть
	|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКоэффициентыПересчетаВЕдиницыЕГАИС КАК Коэффициенты
	|		ПО Коэффициенты.Номенклатура = ТабличнаяЧасть.Номенклатура
	|		И Коэффициенты.Характеристика = ТабличнаяЧасть.Характеристика
	|		И Коэффициенты.Серия = ТабличнаяЧасть.Серия
	|		И Коэффициенты.АлкогольнаяПродукция = ТабличнаяЧасть.АлкогольнаяПродукция
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ОформленныеТовары.Номенклатура,
	|	ОформленныеТовары.Характеристика,
	|	ОформленныеТовары.Серия,
	|	ОформленныеТовары.Упаковка,
	|	-ОформленныеТовары.Количество,
	|	-ОформленныеТовары.КоличествоУпаковок,
	|	ОформленныеТовары.АлкогольнаяПродукция,
	|	ОформленныеТовары.Справка2,
	|	ЛОЖЬ
	|ИЗ
	|	Документ.ПередачаВРегистр2ЕГАИС.Товары КАК ОформленныеТовары
	|ГДЕ
	|	ОформленныеТовары.Ссылка В
	|			(ВЫБРАТЬ
	|				Т.Ссылка
	|			ИЗ
	|				ВТОформленныеДокументы КАК Т)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыКОформлению.Номенклатура                                КАК Номенклатура,
	|	ТоварыКОформлению.Характеристика                              КАК Характеристика,
	|	ТоварыКОформлению.Серия                                       КАК Серия,
	|	ТоварыКОформлению.Упаковка                                    КАК Упаковка,
	|	ТоварыКОформлению.АлкогольнаяПродукция                        КАК АлкогольнаяПродукция,
	|	ТоварыКОформлению.Справка2                                    КАК Справка2,
	|	СУММА(ТоварыКОформлению.Количество)                           КАК Количество,
	|	СУММА(ТоварыКОформлению.КоличествоУпаковок)                   КАК КоличествоУпаковок,
	|	МАКСИМУМ (ТоварыКОформлению.ЕстьОшибкиНеупакованнаяПродукция) КАК ЕстьОшибкиНеупакованнаяПродукция
	|ПОМЕСТИТЬ ВТОстатки
	|ИЗ
	|	ВТТоварыКОформлению КАК ТоварыКОформлению
	|
	|СГРУППИРОВАТЬ ПО
	|	ТоварыКОформлению.Номенклатура,
	|	ТоварыКОформлению.Характеристика,
	|	ТоварыКОформлению.Серия,
	|	ТоварыКОформлению.Упаковка,
	|	ТоварыКОформлению.АлкогольнаяПродукция,
	|	ТоварыКОформлению.Справка2
	|
	|ИМЕЮЩИЕ
	|	СУММА(ТоварыКОформлению.Количество) > 0
	|	ИЛИ МАКСИМУМ (ТоварыКОформлению.ЕстьОшибкиНеупакованнаяПродукция) = ИСТИНА
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	АкцизныеМарки.АкцизнаяМарка        КАК АкцизнаяМарка,
	|	АкцизныеМарки.Статус               КАК Статус,
	|	АкцизныеМарки.Справка2             КАК Справка2,
	|	АкцизныеМарки.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
	|	Остатки.Номенклатура               КАК Номенклатура,
	|	Остатки.Характеристика             КАК Характеристика,
	|	Остатки.Серия                      КАК Серия
	|ПОМЕСТИТЬ ВТАкцизныеМарки
	|ИЗ
	|	РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМарки
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОстатки КАК Остатки
	|		ПО Остатки.Справка2 = АкцизныеМарки.Справка2
	|		И Остатки.АлкогольнаяПродукция = АкцизныеМарки.АлкогольнаяПродукция
	|ГДЕ
	|	АкцизныеМарки.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ВНаличии), ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.КПостановкеНаБаланс))
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	АкцизныеМарки.Справка2                  КАК Справка2,
	|	КОЛИЧЕСТВО(АкцизныеМарки.АкцизнаяМарка) КАК Количество
	|ПОМЕСТИТЬ ВТАкцизныеМаркиПоСправкам2
	|ИЗ
	|	ВТАкцизныеМарки КАК АкцизныеМарки
	|
	|СГРУППИРОВАТЬ ПО
	|	АкцизныеМарки.Справка2
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыКОформлению.Номенклатура                                               КАК Номенклатура,
	|	ТоварыКОформлению.Характеристика                                             КАК Характеристика,
	|	ТоварыКОформлению.Серия                                                      КАК Серия,
	|	ТоварыКОформлению.Упаковка                                                   КАК Упаковка,
	|	ТоварыКОформлению.АлкогольнаяПродукция                                       КАК АлкогольнаяПродукция,
	|	ТоварыКОформлению.Справка2                                                   КАК Справка2,
	|	ТоварыКОформлению.Количество - ЕСТЬNULL(АкцизныеМарки.Количество, 0)         КАК Количество,
	|	ТоварыКОформлению.КоличествоУпаковок - ЕСТЬNULL(АкцизныеМарки.Количество, 0) КАК КоличествоУпаковок,
	|	ТоварыКОформлению.ЕстьОшибкиНеупакованнаяПродукция                           КАК ЕстьОшибкиНеупакованнаяПродукция
	|ИЗ
	|	ВТОстатки КАК ТоварыКОформлению
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТАкцизныеМаркиПоСправкам2 КАК АкцизныеМарки
	|		ПО ТоварыКОформлению.Справка2 = АкцизныеМарки.Справка2
	|ГДЕ
	|	ТоварыКОформлению.Количество - ЕСТЬNULL(АкцизныеМарки.Количество, 0) > 0
	|		ИЛИ ТоварыКОформлению.ЕстьОшибкиНеупакованнаяПродукция = ИСТИНА
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	АкцизныеМарки.АкцизнаяМарка        КАК АкцизнаяМарка,
	|	АкцизныеМарки.Справка2             КАК Справка2,
	|	АкцизныеМарки.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
	|	АкцизныеМарки.Номенклатура         КАК Номенклатура,
	|	АкцизныеМарки.Характеристика       КАК Характеристика,
	|	АкцизныеМарки.Серия                КАК Серия,
	|	1                                  КАК Количество
	|ИЗ
	|	ВТАкцизныеМарки КАК АкцизныеМарки
	|ГДЕ
	|	АкцизныеМарки.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.КПостановкеНаБаланс)
	|";
	
	Возврат ТекстЗапроса;
	
КонецФункции

#КонецОбласти

#Область Отчеты

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - ТаблицаЗначений - Таблица с командами отчетов. Для изменения.
//       См. описание 1 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов().
//   Параметры - Структура - Вспомогательные параметры. Для чтения.
//       См. описание 2 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов().
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
	ИнтеграцияИСПереопределяемый.ДобавитьКомандуСтруктураПодчиненности(КомандыОтчетов);
	ИнтеграцияИСПереопределяемый.ДобавитьКомандуДвиженияДокумента(КомандыОтчетов);
	
	КомандаОтчет = Отчеты.АнализРасхожденийПриПоступленииАлкогольнойПродукции.ДобавитьКомандуОтчета(КомандыОтчетов);
	Если КомандаОтчет <> Неопределено Тогда
		КомандаОтчет.Важность = "Обычное";
		КомандаОтчет.Порядок = 1;
	КонецЕсли;
	
	КомандаОтчет = Отчеты.АнализРасхожденийПриДвиженииАлкогольнойПродукции.ДобавитьКомандуОтчета(КомандыОтчетов);
	Если КомандаОтчет <> Неопределено Тогда
		КомандаОтчет.Важность = "Обычное";
		КомандаОтчет.Порядок = 2;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область Печать

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "ИнтеграцияЕГАИСКлиент.ПечатьИсторияСправок2";
	КомандаПечати.МенеджерПечати = "";
	КомандаПечати.Идентификатор = "ИсторияСправок2";
	КомандаПечати.Представление = НСтр("ru = 'История справок 2'");
	
КонецПроцедуры

// Сформировать печатные формы объектов.
//
// Параметры:
//   МассивОбъектов        - Массив из Произвольный         - ссылки на объекты, которые нужно распечатать
//   ПараметрыПечати       - Структура                      - дополнительные настройки печати
//   КоллекцияПечатныхФорм - ТаблицаЗначений                - сформированные табличные документы (выходной параметр)
//   ОбъектыПечати         - СписокЗначений из Произвольный - имя области, в которой был выведен объект (выходной параметр)
//   ПараметрыВывода       - Структура                      - дополнительные параметры сформированных табличных документов (выходной параметр)
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Возврат;
	
КонецПроцедуры

#КонецОбласти

#Область ОбновлениеИнформационнойБазы

Функция АдаптированныйТекстЗапросаДвиженийПоРегистру(ИмяРегистра) Экспорт
	
	Запрос = Новый Запрос;
	ТекстыЗапроса = Новый СписокЗначений();
	ТекстыЗапросаВременныхТаблиц = Новый Массив;
	ПолноеИмяДокумента = "Документ.ТТНВходящаяЕГАИС";
	
	Если ИмяРегистра = "ОстаткиАлкогольнойПродукцииЕГАИС" Тогда
		
		ТекстЗапроса = ТекстЗапросаТаблицаОстаткиАлкогольнойПродукцииЕГАИС(Запрос, ТекстыЗапроса, ИмяРегистра);
		ТекстыЗапросаВременныхТаблиц.Добавить(Новый Структура("Ключ, Значение", "ВТТовары", ТекстЗапросаВТТовары(Запрос, ТекстыЗапроса)));
		СинонимТаблицыДокумента = "ТаблицаТовары";
		
	Иначе
		ТекстИсключения = НСтр("ru = 'В документе %ПолноеИмяДокумента% не реализована адаптация текста запроса формирования движений по регистру %ИмяРегистра%.'");
		ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ПолноеИмяДокумента%", ПолноеИмяДокумента);
		ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ИмяРегистра%", ИмяРегистра);
		
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	
	ПереопределениеРасчетаПараметров = Новый Структура;
	
	Результат = ОбновлениеИнформационнойБазыЕГАИС.РезультатАдаптацииЗапроса();
	
	Результат.ЗначенияПараметров.Вставить("СтатусыДвиженийСвободныйОстаток", СтатусыДвиженийСвободныйОстаток());
	Результат.ЗначенияПараметров.Вставить("СтатусыДвиженийКоличество",       СтатусыДвиженийКоличество());
	
	Результат.ТекстЗапроса = ОбновлениеИнформационнойБазыЕГАИС.АдаптироватьЗапросМеханизмаПроведения(
		ТекстЗапроса,
		ПолноеИмяДокумента,
		СинонимТаблицыДокумента,
		ПереопределениеРасчетаПараметров,
		ТекстыЗапросаВременныхТаблиц);
	
	Возврат Результат;
	
КонецФункции

Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ТабличнаяЧасть.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ТТНВходящаяЕГАИС.Товары КАК ТабличнаяЧасть
	|ГДЕ
	|	ТабличнаяЧасть.Номенклатура = &ПустаяНоменклатура
	|");
	Запрос.УстановитьПараметр("ПустаяНоменклатура", ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа("Номенклатура"));
	
	ДокументыКОбработке = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, ДокументыКОбработке);
	
КонецПроцедуры

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

#КонецОбласти

#Область Прочее

Процедура ПрименитьРезультатСопоставленияДляШтрихкодовУпаковок(ДокументОбъект) Экспорт
	
	ВложенныеШтрихкоды = ШтрихкодированиеЕГАИС.ВложенныеШтрихкодыУпаковокПоДокументу(ДокументОбъект.Ссылка);
	
	УстановитьПривилегированныйРежим(Истина);
	
	Для Каждого СтрокаТЧ Из ВложенныеШтрихкоды.МаркированныеТовары Цикл
		
		Если ЗначениеЗаполнено(СтрокаТЧ.Справка2) Тогда
			
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("Справка2", СтрокаТЧ.Справка2);
			НайденныеСтроки = ДокументОбъект.Товары.НайтиСтроки(ПараметрыОтбора);
			
			Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
				
				Если НайденнаяСтрока.Номенклатура <> СтрокаТЧ.Номенклатура
					Или НайденнаяСтрока.Характеристика <> СтрокаТЧ.Характеристика
					Или НайденнаяСтрока.Серия <> СтрокаТЧ.Серия Тогда
					
					ШтрихкодУпаковкиОбъект = СтрокаТЧ.ШтрихкодУпаковки.ПолучитьОбъект();
					ШтрихкодУпаковкиОбъект.Номенклатура   = НайденнаяСтрока.Номенклатура;
					ШтрихкодУпаковкиОбъект.Характеристика = НайденнаяСтрока.Характеристика;
					ШтрихкодУпаковкиОбъект.Серия          = НайденнаяСтрока.Серия;
					ШтрихкодУпаковкиОбъект.Записать();
					
				КонецЕсли;
				
				Прервать;
				
			КонецЦикла;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ДанныеДокументаТТНv3(ДокументСсылка)
	
	ТекстСообщенияXML = ПротоколОбменаИС.ТекстСообщенияXMLИзПротокола(ВходящееСообщение(ДокументСсылка));
	
	ТекстОшибки = "";
	ОбъектXDTO  = Неопределено;
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстСообщенияXML);
	
	Попытка
		ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, РаботаСXMLИС.ОбъектXDTOПоИмениСвойства(
			РаботаСXMLЕГАИС.КорневоеПространствоИмен(), "Documents").Тип());
	Исключение
		
		ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		Попытка
			ОбъектXDTO = РаботаСXMLЕГАИС.ПреобразоватьПроизвольныйОбъектXDTOВОбъектXDTO(
				РаботаСXMLИС.ПроизвольныйОбъектXDTOПоТекстуСообщенияXML(ТекстСообщенияXML),
				РаботаСXMLИС.ОбъектXDTOПоИмениСвойства(РаботаСXMLЕГАИС.КорневоеПространствоИмен(), "Documents", Неопределено));
		Исключение
			ТекстОшибки = ПодробноеПредставлениеОшибки;
		КонецПопытки;
	КонецПопытки;
	
	ДанныеДокументаТТН = Неопределено;
	
	Если ОбъектXDTO <> Неопределено Тогда
		
		ФорматОбмена       = Неопределено;
		ТипЕГАИС           = Неопределено;
		ДанныеДокументаТТН = Неопределено;
		
		Если ОбъектXDTO <> Неопределено Тогда
			Попытка
				ДокументыПоТипамЕГАИС = РаботаСXMLИС.ОбъектXDTOВСтруктуру(ОбъектXDTO.Document);
				Для Каждого КлючИЗначение Из ДокументыПоТипамЕГАИС Цикл
					Если КлючИЗначение.Значение <> Неопределено Тогда
						ТипЕГАИС           = КлючИЗначение.Ключ;
						ДанныеДокументаТТН = ДокументыПоТипамЕГАИС[ТипЕГАИС];
						
						ВидДокументаИФорматОбмена = Перечисления.ВидыДокументовЕГАИС.ДанныеДокументаПоТипуЕГАИС(
							ТипЕГАИС, Перечисления.ВидыДокументовЕГАИС.ТаблицаСоответствияДокументовТипамЕГАИС());
						ФорматОбмена = ВидДокументаИФорматОбмена.ФорматОбмена;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			Исключение
				ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			КонецПопытки;
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Или ДанныеДокументаТТН = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ВозвращаемоеЗначение = Новый Структура;
	ВозвращаемоеЗначение.Вставить("Данные",       ДанныеДокументаТТН);
	ВозвращаемоеЗначение.Вставить("ФорматОбмена", ФорматОбмена);
	
	Возврат ВозвращаемоеЗначение;
	
КонецФункции

// Добавляет штрихкоды упаковок и акцизных марок в дерево для дальнейшей записи в базу данных.
//
Процедура ДобавитьУпаковкиВДерево(ДеревоУпаковок, ДеревоУпаковокСправки2, ШтрихкодыУпаковкиСправки2)
	
	Для Каждого ДанныеУпаковки Из ДеревоУпаковокСправки2 Цикл
		
		Если ДанныеУпаковки.boxnum <> Неопределено Тогда
			
			Для Каждого Штрихкод Из ДанныеУпаковки.boxnum Цикл
				
				СтрокаДерева = ДеревоУпаковок.Строки.Найти(Штрихкод);
				Если СтрокаДерева = Неопределено Тогда
					
					СтрокаДерева = ДеревоУпаковок.Строки.Добавить();
					СтрокаДерева.Штрихкод = Штрихкод;
					
					Если ЗначениеЗаполнено(Штрихкод) Тогда
						СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МонотоварнаяУпаковка;
					Иначе
						СтрокаДерева.ТипУпаковки = Перечисления.ПрочиеЗоныПересчетаАлкогольнойПродукции.БутылкиБезКоробки;
					КонецЕсли;
					
				КонецЕсли;
				
				ДанныеШтрихкодаУпаковки = ШтрихкодыУпаковкиСправки2[Штрихкод];
				Если ДанныеШтрихкодаУпаковки <> Неопределено Тогда
					
					Для Каждого КодАкцизнойМарки Из ДанныеШтрихкодаУпаковки.АкцизныеМарки Цикл
						СтрокаАкцизнойМарки = СтрокаДерева.Строки.Добавить();
						СтрокаАкцизнойМарки.Штрихкод             = КодАкцизнойМарки;
						СтрокаАкцизнойМарки.ТипУпаковки          = Перечисления.ТипыУпаковок.МаркированныйТовар;
						СтрокаАкцизнойМарки.АлкогольнаяПродукция = ДанныеШтрихкодаУпаковки.АлкогольнаяПродукция;
						СтрокаАкцизнойМарки.Справка2             = ДанныеШтрихкодаУпаковки.Справка2;
						СтрокаАкцизнойМарки.Номенклатура         = ДанныеШтрихкодаУпаковки.Номенклатура;
						СтрокаАкцизнойМарки.Характеристика       = ДанныеШтрихкодаУпаковки.Характеристика;
						СтрокаАкцизнойМарки.Серия                = ДанныеШтрихкодаУпаковки.Серия;
					КонецЦикла;
					
					Если Не ЗначениеЗаполнено(СтрокаДерева.АлкогольнаяПродукция) Тогда
						Если СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МонотоварнаяУпаковка Тогда
							СтрокаДерева.АлкогольнаяПродукция = ДанныеШтрихкодаУпаковки.АлкогольнаяПродукция;
						КонецЕсли;
					ИначеЕсли СтрокаДерева.АлкогольнаяПродукция <> ДанныеШтрихкодаУпаковки.АлкогольнаяПродукция Тогда
						СтрокаДерева.АлкогольнаяПродукция = Неопределено;
						СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МультитоварнаяУпаковка;
					КонецЕсли;
					
					ШтрихкодыУпаковкиСправки2.Удалить(Штрихкод);
					
				КонецЕсли;
				
				Если ДанныеУпаковки.bl <> Неопределено Тогда
					ДобавитьУпаковкиВДерево(СтрокаДерева, ДанныеУпаковки.bl, ШтрихкодыУпаковкиСправки2);
				КонецЕсли;
				
			КонецЦикла;
			
		Иначе
			
			Если ДанныеУпаковки.bl <> Неопределено Тогда
				ДобавитьУпаковкиВДерево(ДеревоУпаковок, ДанныеУпаковки.bl, ШтрихкодыУпаковкиСправки2);
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ФорматОбмена(Шапка)
	
	ФорматОбмена = ОбменДаннымиЕГАИСКлиентСервер.ФорматОбмена();
	Если Шапка.ФорматОбменаГрузоотправителя = Перечисления.ФорматыОбменаЕГАИС.V1
		Или Шапка.ФорматОбменаГрузополучателя = Перечисления.ФорматыОбменаЕГАИС.V1 Тогда
		ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V1;
	ИначеЕсли ЗначениеЗаполнено(Шапка.ФорматОбмена) Тогда
		ФорматОбмена = Шапка.ФорматОбмена;
	КонецЕсли;
	
	Возврат ФорматОбмена;
	
КонецФункции

// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
//
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
	
	Возврат;
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

#Область ФормированиеГиперссылкиВЖурналеЗакупок

Функция СформироватьГиперссылкуСмТакжеВРаботе(Параметры) Экспорт
	
	Гиперссылка = Неопределено;
	ИнтеграцияЕГАИСПереопределяемый.СформироватьГиперссылкуСмТакжеВРаботе(
		Параметры, 
		Метаданные.Документы.ТТНВходящаяЕГАИС,
		Гиперссылка);
	Возврат Гиперссылка;
	
КонецФункции

#КонецОбласти

// Текст запроса для выбора алкогольной продукции в списке документов
// 
// Возвращаемое значение:
//  Строка - Текст запроса продукции для проверки цен в списке документов
Функция ТекстЗапросаПродукцииДляПроверкиЦенВСпискеДокументов() Экспорт
	
	ТекстЗапроса = "ВЫБРАТЬ
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Серия КАК Серия,
	|	Товары.Цена КАК Цена,
	|	Товары.ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
	|	Товары.ИННКонтрагента КАК ИННКонтрагента,
	|	Товары.КППКонтрагента КАК КППКонтрагента,
	|	Товары.КоэффициентЕГАИС КАК КоэффициентЕГАИС
	|ИЗ
	|	(ВЫБРАТЬ
	|		ДокументТовары.Номенклатура КАК Номенклатура,
	|		ДокументТовары.Характеристика КАК Характеристика,
	|		ДокументТовары.Серия КАК Серия,
	|		ДокументТовары.Цена КАК Цена,
	|		ДокументТовары.Ссылка.Грузоотправитель КАК ОрганизацияЕГАИС,
	|		ДокументТовары.Ссылка.Грузоотправитель.ИНН КАК ИННКонтрагента,
	|		ДокументТовары.Ссылка.Грузоотправитель.КПП КАК КППКонтрагента,
	|		1 КАК КоэффициентЕГАИС
	|	ИЗ
	|		Документ.ТТНВходящаяЕГАИС.Товары КАК ДокументТовары
	|	ГДЕ
	|		ДокументТовары.Ссылка В(&СписокДокументов)
	|		И ДокументТовары.Ссылка.Грузоотправитель.ТипОрганизации В(&ТипыОрганизаций)
	|		И ДокументТовары.КоличествоФакт <> 0) КАК Товары
	|
	|СГРУППИРОВАТЬ ПО
	|	Товары.Характеристика,
	|	Товары.КППКонтрагента,
	|	Товары.ОрганизацияЕГАИС,
	|	Товары.ИННКонтрагента,
	|	Товары.Серия,
	|	Товары.Номенклатура,
	|	Товары.Цена,
	|	Товары.КоэффициентЕГАИС";
	
	Возврат ТекстЗапроса;
	
КонецФункции

#КонецОбласти

#КонецОбласти

#КонецЕсли

Связанные материалы