Небольшая предыстория: на 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. Добавляем в таблицу "РасшифровкаПлатежа" следующий реквизит
- "ПризнакСпособаРасчета", Тип ПеречислениеСсылка.ПризнакиСпособаРасчета
Вот и все, обновляем конфигурацию и радуемся печати чека из платежного поручения входящего!