При разработке расширений для работы с торговым оборудованием или при настройке интеграции 1С с кассовыми аппаратами (ККТ) программисты часто сталкиваются с необходимостью передачи контактных данных покупателя. Это требуется для отправки электронного чека через ОФД. Ошибка в формате данных может привести к тому, что чек не будет пробит или данные не уйдут клиенту, что является нарушением 54-ФЗ. Рассмотрим детально, как правильно подготовить эти данные.
Согласно Приказу ФНС России, формат фискальных данных (ФФД) строго регламентирует структуру передаваемых полей. За адрес покупателя отвечает тег 1008 («адрес покупателя»). Проанализируем основные требования к этому полю:
Важно понимать, что тег 1008 является обязательным в составе фискального документа только в том случае, если покупатель до момента расчета предоставил свои данные для получения чека в электронном виде. Если данные не переданы, тег может отсутствовать в печатной форме, но в электронном виде для ОФД его формат должен быть безупречен.
Разберем, какой вид должен иметь номер телефона при передаче в драйвер ККТ. Многие начинающие разработчики совершают ошибку, передавая номер так, как он записан в карточке контрагента (со скобками, тире и пробелами). Однако ФФД требует жесткого соответствия шаблону +{Ц}, где {Ц} — это последовательность цифр.
Основные правила:
Пример корректного формата: +79123456789. Если передать номер в формате 89123456789 или +7 (912) 345-67-89, современные драйверы (например, АТОЛ 10-й версии) вернут ошибку «Неверный формат параметра» еще на стадии формирования чека в памяти ККТ.
Для e-mail формат более привычен, но также имеет свои ограничения. Шаблон определяется как {С}@{С}, где {С} — набор допустимых символов строки. Несмотря на кажущуюся гибкость, следует придерживаться стандарта RFC 5322. Максимальная длина в 64 символа накладывает серьезное ограничение на длинные корпоративные адреса — это нужно учитывать при валидации данных в 1С перед отправкой на кассу.
Проанализируем ситуацию: в базе 1С телефон часто хранится в виде +7 (999) 000-11-22. Нам необходимо написать функцию, которая «причешет» эту строку перед передачей в объект ДанныеЧека. Посмотрим на пример кода, который решает эту задачу:
Функция ПодготовитьТелефонДляККТ(Знач ИсходныйТелефон) Экспорт
// Удаляем все символы, кроме цифр
ЧистыйНомер = "";
Для Индекс = 1 По СтрДлина(ИсходныйТелефон) Цикл
Символ = Сред(ИсходныйТелефон, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
ЧистыйНомер = ЧистыйНомер + Символ;
КонецЕсли;
КонецЦикла;
// Обработка префикса
Если Лев(ЧистыйНомер, 1) = "8" Тогда
ЧистыйНомер = "7" + Сред(ЧистыйНомер, 2);
КонецЕсли;
Если Лев(ЧистыйНомер, 1) <> "7" И СтрДлина(ЧистыйНомер) = 10 Тогда
ЧистыйНомер = "7" + ЧистыйНомер;
КонецЕсли;
Возврат "+" + ЧистыйНомер;
КонецФункции
Рассмотрим, что делает этот код: мы итерируем по строке, оставляя только цифры. Затем проверяем первый символ. Если пользователь ввел номер с «восьмерки», мы заменяем её на «7», так как международный формат требует именно код страны. В конце обязательно добавляем «+».
Если вы используете типовые конфигурации 1С, работа с кассой обычно идет через БПО. В структуре ДанныеЧека (или ПараметрыЧека) есть поле CustomerEmailPhone. Выясним важный нюанс: современные версии БПО пытаются автоматически форматировать строку, но полагаться на это на 100% не стоит. Если вы разрабатываете собственное расширение, лучше передать уже очищенную строку, чтобы избежать двусмысленности.
Иногда клиенты просят отправлять чек сразу и на телефон, и на почту. Однако текущий протокол ФФД (включая версии 1.1 и 1.2) не поддерживает передачу нескольких значений в теге 1008. В это поле записывается только один идентификатор. Если вы попытаетесь передать строку вида +79123456789, test@mail.ru, драйвер ККТ выдаст ошибку, так как символ запятой или точки с запятой недопустим для формата телефона, а наличие «+» и цифр в начале не соответствует формату e-mail.
Если бизнесу жизненно необходимо дублирование, это реализуется либо на уровне платных сервисов самого ОФД, либо программными средствами 1С (отправка письма с копией чека напрямую из программы через почтовый сервер), но в фискальный накопитель уйдет только один контакт.
Некорректный формат данных в теге 1008 может привести к серьезным последствиям:
Подведем итог: всегда очищайте строку от лишних символов, проверяйте наличие знака «+» для телефонов и символа «@» для почты. Длина строки не должна превышать 64 символа. Соблюдение этих простых правил гарантирует корректную работу вашей системы с любым ОФД и фискальным регистратором.