Почему при печати чека на предоплату из ПКО в УТ 10.3 количество товара приравнивается к единице?

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

При работе в конфигурации 1С:Управление торговлей 10.3 (начиная с версий 10.3.4x и выше) пользователи часто сталкиваются с особенностью печати фискальных чеков из документа Приходный кассовый ордер (ПКО). Если ПКО оформляется как предоплата, в печатной форме чека количество любого товара принудительно меняется на «1», единица измерения становится «Платеж», а цена приравнивается к общей сумме строки. Разберемся, почему это происходит, как реализовано в коде и почему не стоит пытаться это «исправлять».

Анализ программного механизма в 1С

Для того чтобы понять логику программы, проанализируем общий модуль ФорматноЛогическийКонтрольКлиентСервер. Именно в нем сосредоточена логика подготовки данных перед отправкой на драйвер ККТ. Основная работа выполняется в процедуре ПривестиДанныеКТребуемомуФормату.

Рассмотрим фрагмент кода, который определяет, является ли текущая операция передачей товара или простым приемом денежных средств:


ИначеЕсли ПозицияЧека.ПризнакСпособаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиСпособаРасчета.Аванс")
    ИЛИ ПозицияЧека.ПризнакСпособаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиСпособаРасчета.ПредоплатаПолная") Тогда
    БезПередачиТовара = Истина;

Если условие выполняется (выбран признак «Аванс» или «Предоплата»), переменная БезПередачиТовара принимает значение Истина. Далее по коду система жестко модифицирует структуру ПозицияЧека, игнорируя фактические данные из табличной части документа:


Если БезПередачиТовара Тогда
    Если ПозицияЧека.Свойство("ЕдиницаИзмерения") Тогда
        ПозицияЧека.ЕдиницаИзмерения = "Платеж";
    КонецЕсли;

    Если ПозицияЧека.Свойство("Количество") Тогда
        ПозицияЧека.Количество = 1;
    КонецЕсли;

    Если ПозицияЧека.Свойство("Цена") Тогда
        ПозицияЧека.Цена = ПозицияЧека.Сумма;
    КонецЕсли;

    ПозицияЧека.Вставить("ПризнакПредметаРасчета", ПредопределенноеЗначение("Перечисление.ПризнакиПредметаРасчета.ПлатежВыплата"));
    ИсправленыОсновныеПараметры = Истина;
КонецЕсли;

Проанализируем ситуацию: даже если в вашем счете указано «Кабель 5 метров по 20 рублей», при печати чека из ПКО программа преобразует это в «Кабель 1 Платеж по 100 рублей». Это выглядит странно для пользователя, но имеет под собой четкое законодательное обоснование.

Требования законодательства (54-ФЗ) и ФФД

Выясним причину такого поведения системы. Согласно требованиям 54-ФЗ и форматам фискальных данных (ФФД 1.05 и выше), существует жесткое разделение между моментом оплаты и моментом передачи товара.

  1. Признак способа расчета (Тег 1214): Если вы берете деньги заранее, вы обязаны указать, что это «Аванс» или «Предоплата». В этот момент товар физически не отгружается.
  2. Признак предмета расчета (Тег 1212): Поскольку отгрузки нет, предметом расчета в чеке является не «Товар», а «Платеж» (денежная операция).
  3. Математическая логика частичной оплаты: Представим, что покупатель вносит 500 рублей предоплаты за товар стоимостью 1000 рублей в количестве 10 штук. Если в чеке оставить количество «10», то цена должна составить «50», что не соответствует действительности. Если оставить цену «100», то количество должно быть «5», но покупатель заказывал «10». Единственный законный способ отразить это в чеке предоплаты — указать количество «1» (один платеж) на сумму внесенных средств.

Двухэтапная схема печати чеков

Разберем по шагам, как должна выглядеть цепочка документов в «1С:Управление торговлей 10.3», чтобы учет был корректным:

Шаг 1: Прием денег (ПКО). Пробивается первый чек. В нем указывается признак «Предоплата», количество «1», единица измерения «Платеж». Это фиксирует в налоговой факт получения вами аванса.

Шаг 2: Отгрузка товара (Реализация товаров и услуг). В момент передачи товара покупателю вы обязаны пробить второй чек из документа реализации. Именно в этом втором чеке будут указаны реальные 5 метров кабеля, правильная цена и количество. В качестве способа оплаты в этом чеке будет указано «Зачет аванса» (сумма наличных или безналичных при этом будет равна нулю, так как деньги были получены ранее).

Особенности работы драйверов ККТ

Важно отметить, что современные драйверы онлайн-касс (например, АТОЛ или Штрих-М) выполняют внутреннюю проверку данных. Если попытаться передать на кассу признак предмета расчета Платеж, но при этом указать количество, отличное от единицы, драйвер вернет ошибку «Некорректный параметр» или «Ошибка ФЛК».

Разработчики 1С добавили код в модуль ФорматноЛогическийКонтрольКлиентСервер именно для того, чтобы обеспечить совместимость со всеми типами оборудования и гарантировать, что чек будет пробит без ошибок драйвера.

Можно ли изменять этот код?

Проанализируем последствия ручного вмешательства в данный механизм. Если вы решите закомментировать этот «кусман» кода (как выразились сами разработчики 1С в комментариях), вы столкнетесь со следующими проблемами:

Резюме: Описанное поведение является штатным и соответствует методологии работы с онлайн-кассами. Если вам необходимо видеть в чеке точное количество товара, это должно происходить в момент его фактической передачи (второй чек), а при предоплате единицей расчета всегда выступает сам денежный перевод.

← На главную