Как реализовать частичную оплату подарочным сертификатом и доплату в 1С 7.7 на кассах Штрих-М?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Продажа товаров с использованием подарочных сертификатов — стандартный бизнес-процесс для современной розничной торговли. Однако у разработчиков учетных систем на платформе 1С 7.7 при интеграции с онлайн-кассами (ККТ) часто возникают трудности. Основная сложность заключается в том, что подарочный сертификат с точки зрения законодательства и формата фискальных данных (ФФД 1.05 и выше) является не средством платежа, а документом, подтверждающим получение аванса.

Когда покупатель приходит в магазин с сертификатом номиналом 500 рублей и хочет приобрести товар стоимостью 550 рублей, перед программистом встает задача: как правильно передать эту операцию в ККТ? Нам необходимо разделить оплату в чеке: 500 рублей отразить как «зачет аванса» (предоплату), а оставшиеся 50 рублей — как оплату наличными или безналичными средствами. В этой статье мы подробно разберем, как решить эту задачу на примере ККТ «Штрих-М» и драйвера версии 4.14/4.15 в среде 1С 7.7.

Понимаем теорию: требования ФФД 1.05 к типам оплаты

Начиная с формата ФФД 1.05, налоговые органы строго контролируют обороты по различным типам платежей. В фискальном чеке под итоговой суммой покупки обязательно должны выводиться соответствующие реквизиты (теги ОФД):

Ранее, во времена ФФД 1.0, разработчики часто использовали обходной путь: настраивали в таблицах драйвера ККТ (Таблица №5 «Наименование типов оплаты») произвольные текстовые поля, например, записывали в «Тип оплаты 3» значение «Сертификат». В современных реалиях ФФД 1.05 этот подход категорически неприемлем и является грубым нарушением. Если вы отправите оплату сертификатом в произвольный тип оплаты, ККТ передаст эти данные в ОФД как обычный безналичный расчет. Это приведет к расхождениям в бухгалтерской отчетности и штрафам от налоговой инспекции.

В драйверах ККТ «Штрих-М» реализована жесткая привязка внутренних свойств к фискальным тегам ФФД:

Свойства со значениями от Summ3 до Summ13 зарезервированы под внутренние нужды ККТ либо дублируют безналичные оплаты в зависимости от конкретной прошивки. Для отражения доплаты по сертификату нам понадобятся исключительно свойства Summ1 (или Summ2) и Summ14.

Шаг 1. Оформляем продажу (эмиссию) подарочного сертификата

Поскольку сертификат — это авансовый платеж, при его продаже мы обязаны выдать чек с признаком способа расчета «Аванс». Проанализируем алгоритм создания такого чека в 1С 7.7:

  1. Регистрируем продажу сертификата как позиции чека.
  2. Устанавливаем признак способа расчета PaymentTypeSign = 3 (Аванс). Если сертификат приобретается под конкретную услугу или товар с заранее известной номенклатурой, можно использовать значение 1 (Предоплата 100%).
  3. Устанавливаем признак предмета расчета PaymentItemSign = 10 (Платеж). Это крайне важно, чтобы касса понимала, что продается не физический товар, а принимаются денежные средства.
  4. Закрываем чек, передавая сумму в Summ1 (если платили наличными) или Summ2 (если платили картой).

Рассмотрим пример кода на языке 1С 7.7 для продажи сертификата номиналом 500 рублей по карте:


// Подключение к объекту драйвера ККТ Штрих-М
Попытка
    Касса = СоздатьОбъект("AddIn.DrVFR");
Исключение
    Предупреждение("Не удалось загрузить драйвер ККТ Штрих-М!");
    Возврат;
КонецПопытки;

// Открываем чек продажи
Касса.Password = 30; // Пароль системного администратора по умолчанию
Касса.CheckType = 0; // Чек продажи
Касса.OpenCheck();

// Настройка параметров позиции
Касса.Quantity = 1;
Касса.Price = 500.00;
Касса.StringForPrinting = "Подарочный сертификат Номинал 500";
Касса.Tax1 = 0; // Без НДС или согласно вашей СНО

// Передаем теги ФФД 1.05 для аванса
Касса.PaymentTypeSign = 3; // Аванс
Касса.PaymentItemSign = 10; // Платеж

// Фискализируем операцию (регистрация продажи позиции)
Касса.FNOperation();

// Подготовка сумм к закрытию чека
// Обязательно обнуляем все типы оплат во избежание наложения старых данных
Для Ном = 1 По 16 Цикл
    Касса.УстановитьАтрибут("Summ" + Строка(Ном), 0);
КонецЦикла;

// Указываем, что оплата произведена безналичным расчетом (картой)
Касса.Summ2 = 500.00; 

// Закрываем чек расширенным методом
Касса.FNCloseCheckEx();

Шаг 2. Отоваривание сертификата с доплатой (метод FNCloseCheckEx)

Теперь разберем ключевую проблему автора темы на форуме. Клиент покупает товар за 550 рублей. Он предъявляет сертификат на 500 рублей и доплачивает 50 рублей безналичным путем (картой). Нам нужно сделать так, чтобы ККТ разбила оплату в подвале чека на две строки: «Предварительная оплата (Аванс)» и «Безналичными».

Для реализации этой возможности стандартный метод закрытия чека CloseCheck() не подходит, так как он предназначен для простых чеков с одним видом оплаты. Нам необходимо использовать метод FNCloseCheckEx() (или FNCloseCheckEx() в зависимости от версии используемой библиотеки).

Рассмотрим по шагам, как написать обработку этого процесса в 1С 7.7:


// Инициализация ККТ и открытие чека продажи товаров
Касса.CheckType = 0; 
Касса.OpenCheck();

// Добавляем позицию товара в чек
Касса.Quantity = 1;
Касса.Price = 550.00;
Касса.StringForPrinting = "Куртка мужская демисезонная";
Касса.Tax1 = 1; // Например, НДС 20%

// Для обычного товара при полном расчете устанавливаем соответствующие признаки
Касса.PaymentTypeSign = 4; // Полный расчет
Касса.PaymentItemSign = 1; // Товар

Касса.FNOperation();

// Очищаем свойства Summ1...Summ16 перед заполнением. 
// В 1С 7.7 OLE-объекты могут сохранять значения предыдущих транзакций, 
// что часто приводит к ошибке "Сумма оплат меньше суммы чека".
Для Ном = 1 По 16 Цикл
    Касса.УстановитьАтрибут("Summ" + Строка(Ном), 0);
КонецЦикла;

// Распределяем суммы оплат по правильным фискальным свойствам
Касса.Summ14 = 500.00; // Сумма зачета аванса (сертификат)
Касса.Summ2 = 50.00;   // Доплата безналичными средствами

// Передаем систему налогообложения (СНО), например, УСН Доход-Расход
Касса.TaxType = 1; 

// Закрываем чек. На чековой ленте отобразится разделение оплат!
Касса.FNCloseCheckEx();

Шаг 3. Решение проблемы «Сумма покупки меньше номинала сертификата»

Проанализируем еще одну частую проблему, упомянутую в сообщении 3: что делать, если покупатель приобретает товар на сумму 400 рублей, используя при этом сертификат номиналом 500 рублей?

Если вы попытаетесь передать в драйвер кассы параметры Summ14 = 500.00 при общей сумме чека 400.00 рублей, ККТ заблокирует операцию и выдаст ошибку несоответствия сумм (ошибка драйвера 142 или «Сумма оплат превышает сумму чека»). Онлайн-касса физически не может принять оплату, превышающую итоговую сумму зарегистрированных товарных позиций чека.

Для обхода этой ситуации мы должны реализовать математический расчет ограничений на уровне кода 1С 7.7. Нам нужно сравнить сумму покупки и номинал сертификата:

Посмотрим на пример реализации данного алгоритма:


// Исходные данные
СуммаЧека = 400.00;
НоминалСертификата = 500.00;

// Переменные для ККТ
ПереданныйЗачетАванса = 0;
ПереданнаяДоплата = 0;

Если НоминалСертификата >= СуммаЧека Тогда
    // Сертификат полностью покрывает покупку, доплата не требуется
    ПереданныйЗачетАванса = СуммаЧека; 
    ПереданнаяДоплата = 0;
    
    // В базе 1С фиксируем остаток на сертификате: 
    // Остаток = НоминалСертификата - СуммаЧека (т.е. 100 рублей)
Иначе
    // Требуется доплата со стороны покупателя
    ПереданныйЗачетАванса = НоминалСертификата;
    ПереданнаяДоплата = СуммаЧека - НоминалСертификата;
    
    // В базе 1С сертификат полностью гасится (остаток = 0)
КонецЕсли;

// Передаем вычисленные значения в драйвер
Касса.Summ14 = ПереданныйЗачетАванса;
Касса.Summ2 = ПереданнаяДоплата; // Предполагаем оплату картой

Важные технические рекомендации по стабильной работе с ККТ

Чтобы исключить сбои оборудования и ошибки кассиров при работе с распределенными оплатами, придерживайтесь следующих правил:

  1. Всегда очищайте свойства перед расчетом. Как показано в коде выше, цикл очистки свойств Summ1...Summ16 обязателен. Если этого не делать, касса может суммировать платежи из предыдущего пробитого чека, что вызовет фатальный сбой печати.
  2. Контролируйте копейки и округление. При распределении скидок по позициям чека и последующем делении оплаты могут возникнуть расхождения в копейках. Для избежания расхождений в 1 копейку используйте встроенную функцию округления драйвера ККТ RoundingSumm непосредственно перед вызовом закрытия чека.
  3. Явно передавайте СНО. Метод FNCloseCheckEx() чувствителен к установленной системе налогообложения. Если у вас в кассе зарегистрировано несколько СНО (например, УСН и Патент), обязательно передавайте код активной СНО в свойство TaxType перед закрытием чека.

Применение описанной методики и использование специализированного метода FNCloseCheckEx() позволит вам настроить корректный и легальный учет продаж по подарочным сертификатам в полном соответствии с ФФД 1.05. Это избавит вашу компанию от претензий со стороны налоговых органов и обеспечит стабильную работу кассового узла.

← На главную