xmlTSDGalery/CommonModules/ОборудованиеЧекопечатающиеУстройства/Ext/Module.bsl
kykaevv 88098aa86f Initial commit: конфигурация ТСД с обменом УНФ.
Включает перемещение по ячейкам, стикеровку МП, синхронизацию справочников и обработку кодов маркировки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 12:50:57 +03:00

4385 lines
376 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Область ПрограммныйИнтерфейс
// Заполнить структуру фискализации чека
//
// Возвращаемое значение:
// Структура.
Функция ПараметрыФискализацииЧека() Экспорт
ПараметрыФискализации = Новый Структура();
ПараметрыФискализации.Вставить("Кассир");
ПараметрыФискализации.Вставить("КассирИНН");
ПараметрыФискализации.Вставить("ДокументОснование");
ПараметрыФискализации.Вставить("ИдентификаторФискальнойЗаписи");
ПараметрыФискализации.Вставить("Организация");
ПараметрыФискализации.Вставить("ТорговыйОбъект");
ПараметрыФискализации.Вставить("КорректируемыйДокумент");
ПараметрыФискализации.Вставить("ЕстьПерсональныеДанные", Ложь);
ПараметрыФискализации.Вставить("СубъектПерсональныхДанных");
ПараметрыФискализации.Вставить("ТипПерсональныхДанных");
ПараметрыФискализации.Вставить("ТипРасчета");
ПараметрыФискализации.Вставить("ТипДокумента");
ПараметрыФискализации.Вставить("ТипИнкассации");
ПараметрыФискализации.Вставить("РевизияИнтерфейса");
ПараметрыФискализации.Вставить("ШиринаСтроки");
ПараметрыФискализации.Вставить("РегистрационныйНомерККТ");
ПараметрыФискализации.Вставить("ЗаводскойНомерФН");
ПараметрыФискализации.Вставить("ДополнительныйРеквизит");
ПараметрыФискализации.Вставить("НомерСменыККТ" , 0); // Номер смены.
ПараметрыФискализации.Вставить("НомерЧекаККТ" , 0); // Номер фискального чека.
ПараметрыФискализации.Вставить("НомерЧекаЗаСмену", 0); // Номер чека за смену.
ПараметрыФискализации.Вставить("ДатаВремяЧека"); // Дата и время фискализации чека на ККТ.
ПараметрыФискализации.Вставить("ТекущаяСмена");
ПараметрыФискализации.Вставить("СуммаЧека", 0);
ПараметрыФискализации.Вставить("ОплатаНаличные" , 0);
ПараметрыФискализации.Вставить("ОплатаЭлектронно", 0);
ПараметрыФискализации.Вставить("ОплатаПредоплата", 0);
ПараметрыФискализации.Вставить("ОплатаПостоплата", 0);
ПараметрыФискализации.Вставить("ОплатаВстречноеПредоставление", 0);
ПараметрыФискализации.Вставить("ФискальныйПризнак" , ""); // Фискальный признак документа.
ПараметрыФискализации.Вставить("АдресСайтаПроверки", ""); // Адрес сайта проверки ФНС.
ПараметрыФискализации.Вставить("ОшибкаПечати" , Ложь); // Ошибка при печати бумажной формы чека
ПараметрыФискализации.Вставить("Электронно" , Ложь);
ПараметрыФискализации.Вставить("Отправляет1СSMS" , Ложь);
ПараметрыФискализации.Вставить("Отправляет1СEmail", Ложь);
ПараметрыФискализации.Вставить("АвтономныйРежим" , Ложь);
ПараметрыФискализации.Вставить("ПокупательEmail" ); // Строка,Необязательно - Адрес электронной почты покупателя.
ПараметрыФискализации.Вставить("ПокупательНомер" ); // Строка,Необязательно - Телефонный номер покупателя. В формате +{Ц}.
ПараметрыФискализации.Вставить("ДанныеЧекаXML");
ПараметрыФискализации.Вставить("ДанныеЧекаXMLПерсональныеДанные");
ПараметрыФискализации.Вставить("РезультатОперацииXML");
ПараметрыФискализации.Вставить("ТекстСообщения");
ПараметрыФискализации.Вставить("ТекущееСостояние", ПараметрыФискальнойОперации());
ПараметрыФискализации.Вставить("ЧекКоррекцииСторно");
ПараметрыФискализации.Вставить("СформироватьЧекКоррекцииСторно", Истина);
ПараметрыФискализации.Вставить("ЧекКоррекцииНаККТ", Истина);
ПараметрыФискализации.Вставить("НеприменениеККТ", Истина);
ПараметрыФискализации.Вставить("ВерсияФФДККТ11" , Ложь);
ПараметрыФискализации.Вставить("Результат", Истина);
ПараметрыФискализации.Вставить("ОперацияЗаписана", Истина);
ПараметрыФискализации.Вставить("ТекстОшибки");
ПараметрыФискализации.Вставить("СтатусСмены", 0);
ПараметрыФискализации.Вставить("ТестовыеЧеки", Новый Массив);
ПараметрыФискализации.Вставить("ТекстЧека");
ПараметрыФискализации.Вставить("КопияЧека", Новый Массив);
ПараметрыФискализации.Вставить("ДополнительныеДокументы", Новый Массив);
ПараметрыФискализации.Вставить("ЕдиныйЧек", Ложь);
ПараметрыФискализации.Вставить("ИдентификаторОплатыПлатежнойСистемы");
ПараметрыФискализации.Вставить("ТипПлатежнойСистемы");
ПараметрыФискализации.Вставить("ДетализацияОплатыДобавлено", Ложь);
ПараметрыФискализации.Вставить("QRКодДобавлено", Ложь);
ПараметрыФискализации.Вставить("ШтрихкодыПродукции", Новый Соответствие);
Возврат ПараметрыФискализации;
КонецФункции
// Параметры фискальной операции.
//
// Возвращаемое значение:
// см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойОперации.
Функция ПараметрыФискальнойОперации() Экспорт
Возврат ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойОперации();
КонецФункции
#Область ПараметрыРегистрации
// Процедура предназначена для сохранения параметров регистрации устройства
//
// Параметры:
// Идентификатор - СправочникСсылка.ПодключаемоеОборудование - Идентификатор устройства -
// ПараметрыРегистрации - Структура -
//
// Возвращаемое значение:
// Булево.
Функция СохранитьПараметрыРегистрацииУстройства(Идентификатор, ПараметрыРегистрации) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
| ПодключаемоеОборудование.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПодключаемоеОборудование КАК ПодключаемоеОборудование
|ГДЕ
| ПодключаемоеОборудование.Ссылка = &Идентификатор");
Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Результат = Ложь;
Возврат Результат;
КонецЕсли;
НачатьТранзакцию();
Попытка
БлокировкаДанных = Новый БлокировкаДанных();
ЭлементБлокировки = БлокировкаДанных.Добавить("Справочник.ПодключаемоеОборудование");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Ссылка", Идентификатор);
БлокировкаДанных.Заблокировать();
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ОбъектСсылка = Выборка.Ссылка; // СправочникСсылка.ПодключаемоеОборудование
ОбъектСправочника = ОбъектСсылка.ПолучитьОбъект();
ОбъектСправочника.ПараметрыРегистрации.Очистить();
Для Каждого ПараметрРегистрации Из ПараметрыРегистрации Цикл
НоваяСтрока = ОбъектСправочника.ПараметрыРегистрации.Добавить();
НоваяСтрока.НаименованиеПараметра = ПараметрРегистрации.Ключ;
Если ТипЗнч(ПараметрРегистрации.Значение) = Тип("Булево") Тогда
НоваяСтрока.ЗначениеПараметра = XMLСтрока(ПараметрРегистрации.Значение);
Иначе
НоваяСтрока.ЗначениеПараметра = ПараметрРегистрации.Значение;
КонецЕсли;
КонецЦикла;
ОбъектСправочника.Записать();
Результат = Истина;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Результат = Ложь;
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
Возврат Результат;
КонецФункции
// Функция возвращает по идентификатору устройства параметры регистрации.
//
// Параметры:
// Идентификатор - СправочникСсылка.ПодключаемоеОборудование
//
// Возвращаемое значение:
// Структура.
//
Функция ПараметрыРегистрацииУстройства(Идентификатор) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПодключаемоеОборудование.Ссылка КАК Ссылка,
| ПодключаемоеОборудованиеПараметрыРегистрации.НаименованиеПараметра КАК НаименованиеПараметра,
| ПодключаемоеОборудованиеПараметрыРегистрации.ЗначениеПараметра КАК ЗначениеПараметра
|ИЗ
| Справочник.ПодключаемоеОборудование.ПараметрыРегистрации КАК ПодключаемоеОборудованиеПараметрыРегистрации
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодключаемоеОборудование КАК ПодключаемоеОборудование
| ПО ПодключаемоеОборудованиеПараметрыРегистрации.Ссылка = ПодключаемоеОборудование.Ссылка
|ГДЕ
| (ПодключаемоеОборудование.Ссылка = &Идентификатор)";
Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
РезультатЗапроса = Запрос.Выполнить();
ЕстьДанные = Ложь;
ДанныеХранения = Новый Структура();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
ДанныеХранения.Вставить(ВыборкаДетальныеЗаписи.НаименованиеПараметра, ВыборкаДетальныеЗаписи.ЗначениеПараметра);
ЕстьДанные = Истина;
КонецЦикла;
РезультатОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыРегистрацииККТ();
РезультатОперации.Вставить("ЕстьДанные", ЕстьДанные);
Если ЕстьДанные Тогда
РезультатОперации.РегистрационныйНомерККТ = ДанныеХранения.РегистрационныйНомерККТ;
РезультатОперации.ОрганизацияНазвание = ДанныеХранения.ОрганизацияНазвание;
РезультатОперации.ОрганизацияИНН = ДанныеХранения.ОрганизацияИНН;
Если ДанныеХранения.Свойство("АдресПроведенияРасчетов") Тогда
РезультатОперации.АдресПроведенияРасчетов = ДанныеХранения.АдресПроведенияРасчетов;
КонецЕсли;
Если ДанныеХранения.Свойство("МестоПроведенияРасчетов") Тогда
РезультатОперации.МестоПроведенияРасчетов = ДанныеХранения.МестоПроведенияРасчетов;
КонецЕсли;
РезультатОперации.КодыСистемыНалогообложения = ДанныеХранения.КодыСистемыНалогообложения;
Если ДанныеХранения.Свойство("ПризнакАвтономногоРежима") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакАвтономногоРежима) Тогда
РезультатОперации.ПризнакАвтономногоРежима = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакАвтономногоРежима);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакШифрованиеДанных") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакШифрованиеДанных) Тогда
РезультатОперации.ПризнакШифрованиеДанных = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакШифрованиеДанных);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакРасчетовЗаУслуги") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакРасчетовЗаУслуги) Тогда
РезультатОперации.ПризнакАвтономногоРежима = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакАвтономногоРежима);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакФормированияБСО") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакФормированияБСО) Тогда
РезультатОперации.ПризнакФормированияБСО = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакФормированияБСО);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакРасчетовТолькоВИнтернет") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакРасчетовТолькоВИнтернет) Тогда
РезультатОперации.ПризнакРасчетовТолькоВИнтернет = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакРасчетовТолькоВИнтернет);
КонецЕсли;
Если ДанныеХранения.Свойство("ПродажаПодакцизногоТовара") И НЕ ПустаяСтрока(ДанныеХранения.ПродажаПодакцизногоТовара) Тогда
РезультатОперации.ПродажаПодакцизногоТовара = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПродажаПодакцизногоТовара);
КонецЕсли;
Если ДанныеХранения.Свойство("ПроведенияАзартныхИгр") И НЕ ПустаяСтрока(ДанныеХранения.ПроведенияАзартныхИгр) Тогда
РезультатОперации.ПроведенияАзартныхИгр = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПроведенияАзартныхИгр);
КонецЕсли;
Если ДанныеХранения.Свойство("ПроведенияЛотерей") И НЕ ПустаяСтрока(ДанныеХранения.ПроведенияЛотерей) Тогда
РезультатОперации.ПроведенияЛотерей = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПроведенияЛотерей);
КонецЕсли;
Если ДанныеХранения.Свойство("УстановкаПринтераВАвтомате") И НЕ ПустаяСтрока(ДанныеХранения.УстановкаПринтераВАвтомате) Тогда
РезультатОперации.УстановкаПринтераВАвтомате = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.УстановкаПринтераВАвтомате);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакАвтоматическогоТорговогоАвтомата") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакАвтоматическогоТорговогоАвтомата) Тогда
РезультатОперации.ПризнакАвтоматическогоТорговогоАвтомата = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакАвтоматическогоТорговогоАвтомата);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакОказанииУслугОбщественногоПитания") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакОказанииУслугОбщественногоПитания) Тогда
РезультатОперации.ПризнакОказанииУслугОбщественногоПитания = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакОказанииУслугОбщественногоПитания);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакОптовойТорговлиСОрганизациями") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакОптовойТорговлиСОрганизациями) Тогда
РезультатОперации.ПризнакОптовойТорговлиСОрганизациями = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакОптовойТорговлиСОрганизациями);
КонецЕсли;
Если ДанныеХранения.Свойство("ПризнакиАгента") Тогда
РезультатОперации.ПризнакиАгента = ДанныеХранения.ПризнакиАгента;
КонецЕсли;
РезультатОперации.НомерАвтоматаДляАвтоматическогоРежима = ДанныеХранения.НомерАвтоматаДляАвтоматическогоРежима;
РезультатОперации.ОрганизацияОФДИНН = ДанныеХранения.ОрганизацияОФДИНН;
РезультатОперации.ОрганизацияОФДНазвание = ДанныеХранения.ОрганизацияОФДНазвание;
РезультатОперации.ЗаводскойНомерККТ = ДанныеХранения.ЗаводскойНомерККТ;
РезультатОперации.ЗаводскойНомерФН = ДанныеХранения.ЗаводскойНомерФН;
РезультатОперации.ВерсияФФДККТ = ДанныеХранения.ВерсияФФДККТ;
РезультатОперации.ВерсияФФДФН = ДанныеХранения.ВерсияФФДФН;
Если ДанныеХранения.Свойство("ПризнакФискализации") И НЕ ПустаяСтрока(ДанныеХранения.ПризнакФискализации) Тогда
РезультатОперации.ПризнакФискализации = ОбщегоНазначенияБПО.ПреобразоватьВБулево(ДанныеХранения.ПризнакФискализации);
КонецЕсли;
КонецЕсли;
Возврат РезультатОперации;
КонецФункции
// Обновляет параметры регистрации ККТ
//
// Параметры:
// ПараметрыРегистрацииТаблица - ТаблицаЗначений -
// ПараметрыРегистрации - ТаблицаЗначений -
Процедура ОбновитьПараметрыРегистрацииККТ(ПараметрыРегистрацииТаблица, ПараметрыРегистрации) Экспорт
Для Каждого ПараметрРегистрации Из ПараметрыРегистрации Цикл
Параметр = ПараметрыРегистрацииТаблица.Добавить();
НаименованиеПараметра = ПараметрРегистрации.НаименованиеПараметра;
ЗначениеПараметра = ПараметрРегистрации.ЗначениеПараметра;
Если НаименованиеПараметра = "РегистрационныйНомерККТ" Тогда
НаименованиеПараметра = НСтр("ru='Регистрационный номер ККТ'")
ИначеЕсли НаименованиеПараметра = "ОрганизацияНазвание" Тогда
НаименованиеПараметра = НСтр("ru='Название организации'")
ИначеЕсли НаименованиеПараметра = "ОрганизацияИНН" Тогда
НаименованиеПараметра = НСтр("ru='ИНН организации'")
ИначеЕсли НаименованиеПараметра = "АдресПроведенияРасчетов" Тогда
НаименованиеПараметра = НСтр("ru='Адрес проведения расчетов'")
ИначеЕсли НаименованиеПараметра = "КодыСистемыНалогообложения" Тогда
НаименованиеПараметра = НСтр("ru='Системы налогообложения'");
СистемыНалогообложения = СтрРазделить(ЗначениеПараметра, ",");
ЗначениеПараметра = "";
Для Каждого СистемаНалогообложения Из СистемыНалогообложения Цикл
ЗначениеПараметра = ?(Не ПустаяСтрока(ЗначениеПараметра), ЗначениеПараметра + ",", "");
Если Не ПустаяСтрока(СистемаНалогообложения) Тогда
ЗначениеПараметра = ЗначениеПараметра + """"+ ОборудованиеЧекопечатающиеУстройстваКлиентСервер.НаименованиеСистемыНалогообложения(Число(СистемаНалогообложения)) + """";
КонецЕсли;
КонецЦикла;
ИначеЕсли НаименованиеПараметра = "ПризнакАвтономногоРежима" Тогда
НаименованиеПараметра = НСтр("ru='Автономный режим'")
ИначеЕсли НаименованиеПараметра = "ПризнакАвтоматическогоРежима" Тогда
НаименованиеПараметра = НСтр("ru='Автоматический режим'")
ИначеЕсли НаименованиеПараметра = "НомерАвтоматаДляАвтоматическогоРежима" Тогда
НаименованиеПараметра = НСтр("ru='Номер автомата для автоматического режима'")
ИначеЕсли НаименованиеПараметра = "ПризнакШифрованиеДанных" Тогда
НаименованиеПараметра = НСтр("ru='Шифрование данных'")
ИначеЕсли НаименованиеПараметра = "ПризнакРасчетовЗаУслуги" Тогда
НаименованиеПараметра = НСтр("ru='Расчет за услуги'")
ИначеЕсли НаименованиеПараметра = "ПризнакФормированияБСО" Тогда
НаименованиеПараметра = НСтр("ru='Формирования БСО'")
ИначеЕсли НаименованиеПараметра = "ПризнакРасчетовТолькоВИнтернет" Тогда
НаименованиеПараметра = НСтр("ru='Расчет только в интернет'")
ИначеЕсли НаименованиеПараметра = "ОрганизацияОФДИНН" Тогда
НаименованиеПараметра = НСтр("ru='ОФД ИНН'")
ИначеЕсли НаименованиеПараметра = "ОрганизацияОФДНазвание" Тогда
НаименованиеПараметра = НСтр("ru='Наименование ОФД'")
ИначеЕсли НаименованиеПараметра = "ЗаводскойНомерККТ" Тогда
НаименованиеПараметра = НСтр("ru='Заводской номер ККТ'")
ИначеЕсли НаименованиеПараметра = "ПризнакФискализации" Тогда
НаименованиеПараметра = НСтр("ru='Признак фискализации'")
ИначеЕсли НаименованиеПараметра = "ЗаводскойНомерФН" Тогда
НаименованиеПараметра = НСтр("ru='Заводской номер ФН'")
ИначеЕсли НаименованиеПараметра = "НомерДокументаФискализации" Тогда
НаименованиеПараметра = НСтр("ru='Номер документа фискализации'")
ИначеЕсли НаименованиеПараметра = "ДатаВремяФискализации" Тогда
НаименованиеПараметра = НСтр("ru='Дата и время фискализации'")
ИначеЕсли НаименованиеПараметра = "ВерсияФФДККТ" Тогда
НаименованиеПараметра = НСтр("ru='Версия ФФД ККТ'")
ИначеЕсли НаименованиеПараметра = "ВерсияФФДФН" Тогда
НаименованиеПараметра = НСтр("ru='Версия ФФД ФН'")
// ФФД 1.05 и ФФД 1.1
ИначеЕсли НаименованиеПараметра = "МестоПроведенияРасчетов" Тогда
НаименованиеПараметра = НСтр("ru='Место проведения расчетов'")
ИначеЕсли НаименованиеПараметра = "ПродажаПодакцизногоТовара" Тогда
НаименованиеПараметра = НСтр("ru='Продажа подакцизного товара'")
ИначеЕсли НаименованиеПараметра = "ПроведенияАзартныхИгр" Тогда
НаименованиеПараметра = НСтр("ru='Проведения азартных игр'")
ИначеЕсли НаименованиеПараметра = "ПроведенияЛотерей" Тогда
НаименованиеПараметра = НСтр("ru='Проведения лотерей'")
ИначеЕсли НаименованиеПараметра = "ПризнакиАгента" Тогда
НаименованиеПараметра = НСтр("ru='Признаки агента'")
ИначеЕсли НаименованиеПараметра = "УстановкаПринтераВАвтомате" Тогда
НаименованиеПараметра = НСтр("ru='Установка принтера в автомате'")
// ФФД 1.2
ИначеЕсли НаименованиеПараметра = "ПроведенияРасчетаВИнтернет" Тогда
НаименованиеПараметра = НСтр("ru='Проведения расчета в интернет'")
ИначеЕсли НаименованиеПараметра = "ПродажаМаркированныхТоваров" Тогда
НаименованиеПараметра = НСтр("ru='Продажа маркированных товаров'")
ИначеЕсли НаименованиеПараметра = "ПризнакПримененияЛомбардами" Тогда
НаименованиеПараметра = НСтр("ru='Применения ломбардами'")
ИначеЕсли НаименованиеПараметра = "ПризнакДеятельностиПоСтрахованию" Тогда
НаименованиеПараметра = НСтр("ru='Деятельность по страхованию'")
// ФФД 1.2 - Приказ ФНС России от 12.04.2023 N ЕД-7-20/239@
ИначеЕсли НаименованиеПараметра = "ПризнакАвтоматическогоТорговогоАвтомата" Тогда
НаименованиеПараметра = НСтр("ru='Применение в автоматическом торговом автомате'")
ИначеЕсли НаименованиеПараметра = "ПризнакОказанииУслугОбщественногоПитания" Тогда
НаименованиеПараметра = НСтр("ru='Оказании услуг общественного питания'")
ИначеЕсли НаименованиеПараметра = "ПризнакОптовойТорговлиСОрганизациями" Тогда
НаименованиеПараметра = НСтр("ru='Оптовая торговля с организациями и ИП'")
КонецЕсли;
Параметр.НаименованиеПараметра = НаименованиеПараметра;
Параметр.ЗначениеПараметра = ЗначениеПараметра;
КонецЦикла;
КонецПроцедуры
// Функция возвращает поддерживает ли фискальное устройство.
//
// Параметры:
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - Идентификатор устройства
//
// Возвращаемое значение:
// Булево - Фискальное устройство поддерживает проверку кодов маркировки
Функция ФискальноеУстройствоПоддерживаетПроверкуКодовМаркировки(ИдентификаторУстройства) Экспорт
Результат = Ложь;
ПараметрыРегистрации = ПараметрыРегистрацииУстройства(ИдентификаторУстройства);
Если ПараметрыРегистрации <> Неопределено Тогда
Результат = ПараметрыРегистрации.Свойство("ВерсияФФДККТ") И ПараметрыРегистрации.ВерсияФФДККТ = "1.2"
И ПараметрыРегистрации.Свойство("ВерсияФФДФН") И ПараметрыРегистрации.ВерсияФФДФН = "1.2";
КонецЕсли;
Возврат Результат;
КонецФункции
// Функция возвращает для фискального устройства версию ФФД.
//
// Параметры:
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - Идентификатор устройства.
//
// Возвращаемое значение:
// Неопределено - Фискальное устройство поддерживает версию ФФД
Функция ФискальноеУстройствоПоддерживаетВерсиюФФД(ИдентификаторУстройства) Экспорт
Результат = Неопределено;
ПараметрыРегистрации = ПараметрыРегистрацииУстройства(ИдентификаторУстройства);
Если ПараметрыРегистрации <> Неопределено И ПараметрыРегистрации.Свойство("ВерсияФФДККТ") Тогда
Результат = ПараметрыРегистрации.ВерсияФФДККТ;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ФискальныеОперации
// Записать операцию в журнал фискальных операций.
//
// Параметры:
// ПараметрыФискализации - Структура -
Процедура ЗаписатьФискальнуюОперацию(ПараметрыФискализации) Экспорт
УстановитьПривилегированныйРежим(Истина);
Если ПустаяСтрока(ПараметрыФискализации.ИдентификаторФискальнойЗаписи) Тогда
ИдентификаторЗаписи = Строка(Новый УникальныйИдентификатор);
ПараметрыФискализации.ИдентификаторФискальнойЗаписи = ИдентификаторЗаписи;
Иначе
ИдентификаторЗаписи = ПараметрыФискализации.ИдентификаторФискальнойЗаписи;
КонецЕсли;
// ФискальныеОперации
НаборЗаписей = РегистрыСведений.ФискальныеОперации.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДокументОснование.Установить(ПараметрыФискализации.ДокументОснование, Истина);
НаборЗаписей.Отбор.ИдентификаторЗаписи.Установить(ИдентификаторЗаписи, Истина);
НоваяСтрока = НаборЗаписей.Добавить();
НоваяСтрока.Дата = ПараметрыФискализации.ДатаВремяЧека;
НоваяСтрока.ИдентификаторЗаписи = ИдентификаторЗаписи;
НоваяСтрока.ДокументОснование = ПараметрыФискализации.ДокументОснование;
НоваяСтрока.ФискальныйПризнак = ПараметрыФискализации.ФискальныйПризнак;
НоваяСтрока.ТипДокумента = ПараметрыФискализации.ТипДокумента;
НоваяСтрока.Организация = ПараметрыФискализации.Организация;
НоваяСтрока.ТорговыйОбъект = ПараметрыФискализации.ТорговыйОбъект;
НоваяСтрока.ТипРасчета = ПараметрыФискализации.ТипРасчета;
НоваяСтрока.НомерСменыККМ = ПараметрыФискализации.НомерСменыККТ;
НоваяСтрока.НомерЧекаККМ = ПараметрыФискализации.НомерЧекаККТ;
НоваяСтрока.Сумма = ПараметрыФискализации.СуммаЧека;
НоваяСтрока.ОплатаНаличные = ПараметрыФискализации.ОплатаНаличные;
НоваяСтрока.ОплатаЭлектронно = ПараметрыФискализации.ОплатаЭлектронно;
НоваяСтрока.ОплатаПостоплата = ПараметрыФискализации.ОплатаПостоплата;
НоваяСтрока.ОплатаПредоплата = ПараметрыФискализации.ОплатаПредоплата;
НоваяСтрока.ОплатаВстречноеПредоставление = ПараметрыФискализации.ОплатаВстречноеПредоставление;
НоваяСтрока.ДополнительныйРеквизит = ПараметрыФискализации.ДополнительныйРеквизит;
НоваяСтрока.АдресСайтаПроверки = ПараметрыФискализации.АдресСайтаПроверки;
НоваяСтрока.ЗаводскойНомерФН = ПараметрыФискализации.ЗаводскойНомерФН;
НоваяСтрока.РегистрационныйНомерККТ = ПараметрыФискализации.РегистрационныйНомерККТ;
НоваяСтрока.КорректируемыйДокумент = ПараметрыФискализации.КорректируемыйДокумент;
НоваяСтрока.СубъектПерсональныхДанных = ПараметрыФискализации.СубъектПерсональныхДанных;
НоваяСтрока.ЕдиныйЧек = ПараметрыФискализации.ЕдиныйЧек;
НоваяСтрока.ТипПлатежнойСистемы = ПараметрыФискализации.ТипПлатежнойСистемы;
НоваяСтрока.ИдентификаторОплатыПлатежнойСистемы = ПараметрыФискализации.ИдентификаторОплатыПлатежнойСистемы;
Если ПараметрыФискализации.ДанныеЧекаXML <> Неопределено Тогда
НоваяСтрока.ДанныеXML = Новый ХранилищеЗначения(ПараметрыФискализации.ДанныеЧекаXML);
КонецЕсли;
НаборЗаписей.Записать();
Если ПараметрыФискализации.Свойство("ЗаписьОперацииКМ") Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
ПараметрыЗаписи = МодульМенеджерОборудованияМаркировка.ПараметрыЗаписиРезультатаПроверкиКМ();
ПараметрыЗаписи.Ключ.ИдентификаторСессии = ПараметрыФискализации.ЗаписьОперацииКМ.ИдентификаторСессии;
ПараметрыЗаписи.Ключ.ИдентификаторЗапроса = ПараметрыФискализации.ЗаписьОперацииКМ.ИдентификаторЗапроса;
Если ПараметрыФискализации.ЗаписьОперацииКМ.ВыполнялосьПодтверждениеПокупки Тогда
ПараметрыЗаписи.ПокупкаПодтверждена = Истина;
КонецЕсли;
МодульМенеджерОборудованияМаркировка.ОбновитьРезультатыПроверкиКодаМаркировкиВРегистре(ПараметрыЗаписи);
МодульМенеджерОборудованияМаркировка.ОбновитьИдентификаторФискальнойОперацииРезультатаПроверкиКодаМаркировки(
ПараметрыФискализации.ЗаписьОперацииКМ.ИдентификаторСессии, ИдентификаторЗаписи);
КонецЕсли;
Если ПараметрыФискализации.Свойство("ЗаписьОперацииЕГАИС") Тогда
ЗаписьОперацииЕГАИС = ПараметрыФискализации.ЗаписьОперацииЕГАИС;
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
ПараметрыЗаписи = МодульМенеджерОборудованияМаркировка.ПараметрыЗаписиРезультатаПроверкиЕГАИС();;
ПараметрыЗаписи.ИдентификаторФискальнойОперации = ИдентификаторЗаписи;
ПараметрыЗаписи.Выполнено = ЗаписьОперацииЕГАИС.Выполнено;
ПараметрыЗаписи.ШтрихкодыПродукции = ПараметрыФискализации.ШтрихкодыПродукции;
ПараметрыЗаписи.ИдентификаторЗапроса = ЗаписьОперацииЕГАИС.АдресЧека;
ПараметрыЗаписи.ПодписьЧека = ЗаписьОперацииЕГАИС.ПодписьЧека;
ПараметрыЗаписи.ВходящееСообщение = ЗаписьОперацииЕГАИС.ВходящееСообщение;
ПараметрыЗаписи.ИсходящееСообщение = ЗаписьОперацииЕГАИС.ИсходящееСообщение;
ПараметрыЗаписи.СообщениеПередано = ЗаписьОперацииЕГАИС.СообщениеПередано;
ПараметрыЗаписи.ТекстОшибки = ЗаписьОперацииЕГАИС.ОписаниеОшибки;
МодульМенеджерОборудованияМаркировка.ДобавитьРезультатыОтправкиЕГАИС(ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
// АПК: 142-выкл обратная совместимость
// Получить данные журнала фискальных операций.
//
// Параметры:
// ДокументСсылка - ДокументСсылка - Документ-основание.
// ИдентификаторЗаписи - РегистрСведенийЗапись.ФискальныеОперации - запись фискальной операции.
// ТипыДокументов - ПеречислениеСсылка.ТипыФискальныхДокументовККТ - типы документов.
// ТипРасчета - ПеречислениеСсылка.ТипыРасчетаДенежнымиСредствами - тип расчета.
// ФискальныйПризнак - Строка - Фискальный признак документа
//
// Возвращаемое значение:
// Структура - Структура по свойствами:
// * НомерСменыККМ - Число - Номер чека ККМ.
// * Сумма - Число - Сумма.
// * ДокументОснование - ДокументСсылка - Документ-основание.
// * ДанныеXML - ХранилищеЗначения - Данные чека, переданные в ККТ (XML).
//
Функция ДанныеФискальнойОперации(ДокументСсылка, ИдентификаторЗаписи = Неопределено, ТипыДокументов = Неопределено, ТипРасчета = Неопределено, ФискальныйПризнак = Неопределено) Экспорт
ФискальнаяОперация = Неопределено;
Если Не (ЗначениеЗаполнено(ДокументСсылка)
Или ЗначениеЗаполнено(ИдентификаторЗаписи)
Или ЗначениеЗаполнено(ТипыДокументов)
Или ЗначениеЗаполнено(ТипРасчета)
Или ЗначениеЗаполнено(ФискальныйПризнак)) Тогда
Возврат ФискальнаяОперация;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ФискальныеОперации.ИдентификаторЗаписи КАК ИдентификаторЗаписи,
| ФискальныеОперации.Дата КАК Дата,
| ФискальныеОперации.НомерЧекаККМ КАК НомерЧекаККМ,
| ФискальныеОперации.НомерСменыККМ КАК НомерСменыККМ,
| ФискальныеОперации.ТипДокумента КАК ТипДокумента,
| ФискальныеОперации.ТипРасчета КАК ТипРасчета,
| ФискальныеОперации.Организация КАК Организация,
| ФискальныеОперации.ТорговыйОбъект КАК ТорговыйОбъект,
| ФискальныеОперации.ЗаводскойНомерФН КАК ЗаводскойНомерФН,
| ФискальныеОперации.РегистрационныйНомерККТ КАК РегистрационныйНомерККТ,
| ФискальныеОперации.ДокументОснование КАК ДокументОснование,
| ФискальныеОперации.КорректируемыйДокумент КАК КорректируемыйДокумент,
| ФискальныеОперации.Сумма КАК Сумма,
| ФискальныеОперации.ФискальныйПризнак КАК ФискальныйПризнак,
| ФискальныеОперации.ДополнительныйРеквизит КАК ДополнительныйРеквизит,
| ФискальныеОперации.ЕдиныйЧек КАК ЕдиныйЧек,
| ФискальныеОперации.ИдентификаторОплатыПлатежнойСистемы КАК ИдентификаторОплатыПлатежнойСистемы,
| ФискальныеОперации.ТипПлатежнойСистемы КАК ТипПлатежнойСистемы,
| ФискальныеОперации.ДанныеXML КАК ДанныеXML
|ИЗ
| РегистрСведений.ФискальныеОперации КАК ФискальныеОперации
|ГДЕ ИСТИНА "
+ ?(ЗначениеЗаполнено(ДокументСсылка), " И (ФискальныеОперации.ДокументОснование = &ДокументСсылка)", "")
+ ?(ИдентификаторЗаписи = Неопределено, "", " И (ФискальныеОперации.ИдентификаторЗаписи = &ИдентификаторЗаписи)")
+ ?(ТипыДокументов = Неопределено, "", " И (ФискальныеОперации.ТипДокумента В (&ТипыДокументов))")
+ ?(ТипРасчета = Неопределено, "", " И (ФискальныеОперации.ТипРасчета = &ТипРасчета)")
+ ?(ФискальныйПризнак = Неопределено, "", " И (ФискальныеОперации.ФискальныйПризнак = &ФискальныйПризнак)")
+ " УПОРЯДОЧИТЬ ПО ФискальныеОперации.Дата УБЫВ, ФискальныеОперации.НомерСменыККМ УБЫВ");
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
КонецЕсли;
Если ИдентификаторЗаписи <> Неопределено Тогда
Запрос.УстановитьПараметр("ИдентификаторЗаписи", ИдентификаторЗаписи);
КонецЕсли;
Если ТипыДокументов <> Неопределено Тогда
// Подготовка типов документов для запроса.
МассивТипыДокументов = Новый Массив();
Если ТипЗнч(ТипыДокументов) = Тип("Массив") Тогда
Для Каждого ТипДокумента Из ТипыДокументов Цикл
МассивТипыДокументов.Добавить(ТипДокумента);
КонецЦикла;
Иначе
МассивТипыДокументов.Добавить(ТипыДокументов);
КонецЕсли;
Запрос.УстановитьПараметр("ТипыДокументов", МассивТипыДокументов);
КонецЕсли;
Если ТипРасчета <> Неопределено Тогда
Запрос.УстановитьПараметр("ТипРасчета", ТипРасчета);
КонецЕсли;
Если ФискальныйПризнак <> Неопределено Тогда
Запрос.УстановитьПараметр("ФискальныйПризнак", ФискальныйПризнак);
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ФискальнаяОперация = Новый Структура;
ФискальнаяОперация.Вставить("ИдентификаторЗаписи");
ФискальнаяОперация.Вставить("Дата");
ФискальнаяОперация.Вставить("НомерЧекаККМ");
ФискальнаяОперация.Вставить("НомерСменыККМ");
ФискальнаяОперация.Вставить("ЗаводскойНомерФН");
ФискальнаяОперация.Вставить("РегистрационныйНомерККТ");
ФискальнаяОперация.Вставить("ТипДокумента");
ФискальнаяОперация.Вставить("ТипРасчета");
ФискальнаяОперация.Вставить("Организация");
ФискальнаяОперация.Вставить("ТорговыйОбъект");
ФискальнаяОперация.Вставить("Сумма");
ФискальнаяОперация.Вставить("ДокументОснование");
ФискальнаяОперация.Вставить("КорректируемыйДокумент");
ФискальнаяОперация.Вставить("ФискальныйПризнак");
ФискальнаяОперация.Вставить("ДополнительныйРеквизит");
ФискальнаяОперация.Вставить("ЕдиныйЧек");
ФискальнаяОперация.Вставить("ДанныеXML");
ФискальнаяОперация.Вставить("ИдентификаторОплатыПлатежнойСистемы");
ФискальнаяОперация.Вставить("ТипПлатежнойСистемы");
ЗаполнитьЗначенияСвойств(ФискальнаяОперация, Выборка);
КонецЕсли;
Возврат ФискальнаяОперация;
КонецФункции
// АПК: 142-вкл
// Получить данные журнала фискальных операций.
//
// Параметры:
// ИдентификаторЗаписи - РегистрСведенийЗапись.ФискальныеОперации - Идентификатор записи.
//
// Возвращаемое значение:
// РегистрСведенийЗапись.ФискальныеОперации.
Функция ФискальнаяОперацииПоИдентификатору(ИдентификаторЗаписи) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ФискальныеОперации.ИдентификаторЗаписи КАК ИдентификаторЗаписи,
| ФискальныеОперации.Дата КАК Дата,
| ФискальныеОперации.НомерЧекаККМ КАК НомерЧекаККМ,
| ФискальныеОперации.НомерСменыККМ КАК НомерСменыККМ,
| ФискальныеОперации.ТипДокумента КАК ТипДокумента,
| ФискальныеОперации.ТипРасчета КАК ТипРасчета,
| ФискальныеОперации.Организация КАК Организация,
| ФискальныеОперации.ТорговыйОбъект КАК ТорговыйОбъект,
| ФискальныеОперации.ЗаводскойНомерФН КАК ЗаводскойНомерФН,
| ФискальныеОперации.РегистрационныйНомерККТ КАК РегистрационныйНомерККТ,
| ФискальныеОперации.ДокументОснование КАК ДокументОснование,
| ФискальныеОперации.КорректируемыйДокумент КАК КорректируемыйДокумент,
| ФискальныеОперации.Сумма КАК Сумма,
| ФискальныеОперации.ФискальныйПризнак КАК ФискальныйПризнак,
| ФискальныеОперации.ДополнительныйРеквизит КАК ДополнительныйРеквизит,
| ФискальныеОперации.ЕдиныйЧек КАК ЕдиныйЧек,
| ФискальныеОперации.ИдентификаторОплатыПлатежнойСистемы КАК ИдентификаторОплатыПлатежнойСистемы,
| ФискальныеОперации.ТипПлатежнойСистемы КАК ТипПлатежнойСистемы,
| ФискальныеОперации.ДанныеXML КАК ДанныеXML
|ИЗ
| РегистрСведений.ФискальныеОперации КАК ФискальныеОперации
|ГДЕ
| (ИдентификаторЗаписи = &ИдентификаторЗаписи)");
Запрос.УстановитьПараметр("ИдентификаторЗаписи", ИдентификаторЗаписи);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ФискальнаяОперация = Новый Структура;
ФискальнаяОперация.Вставить("ИдентификаторЗаписи");
ФискальнаяОперация.Вставить("Дата");
ФискальнаяОперация.Вставить("НомерЧекаККМ");
ФискальнаяОперация.Вставить("НомерСменыККМ");
ФискальнаяОперация.Вставить("ЗаводскойНомерФН");
ФискальнаяОперация.Вставить("РегистрационныйНомерККТ");
ФискальнаяОперация.Вставить("ТипДокумента");
ФискальнаяОперация.Вставить("ТипРасчета");
ФискальнаяОперация.Вставить("Организация");
ФискальнаяОперация.Вставить("ТорговыйОбъект");
ФискальнаяОперация.Вставить("Сумма");
ФискальнаяОперация.Вставить("ДокументОснование");
ФискальнаяОперация.Вставить("КорректируемыйДокумент");
ФискальнаяОперация.Вставить("ФискальныйПризнак");
ФискальнаяОперация.Вставить("ДополнительныйРеквизит");
ФискальнаяОперация.Вставить("ЕдиныйЧек");
ФискальнаяОперация.Вставить("ДанныеXML");
ФискальнаяОперация.Вставить("ИдентификаторОплатыПлатежнойСистемы");
ФискальнаяОперация.Вставить("ТипПлатежнойСистемы");
ЗаполнитьЗначенияСвойств(ФискальнаяОперация, Выборка);
Возврат ФискальнаяОперация;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// Получить список журнала фискальных операций.
//
// Параметры:
// ДокументСсылка - ДокументСсылка - Документ-основание.
// ТипыДокументов - ПеречислениеСсылка.ТипыФискальныхДокументовККТ - типы фискальных документов.
// ТипРасчета - ПеречислениеСсылка.ТипыРасчетаДенежнымиСредствами - типы расчета.
//
// Возвращаемое значение:
// Массив Из Структура - Структура по свойствами:
// * НомерСменыККМ - Число - Номер чека ККМ.
// * Сумма - Число - Сумма.
// * ДокументОснование - ОпределяемыйТип.ОснованиеФискальнойОперацииБПО - Документ-основание.
// * ДанныеXML - ХранилищеЗначения - Данные чека, переданные в ККТ (XML).
//
Функция СписокФискальныхОпераций(ДокументСсылка, ТипыДокументов = Неопределено, ТипРасчета = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ФискальныеОперации.ИдентификаторЗаписи КАК ИдентификаторЗаписи,
| ФискальныеОперации.НомерЧекаККМ КАК НомерЧекаККМ,
| ФискальныеОперации.НомерСменыККМ КАК НомерСменыККМ,
| ФискальныеОперации.ТипДокумента КАК ТипДокумента,
| ФискальныеОперации.ТипРасчета КАК ТипРасчета,
| ФискальныеОперации.Организация КАК Организация,
| ФискальныеОперации.ТорговыйОбъект КАК ТорговыйОбъект,
| ФискальныеОперации.ЗаводскойНомерФН КАК ЗаводскойНомерФН,
| ФискальныеОперации.РегистрационныйНомерККТ КАК РегистрационныйНомерККТ,
| ФискальныеОперации.ДокументОснование КАК ДокументОснование,
| ФискальныеОперации.КорректируемыйДокумент КАК КорректируемыйДокумент,
| ФискальныеОперации.Сумма КАК Сумма,
| ФискальныеОперации.ФискальныйПризнак КАК ФискальныйПризнак,
| ФискальныеОперации.ДополнительныйРеквизит КАК ДополнительныйРеквизит,
| ФискальныеОперации.ДанныеXML КАК ДанныеXML
|ИЗ
| РегистрСведений.ФискальныеОперации КАК ФискальныеОперации
|ГДЕ
| (ФискальныеОперации.ДокументОснование = &ДокументСсылка)"
+ ?(ТипыДокументов = Неопределено, "", " И (ФискальныеОперации.ТипДокумента В (&ТипыДокументов))")
+ ?(ТипРасчета = Неопределено, "", " И (ФискальныеОперации.ТипРасчета = &ТипРасчета)")
+ " УПОРЯДОЧИТЬ ПО ФискальныеОперации.Дата УБЫВ, ФискальныеОперации.НомерСменыККМ УБЫВ");
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
Если ТипыДокументов <> Неопределено Тогда
// Подготовка типов документов для запроса.
МассивТипыДокументов = Новый Массив();
Если ТипЗнч(ТипыДокументов) = Тип("Массив") Тогда
Для Каждого ТипДокумента Из ТипыДокументов Цикл
МассивТипыДокументов.Добавить(ТипДокумента);
КонецЦикла;
Иначе
МассивТипыДокументов.Добавить(ТипыДокументов);
КонецЕсли;
Запрос.УстановитьПараметр("ТипыДокументов", МассивТипыДокументов);
КонецЕсли;
Если ТипРасчета <> Неопределено Тогда
Запрос.УстановитьПараметр("ТипРасчета", ТипРасчета);
КонецЕсли;
СписокОпераций = Новый Массив();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ФискальнаяОперация = Новый Структура;
ФискальнаяОперация.Вставить("ИдентификаторЗаписи");
ФискальнаяОперация.Вставить("НомерЧекаККМ");
ФискальнаяОперация.Вставить("НомерСменыККМ");
ФискальнаяОперация.Вставить("ЗаводскойНомерФН");
ФискальнаяОперация.Вставить("РегистрационныйНомерККТ");
ФискальнаяОперация.Вставить("ТипДокумента");
ФискальнаяОперация.Вставить("ТипРасчета");
ФискальнаяОперация.Вставить("Организация");
ФискальнаяОперация.Вставить("ТорговыйОбъект");
ФискальнаяОперация.Вставить("Сумма");
ФискальнаяОперация.Вставить("ДокументОснование");
ФискальнаяОперация.Вставить("КорректируемыйДокумент");
ФискальнаяОперация.Вставить("ФискальныйПризнак");
ФискальнаяОперация.Вставить("ДополнительныйРеквизит");
ФискальнаяОперация.Вставить("ДанныеXML");
ЗаполнитьЗначенияСвойств(ФискальнаяОперация, Выборка);
СписокОпераций.Добавить(ФискальнаяОперация);
КонецЦикла;
Возврат СписокОпераций;
КонецФункции
#КонецОбласти
#Область ФормированиеДанныхККТ
// Возвращает для каких типов товаров будет заполняться отраслевой реквизит.
//
// Возвращаемое значение:
// Структура:
// * ИзделияИзНатуральногоМеха - Булево - Заполнения для изделия из натурального меха.
// * ОбъемноСортовойУчет - Булево - Заполнения для товаров объемно сортового учета.
// * МолочнаяПродукцияСНечитаемымиКМ - Булево - Заполнения для молочной продукция с нечитаемыми КМ.
//
Функция ТипыТоваровДляЗаполненияОтраслевогоРеквизита() Экспорт;
ТипыТоваров = Новый Структура();
ТипыТоваров.Вставить("ИзделияИзНатуральногоМеха", Истина);
ТипыТоваров.Вставить("ОбъемноСортовойУчет", Истина);
ТипыТоваров.Вставить("ОбщественноеПитание", Истина);
ТипыТоваров.Вставить("МолочнаяПродукцияСНечитаемымиКМ", Ложь);
ТипыТоваров.Вставить("ВетеринарныеПрепараты", Истина);
Возврат ТипыТоваров;
КонецФункции
// Возвращает для каких типов товаров будет заполняться отраслевой реквизит.
//
// Возвращаемое значение:
// см. ТипыТоваровДляЗаполненияОтраслевогоРеквизита
//
Функция ОтраслевойРеквизитЗаполняетсяДляТиповТоваров() Экспорт
ТипыТоваров = ТипыТоваровДляЗаполненияОтраслевогоРеквизита();
МенеджерОборудованияВызовСервераПереопределяемый.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров(ТипыТоваров);
Возврат ТипыТоваров;
КонецФункции
// Возвращает ведется объемно сортовой учет.
//
// Возвращаемое значение:
// Булево.
//
Функция ВедетсяОбъемноСортовойУчет() Экспорт
Результат = Ложь;
ОбъемноСортовойУчет = Результат;
СтандартнаяОбработка = Истина;
МенеджерОборудованияВызовСервераПереопределяемый.ВедетсяОбъемноСортовойУчет(ОбъемноСортовойУчет, СтандартнаяОбработка);
Результат = ?(СтандартнаяОбработка, Результат, ОбъемноСортовойУчет);
Возврат Результат;
КонецФункции
// Возвращает оказываются ли услуги общественного питания.
//
// Возвращаемое значение:
// Булево.
//
Функция ОказываютсяУслугиОбщественноеПитания() Экспорт
Результат = Ложь;
ОбщественноеПитание = Результат;
СтандартнаяОбработка = Истина;
МенеджерОборудованияВызовСервераПереопределяемый.ОказываютсяУслугиОбщественноеПитания(ОбщественноеПитание, СтандартнаяОбработка);
Результат = ?(СтандартнаяОбработка, Результат, ОбщественноеПитание);
Возврат Результат;
КонецФункции
// Возвращает ативность контроля фискализации безналичных платежей
//
// Возвращаемое значение:
// Булево.
//
Функция КонтрольФискализацииБезналичныхПлатежей() Экспорт
Результат = Истина;
ФискализацииБезналичныхПлатежей = Результат;
СтандартнаяОбработка = Истина;
МенеджерОборудованияВызовСервераПереопределяемый.КонтрольФискализацииБезналичныхПлатежей(ФискализацииБезналичныхПлатежей, СтандартнаяОбработка);
Результат = ?(СтандартнаяОбработка, Результат, ФискализацииБезналичныхПлатежей);
Возврат Результат;
КонецФункции
// Сформировать таблицу параметров в XML для операции с ФН.
//
// Параметры:
// СтруктураПараметров - Структура
// РевизияИнтерфейса - Число - Ревизия интерфейса
//
// Возвращаемое значение:
// ЗаписьXML.
//
Функция СформироватьТаблицуПараметровДляОперацииФН(СтруктураПараметров, РевизияИнтерфейса = 0) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьXML.ЗаписатьНачалоЭлемента("ParametersFiscal");
ЗаписьXML.ЗаписатьАтрибут("CashierName" , XMLСтрока(?(СтруктураПараметров.Свойство("Кассир") , XMLСтрока(СтруктураПараметров.Кассир), НСтр("ru='Администратор'"))));
ЗаписьXML.ЗаписатьАтрибут("CashierINN" , XMLСтрока(?(СтруктураПараметров.Свойство("КассирИНН"), XMLСтрока(СтруктураПараметров.КассирИНН), "")));
Если РевизияИнтерфейса >= 3004 Тогда
// Коды причин изменения сведений о ККТ.
Если Не ПустаяСтрока(СтруктураПараметров.КодыПричинИзмененияСведений) Тогда
ЗаписьXML.ЗаписатьАтрибут("RegistrationLabelCodes", XMLСтрока(СтруктураПараметров.КодыПричинИзмененияСведений));
КонецЕсли;
Иначе
// Код причины перерегистрации.
ЗаписьXML.ЗаписатьАтрибут("RegistrationReasonCode", XMLСтрока(СтруктураПараметров.КодПричиныПеререгистрации));
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("KKTNumber" , XMLСтрока(СтруктураПараметров.РегистрационныйНомерККТ));
ЗаписьXML.ЗаписатьАтрибут("CompanyName" , XMLСтрока(СтруктураПараметров.ОрганизацияНазвание));
ЗаписьXML.ЗаписатьАтрибут("INN" , XMLСтрока(СтруктураПараметров.ОрганизацияИНН));
ЗаписьXML.ЗаписатьАтрибут("SaleAddress" , XMLСтрока(СтруктураПараметров.АдресПроведенияРасчетов));
ЗаписьXML.ЗаписатьАтрибут("SaleLocation" , XMLСтрока(СтруктураПараметров.МестоПроведенияРасчетов));
ЗаписьXML.ЗаписатьАтрибут("TaxationSystems" , XMLСтрока(СтруктураПараметров.КодыСистемыНалогообложения));
ЗаписьXML.ЗаписатьАтрибут("IsOffline" , XMLСтрока(СтруктураПараметров.ПризнакАвтономногоРежима));
ЗаписьXML.ЗаписатьАтрибут("IsEncrypted" , XMLСтрока(СтруктураПараметров.ПризнакШифрованиеДанных));
ЗаписьXML.ЗаписатьАтрибут("IsService" , XMLСтрока(СтруктураПараметров.ПризнакРасчетовЗаУслуги));
ЗаписьXML.ЗаписатьАтрибут("IsExcisable" , XMLСтрока(СтруктураПараметров.ПродажаПодакцизногоТовара));
ЗаписьXML.ЗаписатьАтрибут("IsGambling" , XMLСтрока(СтруктураПараметров.ПроведенияАзартныхИгр));
ЗаписьXML.ЗаписатьАтрибут("IsLottery" , XMLСтрока(СтруктураПараметров.ПроведенияЛотерей));
ЗаписьXML.ЗаписатьАтрибут("AgentTypes" , XMLСтрока(СтруктураПараметров.ПризнакиАгента));
ЗаписьXML.ЗаписатьАтрибут("BSOSing" , XMLСтрока(СтруктураПараметров.ПризнакФормированияБСО));
ЗаписьXML.ЗаписатьАтрибут("IsOnlineOnly" , XMLСтрока(СтруктураПараметров.ПризнакРасчетовТолькоВИнтернет));
Если РевизияИнтерфейса >= 3004 Тогда // Версия стандарта 3.4 (ОФД 1.2)
ЗаписьXML.ЗаписатьАтрибут("IsOnline" , XMLСтрока(СтруктураПараметров.ПроведенияРасчетаВИнтернет));
ЗаписьXML.ЗаписатьАтрибут("IsMarking" , XMLСтрока(СтруктураПараметров.ПродажаМаркированныхТоваров));
ЗаписьXML.ЗаписатьАтрибут("IsPawnshop" , XMLСтрока(СтруктураПараметров.ПризнакПримененияЛомбардами));
ЗаписьXML.ЗаписатьАтрибут("IsAssurance" , XMLСтрока(СтруктураПараметров.ПризнакДеятельностиПоСтрахованию));
КонецЕсли;
Если РевизияИнтерфейса >= 4000 Тогда // Версия стандарта 4.0 (ОФД 1.2)
ЗаписьXML.ЗаписатьАтрибут("IsVendingMachine" , XMLСтрока(СтруктураПараметров.ПризнакАвтоматическогоТорговогоАвтомата));
ЗаписьXML.ЗаписатьАтрибут("IsCateringServices", XMLСтрока(СтруктураПараметров.ПризнакОказанииУслугОбщественногоПитания));
ЗаписьXML.ЗаписатьАтрибут("IsWholesaleTrade" , XMLСтрока(СтруктураПараметров.ПризнакОптовойТорговлиСОрганизациями));
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("IsAutomaticPrinter", XMLСтрока(СтруктураПараметров.УстановкаПринтераВАвтомате));
ЗаписьXML.ЗаписатьАтрибут("IsAutomatic" , XMLСтрока(СтруктураПараметров.ПризнакАвтоматическогоРежима));
ЗаписьXML.ЗаписатьАтрибут("AutomaticNumber" , XMLСтрока(СтруктураПараметров.НомерАвтоматаДляАвтоматическогоРежима));
ЗаписьXML.ЗаписатьАтрибут("OFDCompany" , XMLСтрока(СтруктураПараметров.ОрганизацияОФДНазвание));
ЗаписьXML.ЗаписатьАтрибут("OFDCompanyINN" , XMLСтрока(СтруктураПараметров.ОрганизацияОФДИНН));
Если Не ПустаяСтрока(СтруктураПараметров.ОтправительEmail) Тогда
ЗаписьXML.ЗаписатьАтрибут("SenderEmail", XMLСтрока(СтруктураПараметров.ОтправительEmail));
КонецЕсли;
Если Не ПустаяСтрока(СтруктураПараметров.АдресСайтаФНС) Тогда
ЗаписьXML.ЗаписатьАтрибут("FNSURL", XMLСтрока(СтруктураПараметров.АдресСайтаФНС));
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("CashierName" , XMLСтрока(?(СтруктураПараметров.Свойство("Кассир") , XMLСтрока(СтруктураПараметров.Кассир), НСтр("ru='Администратор'"))));
ЗаписьXML.ЗаписатьАтрибут("CashierVATIN", XMLСтрока(?(СтруктураПараметров.Свойство("КассирИНН"), XMLСтрока(СтруктураПараметров.КассирИНН), "")));
// ФФД 1.0.0
ЗаписьXML.ЗаписатьАтрибут("KKTNumber" , XMLСтрока(СтруктураПараметров.РегистрационныйНомерККТ));
ЗаписьXML.ЗаписатьАтрибут("OFDVATIN" , XMLСтрока(СтруктураПараметров.ОрганизацияОФДИНН));
ЗаписьXML.ЗаписатьАтрибут("OFDOrganizationName", XMLСтрока(СтруктураПараметров.ОрганизацияОФДНазвание));
ЗаписьXML.ЗаписатьАтрибут("OrganizationName" , XMLСтрока(СтруктураПараметров.ОрганизацияНазвание));
ЗаписьXML.ЗаписатьАтрибут("VATIN" , XMLСтрока(СтруктураПараметров.ОрганизацияИНН));
ЗаписьXML.ЗаписатьАтрибут("AddressSettle" , XMLСтрока(СтруктураПараметров.АдресПроведенияРасчетов));
ЗаписьXML.ЗаписатьАтрибут("TaxVariant" , XMLСтрока(СтруктураПараметров.КодыСистемыНалогообложения));
ЗаписьXML.ЗаписатьАтрибут("OfflineMode" , XMLСтрока(СтруктураПараметров.ПризнакАвтономногоРежима));
ЗаписьXML.ЗаписатьАтрибут("DataEncryption" , XMLСтрока(СтруктураПараметров.ПризнакШифрованиеДанных));
ЗаписьXML.ЗаписатьАтрибут("ServiceSign" , XMLСтрока(СтруктураПараметров.ПризнакРасчетовЗаУслуги));
ЗаписьXML.ЗаписатьАтрибут("BSOSing" , XMLСтрока(СтруктураПараметров.ПризнакФормированияБСО));
ЗаписьXML.ЗаписатьАтрибут("CalcOnlineSign" , XMLСтрока(СтруктураПараметров.ПризнакРасчетовТолькоВИнтернет));
ЗаписьXML.ЗаписатьАтрибут("AutomaticMode" , XMLСтрока(СтруктураПараметров.ПризнакАвтоматическогоРежима));
ЗаписьXML.ЗаписатьАтрибут("AutomaticNumber" , XMLСтрока(СтруктураПараметров.НомерАвтоматаДляАвтоматическогоРежима));
// ФФД 1.05 & 1.1
ЗаписьXML.ЗаписатьАтрибут("PlaceSettle" , XMLСтрока(СтруктураПараметров.МестоПроведенияРасчетов));
ЗаписьXML.ЗаписатьАтрибут("SaleExcisableGoods" , XMLСтрока(СтруктураПараметров.ПродажаПодакцизногоТовара));
ЗаписьXML.ЗаписатьАтрибут("SignOfGambling" , XMLСтрока(СтруктураПараметров.ПроведенияАзартныхИгр));
ЗаписьXML.ЗаписатьАтрибут("SignOfLottery" , XMLСтрока(СтруктураПараметров.ПроведенияЛотерей));
ЗаписьXML.ЗаписатьАтрибут("SignOfAgent" , XMLСтрока(СтруктураПараметров.ПризнакиАгента));
ЗаписьXML.ЗаписатьАтрибут("PrinterAutomatic" , XMLСтрока(СтруктураПараметров.УстановкаПринтераВАвтомате));
// Изменение параметров регистрации.
ЗаписьXML.ЗаписатьАтрибут("ReasonCode" , XMLСтрока(СтруктураПараметров.КодПричиныПеререгистрации));
Если Не ПустаяСтрока(СтруктураПараметров.КодыПричинИзмененияСведений) Тогда
ЗаписьXML.ЗаписатьАтрибут("InfoChangesReasonsCodes", XMLСтрока(СтруктураПараметров.КодыПричинИзмененияСведений));
КонецЕсли;
Если Не ПустаяСтрока(СтруктураПараметров.ОтправительEmail) Тогда
ЗаписьXML.ЗаписатьАтрибут("SenderEmail", XMLСтрока(СтруктураПараметров.ОтправительEmail));
КонецЕсли;
Если Не ПустаяСтрока(СтруктураПараметров.АдресСайтаФНС) Тогда
ЗаписьXML.ЗаписатьАтрибут("FNSWebSite", XMLСтрока(СтруктураПараметров.АдресСайтаФНС));
КонецЕсли;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции
// Получить таблицу параметров из ККТ.
//
// Параметры:
// Данные - Структура - Данные.
// РевизияИнтерфейса - Число - Ревизия интерфейса
//
// Возвращаемое значение:
// Структура - Параметры из XMLПакета ККТ:
// * ПризнакФискализации - Строка.
// * НомерДокументаФискализации - Число.
// * ДатаВремяФискализации - Дата.
Функция ПараметрыИзXMLПакетаККТ(Данные, РевизияИнтерфейса = 0) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Данные);
ЧтениеXML.ПерейтиКСодержимому();
Параметры = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыРегистрацииККТ();
Параметры.Вставить("ТипОборудования", Перечисления.ТипыПодключаемогоОборудования.ККТ);
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
Если (ЧтениеXML.Имя = "Parameters" Или ЧтениеXML.Имя = "TableParametersKKT") И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.ВерсияФФДФН = "1.1";
ВерсияФФДФН = ЧтениеXML.ЗначениеАтрибута("FFDVersionFN");
Если ВерсияФФДФН = "1.0" Тогда
Параметры.ВерсияФФДФН = "1.0"
ИначеЕсли ВерсияФФДФН = "1.0.5" Или ВерсияФФДФН = "1.05" Тогда
Параметры.ВерсияФФДФН = "1.05"
ИначеЕсли ВерсияФФДФН = "1.2" Тогда
Параметры.ВерсияФФДФН = "1.2"
КонецЕсли;
Параметры.ВерсияФФДККТ = "1.1";
ВерсияФФДККТ = ЧтениеXML.ЗначениеАтрибута("FFDVersionKKT");
Если ВерсияФФДККТ = "1.0" Тогда
Параметры.ВерсияФФДККТ = "1.0"
ИначеЕсли ВерсияФФДККТ = "1.0.5" Или ВерсияФФДККТ = "1.05" Тогда
Параметры.ВерсияФФДККТ = "1.05"
ИначеЕсли ВерсияФФДККТ = "1.2" Тогда
Параметры.ВерсияФФДККТ = "1.2"
КонецЕсли;
// ФФД 1.0
Параметры.РегистрационныйНомерККТ = СокрЛП(ЧтениеXML.ЗначениеАтрибута("KKTNumber"));
Параметры.ЗаводскойНомерККТ = СокрЛП(ЧтениеXML.ЗначениеАтрибута("KKTSerialNumber"));
Параметры.ЗаводскойНомерФН = СокрЛП(ЧтениеXML.ЗначениеАтрибута("FNSerialNumber"));
Параметры.ОрганизацияНазвание = ЧтениеXML.ЗначениеАтрибута("CompanyName");
Параметры.ОрганизацияИНН = СокрЛП(ЧтениеXML.ЗначениеАтрибута("INN"));
Параметры.АдресПроведенияРасчетов = ЧтениеXML.ЗначениеАтрибута("SaleAddress");
Параметры.МестоПроведенияРасчетов = ЧтениеXML.ЗначениеАтрибута("SaleLocation");
Параметры.КодыСистемыНалогообложения = ЧтениеXML.ЗначениеАтрибута("TaxationSystems");
Параметры.ПризнакАвтономногоРежима = ВРег(ЧтениеXML.ЗначениеАтрибута("IsOffline")) = "TRUE";
Параметры.ПризнакШифрованиеДанных = ВРег(ЧтениеXML.ЗначениеАтрибута("IsEncrypted")) = "TRUE";
Параметры.ПризнакРасчетовЗаУслуги = ВРег(ЧтениеXML.ЗначениеАтрибута("IsService")) = "TRUE";
Параметры.ПродажаПодакцизногоТовара = ВРег(ЧтениеXML.ЗначениеАтрибута("IsExcisable")) = "TRUE";
Параметры.ПроведенияАзартныхИгр = ВРег(ЧтениеXML.ЗначениеАтрибута("IsGambling")) = "TRUE";
Параметры.ПроведенияЛотерей = ВРег(ЧтениеXML.ЗначениеАтрибута("IsLottery")) = "TRUE";
Параметры.ПризнакиАгента = ЧтениеXML.ЗначениеАтрибута("AgentTypes");
Параметры.ПризнакФормированияБСО = ВРег(ЧтениеXML.ЗначениеАтрибута("BSOSing")) = "TRUE";
Параметры.ПризнакРасчетовТолькоВИнтернет = ВРег(ЧтениеXML.ЗначениеАтрибута("IsOnlineOnly")) = "TRUE";
Параметры.УстановкаПринтераВАвтомате = ВРег(ЧтениеXML.ЗначениеАтрибута("IsAutomaticPrinter")) = "TRUE";
Параметры.ПризнакАвтоматическогоРежима = ВРег(ЧтениеXML.ЗначениеАтрибута("IsAutomatic")) = "TRUE";
Параметры.НомерАвтоматаДляАвтоматическогоРежима = ЧтениеXML.ЗначениеАтрибута("AutomaticNumber");
Параметры.ОрганизацияОФДНазвание = ЧтениеXML.ЗначениеАтрибута("OFDCompany");
Параметры.ОрганизацияОФДИНН = СокрЛП(ЧтениеXML.ЗначениеАтрибута("OFDCompanyINN"));
Параметры.ПризнакФискализации = ВРег(ЧтениеXML.ЗначениеАтрибута("Fiscal")) = "TRUE";
Параметры.НомерДокументаФискализации = ЧтениеXML.ЗначениеАтрибута("DocumentNumber");
Параметры.ДатаВремяФискализации = ЧтениеXML.ЗначениеАтрибута("DateTime");
Параметры.ОтправительEmail = ЧтениеXML.ЗначениеАтрибута("SenderEmail");
Параметры.АдресСайтаФНС = ЧтениеXML.ЗначениеАтрибута("FNSURL");
Если РевизияИнтерфейса >= 3004 Тогда // Версия стандарта 3.4 (ОФД 1.2)
Параметры.ПроведенияРасчетаВИнтернет = ВРег(ЧтениеXML.ЗначениеАтрибута("IsOnline")) = "TRUE";
Параметры.ПродажаМаркированныхТоваров = ВРег(ЧтениеXML.ЗначениеАтрибута("IsMarking")) = "TRUE";
Параметры.ПризнакПримененияЛомбардами = ВРег(ЧтениеXML.ЗначениеАтрибута("IsPawnshop")) = "TRUE";
Параметры.ПризнакДеятельностиПоСтрахованию = ВРег(ЧтениеXML.ЗначениеАтрибута("IsAssurance")) = "TRUE";
КонецЕсли;
Если РевизияИнтерфейса >= 4000 Тогда // Версия стандарта 4.0 (ОФД 1.2)
Параметры.ПризнакАвтоматическогоТорговогоАвтомата = ВРег(ЧтениеXML.ЗначениеАтрибута("IsVendingMachine")) = "TRUE";
Параметры.ПризнакОказанииУслугОбщественногоПитания = ВРег(ЧтениеXML.ЗначениеАтрибута("IsCateringServices")) = "TRUE";
ПризнакОптовойТорговлиСОрганизациями = ЧтениеXML.ЗначениеАтрибута("IsWholesaleTrade");
Если НЕ ПустаяСтрока(ПризнакОптовойТорговлиСОрганизациями) Тогда
Параметры.ПризнакОптовойТорговлиСОрганизациями = ВРег(ПризнакОптовойТорговлиСОрганизациями) = "TRUE";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Если ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.ВерсияФФДФН = ЧтениеXML.ЗначениеАтрибута("FFDVersionFN");
Если ПустаяСтрока(Параметры.ВерсияФФДФН) Тогда
Параметры.ВерсияФФДФН = "1.0";
КонецЕсли;
Параметры.ВерсияФФДККТ = ЧтениеXML.ЗначениеАтрибута("FFDVersionKKT");
Если ПустаяСтрока(Параметры.ВерсияФФДККТ) Тогда
Параметры.ВерсияФФДККТ = "1.0";
КонецЕсли;
// ФФД 1.0
Параметры.РегистрационныйНомерККТ = СокрЛП(ЧтениеXML.ЗначениеАтрибута("KKTNumber"));
Параметры.ОрганизацияНазвание = ЧтениеXML.ЗначениеАтрибута("OrganizationName");
Параметры.ОрганизацияИНН = СокрЛП(ЧтениеXML.ЗначениеАтрибута("VATIN"));
Параметры.АдресПроведенияРасчетов = ЧтениеXML.ЗначениеАтрибута("AddressSettle");
Параметры.МестоПроведенияРасчетов = ЧтениеXML.ЗначениеАтрибута("PlaceSettle");
Параметры.КодыСистемыНалогообложения = ЧтениеXML.ЗначениеАтрибута("TaxVariant");
Если ПустаяСтрока(Параметры.КодыСистемыНалогообложения) Тогда
Параметры.КодыСистемыНалогообложения = ЧтениеXML.ЗначениеАтрибута("TaxVarinat");
КонецЕсли;
Параметры.ПризнакАвтономногоРежима = ВРег(ЧтениеXML.ЗначениеАтрибута("OfflineMode")) = "TRUE";
Параметры.ПризнакАвтоматическогоРежима = ВРег(ЧтениеXML.ЗначениеАтрибута("AutomaticMode")) = "TRUE";
Параметры.НомерАвтоматаДляАвтоматическогоРежима = ЧтениеXML.ЗначениеАтрибута("AutomaticNumber");
Параметры.ПризнакФормированияБСО = ВРег(ЧтениеXML.ЗначениеАтрибута("BSOSing")) = "TRUE";
Параметры.ПризнакРасчетовТолькоВИнтернет = ВРег(ЧтениеXML.ЗначениеАтрибута("CalcOnlineSign")) = "TRUE";
Параметры.ПризнакШифрованиеДанных = ВРег(ЧтениеXML.ЗначениеАтрибута("DataEncryption")) = "TRUE";
Параметры.ОрганизацияОФДИНН = СокрЛП(ЧтениеXML.ЗначениеАтрибута("OFDVATIN"));
Параметры.ОрганизацияОФДНазвание = ЧтениеXML.ЗначениеАтрибута("OFDOrganizationName");
Параметры.ЗаводскойНомерККТ = СокрЛП(ЧтениеXML.ЗначениеАтрибута("KKTSerialNumber"));
Параметры.ПризнакФискализации = ВРег(ЧтениеXML.ЗначениеАтрибута("Fiscal")) = "TRUE";
Параметры.ЗаводскойНомерФН = СокрЛП(ЧтениеXML.ЗначениеАтрибута("FNSerialNumber"));
Параметры.НомерДокументаФискализации = ЧтениеXML.ЗначениеАтрибута("DocumentNumber");
Параметры.ДатаВремяФискализации = ЧтениеXML.ЗначениеАтрибута("DateTime");
Параметры.ПризнакРасчетовЗаУслуги = ВРег(ЧтениеXML.ЗначениеАтрибута("ServiceSign")) = "TRUE";
Параметры.ПродажаПодакцизногоТовара = ВРег(ЧтениеXML.ЗначениеАтрибута("SaleExcisableGoods")) = "TRUE";
Параметры.ПроведенияАзартныхИгр = ВРег(ЧтениеXML.ЗначениеАтрибута("SignOfGambling")) = "TRUE";
Параметры.ПроведенияЛотерей = ВРег(ЧтениеXML.ЗначениеАтрибута("SignOfLottery")) = "TRUE";
Параметры.ПризнакиАгента = ЧтениеXML.ЗначениеАтрибута("SignOfAgent");
Параметры.УстановкаПринтераВАвтомате = ВРег(ЧтениеXML.ЗначениеАтрибута("PrinterAutomatic")) = "TRUE";
Параметры.ОтправительEmail = ЧтениеXML.ЗначениеАтрибута("SenderEmail");
Параметры.АдресСайтаФНС = ЧтениеXML.ЗначениеАтрибута("FNSWebSite");
КонецЕсли;
КонецЕсли;
СистемыНалогообложения = Новый Массив();
Если Не ПустаяСтрока(Параметры.КодыСистемыНалогообложения) Тогда
СистемыНалогообложенияВрем = СтрРазделить(Параметры.КодыСистемыНалогообложения, ",");
Для Каждого ВремСНО Из СистемыНалогообложенияВрем Цикл
СНО = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.СистемаНалогообложенияККТПоКоду(Число(ВремСНО));
СистемыНалогообложения.Добавить(СНО);
КонецЦикла;
Параметры.Вставить("СистемыНалогообложения", СистемыНалогообложения);
КонецЕсли;
Возврат Параметры;
КонецФункции
// Процедура формирует XML пакет для Фискализация чека.
//
// Параметры:
// ОбщиеПараметры - Структура - параметры чека
// ПараметрыФискализации - Структура - параметры фискализации чека.
// ВключатьПерсональныеДанные - Булево - Включать персональные данные.
// ПерсональныеДанные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПерсональныеДанныеПокупателя.
// ТипПерсональныхДанных - ПеречислениеСсылка.ТипыПерсональныхДанныхККТ - Тип персональных данных.
Процедура СформироватьXMLПакетДляФискализацияЧека(ОбщиеПараметры, ПараметрыФискализации, ВключатьПерсональныеДанные = Ложь,
ПерсональныеДанные = Неопределено, ТипПерсональныхДанных = Неопределено) Экспорт
// ++ Локализация
ПозицииЧека = ОбщиеПараметры.ПозицииЧека;
ТаблицаОплат = ОбщиеПараметры.ТаблицаОплат;
Электронно = ОбщиеПараметры.Электронно;
ТипРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодРасчетаДенежнымиСредствами(ОбщиеПараметры.ТипРасчета);
СистемаНалогообложения = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодСистемыНалогообложенияККТ(ОбщиеПараметры.СистемаНалогообложения);
// Таблица оплат
СуммаЧека = 0;
СуммаНаличные = 0;
СуммаЭлектронно = 0;
СуммаПредоплата = 0;
СуммаПостоплата = 0;
СуммаПредоставление = 0;
Если ТаблицаОплат <> Неопределено Тогда
Для ИндексОплаты = 0 По ТаблицаОплат.Количество() - 1 Цикл
Если ТаблицаОплат[ИндексОплаты].ТипОплаты = Перечисления.ТипыОплатыККТ.Электронно Тогда
СуммаЭлектронно = СуммаЭлектронно + ТаблицаОплат[ИндексОплаты].Сумма;
ИначеЕсли ТаблицаОплат[ИндексОплаты].ТипОплаты = Перечисления.ТипыОплатыККТ.Предоплата Тогда
СуммаПредоплата = СуммаПредоплата + ТаблицаОплат[ИндексОплаты].Сумма;
ИначеЕсли ТаблицаОплат[ИндексОплаты].ТипОплаты = Перечисления.ТипыОплатыККТ.Постоплата Тогда
СуммаПостоплата = СуммаПостоплата + ТаблицаОплат[ИндексОплаты].Сумма;
ИначеЕсли ТаблицаОплат[ИндексОплаты].ТипОплаты = Перечисления.ТипыОплатыККТ.ВстречноеПредоставление Тогда
СуммаПредоставление = СуммаПредоставление + ТаблицаОплат[ИндексОплаты].Сумма;
Иначе
СуммаНаличные = СуммаНаличные + ТаблицаОплат[ИндексОплаты].Сумма;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ОплатаНеНаличными = СуммаЭлектронно + СуммаПостоплата + СуммаПредоплата + СуммаПредоставление;
// Выводим в печатную форму чека дополнительную информацию по СПБ и НСПК
Если ОбщиеПараметры.Свойство("ДетализацияОплаты") И ОбщиеПараметры.ДетализацияОплаты.Количество() > 0 И НЕ ПараметрыФискализации.ДетализацияОплатыДобавлено Тогда
ПараметрыФискализации.ДетализацияОплатыДобавлено = Истина;
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
ТекстСтроки = НСтр("ru='ДЕТАЛИЗАЦИЯ ОПЛАТЫ'");
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ТекстСтроки);
СтрокаЧека.Выравнивание = "Центр";
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
ФорматЧисла = "ЧРД=.;ЧЦ=12;ЧДЦ=2;ЧН=0.00;ЧГ=0";
Для Каждого ДетализацияОплаты Из ОбщиеПараметры.ДетализацияОплаты Цикл
ТекстСтроки = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыстроитьПоля(ДетализацияОплаты.НаименованиеТипаОплаты,
Формат(ДетализацияОплаты.Сумма, ФорматЧисла), ПараметрыФискализации.ШиринаСтроки);
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ТекстСтроки);
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЦикла
КонецЕсли;
// QR-код по СПБ и НСПК
Если ОбщиеПараметры.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств Тогда
Если ОбщиеПараметры.Свойство("QRКод") И Не ПустаяСтрока(ОбщиеПараметры.QRКод.ЗначениеКода) И НЕ ПараметрыФискализации.QRКодДобавлено Тогда
ПараметрыФискализации.QRКодДобавлено = Истина;
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыШтрихкодВСтрокеЧека("QR", ОбщиеПараметры.QRКод.ЗначениеКода);
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
Если НЕ ПустаяСтрока(ОбщиеПараметры.ТипПлатежнойСистемы) Тогда
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ОбщиеПараметры.ТипПлатежнойСистемы);
СтрокаЧека.Выравнивание = "Центр";
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЕсли;
Если НЕ ПустаяСтрока(ОбщиеПараметры.QRКод.ТекстПользователя) Тогда
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ОбщиеПараметры.QRКод.ТекстПользователя);
СтрокаЧека.Выравнивание = "Центр";
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЕсли;
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЕсли;
КонецЕсли;
// Пакетная печать чека. Подготовка пакета.
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("CheckPackage");
Если ПараметрыФискализации.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("CashierName", XMLСтрока(ОбщиеПараметры.Кассир));
Если Не ПустаяСтрока(ОбщиеПараметры.КассирИНН) Тогда
ЗаписьXML.ЗаписатьАтрибут("CashierINN", XMLСтрока(ОбщиеПараметры.КассирИНН));
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("OperationType", XMLСтрока(ТипРасчета));
ЗаписьXML.ЗаписатьАтрибут("TaxationSystem" , XMLСтрока(СистемаНалогообложения));
Если Не ПустаяСтрока(ОбщиеПараметры.ОтправительEmail) И Электронно Тогда // Отправитель Email указывается только для Электронно.
ЗаписьXML.ЗаписатьАтрибут("SenderEmail", XMLСтрока(ОбщиеПараметры.ОтправительEmail));
КонецЕсли;
Если ОбщиеПараметры.Свойство("АдресРасчетов") И НЕ ПустаяСтрока(ОбщиеПараметры.АдресРасчетов) Тогда
ЗаписьXML.ЗаписатьАтрибут("SaleAddress", XMLСтрока(ОбщиеПараметры.АдресРасчетов));
КонецЕсли;
Если ОбщиеПараметры.Свойство("МестоРасчетов") И НЕ ПустаяСтрока(ОбщиеПараметры.МестоРасчетов) Тогда
ЗаписьXML.ЗаписатьАтрибут("SaleLocation", XMLСтрока(ОбщиеПараметры.МестоРасчетов));
КонецЕсли;
Если ПараметрыФискализации.РевизияИнтерфейса >= 4000 Тогда
Если ОбщиеПараметры.Свойство("СворачиватьОдинаковыеСтрокПриПечати") Тогда
ЗаписьXML.ЗаписатьАтрибут("GroupingPositionsWhenPrinting", XMLСтрока(ОбщиеПараметры.СворачиватьОдинаковыеСтрокПриПечати));
КонецЕсли;
КонецЕсли;
Если ОбщиеПараметры.Свойство("ПокупательEmail") Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomerEmail", XMLСтрока(?(ОбщиеПараметры.Свойство("ПокупательEmail"), ОбщиеПараметры.ПокупательEmail, "")));
КонецЕсли;
// SMS отправляет средствами 1C
Если ОбщиеПараметры.Свойство("ПокупательНомер") Тогда
ПокупательНомер = ?(ОбщиеПараметры.Свойство("ПокупательНомер"), ОбщиеПараметры.ПокупательНомер, "");
ПокупательНомер = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ПокупательНомер);
ЗаписьXML.ЗаписатьАтрибут("CustomerPhone", XMLСтрока(ПокупательНомер));
КонецЕсли;
Если ПараметрыФискализации.РевизияИнтерфейса < 3004 Тогда
Получатель = ОбщиеПараметры.Получатель;
Если ПустаяСтрока(Получатель) Тогда
Получатель = ОбщиеПараметры.СведенияОПокупателе.Покупатель;
КонецЕсли;
ПолучательИНН = ОбщиеПараметры.ПолучательИНН;
Если ПустаяСтрока(ПолучательИНН) Тогда
ПолучательИНН = ОбщиеПараметры.СведенияОПокупателе.ПокупательИНН;
КонецЕсли;
Если ПерсональныеДанные <> Неопределено Тогда
Если ТипПерсональныхДанных = Перечисления.ТипыПерсональныхДанныхККТ.ИНН Тогда
ПолучательИНН = ПерсональныеДанные.ИНН;
ИначеЕсли Не ПустаяСтрока(ПерсональныеДанные.ДанныеДокумента) Тогда
Получатель = СтрШаблон("<%1> <%2>", Получатель, ПерсональныеДанные.ДанныеДокумента);
КонецЕсли;
КонецЕсли;
Если Не ПустаяСтрока(Получатель) Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomerInfo", XMLСтрока(Получатель));
КонецЕсли;
Если Не ПустаяСтрока(ПолучательИНН) Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomerINN", XMLСтрока(ПолучательИНН));
КонецЕсли;
Иначе
Если ОбщиеПараметры.Свойство("НомерАвтомата") И НЕ ПустаяСтрока(ОбщиеПараметры.НомерАвтомата) Тогда
ЗаписьXML.ЗаписатьАтрибут("AutomatNumber", XMLСтрока(ОбщиеПараметры.НомерАвтомата));
КонецЕсли;
КонецЕсли;
Если ОбщиеПараметры.Свойство("ПризнакАгента") И НЕ ПустаяСтрока(ОбщиеПараметры.ПризнакАгента) Тогда
ПризнакАгента = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодПризнакаАгента(ОбщиеПараметры.ПризнакАгента);
ЗаписьXML.ЗаписатьАтрибут("AgentType", XMLСтрока(ПризнакАгента));
КонецЕсли;
Если ОбщиеПараметры.Свойство("ДополнительныйРеквизит") И НЕ ПустаяСтрока(ОбщиеПараметры.ДополнительныйРеквизит) Тогда
ЗаписьXML.ЗаписатьАтрибут("AdditionalAttribute", XMLСтрока(ОбщиеПараметры.ДополнительныйРеквизит));
КонецЕсли;
Если ОбщиеПараметры.Свойство("ДанныеКоррекции") Тогда
ЗаписатьДанныеКоррекции(ЗаписьXML, ОбщиеПараметры.ДанныеКоррекции);
КонецЕсли;
Если ОбщиеПараметры.Свойство("ДополнительныйРеквизитПользователя") Тогда
ЗаписатьДополнительныйРеквизитПользователя(ЗаписьXML, ОбщиеПараметры.ДополнительныйРеквизитПользователя);
КонецЕсли;
ЗаписатьДанныеАгента(ЗаписьXML, ОбщиеПараметры.ДанныеАгента, ПараметрыФискализации.РевизияИнтерфейса);
ЗаписатьДанныеПоставщика(ЗаписьXML, ОбщиеПараметры.ДанныеПоставщика, ПараметрыФискализации.РевизияИнтерфейса);
Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
ЗаписатьСведенияОПокупателе(ЗаписьXML, ОбщиеПараметры, ПерсональныеДанные, ТипПерсональныхДанных);
ЗаписатьОперационныйРеквизит(ЗаписьXML, ОбщиеПараметры.ОперационныйРеквизит);
ЗаписатьОтраслевойРеквизит(ЗаписьXML, ОбщиеПараметры.ОтраслевойРеквизит);
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Если ОбщиеПараметры.Свойство("ФорматФД") Тогда
ФорматФД = ОбщиеПараметры.ФорматФД;
Иначе
ФорматФД = "1.2";
КонецЕсли;
// Табличная часть
Если ОбщиеПараметры.ПозицииЧека <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
Для ИндексМассива = 0 По ОбщиеПараметры.ПозицииЧека.Количество() - 1 Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива]; // см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойСтрокиЧека
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда // Фискальная строка
Если ТекущаяПозиция.ЦенаСоСкидками = 0 И ТекущаяПозиция.Сумма > 0 И ТекущаяПозиция.Количество > 0 Тогда
ЦенаСоСкидками = Окр(ТекущаяПозиция.Сумма / ТекущаяПозиция.Количество, 2);
Иначе
ЦенаСоСкидками = ТекущаяПозиция.ЦенаСоСкидками;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name" , XMLСтрока(ТекущаяПозиция.Наименование)); // Наименование товара.
ЗаписьXML.ЗаписатьАтрибут("Quantity" , XMLСтрока(ТекущаяПозиция.Количество)); // Количество товара.
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount" , XMLСтрока(ЦенаСоСкидками)); // Цена единицы товара с учетом скидок/наценок.
ЗаписьXML.ЗаписатьАтрибут("AmountWithDiscount", XMLСтрока(ТекущаяПозиция.Сумма)); // Конечная сумма по позиции чека с учетом всех скидок/наценок.
ЗаписьXML.ЗаписатьАтрибут("DiscountAmount" , XMLСтрока(ТекущаяПозиция.СуммаСкидок)); // Сумма скидок и наценок.
ЗаписьXML.ЗаписатьАтрибут("Department" , XMLСтрока(ТекущаяПозиция.НомерСекции)); // Отдел, по которому ведется продажа
ЗначениеСтавкаНДС = ПредставлениеСтавкиНДС(ТекущаяПозиция.СтавкаНДС, ПараметрыФискализации.РевизияИнтерфейса);
ЗаписьXML.ЗаписатьАтрибут("VATRate", XMLСтрока(ЗначениеСтавкаНДС)); // Ставка НДС
Если ТекущаяПозиция.Свойство("СуммаНДС") И НЕ ПустаяСтрока(ТекущаяПозиция.СуммаНДС) И ЗначениеСтавкаНДС <> "none" Тогда
ЗаписьXML.ЗаписатьАтрибут("VATAmount", XMLСтрока(ТекущаяПозиция.СуммаНДС));
КонецЕсли;
Если ТекущаяПозиция.Свойство("ПризнакСпособаРасчета") И НЕ ПустаяСтрока(ТекущаяПозиция.ПризнакСпособаРасчета) Тогда
ПризнакСпособаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодПризнакаСпособаРасчета(ТекущаяПозиция.ПризнакСпособаРасчета);
ЗаписьXML.ЗаписатьАтрибут("PaymentMethod", XMLСтрока(ПризнакСпособаРасчета));
КонецЕсли;
ПризнакПредметаРасчета = Неопределено;
Если ТекущаяПозиция.Свойство("ПризнакПредметаРасчета") И НЕ ПустаяСтрока(ТекущаяПозиция.ПризнакПредметаРасчета) Тогда
ПризнакПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодПризнакаПредметаРасчета(ТекущаяПозиция.ПризнакПредметаРасчета);
Если ПризнакПредметаРасчета <> Неопределено Тогда
ЗаписьXML.ЗаписатьАтрибут("CalculationSubject", XMLСтрока(ПризнакПредметаРасчета));
КонецЕсли;
КонецЕсли;
Если ТекущаяПозиция.Свойство("ПризнакАгентаПоПредметуРасчета") И НЕ ПустаяСтрока(ТекущаяПозиция.ПризнакАгентаПоПредметуРасчета) Тогда
ПризнакАгентаПоПредметуРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодПризнакаАгента(ТекущаяПозиция.ПризнакАгентаПоПредметуРасчета);
ЗаписьXML.ЗаписатьАтрибут("CalculationAgent", XMLСтрока(ПризнакАгентаПоПредметуРасчета));
КонецЕсли;
Если ТекущаяПозиция.Свойство("КодСтраныПроисхожденияТовара") И НЕ ПустаяСтрока(ТекущаяПозиция.КодСтраныПроисхожденияТовара) Тогда
ЗаписьXML.ЗаписатьАтрибут("CountryOfOrigin", XMLСтрока(ТекущаяПозиция.КодСтраныПроисхожденияТовара));
КонецЕсли;
Если ТекущаяПозиция.Свойство("НомерТаможеннойДекларации") И НЕ ПустаяСтрока(ТекущаяПозиция.НомерТаможеннойДекларации) Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomsDeclaration", XMLСтрока(ТекущаяПозиция.НомерТаможеннойДекларации));
КонецЕсли;
Если ТекущаяПозиция.Свойство("СуммаАкциза") И ТекущаяПозиция.СуммаАкциза <> Неопределено Тогда
Если Число(ТекущаяПозиция.СуммаАкциза) > 0 Тогда
ЗаписьXML.ЗаписатьАтрибут("ExciseAmount", XMLСтрока(ТекущаяПозиция.СуммаАкциза));
ИначеЕсли ПризнакПредметаРасчета <> Неопределено Тогда
Если ПризнакПредметаРасчета = 2 Или ПризнакПредметаРасчета = 30 Или ПризнакПредметаРасчета = 31 Тогда
ЗаписьXML.ЗаписатьАтрибут("ExciseAmount", XMLСтрока(ТекущаяПозиция.СуммаАкциза));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ТекущаяПозиция.Свойство("ДополнительныйРеквизит") Тогда // Тэг 1191
ДополнительныйРеквизит = "";
Если НЕ ПустаяСтрока(ТекущаяПозиция.ДополнительныйРеквизит) Тогда
ДополнительныйРеквизит = ТекущаяПозиция.ДополнительныйРеквизит;
ИначеЕсли ВедетсяОбъемноСортовойУчет() И ТекущаяПозиция.ОбъемноСортовойУчет И ПараметрыФискализации.РевизияИнтерфейса < 3004 Тогда
// Передача сведений об объемно сортовой товара при оптовой продаже через ККТ
ДополнительныйРеквизит = "crpt=mrk";
ИначеЕсли ТекущаяПозиция.Свойство("ДробноеКоличество") И ПараметрыФискализации.РевизияИнтерфейса < 3004 Тогда
// Дробное количество, рекомендации ЦРПТ "ВЫВОД ТОВАРА ИЗ ОБОРОТА ПРИ РЕАЛИЗАЦИИ КОНЕЧНЫМ ПОТРЕБИТЕЛЯМ (ЧАСТИЧНАЯ ПРОДАЖА)"
// для 1.05 и 1.1 - пишем в 1191, Формирование и передача фискального документа в ГИС МТ
Если Не ПустаяСтрока(ТекущаяПозиция.ДробноеКоличество.Числитель) И Не ПустаяСтрока(ТекущаяПозиция.ДробноеКоличество.Знаменатель) Тогда
Числитель = Число(ТекущаяПозиция.ДробноеКоличество.Числитель);
Знаменатель = Число(ТекущаяПозиция.ДробноеКоличество.Знаменатель);
ДополнительныйРеквизит = "mrk"; // Префикс «mrk», если после «mrk» указание дробной части отсутствует, упаковка считается выведенной из оборота полностью.
Если Числитель <> Знаменатель Тогда
ДополнительныйРеквизит = ДополнительныйРеквизит + Строка(Числитель) + "/" + Строка(Знаменатель) + "&";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не ПустаяСтрока(ДополнительныйРеквизит) Тогда
ЗаписьXML.ЗаписатьАтрибут("AdditionalAttribute", XMLСтрока(ДополнительныйРеквизит)); // Тэг 1191
КонецЕсли;
КонецЕсли;
Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
Если Не ПустаяСтрока(ТекущаяПозиция.КонтрольнаяМарка) Тогда
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ТекущаяПозиция.КонтрольнаяМарка));
КонецЕсли;
Если ФорматФД = "1.2" Тогда
ДробноеКоличествоУказано = Ложь;
ДробноеКоличество = ТекущаяПозиция.ДробноеКоличество;
Если Не ПустаяСтрока(ДробноеКоличество.Числитель) И Не ПустаяСтрока(ДробноеКоличество.Знаменатель) Тогда
Если Число(ДробноеКоличество.Числитель) > 0 И Число(ДробноеКоличество.Знаменатель) > 0 Тогда
ДробноеКоличествоУказано = Истина;
КонецЕсли;
КонецЕсли;
Если ДробноеКоличествоУказано Тогда
МераКоличестваПредметаРасчета = 0;
ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
ЗаписьXML.ЗаписатьНачалоЭлемента("FractionalQuantity");
ЗаписьXML.ЗаписатьАтрибут("Numerator", XMLСтрока(ДробноеКоличество.Числитель));
ЗаписьXML.ЗаписатьАтрибут("Denominator", XMLСтрока(ДробноеКоличество.Знаменатель));
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
Если ВедетсяОбъемноСортовойУчет() И ТекущаяПозиция.ОбъемноСортовойУчет И Не ПустаяСтрока(ТекущаяПозиция.КоличествоВесовогоТовара) Тогда
МераКоличестваПредметаРасчета = 11; // Килограмм
Иначе
МераКоличестваПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.МераКоличестваПредметаРасчетаПоКодуЕдиницыИзмерения(ТекущаяПозиция.КодЕдиницыИзмерения);
МераКоличестваПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодМерыКоличестваПредметаРасчетаККТ(МераКоличестваПредметаРасчета);
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
КонецЕсли;
КонецЕсли;
Иначе
Если ТекущаяПозиция.Свойство("ЕдиницаИзмерения") И ТекущаяПозиция.ЕдиницаИзмерения <> Неопределено Тогда
ЗаписьXML.ЗаписатьАтрибут("MeasurementUnit", XMLСтрока(Лев(ТекущаяПозиция.ЕдиницаИзмерения, 16)));
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
МодульМенеджерОборудованияМаркировка.ЗаписатьДанныеКодаТоварнойНоменклатуры(ЗаписьXML, ТекущаяПозиция, ПараметрыФискализации);
Если ВедетсяОбъемноСортовойУчет() И ТекущаяПозиция.ОбъемноСортовойУчет Тогда
МодульМенеджерОборудованияМаркировка.ЗаполнитьОтраслевойРеквизитОбъемноСортовойУчет(ТекущаяПозиция);
ИначеЕсли ОказываютсяУслугиОбщественноеПитания() И ТекущаяПозиция.ОбщественноеПитание Тогда
МодульМенеджерОборудованияМаркировка.ЗаполнитьОтраслевойРеквизитОбщественноеПитание(ТекущаяПозиция);
ИначеЕсли ТекущаяПозиция.ВетеринарныйПрепарат Тогда
МодульМенеджерОборудованияМаркировка.ЗаполнитьОтраслевойРеквизитВетеринарныеПрепараты(ТекущаяПозиция);
КонецЕсли;
Если Не ПустаяСтрока(ТекущаяПозиция.ЗапросПроверкиКода.ИдентификаторЗапроса)
И Не ПустаяСтрока(ТекущаяПозиция.ЗапросПроверкиКода.ВременнаяМетка) Тогда
МодульМенеджерОборудованияМаркировка.ЗаполнитьДанныеЗапросПроверкиКода(ТекущаяПозиция);
КонецЕсли;
КонецЕсли;
ЗаписатьДанныеАгента(ЗаписьXML, ТекущаяПозиция.ДанныеАгента, ПараметрыФискализации.РевизияИнтерфейса);
ЗаписатьДанныеПоставщика(ЗаписьXML, ТекущаяПозиция.ДанныеПоставщика, ПараметрыФискализации.РевизияИнтерфейса);
Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
ЗаписатьОтраслевойРеквизит(ЗаписьXML, ТекущаяПозиция.ОтраслевойРеквизит);
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
ИначеЕсли ТекущаяПозиция.Свойство("ТекстоваяСтрока") Тогда // Текстовая строка
Если ТекущаяПозиция.Свойство("ПереносСтроки") И ТекущаяПозиция.ПереносСтроки Тогда
ТекстовыеСтроки = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПостроитьПолеПереносом(ТекущаяПозиция.Текст, ПараметрыФискализации.ШиринаСтроки);
Иначе
ТекстовыеСтроки = ТекущаяПозиция.Текст;
КонецЕсли;
Выравнивание = ?(ТекущаяПозиция.Свойство("Выравнивание"), ТекущаяПозиция.Выравнивание, "Лево");
Для НомерСтроки = 1 По СтрЧислоСтрок(ТекстовыеСтроки) Цикл
ВыделеннаяСтрока = СтрПолучитьСтроку(ТекстовыеСтроки, НомерСтроки);
ВыделеннаяСтрока = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыровнятьПоле(ВыделеннаяСтрока, ПараметрыФискализации.ШиринаСтроки, Выравнивание);
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ВыделеннаяСтрока));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ИначеЕсли ТекущаяПозиция.Свойство("ШтрихКод") Тогда // Штрихкод
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
ЗаписьXML.ЗаписатьАтрибут("Type" , XMLСтрока(ТекущаяПозиция.ТипШтрихкода));
// Значение штрихкода. Штрихкод кодируется текстом в кодировке Base64.
Если ПараметрыФискализации.РевизияИнтерфейса >= 3003 Тогда
ШтрихКодBase64 = МенеджерОборудованияКлиентСервер.ШтрихкодВBase64(ТекущаяПозиция.ШтрихКод);
Если ТекущаяПозиция.Свойство("ШтрихКодBase64")
И НЕ ПустаяСтрока(ТекущаяПозиция.ШтрихКодBase64) Тогда
ШтрихКодBase64 = ТекущаяПозиция.ШтрихКодBase64;
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("ValueBase64", XMLСтрока(ШтрихКодBase64));
Иначе
ЗаписьXML.ЗаписатьАтрибут("Value", XMLСтрока(ТекущаяПозиция.ШтрихКод));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
// Таблица оплат
Если ТаблицаОплат <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Payments");
ЗаписьXML.ЗаписатьАтрибут("Cash", XMLСтрока(СуммаНаличные));
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаЭлектронно));
ЗаписьXML.ЗаписатьАтрибут("PrePayment", XMLСтрока(СуммаПредоплата));
ЗаписьXML.ЗаписатьАтрибут("PostPayment", XMLСтрока(СуммаПостоплата));
ЗаписьXML.ЗаписатьАтрибут("Barter", XMLСтрока(СуммаПредоставление));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
Если ПараметрыФискализации.РевизияИнтерфейса >= 4004
И ОбщиеПараметры.СведенияОБезналичнойОплате <> Неопределено
И ОбщиеПараметры.СведенияОБезналичнойОплате.Количество() Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ElectronicPaymentInfo");
Для Каждого СведенияОБезналичнойОплате Из ОбщиеПараметры.СведенияОБезналичнойОплате Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("ElectronicPayment");
ЗаписьXML.ЗаписатьАтрибут("Amount", XMLСтрока(СведенияОБезналичнойОплате.Сумма));
ЗаписьXML.ЗаписатьАтрибут("PaymentMethod", XMLСтрока(СведенияОБезналичнойОплате.ПризнакСпособаОплаты));
ЗаписьXML.ЗаписатьАтрибут("Identifiers", XMLСтрока(СведенияОБезналичнойОплате.Идентификаторы));
ЗаписьXML.ЗаписатьАтрибут("AdditionalInformation", XMLСтрока(СведенияОБезналичнойОплате.Дополнительныеедения));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ИначеЕсли ПараметрыФискализации.РевизияИнтерфейса > 2001 Тогда // Версия стандарта 2.2 и выше
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("PaymentType" , XMLСтрока(ТипРасчета));
ЗаписьXML.ЗаписатьАтрибут("TaxVariant" , XMLСтрока(СистемаНалогообложения));
ЗаписьXML.ЗаписатьАтрибут("CashierName" , XMLСтрока(ОбщиеПараметры.Кассир));
ЗаписьXML.ЗаписатьАтрибут("CashierVATIN", ?(ОбщиеПараметры.Свойство("КассирИНН"), XMLСтрока(ОбщиеПараметры.КассирИНН), ""));
Если Не ПустаяСтрока(ОбщиеПараметры.ОтправительEmail) И Электронно Тогда // Отправитель Email указывается только для Электронно.
ЗаписьXML.ЗаписатьАтрибут("SenderEmail", XMLСтрока(ОбщиеПараметры.ОтправительEmail));
КонецЕсли;
// Email отправляет средствами 1C
Если ОбщиеПараметры.Свойство("Отправляет1СEmail") И НЕ ОбщиеПараметры.Отправляет1СEmail Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomerEmail", XMLСтрока(?(ОбщиеПараметры.Свойство("ПокупательEmail"), ОбщиеПараметры.ПокупательEmail, "")));
КонецЕсли;
// SMS отправляет средствами 1C
Если ОбщиеПараметры.Свойство("Отправляет1СSMS") И НЕ ОбщиеПараметры.Отправляет1СSMS Тогда
ПокупательНомер = ?(ОбщиеПараметры.Свойство("ПокупательНомер"), ОбщиеПараметры.ПокупательНомер, "");
Если Не ПустаяСтрока(ПокупательНомер) И Лев(ПокупательНомер, 1) <> "+" Тогда
ПокупательНомер = "+" + ПокупательНомер;
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("CustomerPhone", XMLСтрока(ПокупательНомер));
КонецЕсли;
Если ОбщиеПараметры.Свойство("ПризнакАгента") И НЕ ПустаяСтрока(ОбщиеПараметры.ПризнакАгента) Тогда // Атрибут с ФФД 1.05
ПризнакАгента = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодПризнакаАгента(ОбщиеПараметры.ПризнакАгента);
ЗаписьXML.ЗаписатьАтрибут("AgentSign", XMLСтрока(ПризнакАгента));
КонецЕсли;
Если ОбщиеПараметры.Свойство("АдресРасчетов") И НЕ ПустаяСтрока(ОбщиеПараметры.АдресРасчетов) Тогда
ЗаписьXML.ЗаписатьАтрибут("AddressSettle", XMLСтрока(ОбщиеПараметры.АдресРасчетов));
КонецЕсли;
Если ОбщиеПараметры.Свойство("МестоРасчетов") И НЕ ПустаяСтрока(ОбщиеПараметры.МестоРасчетов) Тогда
ЗаписьXML.ЗаписатьАтрибут("PlaceSettle", XMLСтрока(ОбщиеПараметры.МестоРасчетов));
КонецЕсли;
Получатель = ОбщиеПараметры.Получатель;
Если ПустаяСтрока(Получатель) Тогда
Получатель = ОбщиеПараметры.СведенияОПокупателе.Покупатель;
КонецЕсли;
ПолучательИНН = ОбщиеПараметры.ПолучательИНН;
Если ПустаяСтрока(ПолучательИНН) Тогда
ПолучательИНН = ОбщиеПараметры.СведенияОПокупателе.ПокупательИНН;
КонецЕсли;
Если Не ПустаяСтрока(Получатель) Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomerInfo", XMLСтрока(Получатель));
КонецЕсли;
Если Не ПустаяСтрока(ПолучательИНН) Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomerINN", XMLСтрока(ПолучательИНН));
КонецЕсли;
Если ОбщиеПараметры.Свойство("ДополнительныйРеквизит") И НЕ ПустаяСтрока(ОбщиеПараметры.ДополнительныйРеквизит) Тогда
ЗаписьXML.ЗаписатьАтрибут("AdditionalAttribute", XMLСтрока(ОбщиеПараметры.ДополнительныйРеквизит));
КонецЕсли;
Если ОбщиеПараметры.Свойство("ДополнительныйРеквизитПользователя") Тогда
ЗаписатьДополнительныйРеквизитПользователя(ЗаписьXML, ОбщиеПараметры.ДополнительныйРеквизитПользователя);
КонецЕсли;
ЗаписатьДанныеАгента(ЗаписьXML, ОбщиеПараметры.ДанныеАгента);
ЗаписатьДанныеПоставщика(ЗаписьXML, ОбщиеПараметры.ДанныеПоставщика);
ЗаписьXML.ЗаписатьКонецЭлемента();
// Табличная часть
Если ОбщиеПараметры.ПозицииЧека <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
Для ИндексМассива = 0 По ОбщиеПараметры.ПозицииЧека.Количество() - 1 Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива]; //см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойСтрокиЧека
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
Если ТекущаяПозиция.ЦенаСоСкидками = 0 И ТекущаяПозиция.Сумма > 0 И ТекущаяПозиция.Количество > 0 Тогда
ЦенаСоСкидками = Окр(ТекущаяПозиция.Сумма / ТекущаяПозиция.Количество, 2);
Иначе
ЦенаСоСкидками = ТекущаяПозиция.ЦенаСоСкидками;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name" , XMLСтрока(ТекущаяПозиция.Наименование));
ЗаписьXML.ЗаписатьАтрибут("Quantity" , XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", XMLСтрока(ЦенаСоСкидками));
ЗаписьXML.ЗаписатьАтрибут("SumWithDiscount" , XMLСтрока(ТекущаяПозиция.Сумма));
ЗаписьXML.ЗаписатьАтрибут("DiscountSum" , XMLСтрока(ТекущаяПозиция.СуммаСкидок));
ЗаписьXML.ЗаписатьАтрибут("Department" , XMLСтрока(ТекущаяПозиция.НомерСекции));
ЗначениеСтавкаНДС = ПредставлениеСтавкиНДС(ТекущаяПозиция.СтавкаНДС, ПараметрыФискализации.РевизияИнтерфейса);
ЗаписьXML.ЗаписатьАтрибут("Tax", XMLСтрока(ЗначениеСтавкаНДС));
Если ТекущаяПозиция.Свойство("СуммаНДС") И НЕ ПустаяСтрока(ТекущаяПозиция.СуммаНДС) Тогда
ЗаписьXML.ЗаписатьАтрибут("TaxSum", XMLСтрока(ТекущаяПозиция.СуммаНДС));
КонецЕсли;
Если ТекущаяПозиция.Свойство("ПризнакСпособаРасчета") И НЕ ПустаяСтрока(ТекущаяПозиция.ПризнакСпособаРасчета) Тогда
ПризнакСпособаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодПризнакаСпособаРасчета(ТекущаяПозиция.ПризнакСпособаРасчета);
ЗаписьXML.ЗаписатьАтрибут("SignMethodCalculation", XMLСтрока(ПризнакСпособаРасчета));
КонецЕсли;
Если ТекущаяПозиция.Свойство("ПризнакПредметаРасчета") И НЕ ПустаяСтрока(ТекущаяПозиция.ПризнакПредметаРасчета) Тогда
ПризнакПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодПризнакаПредметаРасчета(ТекущаяПозиция.ПризнакПредметаРасчета);
Если ПризнакПредметаРасчета <> Неопределено Тогда
ЗаписьXML.ЗаписатьАтрибут("SignCalculationObject", XMLСтрока(ПризнакПредметаРасчета));
КонецЕсли;
КонецЕсли;
Если ТекущаяПозиция.Свойство("ПризнакАгентаПоПредметуРасчета") И НЕ ПустаяСтрока(ТекущаяПозиция.ПризнакАгентаПоПредметуРасчета) Тогда
ПризнакАгентаПоПредметуРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодПризнакаАгента(ТекущаяПозиция.ПризнакАгентаПоПредметуРасчета);
ЗаписьXML.ЗаписатьАтрибут("SignSubjectCalculationAgent", XMLСтрока(ПризнакАгентаПоПредметуРасчета));
КонецЕсли;
Если ТекущаяПозиция.Свойство("ЕдиницаИзмерения") И ТекущаяПозиция.ЕдиницаИзмерения <> Неопределено Тогда
ЗаписьXML.ЗаписатьАтрибут("MeasurementUnit", XMLСтрока(Лев(ТекущаяПозиция.ЕдиницаИзмерения, 16)));
КонецЕсли;
Если ТекущаяПозиция.Свойство("КодСтраныПроисхожденияТовара") И НЕ ПустаяСтрока(ТекущаяПозиция.КодСтраныПроисхожденияТовара) Тогда
ЗаписьXML.ЗаписатьАтрибут("CountryOfOrigin", XMLСтрока(ТекущаяПозиция.КодСтраныПроисхожденияТовара));
КонецЕсли;
Если ТекущаяПозиция.Свойство("НомерТаможеннойДекларации") И НЕ ПустаяСтрока(ТекущаяПозиция.НомерТаможеннойДекларации) Тогда
ЗаписьXML.ЗаписатьАтрибут("CustomsDeclaration", XMLСтрока(ТекущаяПозиция.НомерТаможеннойДекларации));
КонецЕсли;
Если ТекущаяПозиция.Свойство("СуммаАкциза") И ТекущаяПозиция.СуммаАкциза <> Неопределено Тогда
ЗаписьXML.ЗаписатьАтрибут("ExciseAmount", XMLСтрока(XMLСтрока(ТекущаяПозиция.СуммаАкциза)));
КонецЕсли;
Если ТекущаяПозиция.Свойство("ДополнительныйРеквизит") И НЕ ПустаяСтрока(ТекущаяПозиция.ДополнительныйРеквизит) Тогда
ЗаписьXML.ЗаписатьАтрибут("AdditionalAttribute", XMLСтрока(XMLСтрока(ТекущаяПозиция.ДополнительныйРеквизит)));
КонецЕсли;
ЗаписатьДанныеАгента(ЗаписьXML, ТекущаяПозиция.ДанныеАгента);
ЗаписатьДанныеПоставщика(ЗаписьXML, ТекущаяПозиция.ДанныеПоставщика);
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
МодульМенеджерОборудованияМаркировка.ЗаписатьДанныеКодаТоварнойНоменклатуры(ЗаписьXML, ТекущаяПозиция, ПараметрыФискализации);
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
ИначеЕсли ТекущаяПозиция.Свойство("ТекстоваяСтрока") Тогда
Если ТекущаяПозиция.Свойство("ПереносСтроки") И ТекущаяПозиция.ПереносСтроки Тогда
ТекстовыеСтроки = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПостроитьПолеПереносом(ТекущаяПозиция.Текст, ПараметрыФискализации.ШиринаСтроки);
Иначе
ТекстовыеСтроки = ТекущаяПозиция.Текст;
КонецЕсли;
Выравнивание = ?(ТекущаяПозиция.Свойство("Выравнивание"), ТекущаяПозиция.Выравнивание, "Лево");
Для НомерСтроки = 1 По СтрЧислоСтрок(ТекстовыеСтроки) Цикл
ВыделеннаяСтрока = СтрПолучитьСтроку(ТекстовыеСтроки, НомерСтроки);
ВыделеннаяСтрока = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыровнятьПоле(ВыделеннаяСтрока, ПараметрыФискализации.ШиринаСтроки, Выравнивание);
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ВыделеннаяСтрока));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ИначеЕсли ТекущаяПозиция.Свойство("ШтрихКод") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
ЗаписьXML.ЗаписатьАтрибут("BarcodeType", XMLСтрока(ТекущаяПозиция.ТипШтрихкода));
ЗаписьXML.ЗаписатьАтрибут("Barcode", XMLСтрока(ТекущаяПозиция.ШтрихКод));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
// Таблица оплат
Если ТаблицаОплат <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Payments");
ЗаписьXML.ЗаписатьАтрибут("Cash" , XMLСтрока(СуммаНаличные));
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаЭлектронно));
ЗаписьXML.ЗаписатьАтрибут("Credit" , XMLСтрока(СуммаПостоплата));
ЗаписьXML.ЗаписатьАтрибут("AdvancePayment" , XMLСтрока(СуммаПредоплата));
ЗаписьXML.ЗаписатьАтрибут("CashProvision" , XMLСтрока(СуммаПредоставление));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
ДанныеЧекаXML = ЗаписьXML.Закрыть();
Если ВключатьПерсональныеДанные Тогда
ПараметрыФискализации.ДанныеЧекаXMLПерсональныеДанные = ДанныеЧекаXML;
Иначе
ПараметрыФискализации.ДанныеЧекаXML = ДанныеЧекаXML;
ПараметрыФискализации.ТипРасчета = ОбщиеПараметры.ТипРасчета;
ПараметрыФискализации.СуммаЧека = СуммаЧека;
ПараметрыФискализации.ОплатаНаличные = ?(СуммаНаличные + ОплатаНеНаличными > СуммаЧека, СуммаЧека - ОплатаНеНаличными, СуммаНаличные);
ПараметрыФискализации.ОплатаЭлектронно = СуммаЭлектронно;
ПараметрыФискализации.ОплатаПостоплата = СуммаПостоплата;
ПараметрыФискализации.ОплатаПредоплата = СуммаПредоплата;
ПараметрыФискализации.ОплатаВстречноеПредоставление = СуммаПредоставление;
КонецЕсли;
// -- Локализация
КонецПроцедуры
// Получить XMLПакет для операции.
//
// Параметры:
// ОбщиеПараметры - Структура, Булево - Общие параметры
// РевизияИнтерфейса - Число - Ревизия интерфейса
//
// Возвращаемое значение:
// Строка - Получить XMLПакет для операции
Функция ПолучитьXMLПакетДляОперации(ОбщиеПараметры, РевизияИнтерфейса = 0) Экспорт
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("InputParameters");
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьXML.ЗаписатьАтрибут("CashierName", ?(ОбщиеПараметры.Свойство("Кассир"), XMLСтрока(ОбщиеПараметры.Кассир), НСтр("ru='Администратор'")));
ЗаписьXML.ЗаписатьАтрибут("CashierINN" , ?(ОбщиеПараметры.Свойство("КассирИНН"), XMLСтрока(ОбщиеПараметры.КассирИНН), ""));
Если ОбщиеПараметры.Свойство("АдресРасчетов") И НЕ ПустаяСтрока(ОбщиеПараметры.АдресРасчетов) Тогда
ЗаписьXML.ЗаписатьАтрибут("SaleAddress", XMLСтрока(ОбщиеПараметры.АдресРасчетов));
КонецЕсли;
Если ОбщиеПараметры.Свойство("МестоРасчетов") И НЕ ПустаяСтрока(ОбщиеПараметры.МестоРасчетов) Тогда
ЗаписьXML.ЗаписатьАтрибут("SaleLocation", XMLСтрока(ОбщиеПараметры.МестоРасчетов));
КонецЕсли;
Если РевизияИнтерфейса >= 4000 Тогда // Версия стандарта 4.0 (ОФД 1.2)
Если ОбщиеПараметры.Свойство("Печать") И НЕ ПустаяСтрока(ОбщиеПараметры.Печать) Тогда
ЗаписьXML.ЗаписатьАтрибут("PrintRequired", XMLСтрока(ОбщиеПараметры.Печать));
КонецЕсли;
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьАтрибут("CashierName" , ?(ОбщиеПараметры.Свойство("Кассир"), XMLСтрока(ОбщиеПараметры.Кассир), НСтр("ru='Администратор'")));
ЗаписьXML.ЗаписатьАтрибут("CashierVATIN", ?(ОбщиеПараметры.Свойство("КассирИНН"), XMLСтрока(ОбщиеПараметры.КассирИНН), ""));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции
// Получить XMLПакет для текста.
//
// Параметры:
// СтрокаТекста - Строка, Структура - Строка текста
// РевизияИнтерфейса - Число - Ревизия интерфейса
//
// Возвращаемое значение:
// Массив из ЗаписьXML - Получить XMLПакет для текста.
Функция ПолучитьXMLПакетДляТекста(СтрокаТекста, РевизияИнтерфейса = 0) Экспорт
Результат = Новый Массив();
// Пакетная печать чека. Подготовка пакета.
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Document");
Если НЕ ПустаяСтрока(СтрокаТекста) Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
Для НомерСтроки = 1 По СтрЧислоСтрок(СтрокаТекста) Цикл
ВыделеннаяСтрока = СтрПолучитьСтроку(СтрокаТекста, НомерСтроки);
Если ((Найти(ВыделеннаяСтрока, "[отрезка]") > 0)
Или (Найти(ВыделеннаяСтрока, "[cut]") > 0))
И НомерСтроки < СтрЧислоСтрок(СтрокаТекста) Тогда
// Завершаем запись текущего пакета.
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
Текст = ЗаписьXML.Закрыть();
Результат.Добавить(Текст);
// Новый пакет.
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Document");
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
ИначеЕсли (Найти(ВыделеннаяСтрока, "|ШтрихКод|") > 0) Тогда
ВыделеннаяСтрока = Сред(ВыделеннаяСтрока, СтрДлина("|ШтрихКод|") + 1);
ВремТипШтрихкода = Сред(ВыделеннаяСтрока, 1, Найти(ВыделеннаяСтрока, "|") - 1);
ВремШтрихКод = СокрЛП(Сред(ВыделеннаяСтрока, Найти(ВыделеннаяСтрока, "|") + 1));
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьXML.ЗаписатьАтрибут("Type", XMLСтрока(ВремТипШтрихкода));
// Значение штрихкода. Штрихкод кодируется текстом в кодировке Base64.
Если РевизияИнтерфейса >= 3003 Тогда
ШтрихКодBase64 = МенеджерОборудованияКлиентСервер.ШтрихкодВBase64(ВремШтрихКод);
ЗаписьXML.ЗаписатьАтрибут("ValueBase64", XMLСтрока(ШтрихКодBase64));
Иначе
ЗаписьXML.ЗаписатьАтрибут("Value", XMLСтрока(ВремШтрихКод));
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьАтрибут("BarcodeType", XMLСтрока(ВремТипШтрихкода));
ЗаписьXML.ЗаписатьАтрибут("Barcode", XMLСтрока(ВремШтрихКод));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ВыделеннаяСтрока));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Текст = ЗаписьXML.Закрыть();
Результат.Добавить(Текст);
Возврат Результат;
КонецФункции
// Получить параметры состояния из XML пакета.
//
// Параметры:
// Данные - Произвольный.
// НомерСмены - Неопределено - Номер смены
//
// Возвращаемое значение:
// Структура - Получить параметры состояния из XMLПакета:
// * ДатаСменыККТ - Число -
// * НомерСменыККТ - Число -
// * НомерЧекаККТ - Число -
// * НомерЧекаЗаСмену - Число -
// * СтатусСмены - Неопределено -
// * СчетчикиОперацийПриход - Структура -:
// ** КоличествоЧеков - Число.
// ** СуммаЧеков - Число.
// ** КоличествоЧековКоррекции - Число.
// ** СуммаЧековКоррекции - Число.
// * СчетчикиОперацийВозвратПрихода - Структура -:
// ** КоличествоЧеков - Число.
// ** СуммаЧеков - Число.
// ** КоличествоЧековКоррекции - Число.
// ** СуммаЧековКоррекции - Число.
// * СчетчикиОперацийРасход - Структура -:
// ** КоличествоЧеков - Число.
// ** СуммаЧеков - Число.
// ** КоличествоЧековКоррекции - Число.
// ** СуммаЧековКоррекции - Число.
// * СчетчикиОперацийВозвратРасхода - Структура -:
// ** КоличествоЧеков - Число.
// ** СуммаЧеков - Число.
// ** КоличествоЧековКоррекции - Число.
// ** СуммаЧековКоррекции - Число.
// * КоличествоЧеков - Число.
// * ОстатокНаличных - Число.
// * ПревышеноВремяОжиданияОтветаОФД - Булево -
// * КоличествоНепереданныхФД - Неопределено -
// * НомерПервогоНепереданногоФД - Неопределено -
// * ДатаПервогоНепереданногоФД - Неопределено -
// * НеобходимаСрочнаяЗаменаФН - Булево -
// * ПамятьФНПереполнена - Булево -
// * РесурсФНИсчерпан - Булево -
Функция ПолучитьПараметрыСостоянияИзXMLПакета(Данные, НомерСмены = Неопределено) Экспорт
Параметры = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыНормализуемыхФискальныхДанных();
Параметры.НомерСменыККТ = НомерСмены;
Если Не ПустаяСтрока(Данные) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Данные);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "StatusParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
КоличествоНепереданныхФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter");
Параметры.КоличествоНепереданныхФД = ?(ПустаяСтрока(КоличествоНепереданныхФД), 0, Число(КоличествоНепереданныхФД));
Параметры.НомерПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
ДатаПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime");
Если НЕ ПустаяСтрока(ДатаПервогоНепереданногоФД) Тогда
Параметры.ДатаПервогоНепереданногоФД = XMLЗначение(Тип("Дата"), ДатаПервогоНепереданногоФД);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
// Получить таблицу параметров смены из ККТ.
//
// Параметры:
// ДанныеXML - Строка - строка XML
// РевизияИнтерфейса - Число - ревизия интерфейса
// НомерСменыККТ - Число - номер смены
// НомерЧекаККТ - Число - номер чека
//
// Возвращаемое значение:
// Структура.
//
Функция ПолучитьПараметрыСменыИзXMLПакетаанныеXML, РевизияИнтерфейса = 0, НомерСменыККТ = 0, НомерЧекаККТ = 0) Экспорт
Параметры = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыНормализуемыхФискальныхДанных();
Параметры.НомерСменыККТ = НомерСменыККТ;
Параметры.НомерЧекаККТ = НомерЧекаККТ;
Если Не ПустаяСтрока(ДанныеXML) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);
ЧтениеXML.ПерейтиКСодержимому();
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
Если ЧтениеXML.Имя = "OutputParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.НомерСменыККТ = ЧтениеXML.ЗначениеАтрибута("ShiftNumber");
Параметры.НомерЧекаККТ = ЧтениеXML.ЗначениеАтрибута("CheckNumber");
ДатаСменыККТ = ЧтениеXML.ЗначениеАтрибута("DateTime");
Если НЕ ПустаяСтрока(ДатаСменыККТ) Тогда
Параметры.ДатаСменыККТ = XMLЗначение(Тип("Дата"), ДатаСменыККТ);
КонецЕсли;
Параметры.НомерЧекаЗаСмену = ЧтениеXML.ЗначениеАтрибута("ShiftClosingCheckNumber");
Параметры.СтатусСмены = Число(ЧтениеXML.ЗначениеАтрибута("ShiftState"));
Параметры.ОстатокНаличных = ЧтениеXML.ЗначениеАтрибута("CashBalance");
КоличествоНепереданныхФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter");
Параметры.КоличествоНепереданныхФД = ?(ПустаяСтрока(КоличествоНепереданныхФД), 0, Число(КоличествоНепереданныхФД));
Параметры.НомерПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
КоличествоЧеков = ЧтениеXML.ЗначениеАтрибута("DocumentsCounter");
Параметры.КоличествоЧеков = ?(ПустаяСтрока(КоличествоЧеков), 0, Число(КоличествоЧеков));
ДатаПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime");
Если НЕ ПустаяСтрока(ДатаПервогоНепереданногоФД) Тогда
Параметры.ДатаПервогоНепереданногоФД = XMLЗначение(Тип("Дата"), ДатаПервогоНепереданногоФД);
КонецЕсли;
Параметры.НеобходимаСрочнаяЗаменаФН = ВРег(ЧтениеXML.ЗначениеАтрибута("FNError")) = "TRUE";
Параметры.ПамятьФНПереполнена = ВРег(ЧтениеXML.ЗначениеАтрибута("FNOverflow")) = "TRUE";
Параметры.РесурсФНИсчерпан = ВРег(ЧтениеXML.ЗначениеАтрибута("FNFail")) = "TRUE";
СрокДействияФН = ЧтениеXML.ЗначениеАтрибута("FNValidityDate");
Если НЕ ПустаяСтрока(СрокДействияФН) Тогда
Параметры.СрокДействияФН = XMLЗначение(Тип("Дата"), СрокДействияФН);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Если ЧтениеXML.Имя = "OutputParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.ПревышеноВремяОжиданияОтветаОФД = ВРег(ЧтениеXML.ЗначениеАтрибута("OFDtimeout")) = "TRUE";
Параметры.НеобходимаСрочнаяЗаменаФН = ВРег(ЧтениеXML.ЗначениеАтрибута("UrgentReplacementFN")) = "TRUE";
Параметры.ПамятьФНПереполнена = ВРег(ЧтениеXML.ЗначениеАтрибута("MemoryOverflowFN")) = "TRUE";
Параметры.РесурсФНИсчерпан = ВРег(ЧтениеXML.ЗначениеАтрибута("ResourcesExhaustionFN")) = "TRUE";
КоличествоНепереданныхФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter");
Параметры.КоличествоНепереданныхФД = ?(ПустаяСтрока(КоличествоНепереданныхФД), 0, Число(КоличествоНепереданныхФД));
Параметры.НомерПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
ДатаПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime");
Если НЕ ПустаяСтрока(ДатаПервогоНепереданногоФД) Тогда
Параметры.ДатаПервогоНепереданногоФД = XMLЗначение(Тип("Дата"), ДатаПервогоНепереданногоФД);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
// Заполнить результаты фискализация чека из XML пакета.
//
// Параметры:
// ПараметрыФискализации - Структура
Процедура ЗаполнитьРезультатыФискализацияЧекаИзXMLПакета(ПараметрыФискализации) Экспорт
Если Не ПустаяСтрока(ПараметрыФискализации.РезультатОперацииXML) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ПараметрыФискализации.РезультатОперацииXML);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "DocumentOutputParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ПараметрыФискализации.НомерСменыККТ = ЧтениеXML.ЗначениеАтрибута("ShiftNumber");
ПараметрыФискализации.НомерЧекаККТ = ЧтениеXML.ЗначениеАтрибута("CheckNumber");
ПараметрыФискализации.НомерЧекаЗаСмену = ЧтениеXML.ЗначениеАтрибута("ShiftClosingCheckNumber");
ПараметрыФискализации.ФискальныйПризнак = ЧтениеXML.ЗначениеАтрибута("FiscalSign");
ПараметрыФискализации.АдресСайтаПроверки = ЧтениеXML.ЗначениеАтрибута("AddressSiteInspections");
ПараметрыФискализации.ОшибкаПечати = ВРег(ЧтениеXML.ЗначениеАтрибута("PrintError")) = "TRUE" ;
ДатаВремяЧека = ЧтениеXML.ЗначениеАтрибута("DateTime");
Если НЕ ПустаяСтрока(ДатаВремяЧека) Тогда
ПараметрыФискализации.ДатаВремяЧека = XMLЗначение(Тип("Дата"), ДатаВремяЧека);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Процедура заполняет XML пакет для печати текстового документа
//
// Параметры:
// ТестовыеЧеки - Массив из Строка -
// НефискальныеДокументы - Массив из см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// ПараметрыПодключения - См. МенеджерОборудованияКлиентСервер.ПараметрыПодключения
// ШиринаСтроки - Число - ширина строки печатающего устройства
//
Процедура ЗаполнитьXMLПакетыДляТекстовогоДокумента(ТестовыеЧеки, НефискальныеДокументы, ПараметрыПодключения, ШиринаСтроки = 32) Экспорт
РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
ТипыОборудования = ПараметрыПодключения.ТипыОборудования;
Для Каждого ПозицииЧека Из НефискальныеДокументы Цикл
// Пакетная печать чека. Подготовка пакета.
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Document");
// Табличная часть
Если ПозицииЧека <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
Для ИндексМассива = 0 По ПозицииЧека.Количество() - 1 Цикл
ТекущаяПозиция = ПозицииЧека[ИндексМассива]; // см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойСтрокиЧека
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name" , XMLСтрока(ТекущаяПозиция.Наименование));
ЗаписьXML.ЗаписатьАтрибут("Quantity" , XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("Price" , XMLСтрока(ТекущаяПозиция.Цена));
ЗаписьXML.ЗаписатьАтрибут("Amount" , XMLСтрока(ТекущаяПозиция.Сумма));
ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
ЗаписьXML.ЗаписатьАтрибут("Tax" , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
Иначе
ЗаписьXML.ЗаписатьАтрибут("Tax" , "none");
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли ТекущаяПозиция.Свойство("ТекстоваяСтрока") Тогда
Если ТекущаяПозиция.Свойство("ПереносСтроки") И ТекущаяПозиция.ПереносСтроки Тогда
ТекстовыеСтроки = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПостроитьПолеПереносом(ТекущаяПозиция.Текст, ШиринаСтроки);
Иначе
ТекстовыеСтроки = ТекущаяПозиция.Текст;
КонецЕсли;
Выравнивание = ?(ТекущаяПозиция.Свойство("Выравнивание"), ТекущаяПозиция.Выравнивание, "Лево");
Для НомерСтроки = 1 По СтрЧислоСтрок(ТекстовыеСтроки) Цикл
ВыделеннаяСтрока = СтрПолучитьСтроку(ТекстовыеСтроки, НомерСтроки);
ВыделеннаяСтрока = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыровнятьПоле(ВыделеннаяСтрока, ШиринаСтроки, Выравнивание);
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ВыделеннаяСтрока));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ИначеЕсли ТекущаяПозиция.Свойство("ШтрихКод") Тогда // Штрихкод
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
Если РевизияИнтерфейса >= 3003 Тогда
ЗаписьXML.ЗаписатьАтрибут("Type" , XMLСтрока(ТекущаяПозиция.ТипШтрихкода));
// Значение штрихкода. Штрихкод кодируется текстом в кодировке Base64.
ШтрихКодBase64 = МенеджерОборудованияКлиентСервер.ШтрихкодВBase64(ТекущаяПозиция.ШтрихКод);
Если ТекущаяПозиция.Свойство("ШтрихКодBase64")
И НЕ ПустаяСтрока(ТекущаяПозиция.ШтрихКодBase64) Тогда
ШтрихКодBase64 = ТекущаяПозиция.ШтрихКодBase64;
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("ValueBase64", XMLСтрока(ШтрихКодBase64));
ИначеЕсли РевизияИнтерфейса >= 3000 И ТипыОборудования.ККТ Тогда
ЗаписьXML.ЗаписатьАтрибут("Type" , XMLСтрока(ТекущаяПозиция.ТипШтрихкода));
ЗаписьXML.ЗаписатьАтрибут("Value", XMLСтрока(ТекущаяПозиция.ШтрихКод));
Иначе
ЗаписьXML.ЗаписатьАтрибут("BarcodeType" , XMLСтрока(ТекущаяПозиция.ТипШтрихкода));
ЗаписьXML.ЗаписатьАтрибут("Barcode", XMLСтрока(ТекущаяПозиция.ШтрихКод));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Текст = ЗаписьXML.Закрыть();
ТестовыеЧеки.Добавить(Текст);
КонецЦикла;
КонецПроцедуры
// Получить структуру чека из XML.
//
// Параметры:
// ДанныеXML - Строка - Данные XML
// ДанныхМаркировки - Булево - Будут загружаться данные о маркировке
//
// Возвращаемое значение:
// Структура - Загрузить данные фискализации из XML:
// * ДанныеКоррекции - Структура -:
// ** НомерПредписания - Число -
// ** ДатаКоррекции - Дата -
// ** ОписаниеКоррекции - Строка -
// ** ТипКоррекции - Число -
// * НеприменениеККТ - Булево -
// * КорректируемыйДокумент - Произвольный -
// * ЕстьПерсональныеДанные - Булево -
// * ИндивидуальныйРежимПодготовкиДанныхКПередачеВОФД - Булево -
// * ДопустимоеРасхождениеФорматноЛогическогоКонтроля - Число -
// * СпособФорматноЛогическогоКонтроля - Неопределено -
// * СформироватьЧекКоррекции - Булево -
// * ДополнительныйРеквизитПользователя - Структура -:
// ** Значение - Произвольный -
// ** Наименование - Строка -
// * ДополнительныйРеквизит - Неопределено -
// * НефискальныеДокументы - Массив из ОпределяемыйТип.ОснованиеФискальнойОперацииБПО -
// * КассаККМ - Произвольный -
// * ШаблонЧека - Произвольный -
// * ТаблицаОплат - Массив из Структура-
// * ПозицииЧека - Массив из Структура -
// * КопийЧека - Число -
// * ТекстПодвала - Строка -
// * ТекстШапки - Строка -
// * ДатаВремя - Дата -
// * НомерСмены - Число -
// * НомерЧека - Строка -
// * НомерКассы - Строка -
// * НаименованиеМагазина - Строка -
// * АдресМагазина - Строка -
// * ОрганизацияКПП - Строка -
// * ОрганизацияИНН - Строка -
// * ОрганизацияНазвание - Строка -
// * СерийныйНомер - Строка -
// * ПолучательИНН - Строка -
// * Получатель - Строка -
// * ДанныеПоставщика - Структура -:
// ** ИНН - Строка -
// ** Наименование - Строка -
// ** Телефон - Строка -
// * ДанныеАгента - Структура -:
// ** ОператорПоПриемуПлатежей - Структура -:
// *** Телефон - Неопределено -
// ** ОператорПеревода - Структура -:
// *** Телефон - Строка -
// *** Наименование - Строка -
// *** Адрес - Строка -
// *** ИНН - Строка -
// ** ПлатежныйАгент - Структура -:
// *** Операция - Строка -
// *** Телефон - Строка -
// * ПризнакАгента - Неопределено -
// * ПокупательНомер - Строка -
// * ПокупательEmail - Строка -
// * ОтправительEmail - Строка -
// * МестоРасчетов - Строка -
// * АдресРасчетов - Строка -
// * СистемаНалогообложения - ПеречислениеСсылка.ТипыСистемНалогообложенияККТ -
// * Отправляет1СEmail - Булево -
// * Отправляет1СSMS - Булево -
// * ТипРасчета - ПеречислениеСсылка.ТипыРасчетаДенежнымиСредствами -
// * Электронно - Булево -
// * ТорговыйОбъект - Неопределено -
// * Организация - Неопределено -
// * ИдентификаторФискальнойЗаписи - Неопределено -
// * ДокументОснование - Неопределено -
// * КассирИНН - Неопределено -
// * Кассир - Строка -
//
Функция ЗагрузитьДанныеФискализацииИзXML(ДанныеXML, ДанныхМаркировки = Истина) Экспорт
ОбщиеПараметры = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииЧекаКоррекции();
ФискальнаяСтрока = Неопределено;
СуммаЧека = 0;
Если Не ПустаяСтрока(ДанныеXML) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "CheckPackage" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ТипРасчета = ?(ЧтениеXML.ЗначениеАтрибута("PaymentType") <> Неопределено, ЧтениеXML.ЗначениеАтрибута("PaymentType"), ЧтениеXML.ЗначениеАтрибута("OperationType"));
ОбщиеПараметры.ТипРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.РасчетДенежнымиСредствамиПоКоду(Число(ТипРасчета));
СистемаНалогообложения = ?(ЧтениеXML.ЗначениеАтрибута("TaxVariant") <> Неопределено, ЧтениеXML.ЗначениеАтрибута("TaxVariant"), ЧтениеXML.ЗначениеАтрибута("TaxationSystem"));
ОбщиеПараметры.СистемаНалогообложения = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.СистемаНалогообложенияККТПоКоду(Число(СистемаНалогообложения));
ОбщиеПараметры.Кассир = ЧтениеXML.ЗначениеАтрибута("CashierName");
ОбщиеПараметры.КассирИНН = ЗначениеXMLАтрибута(ЧтениеXML, "CashierVATIN", "CashierINN", Неопределено);
ОбщиеПараметры.ОтправительEmail = ЧтениеXML.ЗначениеАтрибута("SenderEmail");
ОбщиеПараметры.ПокупательEmail = ЧтениеXML.ЗначениеАтрибута("CustomerEmail");
ОбщиеПараметры.ПокупательНомер = ЧтениеXML.ЗначениеАтрибута("CustomerPhone");
ОбщиеПараметры.ПризнакАгента = ЧтениеXML.ЗначениеАтрибута("AgentSign");
ОбщиеПараметры.АдресРасчетов = ЗначениеXMLАтрибута(ЧтениеXML, "SaleAddress", "AddressSettle");
ОбщиеПараметры.МестоРасчетов = ЗначениеXMLАтрибута(ЧтениеXML, "SaleLocation", "PlaceSettle");
ОбщиеПараметры.ДополнительныйРеквизит = ЧтениеXML.ЗначениеАтрибута("AdditionalAttribute");
// ++ Локализация
Если ЧтениеXML.ЗначениеАтрибута("AgentSign") <> Неопределено Тогда
ПризнакАгента = Число(ЧтениеXML.ЗначениеАтрибута("AgentSign"));
ОбщиеПараметры.ПризнакАгента = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.ПризнакАгентаПоКоду(ПризнакАгента);
КонецЕсли;
// -- Локализация
ОбщиеПараметры.Получатель = ЧтениеXML.ЗначениеАтрибута("CustomerInfo");
ОбщиеПараметры.ПолучательИНН = ЧтениеXML.ЗначениеАтрибута("CustomerINN");
КонецЕсли;
Если ЧтениеXML.Имя = "PurveyorData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбщиеПараметры.ДанныеПоставщика.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "PurveyorName");
ОбщиеПараметры.ДанныеПоставщика.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "PurveyorPhone");
ОбщиеПараметры.ДанныеПоставщика.ИНН = ЗначениеXMLАтрибута(ЧтениеXML, "PurveyorVATIN");
КонецЕсли;
Если ЧтениеXML.Имя = "VendorData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбщиеПараметры.ДанныеПоставщика.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "VendorName");
ОбщиеПараметры.ДанныеПоставщика.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "VendorPhone");
ОбщиеПараметры.ДанныеПоставщика.ИНН = ЗначениеXMLАтрибута(ЧтениеXML, "VendorINN");
КонецЕсли;
Если ЧтениеXML.Имя = "CustomerDetail" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбщиеПараметры.СведенияОПокупателе.Покупатель = ЗначениеXMLАтрибута(ЧтениеXML, "Info");
ОбщиеПараметры.СведенияОПокупателе.ПокупательИНН = ЗначениеXMLАтрибута(ЧтениеXML, "INN");
ОбщиеПараметры.СведенияОПокупателе.ПокупательАдрес = ЗначениеXMLАтрибута(ЧтениеXML, "Address");
КонецЕсли;
Если ЧтениеXML.Имя = "AgentData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ДанныеАгента = ОбщиеПараметры.ДанныеАгента;
ДанныеАгента.ПлатежныйАгент.Операция = ЗначениеXMLАтрибута(ЧтениеXML, "AgentOperation", "PayingAgentOperation");
ДанныеАгента.ПлатежныйАгент.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "AgentPhone", "PayingAgentPhone");
ДанныеАгента.ОператорПеревода.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorPhone", "MoneyTransferOperatorPhone");
ДанныеАгента.ОператорПеревода.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorName", "MoneyTransferOperatorName");
ДанныеАгента.ОператорПеревода.Адрес = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorAddress", "MoneyTransferOperatorAddress");
ДанныеАгента.ОператорПеревода.ИНН = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorINN", "MoneyTransferOperatorVATIN");
ДанныеАгента.ОператорПоПриемуПлатежей.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "PaymentProcessorPhone", "ReceivePaymentsOperatorPhone");
КонецЕсли;
Если ЧтениеXML.Имя = "UserAttribute" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбщиеПараметры.ДополнительныйРеквизитПользователя.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "Name");
ОбщиеПараметры.ДополнительныйРеквизитПользователя.Значение = ЗначениеXMLАтрибута(ЧтениеXML, "Value");
КонецЕсли;
Если ЧтениеXML.Имя = "Positions" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.Прочитать() И НЕ (ЧтениеXML.Имя = "Positions" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента) Цикл
Если ЧтениеXML.Имя = "FiscalString" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ФискальнаяСтрока = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойСтрокиЧека();
ФискальнаяСтрока.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "Name");
ФискальнаяСтрока.Количество = Число(ЗначениеXMLАтрибута(ЧтениеXML, "Quantity", , 0));
ФискальнаяСтрока.ЦенаСоСкидками = Число(ЗначениеXMLАтрибута(ЧтениеXML, "PriceWithDiscount", , 0));
ФискальнаяСтрока.Сумма = Число(ЗначениеXMLАтрибута(ЧтениеXML, "AmountWithDiscount", "SumWithDiscount", 0));
СуммаЧека = СуммаЧека + ФискальнаяСтрока.Сумма;
СуммаСкидок = ЗначениеXMLАтрибута(ЧтениеXML, "DiscountAmount", "DiscountSum", 0);
Если Не ПустаяСтрока(СуммаСкидок) Тогда
ФискальнаяСтрока.СуммаСкидок = Число(СуммаСкидок);
КонецЕсли;
ФискальнаяСтрока.НомерСекции = Число(ЗначениеXMLАтрибута(ЧтениеXML, "Department", , 0));
ФискальнаяСтрока.ЕдиницаИзмерения = ЗначениеXMLАтрибута(ЧтениеXML, "MeasurementUnit");
// ++ Локализация
ПредставлениеСтавкаНДС = ЗначениеXMLАтрибута(ЧтениеXML, "VATRate", "Tax");
ФискальнаяСтрока.СтавкаНДС = СтавкаНДСПоПредставлению(ПредставлениеСтавкаНДС);
// -- Локализация
СуммаНДС = ЗначениеXMLАтрибута(ЧтениеXML, "VATAmount", "TaxSum", 0);
Если Не ПустаяСтрока(СуммаНДС) Тогда
ФискальнаяСтрока.СуммаНДС = Число(СуммаНДС);
КонецЕсли;
ПризнакСпособаРасчета = Число(ЗначениеXMLАтрибута(ЧтениеXML, "SignMethodCalculation", "PaymentMethod", 0));
ФискальнаяСтрока.ПризнакСпособаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПризнакСпособаРасчетаПоКоду(ПризнакСпособаРасчета);
ПризнакПредметаРасчета = Число(ЗначениеXMLАтрибута(ЧтениеXML, "SignCalculationObject", "CalculationSubject", 0));
ФискальнаяСтрока.ПризнакПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПризнакПредметаРасчетаПоКоду(ПризнакПредметаРасчета);
// ++ Локализация
Если ЧтениеXML.ЗначениеАтрибута("SignSubjectCalculationAgent") <> Неопределено Или ЧтениеXML.ЗначениеАтрибута("CalculationAgent") <> Неопределено Тогда
ПризнакАгента = Число(ЗначениеXMLАтрибута(ЧтениеXML, "SignSubjectCalculationAgent", "CalculationAgent", 0));
ФискальнаяСтрока.ПризнакАгентаПоПредметуРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.ПризнакАгентаПоКоду(ПризнакАгента);
КонецЕсли;
Если ЧтениеXML.ЗначениеАтрибута("MeasureOfQuantity") <> Неопределено Тогда
МераКоличестваПредметаРасчета = Число(ЗначениеXMLАтрибута(ЧтениеXML, "MeasureOfQuantity", 255));
ФискальнаяСтрока.КодЕдиницыИзмерения = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодЕдиницыИзмеренияПоККТКоду(МераКоличестваПредметаРасчета);
КонецЕсли;
// -- Локализация
ФискальнаяСтрока.КодСтраныПроисхожденияТовара = ЗначениеXMLАтрибута(ЧтениеXML, "CountryOfOrigin");
ФискальнаяСтрока.НомерТаможеннойДекларации = ЗначениеXMLАтрибута(ЧтениеXML, "CustomsDeclaration");
ФискальнаяСтрока.ДополнительныйРеквизит = ЗначениеXMLАтрибута(ЧтениеXML, "AdditionalAttribute");
СуммаАкциза = ЗначениеXMLАтрибута(ЧтениеXML, "ExciseAmount");
Если НЕ ПустаяСтрока(СуммаАкциза) Тогда
Если Число(СуммаАкциза) > 0 Тогда
ФискальнаяСтрока.СуммаАкциза = Число(СуммаАкциза);
КонецЕсли;
КонецЕсли;
Если ДанныхМаркировки И ЧтениеXML.ЗначениеАтрибута("MarkingCode") <> Неопределено Тогда
ФискальнаяСтрока.КонтрольнаяМарка = ЧтениеXML.ЗначениеАтрибута("MarkingCode");
КонецЕсли;
ОбщиеПараметры.ПозицииЧека.Добавить(ФискальнаяСтрока);
КонецЕсли;
Если ЧтениеXML.Имя = "AgentData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ФискальнаяСтрока <> Неопределено Тогда
ДанныеАгента = ФискальнаяСтрока.ДанныеАгента;
ДанныеАгента.ПлатежныйАгент.Операция = ЗначениеXMLАтрибута(ЧтениеXML, "AgentOperation", "PayingAgentOperation");
ДанныеАгента.ПлатежныйАгент.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "AgentPhone", "PayingAgentPhone");
ДанныеАгента.ОператорПеревода.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorPhone", "MoneyTransferOperatorPhone");
ДанныеАгента.ОператорПеревода.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorName", "MoneyTransferOperatorName");
ДанныеАгента.ОператорПеревода.Адрес = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorAddress", "MoneyTransferOperatorAddress");
ДанныеАгента.ОператорПеревода.ИНН = ЗначениеXMLАтрибута(ЧтениеXML, "AcquirerOperatorINN", "MoneyTransferOperatorVATIN");
ДанныеАгента.ОператорПоПриемуПлатежей.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "PaymentProcessorPhone", "ReceivePaymentsOperatorPhone");
КонецЕсли;
КонецЕсли;
Если ЧтениеXML.Имя = "PurveyorData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ФискальнаяСтрока <> Неопределено Тогда
ФискальнаяСтрока.ДанныеПоставщика.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "PurveyorName");
ФискальнаяСтрока.ДанныеПоставщика.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "PurveyorPhone");
ФискальнаяСтрока.ДанныеПоставщика.ИНН = ЗначениеXMLАтрибута(ЧтениеXML, "PurveyorVATIN");
КонецЕсли;
КонецЕсли;
Если ЧтениеXML.Имя = "VendorData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ФискальнаяСтрока <> Неопределено Тогда
ФискальнаяСтрока.ДанныеПоставщика.Наименование = ЗначениеXMLАтрибута(ЧтениеXML, "VendorName");
ФискальнаяСтрока.ДанныеПоставщика.Телефон = ЗначениеXMLАтрибута(ЧтениеXML, "VendorPhone");
ФискальнаяСтрока.ДанныеПоставщика.ИНН = ЗначениеXMLАтрибута(ЧтениеXML, "VendorINN");
КонецЕсли;
КонецЕсли;
Если ЧтениеXML.Имя = "IndustryAttribute" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ФискальнаяСтрока <> Неопределено И ДанныхМаркировки Тогда
ИдентификаторФОИВ = ЗначениеXMLАтрибута(ЧтениеXML, "IdentifierFOIV");
ФискальнаяСтрока.ОтраслевойРеквизит.ИдентификаторФОИВ = ИдентификаторФОИВ;
ДатаДокументаОснования = ЗначениеXMLАтрибута(ЧтениеXML, "DocumentDate");
Если Не ПустаяСтрока(ДатаДокументаОснования) Тогда
ФискальнаяСтрока.ОтраслевойРеквизит.ДатаДокументаОснования = ОбщегоНазначенияБПО.СтрокаВДату(XMLЗначение(Тип("Строка"), ДатаДокументаОснования));
КонецЕсли;
ФискальнаяСтрока.ОтраслевойРеквизит.НомерДокументаОснования = ЗначениеXMLАтрибута(ЧтениеXML, "DocumentNumber");
ФискальнаяСтрока.ОтраслевойРеквизит.ЗначениеРеквизита = ЗначениеXMLАтрибута(ЧтениеXML, "AttributeValue");
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() И ДанныхМаркировки Тогда
Если ЧтениеXML.Имя = "GoodCodeData" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ФискальнаяСтрока <> Неопределено Тогда
ФискальнаяСтрока.ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы = ЗначениеXMLАтрибута(ЧтениеXML, "GTIN");
ФискальнаяСтрока.ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак = ЗначениеXMLАтрибута(ЧтениеXML, "Stamp");
ФискальнаяСтрока.ДанныеКодаТоварнойНоменклатуры.СерийныйНомер = ЗначениеXMLАтрибута(ЧтениеXML, "SerialNumber");
ТипМаркировки = ЗначениеXMLАтрибута(ЧтениеXML, "StampType");
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
ФискальнаяСтрока.ДанныеКодаТоварнойНоменклатуры.ТипМаркировки = МодульМенеджерОборудованияМаркировка.ТипМаркировкиККТПоКоду(ТипМаркировки);
ФискальнаяСтрока.ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара = ЗначениеXMLАтрибута(ЧтениеXML, "MarkingCode");
КонецЕсли
КонецЕсли;
КонецЕсли;
Если ЧтениеXML.Имя = "TextString" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Текст = ЗначениеXMLАтрибута(ЧтениеXML, "Text");
ТекстоваяСтрока = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(Текст);
ОбщиеПараметры.ПозицииЧека.Добавить(ТекстоваяСтрока);
КонецЕсли;
Если ЧтениеXML.Имя = "Barcode" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ТипШтрихкодаЗнач = ЗначениеXMLАтрибута(ЧтениеXML, "Type");
ШтрихКодЗнач = ЗначениеXMLАтрибута(ЧтениеXML, "Value");
ШтрихКодBase64 = ЗначениеXMLАтрибута(ЧтениеXML, "ValueBase64");
СтрокаШтрихКод = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыШтрихкодВСтрокеЧека(ТипШтрихкодаЗнач, ШтрихКодЗнач, ШтрихКодBase64);
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаШтрихКод);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЧтениеXML.Имя = "Payments" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
СуммаНаличные = Число(ЗначениеXMLАтрибута(ЧтениеXML, "Cash", , 0));
СуммаЭлектронно = Число(ЗначениеXMLАтрибута(ЧтениеXML, "ElectronicPayment", , 0));
СуммаПостоплата = Число(ЗначениеXMLАтрибута(ЧтениеXML, "Credit", "PostPayment", 0));
СуммаПредоплата = Число(ЗначениеXMLАтрибута(ЧтениеXML, "AdvancePayment", "PrePayment", 0));
СуммаПредоставление = Число(ЗначениеXMLАтрибута(ЧтениеXML, "CashProvision", "Barter", 0));
ОплатаНеНаличными = СуммаЭлектронно + СуммаПостоплата + СуммаПредоплата + СуммаПредоставление;
СуммаНаличные = ?(СуммаНаличные + ОплатаНеНаличными > СуммаЧека, СуммаЧека - ОплатаНеНаличными, СуммаНаличные);
Если СуммаНаличные > 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Наличные"));
СтрокаОплаты.Вставить("Сумма", СуммаНаличные);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
Если СуммаЭлектронно > 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Электронно"));
СтрокаОплаты.Вставить("Сумма", СуммаЭлектронно);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
Если СуммаПостоплата > 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Постоплата"));
СтрокаОплаты.Вставить("Сумма", СуммаПостоплата);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
Если СуммаПредоплата > 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Предоплата"));
СтрокаОплаты.Вставить("Сумма", СуммаПредоплата);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
Если СуммаПредоставление > 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.ВстречноеПредоставление"));
СтрокаОплаты.Вставить("Сумма", СуммаПредоставление);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
КонецЕсли;
Если ЧтениеXML.Имя = "ElectronicPaymentInfo" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.Прочитать() И НЕ (ЧтениеXML.Имя = "ElectronicPaymentInfo" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента) Цикл
Если ЧтениеXML.Имя = "ElectronicPayment" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
СведенияОБезналичнойОплате = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыСведенияОБезналичнойОплате();
СведенияОБезналичнойОплате.ПризнакСпособаОплаты = Число(ЗначениеXMLАтрибута(ЧтениеXML, "PaymentMethod", , 0));
СведенияОБезналичнойОплате.Идентификаторы = ЗначениеXMLАтрибута(ЧтениеXML, "Identifiers");
СведенияОБезналичнойОплате.Дополнительныеедения = ЗначениеXMLАтрибута(ЧтениеXML, "AdditionalInformation");
ОбщиеПараметры.СведенияОБезналичнойОплате.Добавить(СведенияОБезналичнойОплате);
КонецЕсли;
КонецЦикла
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат ОбщиеПараметры;
КонецФункции
#КонецОбласти
// Функция формирует шаблон чека.
//
// Параметры:
// ОбщиеПараметры - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// ТипОборудования - Строка - типы оборудования строкой.
// ДополнительныйТекст - Строка - дополнительный текст шаблона чека.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование
//
// Возвращаемое значение:
// Структура.
Функция ШаблонЧека(ОбщиеПараметры, ТипОборудования, ДополнительныйТекст = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт
СтандартнаяОбработка = Истина;
ШаблонЧека = Неопределено;
МенеджерОборудованияВызовСервераПереопределяемый.СформироватьШаблонЧека(ШаблонЧека, ОбщиеПараметры, ДополнительныйТекст, СтандартнаяОбработка, ТипОборудования);
Если СтандартнаяОбработка Или ШаблонЧека = Неопределено Тогда
Возврат ОбщиеПараметры;
Иначе
Возврат ШаблонЧека;
КонецЕсли;
КонецФункции
// Функция формирует табличный документ по данным фискального чека.
//
// Параметры:
// ТипДокумента - Число
// ОбщиеПараметры - Структура - параметры фискального документа загруженная из данных XML
// см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// РеквизитыЧека - Структура - параметры фискального документа из регистра сведений фискальные документы
// см. ДанныеФискальнойОперации()
// ФорматФФД - Строка - формат фискальных данных, влияет на вывод таблицы оплаты при "1.0"
// используются только виды оплат "НАЛИЧНЫМИ", "ЭЛЕКТРОННО"
//
// Возвращаемое значение:
// ТабличныйДокумент - табличный документ со сформированным фискальным документом, может быть сохранен в любой формат.
//
Функция СформироватьФискальныйДокумент(ТипДокумента, ОбщиеПараметры, РеквизитыЧека = Неопределено, ФорматФФД = "1.1", ШиринаЧека = 42) Экспорт
Если ТипДокумента = 1 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонОтчетОбОткрытииСмены(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 2 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонВнесениеНаличных(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 3 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонВнесениеНаличных(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 4 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонОтчетОТекущемСостоянии(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 5 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонОтчетОЗакрытииСмены(ШиринаЧека, ОбщиеПараметры);
Иначе
Шаблон = ШаблоныФискальныхДокументов.ШаблонКассовыйЧек(ШиринаЧека, ОбщиеПараметры, РеквизитыЧека);
КонецЕсли;
ШаблоныФискальныхДокументов.СформироватьДокументПоШаблону(Шаблон);
ТабличныйДокумент = ШаблоныФискальныхДокументов.ВывестиКакТабличныйДокумент(Шаблон);
Возврат ТабличныйДокумент;
КонецФункции
// Функция формирует табличный документ по данным фискального чека.
//
// Параметры:
// ТипДокумента - Число
// ОбщиеПараметры - Структура - параметры фискального документа загруженная из данных XML
// см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// РеквизитыЧека - Структура - параметры фискального документа из регистра сведений фискальные документы
// см. ДанныеФискальнойОперации()
// ФорматФФД - Строка - формат фискальных данных, влияет на вывод таблицы оплаты при "1.0"
// используются только виды оплат "НАЛИЧНЫМИ", "ЭЛЕКТРОННО"
//
// Возвращаемое значение:
// Текст - Строка.
//
Функция СформироватьФискальныйДокументТекст(ТипДокумента, ОбщиеПараметры, РеквизитыЧека = Неопределено, ФорматФФД = "1.1", ШиринаЧека = 42) Экспорт
Если ТипДокумента = 1 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонОтчетОбОткрытииСмены(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 2 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонВнесениеНаличных(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 3 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонВнесениеНаличных(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 4 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонОтчетОТекущемСостоянии(ШиринаЧека, ОбщиеПараметры);
ИначеЕсли ТипДокумента = 5 Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонОтчетОЗакрытииСмены(ШиринаЧека, ОбщиеПараметры);
Иначе
Шаблон = ШаблоныФискальныхДокументов.ШаблонКассовыйЧек(ШиринаЧека, ОбщиеПараметры, РеквизитыЧека);
КонецЕсли;
ШаблоныФискальныхДокументов.СформироватьДокументПоШаблону(Шаблон);
Текст = ШаблоныФискальныхДокументов.ВывестиКакТекст(Шаблон);
Возврат Текст;
КонецФункции
// Возвращает флаг открыта ли кассовая смена
//
// Параметры:
// СтатусКассовойСмены - ПеречислениеСсылка.СтатусыКассовойСмены
//
// Возвращаемое значение:
// Булево
Функция КассоваяСменаОткрыта(СтатусКассовойСмены) Экспорт
СменаОткрыта = Неопределено;
Если СтатусКассовойСмены = Перечисления.СтатусыКассовойСмены.Открыта Тогда
СменаОткрыта = Истина;
Иначе
СменаОткрыта = Ложь;
КонецЕсли;
Возврат СменаОткрыта;
КонецФункции
// Возвращает статус что кассовая смена открыта
//
// Возвращаемое значение:
// ПеречислениеСсылка.СтатусыКассовойСмены
Функция СтатусОткрытойСмены() Экспорт
Возврат Перечисления.СтатусыКассовойСмены.Открыта;
КонецФункции
// Возвращает статус что кассовая смена закрыта
//
// Возвращаемое значение:
// ПеречислениеСсылка.СтатусыКассовойСмены
Функция СтатусЗакрытойСмены() Экспорт
Возврат Перечисления.СтатусыКассовойСмены.Закрыта;
КонецФункции
// Возвращает возможные варианты статусов чеков в очереди
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение
Функция СтатусыЧекаВОчереди() Экспорт
Соответствие = Новый Соответствие();
Соответствие.Вставить("Фискализирован" , ПредопределенноеЗначение("Перечисление.СтатусЧекаККТВОчереди.Фискализирован"));
Соответствие.Вставить("Ошибка" , ПредопределенноеЗначение("Перечисление.СтатусЧекаККТВОчереди.Ошибка"));
Соответствие.Вставить("Новый" , ПредопределенноеЗначение("Перечисление.СтатусЧекаККТВОчереди.Новый"));
Соответствие.Вставить("Фискализируется", ПредопределенноеЗначение("Перечисление.СтатусЧекаККТВОчереди.Фискализируется"));
Соответствие.Вставить("Отменен" , ПредопределенноеЗначение("Перечисление.СтатусЧекаККТВОчереди.Отменен"));
Возврат Соответствие;
КонецФункции
#Область УстаревшиеПроцедурыИФункции
// Устарела: следует использовать МенеджерОборудованияМаркировка.КодТовараИдентифицируетЭкземпляр.
// Идентифицирует ли код товара (значение тега 1162) экземпляр товара.
//
// Параметры:
// РеквизитКодаТовара - Строка - Значение реквизита кода товара в BASE64.
// ШтриховойКодТовара - Строка - Штриховой код товара.
//
// Возвращаемое значение:
// Булево - Истина - Если код товара идентифицирует экземпляр товара.
//
Функция КодТовараИдентифицируетЭкземпляр(Знач РеквизитКодаТовара = Неопределено, Знач ШтриховойКодТовара = Неопределено) Экспорт
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
Возврат МодульМенеджерОборудованияМаркировка.КодТовараИдентифицируетЭкземпляр(РеквизитКодаТовара, ШтриховойКодТовара);
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
// Устарела: следует использовать ШаблонЧека.
// Функция формирует шаблон чека.
//
// Параметры:
// ОбщиеПараметры - Структура - см.ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека().
// ТипОборудования - Строка - типы оборудования строкой.
// ДополнительныйТекст - Строка - дополнительный текст шаблона чека.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование
//
// Возвращаемое значение:
// - Структура.
Функция СформироватьШаблонЧека(ОбщиеПараметры, ТипОборудования, ДополнительныйТекст = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт
Возврат ШаблонЧека(ОбщиеПараметры, ТипОборудования, ДополнительныйТекст, ИдентификаторУстройства);
КонецФункции
#КонецОбласти
// Возвращает название организации по ссылке типа ОпределяемыеТипы.Организация
//
// Параметры:
// Организация - ОпределяемыйТип.ОрганизацияБПО
//
// Возвращаемое значение:
// Структура:
// * Наименование - Строка - Наименование организации
Функция СведенияОбОрганизации(Организация) Экспорт
Сведения = Новый Структура();
Сведения.Вставить("Наименование", "");
СтандартнаяОбработка = Истина;
МенеджерОборудованияВызовСервераПереопределяемый.СведенияОбОрганизации(Организация, Сведения, СтандартнаяОбработка);
Если СтандартнаяОбработка Тогда
Сведения.Наименование = Строка(Организация);
КонецЕсли;
Возврат Сведения;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Добавляет в список поставляемые драйверы в составе конфигурации.
//
// Параметры:
// ДрайвераОборудования - см. МенеджерОборудования.НоваяТаблицаПоставляемыхДрайверовОборудования
//
Процедура ОбновитьПоставляемыеДрайвера(ДрайвераОборудования) Экспорт
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ПринтерЧеков;
Драйвер.ИмяДрайвера = "Драйвер1СПринтерЧеков";
Драйвер.Наименование = НСтр("ru = '1С:Принтер чеков'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "ReceiptPrinterNative";
Драйвер.РекомендуемоеИспользование = Истина;
// ++ Локализация
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ПринтерЧеков;
Драйвер.ИмяДрайвера = "ДрайверRightScanУстройствоПечати";
Драйвер.Наименование = НСтр("ru = 'RightScan:Устройство печати ТСД Urovo'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "RSPrinter";
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверRightScanККТ54ФЗ";
Драйвер.Наименование = НСтр("ru = 'RightScan:ККТ с передачей данных в ОФД (54-ФЗ)'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "FNCore";
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверАЗУРККТ54ФЗФФД12";
Драйвер.Наименование = НСтр("ru = 'АЗУР:ККТ с передачей данных в ОФД (ФФД 1.2)'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "com_azurpos_fz54_AzurPos";
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверВерсияТККТ54ФЗ";
Драйвер.Наименование = НСтр("ru = 'Версия-Т:ККТ с передачей данных в ОФД (54-ФЗ)'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "VT_KKT_1CInt";
Драйвер.СнятСПоддержки = Истина;
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверАТОЛККТ54ФЗ10XФФД12";
Драйвер.Наименование = НСтр("ru = 'АТОЛ:ККТ с передачей данных в ОФД 10.Х (ФФД 1.2)'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "ATOL_KKT_1C_V10";
Драйвер.РекомендуемоеИспользование = Истина;
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверАТОЛККТ54ФЗ10XФФД12X";
Драйвер.Наименование = НСтр("ru = 'АТОЛ:ККТ с передачей данных в ОФД 10.x (ФФД 1.2) УСН НДС'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "ATOL_KKT_1C_V10X";
Драйвер.РекомендуемоеИспользование = Истина;
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверАтолККТ54ФЗ10X";
Драйвер.Наименование = НСтр("ru = 'АТОЛ:ККТ с передачей данных в ОФД (54-ФЗ) 10.x'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "ATOL_KKT_1C83_V10";
Драйвер.СнятСПоддержки = Истина;
Драйвер = ДрайвераОборудования.Добавить();
Драйвер.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ;
Драйвер.ИмяДрайвера = "ДрайверПОСЦентрККТ54ФЗ4ФФД12NG";
Драйвер.Наименование = НСтр("ru = 'ПОСЦентр:ККТ с передачей данных в ОФД (ФФД 1.2) NG УСН НДС'", ОбщегоНазначенияБПО.КодОсновногоЯзыка());
Драйвер.ИдентификаторОбъекта = "psc_fr_drv_ng_V1";
Драйвер.РекомендуемоеИспользование = Истина;
// -- Локализация
КонецПроцедуры
// Подготовить данные операции, перед выполнением команды.
//
// Параметры:
// ПараметрыПодключения - Структура - см. МенеджерОборудованияКлиентСервер.ПараметрыПодключения()
// Команда - Строка - команда для выполнения
// ПараметрыОперации - Структура -
//
// Возвращаемое значение:
// Структура - Подготовить данные операции:
// * Кассир - ОпределяемыйТип.СубъектПерсональныхДанныхБПО
// * КассирИНН - Число
// * ДокументОснование - ОпределяемыйТип.ОснованиеФискальнойОперацииБПО
// * ИдентификаторФискальнойЗаписи - УникальныйИдентификатор
// * Организация - ОпределяемыйТип.ОрганизацияБПО.
// * ТорговыйОбъект - ОпределяемыйТип.ТорговыйОбъектБПО
// * КорректируемыйДокумент - ОпределяемыйТип.ОснованиеФискальнойОперацииБПО
// * ЕстьПерсональныеДанные - Булево -
// * СубъектПерсональныхДанных - ОпределяемыйТип.СубъектПерсональныхДанныхБПО
// * ТипПерсональныхДанных - ПеречислениеСсылка.ТипыПерсональныхДанныхККТ.
// * ТипРасчета - ПеречислениеСсылка.ТипыРасчетаДенежнымиСредствами
// * ТипДокумента - ПеречислениеСсылка.ТипыФискальныхДокументовККТ
// * РевизияИнтерфейса - Число -
// * ШиринаСтроки - Число -
// * РегистрационныйНомерККТ - Строка -
// * ЗаводскойНомерФН - Строка -
// * ДополнительныйРеквизит - Строка -
// * НомерСменыККТ - Число -
// * НомерЧекаККТ - Число -
// * НомерЧекаЗаСмену - Число -
// * ДатаВремяЧека - Дата
// * СуммаЧека - Число -
// * ОплатаНаличные - Число -
// * ОплатаЭлектронно - Число -
// * ОплатаПредоплата - Число -
// * ОплатаПостоплата - Число -
// * ОплатаВстречноеПредоставление - Число -
// * ФискальныйПризнак - Строка -
// * АдресСайтаПроверки - Строка -
// * ОшибкаПечати - Булево -
// * Электронно - Булево -
// * Отправляет1СSMS - Булево -
// * Отправляет1СEmail - Булево -
// * АвтономныйРежим - Булево -
// * ДанныеЧекаXML - Строка
// * ДанныеЧекаXMLПерсональныеДанные - Строка
// * РезультатОперацииXML - Булево
// * ТекстСообщения - Строка
// * ТекущееСостояние - Структура -:
// ** НомерСменыККТ - Число -
// ** НомерЧекаККТ - Число -
// ** СтатусСмены - Число -
// ** ДатаВремя - Дата
// ** ПараметрыXML - Строка -
// ** РезультатXML - Строка -
// ** КассоваяСмена - ДокументСсылка.КассоваяСмена
// ** ТестовыеЧеки - Булево
// ** Результат - Булево -
// ** ТекстОшибки - Строка
// * ЧекКоррекцииСторно - Булево
// * СформироватьЧекКоррекции - Булево -
// * НеприменениеККТ - Булево -
// * ВерсияФФДККТ11 - Булево -
// * Результат - Булево -
// * ОперацияЗаписана - Булево -
// * ТекстОшибки - Строка
// * СтатусСмены - Число -
// * ТестовыеЧеки - Булево
// * ЕдиныйЧек - Булево -
// * ИдентификаторОплатыПлатежнойСистемы - УникальныйИдентификатор
// * ТипПлатежнойСистемы - ПеречислениеСсылка.ТипыПлатежнойСистемыККТ
//
Функция ПодготовитьДанныеОперации(ПараметрыПодключения, Команда, ПараметрыОперации) Экспорт
ШиринаСтроки = ?(ПараметрыПодключения.Свойство("ШиринаСтроки") И ПараметрыПодключения.ШиринаСтроки > 0, ПараметрыПодключения.ШиринаСтроки, 32);
ДанныеОперации = Новый Структура();
ДанныеОперации.Вставить("Результат", Истина);
ДанныеОперации.Вставить("ТекстОшибки");
ДанныеОперации.Вставить("ТестовыеЧеки");
ДанныеОперации.Вставить("ТекстЧека");
// Для всех операций проверяем корректность ИНН кассира.
Если ПараметрыОперации <> Неопределено И ПараметрыОперации.Свойство("КассирИНН") И НЕ ПустаяСтрока(ПараметрыОперации.КассирИНН) Тогда
ОписаниеОшибки = "";
Если НЕ ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ИННСоответствуетТребованиям(ПараметрыОперации.КассирИНН, Ложь, ОписаниеОшибки) Тогда
ТекстОшибки = НСтр("ru = 'ИНН кассира некорректен (%Ошибка%)'");
ОписаниеОшибки = СтрЗаменить(ТекстОшибки, "%Ошибка%", ОписаниеОшибки);
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
КонецЕсли;
// Для всех операций проверяем корректность ИНН организации.
Если ПараметрыОперации <> Неопределено И ПараметрыОперации.Свойство("ОрганизацияИНН") И НЕ ПустаяСтрока(ПараметрыОперации.ОрганизацияИНН) Тогда
Если СтрДлина(ПараметрыОперации.ОрганизацияИНН) <> 10 И СтрДлина(ПараметрыОперации.ОрганизацияИНН) <> 12 Тогда
ОписаниеОшибки = НСтр("ru = 'Неверная длина ИНН организации.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
КонецЕсли;
// Для всех операций проверяем корректность длины поля Кассир (ФФД 1021) (макс 64)
Если ПараметрыОперации <> Неопределено И ПараметрыОперации.Свойство("Кассир") И НЕ ПустаяСтрока(ПараметрыОперации.Кассир) Тогда
Если СтрДлина(ПараметрыОперации.Кассир) > 64 Тогда
ПараметрыОперации.Кассир = Лев(СокрЛП(ПараметрыОперации.Кассир),64);
КонецЕсли;
КонецЕсли;
Если Команда = "CheckFiscalization" Тогда
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков
И ПараметрыОперации.Свойство("АвтономнаяККТ") И НЕ ПараметрыОперации.АвтономнаяККТ Тогда
ОписаниеОшибки = НСтр("ru='Фискализация на принтерах чеков запрещена.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
СтатусПоследнейСмены = ПолучитьСтатусПоследнейСмены(ПараметрыПодключения.ИдентификаторУстройства);
Если Не СтатусПоследнейСмены.Активна = Истина Тогда
ОписаниеОшибки = НСтр("ru='Кассовая смена не открыта или истекла.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
Иначе
// Форматно логический контроль
ОписаниеОшибки = "";
Если ОбщегоНазначенияБПО.ИспользуетсяФорматноЛогическийКонтроль() Тогда
МодульФорматноЛогическийКонтроль = ОбщегоНазначенияБПО.ОбщийМодуль("ФорматноЛогическийКонтроль");
Если НЕ МодульФорматноЛогическийКонтроль.ВыполненаПроверкаОбязательностиИПравильностиЗаполненияТэгов(
ПараметрыОперации,
ПараметрыПодключения.ИдентификаторУстройства,
ОписаниеОшибки) Тогда
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
МодульФорматноЛогическийКонтроль.ПривестиДанныеКТребуемомуФормату(ПараметрыОперации);
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ПараметрыОперации.ДокументОснование) И КонтрольФискализацииБезналичныхПлатежей() Тогда
ЗаполнитьДанныеПлатежныхОпераций(ПараметрыОперации);
КонецЕсли;
// Параметры фискализации чека
ПараметрыФискализации = ПараметрыФискализацииЧека();
ПараметрыФискализации.ТекущаяСмена = СтатусПоследнейСмены.КассоваяСмена;
// Параметры регистрации ККТ
ПараметрыРегистрации = ПараметрыРегистрацииУстройства(ПараметрыПодключения.ИдентификаторУстройства);
ВерсияФФДККТ11 = ?(ПараметрыРегистрации.Свойство("ВерсияФФДККТ"), ПараметрыРегистрации.ВерсияФФДККТ, "1.05");
ВерсияФФДККТ11 = ВерсияФФДККТ11 = "1.1" Или ВерсияФФДККТ11 = "1.2"; // Признак ФФД 1.1
ПараметрыОперации = ШаблонЧека(ПараметрыОперации, Перечисления.ТипыПодключаемогоОборудования.ККТ, Неопределено, ПараметрыПодключения.ИдентификаторУстройства);
// Добавить текст короткого слип чека в тело фискального чека
Если Не ПустаяСтрока(ПараметрыОперации.ТекстКороткогоСлипЧека) Тогда
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ПараметрыОперации.ТекстКороткогоСлипЧека);
СтрокаЧека.Выравнивание = "Центр";
ПараметрыОперации.ПозицииЧека.Добавить(СтрокаЧека);
КонецЕсли;
ПараметрыФискализации.РегистрационныйНомерККТ = ?(ПараметрыРегистрации.Свойство("РегистрационныйНомерККТ"), ПараметрыРегистрации.РегистрационныйНомерККТ, "");
ПараметрыФискализации.ЗаводскойНомерФН = ?(ПараметрыРегистрации.Свойство("ЗаводскойНомерФН"), ПараметрыРегистрации.ЗаводскойНомерФН, "");
ПараметрыФискализации.ШиринаСтроки = ШиринаСтроки;
ПараметрыФискализации.РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
ПараметрыФискализации.ДокументОснование = ПараметрыОперации.ДокументОснование;
ПараметрыФискализации.ИдентификаторФискальнойЗаписи = ПараметрыОперации.ИдентификаторФискальнойЗаписи;
ПараметрыФискализации.Организация = ПараметрыОперации.Организация;
ПараметрыФискализации.ТорговыйОбъект = ПараметрыОперации.ТорговыйОбъект;
ПараметрыФискализации.ДополнительныйРеквизит = ПараметрыОперации.ДополнительныйРеквизит;
ПараметрыФискализации.СубъектПерсональныхДанных = ПараметрыОперации.СубъектПерсональныхДанных;
ПараметрыФискализации.ЕстьПерсональныеДанные = ПараметрыОперации.ЕстьПерсональныеДанные;
Если ПараметрыОперации.Свойство("ИдентификаторОплатыПлатежнойСистемы") Тогда
ПараметрыФискализации.ИдентификаторОплатыПлатежнойСистемы = ПараметрыОперации.ИдентификаторОплатыПлатежнойСистемы;
КонецЕсли;
Если ПараметрыОперации.Свойство("ТипПлатежнойСистемы") Тогда
ПараметрыФискализации.ТипПлатежнойСистемы = ПараметрыОперации.ТипПлатежнойСистемы;
КонецЕсли;
Если ПараметрыОперации.Свойство("КорректируемыйДокумент") Тогда
ПараметрыФискализации.КорректируемыйДокумент = ПараметрыОперации.КорректируемыйДокумент;
КонецЕсли;
ПараметрыФискализации.Кассир = ПараметрыОперации.Кассир;
ПараметрыФискализации.КассирИНН = ПараметрыОперации.КассирИНН;
ПараметрыФискализации.Электронно = ПараметрыОперации.Электронно;
ПараметрыФискализации.Отправляет1СSMS = ПараметрыОперации.Отправляет1СSMS;
Если ПараметрыОперации.Отправляет1СSMS Тогда
ПараметрыФискализации.ПокупательНомер = ПараметрыОперации.ПокупательНомер;
КонецЕсли;
ПараметрыФискализации.Отправляет1СEmail = ПараметрыОперации.Отправляет1СEmail;
Если ПараметрыОперации.Отправляет1СEmail Тогда
ПараметрыФискализации.ПокупательEmail = ПараметрыОперации.ПокупательEmail;
КонецЕсли;
ПараметрыФискализации.ВерсияФФДККТ11 = ВерсияФФДККТ11;
ПараметрыФискализации.ЕдиныйЧек = ПараметрыОперации.ЕдиныйЧек;
ПараметрыФискализации.ТипДокумента = Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧек;
// Формирование XML
СформироватьXMLПакетДляФискализацияЧека(ПараметрыОперации, ПараметрыФискализации);
Если ПараметрыФискализации.ЕстьПерсональныеДанные Тогда
Если ПустаяСтрока(ПараметрыФискализации.ДатаВремяЧека) Тогда
ДатаВремяЧека = ОбщегоНазначенияБПО.ДатаСеанса();
Иначе
ДатаВремяЧека = ПараметрыФискализации.ДатаВремяЧека;
КонецЕсли;
СведенияОПокупателе = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПерсональныеДанныеПокупателя();
ПараметрыФискализации.ТипПерсональныхДанных = ПараметрыОперации.ТипПерсональныхДанных;
МенеджерОборудованияВызовСервераПереопределяемый.ОбработкаЗаполненияПерсональныхДанных(СведенияОПокупателе, ПараметрыФискализации.СубъектПерсональныхДанных,
ПараметрыФискализации.ТипПерсональныхДанных, ДатаВремяЧека);
СформироватьXMLПакетДляФискализацияЧека(ПараметрыОперации, ПараметрыФискализации, Истина, СведенияОПокупателе, ПараметрыФискализации.ТипПерсональныхДанных);
КонецЕсли;
ПараметрыФискализации.ТекущееСостояние.ПараметрыXML = ПолучитьXMLПакетДляОперации(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса);
Если ЗначениеЗаполнено(ПараметрыОперации.УстройствоПечати)
И (ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И НЕ ПараметрыПодключения.ТипыОборудования.ПринтерЧеков) Тогда
Шаблон = ШаблоныФискальныхДокументов.ШаблонКассовыйЧек(ШиринаСтроки, ПараметрыОперации);
ТекстЧека = ШаблоныФискальныхДокументов.ВывестиКакТекст(Шаблон);
ПараметрыФискализации.КопияЧека = ПолучитьXMLПакетДляТекста(ТекстЧека, ПараметрыПодключения.РевизияИнтерфейса);
ПараметрыФискализации.ТекстЧека = ТекстЧека;
КонецЕсли;
Если ПараметрыОперации.ПакетДокументов <> Неопределено И ПараметрыОперации.ПакетДокументов.Количество() > 0 Тогда
Если ПараметрыФискализации.ДополнительныеДокументы = Неопределено Тогда
ПараметрыФискализации.ДополнительныеДокументы = Новый Массив();
КонецЕсли;
Для Каждого ДополнительныйДокумент ИЗ ПараметрыОперации.ПакетДокументов Цикл
ТекстПечати = ПолучитьXMLПакетДляТекста(ДополнительныйДокумент.Ключ, ПараметрыПодключения.РевизияИнтерфейса);
ПараметрыФискализации.ДополнительныеДокументы.Добавить(Новый Структура("ТекстПечати, УстройствоПечати" , ТекстПечати, ДополнительныйДокумент.Значение));
КонецЦикла;
КонецЕсли;
Если ПараметрыОперации.НефискальныеДокументы <> Неопределено И ПараметрыОперации.НефискальныеДокументы.Количество() > 0 Тогда
Если ПараметрыФискализации.ТестовыеЧеки = Неопределено Тогда
ПараметрыФискализации.ТестовыеЧеки = Новый Массив();
КонецЕсли;
ЗаполнитьXMLПакетыДляТекстовогоДокумента(
ПараметрыФискализации.ТестовыеЧеки,
ПараметрыОперации.НефискальныеДокументы,
ПараметрыПодключения,
ШиринаСтроки);
КонецЕсли;
Для Каждого Позиция Из ПараметрыОперации.ПозицииЧека Цикл
Если Позиция.Свойство("ФискальнаяСтрока") Тогда
ШтрихкодBase64 = ?(ЗначениеЗаполнено(Позиция.ШтрихкодBase64),
Позиция.ШтрихкодBase64,
ОбщегоНазначенияБПОКлиентСервер.ШтрихкодВBase64(Позиция.Штрихкод));
Если ЗначениеЗаполнено(ШтрихкодBase64) Тогда
ДанныеПродукции = Новый Структура;
ДанныеПродукции.Вставить("Наименование", Позиция.Наименование);
ПараметрыФискализации.ШтрихкодыПродукции.Вставить(ШтрихкодBase64, ДанныеПродукции);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ПараметрыФискализации;
ИначеЕсли Команда = "PrintReceiptCorrection" Тогда
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков
И ПараметрыОперации.Свойство("АвтономнаяККТ") И НЕ ПараметрыОперации.АвтономнаяККТ Тогда
ОписаниеОшибки = НСтр("ru='Фискализация на принтерах чеков запрещена.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ПараметрыФискализации = ПараметрыФискализацииЧека();
// Параметры регистрации ККТ
ПараметрыРегистрации = ПараметрыРегистрацииУстройства(ПараметрыПодключения.ИдентификаторУстройства);
ВерсияФФДККТ11 = ?(ПараметрыРегистрации.Свойство("ВерсияФФДККТ"), ПараметрыРегистрации.ВерсияФФДККТ, "1.05");
ВерсияФФДККТ11 = ВерсияФФДККТ11 = "1.1" Или ВерсияФФДККТ11 = "1.2"; // Признак ФФД 1.1
Если (ПараметрыПодключения.РевизияИнтерфейса < 3000 И ПараметрыОперации.НеприменениеККТ)
И (ПараметрыОперации.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств
Или ПараметрыОперации.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратРасходаДенежныхСредств) Тогда
ПараметрыФискализации.Результат = Ложь;
ПараметрыФискализации.ТекстОшибки = НСтр("ru='Для данного типа расчета нельзя сформировать чек коррекции для данного ККТ.'");
Возврат ПараметрыФискализации;
КонецЕсли;
// Параметры фискализации чека
ПараметрыФискализации.НеприменениеККТ = ПараметрыОперации.НеприменениеККТ;
ПараметрыФискализации.Кассир = ПараметрыОперации.Кассир;
ПараметрыФискализации.Электронно = ПараметрыОперации.Электронно;
ПараметрыФискализации.Отправляет1СSMS = ПараметрыОперации.Отправляет1СSMS;
ПараметрыФискализации.Отправляет1СEmail = ПараметрыОперации.Отправляет1СEmail;
ПараметрыФискализации.Организация = ПараметрыОперации.Организация;
ПараметрыФискализации.ТорговыйОбъект = ПараметрыОперации.ТорговыйОбъект;
ПараметрыФискализации.ДополнительныйРеквизит = ПараметрыОперации.ДополнительныйРеквизит;
ПараметрыФискализации.ВерсияФФДККТ11 = ВерсияФФДККТ11;
ПараметрыФискализации.ЕдиныйЧек = ПараметрыОперации.ЕдиныйЧек;
ПараметрыФискализации.РегистрационныйНомерККТ = ?(ПараметрыРегистрации.Свойство("РегистрационныйНомерККТ"), ПараметрыРегистрации.РегистрационныйНомерККТ, "");
ПараметрыФискализации.ЗаводскойНомерФН = ?(ПараметрыРегистрации.Свойство("ЗаводскойНомерФН"), ПараметрыРегистрации.ЗаводскойНомерФН, "");
ПараметрыФискализации.ШиринаСтроки = ШиринаСтроки;
ПараметрыФискализации.РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
ПараметрыФискализации.ДокументОснование = ПараметрыОперации.ДокументОснование;
ПараметрыФискализации.ИдентификаторФискальнойЗаписи = ПараметрыОперации.ИдентификаторФискальнойЗаписи;
ПараметрыФискализации.СформироватьЧекКоррекцииСторно = ПараметрыОперации.СформироватьЧекКоррекцииСторно;
Если ПараметрыОперации.Свойство("КорректируемыйДокумент") Тогда
ПараметрыФискализации.КорректируемыйДокумент = ПараметрыОперации.КорректируемыйДокумент;
КонецЕсли;
Если ПараметрыОперации.НеприменениеККТ Тогда
ПараметрыФискализации.СформироватьЧекКоррекцииСторно = Ложь;
КонецЕсли;
Если НЕ ПараметрыФискализации.СформироватьЧекКоррекцииСторно Тогда
// Сценарий 1 - неприменение ККТ.
Если ПараметрыОперации.НеприменениеККТ И ЗначениеЗаполнено(ПараметрыОперации.КорректируемыйДокумент) Тогда
ПараметрыФискализации.Результат = Ложь;
ПараметрыФискализации.ТекстОшибки = НСтр("ru='Чек коррекции «неприменение ККТ» нельзя сформировать для фискализированного ранее чека.'");
Возврат ПараметрыФискализации;
КонецЕсли;
ПараметрыФискализации.ЧекКоррекцииНаККТ = Истина;
Если НЕ ПараметрыФискализации.НеприменениеККТ И НЕ ПараметрыФискализации.СформироватьЧекКоррекцииСторно И НЕ ВерсияФФДККТ11 Тогда
ПараметрыФискализации.ЧекКоррекцииНаККТ = Ложь;
// НеприменениеККТ не используется, СформироватьЧекКоррекцииСторно содержит Ложь
// ВерсияФФДККТ11 содержит Ложь, ФФД меньше 1.1
ЗаменитьТипыОплатыПриКоррекции(ПараметрыОперации, Неопределено);
КонецЕсли;
ПараметрыФискализации.ТипДокумента = ?(ПараметрыФискализации.ЧекКоррекцииНаККТ, Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧекКоррекции, Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧек);
СформироватьXMLПакетДляФискализацияЧека(ПараметрыОперации, ПараметрыФискализации);
Иначе
// Сценарий 2 - исправление нарушений применения ККТ.
Если ПустаяСтрока(ПараметрыОперации.КорректируемыйДокумент) Тогда
ПараметрыФискализации.Результат = Ложь;
ПараметрыФискализации.ТекстОшибки = НСтр("ru='Корректируемый документ не указан для формирования чека коррекции.'");
Возврат ПараметрыФискализации;
КонецЕсли;
ТипыДокументов = Новый Массив();
ТипыДокументов.Добавить(Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧек); // Для ФФД 1.05
ТипыДокументов.Добавить(Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧекКоррекции); // Для ФФД 1.1
КорректируемыйДокументОперация = ДанныеФискальнойОперации(ПараметрыОперации.КорректируемыйДокумент, ,ТипыДокументов);
Если КорректируемыйДокументОперация = Неопределено Тогда
ПараметрыФискализации.Результат = Ложь;
ПараметрыФискализации.ТекстОшибки = НСтр("ru='Не найден ранее фискализированный кассовый чек для формирования чека коррекции.'");
Возврат ПараметрыФискализации;
КонецЕсли;
// В зависимости от версии ФФД формируем "Кассовый чек" или "Кассовый чек коррекции".
ПараметрыФискализации.ЧекКоррекцииНаККТ = ВерсияФФДККТ11;
ТипФискальногоДокументов = ?(ПараметрыФискализации.ЧекКоррекцииНаККТ, Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧекКоррекции, Перечисления.ТипыФискальныхДокументовККТ.КассовыйЧек);
// Дополнительный реквизит чека - фискальным признаком документа основания (по которому идет коррекция).
ФискальныйПризнак = КорректируемыйДокументОперация.ФискальныйПризнак;
// Формируем кассовый чек с корректными реквизитами.
ПараметрыОперации.ДополнительныйРеквизит = ФискальныйПризнак;
ПараметрыФискализации.ДополнительныйРеквизит = ФискальныйПризнак;
ПараметрыФискализации.ТипДокумента = ТипФискальногоДокументов;
// Формируем параметры фискализации для сторнирующего чека коррекции.
ДанныеСторноЧекаXML = КорректируемыйДокументОперация.ДанныеXML.Получить();
// Чека коррекции не содержат данные о маркировке
ОбщиеПараметрыСторно = ЗагрузитьДанныеФискализацииИзXML(ДанныеСторноЧекаXML, Ложь);
ОбщиеПараметрыСторно.ДополнительныйРеквизит = ФискальныйПризнак;
ЗаполнитьЗначенияСвойств(ОбщиеПараметрыСторно.ДанныеКоррекции, ПараметрыОперации.ДанныеКоррекции);
ПодготовитьЧекКоррекции(ПараметрыОперации, ОбщиеПараметрыСторно, ВерсияФФДККТ11);
// Для формата 1.05
Если НЕ ВерсияФФДККТ11 Тогда
ЗаменитьТипыОплатыПриКоррекции(ПараметрыОперации, ОбщиеПараметрыСторно);
КонецЕсли;
СформироватьXMLПакетДляФискализацияЧека(ПараметрыОперации, ПараметрыФискализации);
ПараметрыФискализацииСторно = ПараметрыФискализацииЧека();
ЗаполнитьЗначенияСвойств(ПараметрыФискализацииСторно, ПараметрыФискализации);
СформироватьXMLПакетДляФискализацияЧека(ОбщиеПараметрыСторно, ПараметрыФискализацииСторно);
ПараметрыФискализации.ЧекКоррекцииСторно = ПараметрыФискализацииСторно;
КонецЕсли;
Возврат ПараметрыФискализации;
ИначеЕсли Команда = "PrintCheckCopy" Тогда
Аппаратно = ?(ПараметрыОперации.Свойство("Аппаратно"), ПараметрыОперации.Аппаратно, Истина);
Если Не Аппаратно Тогда
ДокументСсылка = ?(ПараметрыОперации.Свойство("ДокументСсылка"), ПараметрыОперации.ДокументСсылка, Неопределено);
ФискальныйПризнак = ?(ПараметрыОперации.Свойство("ФискальныйПризнак"), ПараметрыОперации.ФискальныйПризнак, Неопределено);
Если НЕ ЗначениеЗаполнено(ДокументСсылка) И ПустаяСтрока(ФискальныйПризнак) Тогда
ТекстОшибки = НСтр("ru = 'Не указаны параметры печати копии документа.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ТекстОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ФискальнаяОперация = ДанныеФискальнойОперации(ДокументСсылка, Неопределено, Неопределено, Неопределено, ФискальныйПризнак);
Если ФискальнаяОперация = Неопределено Тогда
ТекстОшибки = НСтр("ru = 'Фискальный документ для печати копии не найден.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ТекстОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ПараметрыQRКода = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыQRКодаЧекаККТ();
ПараметрыQRКода.ДатаВремяРасчета = ФискальнаяОперация.Дата;
ПараметрыQRКода.СуммаРасчета = ФискальнаяОперация.Сумма;
ПараметрыQRКода.ФискальныйПризнак = ФискальнаяОперация.ФискальныйПризнак;
ПараметрыQRКода.ПризнакРасчета = ФискальнаяОперация.ТипРасчета;
ПараметрыQRКода.НомерФискальногоНакопителя = ФискальнаяОперация.ЗаводскойНомерФН;
ПараметрыQRКода.НомерФискальногоДокумента = ФискальнаяОперация.НомерЧекаККМ;
QRКодЧекаККТ = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.СформироватьQRКодЧекаККТараметрыQRКода);
ДанныеXML = ФискальнаяОперация.ДанныеXML.Получить();
ПараметрыКопииЧека = ЗагрузитьДанныеФискализацииИзXML(ДанныеXML);
ПараметрыКопииЧека.ДатаВремя = ФискальнаяОперация.Дата;
ПараметрыПечати = ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента();
ПараметрыПечати.Заголовок = НСтр("ru = 'КОПИЯ ЧЕКА'");;
ПараметрыПечати.ВыводитьФискальнуюИнформацию = Ложь;
Шаблон = ШаблоныФискальныхДокументов.ШаблонКассовыйЧек(ПараметрыПодключения.ШиринаСтроки, ПараметрыКопииЧека, ФискальнаяОперация, ПараметрыПечати);
ТекстЧека = ШаблоныФискальныхДокументов.ВывестиКакТекст(Шаблон);
ТекстЧека = ПараметрыПечати.Заголовок + Символы.ПС + ТекстЧека;
ТекстЧека = ТекстЧека + Символы.ПС + ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыстроитьПоля(НСтр("ru = 'РН ККТ:'"), ФискальнаяОперация.РегистрационныйНомерККТ, ШиринаСтроки);
ТекстЧека = ТекстЧека + Символы.ПС + ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыстроитьПоля(НСтр("ru = 'ФН №:'") , ФискальнаяОперация.ЗаводскойНомерФН, ШиринаСтроки);
ТекстЧека = ТекстЧека + Символы.ПС + ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыстроитьПоля(НСтр("ru = 'ФД №:'") , Формат(ФискальнаяОперация.НомерЧекаККМ,"ЧГ="), ШиринаСтроки);
ТекстЧека = ТекстЧека + Символы.ПС + ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыстроитьПоля(НСтр("ru = 'ФП:'") , ФискальнаяОперация.ФискальныйПризнак, ШиринаСтроки);
ТекстЧека = ТекстЧека + Символы.ПС + "|ШтрихКод|QR|" + QRКодЧекаККТ;
ДанныеОперации.Вставить("ТестовыеЧеки", ПолучитьXMLПакетДляТекста(ТекстЧека, ПараметрыПодключения.РевизияИнтерфейса));
ДанныеОперации.ТекстЧека = ТекстЧека;
ДанныеОперации.Вставить("ТестовыеЧеки", ПолучитьXMLПакетДляТекста(ТекстЧека, ПараметрыПодключения.РевизияИнтерфейса));
КонецЕсли;
ДанныеОперации.Вставить("НомерЧека", ПараметрыОперации.НомерЧека);
ДанныеОперации.Вставить("Аппаратно", Аппаратно);
Возврат ДанныеОперации;
ИначеЕсли Команда = "PrintText" Тогда
ДанныеОперации.ТестовыеЧеки = ПолучитьXMLПакетДляТекста(ПараметрыОперации.СтрокиТекста, ПараметрыПодключения.РевизияИнтерфейса);
ДанныеОперации.ТекстЧека = ПараметрыОперации.СтрокиТекста;
Возврат ДанныеОперации;
ИначеЕсли Команда = "PrintQRCode" Тогда
ТекстЧека = Символы.ПС;
ТестовыйЧек = Новый Массив();
Если Не ПустаяСтрока(ПараметрыОперации.QRКод.ЗначениеКода) Тогда
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ТестовыйЧек.Добавить(СтрокаЧека);
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыШтрихкодВСтрокеЧека("QR", ПараметрыОперации.QRКод.ЗначениеКода);
ТестовыйЧек.Добавить(СтрокаЧека);
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ТестовыйЧек.Добавить(СтрокаЧека);
ТекстЧека = ТекстЧека + Символы.ПС + "|ШтрихКод|QR|" + ПараметрыОперации.QRКод.ЗначениеКода + Символы.ПС;
ТекстЧека = ТекстЧека + Символы.НПП + Символы.ПС;
Если Не ПустаяСтрока(ПараметрыОперации.ТипПлатежнойСистемы) Тогда
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ПараметрыОперации.ТипПлатежнойСистемы);
СтрокаЧека.Выравнивание = "Центр";
ТестовыйЧек.Добавить(СтрокаЧека);
ТекстЧека = ТекстЧека + ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыровнятьПоле(ПараметрыОперации.ТипПлатежнойСистемы, ПараметрыПодключения.ШиринаСтроки, "Центр") + Символы.ПС;
КонецЕсли;
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ПараметрыОперации.QRКод.ТекстПользователя);
СтрокаЧека.Выравнивание = "Центр";
ТестовыйЧек.Добавить(СтрокаЧека);
Если ЗначениеЗаполнено(ПараметрыОперации.СуммаОперации) Тогда
ФорматЧисла = "ЧРД=.;ЧЦ=12;ЧДЦ=2;ЧН=0.00;ЧГ=0";
ТекстСуммаОперации = СтрШаблон(НСтр("ru='Сумма операции: %1'"), Формат(ПараметрыОперации.СуммаОперации, ФорматЧисла));
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека(ТекстСуммаОперации);
СтрокаЧека.Выравнивание = "Центр";
ТестовыйЧек.Добавить(СтрокаЧека);
ТекстЧека = ТекстЧека + ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ВыровнятьПоле(ТекстСуммаОперации, ПараметрыПодключения.ШиринаСтроки, "Центр") + Символы.ПС;
ТекстЧека = ТекстЧека + Символы.НПП + Символы.ПС;
КонецЕсли;
СтрокаЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека();
ТестовыйЧек.Добавить(СтрокаЧека);
КонецЕсли;
НефискальныеДокументы = Новый Массив();
НефискальныеДокументы.Добавить(ТестовыйЧек);
ТестовыеЧеки = Новый Массив();
ЗаполнитьXMLПакетыДляТекстовогоДокумента(
ТестовыеЧеки, НефискальныеДокументы,
ПараметрыПодключения,
ПараметрыПодключения.ШиринаСтроки);
ДанныеОперации.Вставить("ТестовыеЧеки", ТестовыеЧеки);
ДанныеОперации.ТекстЧека = ТекстЧека;
Возврат ДанныеОперации;
ИначеЕсли Команда = "OpenShift" Тогда
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков
И ПараметрыОперации.Свойство("АвтономнаяККТ") И НЕ ПараметрыОперации.АвтономнаяККТ Тогда
ОписаниеОшибки = НСтр("ru='Фискализация на принтерах чеков запрещена.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ДанныеОперации = ПараметрыФискальнойОперации();
Если ПараметрыОперации.Свойство("ДополнительныеПараметры") Тогда
ДанныеОперации.ДополнительныеПараметры = ПараметрыОперации.ДополнительныеПараметры;
КонецЕсли;
Если Не ПередОткрытиемКассовойСмены(ПараметрыПодключения, ДанныеОперации) Тогда
Возврат ДанныеОперации;
КонецЕсли;
ДанныеОперации.ПараметрыXML = ПолучитьXMLПакетДляОперации(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса);
Возврат ДанныеОперации;
ИначеЕсли Команда = "CloseShift" Тогда
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков
И ПараметрыОперации.Свойство("АвтономнаяККТ") И НЕ ПараметрыОперации.АвтономнаяККТ Тогда
ОписаниеОшибки = НСтр("ru='Фискализация на принтерах чеков запрещена.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ДанныеОперации = ПараметрыФискальнойОперации();
Если ПараметрыОперации.Свойство("ДополнительныеПараметры") Тогда
ДанныеОперации.ДополнительныеПараметры = ПараметрыОперации.ДополнительныеПараметры;
КонецЕсли;
Если Не ПередЗакрытиемКассовойСмены(ПараметрыПодключения, ДанныеОперации) Тогда
Возврат ДанныеОперации;
КонецЕсли;
ДанныеОперации.ПараметрыXML = ПолучитьXMLПакетДляОперации(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса);
Возврат ДанныеОперации;
ИначеЕсли Команда = "ReportCurrentStatusOfSettlements" Или Команда = "GetCurrentStatus" Тогда
Если ПараметрыОперации = Неопределено Тогда
ПараметрыОперации = Новый Структура();
КонецЕсли;
ДанныеОперации = ПараметрыФискальнойОперации();
ДанныеОперации.ПараметрыXML = ПолучитьXMLПакетДляОперации(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса);
Возврат ДанныеОперации;
ИначеЕсли Команда = "PrintXReport" Тогда
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков
И ПараметрыОперации.Свойство("АвтономнаяККТ") И НЕ ПараметрыОперации.АвтономнаяККТ Тогда
ОписаниеОшибки = НСтр("ru='Фискализация на принтерах чеков запрещена.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
Если ПараметрыОперации = Неопределено Тогда
ПараметрыОперации = Новый Структура();
КонецЕсли;
ДанныеОперации = ПараметрыФискальнойОперации();
ДанныеОперации.ПараметрыXML = ПолучитьXMLПакетДляОперации(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса);
Возврат ДанныеОперации;
ИначеЕсли Команда = "Encash" Тогда
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков
И ПараметрыОперации.Свойство("АвтономнаяККТ") И НЕ ПараметрыОперации.АвтономнаяККТ Тогда
ОписаниеОшибки = НСтр("ru='Фискализация на принтерах чеков запрещена.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ПараметрыФискализации = ПараметрыФискализацииЧека();
Если ПараметрыОперации.ТипИнкассации = 0 Тогда
ПараметрыФискализации.ТипДокумента = Перечисления.ТипыФискальныхДокументовККТ.Выемка
Иначе
ПараметрыФискализации.ТипДокумента = Перечисления.ТипыФискальныхДокументовККТ.Внесение
КонецЕсли;
ПараметрыФискализации.ТипИнкассации = ПараметрыОперации.ТипИнкассации;
ПараметрыФискализации.ДатаВремяЧека = ОбщегоНазначенияБПО.ДатаСеанса();
Если ПараметрыПодключения.ТипыОборудования.ККТ Тогда
ПараметрыРегистрации = ПараметрыРегистрацииУстройства(ПараметрыПодключения.ИдентификаторУстройства);
ПараметрыФискализации.РегистрационныйНомерККТ = ?(ПараметрыРегистрации.Свойство("РегистрационныйНомерККТ"), ПараметрыРегистрации.РегистрационныйНомерККТ, "");
ПараметрыФискализации.ЗаводскойНомерФН = ?(ПараметрыРегистрации.Свойство("ЗаводскойНомерФН"), ПараметрыРегистрации.ЗаводскойНомерФН, "");
ПараметрыФискализации.ШиринаСтроки = ?(ПараметрыПодключения.Свойство("ШиринаСтроки"), ПараметрыПодключения.ШиринаСтроки, 32);
ПараметрыФискализации.РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
Если ПараметрыОперации.Свойство("ДокументОснование") Тогда
ПараметрыФискализации.ДокументОснование = ПараметрыОперации.ДокументОснование;
КонецЕсли;
Если ПараметрыОперации.Свойство("Кассир") Тогда
ПараметрыФискализации.Кассир = ПараметрыОперации.Кассир;
КонецЕсли;
Если ПараметрыОперации.Свойство("Организация") Тогда
ПараметрыФискализации.Организация = ПараметрыОперации.Организация;
КонецЕсли;
Если ПараметрыОперации.Свойство("ТорговыйОбъект") Тогда
ПараметрыФискализации.ТорговыйОбъект = ПараметрыОперации.ТорговыйОбъект;
КонецЕсли;
ПараметрыФискализации.СуммаЧека = ПараметрыОперации.Сумма;
ПараметрыФискализации.ОплатаНаличные = ПараметрыОперации.Сумма;
ПараметрыФискализации.ДанныеЧекаXML = ПолучитьXMLПакетДляОперации(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса);
КонецЕсли;
Возврат ПараметрыФискализации;
ИначеЕсли Команда = "OperationFN" Тогда
ДанныеОперации = ПараметрыФискальнойОперации();
ДанныеОперации.Вставить("ТипОперации", ПараметрыОперации.ТипОперации);
РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
ДанныеОперации.ПараметрыXML = СформироватьТаблицуПараметровДляОперацииФН(ПараметрыОперации, РевизияИнтерфейса);
Возврат ДанныеОперации;
ИначеЕсли Команда = "RequestKM" Или Команда = "RequestKMKMNoWait" Тогда
ДанныеОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыЗапросКМ();
СтатусПоследнейСмены = ПолучитьСтатусПоследнейСмены(ПараметрыПодключения.ИдентификаторУстройства);
Если Не СтатусПоследнейСмены.Активна = Истина Тогда
ОписаниеОшибки = НСтр("ru='Кассовая смена не открыта или истекла.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
// ++ Локализация
Если Команда = "RequestKMKMNoWait" Тогда
ПараметрыОперации.ОжидатьПолучениеОтветаОИСМ = Ложь;
КонецЕсли;
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
Если ПустаяСтрока(ПараметрыОперации.ИдентификаторЗапроса) Тогда
ПараметрыОперации.ИдентификаторЗапроса = Новый УникальныйИдентификатор;
КонецЕсли;
Если Не ПустаяСтрока(ПараметрыОперации.КонтрольнаяМарка) Тогда
ДанныеОперации.Результат = Истина;
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
ДанныеОперации.Вставить("ПараметрыXML",
МодульМенеджерОборудованияМаркировка.СформироватьXMLДляЗапросаКМ(ПараметрыОперации, ПараметрыПодключения.РевизияИнтерфейса));
ЗаполнитьЗначенияСвойств(ДанныеОперации, ПараметрыОперации);
Иначе
ТекстОшибки = НСтр("ru = 'Контрольная марка не может быть пустой.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ТекстОшибки;
КонецЕсли;
КонецЕсли;
Возврат ДанныеОперации;
// -- Локализация
ИначеЕсли Команда = "CheckKM" Тогда
ДанныеОперации = ОбщегоНазначенияБПО.СкопироватьРекурсивно(ПараметрыОперации);
ДанныеОперации.Вставить("Результат", Истина);
ДанныеОперации.Вставить("ТекстОшибки", "");
// ++ Локализация
СтатусПоследнейСмены = ПолучитьСтатусПоследнейСмены(ПараметрыПодключения.ИдентификаторУстройства);
Если Не СтатусПоследнейСмены.Активна = Истина Тогда
ОписаниеОшибки = НСтр("ru='Кассовая смена не открыта или истекла.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
Для Каждого Операция Из ДанныеОперации.ЗапросыКМ Цикл
Если ПустаяСтрока(Операция.ИдентификаторЗапроса) Тогда
Операция.ИдентификаторЗапроса = Строка(Новый УникальныйИдентификатор);
КонецЕсли;
Операция.ОтправлятьНаСерверОИСМ = Операция.ЗапросПроверкиКМСредствамиККТ;
Операция.Вставить("ПараметрыXML", МодульМенеджерОборудованияМаркировка.СформироватьXMLДляЗапросаКМ(Операция, ПараметрыПодключения.РевизияИнтерфейса));
КонецЦикла;
КонецЕсли;
// -- Локализация
Возврат ДанныеОперации;
ИначеЕсли Команда = "CheckFiscalizationPacket" Тогда
СтатусПоследнейСмены = ПолучитьСтатусПоследнейСмены(ПараметрыПодключения.ИдентификаторУстройства);
Если Не СтатусПоследнейСмены.Активна = Истина Тогда
ОписаниеОшибки = НСтр("ru='Кассовая смена не открыта или истекла.'");
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = ОписаниеОшибки;
Возврат ДанныеОперации;
КонецЕсли;
ДанныеОперации = ПараметрыФискализацииЧека();
Если ПараметрыОперации <> Неопределено И ПараметрыОперации.Свойство("ДанныеЧекаXML") Тогда
ДанныеОперации.ДанныеЧекаXML = ПараметрыОперации.ДанныеЧекаXML;
КонецЕсли;
Возврат ДанныеОперации;
КонецЕсли
КонецФункции
// Обработать данные операции после выполнения команды.
//
// Параметры:
// ПараметрыПодключения - Структура - см. МенеджерОборудованияКлиентСервер.ПараметрыПодключения()
// Команда - Строка - команда для выполнения
// РезультатВыполнения - Структура -
// ДанныеОперации - Структура -
Процедура ОбработатьДанныеОперации(ПараметрыПодключения, Команда, РезультатВыполнения, ДанныеОперации) Экспорт
РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
Если Команда = "CheckFiscalization" Или Команда = "CheckFiscalizationPacket" Тогда
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
// Заполнить результаты фискализация чека из XML пакета.
ЗаполнитьРезультатыФискализацияЧекаИзXMLПакета(ДанныеОперации);
КонецЕсли;
РезультатВыполнения.Вставить("НомерСменыККТ" , ДанныеОперации.НомерСменыККТ);
РезультатВыполнения.Вставить("НомерЧекаККТ" , ДанныеОперации.НомерЧекаККТ);
РезультатВыполнения.Вставить("СтатусСмены", 2);
РезультатВыполнения.Вставить("ДатаВремяЧека" , ДанныеОперации.ДатаВремяЧека);
РезультатВыполнения.Вставить("ФискальныйПризнак" , ДанныеОперации.ФискальныйПризнак);
РезультатВыполнения.Вставить("АдресСайтаПроверки" , ДанныеОперации.АдресСайтаПроверки);
РезультатВыполнения.Вставить("ОшибкаПечати" , ДанныеОперации.ОшибкаПечати);
РезультатВыполнения.Вставить("РегистрационныйНомерККТ", ДанныеОперации.РегистрационныйНомерККТ);
РезультатВыполнения.Вставить("ДанныеЧекаXML" , ДанныеОперации.ДанныеЧекаXML);
РезультатВыполнения.Вставить("ОперацияЗаписана" , Истина);
РезультатВыполнения.Вставить("ПараметрыФискализации" , ДанныеОперации);
Попытка
// Записать фискальную операцию.
ЗаписатьФискальнуюОперацию(ДанныеОперации);
Исключение
ОбщегоНазначенияБПО.ЗаписатьОшибкуВЖурналРегистрации(
НСтр("ru = 'Запись фискальной операции'"),
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
РезультатВыполнения.ОперацияЗаписана = Ложь;
КонецПопытки;
ПараметрыQRКода = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыQRКодаЧекаККТ();
ПараметрыQRКода.ДатаВремяРасчета = ДанныеОперации.ДатаВремяЧека;
ПараметрыQRКода.СуммаРасчета = ДанныеОперации.СуммаЧека;
ПараметрыQRКода.ФискальныйПризнак = ДанныеОперации.ФискальныйПризнак;
ПараметрыQRКода.ПризнакРасчета = ДанныеОперации.ТипРасчета;
ПараметрыQRКода.НомерФискальногоНакопителя = ДанныеОперации.ЗаводскойНомерФН;
ПараметрыQRКода.НомерФискальногоДокумента = ДанныеОперации.НомерЧекаККТ;
QRКодЧекаККТ = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.СформироватьQRКодЧекаККТараметрыQRКода);
// Отправить электронный чек через рассылку
Если (ДанныеОперации.Отправляет1СSMS Или ДанныеОперации.Отправляет1СEmail) Тогда
МодульРассылкаЭлектронныхЧеков = ОбщегоНазначенияБПО.ОбщийМодуль("РассылкаЭлектронныхЧеков");
Если МодульРассылкаЭлектронныхЧеков <> Неопределено Тогда
ТекстСообщения = МодульРассылкаЭлектронныхЧеков.ШаблонАтрибутовЧекаДляОтсылки(ДанныеОперации);
МодульРассылкаЭлектронныхЧеков.ОтправитьЭлектронныйЧек(
ДанныеОперации,
ТекстСообщения,
ДанныеОперации.ПокупательEmail,
ДанныеОперации.ПокупательНомер);
КонецЕсли;
КонецЕсли;
РезультатВыполнения.Вставить("QRКодЧекаККТ", QRКодЧекаККТ);
ИначеЕсли Команда = "PrintReceiptCorrection" Тогда
// Заполнить результаты фискализация чека из XML пакета.
ЗаполнитьРезультатыФискализацияЧекаИзXMLПакета(ДанныеОперации);
РезультатВыполнения.Вставить("НомерСменыККТ" , ДанныеОперации.НомерСменыККТ);
РезультатВыполнения.Вставить("НомерЧекаККТ" , ДанныеОперации.НомерЧекаККТ);
РезультатВыполнения.Вставить("СтатусСмены", 2);
РезультатВыполнения.Вставить("ДатаВремяЧека" , ДанныеОперации.ДатаВремяЧека);
РезультатВыполнения.Вставить("ФискальныйПризнак" , ДанныеОперации.ФискальныйПризнак);
РезультатВыполнения.Вставить("АдресСайтаПроверки" , ДанныеОперации.АдресСайтаПроверки);
РезультатВыполнения.Вставить("ОшибкаПечати" , ДанныеОперации.ОшибкаПечати);
РезультатВыполнения.Вставить("РегистрационныйНомерККТ", ДанныеОперации.РегистрационныйНомерККТ);
РезультатВыполнения.Вставить("ДанныеЧекаXML" , ДанныеОперации.ДанныеЧекаXML);
РезультатВыполнения.Вставить("ОперацияЗаписана" , Истина);
РезультатВыполнения.Вставить("ПараметрыФискализации" , ДанныеОперации);
Если НЕ ДанныеОперации.НеприменениеККТ И ДанныеОперации.СформироватьЧекКоррекцииСторно Тогда
// Заполнить результаты фискализация чека из XML пакета.
ЗаполнитьРезультатыФискализацияЧекаИзXMLПакета(ДанныеОперации.ЧекКоррекцииСторно);
Попытка
// Записать фискальную операцию - сторно.
ЗаписатьФискальнуюОперацию(ДанныеОперации.ЧекКоррекцииСторно);
Исключение
РезультатВыполнения.ОперацияЗаписана = Ложь;
КонецПопытки;
КонецЕсли;
Попытка
// Записать фискальную операцию.
ЗаписатьФискальнуюОперацию(ДанныеОперации);
Исключение
РезультатВыполнения.ОперацияЗаписана = Ложь;
КонецПопытки;
ИначеЕсли Команда = "CloseShift" Тогда
РезультатВыполнения.Вставить("НомерСменыККТ", ДанныеОперации.НомерСменыККТ);
РезультатВыполнения.Вставить("НомерЧекаККТ" , ДанныеОперации.НомерЧекаККТ);
РезультатВыполнения.Вставить("СтатусСмены" , ДанныеОперации.СтатусСмены);
РезультатВыполнения.Вставить("КассоваяСмена" , ДанныеОперации.КассоваяСмена);
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ФискальныеДанныеСтруктура = ПолучитьПараметрыСменыИзXMLПакета(ДанныеОперации.РезультатXML, РевизияИнтерфейса);
РезультатВыполнения.НомерСменыККТ = ФискальныеДанныеСтруктура.НомерСменыККТ;
РезультатВыполнения.НомерЧекаККТ = ФискальныеДанныеСтруктура.НомерЧекаККТ;
РезультатВыполнения.СтатусСмены = ФискальныеДанныеСтруктура.СтатусСмены;
Иначе
ФискальныеДанныеСтруктура = ПолучитьПараметрыСменыИзXMLПакета(ДанныеОперации.РезультатXML);
ФискальныеДанныеСтруктура.НомерСменыККТ = ДанныеОперации.НомерСменыККТ;
ФискальныеДанныеСтруктура.СтатусСмены = 1; // Закрыта
КонецЕсли;
РезультатВыполнения.Вставить("ФискальныеДанныеСтруктура", ФискальныеДанныеСтруктура);
РезультатВыполнения.Вставить("ФискальныеДанныеXMLСтрока", ДанныеОперации.РезультатXML);
Если ДанныеОперации.Свойство("ДополнительныеПараметры") Тогда
РезультатВыполнения.Вставить("ДополнительныеПараметры", ДанныеОперации.ДополнительныеПараметры);
КонецЕсли;
ПослеЗакрытияКассовойСмены(ПараметрыПодключения, РезультатВыполнения);
ИначеЕсли Команда = "OpenShift" Тогда
РезультатВыполнения.Вставить("НомерСменыККТ" , ДанныеОперации.НомерСменыККТ);
РезультатВыполнения.Вставить("НомерЧекаККТ" , ДанныеОперации.НомерЧекаККТ);
РезультатВыполнения.Вставить("СтатусСмены" , ДанныеОперации.СтатусСмены);
РезультатВыполнения.Вставить("КассоваяСмена" , ДанныеОперации.КассоваяСмена);
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ФискальныеДанныеСтруктура = ПолучитьПараметрыСменыИзXMLПакета(ДанныеОперации.РезультатXML, РевизияИнтерфейса);
РезультатВыполнения.НомерСменыККТ = ФискальныеДанныеСтруктура.НомерСменыККТ;
РезультатВыполнения.НомерЧекаККТ = ФискальныеДанныеСтруктура.НомерЧекаККТ;
РезультатВыполнения.СтатусСмены = ФискальныеДанныеСтруктура.СтатусСмены;
Иначе // Версия стандарта 2.2 и выше (ОФД 1.05)
ФискальныеДанныеСтруктура = ПолучитьПараметрыСменыИзXMLПакета(ДанныеОперации.РезультатXML, РевизияИнтерфейса);
ФискальныеДанныеСтруктура.НомерСменыККТ = ДанныеОперации.НомерСменыККТ;
ФискальныеДанныеСтруктура.СтатусСмены = 2; // Открыта
КонецЕсли;
РезультатВыполнения.Вставить("ФискальныеДанныеСтруктура", ФискальныеДанныеСтруктура);
РезультатВыполнения.Вставить("ФискальныеДанныеXMLСтрока", ДанныеОперации.РезультатXML);
Если ДанныеОперации.Свойство("ДополнительныеПараметры") Тогда
РезультатВыполнения.Вставить("ДополнительныеПараметры", ДанныеОперации.ДополнительныеПараметры);
КонецЕсли;
Если ДанныеОперации.Свойство("ПараметрыККТ") И Не ПустаяСтрока(ДанныеОперации.ПараметрыККТ) Тогда
ПараметрыККТ = ПараметрыИзXMLПакетаККТ(ДанныеОперации.ПараметрыККТ, РевизияИнтерфейса);
СохранитьПараметрыРегистрацииУстройства(ПараметрыПодключения.ИдентификаторУстройства, ПараметрыККТ);
ВедетсяУчетПродукцииИСМП = МенеджерОборудования.ВедетсяУчетПродукцииИСМП();
Если ПараметрыККТ.Свойство("ВерсияФФДККТ") И ПараметрыККТ.ВерсияФФДККТ <> "1.2" Тогда
// Письмо Федеральной налоговой службы от 28 октября 2021 г. № ПА-4-20/15207@ О переходе ККТ на ФФД 1.2
Если ВедетсяУчетПродукцииИСМП Тогда
ТекстСообщения = НСтр("ru='При осуществлении расчетов за маркированные товары необходимо перейти на ККТ с ФФД версии 1.2 в срок до 01.02.2022.'") + Символы.ПС
+ НСтр("ru='Письмо ФНС от 28 октября 2021 г. № ПА-4-20/15207@ «О переходе ККТ на ФФД 1.2»'");
ОбщегоНазначенияБПО.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
ИначеЕсли ПараметрыККТ.Свойство("ВерсияФФДККТ") И ПараметрыККТ.ВерсияФФДККТ = "1.2" И ВедетсяУчетПродукцииИСМП Тогда
Если НЕ ПараметрыККТ.ПродажаМаркированныхТоваров Тогда
ТекстСообщения = НСтр("ru='ККТ не зарегистрирована для работы с маркированной продукцией.'") + Символы.ПС
+ НСтр("ru='Необходимо провести перерегистрацию ККТ.'");
ОбщегоНазначенияБПО.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецЕсли;
Иначе
ПараметрыККТ = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыРегистрацииККТ();
КонецЕсли;
РезультатВыполнения.Вставить("ПараметрыККТ" , ПараметрыККТ);
ПослеОткрытияКассовойСмены(ПараметрыПодключения, РезультатВыполнения);
ИначеЕсли Команда = "Encash" Тогда
Попытка
// Записать фискальную операцию.
ЗаписатьФискальнуюОперацию(ДанныеОперации);
Исключение
РезультатВыполнения.ОперацияЗаписана = Ложь;
КонецПопытки;
ИначеЕсли Команда = "GetDataKKT" Тогда
ПараметрыККТ = ПараметрыИзXMLПакетаККТ(РезультатВыполнения.ПараметрыККТXML, РевизияИнтерфейса);
РезультатВыполнения.Вставить("ПараметрыККТ" , ПараметрыККТ);
СохранитьПараметрыРегистрацииУстройства(ПараметрыПодключения.ИдентификаторУстройства, ПараметрыККТ);
ИначеЕсли Команда = "GetCurrentStatus" Тогда
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ФискальныеДанныеСтруктура = ПолучитьПараметрыСменыИзXMLПакета(ДанныеОперации.РезультатXML, РевизияИнтерфейса);
НомерСменыККТ = ФискальныеДанныеСтруктура.НомерСменыККТ;
НомерЧекаККТ = ФискальныеДанныеСтруктура.НомерЧекаККТ;
СтатусСмены = ФискальныеДанныеСтруктура.СтатусСмены;
Иначе
ФискальныеДанныеСтруктура = ПолучитьПараметрыСостоянияИзXMLПакета(ДанныеОперации.РезультатXML);
НомерСменыККТ = ДанныеОперации.НомерСменыККТ;
НомерЧекаККТ = ДанныеОперации.НомерЧекаККТ;
СтатусСмены = ДанныеОперации.СтатусСмены;
КонецЕсли;
РезультатВыполнения.Вставить("НомерСменыККТ" , НомерСменыККТ);
РезультатВыполнения.Вставить("НомерЧекаККТ" , НомерЧекаККТ);
РезультатВыполнения.Вставить("СтатусСмены", СтатусСмены);
РезультатВыполнения.Вставить("ФискальныеДанные", ФискальныеДанныеСтруктура);
ИначеЕсли Команда = "RequestKM" Тогда
// ++ Локализация
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
ДанныеСтруктура = МодульМенеджерОборудованияМаркировка.ПолучитьРезультатыЗапросаКМИзXMLПакета(РезультатВыполнения.РезультатXML);
РезультатВыполнения.Вставить("КодМаркировкиПроверен", ДанныеСтруктура.КодМаркировкиПроверен);
РезультатВыполнения.Вставить("РезультатПроверки", ДанныеСтруктура.РезультатПроверки);
КонецЕсли;
// -- Локализация
ИначеЕсли Команда = "GetProcessingKMResult" Или Команда = "RequestKMKMNoWait" Тогда
// ++ Локализация
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
РезультатВыполнения = МодульМенеджерОборудованияМаркировка.ПолучитьРезультатыОИСМКМИзXMLПакета(ДанныеОперации.РезультатXML, РезультатВыполнения);
РезультатВыполнения.СтатусРезультата = МодульМенеджерОборудованияМаркировка.СтатусРезультатаЗапросаКМПоКоду(ДанныеОперации.СтатусРезультатаКод);
РезультатВыполнения.Вставить("РезультатXML", ДанныеОперации.РезультатXML);
Попытка
Если РезультатВыполнения.Свойство("ЗапросКМ") И РезультатВыполнения.ЗапросКМ <> Неопределено Тогда
СтатусРезультатаКод = ДанныеОперации.СтатусРезультатаКод;
Если СтатусРезультатаКод = 0 Или СтатусРезультатаКод = 2 Тогда
РезультатВыполненияЗапросаКМ = РезультатВыполнения.ЗапросКМ.РезультатВыполнения;
ДанныеОперацииЗапросаКМ = РезультатВыполнения.ЗапросКМ.ДанныеОперации;
ПараметрыЗаписи = МодульМенеджерОборудованияМаркировка.ПараметрыЗаписиРезультатаПроверкиКМ();
ПараметрыЗаписи.Ключ.ИдентификаторСессии = РезультатВыполненияЗапросаКМ.ИдентификаторСессии;
ПараметрыЗаписи.Ключ.ИдентификаторЗапроса = РезультатВыполненияЗапросаКМ.ИдентификаторЗапроса;
ПараметрыЗаписи.Результат = РезультатВыполнения.Результат;
ПараметрыЗаписи.ЗапросКМ = ДанныеОперацииЗапросаКМ;
ПараметрыЗаписи.ФлагиПроверкиОИСМ = РезультатВыполнения.РезультатПроверкиОИСМПредставление;
ПараметрыЗаписи.ЛокальныйОтветXML = РезультатВыполненияЗапросаКМ.РезультатXML;
ПараметрыЗаписи.УдаленныйОтветXML = РезультатВыполнения.РезультатXML;
ПараметрыЗаписи.ПокупкаПодтверждена = Истина;
МассивПараметровЗаписей = Новый Массив();
МассивПараметровЗаписей.Добавить(ПараметрыЗаписи);
МодульМенеджерОборудованияМаркировка.ДобавитьРезультатыПроверкиКодаМаркировкиВРегистр(МассивПараметровЗаписей);
КонецЕсли;
КонецЕсли;
Исключение
ОбщегоНазначенияБПО.ЗаписатьОшибкуВЖурналРегистрации(
НСтр("ru = 'Ошибка записи в журнал проверки кода маркировки.'"),
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
// -- Локализация
ИначеЕсли Команда = "CheckKM" Тогда
// ++ Локализация
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
Если Не РезультатВыполнения.Результат Тогда
Возврат;
КонецЕсли;
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
МассивПараметровЗаписей = Новый Массив();
МассивДанныхОбмена = Новый Массив();
Для каждого Результат Из РезультатВыполнения.РезультатыОпераций Цикл
Параметры = Новый Структура();
МодульМенеджерОборудованияМаркировка.ПолучитьРезультатыОИСМКМИзXMLПакета(Результат.Служебная.УдаленныйОтветXML, Параметры);
Результат.Вставить("РезультатПроверкиСведенийОТоваре", Параметры.РезультатПроверкиСведенийОТоваре);
Результат.Вставить("РезультатПроверкиСведенийОТовареПФ", Параметры.РезультатПроверкиСведенийОТовареПФ);
Результат.Вставить("СтатусТовара", Параметры.СтатусТовара);
// для обратной совместимости
ДанныеСтруктура = МодульМенеджерОборудованияМаркировка.ПолучитьРезультатыЗапросаКМИзXMLПакета(Результат.Служебная.ЛокальныйОтветXML);
Результат.Вставить("КодМаркировкиПроверен", ДанныеСтруктура.КодМаркировкиПроверен);
Результат.Вставить("РезультатПроверки", ДанныеСтруктура.РезультатПроверки);
Результат.Вставить("РезультатПроверкиОИСМ", Параметры.РезультатПроверкиОИСМ);
Результат.Вставить("КодРезультатаПроверкиОИСМ", Параметры.КодРезультатаПроверкиОИСМ);
Результат.Вставить("РезультатПроверкиОИСМПредставление", Параметры.РезультатПроверкиОИСМПредставление);
Результат.Вставить("КодОбработкиЗапроса", Параметры.КодОбработкиЗапроса);
ПараметрыЗаписи = МодульМенеджерОборудованияМаркировка.ПараметрыЗаписиРезультатаПроверкиКМ();
ПараметрыЗаписи.Ключ.ИдентификаторСессии = РезультатВыполнения.ИдентификаторСессии;
ПараметрыЗаписи.Ключ.ИдентификаторЗапроса = Результат.ИдентификаторЗапроса;
ПараметрыЗаписи.Результат = Результат.Результат;
ПараметрыЗаписи.ЗапросКМ = Результат.Служебная.ЗапросКМ;
ПараметрыЗаписи.ФлагиПроверкиОИСМ = Параметры.РезультатПроверкиОИСМПредставление;
ПараметрыЗаписи.ЛокальныйОтветXML = Результат.Служебная.ЛокальныйОтветXML;
ПараметрыЗаписи.УдаленныйОтветXML = Результат.Служебная.УдаленныйОтветXML;
ПараметрыЗаписи.ПокупкаПодтверждена = Результат.Служебная.ПокупкаПодтверждена;
МассивПараметровЗаписей.Добавить(ПараметрыЗаписи);
ДанныеОбмена = Новый Структура();
ДанныеОбмена.Вставить("ЗапросКМ", ПараметрыЗаписи.ЗапросКМ.ПараметрыXML);
ДанныеОбмена.Вставить("ЛокальныйОтветКМ", ПараметрыЗаписи.ЛокальныйОтветXML);
ДанныеОбмена.Вставить("УдаленныйОтветКМ", ПараметрыЗаписи.УдаленныйОтветXML);
МассивДанныхОбмена.Добавить(ДанныеОбмена);
КонецЦикла;
МенеджерОборудованияВызовСервераПереопределяемый.ПослеПроверкиКодовМаркировки(МассивДанныхОбмена);
МодульМенеджерОборудованияМаркировка.ДобавитьРезультатыПроверкиКодаМаркировкиВРегистр(МассивПараметровЗаписей);
КонецЕсли;
// -- Локализация
ИначеЕсли Команда = "OperationFN" Тогда
Если ДанныеОперации.Свойство("ПараметрыККТ") И Не ПустаяСтрока(ДанныеОперации.ПараметрыККТ) Тогда
ПараметрыККТ = ПараметрыИзXMLПакетаККТ(ДанныеОперации.ПараметрыККТ, РевизияИнтерфейса);
РезультатВыполнения.Вставить("ПараметрыККТ" , ПараметрыККТ);
СохранитьПараметрыРегистрацииУстройства(ПараметрыПодключения.ИдентификаторУстройства, ПараметрыККТ);
КонецЕсли;
КонецЕсли
КонецПроцедуры
Функция ПередОткрытиемКассовойСмены(ПараметрыПодключения, ДанныеОперации) Экспорт
Результат = Истина;
Если ИспользуетсяКассовыеСмены() Тогда
ОписаниеКассовойСмены = ОписаниеПоследнейКассовойСмены(ПараметрыПодключения.ИдентификаторУстройства);
Если ОписаниеКассовойСмены <> Неопределено И ОписаниеКассовойСмены.Статус = Перечисления.СтатусыКассовойСмены.Открыта Тогда
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = НСтр("ru='Кассовая смена уже открыта.'");
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПередЗакрытиемКассовойСмены(ПараметрыПодключения, ДанныеОперации) Экспорт
Результат = Истина;
Если ИспользуетсяКассовыеСмены() Тогда
ОписаниеКассовойСмены = ОписаниеПоследнейКассовойСмены(ПараметрыПодключения.ИдентификаторУстройства);
Если ОписаниеКассовойСмены = Неопределено Тогда
ДанныеОперации.КассоваяСмена = НоваяКассоваяСмена(ПараметрыПодключения.ИдентификаторУстройства, ДанныеОперации);
ИначеЕсли ОписаниеКассовойСмены.Статус = Перечисления.СтатусыКассовойСмены.Открыта Тогда
ДанныеОперации.КассоваяСмена = ОписаниеКассовойСмены.КассоваяСмена;
Иначе
ДанныеОперации.Результат = Ложь;
ДанныеОперации.ТекстОшибки = НСтр("ru='Кассовая смена уже закрыта.'");
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПослеОткрытияКассовойСмены(ПараметрыПодключения, РезультатВыполнения) Экспорт
Результат = Истина;
КассоваяСмена = НоваяКассоваяСмена(ПараметрыПодключения.ИдентификаторУстройства, РезультатВыполнения);
Если Не ЗначениеЗаполнено(РезультатВыполнения.КассоваяСмена) Тогда
РезультатВыполнения.КассоваяСмена = КассоваяСмена;
КонецЕсли;
МенеджерОборудованияВызовСервераПереопределяемый.ПослеОткрытияКассовойСмены(ПараметрыПодключения.ИдентификаторУстройства, РезультатВыполнения);
Возврат Результат;
КонецФункции
Функция ПослеЗакрытияКассовойСмены(ПараметрыПодключения, РезультатВыполнения) Экспорт
Результат = Истина;
ЗакрытьКассовуюСмену(РезультатВыполнения);
МенеджерОборудованияВызовСервераПереопределяемый.ПослеЗакрытияКассовойСмены(ПараметрыПодключения.ИдентификаторУстройства, РезультатВыполнения);
Возврат Результат;
КонецФункции
Функция XMLПакетИнфоКвитанции(Данные, ШиринаСтроки, РевизияИнтерфейса) Экспорт
Шаблон = ШаблоныФискальныхДокументов.ШаблонИнфоКвитанция(ШиринаСтроки, Данные);
Текст = ШаблоныФискальныхДокументов.ВывестиКакТекст(Шаблон);
Возврат ОборудованиеЧекопечатающиеУстройства.ПолучитьXMLПакетДляТекста(Текст, РевизияИнтерфейса);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ФормированиеДанныхККТ
Процедура ЗаполнитьДанныеПлатежныхОпераций(ОбщиеПараметры)
Если ОбщегоНазначенияБПО.ИспользуетсяПлатежныеСистемы() Тогда
ДополнительныйРеквизитПользователя = ОбщиеПараметры.ДополнительныйРеквизитПользователя;
МодульОборудованиеПлатежныеСистемы = ОбщегоНазначенияБПО.ОбщийМодуль("ОборудованиеПлатежныеСистемы");
ПлатежныеОперации = МодульОборудованиеПлатежныеСистемы.ДанныеПлатежныхОпераций(Неопределено, ОбщиеПараметры.ДокументОснование);
Если ПлатежныеОперации.Количество() > 0 Тогда
Операция = ПлатежныеОперации[0]; // Первая операция, в рамках пилотного проекта.
// Префикс «epay» как признак того, что тег 1086 содержит специфичную для передачи информацию по безналичному способу расчета;
Если НЕ ПустаяСтрока(ДополнительныйРеквизитПользователя.Наименование) Тогда
ДополнительныйРеквизитПользователя.Наименование = Строка(ДополнительныйРеквизитПользователя.Наименование) + ";";
КонецЕсли;
ДополнительныйРеквизитПользователя.Наименование = Строка(ДополнительныйРеквизитПользователя.Наименование) + "epay";
// В теге 1086 блоки информации разделяются символом «;»
ДатаВремяТранзакции = Формат(Операция.ДатаВремяТранзакции - Дата(1970,1,1,1,0,0), "ЧГ=0"); // Дата и время в формате UnixTime)
РеквизитЗначение = СтрШаблон("date=%1&rrn=%2&tid=%3&ps=%4&acq=%5&auth=%6&uuid=%7",
ДатаВремяТранзакции, // Дата и время инициализации транзакции, содержит локальную дату и время инициализации транзакции UnixTime
Операция.СсылочныйНомер, // RNN - Идентификатор банковской транзакции.
Операция.ИдентификаторТерминала, // TID - Уникальный идентификационный номер POS-терминала.
Операция.ИдентификаторПлатежнойСистемы, // PS - Уникальный идентификатор платежной системы, через которую проводилась операция.
Операция.ИдентификаторБанкаЭквайера, // ACQ - Уникальный идентификатор банка-эквайера используемый на POS-терминале.
Операция.КодАвторизации, // AUTH - Код авторизации, который присваивается банком-эмитентом.
Операция.ИдентификаторФискальнойОперации); // UUID - Уникальный идентификатор банковской транзакции, формируемый на стороне банка-эмитента.
Если НЕ ПустаяСтрока(ДополнительныйРеквизитПользователя.Значение) Тогда
ДополнительныйРеквизитПользователя.Значение = Строка(ДополнительныйРеквизитПользователя.Значение) + ";";
КонецЕсли;
ДополнительныйРеквизитПользователя.Значение = Строка(ДополнительныйРеквизитПользователя.Значение) + РеквизитЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Заменяет типы оплаты при коррекции, используется только при ФФД 1.05
Процедура ЗаменитьТипыОплатыПриКоррекции(ОбщиеПараметры, ОбщиеПараметрыСторно = Неопределено)
// Необходимо изменить вид оплат на «ВстречноеПредоставление»
Для Каждого ЭлементМассива Из ОбщиеПараметры.ТаблицаОплат Цикл
ЭлементМассива.ТипОплаты = Перечисления.ТипыОплатыККТ.ВстречноеПредоставление;
КонецЦикла;
Если ОбщиеПараметрыСторно = Неопределено Тогда
Возврат;
КонецЕсли;
// Необходимо изменить вид оплат на «ВстречноеПредоставление»
Для Каждого ЭлементМассива Из ОбщиеПараметрыСторно.ТаблицаОплат Цикл
ЭлементМассива.ТипОплаты = Перечисления.ТипыОплатыККТ.ВстречноеПредоставление;
КонецЦикла;
КонецПроцедуры
Процедура ПодготовитьЧекКоррекции(ОбщиеПараметры, ОбщиеПараметрыСторно, ВерсияФФДККТ11)
// Меняем признак типа расчета на противоположный.
Если ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств Тогда
ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств;
ИначеЕсли ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств Тогда
ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств;
ИначеЕсли ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.РасходДенежныхСредств Тогда
ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратРасходаДенежныхСредств;
ИначеЕсли ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратРасходаДенежныхСредств Тогда
ОбщиеПараметрыСторно.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.РасходДенежныхСредств;
КонецЕсли;
КонецПроцедуры
// ++ Локализация
Процедура ЗаписатьДанныеКоррекции(ЗаписьXML, ДанныеКоррекции)
ЗаписьXML.ЗаписатьНачалоЭлемента("CorrectionData");
ТипКоррекции = ?(ПустаяСтрока(ДанныеКоррекции.ТипКоррекции), 0, ДанныеКоррекции.ТипКоррекции);
ЗаписьXML.ЗаписатьАтрибут("Type", XMLСтрока(ТипКоррекции));
Если Не ПустаяСтрока(ДанныеКоррекции.ДатаКоррекции) Тогда
ЗаписьXML.ЗаписатьАтрибут("Date", XMLСтрока(НачалоДня(ДанныеКоррекции.ДатаКоррекции)));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеКоррекции.НомерПредписания) Тогда
ЗаписьXML.ЗаписатьАтрибут("Number", XMLСтрока(ДанныеКоррекции.НомерПредписания));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеКоррекции.ОписаниеКоррекции) Тогда
ЗаписьXML.ЗаписатьАтрибут("Description", XMLСтрока(ДанныеКоррекции.ОписаниеКоррекции));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
// Записывает данные агента в XML файл
//
// Параметры:
// ЗаписьXML - ЗаписьXML
// ДанныеАгента - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеАгента
// РевизияИнтерфейса - Число
//
Процедура ЗаписатьДанныеАгента(ЗаписьXML, ДанныеАгента, РевизияИнтерфейса = 0)
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьXML.ЗаписатьНачалоЭлемента("AgentData");
Если Не ПустаяСтрока(ДанныеАгента.ПлатежныйАгент.Операция) Тогда // Операция платежного агента
ЗаписьXML.ЗаписатьАтрибут("AgentOperation", XMLСтрока(ДанныеАгента.ПлатежныйАгент.Операция));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ПлатежныйАгент.Телефон) Тогда // Телефон платежного агента
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеАгента.ПлатежныйАгент.Телефон);
ЗаписьXML.ЗаписатьАтрибут("AgentPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПоПриемуПлатежей.Телефон) Тогда // Телефон оператора по приему платежей
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеАгента.ОператорПоПриемуПлатежей.Телефон);
ЗаписьXML.ЗаписатьАтрибут("PaymentProcessorPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.Телефон) Тогда // Телефон оператора перевода
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеАгента.ОператорПеревода.Телефон);
ЗаписьXML.ЗаписатьАтрибут("AcquirerOperatorPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.Наименование) Тогда // Наименование оператора перевода
ЗаписьXML.ЗаписатьАтрибут("AcquirerOperatorName" , XMLСтрока(ДанныеАгента.ОператорПеревода.Наименование));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.Адрес) Тогда // Адрес оператора перевода
ЗаписьXML.ЗаписатьАтрибут("AcquirerOperatorAddress" , XMLСтрока(ДанныеАгента.ОператорПеревода.Адрес));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.ИНН) Тогда // ИНН оператора перевода
ЗаписьXML.ЗаписатьАтрибут("AcquirerOperatorINN" , XMLСтрока(ДанныеАгента.ОператорПеревода.ИНН));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента("AgentData");
Если Не ПустаяСтрока(ДанныеАгента.ПлатежныйАгент.Операция) Тогда
ЗаписьXML.ЗаписатьАтрибут("PayingAgentOperation", XMLСтрока(ДанныеАгента.ПлатежныйАгент.Операция));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ПлатежныйАгент.Телефон) Тогда
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеАгента.ПлатежныйАгент.Телефон);
ЗаписьXML.ЗаписатьАтрибут("PayingAgentPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПоПриемуПлатежей.Телефон) Тогда
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеАгента.ОператорПоПриемуПлатежей.Телефон);
ЗаписьXML.ЗаписатьАтрибут("ReceivePaymentsOperatorPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.Телефон) Тогда
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеАгента.ОператорПеревода.Телефон);
ЗаписьXML.ЗаписатьАтрибут("MoneyTransferOperatorPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.Наименование) Тогда
ЗаписьXML.ЗаписатьАтрибут("MoneyTransferOperatorName", XMLСтрока(ДанныеАгента.ОператорПеревода.Наименование));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.Адрес) Тогда
ЗаписьXML.ЗаписатьАтрибут("MoneyTransferOperatorAddress", XMLСтрока(ДанныеАгента.ОператорПеревода.Адрес));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеАгента.ОператорПеревода.ИНН) Тогда
ЗаписьXML.ЗаписатьАтрибут("MoneyTransferOperatorVATIN" , XMLСтрока(ДанныеАгента.ОператорПеревода.ИНН));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецПроцедуры
// Записывает данные поставщика в XML файл
//
// Параметры:
// ЗаписьXML - ЗаписьXML
// ДанныеПоставщика - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеПоставщика
// РевизияИнтерфейса - Число
//
Процедура ЗаписатьДанныеПоставщика(ЗаписьXML, ДанныеПоставщика, РевизияИнтерфейса = 0)
Если РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьXML.ЗаписатьНачалоЭлемента("VendorData");
Если Не ПустаяСтрока(ДанныеПоставщика.Телефон) Тогда // Телефон поставщика
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеПоставщика.Телефон);
ЗаписьXML.ЗаписатьАтрибут("VendorPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеПоставщика.Наименование) Тогда // Наименование поставщика
ЗаписьXML.ЗаписатьАтрибут("VendorName", XMLСтрока(ДанныеПоставщика.Наименование));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеПоставщика.ИНН) Тогда // ИНН поставщика
ЗаписьXML.ЗаписатьАтрибут("VendorINN", XMLСтрока(ДанныеПоставщика.ИНН));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента("PurveyorData");
Если Не ПустаяСтрока(ДанныеПоставщика.Телефон) Тогда
Телефон = МенеджерОборудованияКлиентСервер.АбонентскийНомерФорматФФД(ДанныеПоставщика.Телефон);
ЗаписьXML.ЗаписатьАтрибут("PurveyorPhone", Телефон);
КонецЕсли;
Если Не ПустаяСтрока(ДанныеПоставщика.Наименование) Тогда
ЗаписьXML.ЗаписатьАтрибут("PurveyorName", XMLСтрока(ДанныеПоставщика.Наименование));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеПоставщика.ИНН) Тогда
ЗаписьXML.ЗаписатьАтрибут("PurveyorVATIN", XMLСтрока(ДанныеПоставщика.ИНН));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьДополнительныйРеквизитПользователя(ЗаписьXML, ДополнительныйРеквизитПользователя);
Если ПустаяСтрока(ДополнительныйРеквизитПользователя.Наименование)
И ПустаяСтрока(ДополнительныйРеквизитПользователя.Значение) Тогда
Возврат;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("UserAttribute");
Если Не ПустаяСтрока(ДополнительныйРеквизитПользователя.Наименование) Тогда // Наименование дополнительного реквизита пользователя.
ЗаписьXML.ЗаписатьАтрибут("Name" , XMLСтрока(ДополнительныйРеквизитПользователя.Наименование));
КонецЕсли;
Если Не ПустаяСтрока(ДополнительныйРеквизитПользователя.Значение) Тогда // Значение дополнительного реквизита пользователя.
ЗаписьXML.ЗаписатьАтрибут("Value", XMLСтрока(ДополнительныйРеквизитПользователя.Значение));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Процедура ЗаписатьОперационныйРеквизит(ЗаписьXML, ОперационныйРеквизит)
ЗаписьXML.ЗаписатьНачалоЭлемента("OperationalAttribute");
Если Не ПустаяСтрока(ОперационныйРеквизит.ДатаВремяОперации) Тогда
ЗаписьXML.ЗаписатьАтрибут("DateTime", XMLСтрока(ОперационныйРеквизит.ДатаВремяОперации));
КонецЕсли;
Если Не ПустаяСтрока(ОперационныйРеквизит.ИдентификаторОперации) Тогда
ЗаписьXML.ЗаписатьАтрибут("OperationID", XMLСтрока(ОперационныйРеквизит.ИдентификаторОперации));
КонецЕсли;
Если Не ПустаяСтрока(ОперационныйРеквизит.ДанныеОперации) Тогда
ЗаписьXML.ЗаписатьАтрибут("OperationData", XMLСтрока(ОперационныйРеквизит.ДанныеОперации));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Процедура ЗаписатьОтраслевойРеквизит(ЗаписьXML, ОтраслевойРеквизит)
ЗаписьXML.ЗаписатьНачалоЭлемента("IndustryAttribute");
Если Не ПустаяСтрока(ОтраслевойРеквизит.ИдентификаторФОИВ) Тогда
ЗаписьXML.ЗаписатьАтрибут("IdentifierFOIV", XMLСтрока(ОтраслевойРеквизит.ИдентификаторФОИВ));
КонецЕсли;
Если Не ПустаяСтрока(ОтраслевойРеквизит.ДатаДокументаОснования) Тогда
// АПК: 1367-выкл, АПК: 335-выкл особенность локального законодательства
ДатаДокументаОснования = Формат(ОтраслевойРеквизит.ДатаДокументаОснования, "ДФ=""дд.ММ.гггг""");
// АПК: 1367-вкл, АПК: 335-вкл
ЗаписьXML.ЗаписатьАтрибут("DocumentDate", ДатаДокументаОснования);
КонецЕсли;
Если Не ПустаяСтрока(ОтраслевойРеквизит.НомерДокументаОснования) Тогда
ЗаписьXML.ЗаписатьАтрибут("DocumentNumber", XMLСтрока(ОтраслевойРеквизит.НомерДокументаОснования));
КонецЕсли;
Если Не ПустаяСтрока(ОтраслевойРеквизит.ЗначениеРеквизита) Тогда
ЗаписьXML.ЗаписатьАтрибут("AttributeValue", XMLСтрока(ОтраслевойРеквизит.ЗначениеРеквизита));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Процедура ЗаписатьСведенияОПокупателе(ЗаписьXML, ОбщиеПараметры, ПерсональныеДанные = Неопределено, ТипПерсональныхДанных = Неопределено);
СведенияОПокупателе = ОбщиеПараметры.СведенияОПокупателе;
Покупатель = СведенияОПокупателе.Покупатель;
Если ПустаяСтрока(Покупатель) Тогда
Покупатель = ОбщиеПараметры.Получатель;
КонецЕсли;
Если ПерсональныеДанные <> Неопределено И ТипПерсональныхДанных <> Неопределено И ТипПерсональныхДанных = Перечисления.ТипыПерсональныхДанныхККТ.ИНН Тогда
ПокупательИНН = ПерсональныеДанные.ИНН
Иначе
ПокупательИНН = СведенияОПокупателе.ПокупательИНН;
КонецЕсли;
Если ПустаяСтрока(ПокупательИНН) Тогда
ПокупательИНН = ОбщиеПараметры.ПолучательИНН;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("CustomerDetail");
Если Не ПустаяСтрока(Покупатель) Тогда
ЗаписьXML.ЗаписатьАтрибут("Info", XMLСтрока(Покупатель));
КонецЕсли;
Если Не ПустаяСтрока(ПокупательИНН) Тогда
ЗаписьXML.ЗаписатьАтрибут("INN", XMLСтрока(ПокупательИНН));
КонецЕсли;
Если Не ПустаяСтрока(СведенияОПокупателе.ПокупательАдрес) Тогда
ЗаписьXML.ЗаписатьАтрибут("Address", XMLСтрока(СведенияОПокупателе.ПокупательАдрес));
КонецЕсли;
Если ПерсональныеДанные <> Неопределено И ТипПерсональныхДанных <> Неопределено И ТипПерсональныхДанных = Перечисления.ТипыПерсональныхДанныхККТ.ПаспортныеДанные Тогда
Если Не ПустаяСтрока(ПерсональныеДанные.Гражданство) Тогда
ЗаписьXML.ЗаписатьАтрибут("Citizenship", XMLСтрока(ПерсональныеДанные.Гражданство));
КонецЕсли;
Если Не ПустаяСтрока(ПерсональныеДанные.ВидДокумента) Тогда
ВидДокумента = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодВидДокументаУдостоверяющегоЛичность(ПерсональныеДанные.ВидДокумента);
ЗаписьXML.ЗаписатьАтрибут("DocumentTypeCode", XMLСтрока(ВидДокумента));
КонецЕсли;
Если Не ПустаяСтрока(ПерсональныеДанные.ДанныеДокумента) Тогда
ЗаписьXML.ЗаписатьАтрибут("DocumentData", XMLСтрока(ПерсональныеДанные.ДанныеДокумента));
КонецЕсли;
Если Не ПустаяСтрока(ПерсональныеДанные.ДатаРождения) Тогда
// АПК: 1367-выкл, АПК: 335-выкл особенность локального законодательства
ДатаРождения = Формат(ПерсональныеДанные.ДатаРождения, "ДФ=""дд.ММ.гггг""");
// АПК: 1367-вкл, АПК: 335-вкл
ЗаписьXML.ЗаписатьАтрибут("DateOfBirth", ДатаРождения);
КонецЕсли;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
// Возвращает представление ставки НДС для драйвера
// Параметры:
// СтавкаНДС - Число - Ставка НДС
// РевизияИнтерфейса - Число - Ревизия интерфейса
//
Функция ПредставлениеСтавкиНДС(СтавкаНДС, РевизияИнтерфейса)
Если НЕ ПустаяСтрока(СтавкаНДС) Тогда
// В случае не готовности ККТ для поддержки новых ставок можно продолжать пробивать чеки без НДС
Если РевизияИнтерфейса < 4004 Тогда
Если СтавкаНДС = 7 Или СтавкаНДС = 5 Или СтавкаНДС = 105 Или СтавкаНДС = 107 Тогда
ЗначениеСтавкаНДС = "none";
Возврат ЗначениеСтавкаНДС;
КонецЕсли;
КонецЕсли;
// Ревизия интерфейса 4004 и вышы
Если СтавкаНДС > 100 Тогда
ЗначениеСтавкаНДС = СтрШаблон("%1/%2", СтавкаНДС - 100, СтавкаНДС);
Иначе
ЗначениеСтавкаНДС = СтавкаНДС;
КонецЕсли;
Иначе
ЗначениеСтавкаНДС = "none";
КонецЕсли;
Возврат ЗначениеСтавкаНДС;
КонецФункции
// Возвращает ставка НДС по представлению
// Параметры:
// ПредставлениеСтавкаНДС - Строка - Ставка НДС
//
Функция СтавкаНДСПоПредставлению(ПредставлениеСтавкаНДС)
СтавкаНДС = Неопределено;
Если НЕ (ПустаяСтрока(ПредставлениеСтавкаНДС) Или ПредставлениеСтавкаНДС = "none") Тогда
СтавкиНДС = СтрРазделить(ПредставлениеСтавкаНДС, "/");
Если СтавкиНДС.Количество() = 1 Тогда
СтавкаНДС = Число(СтавкиНДС[0])
КонецЕсли;
Если СтавкиНДС.Количество() = 2 Тогда
СтавкаНДС = Число(СтавкиНДС[1]);
КонецЕсли;
КонецЕсли;
Возврат СтавкаНДС;
КонецФункции
// -- Локализация
Функция ЗначениеXMLАтрибута(ЧтениеXML, ИмяАтрибута, ДопИмяАтрибута = Неопределено, ЗначениеПоУмолчанию = Неопределено)
Результат = ЗначениеПоУмолчанию;
Если ЧтениеXML.ЗначениеАтрибута(ИмяАтрибута) <> Неопределено Тогда
Результат = ЧтениеXML.ЗначениеАтрибута(ИмяАтрибута);
ИначеЕсли НЕ ПустаяСтрока(ДопИмяАтрибута) И ЧтениеXML.ЗначениеАтрибута(ДопИмяАтрибута) <> Неопределено Тогда
Результат = ЧтениеXML.ЗначениеАтрибута(ДопИмяАтрибута);
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область КассоваяСмена
// Возвращает Истина, если используется подсистема "КассовыеСмены".
// Предназначена для реализации вызова необязательной подсистемы (условного вызова).
//
// У хотя бы одной "функциональной" подсистемы включен флажок "Включать в командный интерфейс".
//
// Возвращаемое значение:
// Булево.
//
Функция ИспользуетсяКассовыеСмены()
Возврат ОбщегоНазначенияБПО.ИспользуетсяКассоваяСмена();
КонецФункции
// Для внутреннего использования
//
Функция ПолучитьСтатусПоследнейСмены(ИдентификаторУстройства)
Если ИспользуетсяКассовыеСмены() Тогда
МодульКассовыеСмены = ОбщегоНазначенияБПО.ОбщийМодуль("КассовыеСмены");
Возврат МодульКассовыеСмены.СтатусПоследнейСмены(ИдентификаторУстройства);
Иначе
РезультатОперации = Новый Структура();
РезультатОперации.Вставить("Активна", Истина);
РезультатОперации.Вставить("Открыта", Истина);
РезультатОперации.Вставить("ТекущийНомерЧека", 1);
РезультатОперации.Вставить("КассоваяСмена", Неопределено);
Возврат РезультатОперации;
КонецЕсли;
КонецФункции
// Для внутреннего использования
//
Функция НоваяКассоваяСмена(ФискальноеУстройство, ДанныеОперации)
Если ИспользуетсяКассовыеСмены() Тогда
МодульКассовыеСмены = ОбщегоНазначенияБПО.ОбщийМодуль("КассовыеСмены");
Возврат МодульКассовыеСмены.НоваяКассоваяСмена(ФискальноеУстройство, ДанныеОперации);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Для внутреннего использования
//
Процедура ЗакрытьКассовуюСмену(ДанныеОперации)
Если ИспользуетсяКассовыеСмены() Тогда
МодульКассовыеСмены = ОбщегоНазначенияБПО.ОбщийМодуль("КассовыеСмены");
МодульКассовыеСмены.ЗакрытьКассовуюСмену(ДанныеОперации);
КонецЕсли;
КонецПроцедуры
// Для внутреннего использования
//
Функция ОписаниеПоследнейКассовойСмены(ФискальноеУстройство)
Если ИспользуетсяКассовыеСмены() Тогда
МодульКассовыеСмены = ОбщегоНазначенияБПО.ОбщийМодуль("КассовыеСмены");
Возврат МодульКассовыеСмены.ОписаниеПоследнейКассовойСмены(ФискальноеУстройство);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#КонецОбласти