Как программно пробить чеки ККМ на возврат в 1С:Управление торговлей 11.5 при отсутствии первичных чеков в базе

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе перехода с одной учетной системы на другую часто возникает ситуация, когда покупатель приносит товар на возврат, проданный еще в старой программе. В базе 1С:Управление торговлей 11.5 (УТ 11.5) при этом отсутствуют исходные документы Чек ККМ. Мы разберем, как программно создать необходимые объекты и правильно фискализировать возврат, соблюдая требования законодательства и логику Библиотеки подключаемого оборудования (БПО).

Анализ проблемы и выбор стратегии

Просто создать документ Чек ККМ с типом «Возврат» недостаточно. Для корректной работы кассового аппарата (ККТ) и соблюдения требований ФФД 1.05/1.2 программе необходимо передать данные о том, как именно был оплачен товар (нал или безнал), а также связать возврат с параметрами исходной продажи. Рассмотрим ситуацию: у нас есть данные из старой программы (суммы, товары, типы оплаты), но нет самих объектов в текущей базе 1С.

Существует два основных пути решения:

  1. Эмуляция истории: Программное создание «технических» чеков продажи без их фискализации, на основании которых затем создаются штатные документы возврата.
  2. Прямая фискализация: Формирование фискального чека на возврат напрямую через вызовы методов БПО, минуя жесткую привязку к документам-основаниям в 1С.

Шаг 1: Подготовка данных и создание документа-основания

Рассмотрим первый вариант, так как он позволяет сохранить целостность учета в УТ 11.5. Чтобы создать возврат, нам нужно, чтобы в системе существовал объект продажи. Проанализируем, как программно создать «архивный» чек:


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

// Заполняем табличную часть товары
НоваяСтрока = НовыйЧек.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаТовар;
НоваяСтрока.Количество = КоличествоИзСтаройБазы;
НоваяСтрока.Цена = ЦенаИзСтаройБазы;
НоваяСтрока.Сумма = СуммаИзСтаройБазы;

// Важно: записываем документ без вызова фискализации
НовыйЧек.Записать(РежимЗаписиДокумента.Проведение);

После того как «фиктивный» чек продажи создан, мы можем создать на его основании Чек ККМ на возврат. Это позволит использовать стандартные механизмы конфигурации.

Шаг 2: Программное формирование чека на возврат

Разберем, как создать документ возврата программно. Нам важно правильно указать вид оплаты, так как от этого зависит, в какой счетчик кассы (наличные или электронные) попадет сумма возврата.


ВозвратЧек = Документы.ЧекККМ.СоздатьДокумент();
ВозвратЧек.ВидОперации = Перечисления.ВидыОперацийЧекаККМ.Возврат;
ВозвратЧек.ЧекККМПродажа = СсылкаНаСозданныйРанееЧек; // Привязка к основанию
ВозвратЧек.Заполнить(СсылкаНаСозданныйРанееЧек); // Типовое заполнение по основанию

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

ВозвратЧек.Записать(РежимЗаписиДокумента.Проведение);

Шаг 3: Фискализация чека через механизмы БПО

Теперь перейдем к самому важному — отправке данных на кассовый аппарат. В современных версиях УТ 11.5 для этого используется общий модуль МенеджерОборудованияКлиент или специализированные модули денежных средств. Рассмотрим использование высокоуровневого метода ПробитьЧек, который является наиболее безопасным.

Проанализируем процедуру вызова фискализации из модуля ДенежныеСредстваКлиент:


ПараметрыПробития = ДенежныеСредстваКлиент.ПараметрыПробитияЧека();
ПараметрыПробития.ДокументСсылка = СсылкаНаВозвратныйЧек;

// Вызов стандартного диалога и процесса фискализации
ДенежныеСредстваКлиент.ПробитьЧек(ПараметрыПробития);

Важно: Этот метод работает асинхронно. Программа не будет ждать ответа от кассы мгновенно, а вызовет процедуру обратного вызова. Если вы пишете обработку для массового пробития, вам придется обрабатывать описание оповещения.

Шаг 4: Работа с низкоуровневыми командами (FiscalizeReceipt)

Если стандартный метод ПробитьЧек не подходит (например, нужно пробить чек специфической структуры без создания лишних документов), выясним, как подготовить данные для метода НачатьФискализациюЧекаНаФискальномУстройстве. Для этого нам потребуется сформировать структуру, описывающую чек.

Ключевые реквизиты структуры чека:

  1. ПризнакРасчета: Для возврата прихода передаем значение 2.
  2. ПозицииЧека: Массив структур, где для каждой позиции указывается наименование, цена, количество, ставка НДС и признак способа расчета (полный расчет, аванс и т.д.).
  3. ТаблицаОплат: Массив, где указывается тип оплаты (0 — наличные, 1 — электронные).

Пример подготовки параметров для БПО:


ПараметрыЧека = Новый Структура;
ПараметрыЧека.Вставить("ПризнакРасчета", 2); // Возврат прихода
ПараметрыЧека.Вставить("ПозицииЧека", Новый Массив);

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

// Выполняем команду через менеджер оборудования
МенеджерОборудованияКлиент.НачатьФискализациюЧекаНаФискальномУстройстве(
    ОписаниеОповещения, 
    ИдентификаторУстройства, 
    ПараметрыЧека
);

Особенности ФФД 1.2 и привязка к ФП исходного чека

Проанализируем ситуацию с требованиями налоговой. Согласно ФФД 1.2, при оформлении возврата рекомендуется указывать фискальный признак (ФП) и номер чека продажи из оригинального документа. Хотя 1С может пробить чек и без этих данных, для минимизации рисков при проверках стоит программно заполнить дополнительные реквизиты чека.

В структуре чека для БПО это теги:

Если данные из старой программы сохранились, обязательно передавайте их в структуру ПараметрыЧека в разделе ДополнительныеРеквизиты. Это сделает ваш возврат юридически безупречным.

Типичные ошибки при программном пробитии

Разберем основные моменты, на которых спотыкаются разработчики при реализации этой задачи:

  1. Несоответствие типов оплаты: Если в 1С указано «Оплата картой», а в ККТ этот индекс настроен как «Кредит», возникнет расхождение в отчете с гашением (Z-отчете). Всегда проверяйте соответствие индексов оплат в настройках драйвера ККТ.
  2. Попытка синхронного пробития в цикле: Поскольку методы БПО в управляемых формах асинхронны, нельзя просто запустить цикл Для каждого и вызывать пробитие. Каждое следующее пробитие должно инициироваться только после успешного завершения (Callback) предыдущего, иначе возникнет ошибка «Порт занят» или «Устройство не готово».
  3. Отсутствие проверки связи с ФН: Перед пробитием обязательно вызывайте проверку состояния ККТ. Если смена превысила 24 часа или закончилась бумага, программа должна корректно остановить процесс и выдать сообщение пользователю, не помечая документ в 1С как пробитый.

Завершение операции в учете

После успешной фискализации (получения положительного ответа от ККТ) не забудьте программно обновить статус документа Чек ККМ в базе 1С. Мы должны записать в него полученные от кассы данные:

Это позволит в дальнейшем строить корректные отчеты по кассовым сменам и видеть реальную картину остатков денежных средств в кассах ККМ.

← На главную