При работе с контрольно-кассовой техникой (ККТ) и отправкой электронных чеков покупателям часто возникает техническая сложность: номер телефона в бумажном чеке печатается корректно, но SMS-сообщение через Оператора фискальных данных (ОФД) не уходит. Проанализируем ситуацию: в большинстве случаев это происходит из-за того, что типовые конфигурации 1С (особенно старых релизов 1С:Управление торговлей 11, 1С:Комплексная автоматизация 2) передают номер телефона в формате 10 знаков, в то время как шлюзы ОФД ожидают международный формат из 11 цифр, начинающийся с «7».
Рассмотрим подробнее, почему так происходит и как мы можем это исправить, используя программные методы и современные механизмы платформы 1С.
Согласно требованиям форматов фискальных данных (ФФД), контактные данные покупателя передаются в теге 1008. Этот тег может содержать либо адрес электронной почты, либо номер телефона. Выясним причину ошибки: многие ОФД (например, Контур ОФД, Платформа ОФД, OFD.ru) при получении 10-значного номера (например, 9151111111) не могут идентифицировать его как корректный российский номер телефона и просто игнорируют команду на отправку SMS. Для успешной отправки номер должен иметь вид 79151111111.
В типовых решениях 1С за формирование данных для чека отвечает общая логика, сосредоточенная в модулях розничных продаж. Разберем по шагам, где именно происходит «обрезание» номера. Основная функция, которая нас интересует, обычно находится в общем модуле РозничныеПродажиКлиентСервер или в модулях Обработки.ТОСервер.
Проанализируем типичный фрагмент кода, который вызывает проблему:
// Фрагмент кода в типовой конфигурации
КонтактныеДанныеЭлектронногоЧека = НомерТелефонаВФормате10Знаков(Форма.Телефон);
Функция НомерТелефонаВФормате10Знаков принудительно очищает строку от лишних символов (скобок, тире, плюсов) и возвращает только последние 10 цифр. Именно это поведение нам необходимо изменить.
Если конфигурация уже снята с поддержки, мы можем внести изменения непосредственно в общий модуль. Нам нужно найти функцию ДанныеЭлектронногоЧека и изменить логику присвоения переменной КонтактныеДанныеЭлектронногоЧека.
Пример модифицированного кода:
// Было:
// КонтактныеДанныеЭлектронногоЧека = НомерТелефонаВФормате10Знаков(Форма.Телефон);
// Стало:
ЧистыйНомер = НомерТелефонаВФормате10Знаков(Форма.Телефон);
Если СтрДлина(ЧистыйНомер) = 10 Тогда
КонтактныеДанныеЭлектронногоЧека = "7" + ЧистыйНомер;
Иначе
КонтактныеДанныеЭлектронногоЧека = ЧистыйНомер;
КонецЕсли;
Однако помните, что изменение общего модуля РозничныеПродажиКлиентСервер может повлиять на отображение номера в других формах. Проверьте, не портится ли визуальное представление телефона в интерфейсе после ваших правок.
Чтобы не «курочить» типовую конфигурацию и сохранить возможность беспрепятственного обновления, лучше всего использовать механизм расширений. Мы можем перехватить выполнение процедуры с помощью аннотации &Вместо или &После.
Рассмотрим пример создания расширения для исправления формата:
РозничныеПродажиКлиентСервер.Пример кода в расширении:
&Вместо("ДанныеЭлектронногоЧека")
Функция Мой_ДанныеЭлектронногоЧека(Форма)
// Вызываем стандартный результат
Результат = ПродолжитьВызов(Форма);
// Проверяем, если это телефон и в нем 10 знаков
Если ЗначениеЗаполнено(Результат.КонтактныеДанные) И СтрДлина(Результат.КонтактныеДанные) = 10 Тогда
// Добавляем префикс страны "7"
Результат.КонтактныеДанные = "7" + Результат.КонтактныеДанные;
КонецЕсли;
Возврат Результат;
КонецФункции
Важное замечание: Если ваше решение работает в режиме совместимости с версиями ниже 8.3.10, убедитесь, что расширение настроено корректно, либо обновите версию платформы и режим совместимости для использования всех возможностей перехвата функций.
При решении подобных задач часто возникает вопрос: стоит ли создавать для каждого исправления отдельное расширение? Посмотрим на этот вопрос с точки зрения долгосрочного сопровождения:
Для исправления формата номера телефона логично выделить отдельное расширение с префиксом ККТ_Исправления.
Прежде чем приступать к программированию, проанализируем настройки вашего Личного кабинета ОФД. Некоторые операторы (например, OFD.ru или Платформа ОФД) имеют встроенную опцию: «Автоматически добавлять +7 к десятизначным номерам». Если такая настройка включена, сервер ОФД сам распознает номер и добавит недостающую цифру перед отправкой в SMS-шлюз. Это позволит решить проблему без вмешательства в код 1С.
Выясним еще один нюанс: формат передачи может зависеть от версии драйвера ККТ. При использовании АТОЛ ДТО 10, данные передаются в кассу в виде структуры объектов. В некоторых случаях драйвер может требовать префикс «+» перед семеркой. Если после добавления «7» SMS все равно не уходят, попробуйте передавать номер в формате +7915.... Однако большинство современных ОФД корректно принимают именно 11 цифр без спецсимволов.
Подведем итоги нашего исследования. Если вы столкнулись с проблемой отсутствия SMS от ОФД при корректной печати чека:
РозничныеПродажиКлиентСервер или Обработки.ТОСервер.77915....Соблюдение этих шагов позволит вам наладить стабильную отправку электронных чеков покупателям в полном соответствии с требованиями законодательства и ОФД.