Как передать ИНН кассира и контакты покупателя в ОФД через драйвер ШТРИХ-М в 1С

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

При интеграции торгового оборудования с решениями на платформе 1С (особенно на классической платформе 1С:Предприятие 7.7 или при прямой работе через COM-объект драйвера ККТ) разработчики часто сталкиваются с неочевидным поведением кассовых аппаратов и операторов фискальных данных (ОФД). Типичный пример — ситуация, когда программный код для передачи ИНН кассира (тег 1203) выполняется без ошибок, фискальный накопитель фиксирует данные, но на сайте ОФД в электронном чеке информация не отображается. В этой статье мы подробно разберем, как правильно передавать ИНН кассира и контактные данные покупателя через драйвер «Штрих-М», выясним причины скрытия этих данных в личном кабинете ОФД, а также рассмотрим особенности отправки электронных чеков по SMS и Email.

Разбор проблемы: почему ИНН кассира не виден на сайте ОФД

Проанализируем типичный сценарий. Разработчик передает ИНН кассира с помощью методов низкоуровневого драйвера «Штрих-М». Код отрабатывает штатно, ошибок от кассы не возвращается. При просмотре фискального документа непосредственно из памяти ФН через утилиту «Тест драйвера» ИНН кассира присутствует. Однако при просмотре чека в личном кабинете ОФД (например, Такском, Платформа ОФД или Контур.ОФД) этого реквизита нет.

Выясним причину такого поведения. Дело в требованиях Форматов фискальных документов (ФФД), утвержденных Федеральной налоговой службой. Согласно действующим стандартам (ФФД 1.05, 1.1, 1.2), для реквизита «ИНН кассира» (тег 1203) установлен признак передачи «Э» (электронный формат). Это означает следующее:

  1. Данный реквизит является обязательным для передачи в электронной форме в адрес налоговых органов через ОФД (если у кассира физически есть ИНН РФ).
  2. На бумажном чеке этот тег печатать не требуется.
  3. В визуальном представлении электронного чека в ЛК ОФД большинство операторов по умолчанию выводят графический макет, полностью дублирующий бумажную ленту («шаблон печатной формы»). Соответственно, тег 1203 в этом шаблоне просто отсутствует.

Чтобы убедиться, что ИНН кассира успешно передан, необходимо переключить режим просмотра чека на сайте ОФД с «обычной/печатной формы» на отображение всех тегов (TLV-структура, JSON/XML-детализация или расширенная структура чека). Там этот реквизит обязательно отобразится, если он был корректно записан в ФН. Также данный факт всегда может подтвердить техническая поддержка вашего ОФД по запросу фискального признака документа (ФПД).

Реализация передачи ИНН кассира (Тег 1203) в коде 1С

Рассмотрим, как правильно передавать тег 1203 через драйвер ККТ «Штрих-М». Важно соблюдать строгую последовательность вызова методов драйвера. Передавать ИНН кассира необходимо строго в теле открытого чека. Существует две основные рабочие схемы позиционирования этой команды в коде.

Вариант 1. Передача тега сразу после открытия чека

Этот вариант является наиболее стандартным и рекомендуется большинством специалистов по кассовому оборудованию. Проанализируем пример кода:


// Открываем фискальный чек
FR.Password = ПарольКассира;
FR.CheckType = 0; // 0 - чек продажи
FR.OpenCheck();

// Передаем ИНН кассира (Тег 1203)
FR.Password = ПарольКассира;
FR.TagNumber = 1203; // Номер тега ИНН кассира
FR.TagType = 7;      // Тип тега (7 - Строка)
FR.TagValueStr = СокрЛП(Кассир.ИНН); // Значение ИНН (строка из 12 цифр)
FR.FNSendTag(); // Метод отправки тега в ККТ

// Далее регистрируем фискальные строки (продажи)
FR.Password = ПарольКассира;
FR.Quantity = ПлатноеКоличество;
FR.Price = ЦенаПокупателя;                   
FR.PaymentItemSign = ОпределитьПризнакПредметаРасчета();
FR.PaymentTypeSign = 4; // Признак способа расчета (например, Полный расчет)
FR.StringForPrinting = Товар;
FR.Department = 1;
FR.FNOperation();

// Оплата и закрытие чека
FR.Password = ПарольКассира;
FR.Summ1 = Оплата;                            
FR.StringForPrinting = "";
FR.FNCloseCheckEX();

Вариант 2. Передача тега перед закрытием чека

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


FR.Password = ПарольКассира;
FR.CheckType = 0;
FR.OpenCheck();

// Фискальная строка продажи
FR.Password = ПарольКассира;
FR.Quantity = ПлатноеКоличество;
FR.Price = ЦенаПокупателя;                   
FR.PaymentItemSign = ОпределитьПризнакПредметаРасчета();
FR.PaymentTypeSign = 4;
FR.StringForPrinting = Товар;
FR.Department = 1;
FR.FNOperation();

// Передаем ИНН кассира перед оплатой
FR.Password = ПарольКассира;
FR.TagNumber = 1203;
FR.TagType = 7;
FR.TagValueStr = СокрЛП(Кассир.ИНН);
FR.FNSendTag();

// Закрытие чека
FR.Password = ПарольКассира;
FR.Summ1 = Оплата;                            
FR.StringForPrinting = "";
FR.FNCloseCheckEX();

Оба варианта корректны и обеспечивают запись тега 1203 в фискальный документ. Обратите внимание, что ИНН кассира должен состоять ровно из 12 цифр. Передача некорректной строки (например, с пробелами или неверным количеством символов) может быть заблокирована встроенным ФН-контролем драйвера.

Передача контактных данных покупателя (Тег 1008) для отправки Email и SMS

Согласно требованиям 54-ФЗ, по требованию покупателя продавец обязан направить электронную версию чека на его абонентский номер (SMS) или адрес электронной почты (Email). Для этих целей в ФФД используется Тег 1008 («Адрес покупателя»).

Рассмотрим, как реализовать эту отправку в 1С при работе с драйвером «Штрих-М». Драйвер умеет самостоятельно определять тип переданного контакта на основе анализа текста. Если строка содержит символ @, драйвер распознает её как Email, если строка начинается на +7 или состоит только из цифр — как телефонный номер.

Посмотрим на пример реализации в коде 1С:


// Переменная КудаОтправитьЧек может содержать "+79991234567" или "client@mail.ru"
Если ПустоеЗначение(КудаОтправитьЧек) = 0 Тогда
    // Заполняем свойство драйвера
    FR.CustomerEmail = СокрЛП(КудаОтправитьЧек);
    // Вызываем метод отправки контакта покупателя в ККТ
    FR.FNSendCustomerEmail();
КонецЕсли;

Важное правило позиционирования: данный метод необходимо вызывать в любой момент после открытия чека методом OpenCheck(), но до закрытия чека методом FNCloseCheckEX(). Наиболее надежная практика — выполнять передачу контакта сразу после открытия чека.

Особенности тарификации отправки сообщений операторами ОФД

Часто разработчики и администраторы сталкиваются с проблемой: программный код отправки контакта покупателя отрабатывает успешно, контакт печатается на бумажном чеке, но электронный чек клиенту не приходит. Выясним, почему это происходит:

Таким образом, для стабильной работы сервиса отправки электронных чеков по SMS обязательно убедитесь в наличии активного пакета сообщений в личном кабинете вашего оператора фискальных данных.

← На главную