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

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

1225 lines
86 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.

#Область СлужебныйПрограммныйИнтерфейс
// Генерирует шаблон универсального кассового чека, по данным операции фискализации чека,
// независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// ФискальнаяОперация - Структура.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонКассовыйЧек(Шаблон, Данные, ФискальнаяОперация, Параметры) Экспорт
ПодготовитьКассовыйЧек(Данные, ФискальнаяОперация, Параметры.ВерсияФФД);
ШаблонКассовыйЧекШапка(Шаблон, Данные, Параметры);
Для Каждого ПозицияЧека Из Данные.ПозицииЧека Цикл
Если ПозицияЧека.Свойство("ФискальнаяСтрока") Тогда
ШаблонКассовыйЧекПозицияЧекаФискальнаяСтрока(Шаблон, ПозицияЧека);
ИначеЕсли ПозицияЧека.Свойство("ТекстоваяСтрока") Тогда
ШаблонКассовыйЧекПозицияЧекаТекстоваяСтрока(Шаблон, ПозицияЧека);
ИначеЕсли ПозицияЧека.Свойство("ШтрихКод") Тогда
ШаблонКассовыйЧекПозицияЧекаШтрихкод(Шаблон, ПозицияЧека);
КонецЕсли;
КонецЦикла;
ШаблонКассовыйЧекПодвал(Шаблон, Данные, ФискальнаяОперация, Параметры);
КонецПроцедуры
// Генерирует шаблон универсального отчет об открытии смены, независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонОтчетОбОткрытииСмены(Шаблон, Данные, Параметры) Экспорт
ШаблонОтчет(Шаблон, Данные, Параметры, НСтр("ru='ОТКРЫТИЕ СМЕНЫ'"));
КонецПроцедуры
// Генерирует шаблон универсального отчет о закрытии смены, независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонОтчетОЗакрытииСмены(Шаблон, Данные, Параметры) Экспорт
ШаблонОтчет(Шаблон, Данные, Параметры, НСтр("ru='ОТЧЕТ С ГАШЕНИЕМ'"));
КонецПроцедуры
// Генерирует шаблон универсального отчет о текущем состоянии, независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонОтчетОТекущемСостоянии(Шаблон, Данные, Параметры) Экспорт
ШаблонОтчет(Шаблон, Данные, Параметры, НСтр("ru='ОТЧЕТ БЕЗ ГАШЕНИЯ'"));
КонецПроцедуры
// Генерирует шаблон универсального отчет о снятии наличных, независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонСнятиеНаличных(Шаблон, Данные, Параметры) Экспорт
ШаблонОперацияИнкассации(Шаблон, Данные, Параметры, НСтр("ru='ВЫЕМКА'"));
КонецПроцедуры
// Генерирует шаблон универсального отчета о внесении наличных, независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонВнесениеНаличных(Шаблон, Данные, Параметры) Экспорт
ШаблонОперацияИнкассации(Шаблон, Данные, Параметры, НСтр("ru='ВНЕСЕНИЕ'"));
КонецПроцедуры
// Генерирует шаблон инфо квитанции, независимого от локализации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - Структура
//
Процедура ШаблонИнфоКвитанция(Шаблон, Данные, Параметры) Экспорт
Модуль = ШаблоныФискальныхДокументов;
ФорматРазделитель = Модуль.ФорматРазделитель();
ФорматЦентр = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Центр);
ФорматПраво = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Право);
ФорматЛево = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Лево);
ФорматПоШирине = Модуль.ФорматСтрока(ГоризонтальноеПоложение.ПоШирине);
Модуль.ДобавитьСтроку (Шаблон, Параметры.Заголовок, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.НаименованиеОрганизации, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ИНН:'"), Данные.ИНН, ФорматЛево);
Модуль.ДобавитьКолонку(Шаблон, НСтр("ru='КПП:'"), Данные.КПП, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='КАССА:'"), Данные.НомерКассы, ФорматЛево);
Модуль.ДобавитьКолонку(Шаблон, НСтр("ru='СМЕНА:'"), Данные.НомерСмены, ФорматПраво);
ДатаВремя = Формат(ОбщегоНазначенияБПО.ДатаСеанса(), "ДФ=""дд.ММ.гггг ЧЧ:мм""");
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ЧЕК:'"), Данные.НомерЧека, ФорматЛево);
Модуль.ДобавитьКолонку(Шаблон, НСтр("ru='ДАТА:'"), ДатаВремя, ФорматПраво);
Если Не ПустаяСтрока(Данные.АдресЧека) Тогда
Модуль.ДобавитьСтроку(Шаблон, "|ШтрихКод|QR|" + Данные.АдресЧека, ФорматЛево);
КонецЕсли;
Модуль.ДобавитьСтроку(Шаблон, Данные.АдресЧека, ФорматЦентр);
Модуль.ДобавитьСтроку(Шаблон, Данные.ПодписьЧека, ФорматЦентр);
КонецПроцедуры
#Область ГенераторШаблона
// Создает строку символов заданного размера.
//
// Параметры:
// Размер - Число - размер строки которую нужно создать.
// Символ - Строка - символы которыми будет заполнен результат.
//
// Возвращаемое значение:
// Строка - строка символов заданного размера.
//
Функция СтрокаСимволов(Размер, Символ = " ") Экспорт
ПустаяСтрока = "";
ДлинаСимвола = СтрДлина(Символ);
Если ДлинаСимвола = 0 Тогда
Возврат ПустаяСтрока;
КонецЕсли;
КоличествоПодстрок = Цел(Размер / ДлинаСимвола)+1;
Для Номер = 1 По КоличествоПодстрок Цикл
ПустаяСтрока = ПустаяСтрока + Символ;
КонецЦикла;
Возврат Лев(ПустаяСтрока, Размер);
КонецФункции
// Добавляет строку в шаблон.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Заголовок - Строка - Заголовок который будет добавлено в шаблон.
// Значение - Произвольный - Значение которое будет добавлено в шаблон.
// Формат - см. ШаблоныФискальныхДокументов.НовыйФормат.
Процедура ДобавитьЭлементШаблона(Шаблон, Заголовок = "", Значение = Неопределено, Формат = Неопределено) Экспорт
Элемент = НовыйЭлементШаблона();
Если ЗначениеЗаполнено(Элемент.ЭлементXML) Тогда
Если ТипЗнч(Элемент.ЭлементXML) = Тип("Строка") Тогда
Элемент.ЭлементXML = Шаблон.ЭлементыXML.Получить(Элемент.ЭлементXML);
КонецЕсли;
КонецЕсли;
Шаблон.Элементы.Добавить(Элемент);
ДобавитьКолонкуЭлементаШаблона(Шаблон, Заголовок, Значение, Формат);
КонецПроцедуры
// Добавляет колонку в последнюю строку шаблона.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Заголовок - Строка.
// Значение - Произвольный.
// Формат - см. ШаблоныФискальныхДокументов.НовыйФормат.
//
Процедура ДобавитьКолонкуЭлементаШаблона(Шаблон, Заголовок = "", Значение = Неопределено, Формат = Неопределено) Экспорт
Элемент = Шаблон.Элементы[Шаблон.Элементы.ВГраница()];
Колонка = НоваяКолонкаЭлементаШаблона();
Колонка.Значение = Значение;
Колонка.Строка = Строка(Значение);
Колонка.Заголовок = Заголовок;
Колонка.ШиринаФормат = Формат.Ширина;
ЗаполнитьЗначенияСвойств(Колонка, Формат, , "Ширина");
// вычислить высоту штрихкода по умолчанию
Если ВРег(Формат.Тип) = "ШТРИХКОД" И Колонка.ШтрихкодВысота = 0 Тогда
ВысотаДвумерногоКода = 4;
ВысотаОдномерногоКода = 2;
Колонка.ШтрихкодВысота = ?(ВРег(Колонка.ШтрихкодТип) = "QR", ВысотаДвумерногоКода, ВысотаОдномерногоКода);
КонецЕсли;
Если Колонка.ПодавлятьПробелы Тогда
Колонка.Заголовок = СокрЛП(Колонка.Заголовок);
КонецЕсли;
Если СтрДлина(Колонка.Строка) > 0 Или Колонка.ВыводитьЗаголовок Тогда
Элемент.Колонки.Добавить(Колонка);
КонецЕсли;
КонецПроцедуры
// Вычисляет и устанавливает ширину колонок у переданного массива колонок.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// МассивКолонок - Массив из см. НоваяКолонкаЭлементаШаблона.
//
Процедура УстановитьШиринуКолонокЭлемента(Шаблон, МассивКолонок) Экспорт
ШиринаСтроки = Шаблон.ШиринаСтроки;
Если ШиринаСтроки = 0 Тогда
Возврат;
КонецЕсли;
ОбщаяШиринаКолонок = 0;
КоличествоКолонокСНулевойШириной = 0;
Для Каждого Колонка Из МассивКолонок Цикл
Если Колонка.Тип = "XML" Тогда
Продолжить;
КонецЕсли;
// вычислить заданную ширину колонок
Если Колонка.ШиринаФормат = "*" Тогда
// вычислить оптимальную ширину
Колонка.Ширина = Мин(ШиринаСтроки, СтрДлина(Колонка.Строка + Колонка.Заголовок));
ИначеЕсли СтрНайти(Колонка.ШиринаФормат, "%")>0 Тогда
// вычислить ширину в процентах
ШиринаВПроцентах = Число(Лев(Колонка.ШиринаФормат, СтрДлина(Колонка.ШиринаФормат)-1));
Колонка.Ширина = Цел(ШиринаСтроки / 100 * ШиринаВПроцентах);
Иначе
// установить ширину в символах
Колонка.Ширина = Число(Колонка.ШиринаФормат);
КонецЕсли;
// подготовить значения для расчета ширины у колонок с не заданной шириной
Если Колонка.Ширина = 0 Тогда
КоличествоКолонокСНулевойШириной = КоличествоКолонокСНулевойШириной + 1;
Иначе
ОбщаяШиринаКолонок = ОбщаяШиринаКолонок + Колонка.Ширина;
КонецЕсли;
КонецЦикла;
// установить ширину у колонок с не заданной шириной
НеИспользуемаяШирина = Макс(0, ШиринаСтроки - ОбщаяШиринаКолонок);
Если КоличествоКолонокСНулевойШириной>0 И НеИспользуемаяШирина>0 Тогда
ОбщаяШиринаКолонок = 0;
ШиринаКолонки = Цел(НеИспользуемаяШирина / КоличествоКолонокСНулевойШириной);
Для Каждого Колонка Из МассивКолонок Цикл
Если Колонка.Тип = "XML" Тогда
Продолжить;
КонецЕсли;
Если Колонка.Ширина = 0 Тогда
Колонка.Ширина = ШиринаКолонки;
КонецЕсли;
ОбщаяШиринаКолонок = ОбщаяШиринаКолонок + Колонка.Ширина;
КонецЦикла;
КонецЕсли;
// скорректировать первую колонку на погрешность округления
Если ОбщаяШиринаКолонок<ШиринаСтроки И МассивКолонок.Количество()>0 Тогда
МассивКолонок[0].Ширина = МассивКолонок[0].Ширина + (ШиринаСтроки - ОбщаяШиринаКолонок);
КонецЕсли;
КонецПроцедуры
// Формирует массив строк у элемента, колонки выводятся в соответствии с заданным форматированием.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Элемент - см. НовыйЭлементШаблона.
//
Процедура СформироватьСтрокуЭлементаШаблона(Шаблон, Элемент) Экспорт
Колонки = Элемент.Колонки;
Строки = Элемент.Строки;
ВыводЗавершен = Ложь;
Пока Не ВыводЗавершен Цикл
ПерваяСтрока = ?(Строки.Количество()=0, Истина, Ложь);
ВыводЗавершен = Истина;
СтрокаВывода = Новый Массив();
Позиция = 1;
Для Каждого Колонка Из Колонки Цикл // НоваяКолонкаЭлементаШаблона
Выравнивание = Колонка.Выравнивание;
Ширина = Колонка.Ширина;
Заполнитель = Колонка.Заполнитель;
Если ПерваяСтрока Тогда
// в первой строке выводится заголовок
Заголовок = Колонка.Заголовок;
ШиринаБезЗаголовка = Макс(0, Колонка.Ширина - СтрДлина(Заголовок));
Колонка.НачальнаяПозиция = Позиция;
Колонка.НачальнаяШирина = Колонка.Ширина;
Позиция = Позиция + Колонка.Ширина;
Иначе
Заголовок = "";
ШиринаБезЗаголовка = Колонка.Ширина;
КонецЕсли;
Если Колонка.Тип = "XML" Или ШиринаБезЗаголовка = 0 Тогда
СтрокаКолонки = Колонка.Строка;
СтрокаКолонки = Заголовок + СтрокаКолонки;
Иначе
Если ВРег(Колонка.Тип) = "ШТРИХКОД" Тогда
СтрокаКолонки = СтрокаСимволов(Ширина, " ");
Иначе
Если ВРег(Колонка.Тип) = "РАЗДЕЛИТЕЛЬ" Тогда
СтрокаКолонки = СтрокаСимволов(Ширина, Колонка.Строка);
Колонка.Строка = "";
Иначе
СтрокаКолонки = ВырезатьСлеваПоСловам(Колонка.Строка, ШиринаБезЗаголовка);
Если ПустаяСтрока(Колонка.Строка) И Выравнивание = ГоризонтальноеПоложение.ПоШирине Тогда
// это последняя строка при выравнивании по ширине, ее нужно выровнять слева
Выравнивание = ГоризонтальноеПоложение.Лево;
КонецЕсли;
СтрокаКолонки = ВыровнятьСтроку(Заголовок, СтрокаКолонки, Выравнивание, Колонка.ВыравниваниеЗаголовка, Ширина, Заполнитель);
КонецЕсли;
// подготовиться к обтеканию колонок
Если ПустаяСтрока(Колонка.Строка) Тогда
// Текст в колонке закончился, ее больше не нужно выводить
Колонка.НоваяШирина = 0;
Колонка.Завершена = Истина;
Иначе
Колонка.НоваяШирина = Колонка.Ширина;
ВыводЗавершен = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
СтрокаВывода.Добавить(СтрокаКолонки);
КонецЦикла;
ПересчитатьРазмерыКолонок(Колонки);
Строки.Добавить(СтрСоединить(СтрокаВывода));
КонецЦикла;
КонецПроцедуры
// Выводит в записьXML переданный элемент рекурсивно.
//
// Параметры:
// Запись - ЗаписьXML.
// Элемент - Структура.
//
Процедура ВывестиЭлементXML(Запись, Элемент) Экспорт
Если Элемент.ВыводитьПоСтрокам Тогда
Для Каждого Строка Из Элемент.Строки Цикл
Запись.ЗаписатьНачалоЭлемента(Элемент.Имя);
Запись.ЗаписатьАтрибут(Элемент.ИмяАтрибутаXML, XMLСтрока(Строка));
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Иначе
Если Элемент.АтрибутыXML.Количество()=0 И Элемент.Дочерние.Количество()=0 Тогда
Возврат;
КонецЕсли;
Запись.ЗаписатьНачалоЭлемента(Элемент.Имя);
Для Каждого Атрибут Из Элемент.АтрибутыXML Цикл
Строка = СтрСоединить(Атрибут.Значение);
Запись.ЗаписатьАтрибут(Атрибут.Ключ, XMLСтрока(Строка));
КонецЦикла;
Для Каждого Дочерний Из Элемент.Дочерние Цикл
ВывестиЭлементXML(Запись, Дочерний);
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецПроцедуры
// Выводит штрихкод табличный документ.
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент - документ где должен быть выведен штрихкод.
// Область - ОбластьЯчеекТабличногоДокумента - область где должен быть выведен штрихкод.
// ТипШтрихкода - Строка - тип штрихкода в текстовом виде.
// Штрихкод - Строка - значение штрихкода.
// ИспользоватьBase64 - Булево - Использовать Base64.
//
Процедура ВывестиШтрихкод(ТабличныйДокумент, Область, ТипШтрихкода, Знач Штрихкод, Знач ИспользоватьBase64 = Ложь) Экспорт
ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
ПараметрыШтрихкода.Масштабировать = Истина;
ПараметрыШтрихкода.СохранятьПропорции = Истина;
ПараметрыШтрихкода.ОтображатьТекст = Ложь;
ПараметрыШтрихкода.Штрихкод = Штрихкод;
ПараметрыШтрихкода.ТипВходныхДанных = ?(ИспользоватьBase64, 1, 0);
ПараметрыШтрихкода.ТипКода = ЧисловойТипШтрихкода(ТипШтрихкода);
Штрихкод = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Если ПараметрыШтрихкода.ТипКода = 16 Тогда
Штрихкод.РазмерКартинки = РазмерКартинки.Пропорционально;
ПараметрыШтрихкода.Ширина = 100;
ПараметрыШтрихкода.Высота = 100;
Иначе
Штрихкод.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
ПараметрыШтрихкода.Ширина = 100;
ПараметрыШтрихкода.Высота = 100;
КонецЕсли;
Изображение = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
Штрихкод.Картинка = Изображение.Картинка;
Штрихкод.ГраницаСверху = Ложь;
Штрихкод.ГраницаСнизу = Ложь;
Штрихкод.ГраницаСправа = Ложь;
Штрихкод.ГраницаСлева = Ложь;
Область.ПоВыделеннымКолонкам = Истина;
Область.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
Штрихкод.Расположить(Область);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ШаблоныДокументов
// Выполняет предварительную подготовку.
//
// Параметры:
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека.
// ВерсияФФД - Строка.
//
Процедура ПодготовитьКассовыйЧек(Данные, ФискальнаяОперация, ВерсияФФД)
Если Не ЗначениеЗаполнено(Данные.ОрганизацияНазвание) И ЗначениеЗаполнено(ФискальнаяОперация) Тогда
Сведения = ОборудованиеЧекопечатающиеУстройства.СведенияОбОрганизации(ФискальнаяОперация.Организация);
Данные.ОрганизацияНазвание = Сведения.Наименование;
КонецЕсли;
// позиции чека
ТаблицаНДС = Новый Соответствие();
ТаблицаСумма = Новый Соответствие();
СуммаЧека = 0;
СуммаОплаты = 0;
Для Каждого ПозицияЧека Из Данные.ПозицииЧека Цикл
Если ПозицияЧека.Свойство("ФискальнаяСтрока") Тогда
Сумма = ПозицияЧека.Сумма;
СтавкаНДС = ПозицияЧека.СтавкаНДС;
СуммаНДС = ?(ПозицияЧека.СуммаНДС = 0, 0, ПозицияЧека.СуммаНДС);
// НДС
Если СтавкаНДС = Неопределено Тогда
ТекстНалога = НСтр("ru='БЕЗ НДС'");
СуммаВТаблицеПоКлючу(ТаблицаНДС, "БЕЗНДС", СуммаНДС);
СуммаВТаблицеПоКлючу(ТаблицаСумма, "БЕЗНДС", Сумма);
ИначеЕсли СтавкаНДС = 0 Тогда
ТекстНалога = НСтр("ru='НДС 0%'");
СуммаВТаблицеПоКлючу(ТаблицаНДС, СтавкаНДС, СуммаНДС);
СуммаВТаблицеПоКлючу(ТаблицаСумма, СтавкаНДС, Сумма);
ИначеЕсли СтавкаНДС < 100 Тогда
ТекстНалога = СтрШаблон(НСтр("ru='НДС %1%%'"), СтавкаНДС);
СуммаНДС = ?(СуммаНДС = Неопределено, 0, СуммаНДС);
СуммаВТаблицеПоКлючу(ТаблицаНДС, СтавкаНДС, СуммаНДС);
СуммаВТаблицеПоКлючу(ТаблицаСумма, СтавкаНДС, Сумма);
ИначеЕсли СтавкаНДС >= 100 Тогда
ТекстНалога = СтрШаблон(НСтр("ru='НДС %1/%2%%'"), СтавкаНДС-100, СтавкаНДС);
СуммаНДС = ?(СуммаНДС = Неопределено, 0, СуммаНДС);
СуммаВТаблицеПоКлючу(ТаблицаНДС, СтавкаНДС, СуммаНДС);
СуммаВТаблицеПоКлючу(ТаблицаСумма, СтавкаНДС, Сумма);
КонецЕсли;
ПозицияЧека.Вставить("ТекстНалога", ТекстНалога);
СуммаЧека = СуммаЧека + Сумма;
КонецЕсли;
КонецЦикла;
// подвал чека
// таблица оплаты
ТекстТаблицаОплат = Новый Соответствие();
Для Каждого СтрокаОплаты Из Данные.ТаблицаОплат Цикл
Если СтрокаОплаты.Сумма = 0 Тогда
Продолжить;
КонецЕсли;
ТипОплаты = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.НаименованиеТипаОплатыККТ(СтрокаОплаты.ТипОплаты, ВерсияФФД);
СуммаВТаблицеПоКлючу(ТекстТаблицаОплат, ТипОплаты, СтрокаОплаты.Сумма);
СуммаОплаты = СуммаОплаты + СтрокаОплаты.Сумма;
КонецЦикла;
Данные.Вставить("ТекстТаблицаОплат", ТекстТаблицаОплат);
Данные.Вставить("СуммаОплаты", СуммаОплаты);
Данные.Вставить("СуммаЧека", СуммаЧека);
// таблица НДС
ТекстТаблицаНДС = Новый Соответствие();
Для Каждого СтрокаНДС Из ТаблицаНДС Цикл
СтавкаНДС = СтрокаНДС.Ключ;
СуммаНДС = СтрокаНДС.Значение;
Если СтавкаНДС = "БЕЗНДС" Тогда
Заголовок = " "+НСтр("ru='СУММА БЕЗ НДС'");
Сумма = ТаблицаСумма.Получить(СтавкаНДС);
СуммаНДС = ?(Сумма > 0, Сумма, 0);
ИначеЕсли СтавкаНДС = 0 Тогда
Заголовок = " "+НСтр("ru='СУММА С НДС 0%'");
Сумма = ТаблицаСумма.Получить(СтавкаНДС);
СуммаНДС = ?(Сумма > 0, Сумма, 0);
ИначеЕсли СтавкаНДС < 100 Тогда
Заголовок = СтрШаблон(НСтр("ru='СУММА НДС %1%%'"), СтавкаНДС);
Сумма = ТаблицаСумма.Получить(СтавкаНДС);
СуммаНДС = ?(СуммаНДС > 0, СуммаНДС, Сумма / (100+СтавкаНДС) * СтавкаНДС );
ИначеЕсли СтавкаНДС >= 100 Тогда
Заголовок = СтрШаблон(НСтр("ru='СУММА НДС %1/%2%%'"), СтавкаНДС-100, СтавкаНДС);
Сумма = ТаблицаСумма.Получить(СтавкаНДС);
СуммаНДС = ?(СуммаНДС > 0, СуммаНДС, Сумма / СтавкаНДС * (СтавкаНДС-100) );
КонецЕсли;
ТекстТаблицаНДС.Вставить(Заголовок, СуммаНДС);
КонецЦикла;
Данные.Вставить("ТекстТаблицаНДС", ТекстТаблицаНДС);
// QR код
Если ЗначениеЗаполнено(ФискальнаяОперация) Тогда
ПараметрыQRКода = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыQRКодаЧекаККТ();
ПараметрыQRКода.ДатаВремяРасчета = ФискальнаяОперация.Дата;
ПараметрыQRКода.СуммаРасчета = ФискальнаяОперация.Сумма;
ПараметрыQRКода.ФискальныйПризнак = ФискальнаяОперация.ФискальныйПризнак;
ПараметрыQRКода.ПризнакРасчета = ФискальнаяОперация.ТипРасчета;
ПараметрыQRКода.НомерФискальногоНакопителя = ФискальнаяОперация.ЗаводскойНомерФН;
ПараметрыQRКода.НомерФискальногоДокумента = ФискальнаяОперация.НомерЧекаККМ;
Данные.QRКод.ЗначениеКода = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.СформироватьQRКодЧекаККТараметрыQRКода);
КонецЕсли;
КонецПроцедуры
// Процедура суммирует в соответствии значение по переданному ключу.
Процедура СуммаВТаблицеПоКлючу(Таблица, Ключ, Значение)
Сумма = Таблица.Получить(Ключ);
Сумма = ?(Сумма = Неопределено, 0, Сумма);
Таблица.Вставить(Ключ, Сумма + ?(Значение = Неопределено, 0, Значение));
КонецПроцедуры
// Генерирует шаблон универсального отчета.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
// НазваниеДокумента - Строка.
//
Процедура ШаблонОтчет(Шаблон, Данные, Параметры, НазваниеДокумента) Экспорт
Модуль = ШаблоныФискальныхДокументов;
ФорматРазделитель = Модуль.ФорматРазделитель();
ФорматЦентр = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Центр);
ФорматПраво = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Право);
ФорматЛево = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Лево);
ФорматПоШирине = Модуль.ФорматСтрока(ГоризонтальноеПоложение.ПоШирине);
ДатаВремя = ОбщегоНазначенияБПО.ДатаСеанса();
ДатаВремя = Формат(ДатаВремя, НСтр("ru = 'ДФ=""дд.ММ.гггг ЧЧ:мм""'"));
ФорматПодпись = ШаблоныФискальныхДокументов.НовыйФормат(ФорматЛево);
ФорматПодпись.Заполнитель = "_";
ФорматПодпись.ВыводитьЗаголовок = Истина;
Модуль.ДобавитьСтроку (Шаблон, Параметры.Заголовок, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='НЕФИСКАЛЬНЫЙ РЕЖИМ'"), ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, "=", ФорматРазделитель);
Модуль.ДобавитьСтроку (Шаблон, Данные.АдресРасчетов, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.МестоРасчетов, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, НазваниеДокумента, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, ДатаВремя, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='КАССИР:'"), Данные.Кассир, ФорматЛево);
Если Параметры.Подпись Тогда
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПОДПИСЬ:'"), ФорматПодпись);
КонецЕсли;
Модуль.ДобавитьСтроку (Шаблон, "=", ФорматРазделитель);
КонецПроцедуры
// Генерирует шаблон универсального отчета инкассации.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОткрытияЗакрытияСмены.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
// НазваниеОперации - Строка
//
Процедура ШаблонОперацияИнкассации(Шаблон, Данные, Параметры, НазваниеОперации) Экспорт
Модуль = ШаблоныФискальныхДокументов;
ФорматРазделитель = Модуль.ФорматРазделитель();
ФорматЦентр = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Центр);
ФорматПраво = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Право);
ФорматЛево = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Лево);
ФорматПоШирине = Модуль.ФорматСтрока(ГоризонтальноеПоложение.ПоШирине);
ДатаВремя = ОбщегоНазначенияБПО.ДатаСеанса();
ДатаВремя = Формат(ДатаВремя, НСтр("ru = 'ДФ=""дд.ММ.гггг ЧЧ:мм""'"));
ФорматПодпись = ШаблоныФискальныхДокументов.НовыйФормат(ФорматЛево);
ФорматПодпись.Заполнитель = "_";
ФорматПодпись.ВыводитьЗаголовок = Истина;
ФорматЧисла = "ЧРД=.;ЧЦ=12;ЧДЦ=2;ЧН=0.00;ЧГ=0";
Модуль.ДобавитьСтроку (Шаблон, Параметры.Заголовок, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='НЕФИСКАЛЬНЫЙ РЕЖИМ'"), ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.Организация, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='СУММА='"), Формат(Данные.Сумма, ФорматЧисла), ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, "=", ФорматРазделитель);
Модуль.ДобавитьСтроку (Шаблон, НазваниеОперации, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, ДатаВремя, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='КАССИР:'"), Данные.Кассир, ФорматЛево);
Если Параметры.Подпись Тогда
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПОДПИСЬ:'"), ФорматПодпись);
КонецЕсли;
КонецПроцедуры
// Генерирует шаблон шапки кассового чека.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонКассовыйЧекШапка(Шаблон, Данные, Параметры)
Модуль = ШаблоныФискальныхДокументов;
ФорматРазделитель = Модуль.ФорматРазделитель();
ФорматЦентр = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Центр);
ФорматПраво = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Право);
ФорматЛево = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Лево);
ФорматПоШирине = Модуль.ФорматСтрока(ГоризонтальноеПоложение.ПоШирине);
Модуль.ДобавитьСтроку (Шаблон, Параметры.Заголовок, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, "=======", ФорматРазделитель);
Модуль.ДобавитьСтроку (Шаблон, Данные.ОрганизацияНазвание, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.АдресРасчетов, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.МестоРасчетов, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.АдресМагазина, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.ТекстШапки, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='КАССОВЫЙ ЧЕК'"), ФорматЦентр);
КодРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодРасчетаДенежнымиСредствами(Данные.ТипРасчета);
ТипЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.НаименованиеКодаРасчетаДенежнымиСредствами(КодРасчета);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ИНН'")+" ", Данные.ОрганизацияИНН, ФорматЛево);
Модуль.ДобавитьКолонку(Шаблон, ТипЧека, ФорматПраво);
ДатаВремя = ?(НЕ ПустаяСтрока(Данные.ДатаВремя), Данные.ДатаВремя, ОбщегоНазначенияБПО.ДатаСеанса());
ДатаВремя = Формат(ДатаВремя, НСтр("ru = 'ДФ=""дд.ММ.гггг ЧЧ:мм""'"));
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ЧЕК №'"), Данные.НомерЧека, ФорматЛево);
Модуль.ДобавитьКолонку(Шаблон, ДатаВремя, ФорматПраво);
Покупатель = Данные.Получатель;
ПокупательИНН = Данные.ПолучательИНН;
ПокупательАдрес = "";
СведенияОПокупателе = Данные.СведенияОПокупателе;
Покупатель = ?(Не ПустаяСтрока(СведенияОПокупателе.Покупатель), СведенияОПокупателе.Покупатель, Покупатель);
ПокупательИНН = ?(Не ПустаяСтрока(СведенияОПокупателе.ПокупательИНН), СведенияОПокупателе.ПокупательИНН, ПокупательИНН);
ПокупательАдрес = ?(Не ПустаяСтрока(СведенияОПокупателе.ПокупательАдрес), СведенияОПокупателе.ПокупательАдрес, ПокупательАдрес);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПОКУПАТЕЛЬ:'"), Покупатель, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ИНН ПОКУПАТЕЛЯ:'"), ПокупательИНН, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='АДРЕС ПОКУПАТЕЛЯ:'"), ПокупательАдрес, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, ВРег(Данные.ПризнакАгента), ФорматЛево);
// ++ Локализация
ДанныеПоставщика = Данные.ДанныеПоставщика;
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПОСТАВЩИК:'"), ДанныеПоставщика.Наименование, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ТЛФ.ПОСТ.:'"), ДанныеПоставщика.Телефон, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ИНН ПОСТАВЩИКА:'"), ДанныеПоставщика.ИНН, ФорматПраво);
ПлатежныйАгент = Данные.ДанныеАгента.ПлатежныйАгент;
ОператорПеревода = Данные.ДанныеАгента.ОператорПеревода;
ОператорПоПриемуПлатежей = Данные.ДанныеАгента.ОператорПоПриемуПлатежей;
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПЛ.АГЕНТ ОПЕР.:'"), ПлатежныйАгент.Операция, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПЛ.АГЕНТ.ТЛФ.:'"), ПлатежныйАгент.Телефон, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ОПЕРАТОР ПЕРЕВОДА:'"), ОператорПеревода.Наименование, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ТЛФ.ОП.ПЕРЕВОДА:'"), ОператорПеревода.Телефон, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='АДР.ОП.ПЕРЕВОДА:'"), ОператорПеревода.Адрес, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ИНН ОП.ПЕРЕВОДА:'"), ОператорПеревода.ИНН, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ОПЕР.ПО ПРИЕМУ ПЛАТ.ТЛФ:'"), ОператорПоПриемуПлатежей.Телефон, ФорматПраво);
// -- Локализация
ДополнительныйРеквизитПользователя = Данные.ДополнительныйРеквизитПользователя;
Модуль.ДобавитьСтроку (Шаблон, ДополнительныйРеквизитПользователя.Наименование, ДополнительныйРеквизитПользователя.Значение, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, "-", ФорматРазделитель);
КонецПроцедуры
// Генерирует шаблон фискальной строки в позиции кассового чека.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// ПозицияЧека - Структура.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонКассовыйЧекПозицияЧекаФискальнаяСтрока(Шаблон, ПозицияЧека)
Модуль = ШаблоныФискальныхДокументов;
ФорматЦентр = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Центр);
ФорматПраво = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Право);
ФорматЛево = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Лево);
ФорматПоШирине = Модуль.ФорматСтрока(ГоризонтальноеПоложение.ПоШирине);
// позиции чека
ФорматЧисла2 = "ЧРД=.;ЧЦ=12;ЧДЦ=2;ЧН=0.00;ЧГ=0";
ФорматЧисла3 = "ЧРД=.;ЧЦ=12;ЧДЦ=3;ЧН=0.000;ЧГ=0";
Количество = ПозицияЧека.Количество;
Сумма = ПозицияЧека.Сумма;
СуммаСкидок = ?(ПустаяСтрока(ПозицияЧека.СуммаСкидок), 0, ПозицияЧека.СуммаСкидок);
ЦенаДляПечати = Окр(Сумма / ?(Количество > 0, Количество, 1), 2);
СтрокаТовара = СтрШаблон("%1 х %2=%3",
Формат(Количество, ФорматЧисла3),
Формат(ЦенаДляПечати, ФорматЧисла2),
Формат(Сумма, ФорматЧисла2));
Модуль.ДобавитьСтроку (Шаблон, ПозицияЧека.Наименование, ФорматЛево);
Модуль.ДобавитьСтроку (Шаблон, СтрокаТовара, ФорматПраво);
Если СуммаСкидок > 0 Тогда
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='СКИДКА='"), Формат(СуммаСкидок, ФорматЧисла2), ФорматЛево);
ИначеЕсли СуммаСкидок < 0 Тогда
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='НАДБАВКА='"), Формат(СуммаСкидок, ФорматЧисла2), ФорматЛево);
Иначе
Модуль.ДобавитьСтроку (Шаблон);
КонецЕсли;
Модуль.ДобавитьКолонку(Шаблон, ПозицияЧека.ТекстНалога, ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, ВРег(ПозицияЧека.ПризнакПредметаРасчета), ФорматПраво);
ПризнакСпособаРасчета =
ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодПризнакаСпособаРасчета(ПозицияЧека.ПризнакСпособаРасчета);
ПризнакСпособаРасчетаНаименование =
ОборудованиеЧекопечатающиеУстройстваКлиентСервер.НаименованиеПризнакаСпособаРасчета(ПризнакСпособаРасчета);
Модуль.ДобавитьСтроку (Шаблон, ПризнакСпособаРасчетаНаименование, ФорматЛево);
// ++ Локализация
// Маркировка
Если НЕ ПустаяСтрока(ПозицияЧека.КонтрольнаяМарка) Тогда
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='[М]'"), ФорматЛево);
Иначе
Штрихкод = ПозицияЧека.Штрихкод;
Если НЕ ПустаяСтрока(ПозицияЧека.КодВидаНоменклатурнойКлассификации) Тогда
Штрихкод = ПозицияЧека.КодВидаНоменклатурнойКлассификации;
КонецЕсли;
КодТовараТекст = Штрихкод;
Если ОбщегоНазначенияБПО.ИспользуетсяМаркировка() Тогда
МодульМенеджерОборудованияМаркировка = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировка");
КодТовараИдентифицируетЭкземпляр = МодульМенеджерОборудованияМаркировка.КодТовараИдентифицируетЭкземпляр(
ПозицияЧека.ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара,
Штрихкод);
Если КодТовараИдентифицируетЭкземпляр Тогда
КодТовараТекст = НСтр("ru='[М]'") + КодТовараТекст + Символы.НПП;
КонецЕсли;
КонецЕсли;
Модуль.ДобавитьСтроку (Шаблон, КодТовараТекст, ФорматЛево);
КонецЕсли;
// -- Локализация
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='КОД СТРАНЫ:'"), ПозицияЧека.КодСтраныПроисхожденияТовара, ФорматЛево);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ДЕКЛАРАЦИЯ:'"), ПозицияЧека.НомерТаможеннойДекларации, ФорматЛево);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='АКЦИЗ:'"), ПозицияЧека.СуммаАкциза, ФорматЛево);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ЕД.ИЗМЕРЕНИЯ:'"),ПозицияЧека.ЕдиницаИзмерения, ФорматЛево);
Модуль.ДобавитьСтроку (Шаблон, ВРег(ПозицияЧека.ПризнакАгентаПоПредметуРасчета), ФорматЛево);
// ++ Локализация
ДанныеПоставщика = ПозицияЧека.ДанныеПоставщика;
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ПОСТАВЩИК:'"), ДанныеПоставщика.Наименование, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ТЛФ.ПОСТ.:'"), ДанныеПоставщика.Телефон, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ИНН ПОСТАВЩИКА:'"), ДанныеПоставщика.ИНН, ФорматПраво);
ПлатежныйАгент = ПозицияЧека.ДанныеАгента.ПлатежныйАгент;
ОператорПеревода = ПозицияЧека.ДанныеАгента.ОператорПеревода;
ОператорПоПриемуПлатежей = ПозицияЧека.ДанныеАгента.ОператорПоПриемуПлатежей;
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ПЛ.АГЕНТ ОПЕР.:'"), ПлатежныйАгент.Операция, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ПЛ.АГЕНТ.ТЛФ.:'"), ПлатежныйАгент.Телефон, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ОПЕРАТОР ПЕРЕВОДА:'"), ОператорПеревода.Наименование, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ТЛФ.ОП.ПЕРЕВОДА:'"), ОператорПеревода.Телефон, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='АДР.ОП.ПЕРЕВОДА:'"), ОператорПеревода.Адрес, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ИНН ОП.ПЕРЕВОДА:'"), ОператорПеревода.ИНН, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ОПЕР.ПО ПРИЕМУ ПЛАТ.ТЛФ:'"), ОператорПоПриемуПлатежей.Телефон, ФорматПраво);
// -- Локализация
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ДОП.РЕК.:'"), ПозицияЧека.ДополнительныйРеквизит, ФорматПраво);
КонецПроцедуры
// Генерирует шаблон текстовой строки в позиции кассового чека.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// ПозицияЧека - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыТекстовойСтрокиЧека.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонКассовыйЧекПозицияЧекаТекстоваяСтрока(Шаблон, ПозицияЧека)
Модуль = ШаблоныФискальныхДокументов;
Формат = Модуль.ФорматСтрока(ГоризонтальноеПоложение[ПозицияЧека.Выравнивание]);
Модуль.ДобавитьСтроку (Шаблон, ПозицияЧека.Текст, Формат);
КонецПроцедуры
// Генерирует шаблон строки штрихкода в позиции кассового чека.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// ПозицияЧека - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыШтрихкодВСтрокеЧека
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонКассовыйЧекПозицияЧекаШтрихкод(Шаблон, ПозицияЧека)
Модуль = ШаблоныФискальныхДокументов;
Формат = Модуль.ФорматШтрихкод(ГоризонтальноеПоложение.Центр, ПозицияЧека.ТипШтрихкода, 2);
Модуль.ДобавитьСтроку(Шаблон, ПозицияЧека.ШтрихкодBase64, Формат);
Модуль.ДобавитьСтроку(Шаблон, " ");
КонецПроцедуры
// Генерирует шаблон подвала кассового чека.
//
// Параметры:
// Шаблон - см. ШаблоныФискальныхДокументов.НовыйШаблон.
// Данные - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека.
// ФискальнаяОперация - Структура.
// Параметры - см. ШаблоныФискальныхДокументов.ПараметрыШаблонаФискальногоДокумента.
//
Процедура ШаблонКассовыйЧекПодвал(Шаблон, Данные, ФискальнаяОперация, Параметры)
Модуль = ШаблоныФискальныхДокументов;
ФорматРазделитель = Модуль.ФорматРазделитель();
ФорматЦентр = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Центр);
ФорматПраво = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Право);
ФорматЛево = Модуль.ФорматСтрока(ГоризонтальноеПоложение.Лево);
ФорматПоШирине = Модуль.ФорматСтрока(ГоризонтальноеПоложение.ПоШирине);
// позиции чека
ФорматЧисла2 = "ЧРД=.;ЧЦ=12;ЧДЦ=2;ЧН=0.00;ЧГ=0";
ФорматЧисла3 = "ЧРД=.;ЧЦ=12;ЧДЦ=3;ЧН=0.000;ЧГ=0";
СуммаОплаты = Данные.СуммаОплаты;
СуммаЧека = Данные.СуммаЧека;
Модуль.ДобавитьСтроку (Шаблон, "-", ФорматРазделитель);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ИТОГ='"), Формат(СуммаЧека, ФорматЧисла2), ФорматПраво);
Модуль.ДобавитьСтроку (Шаблон, "-", ФорматРазделитель);
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ОПЛАТА'"), ФорматЛево);
ФорматШирина2 = ШаблоныФискальныхДокументов.ФорматСтрокаШирина(2);
Для Каждого СтрокаОплаты Из Данные.ТекстТаблицаОплат Цикл
Модуль.ДобавитьСтроку (Шаблон, " ", ФорматШирина2);
Модуль.ДобавитьКолонку(Шаблон, СтрокаОплаты.Ключ, Формат(СтрокаОплаты.Значение, ФорматЧисла2), ФорматПраво);
КонецЦикла;
Если СуммаОплаты - СуммаЧека > 0 Тогда
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ПОЛУЧЕНО='"), Формат(СуммаОплаты, ФорматЧисла2), ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='СДАЧА='"), Формат(СуммаОплаты - СуммаЧека, ФорматЧисла2), ФорматПраво);
КонецЕсли;
// ++ Локализация
СНОКод = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодСистемыНалогообложенияККТ(Данные.СистемаНалогообложения);
СНО = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.НаименованиеСистемыНалогообложения(СНОКод, Истина);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='СНО:'"), СНО, ФорматЛево);
// -- Локализация
Для Каждого СтрокаНДС Из Данные.ТекстТаблицаНДС Цикл
Модуль.ДобавитьСтроку (Шаблон, " ", ФорматШирина2);
Модуль.ДобавитьКолонку(Шаблон, СтрокаНДС.Ключ, Формат(СтрокаНДС.Значение, ФорматЧисла2), ФорматПраво);
КонецЦикла;
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='КАССИР:'"), Данные.Кассир, ФорматЛево);
Если Параметры.Подпись Тогда
Формат = ШаблоныФискальныхДокументов.НовыйФормат(ФорматЛево);
Формат.Заполнитель = "_";
Формат.ВыводитьЗаголовок = Истина;
Модуль.ДобавитьСтроку (Шаблон, НСтр("ru='ПОДПИСЬ:'"), Формат);
КонецЕсли;
Модуль.ДобавитьСтроку (Шаблон, Параметры.ДополнительныйТекст, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, Данные.ТекстПодвала, ФорматЦентр);
Модуль.ДобавитьСтроку (Шаблон, "======", ФорматРазделитель);
// QR код и данные фискальной операции
Если Параметры.ВыводитьФискальнуюИнформацию И ФискальнаяОперация <> Неопределено Тогда
Модуль.ДобавитьСтроку(Шаблон, " ");
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='РН ККТ:'"), ФискальнаяОперация.РегистрационныйНомерККТ, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ФН №:'"), ФискальнаяОперация.ЗаводскойНомерФН, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ФД №:'"), Формат(ФискальнаяОперация.НомерЧекаККМ,"ЧГ="), ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, НСтр("ru='ФП:'"), ФискальнаяОперация.ФискальныйПризнак, ФорматПраво);
Модуль.ДобавитьСтроку(Шаблон, " ");
Формат = Модуль.ФорматШтрихкод(ГоризонтальноеПоложение.Центр, "QR", 6, Ложь);
Модуль.ДобавитьСтроку(Шаблон, Данные.QRКод.ЗначениеКода, Формат);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ГенераторШаблона
// Конструктор элемента шаблона.
//
// Возвращаемое значение:
// Структура:
// * Строки - Массив из Строка - массив сформированных строк.
// * Колонки - Массив из см. НоваяКолонкаЭлементаШаблона.
// * Картинки - Массив из Структура.
// * ВыводитьПоСтрокам - Булево.
// * ЭлементXML - Структура
// * ИмяАтрибутаXML - Строка.
//
Функция НовыйЭлементШаблона()
Элемент = Новый Структура();
Элемент.Вставить("Строки", Новый Массив()); // Массив из Строка
Элемент.Вставить("Колонки", Новый Массив()); // Массив из см. НоваяКолонкаЭлементаШаблона
Элемент.Вставить("Картинки", Новый Массив()); // Массив из Структура
Элемент.Вставить("ВыводитьПоСтрокам", Истина);
Элемент.Вставить("ЭлементXML", Новый Структура());
Элемент.Вставить("ИмяАтрибутаXML", "");
Возврат Элемент;
КонецФункции
// Создает и возвращает структуру содержащую данные о колонке.
//
// Возвращаемое значение:
// Структура:
// * Тип - Строка - тип строки шаблона: Строка, Разделитель, Штрихкод, XML.
// * Выравнивание - ГоризонтальноеПоложение.
// * ВыравниваниеЗаголовка - Булево.
// * ОбтеканиеСлева - Булево.
// * ОбтеканиеСправа - Булево.
// * Ширина - Число - ширина поля абсолютное значение.
// * ШиринаФормат - Строка - ширина поля абсолютное или процент.
// * ВыводитьЗаголовок - Булево - флаг принудительного вывода заголовка если строка не содержит значения.
// * ПодавлятьПробелы - Булево.
// * Заполнитель - Строка - символы заполнитель при выравнивании.
// * ШтрихкодТип - Строка.
// * ШтрихкодВысота - Число.
// * Заголовок - Строка - заголовок поля, строка из шаблона до первого выражения.
// * Значение - Произвольный.
// * Строка - Строка - значение преобразованное в строку.
// * НачальнаяПозиция - Число - позиция в строке где начинается первая строка колонки.
// * НачальнаяШирина - Число - первоначальная ширина колонки.
// * НоваяШирина - Число - новая ширина колонки, используется при расчете обтекания.
// * Завершена - Булево - вывод колонки завершен, используется при расчете обтекания.
// * НачальнаяСтрока - Число.
//
Функция НоваяКолонкаЭлементаШаблона()
Колонка = Новый Структура();
Колонка.Вставить("Тип", "СТРОКА");
// формат колонки
Выравнивание = ГоризонтальноеПоложение.Лево; // ГоризонтальноеПоложение
Колонка.Вставить("Выравнивание", Выравнивание);
Колонка.Вставить("ВыравниваниеЗаголовка", Ложь);
Колонка.Вставить("ОбтеканиеСлева", Ложь);
Колонка.Вставить("ОбтеканиеСправа", Ложь);
Колонка.Вставить("Ширина", 0);
Колонка.Вставить("ШиринаФормат", "0");
Колонка.Вставить("ВыводитьЗаголовок", Ложь);
Колонка.Вставить("ПодавлятьПробелы", Истина);
Колонка.Вставить("Заполнитель", " ");
Колонка.Вставить("ШтрихкодТип", "EAN13");
Колонка.Вставить("ШтрихкодВысота", 2);
Колонка.Вставить("ИспользоватьBase64", Истина);
// значения
Колонка.Вставить("Заголовок", "");
Колонка.Вставить("Значение", Неопределено);
Колонка.Вставить("Строка", "");
// служебные свойства
Колонка.Вставить("НачальнаяПозиция", 0);
Колонка.Вставить("НачальнаяШирина", 0);
Колонка.Вставить("НоваяШирина", 0);
Колонка.Вставить("Завершена", Ложь);
Колонка.Вставить("НачальнаяСтрока", 0);
Возврат Колонка;
КонецФункции
// Выполняет пересчет размеров колонок, для создания эффекта обтекания.
//
// Параметры:
// МассивКолонок - Массив из см. НоваяКолонкаЭлементаШаблона.
//
Процедура ПересчитатьРазмерыКолонок(МассивКолонок)
Индекс = 0;
Пока Индекс<=МассивКолонок.ВГраница() Цикл
Колонка = МассивКолонок[Индекс];
Если Не Колонка.Завершена Тогда
// выполнить обтекание влево
Если Колонка.ОбтеканиеСлева Тогда
ИндексКолонкиСлева = Индекс-1;
Пока ИндексКолонкиСлева>=0 Цикл
Если МассивКолонок[ИндексКолонкиСлева].НоваяШирина = 0
И МассивКолонок[ИндексКолонкиСлева].Ширина>0 Тогда
Колонка.Ширина = Колонка.Ширина + МассивКолонок[ИндексКолонкиСлева].Ширина;
МассивКолонок[ИндексКолонкиСлева].Ширина = 0;
Иначе
Прервать;
КонецЕсли;
ИндексКолонкиСлева = ИндексКолонкиСлева - 1;
КонецЦикла;
КонецЕсли;
// выполнить обтекание вправо
Если Колонка.ОбтеканиеСправа Тогда
ИндексКолонкиСправа = Индекс + 1;
Пока ИндексКолонкиСправа <= МассивКолонок.ВГраница() Цикл
Если МассивКолонок[ИндексКолонкиСправа].НоваяШирина = 0
И МассивКолонок[ИндексКолонкиСправа].Ширина>0 Тогда
Колонка.Ширина = Колонка.Ширина + МассивКолонок[ИндексКолонкиСправа].Ширина;
МассивКолонок[ИндексКолонкиСправа].Ширина = 0;
Иначе
Прервать;
КонецЕсли;
ИндексКолонкиСправа = ИндексКолонкиСправа + 1;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
КонецПроцедуры
// Выравнивает строку по переданным правилам, по заданной ширине.
//
// Параметры:
// Заголовок - Строка - текст который будет выведен перед строкой.
// Строка - Строка - строка которую требуется выровнять.
// Выравнивание - ГоризонтальноеПоложение.
// ВыравниваниеЗаголовка - Булево - выравнивать ли заголовок вместе с текстом.
// ШиринаСтроки - Число - ширина строки по которой требуется выровнять строку.
// Заполнитель - Строка - символы которые будут использоваться как пустая строка при заполнении.
//
// Возвращаемое значение:
// Строка - Строка - выровненная по правилам строка.
//
Функция ВыровнятьСтроку(Заголовок, Строка, Выравнивание, ВыравниваниеЗаголовка, ШиринаСтроки, Заполнитель = " ")
ПустаяСтрока = СтрокаСимволов(ШиринаСтроки, Заполнитель);
Если Выравнивание = ГоризонтальноеПоложение.Право И Не ВыравниваниеЗаголовка Тогда // выравнивание справа без заголовка
Размер = ШиринаСтроки - СтрДлина(Заголовок);
Результат = Заголовок + Прав(ПустаяСтрока + Строка, Размер);
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.Право И ВыравниваниеЗаголовка Тогда // выравнивание справа вместе с заголовком
Размер = ШиринаСтроки;
Результат = Прав(ПустаяСтрока + Заголовок + Строка, Размер);
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.Лево И Не ВыравниваниеЗаголовка Тогда // выравнивание слева без заголовка
Размер = ШиринаСтроки - СтрДлина(Заголовок);
Результат = Заголовок + Лев(Строка + ПустаяСтрока, Размер);
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.Лево И ВыравниваниеЗаголовка Тогда // выравнивание слева вместе с заголовком
Размер = ШиринаСтроки;
Результат = Лев(Заголовок + Строка + ПустаяСтрока, Размер);
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.Центр И Не ВыравниваниеЗаголовка Тогда // выравнивание по центру без заголовка
Размер = ШиринаСтроки - СтрДлина(Заголовок);
РазмерСтроки = СтрДлина(Строка);
РазмерСлева = Цел((Размер - РазмерСтроки) / 2);
Результат = Заголовок + Лев(Лев(ПустаяСтрока, РазмерСлева) + Строка + ПустаяСтрока, Размер);
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.Центр И ВыравниваниеЗаголовка Тогда // выравнивание по центру вместе с заголовком
Размер = ШиринаСтроки;
РазмерСтроки = СтрДлина(Заголовок + Строка);
РазмерСлева = Цел((Размер - РазмерСтроки) / 2);
Результат = Лев(Лев(ПустаяСтрока, РазмерСлева) + Заголовок + Строка + ПустаяСтрока, Размер);
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.ПоШирине И ВыравниваниеЗаголовка Тогда // выравнивание по ширине вместе с заголовком
Текст = Заголовок + Строка;
Размер = ШиринаСтроки;
РазмерСтроки = СтрДлина(Текст);
Строки = СтрРазделить(Текст, " ", Истина);
Индекс = 0;
Пока РазмерСтроки<Размер Цикл
Строки[Индекс] = Строки[Индекс]+" ";
Индекс = ?(Индекс < Строки.ВГраница()-1, Индекс + 1, 0);
РазмерСтроки = РазмерСтроки + 1;
КонецЦикла;
Результат = СтрСоединить(Строки, " ");
ИначеЕсли Выравнивание = ГоризонтальноеПоложение.ПоШирине И Не ВыравниваниеЗаголовка Тогда // выравнивание по ширине без заголовка
Текст = Строка;
Размер = ШиринаСтроки;
РазмерСтроки = СтрДлина(Текст);
Строки = СтрРазделить(Текст, " ", Истина);
Индекс = 0;
Пока РазмерСтроки<Размер Цикл
Строки[Индекс] = Строки[Индекс]+" ";
Индекс = ?(Индекс < Строки.ВГраница()-1, Индекс + 1, 0);
РазмерСтроки = РазмерСтроки + 1;
КонецЦикла;
Результат = Заголовок + СтрСоединить(Строки, " ");
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает строку отрезанную по пробелу, что бы она поместилась в заданный размер.
//
// Параметры:
// Текст - Строка - строка из которой требуется вырезать слова.
// Размер - Число - максимальный размер строки.
//
// Возвращаемое значение:
// Строка - отрезанная по пробелу строка.
//
Функция ВырезатьСлеваПоСловам(Текст, Размер)
СледующийПробел = СтрНайти(Текст, " ");
ДлинаТекста = СтрДлина(Текст);
Если СледующийПробел > Размер+1 Тогда
// пробел после строки, отрезается по символам
ПозицияПробел = Размер;
ИначеЕсли СледующийПробел = 0 Тогда
// нет пробелов, отрезается либо по размеру, либо по всей строке
ПозицияПробел = Мин(Размер, ДлинаТекста);
Иначе
// есть пробел в границе
Пока СледующийПробел <= Размер+1 Цикл
ПозицияПробел = СледующийПробел;
Если ПозицияПробел < ДлинаТекста Тогда
СледующийПробел = СтрНайти(Текст, " ", , ПозицияПробел+1);
Иначе
СледующийПробел = ДлинаТекста;
КонецЕсли;
Если СледующийПробел = 0 Тогда
Если ПозицияПробел = 0 Тогда
ПозицияПробел = Размер;
ИначеЕсли Размер >= ДлинаТекста Тогда
ПозицияПробел = ДлинаТекста;
КонецЕсли;
Прервать;
ИначеЕсли СледующийПробел = ДлинаТекста Тогда
ПозицияПробел = СледующийПробел;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Результат = СокрЛП(Лев(Текст, ПозицияПробел));
Текст = СокрЛП(Сред(Текст, ПозицияПробел+1));
Возврат Результат;
КонецФункции
// Возвращает код типа штрихкода по имени для передачи в ГенерацияШтрихкода.
//
// Параметры:
// СтрокаТипШтрихкода - Строка - текстовое представление вида штрихкода.
//
// Возвращаемое значение:
// Число - числовое представление штрихкода, для использования в генерации штрихкодов.
//
Функция ЧисловойТипШтрихкода(СтрокаТипШтрихкода)
ТипыШтрихкода = Новый Соответствие();
ТипыШтрихкода.Вставить("EAN8", 0);
ТипыШтрихкода.Вставить("EAN13", 1);
ТипыШтрихкода.Вставить("EAN128", 2);
ТипыШтрихкода.Вставить("Code39", 3);
ТипыШтрихкода.Вставить("Code128", 4);
ТипыШтрихкода.Вставить("Code16k", 5);
ТипыШтрихкода.Вставить("PDF417", 6);
ТипыШтрихкода.Вставить("Standart (Industrial) 2 of 5", 7);
ТипыШтрихкода.Вставить("Interleaved 2 of 5", 8);
ТипыШтрихкода.Вставить("Code39", 9);
ТипыШтрихкода.Вставить("Code93", 10);
ТипыШтрихкода.Вставить("ITF14", 11);
ТипыШтрихкода.Вставить("RSS14", 12);
ТипыШтрихкода.Вставить("EAN13AddOn2", 14);
ТипыШтрихкода.Вставить("EAN13AddOn5", 15);
ТипыШтрихкода.Вставить("QR", 16);
ТипыШтрихкода.Вставить("GS1DataBarExpandedStacked", 17);
ТипыШтрихкода.Вставить("Datamatrix ASCII", 18);
ТипыШтрихкода.Вставить("Datamatrix BASE256", 19);
ТипыШтрихкода.Вставить("Datamatrix TEXT", 20);
ТипыШтрихкода.Вставить("Datamatrix C40", 21);
ТипыШтрихкода.Вставить("Datamatrix X12", 22);
ТипыШтрихкода.Вставить("Datamatrix EDIFACT", 23);
ТипыШтрихкода.Вставить("Datamatrix GS1ASCII", 24);
Результат = ТипыШтрихкода.Получить(СтрокаТипШтрихкода);
Возврат ?(Результат = Неопределено, 99, Результат);
КонецФункции
#КонецОбласти
#КонецОбласти