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