Чек ЕГАИС / Модуль менеджера

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция СообщенияЧекЕГАИСXML(ДокументСсылка, РезультатыЗапроса, МенеджерВременныхТаблиц, Операция = Неопределено) Экспорт
	
	СообщенияXML = Новый Массив;
	
	Если Операция = Неопределено Тогда
		Операция = Перечисления.ВидыДокументовЕГАИС.ЧекККМ;
	КонецЕсли;
	
	//@skip-check wrong-string-literal-content
	Шапка  = РезультатыЗапроса["Шапка"].Выбрать();
	//@skip-check wrong-string-literal-content
	Товары = РезультатыЗапроса["Товары"].Выгрузить();
	
	Если Не Шапка.Следующий()
		Или Товары.Количество() = 0 Тогда
		
		СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
		СообщениеXML.Документ = ДокументСсылка;
		СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
			Операция, ДокументСсылка);
		
		ОбщегоНазначенияИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, НСтр("ru = 'Нет данных для выгрузки.'"));
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	НомерВерсии = Шапка.ПоследнийНомерВерсии + 1;
	ФорматОбмена = ОбменДаннымиЕГАИСКлиентСервер.ФорматОбмена(Шапка.ФорматОбмена);
	
	ФорматОбменаМенееV4 = Не Перечисления.ФорматыОбменаЕГАИС.ФорматОбменаНеМенееV4(ФорматОбмена);
	
	СообщениеXML = ОбменДаннымиЕГАИС.СтруктураСообщенияXML();
	СообщениеXML.Документ = ДокументСсылка;
	СообщениеXML.Описание = ОбменДаннымиЕГАИС.ОписаниеОперацииПередачиДанных(
		Операция, ДокументСсылка, НомерВерсии);
	
	ИмяТипа          = Перечисления.ВидыДокументовЕГАИС.ТипЕГАИС(Операция, ФорматОбмена);
	ПространствоИмен = Перечисления.ВидыДокументовЕГАИС.ПространствоИмен(Операция, ФорматОбмена);
	
	Если ПространствоИмен = Неопределено
		Или ИмяТипа = Неопределено Тогда
		ОбщегоНазначенияИСКлиентСервер.ДобавитьТекстОшибки(
			СообщениеXML,
			СтрШаблон(НСтр("ru = 'Операция не поддерживается в версии формата обмена: %1.'"), ФорматОбмена));
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
	КонецЕсли;
	
	Если Шапка.Количество() > 1 Тогда
		
		ТекстСообщения = НСтр("ru = 'Ошибка сопоставления организаций ЕГАИС с данными информационной базы.
		                            |По данным сопоставления найдено несколько организаций ЕГАИС'");
		
		ОбщегоНазначенияИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, ТекстСообщения);
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Шапка.ОрганизацияЕГАИС) Тогда
		
		ТекстСообщения = НСтр("ru = 'Ошибка сопоставления организаций ЕГАИС с данными информационной базы.
		                            |Не удалось найти организацию ЕГАИС'");
		
		ОбщегоНазначенияИСКлиентСервер.ДобавитьТекстОшибки(СообщениеXML, ТекстСообщения);
		
		СообщенияXML.Добавить(СообщениеXML);
		Возврат СообщенияXML;
		
	КонецЕсли;
	
	//@skip-check wrong-string-literal-content
	Выборка = РезультатыЗапроса["ВложенныеШтрихкоды"].Выбрать();
	ВложенныеШтрихкодыУпаковок = ШтрихкодированиеЕГАИС.ВложенныеШтрихкодыУпаковокПоВыборкеИМенеджеруВТ(
		Выборка, МенеджерВременныхТаблиц);
	
	АкцизныеМарки = Новый ТаблицаЗначений;
	АкцизныеМарки.Колонки.Добавить("ИдентификаторСтроки",  Метаданные.ОпределяемыеТипы.УникальныйИдентификаторИС.Тип);
	АкцизныеМарки.Колонки.Добавить("АлкогольнаяПродукция", Новый ОписаниеТипов("СправочникСсылка.КлассификаторАлкогольнойПродукцииЕГАИС"));
	АкцизныеМарки.Колонки.Добавить("КодАкцизнойМарки",     ОбщегоНазначения.ОписаниеТипаСтрока(200));
	АкцизныеМарки.Колонки.Добавить("Количество",           Метаданные.ОпределяемыеТипы.КоличествоЕГАИСНеотрицательное.Тип);
	АкцизныеМарки.Колонки.Добавить("Коэффициент",          ОбщегоНазначения.ОписаниеТипаЧисло(12, 3));
	АкцизныеМарки.Колонки.Добавить("ЧастичноеВыбытие",     Новый ОписаниеТипов("Булево"));
	АкцизныеМарки.Колонки.Добавить("Номенклатура",         Метаданные.ОпределяемыеТипы.Номенклатура.Тип);
	АкцизныеМарки.Колонки.Добавить("Характеристика",       Метаданные.ОпределяемыеТипы.ХарактеристикаНоменклатуры.Тип);
	АкцизныеМарки.Колонки.Добавить("КоличествоВПотребительскойУпаковке", ОбщегоНазначения.ОписаниеТипаЧисло(18, 8));
	
	НоменклатураСЧастичнымВыбытием = Новый Массив;
	
	Для Каждого СтрокаТЧ Из ВложенныеШтрихкодыУпаковок.МаркированныеТовары Цикл
		
		Если СтрокаТЧ.ЧастичноеВыбытие Тогда
			Если НоменклатураСЧастичнымВыбытием.Найти(СтрокаТЧ.Номенклатура) = Неопределено Тогда
				НоменклатураСЧастичнымВыбытием.Добавить(СтрокаТЧ.Номенклатура);
			КонецЕсли;
			Если ФорматОбменаМенееV4 Тогда
				ОбщегоНазначенияИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
					СтрШаблон(
						НСтр("ru = 'Акцизная марка %1 не может быть обработана по причине: формат обмена %2 не поддерживает частичное выбытие'"),
						СтрокаТЧ.Штрихкод,
						ФорматОбмена));
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		НоваяСтрока = АкцизныеМарки.Добавить();
		НоваяСтрока.ИдентификаторСтроки  = СтрокаТЧ.ИдентификаторСтроки;
		НоваяСтрока.АлкогольнаяПродукция = СтрокаТЧ.АлкогольнаяПродукция;
		НоваяСтрока.КодАкцизнойМарки     = СтрокаТЧ.Штрихкод;
		НоваяСтрока.Номенклатура         = СтрокаТЧ.Номенклатура;
		НоваяСтрока.Характеристика       = СтрокаТЧ.Характеристика;
		НоваяСтрока.ЧастичноеВыбытие     = СтрокаТЧ.ЧастичноеВыбытие;
		Если СтрокаТЧ.Коэффициент = 0 Тогда
			НоваяСтрока.КоличествоВПотребительскойУпаковке = 1;
		Иначе
			НоваяСтрока.КоличествоВПотребительскойУпаковке = СтрокаТЧ.Коэффициент;
		КонецЕсли;
		Если СтрокаТЧ.Количество = 0 Тогда
			НоваяСтрока.Количество = 1;
		Иначе
			НоваяСтрока.Количество = СтрокаТЧ.Количество;
		КонецЕсли;
		Если НоваяСтрока.ЧастичноеВыбытие Тогда
			Если СтрокаТЧ.Коэффициент = 0 Тогда
				НоваяСтрока.Коэффициент = 1;
			Иначе
				НоваяСтрока.Коэффициент = СтрокаТЧ.ЕмкостьПотребительскойУпаковки / СтрокаТЧ.Коэффициент;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
	ЕстьЧастичноеВыбытие = НоменклатураСЧастичнымВыбытием.Количество() > 0;
	ИспользоватьФорматОбменаV4 = Не ФорматОбменаМенееV4 И ЕстьЧастичноеВыбытие;
	
	Если ИспользоватьФорматОбменаV4 Тогда
		
		ЧекXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ChequeV4Type");
			
		#Область ФормированиеСообшенияОбменаШапка
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(
			ЧекXDTO, "Identity", 
			СтрШаблон(
				"%1%2%3",
				Шапка.СерийныйНомерККМ,
				Формат(Шапка.НомерСмены, "ЧГ=0"),
				Формат(Шапка.НомерЧекаККМ, "ЧГ=0")), СообщениеXML, 3);
		
		Если Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИС.РеализацияРозничномуПокупателю
			Или Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИС.ВскрытиеТары Тогда
			
			ЧекXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Date",     Формат(Шапка.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Kassa",    Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Shift",    Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Number",   Шапка.НомерЧекаККМ,                           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Type",     "Продажа",                                    СообщениеXML);
			
		ИначеЕсли Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИС.РеализацияЮридическомуЛицуСБезналичнойОплатой Тогда
			
			ЧекXDTO.HeaderTTN = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "HeaderTTN");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Date",       Формат(Шапка.Дата, "ДФ=yyyy-MM-dd"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "BillNumber", Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "TTNNumber",  Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Type",       "Продажа",                                    СообщениеXML);
			
		ИначеЕсли Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИСВозврат.ВозвратОтРозничногоПокупателя Тогда
			
			ЧекXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Date",     Формат(Шапка.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Kassa",    Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Shift",    Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Number",   Шапка.НомерЧекаККМ,                           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Type",     "Возврат",                                    СообщениеXML);
			
		ИначеЕсли Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИСВозврат.ВозвратОтЮридическогоЛицаСБезналичнойОплатой Тогда
			
			ЧекXDTO.HeaderTTN = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "HeaderTTN");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Date",       Формат(Шапка.Дата, "ДФ=yyyy-MM-dd"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "BillNumber", Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "TTNNumber",  Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Type",       "Возврат",                                    СообщениеXML);	
			
		КонецЕсли;
		
		ЧекXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "Content");
		
		#КонецОбласти
		
		#Область ФорматОбмена_V4
		
		#Область ПодготовкаДанных
		
		ПустойИдентификаторСтроки = ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа(Метаданные.ОпределяемыеТипы.УникальныйИдентификаторИС);
		
		ТаблицаТовары = Товары.Скопировать(,
			"НомерСтроки,ИдентификаторСтроки,АлкогольнаяПродукция,Номенклатура,Характеристика,Штрихкод,Количество,Цена,ОбъемДАЛ");
		
		ТаблицаТовары.Колонки.Добавить("ЧастичноеВыбытие", Новый ОписаниеТипов("Булево"));
		ТаблицаТовары.Колонки.Добавить("АкцизныеМарки",    Новый ОписаниеТипов("Массив"));
		ТаблицаТовары.Колонки.Добавить("КоличествоЕГАИС",  Метаданные.ОпределяемыеТипы.КоличествоЕГАИСНеотрицательное.Тип);
		ТаблицаТовары.Колонки.Добавить("ЦенаЕГАИС",        Метаданные.ОпределяемыеТипы.ДенежнаяСуммаГосИСНеотрицательная.Тип);
		
		Для Каждого СтрокаТЧ Из АкцизныеМарки Цикл
			
			КоличествоКРаспределению = СтрокаТЧ.Количество;
			
			СтруктураПоиска = Новый Структура;
			СтруктураПоиска.Вставить("ЧастичноеВыбытие",    Ложь);
			СтруктураПоиска.Вставить("ИдентификаторСтроки", СтрокаТЧ.ИдентификаторСтроки);
			Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
				СтруктураПоиска.Вставить("Номенклатура",   СтрокаТЧ.Номенклатура);
				СтруктураПоиска.Вставить("Характеристика", СтрокаТЧ.Характеристика);
			КонецЕсли;
			
			ЧекиЕГАИС.РаспределитьАкцизнуюМаркуПоТаблицеТоваров(ТаблицаТовары, СтруктураПоиска, СтрокаТЧ, КоличествоКРаспределению);
			
			Если КоличествоКРаспределению > 0 Тогда
				
				СтруктураПоиска.Вставить("ИдентификаторСтроки",  ПустойИдентификаторСтроки);
				СтруктураПоиска.Вставить("АлкогольнаяПродукция", СтрокаТЧ.АлкогольнаяПродукция);
				Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
					СтруктураПоиска.Вставить("Номенклатура",   СтрокаТЧ.Номенклатура);
					СтруктураПоиска.Вставить("Характеристика", СтрокаТЧ.Характеристика);
				КонецЕсли;
				
				ЧекиЕГАИС.РаспределитьАкцизнуюМаркуПоТаблицеТоваров(ТаблицаТовары, СтруктураПоиска, СтрокаТЧ, КоличествоКРаспределению);
				
			КонецЕсли;
			
		КонецЦикла;
		
		#КонецОбласти
		
		#Область ФормированиеСообшенияОбменаСписок
		
		Для Каждого СтрокаТЧ Из ТаблицаТовары Цикл
			
			Если СтрокаТЧ.Количество = 0 Тогда
				
				Если СтрокаТЧ.ЦенаЕГАИС < 0 Тогда
					Цена = Формат(-СтрокаТЧ.ЦенаЕГАИС, "ЧДЦ=2; ЧРД=.; ЧГ=0");
				Иначе
					Цена = Формат(СтрокаТЧ.ЦенаЕГАИС, "ЧДЦ=2; ЧРД=.; ЧГ=0");
				КонецЕсли;
				
				Если СтрокаТЧ.ЧастичноеВыбытие Тогда
					ИмяОбъектаXDTO = "Catering";
				Иначе
					ИмяОбъектаXDTO = "Bottle";
				КонецЕсли;
				
				Для Каждого КодАкцизнойМарки Из СтрокаТЧ.АкцизныеМарки Цикл
					
					ОбъектXDTO = РаботаСXMLИС.ОбъектXDTOПоИмениСвойства(ПространствоИмен, ИмяОбъектаXDTO, ЧекXDTO.Content);
					
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ОбъектXDTO, "barcode", КодАкцизнойМарки, СообщениеXML);
					
					Если ЗначениеЗаполнено(СтрокаТЧ.Штрихкод)
						И ЧекиЕГАИС.ЭтоШтрихкодEAN(СтрокаТЧ.Штрихкод)
						И Не РазборКодаМаркировкиИССлужебныйКлиентСервер.ЭтоВнутреннийШтрихкод(СтрокаТЧ.Штрихкод) Тогда
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ОбъектXDTO, "ean", СтрокаТЧ.Штрихкод, СообщениеXML);
					Иначе
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ОбъектXDTO, "ean", "0000000000000", СообщениеXML);
					КонецЕсли;
					
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ОбъектXDTO, "price", Цена, СообщениеXML);
					
					Если СтрокаТЧ.ЧастичноеВыбытие Тогда
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ОбъектXDTO, "Volume", СтрокаТЧ.КоличествоЕГАИС, СообщениеXML);
					КонецЕсли;
					
					ЧекXDTO.Content[ИмяОбъектаXDTO].Добавить(ОбъектXDTO);
					
				КонецЦикла;
				
			Иначе
				
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
						СтрШаблон(
							НСтр("ru = 'Указано недостаточное количество акцизных марок в строке %1 табличной части ""Товары""'"), СтрокаТЧ.НомерСтроки));
				
			КонецЕсли;
			
		КонецЦикла;
		
		#КонецОбласти
		
		#КонецОбласти
		
		ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(ЧекXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
		
	ИначеЕсли Не ФорматОбменаМенееV4 Тогда
		
		ОписаниеНоменклатуры = ОбщегоНазначенияИС.ОписаниеНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"));
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			ДанныеОписанияНоменклатуры = ОписаниеНоменклатуры[СтрокаТЧ.Номенклатура];
			Если ДанныеОписанияНоменклатуры <> Неопределено
				И ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке <> 0
				И ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке <> 1 Тогда
				СтрокаТЧ.Цена       = Окр(СтрокаТЧ.Цена * ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке, 2);
				СтрокаТЧ.Количество = Окр(СтрокаТЧ.Количество / ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке, 0);
			КонецЕсли;
		КонецЦикла;
		
		ФорматОбмена = Перечисления.ФорматыОбменаЕГАИС.V3;
		ПространствоИмен = СтрЗаменить(ПространствоИмен, "ChequeV4", "ChequeV3");
		ИмяТипа = СтрЗаменить(ИмяТипа, "ChequeV4", "ChequeV3");
		
		ЧекXDTO = РаботаСXMLЕГАИС.ОбъектXDTO(ПространствоИмен, "ChequeV3Type");
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(
			ЧекXDTO, "Identity", 
			СтрШаблон(
				"%1%2%3",
				Шапка.СерийныйНомерККМ,
				Формат(Шапка.НомерСмены, "ЧГ=0"),
				Формат(Шапка.НомерЧекаККМ, "ЧГ=0")), СообщениеXML, 3);
		
		Если Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИС.РеализацияРозничномуПокупателю
			Или Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИС.ВскрытиеТары Тогда
			
			ЧекXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Date",     Формат(Шапка.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Kassa",    Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Shift",    Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Number",   Шапка.НомерЧекаККМ,                           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Type",     "Продажа",                                    СообщениеXML);
			
		ИначеЕсли Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИС.РеализацияЮридическомуЛицуСБезналичнойОплатой Тогда
			
			ЧекXDTO.HeaderTTN = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "HeaderTTN");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Date",       Формат(Шапка.Дата, "ДФ=yyyy-MM-dd"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "BillNumber", Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "TTNNumber",  Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Type",       "Продажа",                                    СообщениеXML);
			
		ИначеЕсли Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИСВозврат.ВозвратОтРозничногоПокупателя Тогда
			
			ЧекXDTO.Header = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "Header");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Date",     Формат(Шапка.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Kassa",    Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Shift",    Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Number",   Шапка.НомерЧекаККМ,                           СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.Header, "Type",     "Возврат",                                    СообщениеXML);
			
		ИначеЕсли Шапка.ВидОперации = Перечисления.ВидыОперацийЧекаЕГАИСВозврат.ВозвратОтЮридическогоЛицаСБезналичнойОплатой Тогда
			
			ЧекXDTO.HeaderTTN = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "HeaderTTN");
			
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Date",       Формат(Шапка.Дата, "ДФ=yyyy-MM-dd"), СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "BillNumber", Шапка.СерийныйНомерККМ,                       СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "TTNNumber",  Шапка.НомерСмены,                             СообщениеXML);
			РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO.HeaderTTN, "Type",       "Возврат",                                    СообщениеXML);	
			
		КонецЕсли;
		
		ЧекXDTO.Content = РаботаСXMLИС.ОбъектXDTOПоИмениТипа(ЧекXDTO, "Content");
		
		АкцизныеМарки.Индексы.Добавить("ИдентификаторСтроки");
		АкцизныеМарки.Индексы.Добавить("АлкогольнаяПродукция");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			Если СтрокаТЧ.Цена < 0 Тогда
				Цена = Формат(-СтрокаТЧ.Цена, "ЧДЦ=2; ЧРД=.; ЧГ=0");
			Иначе
				Цена = Формат(СтрокаТЧ.Цена, "ЧДЦ=2; ЧРД=.; ЧГ=0");
			КонецЕсли;
			
			КодыАкцизныхМарок = Новый Массив;
			
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("ИдентификаторСтроки", СтрокаТЧ.ИдентификаторСтроки);
			НайденныеСтроки = АкцизныеМарки.НайтиСтроки(ПараметрыОтбора);
			Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
				КодыАкцизныхМарок.Добавить(НайденнаяСтрока.КодАкцизнойМарки);
				АкцизныеМарки.Удалить(НайденнаяСтрока);
			КонецЦикла;
			
			Если КодыАкцизныхМарок.Количество() < СтрокаТЧ.Количество Тогда
				
				ПараметрыОтбора = Новый Структура;
				ПараметрыОтбора.Вставить("АлкогольнаяПродукция", СтрокаТЧ.АлкогольнаяПродукция);
				НайденныеСтроки = АкцизныеМарки.НайтиСтроки(ПараметрыОтбора);
				
				Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
					КодыАкцизныхМарок.Добавить(НайденнаяСтрока.КодАкцизнойМарки);
					АкцизныеМарки.Удалить(НайденнаяСтрока);
					Если КодыАкцизныхМарок.Количество() = СтрокаТЧ.Количество Тогда
						Прервать;
					КонецЕсли;
				КонецЦикла;
				
			КонецЕсли;
			
			Если КодыАкцизныхМарок.Количество() >= СтрокаТЧ.Количество Тогда
				
				Для Каждого КодАкцизнойМарки Из КодыАкцизныхМарок Цикл
					
					Bottle = РаботаСXMLИС.ОбъектXDTOПоИмениСвойства(ПространствоИмен, "Bottle", ЧекXDTO.Content);
					
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "barcode", КодАкцизнойМарки,  СообщениеXML);
					Если Не ЗначениеЗаполнено(СтрокаТЧ.Штрихкод) Тогда
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "ean", "0000000000000", СообщениеXML);
					ИначеЕсли ЧекиЕГАИС.ЭтоШтрихкодEAN(СтрокаТЧ.Штрихкод) Тогда
						Если РазборКодаМаркировкиИССлужебныйКлиентСервер.ЭтоВнутреннийШтрихкод(СтрокаТЧ.Штрихкод) Тогда
							РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "ean", "0000000000000", СообщениеXML);
						Иначе
							РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "ean", СтрокаТЧ.Штрихкод, СообщениеXML);
						КонецЕсли;
					Иначе
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "ean", "0000000000000", СообщениеXML);
					КонецЕсли;
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "price", Цена, СообщениеXML);
					
					ЧекXDTO.Content.Bottle.Добавить(Bottle);
					
				КонецЦикла;
				
			Иначе
				
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
						СтрШаблон(
							НСтр("ru = 'Не заполнены акцизные марки в строке %1 табличной части ""Товары""'"), СтрокаТЧ.НомерСтроки));
				
			КонецЕсли;
			
		КонецЦикла;
		
		ТекстСообщенияXML = РаботаСXMLЕГАИС.ОбъектXDTOВXML(ЧекXDTO, Шапка.ИдентификаторФСРАР, ПространствоИмен, ИмяТипа);
		
	Иначе
		
		ОписаниеНоменклатуры = ОбщегоНазначенияИС.ОписаниеНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"));
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			ДанныеОписанияНоменклатуры = ОписаниеНоменклатуры[СтрокаТЧ.Номенклатура];
			Если ДанныеОписанияНоменклатуры <> Неопределено
				И ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке <> 0
				И ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке <> 1 Тогда
				СтрокаТЧ.Цена       = Окр(СтрокаТЧ.Цена * ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке, 2);
				СтрокаТЧ.Количество = Окр(СтрокаТЧ.Количество / ДанныеОписанияНоменклатуры.КоличествоВПотребительскойУпаковке, 0);
			КонецЕсли;
		КонецЦикла;
		
		АдресТорговогоОбъекта = "";
		СопоставлениеОбъектовЕГАИСПереопределяемый.АдресТорговогоОбъекта(АдресТорговогоОбъекта, Шапка.ТорговыйОбъект);
		
		Если Не ЗначениеЗаполнено(АдресТорговогоОбъекта) Тогда
			ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
				СообщениеXML,
				СтрШаблон(НСтр("ru = 'Не заполнен адрес торгового объекта: %1'"), Шапка.ТорговыйОбъект));
			СообщенияXML.Добавить(СообщениеXML);
			Возврат СообщенияXML;
		КонецЕсли;
		
		ЧекXDTO = РаботаСXMLИС.ОбъектXDTOПоИмениСвойства(ПространствоИмен, ИмяТипа);
		
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "inn",      Шапка.ИНН,                           СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "kpp",      Шапка.КПП,                           СообщениеXML, Неопределено, Истина);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "address",  АдресТорговогоОбъекта,               СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "name",     Строка(Шапка.ТорговыйОбъект),        СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "kassa",    Шапка.СерийныйНомерККМ,              СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "shift",    Шапка.НомерСмены,                    СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "number",   Шапка.НомерЧекаККМ,                  СообщениеXML);
		РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(ЧекXDTO, "datetime", Формат(Шапка.Дата, "ДФ=ddMMyyHHmm"), СообщениеXML);
		
		АкцизныеМарки.Индексы.Добавить("ИдентификаторСтроки");
		АкцизныеМарки.Индексы.Добавить("АлкогольнаяПродукция");
		
		Для Каждого СтрокаТЧ Из Товары Цикл
			
			Если НоменклатураСЧастичнымВыбытием.Найти(СтрокаТЧ.Номенклатура) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			Цена  = Формат(СтрокаТЧ.Цена, "ЧДЦ=2; ЧРД=.; ЧГ=0");
			Объем = Формат(СтрокаТЧ.Объем, "ЧДЦ=4; ЧРД=.; ЧГ=0");
			
			КодыАкцизныхМарок = Новый Массив;
			
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("ИдентификаторСтроки", СтрокаТЧ.ИдентификаторСтроки);
			НайденныеСтроки = АкцизныеМарки.НайтиСтроки(ПараметрыОтбора);
			Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
				КодыАкцизныхМарок.Добавить(НайденнаяСтрока.КодАкцизнойМарки);
				АкцизныеМарки.Удалить(НайденнаяСтрока);
			КонецЦикла;
			
			Если КодыАкцизныхМарок.Количество() < СтрокаТЧ.Количество Тогда
				
				ПараметрыОтбора = Новый Структура;
				ПараметрыОтбора.Вставить("АлкогольнаяПродукция", СтрокаТЧ.АлкогольнаяПродукция);
				НайденныеСтроки = АкцизныеМарки.НайтиСтроки(ПараметрыОтбора);
				
				Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
					КодыАкцизныхМарок.Добавить(НайденнаяСтрока.КодАкцизнойМарки);
					АкцизныеМарки.Удалить(НайденнаяСтрока);
					Если КодыАкцизныхМарок.Количество() = СтрокаТЧ.Количество Тогда
						Прервать;
					КонецЕсли;
				КонецЦикла;
				
			КонецЕсли;
			
			Если КодыАкцизныхМарок.Количество() >= СтрокаТЧ.Количество Тогда
				
				Для Каждого КодАкцизнойМарки Из КодыАкцизныхМарок Цикл
					
					Bottle = РаботаСXMLИС.ОбъектXDTOПоИмениСвойства(ПространствоИмен, "Bottle");
					
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "price",   Цена,              СообщениеXML);
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "barcode", КодАкцизнойМарки,  СообщениеXML);
					
					Если ЧекиЕГАИС.ЭтоШтрихкодEAN(СтрокаТЧ.Штрихкод) Тогда
						РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "ean", СтрокаТЧ.Штрихкод, СообщениеXML);
					КонецЕсли;
					
					РаботаСXMLЕГАИС.ЗаполнитьСвойствоXDTO(Bottle, "volume",  Объем,             СообщениеXML);
					
					ЧекXDTO.Bottle.Добавить(Bottle);
					
				КонецЦикла;
				
			Иначе
				
				ОбменДаннымиЕГАИСКлиентСервер.ДобавитьТекстОшибки(
					СообщениеXML,
						СтрШаблон(
							НСтр("ru = 'Не заполнены акцизные марки в строке %1 табличной части ""Товары""'"), СтрокаТЧ.НомерСтроки));
				
			КонецЕсли;
			
		КонецЦикла;
		
		ТекстСообщенияXML = РаботаСXMLЕГАИС.ЧекXDTOВXML(ЧекXDTO, ПространствоИмен, ИмяТипа);
		
	КонецЕсли;
	
	СообщениеXML.ТекстСообщенияXML = ТекстСообщенияXML;
	СообщениеXML.ТипСообщения      = Перечисления.ТипыЗапросовИС.Исходящий;
	СообщениеXML.ОрганизацияЕГАИС  = Шапка.ОрганизацияЕГАИС;
	СообщениеXML.Операция          = Операция;
	СообщениеXML.ФорматОбмена      = ФорматОбмена;
	СообщениеXML.Документ          = ДокументСсылка;
	СообщениеXML.ДокументОснование = Шапка.ДокументОснование;
	СообщениеXML.Версия            = НомерВерсии;
	
	СообщенияXML.Добавить(СообщениеXML);
	
	Возврат СообщенияXML;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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