В процессе перехода с одной учетной системы на другую часто возникает ситуация, когда покупатель приносит товар на возврат, проданный еще в старой программе. В базе 1С:Управление торговлей 11.5 (УТ 11.5) при этом отсутствуют исходные документы Чек ККМ. Мы разберем, как программно создать необходимые объекты и правильно фискализировать возврат, соблюдая требования законодательства и логику Библиотеки подключаемого оборудования (БПО).
Просто создать документ Чек ККМ с типом «Возврат» недостаточно. Для корректной работы кассового аппарата (ККТ) и соблюдения требований ФФД 1.05/1.2 программе необходимо передать данные о том, как именно был оплачен товар (нал или безнал), а также связать возврат с параметрами исходной продажи. Рассмотрим ситуацию: у нас есть данные из старой программы (суммы, товары, типы оплаты), но нет самих объектов в текущей базе 1С.
Существует два основных пути решения:
Рассмотрим первый вариант, так как он позволяет сохранить целостность учета в УТ 11.5. Чтобы создать возврат, нам нужно, чтобы в системе существовал объект продажи. Проанализируем, как программно создать «архивный» чек:
НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
НовыйЧек.Дата = ДатаПродажиИзСтаройБазы;
НовыйЧек.Статус = Перечисления.СтатусыЧековККМ.Пробит; // Помечаем как уже пробитый
НовыйЧек.КассаККМ = КассаСсылка;
НовыйЧек.Склад = СкладСсылка;
НовыйЧек.Организация = ОрганизацияСсылка;
// Заполняем табличную часть товары
НоваяСтрока = НовыйЧек.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаТовар;
НоваяСтрока.Количество = КоличествоИзСтаройБазы;
НоваяСтрока.Цена = ЦенаИзСтаройБазы;
НоваяСтрока.Сумма = СуммаИзСтаройБазы;
// Важно: записываем документ без вызова фискализации
НовыйЧек.Записать(РежимЗаписиДокумента.Проведение);
После того как «фиктивный» чек продажи создан, мы можем создать на его основании Чек ККМ на возврат. Это позволит использовать стандартные механизмы конфигурации.
Разберем, как создать документ возврата программно. Нам важно правильно указать вид оплаты, так как от этого зависит, в какой счетчик кассы (наличные или электронные) попадет сумма возврата.
ВозвратЧек = Документы.ЧекККМ.СоздатьДокумент();
ВозвратЧек.ВидОперации = Перечисления.ВидыОперацийЧекаККМ.Возврат;
ВозвратЧек.ЧекККМПродажа = СсылкаНаСозданныйРанееЧек; // Привязка к основанию
ВозвратЧек.Заполнить(СсылкаНаСозданныйРанееЧек); // Типовое заполнение по основанию
// Проверяем тип оплаты
Если ТипОплаты = "Безнал" Тогда
ВозвратЧек.ОплатаПлатежнымиКартами.Очистить();
НоваяОплата = ВозвратЧек.ОплатаПлатежнымиКартами.Добавить();
НоваяОплата.Сумма = ВозвратЧек.СуммаДокумента;
НоваяОплата.ВидОплаты = ВидОплатыБезналСсылка;
Иначе
// Для нал ничего дополнительно в ТЧ оплаты в простом случае не пишем,
// сумма подтянется из СуммаДокумента
КонецЕсли;
ВозвратЧек.Записать(РежимЗаписиДокумента.Проведение);
Теперь перейдем к самому важному — отправке данных на кассовый аппарат. В современных версиях УТ 11.5 для этого используется общий модуль МенеджерОборудованияКлиент или специализированные модули денежных средств. Рассмотрим использование высокоуровневого метода ПробитьЧек, который является наиболее безопасным.
Проанализируем процедуру вызова фискализации из модуля ДенежныеСредстваКлиент:
ПараметрыПробития = ДенежныеСредстваКлиент.ПараметрыПробитияЧека();
ПараметрыПробития.ДокументСсылка = СсылкаНаВозвратныйЧек;
// Вызов стандартного диалога и процесса фискализации
ДенежныеСредстваКлиент.ПробитьЧек(ПараметрыПробития);
Важно: Этот метод работает асинхронно. Программа не будет ждать ответа от кассы мгновенно, а вызовет процедуру обратного вызова. Если вы пишете обработку для массового пробития, вам придется обрабатывать описание оповещения.
Если стандартный метод ПробитьЧек не подходит (например, нужно пробить чек специфической структуры без создания лишних документов), выясним, как подготовить данные для метода НачатьФискализациюЧекаНаФискальномУстройстве. Для этого нам потребуется сформировать структуру, описывающую чек.
Ключевые реквизиты структуры чека:
2.Пример подготовки параметров для БПО:
ПараметрыЧека = Новый Структура;
ПараметрыЧека.Вставить("ПризнакРасчета", 2); // Возврат прихода
ПараметрыЧека.Вставить("ПозицииЧека", Новый Массив);
Для Каждого СтрокаТовар Из ТаблицаТоваров Цикл
Позиция = Новый Структура;
Позиция.Вставить("Наименование", СтрокаТовар.Номенклатура.НаименованиеПолное);
Позиция.Вставить("Количество", СтрокаТовар.Количество);
Позиция.Вставить("Цена", СтрокаТовар.Цена);
Позиция.Вставить("СтавкаНДС", "20"); // Указывается согласно драйверу
ПараметрыЧека.ПозицииЧека.Добавить(Позиция);
КонецЦикла;
// Выполняем команду через менеджер оборудования
МенеджерОборудованияКлиент.НачатьФискализациюЧекаНаФискальномУстройстве(
ОписаниеОповещения,
ИдентификаторУстройства,
ПараметрыЧека
);
Проанализируем ситуацию с требованиями налоговой. Согласно ФФД 1.2, при оформлении возврата рекомендуется указывать фискальный признак (ФП) и номер чека продажи из оригинального документа. Хотя 1С может пробить чек и без этих данных, для минимизации рисков при проверках стоит программно заполнить дополнительные реквизиты чека.
В структуре чека для БПО это теги:
Если данные из старой программы сохранились, обязательно передавайте их в структуру ПараметрыЧека в разделе ДополнительныеРеквизиты. Это сделает ваш возврат юридически безупречным.
Разберем основные моменты, на которых спотыкаются разработчики при реализации этой задачи:
Для каждого и вызывать пробитие. Каждое следующее пробитие должно инициироваться только после успешного завершения (Callback) предыдущего, иначе возникнет ошибка «Порт занят» или «Устройство не готово».После успешной фискализации (получения положительного ответа от ККТ) не забудьте программно обновить статус документа Чек ККМ в базе 1С. Мы должны записать в него полученные от кассы данные:
НомерЧекаККМНомерКассовойСменыФискальныйПризнакЭто позволит в дальнейшем строить корректные отчеты по кассовым сменам и видеть реальную картину остатков денежных средств в кассах ККМ.