Акт списания ЕГАИС / Модуль менеджера

файл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

			Если СтрокаТЧ.ЧастичноеВыбытие
				И Не ТребуетсяРезервирование Тогда
				Если СтрокаТЧ.Коэффициент = 0 Тогда
					Коэффициент = 1;
				Иначе
					Коэффициент = СтрокаТЧ.Коэффициент;
				КонецЕсли;
				ДанныеЗаписиСтатуса.КоличествоЧастичногоВыбытия = Окр(
					СтрокаТЧ.ЕмкостьПотребительскойУпаковки / Коэффициент * СтрокаТЧ.Количество, 0);
			КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		АкцизныеМарки = Новый ТаблицаЗначений;
		АкцизныеМарки.Колонки.Добавить("Справка2",         Новый ОписаниеТипов("СправочникСсылка.Справки2ЕГАИС"));
		АкцизныеМарки.Колонки.Добавить("КодАкцизнойМарки", ОбщегоНазначения.ОписаниеТипаСтрока(200));
		АкцизныеМарки.Колонки.Добавить("Количество",       Метаданные.ОпределяемыеТипы.КоличествоЕГАИСНеотрицательное.Тип);
		АкцизныеМарки.Колонки.Добавить("Коэффициент",      ОбщегоНазначения.ОписаниеТипаЧисло(12, 3));
		АкцизныеМарки.Колонки.Добавить("ЧастичноеВыбытие", Новый ОписаниеТипов("Булево"));
		АкцизныеМарки.Колонки.Добавить("Номенклатура",     Метаданные.ОпределяемыеТипы.Номенклатура.Тип);
		АкцизныеМарки.Колонки.Добавить("Характеристика",   Метаданные.ОпределяемыеТипы.ХарактеристикаНоменклатуры.Тип);
		
		Для Каждого СтрокаТЧ Из ВложенныеШтрихкодыУпаковок.МаркированныеТовары Цикл
			
			Справка2 = Неопределено;
			
			Если ЗначениеЗаполнено(СтрокаТЧ.Статус)
				И СтрокаТЧ.Статус <> Перечисления.СтатусыАкцизныхМарок.ВНаличии
				И СтрокаТЧ.Статус <> Перечисления.СтатусыАкцизныхМарок.ВскрытаяБутылка Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
					СтрШаблон(
						НСтр("ru = 'Акцизная марка %1 со статусом %2 не может быть списана'"),
						СтрокаТЧ.Штрихкод,
						СтрокаТЧ.Статус));
			КонецЕсли;
			
			Если ЗначениеЗаполнено(СтрокаТЧ.Справка2) Тогда
				Справка2 = СтрокаТЧ.Справка2;
			Иначе
				НайденнаяСтрока = Товары.Найти(СтрокаТЧ.ИдентификаторСтроки, "ИдентификаторСтроки");
				Если НайденнаяСтрока = Неопределено Тогда
					ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
						СообщениеXML,
						СтрШаблон(
							НСтр("ru = 'Не удалось определить справку 2 для акцизной марки %1'"),
							СтрокаТЧ.Штрихкод));
				Иначе
					Справка2 = НайденнаяСтрока.Справка2;
				КонецЕсли;
			КонецЕсли;
			
			Если Справка2 = Неопределено Тогда
				Продолжить;
			КонецЕсли;

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

			НоваяСтрока = АкцизныеМарки.Добавить();
			НоваяСтрока.Справка2         = Справка2;
			НоваяСтрока.КодАкцизнойМарки = СтрокаТЧ.Штрихкод;
			НоваяСтрока.Номенклатура     = СтрокаТЧ.Номенклатура;
			НоваяСтрока.Характеристика   = СтрокаТЧ.Характеристика;
			НоваяСтрока.ЧастичноеВыбытие = СтрокаТЧ.ЧастичноеВыбытие;
			Если СтрокаТЧ.Количество = 0 Тогда
				НоваяСтрока.Количество = 1;
			Иначе
				НоваяСтрока.Количество = СтрокаТЧ.Количество;
			КонецЕсли;
			Если НоваяСтрока.ЧастичноеВыбытие Тогда
				Если СтрокаТЧ.Коэффициент = 0 Тогда
					НоваяСтрока.Коэффициент = 1;
				Иначе
					НоваяСтрока.Коэффициент = СтрокаТЧ.ЕмкостьПотребительскойУпаковки / СтрокаТЧ.Коэффициент;
				КонецЕсли;
			КонецЕсли;

		КонецЦикла;
		
		ЕстьЧастичноеВыбытие = НоменклатураСЧастичнымВыбытием.Количество() > 0;
		ИспользоватьФорматОбменаV4 = Не ФорматОбменаМенееV4 И ЕстьЧастичноеВыбытие;

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

		Если Не ИспользоватьФорматОбменаV4 Тогда
			ОписаниеНоменклатуры = ОбщегоНазначенияИС.ОписаниеНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"));
		КонецЕсли;

		Для Каждого СтрокаТЧ Из Товары Цикл

			Если СтрокаТЧ.ПроверятьОбъемДАЛ
				И Не ЗначениеЗаполнено(СтрокаТЧ.ОбъемДАЛ) Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, СтрШаблон(НСтр("ru = 'Для номенклатуры в строке %1 не установлен объем в декалитрах.'"), СтрокаТЧ.НомерСтроки));
			КонецЕсли;

			Если Не ИспользоватьФорматОбменаV4
				И НоменклатураСЧастичнымВыбытием.Найти(СтрокаТЧ.Номенклатура) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;

			НоваяСтрока = ТоварыИтоги.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);

			Если Не ИспользоватьФорматОбменаV4
				И Не СтрокаТЧ.ПроверятьОбъемДАЛ Тогда
				ДанныеОписанияНоменклатуры = ОписаниеНоменклатуры[НоваяСтрока.Номенклатура];
				Если ДанныеОписанияНоменклатуры <> Неопределено
					И ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке <> 0
					И ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке <> 1 Тогда
					Если СтрокаТЧ.ПроверятьОбъемДАЛ Тогда
						НоваяСтрока.Количество = Окр(НоваяСтрока.Количество / ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке, 4);
					Иначе
						НоваяСтрока.Количество = Окр(НоваяСтрока.Количество / ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке, 0);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;

		КонецЦикла;

		Если ИспользоватьФорматОбменаV4 Тогда
			ТоварыИтоги.Свернуть("АлкогольнаяПродукция,Справка2,НомерСправки2,Номенклатура,Характеристика", "Количество, Сумма");
		Иначе
			ТоварыИтоги.Свернуть("АлкогольнаяПродукция,Справка2,НомерСправки2", "Количество, Сумма");
		КонецЕсли;

		#КонецОбласти
		
		#Область АктСписанияИзРегистра1
		
		Если ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V1 Тогда
			
			#Область ФорматОбмена_V1
			
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffType");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", Шапка.Идентификатор, СообщениеXML, 3);
			
			АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActNumber"   , СокрЛП(Шапка.Номер),           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate"     , Шапка.Дата,                    СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "TypeWriteOff", Строка(Шапка.ПричинаСписания), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",         Шапка.Комментарий,             СообщениеXML);
			
			АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
			
			Для Каждого СтрокаТЧ Из ТоварыИтоги Цикл
				
				НомерСтроки = Формат(ТоварыИтоги.Индекс(СтрокаТЧ) + 1, "ЧГ=0");
				
				Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffPositionType");
				
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity", НомерСтроки,                  СообщениеXML, 5);
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Quantity", СтрокаТЧ.Количество,          СообщениеXML);
				
				Position.InformB  = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "InformB");
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position.InformB, "BRegId", СтрокаТЧ.НомерСправки2, СообщениеXML);
				
				АктXDTO.Content.Position.Добавить(Position);
				
			КонецЦикла;
			
			#КонецОбласти
			
		ИначеЕсли ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V2 Тогда
			
			#Область ФорматОбмена_V2
			
			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffType_v2");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", Шапка.Идентификатор, СообщениеXML, 3);
			
			АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActNumber"   , СокрЛП(Шапка.Номер),           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate"     , Шапка.Дата,                    СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "TypeWriteOff", Строка(Шапка.ПричинаСписания), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",         Шапка.Комментарий,             СообщениеXML);
			
			АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
			
			Для Каждого СтрокаТЧ Из ТоварыИтоги Цикл
				
				НомерСтроки = Формат(ТоварыИтоги.Индекс(СтрокаТЧ) + 1, "ЧГ=0");
				
				Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffPositionType");
				
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity", НомерСтроки,         СообщениеXML, 5);
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Quantity", СтрокаТЧ.Количество, СообщениеXML);
				
				Position.InformF1F2 = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "InformF1F2");
				Position.InformF1F2.InformF2 = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position.InformF1F2, "InformF2");
				
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position.InformF1F2.InformF2, "F2RegId", СтрокаТЧ.НомерСправки2, СообщениеXML);
				
				ИнтеграцияЕГАИС.ЗаполнитьВXDTOАкцизныеМаркиПоСправке2_v2(Position, СтрокаТЧ, АкцизныеМарки, "MarkCode", СообщениеXML);
				
				АктXDTO.Content.Position.Добавить(Position);
				
			КонецЦикла;
			
			#КонецОбласти
			
		ИначеЕсли Не ИспользоватьФорматОбменаV4 Тогда
			
			#Область ФорматОбмена_V3
			
			ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3;
			ПространствоИмен = СтрЗаменить(ПространствоИмен, "ActWriteOff_v4", "ActWriteOff_v3");
			ИмяТипа = СтрЗаменить(ИмяТипа, "ActWriteOff_v4", "ActWriteOff_v3");

			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffType_v3");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", Шапка.Идентификатор, СообщениеXML, 3);
			
			АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActNumber"   , СокрЛП(Шапка.Номер),           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate"     , Шапка.Дата,                    СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "TypeWriteOff", Строка(Шапка.ПричинаСписания), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",         Шапка.Комментарий,             СообщениеXML);
			
			АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
			
			Для Каждого СтрокаТЧ Из ТоварыИтоги Цикл
				
				НомерСтроки = Формат(ТоварыИтоги.Индекс(СтрокаТЧ) + 1, "ЧГ=0");
				
				Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffPositionType");
				
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity", НомерСтроки,         СообщениеXML, 5);
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Quantity", СтрокаТЧ.Количество, СообщениеXML);
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "SumSale",  СтрокаТЧ.Сумма,      СообщениеXML);
				
				Position.InformF1F2 = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "InformF1F2");
				Position.InformF1F2.InformF2 = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position.InformF1F2, "InformF2");
				
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position.InformF1F2.InformF2, "F2RegId", СтрокаТЧ.НомерСправки2, СообщениеXML);
				
				ИнтеграцияЕГАИС.ЗаполнитьВXDTOАкцизныеМаркиПоСправке2_v2(Position, СтрокаТЧ, АкцизныеМарки, "amc", СообщениеXML);
				
				АктXDTO.Content.Position.Добавить(Position);

			КонецЦикла;

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

		Иначе

			#Область ФорматОбмена_V4

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

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

				Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл

					Если КоличествоКРаспределению = 0 Тогда
						Прервать;
					КонецЕсли;

					Если НайденнаяСтрока.Количество = 0 Тогда
						Продолжить;
					КонецЕсли;

					Количество = Мин(КоличествоКРаспределению, НайденнаяСтрока.Количество);

					Если НайденнаяСтрока.Количество = Количество Тогда
						Сумма = НайденнаяСтрока.Сумма;
					Иначе
						Сумма = Окр(НайденнаяСтрока.Сумма / НайденнаяСтрока.Количество * Количество, 2);
					КонецЕсли;

					НайденнаяСтрока.Количество = НайденнаяСтрока.Количество - Количество;
					НайденнаяСтрока.Сумма = НайденнаяСтрока.Сумма - Сумма;

					Если СтрокаТЧ.ЧастичноеВыбытие Тогда
						НоваяСтрока = ТоварыИтоги.Добавить();
						ЗаполнитьЗначенияСвойств(НоваяСтрока, НайденнаяСтрока,, "АкцизныеМарки");
						НоваяСтрока.ЧастичноеВыбытие = Истина;
						НоваяСтрока.Количество       = 0;
						НоваяСтрока.Сумма            = 0;
						НоваяСтрока.КоличествоЕГАИС  = Окр(Количество * СтрокаТЧ.Коэффициент, 0);
						НоваяСтрока.СуммаЕГАИС       = Сумма;
						НоваяСтрока.АкцизныеМарки.Добавить(СтрокаТЧ.КодАкцизнойМарки);

						Если НайденнаяСтрока.Количество = 0
							И НайденнаяСтрока.АкцизныеМарки.Количество() = 0 Тогда
							ТоварыИтоги.Удалить(НайденнаяСтрока);
						КонецЕсли;
					Иначе
						НайденнаяСтрока.КоличествоЕГАИС = НайденнаяСтрока.КоличествоЕГАИС + 1;
						НайденнаяСтрока.СуммаЕГАИС      = НайденнаяСтрока.СуммаЕГАИС + Сумма;
						НайденнаяСтрока.АкцизныеМарки.Добавить(СтрокаТЧ.КодАкцизнойМарки);
					КонецЕсли;

					КоличествоКРаспределению = КоличествоКРаспределению - Количество;

				КонецЦикла;

			КонецЦикла;

			АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffType_v4");

			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", Шапка.Идентификатор, СообщениеXML, 3);

			АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");

			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActNumber"   , СокрЛП(Шапка.Номер),           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate"     , Шапка.Дата,                    СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "TypeWriteOff", Строка(Шапка.ПричинаСписания), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",         Шапка.Комментарий,             СообщениеXML);

			АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");

			НомерСтроки = 0;

			Для Каждого СтрокаТЧ Из ТоварыИтоги Цикл

				НомерСтроки = НомерСтроки + 1;

				Если СтрокаТЧ.АкцизныеМарки.Количество() = 0 Тогда
					Количество = СтрокаТЧ.Количество;
					Сумма      = СтрокаТЧ.Сумма;
				Иначе
					Количество = СтрокаТЧ.КоличествоЕГАИС;
					Сумма      = СтрокаТЧ.СуммаЕГАИС;
				КонецЕсли;

				Если СтрокаТЧ.ЧастичноеВыбытие Тогда
					ИмяПоляКоличество = "volume";
				Иначе
					ИмяПоляКоличество = "Quantity";
				КонецЕсли;

				Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffPositionType");

				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity", Формат(НомерСтроки, "ЧГ=0"), СообщениеXML, 5);
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "SumSale", Сумма, СообщениеXML);

				Position.writeoffvolume = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "writeoffvolume");
				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position.writeoffvolume, ИмяПоляКоличество, Количество, СообщениеXML);

				Position.InformF1F2 = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "InformF1F2");
				Position.InformF1F2.InformF2 = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position.InformF1F2, "InformF2");

				РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position.InformF1F2.InformF2, "F2RegId", СтрокаТЧ.НомерСправки2, СообщениеXML);

				Если СтрокаТЧ.АкцизныеМарки.Количество() > 0 Тогда
					Position.MarkCodeInfo = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "MarkCodeInfo");
					Для Каждого АкцизнаяМарка Из СтрокаТЧ.АкцизныеМарки Цикл
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position.MarkCodeInfo, "amc", АкцизнаяМарка, СообщениеXML);
					КонецЦикла;
				КонецЕсли;

				АктXDTO.Content.Position.Добавить(Position);
				
			КонецЦикла;
			
			#КонецОбласти
			
		КонецЕсли;
		
		#КонецОбласти
		
	ИначеЕсли Шапка.Операция = Перечисления.ВидыДокументовЕГАИС.АктСписанияИзРегистра2 Тогда
		
		#Область ПодготовкаДанных
		
		ТоварыИтоги = Новый ТаблицаЗначений;
		ТоварыИтоги.Колонки.Добавить("АлкогольнаяПродукция");
		ТоварыИтоги.Колонки.Добавить("Количество");
		ТоварыИтоги.Колонки.Добавить("Сумма");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			Если СтрокаТЧ.ПроверятьОбъемДАЛ
				И Не ЗначениеЗаполнено(СтрокаТЧ.ОбъемДАЛ) Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, СтрШаблон(НСтр("ru = 'Для номенклатуры в строке %1 не установлен объем в декалитрах.'"), СтрокаТЧ.НомерСтроки));
			КонецЕсли;
			
			НоваяСтрока = ТоварыИтоги.Добавить();
			НоваяСтрока.АлкогольнаяПродукция = СтрокаТЧ.АлкогольнаяПродукция;
			НоваяСтрока.Количество           = СтрокаТЧ.Количество;
			НоваяСтрока.Сумма                = СтрокаТЧ.Сумма;
			
		КонецЦикла;
		
		ТоварыИтоги.Свернуть("АлкогольнаяПродукция", "Количество, Сумма");
		
		АкцизныеМарки = Новый ТаблицаЗначений;
		АкцизныеМарки.Колонки.Добавить("АлкогольнаяПродукция");
		АкцизныеМарки.Колонки.Добавить("КодАкцизнойМарки");
		
		Для Каждого СтрокаТЧ Из ВложенныеШтрихкодыУпаковок.МаркированныеТовары Цикл
			
			ТекущаяАлкогольнаяПродукция = Неопределено;
			
			Если ЗначениеЗаполнено(СтрокаТЧ.Статус)
				И СтрокаТЧ.Статус <> Перечисления.СтатусыАкцизныхМарок.ВНаличии
				И СтрокаТЧ.Статус <> Перечисления.СтатусыАкцизныхМарок.ВскрытаяБутылка Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
					СтрШаблон(
						НСтр("ru = 'Акцизная марка %1 со статусом %2 не может быть списана'"),
						СтрокаТЧ.Штрихкод,
						СтрокаТЧ.Статус));
			КонецЕсли;
			
			Если ЗначениеЗаполнено(СтрокаТЧ.АлкогольнаяПродукция) Тогда
				ТекущаяАлкогольнаяПродукция = СтрокаТЧ.АлкогольнаяПродукция;
			Иначе
				НайденнаяСтрока = Товары.Найти(СтрокаТЧ.ИдентификаторСтроки, "ИдентификаторСтроки");
				Если НайденнаяСтрока = Неопределено Тогда
					ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
						СообщениеXML,
						СтрШаблон(
							НСтр("ru = 'Не удалось определить алкогольную продукцию для акцизной марки %1'"),
							СтрокаТЧ.Штрихкод));
				Иначе
					ТекущаяАлкогольнаяПродукция = НайденнаяСтрока.АлкогольнаяПродукция;
				КонецЕсли;
			КонецЕсли;
			
			Если ТекущаяАлкогольнаяПродукция = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			НоваяСтрока = АкцизныеМарки.Добавить();
			НоваяСтрока.АлкогольнаяПродукция = ТекущаяАлкогольнаяПродукция;
			НоваяСтрока.КодАкцизнойМарки     = СтрокаТЧ.Штрихкод;
			
		КонецЦикла;
		
		#КонецОбласти
		
		#Область АктСписанияИзРегистра2
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffShopType_v2");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", Шапка.Идентификатор, СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActNumber"   , СокрЛП(Шапка.Номер),           СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate"     , Шапка.Дата,                    СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "TypeWriteOff", Строка(Шапка.ПричинаСписания), СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",         Шапка.Комментарий,             СообщениеXML);
	
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		Для Каждого СтрокаТЧ Из ТоварыИтоги Цикл
			
			НомерСтроки = Формат(ТоварыИтоги.Индекс(СтрокаТЧ) + 1, "ЧГ=0");
			
			Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActWriteOffShopPositionType");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity", НомерСтроки, СообщениеXML, 5);
			Position.Product = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(Position, "Product");
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Quantity", СтрокаТЧ.Количество, СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "SumSale",  СтрокаТЧ.Сумма,      СообщениеXML);
			
			ИнтеграцияЕГАИС.ЗаполнитьВXDTOАлкогольнуюПродукцию_v2(
				Position.Product,
				АлкогольнаяПродукция.Найти(СтрокаТЧ.АлкогольнаяПродукция, "АлкогольнаяПродукция"),
				"Продукция", СообщениеXML);
			
			ПараметрыОтбораАкцизныМарок = Новый Структура;
			ПараметрыОтбораАкцизныМарок.Вставить("АлкогольнаяПродукция", СтрокаТЧ.АлкогольнаяПродукция);
			
			ИнтеграцияЕГАИС.ЗаполнитьВXDTOАкцизныеМаркиПоОтбору(Position, ПараметрыОтбораАкцизныМарок, АкцизныеМарки, "MarkCode", СообщенияXML);
			
			АктXDTO.Content.Position.Добавить(Position);
			
		КонецЦикла;
		
		#КонецОбласти
		
	ИначеЕсли Шапка.Операция = Перечисления.ВидыДокументовЕГАИС.АктСписанияИзРегистра3 Тогда
		
		#Область ПодготовкаДанных
		
		ТоварыИтоги = Новый ТаблицаЗначений;
		ТоварыИтоги.Колонки.Добавить("АлкогольнаяПродукция");
		ТоварыИтоги.Колонки.Добавить("Справка2");
		ТоварыИтоги.Колонки.Добавить("НомерСправки2");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			НоваяСтрока = ТоварыИтоги.Добавить();
			НоваяСтрока.АлкогольнаяПродукция = СтрокаТЧ.АлкогольнаяПродукция;
			НоваяСтрока.Справка2             = СтрокаТЧ.Справка2;
			НоваяСтрока.НомерСправки2        = СтрокаТЧ.НомерСправки2;
			
		КонецЦикла;
		
		ТоварыИтоги.Свернуть("АлкогольнаяПродукция, Справка2, НомерСправки2");
		
		АкцизныеМарки = Новый ТаблицаЗначений;
		АкцизныеМарки.Колонки.Добавить("Справка2");
		АкцизныеМарки.Колонки.Добавить("КодАкцизнойМарки");
		
		Для Каждого СтрокаТЧ Из ВложенныеШтрихкодыУпаковок.МаркированныеТовары Цикл
			
			Справка2 = Неопределено;
			
			Если ЗначениеЗаполнено(СтрокаТЧ.Статус)
				И СтрокаТЧ.Статус <> Перечисления.СтатусыАкцизныхМарок.ВНаличии Тогда
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Некорректный статус.'"));
			КонецЕсли;
			
			Если ЗначениеЗаполнено(СтрокаТЧ.Справка2) Тогда
				Справка2 = СтрокаТЧ.Справка2;
			Иначе
				НайденнаяСтрока = Товары.Найти(СтрокаТЧ.ИдентификаторСтроки, "ИдентификаторСтроки");
				Если НайденнаяСтрока = Неопределено Тогда
					ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Не удалось найти справку 2'"));
				Иначе
					Справка2 = НайденнаяСтрока.Справка2;
				КонецЕсли;
			КонецЕсли;
			
			Если Справка2 = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			НоваяСтрока = АкцизныеМарки.Добавить();
			НоваяСтрока.Справка2         = Справка2;
			НоваяСтрока.КодАкцизнойМарки = СтрокаТЧ.Штрихкод;
			
		КонецЦикла;
		
		#КонецОбласти
		
		#Область АктСписанияИзРегистра3
		
		АктXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActUnFixBarCode");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO, "Identity", Шапка.Идентификатор, СообщениеXML, 3);
		
		АктXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Header");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Number",  СокрЛП(Шапка.Номер),   СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "ActDate", Шапка.Дата,            СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(АктXDTO.Header, "Note",    Шапка.Комментарий,     СообщениеXML);
		
		АктXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(АктXDTO, "Content");
		
		Для Каждого СтрокаТЧ Из ТоварыИтоги Цикл
			
			НомерСтроки = Формат(ТоварыИтоги.Индекс(СтрокаТЧ) + 1, "ЧГ=0");
			
			Position = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ActUnFixBarCodePositionType");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Identity",     НомерСтроки,            СообщениеXML, 5);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Position, "Inform2RegId", СтрокаТЧ.НомерСправки2, СообщениеXML);
			
			ИнтеграцияЕГАИС.ЗаполнитьВXDTOАкцизныеМаркиПоСправке2_v3(Position, СтрокаТЧ, АкцизныеМарки, СообщенияXML);
			
			АктXDTO.Content.Position.Добавить(Position);
			
		КонецЦикла;
		
		#КонецОбласти
	
	КонецЕсли;
	
	ТекстСообщения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(ПространствоИмен, "RequestRepealAWO");
	
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "ClientId",      Шапка.ИдентификаторФСРАР, СообщениеXML);
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "RequestNumber", СокрЛП(Шапка.Номер),      СообщениеXML);
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "RequestDate",   ТекущаяДатаСеанса(),      СообщениеXML);
	РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЗапросXDTO, "AWORegId",      Шапка.ИдентификаторЕГАИС, СообщениеXML);
	
	ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(ЗапросXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
	
	СообщениеXML.ТекстСообщенияXML = ТекстСообщенияXML;
	СообщениеXML.ТипСообщения      = Перечисления.ТипыЗапросовИС.Исходящий;
	СообщениеXML.ОрганизацияЕГАИС  = Шапка.ОрганизацияЕГАИС;
	СообщениеXML.Операция          = Операция;
	СообщениеXML.ФорматОбмена      = ФорматОбмена;
	СообщениеXML.Документ          = ДокументСсылка;
	СообщениеXML.ДокументОснование = Шапка.ДокументОснование;
	СообщениеXML.Версия            = НомерВерсии;
	
	СообщенияXML.Добавить(СообщениеXML);
	
	Возврат СообщенияXML;
	
КонецФункции

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

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

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

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

Функция ОбработатьДанныеШтрихкода(Форма, ДанныеШтрихкода, ПараметрыСканирования, ВложенныеШтрихкоды = Неопределено) Экспорт
	
	Если ИнтеграцияИСКлиентСервер.ЭтоУпаковка(ДанныеШтрихкода.ТипУпаковки) Тогда
		
		Возврат ОбработатьДанныеШтрихкодаЛогистическойУпаковки(Форма, ДанныеШтрихкода, ВложенныеШтрихкоды, ПараметрыСканирования);
		
	ИначеЕсли ДанныеШтрихкода.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
		
		Возврат ОбработатьДанныеШтрихкодаПотребительскойУпаковки(Форма, ДанныеШтрихкода, ПараметрыСканирования);
		
	ИначеЕсли ДанныеШтрихкода.ТипШтрихкода = Перечисления.ТипыШтрихкодов.DataMatrix Тогда
		
		Возврат ОбработатьДанныеШтрихкодаСНомеромИСерией(Форма, ДанныеШтрихкода, ПараметрыСканирования);
		
	ИначеЕсли ДанныеШтрихкода.ВидУпаковки = Перечисления.ВидыУпаковокИС.Потребительская
		И ДанныеШтрихкода.МаркируемаяПродукция <> Истина
		И ДанныеШтрихкода.ЭтоШтрихкодНоменклатуры Тогда
		
		Возврат ОбработатьДанныеШтрихкодаПотребительскойУпаковки(Форма, ДанныеШтрихкода, ПараметрыСканирования);
		
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

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

	Если Не ЭтоЧастичноеВыбытие
		И ДанныеШтрихкода.Коэффициент <> Неопределено
		И ДанныеШтрихкода.Коэффициент > 0 Тогда
		КоличествоПродукции = ДанныеШтрихкода.Коэффициент;
	Иначе
		КоличествоПродукции = ДанныеШтрихкода.Количество;
	КонецЕсли;

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

		Если ЭтоЧастичноеВыбытие Тогда
			АкцизныеМаркиСтрокаТЧ.ЧастичноеВыбытиеКоличество     = КоличествоПродукции;
			АкцизныеМаркиСтрокаТЧ.ЧастичноеВыбытиеВариантУчета   = ДанныеШтрихкода.ЧастичноеВыбытиеВариантУчета;
			АкцизныеМаркиСтрокаТЧ.ЧастичноеВыбытиеНоменклатура   = ДанныеШтрихкода.Номенклатура;
			АкцизныеМаркиСтрокаТЧ.ЧастичноеВыбытиеХарактеристика = ДанныеШтрихкода.Характеристика;
			АкцизныеМаркиСтрокаТЧ.ВыбытиеБутылки                 = ДанныеШтрихкода.ВыбытиеБутылки;
		КонецЕсли;

		Если ЗначениеЗаполнено(ДанныеШтрихкода.Справка2) Тогда
			АкцизныеМаркиСтрокаТЧ.Справка2 = ДанныеШтрихкода.Справка2;
		Иначе
			АкцизныеМаркиСтрокаТЧ.ИдентификаторСтроки = СтрокаТЧ.ИдентификаторСтроки;
		КонецЕсли;
		
	КонецЕсли;
	
	Результат.ДобавленныеСтроки = ПараметрыЗаполнения.ДобавленныеСтроки;
	Результат.ИзмененныеСтроки  = ПараметрыЗаполнения.ИзмененныеСтроки;
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

Процедура ОбработатьСтрокиТЧ(ДокументОбъект, ПараметрыЗаполнения)
	
	ПараметрыУказанияСерий = ПараметрыУказанияСерий(ДокументОбъект);
	ПустойСклад = ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа("Склад");
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
	СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", ПустойСклад, ПараметрыУказанияСерий));
	
	Для Каждого СтрокаТЧ Из ПараметрыЗаполнения.ДобавленныеСтроки Цикл
		
		ИнтеграцияИСПереопределяемый.ОбработатьСтрокуТабличнойЧасти(СтрокаТЧ, СтруктураДействий, ДокументОбъект);
		
	КонецЦикла;
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
	СтруктураДействий.Вставить("ПересчитатьСумму");
	
	Для Каждого СтрокаТЧ Из ПараметрыЗаполнения.ИзмененныеСтроки Цикл
		
		ИнтеграцияИСПереопределяемый.ОбработатьСтрокуТабличнойЧасти(СтрокаТЧ, СтруктураДействий, ДокументОбъект);
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	Если НЕ ИнтеграцияЕГАИС.ЕстьТаблицаЗапроса("ВТАкцизныеМарки", ТекстыЗапроса) Тогда
		ТекстЗапросаВТАкцизныеМарки(Запрос, ТекстыЗапроса);
	КонецЕсли;

	Если НЕ ИнтеграцияЕГАИС.ЕстьТаблицаЗапроса("ВТВскрытыеБутылки", ТекстыЗапроса) Тогда
		ТекстЗапросаВТВскрытыеБутылки(Запрос, ТекстыЗапроса);
	КонецЕсли;

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

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

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

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

Функция ТекстЗапросаВТТаблицаТоварыСгруппированные(Запрос, ТекстыЗапроса)

	ИмяТаблицы = "ВТТаблицаТоварыСгруппированные";

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

	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяТаблицы);

	Возврат ТекстЗапроса;

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

Функция ТекстЗапросаВТАкцизныеМарки(Запрос, ТекстыЗапроса)

	ИмяТаблицы = "ВТАкцизныеМарки";

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

	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяТаблицы);

	Возврат ТекстЗапроса;

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

Функция ТекстЗапросаВТВскрытыеБутылки(Запрос, ТекстыЗапроса)

	ИмяТаблицы = "ВТВскрытыеБутылки";

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

	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяТаблицы);

	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	Возврат;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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