При работе с контрольно-кассовой техникой (ККТ) в программах 1С, особенно в самописных решениях на базе 1С:Бухгалтерия 3.0, часто возникает вопрос: как правильно оформить закрывающий чек, если клиент ранее уже внес аванс? Распространенная ошибка заключается в том, что при попытке «зачесть» аванс, сумма в отчетах ККТ (X-отчет и Z-отчет) удваивается, создавая иллюзию повторного прихода денег. Рассмотрим подробно, как реализовать эту логику в коде и правильно настроить фискальные признаки.
Согласно требованиям 54-ФЗ и форматам фискальных данных (ФФД), продажа по авансовой схеме должна состоять из двух этапов, на каждом из которых пробивается отдельный чек:
Разберем, как это реализовать программно, используя механизмы БПО (Библиотеки подключаемого оборудования).
Проанализируем структуру данных, которая передается в модуль ПечатьФискальныхДокументов. Для каждой позиции чека (строки таблицы товаров или услуг) необходимо правильно установить ПризнакСпособаРасчета. Это тег 1214 в терминах ФФД.
В коде 1С мы используем перечисление ПризнакиСпособаРасчета. Для второго чека (когда услуга оказана) значение должно быть следующим:
// Для каждой строки позиции чека
СтрокаПозиции.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ПередачаСПолнойОплатой;
// Или значение 4 для ФФД
Если же мы только получаем деньги, то используем Перечисления.ПризнакиСпособаРасчета.Аванс (значение 3). Важно помнить: если в момент получения денег вы точно знаете, за какой товар платит клиент — это Предоплата. Если перечень товаров не определен — это Аванс.
Это самый важный этап, на котором чаще всего совершаются ошибки. Выясним, почему суммы «плюсуются» в отчетах. Если во втором чеке вы укажете тип оплаты «Наличные», ККТ решит, что вы получили живые деньги еще раз.
Для зачета аванса в ТаблицеОплат (теги 1215-1217) нужно передать специальный тип. Посмотрим на пример формирования структуры оплаты в 1С:
СтруктураОплаты = Новый Структура;
СтруктураОплаты.Вставить("Сумма", СуммаЗачета);
СтруктураОплаты.Вставить("ТипОплаты", Перечисления.ТипыОплатыККТ.Предоплата);
// В некоторых версиях БПО это может быть индекс 2 или 3,
// соответствующий «Зачету аванса»
МассивОплат.Добавить(СтруктураОплаты);
Когда ККТ получает тип оплаты Предоплата (или «Зачет аванса»), она понимает, что физического движения денег в кассе сейчас нет. Сумма чека пойдет в выручку, но не увеличит остаток наличности в ящике.
Проанализируем ситуацию, которая пугает многих бухгалтеров: почему сумма зачета отображается в строке «Предварительная оплата (аванс)» в отчете о закрытии смены? Рассмотрим это на примере:
День 1: Клиент внес 100 рублей.
В отчете ККТ: Приход (Наличные) = 100, Авансы (полученные) = 100. В кассе лежит 100 рублей.
День 2: Мы оказали услугу на 30 рублей в счет аванса.
В чеке указано: «Полный расчет», сумма 30 руб., тип оплаты «Зачет аванса».
В отчете ККТ за этот день: В строке «Предварительная оплата (аванс)» появится сумма 30 рублей. Это не новый приход денег! Это показатель того, какая часть выручки за сегодня была сформирована за счет ранее полученных авансов. Наличных в кассе при этом будет 0 рублей (если других продаж не было).
Таким образом, налоговая видит: вчера вы получили деньги, а сегодня вы «отработали» часть этих денег, превратив обязательство в реальную выручку.
Если вы работаете с модулем МенеджерОборудованияВызовСервера или напрямую с объектом Драйвер, убедитесь, что при формировании XML-пакета для чека вы правильно передаете узлы оплаты. Рассмотрим пример структуры XML для зачета аванса:
// Пример упрощенной структуры для передачи в драйвер
<Payments>
<Payment TypeClose="2" Sum="30.00" />
<!-- Где TypeClose="2" обычно соответствует зачету аванса -->
</Payments>
Важно помнить, что коды типов оплаты (0, 1, 2, 3...) могут незначительно отличаться в зависимости от модели ККТ (Атол, Штрих-М) и версии используемого драйвера, однако в рамках БПО 1С эти различия нивелируются использованием стандартных перечислений.
Не забудем про налоговый учет. При получении аванса НДС рассчитывается по ставке 20/120 (или 10/110). В момент зачета аванса (второй чек) НДС в чеке должен быть указан уже по обычной ставке — 20% или 10%. Это критически важно для корректного сопоставления данных в декларации по НДС и данных, ушедших в ОФД.
Выясним причину возможных расхождений: если вы укажете во втором чеке расчетную ставку (дробную), это будет методологической ошибкой, так как происходит факт реализации товара или услуги, а не получение авансового платежа.
Рассмотрим более сложный случай: услуга стоит 150 рублей, а аванс был всего 100. Как пробить такой чек? В этом случае у нас будет одна позиция номенклатуры на 150 рублей, но в таблице оплат будет две строки:
Программа 1С при правильной настройке автоматически распределит эти суммы, и в чеке клиент увидит, что часть суммы он оплатил ранее, а часть вносит сейчас. Это обеспечит полное соответствие физического остатка денег в кассе и данных в фискальном накопителе.