Каталог решений - Печать Чека ККМ из Платежного поручения входящего. КА 1.1

Печать Чека ККМ из Платежного поручения входящего. КА 1.1

Печать Чека ККМ из Платежного поручения входящего. КА 1.1

В наличии

Доработка КА 1.1 для печати чека из платежного поручения входящего.

Категория:

Описание

Небольшая предыстория: на 23.11.2018 с использованием последнего релиза 1.1.107.5 программисты компании 1с так и не дописали возможность печати кассового чека из ППВ. Последние надежды получить чек в этом году ушли, поэтому решил написать сам, тем более, что стоит отдать должное, в последнее время вся печать была настолько унифицирована компанией 1с, что её доработка и вставка в любые документы не составляет большого труда. 

И так, по порядку:

1. Открываем документ платежное поручение входящее, основную форму документа, справа снизу нажимаем на три точки (рядом с кнопкой "печать"), в открывшемся окне пишем название "Чек" и нажимаем на лупу у кнопки  "действие".

Вставляем в появившуюся процедуру "Процедура ОсновныеДействияФормыЧек(Кнопка)" следующий текст:

	Если НомерЧекаККМ <> 0 Тогда
		Предупреждение("Чек уже пробит на фискальном устройстве!", 60);
		Возврат;
	КонецЕсли;

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

	Для Каждого ФУ Из МассивФУ Цикл
		ПолучитьСерверТО().ПолучитьПредставлениеУстройства(ФУ, Вид, Представление);
		СписокФУ.Добавить(ФУ, Представление);
	КонецЦикла;

	КоличествоФУ = СписокФУ.Количество();
	Если      КоличествоФУ = 0 Тогда
		Предупреждение("Фискальное устройство не подключено!");
		ФУ = Неопределено;
	ИначеЕсли КоличествоФУ = 1 Тогда
		ФУ = СписокФУ[0].Значение;
	Иначе
		ФУ = СписокФУ.ВыбратьЭлемент("Необходимо выбрать фискальное устройство");
		Если ФУ = Неопределено Тогда
			Предупреждение("Операция отменена пользователем");
		Иначе
			ФУ = ФУ.Значение;
		КонецЕсли;
	КонецЕсли;

	Если НЕ ЗначениеЗаполнено(ФУ) Тогда
		Возврат;
	КонецЕсли;

	Если (НЕ Проведен) ИЛИ Модифицированность Тогда
		Ответ = Вопрос("Провести документ?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
		Если Ответ <> КодВозвратаДиалога.Да Тогда
			Предупреждение("Операция не выполнена!");
			Возврат;
		КонецЕсли;
	КонецЕсли;

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

		Для Каждого Позиция Из РасшифровкаПлатежа Цикл
			СтрокаТаблицы           = ТаблицаПлатежей.Добавить();
			СтрокаТаблицы.Заголовок = "Принято от " + СокрЛП(Контрагент)
		    	                      + "
		        	                    |Основание: " + СокрЛП(ЭтотОбъект);
			СтрокаТаблицы.Сумма     = Позиция.СуммаПлатежа;
			СтрокаТаблицы.НДС       = УчетНДС.ПолучитьСтавкуНДС(Позиция.СтавкаНДС);
		КонецЦикла;

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

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

	КонецЕсли;

Отдельно советую обратить внимание на строку:

//+ЛДВ 20-11-12
	Если ЭтотОбъект.Ответственный <> ПараметрыСеанса.ТекущийПользователь Тогда
		ЭтотОбъект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
	КонецЕсли;
//-ЛДВ 20-11-12

 Она говорит о том, что если ответственный в документы не кассир, который распечатывает чеки, то перед записью документы ответственный будет подменен на кассира. Для чего это надо — бывает ситуации, что когда в предприятии есть несколько организаций и часть сотрудников устроены в одной организации, другие в другой, и так как данные по кассиру уходят в налоговую, было бы некорректно, если платежку входящую создал бухгалтер работающий в организации ООО "Рога", а сама платежка на организацию ИП Иванов. В итоге в налоговую данные в чеке уйдут, что именно бухгалтер ООО напечатал чек, хотя официально к организации ИП Иванов он не имеет никакого отношения,  чтобы избежать таких конфузов, подменяем ответственного при печати.

2. Добавляем реквизиты в объект (документ платежное поручение входящее)

— "НомерЧекаККМ", Тип число, длинна 8, точно 0

— "АдресЭП", Тип строка, длинна 255

— "ТекстЭлектронногоЧека",Тип строка, длинна 255

— "ККМ", тип СправочникСсылка.КассыККМ

3. Добавляем в таблицу "РасшифровкаПлатежа" следующий реквизит

— "ПризнакСпособаРасчета", Тип ПеречислениеСсылка.ПризнакиСпособаРасчета

Вот и все, обновляем конфигурацию и радуемся печати чека из платежного поручения входящего!

has been added to your cart:
Оформление заказа