Данная статья была написана в виде поста для Хабра в большей части из-за того, что вокруг вопроса онлайн-касс для интернет-сайтов возник настоящий информационный вакуум. С одной стороны, в сети полно статей на тему онлайн-касс, с другой — информации непосредственно о решениях для веб-сайтов не очень много, особенно технической. Только слова, что «надо срочно» и «будут штрафовать». Нам этот квест показался достаточно интересным и запутанным, если кому поможет — будем рады.  Что такое онлайн-касса, как она взаимодействует с налоговыми органами и общее описание технологии можно почитать на профильных сайтах. Здесь же приведена вся техническая информация по продуктам, которую удалось найти, по сути это переработка нашей внутренней статьи Вики на эту тему. Возможно, статья потеряет актуальность очень скоро, так что она написана по состоянию на середину июня 2017 года. И да, вроде как именно для интернет-сайтов, торгующих услугами в онлайне, крайний срок внедрения не в этом году, но экспериментировать с налоговыми органами не хочется, да и готовить сани лучше летом... Итак, мы продаём онлайн-услуги на наших сайтах (подписки). Принимаем платежи через Яндекс.Кассу и PayPal. Работаем в белую, все дела. Теперь, оказывается, нам нужна касса для расчётов с физическими лицами (кроме оплаты ими с собственного расчётного счёта в банке). В цепочку оплаты на сайте где-то между ответом «одобрено» от платёжного шлюза и оказанием услуги нужно вставить ещё одну операцию «выбить чек». «Ну, какие проблемы, арендуем сервис онлайн-касс и всё» — решили мы. И тут суровая реальность показала: всё красивые лендинги АТОЛ-онлайн, Старруса и прочих не более чем рекламные лендинги. SaaS-решений, готовых к эксплуатации на сегодняшний день нет, во всяком случае, мы не смогли их найти. Как и хвалёной интеграции Яндекс.Кассы с АТОЛ-онлайн. Тот же запрос технической документации в АТОЛ забуксовал сразу на входе, а Старрус посоветовал поставить stand alone вместо их неготового SaaS. Потом выяснились пикантные подробности о ситуации с фискальными накопителями и стало совсем весело.  В итоге, проведя анализ рынка, в том числе по адекватности общения с поддержками производителей, мы остановились на решении от Старруса: ККТ РП Система 1ФС. Мы решили приобрести комплекс, установить его на своих мощностях и дописать наш биллинг для взаимодействия со всем этим. Но в начале немного терминологии: Фискальный регистратор РП Система 1ФС (ФА) — онлайн-касса (ККТ) нового поколения с автоматической отправкой фискальных данных в ОФД. Позволяет по сети принимать команды в формате JSON и «выбивать чеки». Всё внешнее взаимодействие с ОФД — blackbox, работает самостоятельно и каких-либо дополнительных телодвижений не требует. Официально, в «реестре» есть только модель РП Система 1ФА. Она предназначена для торговых автоматов и имеет в комплекте чековый принтер. Модель для интернет-сайтов называется РП Система 1ФС, отличается отсутствием принтера. Но так как модели РП Система 1ФС нет в реестре, под его видом продаётся модель РП Система 1ФА, но без принтера в комплекте. Эта информация позволит избежать путаницы при выборе и заказе ККТ. Сама ККТ представляет из себя небольшую металлическую коробочку, окрашенную чёрной краской. На корпус нанесены маркировки и в торцевых плоскостях присутствуют все интерфейсные разъёмы.  На корпусе присутствует лючок на винтовом креплении, за ним находится отсек для фискального накопителя (ФН), который работает через внутренний интерфейс UART. Вставить накопитель неправильно не позволит ключ (заглушенный pin), но учитывая конструктивные особенности лючка, вставлять, а особенно извлекать накопитель непросто. При регистрации и перерегистрации ФН в паспорт ККТ заносится соответствующая запись.  Обобщённое состояние ККТ выводится на корпусе посредством четырёх светодиодных индикаторов. Статус, обмен данными, состояние ошибки. Питание осуществляется от любого стабилизированного источника постоянного тока от 7.5 до 24 вольт. «Круглый» штекер, «плюс» внутри. Блок питания в комплект не входит, у поставщика/производителя их как правило нет в наличии, советуют приобретать сторонний совместимый.  Ethernet контроллер имеет предустановленный адрес, либо получает настройки по DHCP (приоритет DHCP перед статическими настройками). RS232 (DB-9 in/out) работает в режиме 115200 и используется для локального подключения к управляющему компьютеру и для подключения чекового принтера, при необходимости. На всех этапах стандартного взаимодействия с ККТ, начиная с регистрации ФН и заканчивая «пробиванием» чеков можно производить исключительно по локальной сети через Ethernet, не взаимодействуя с RS232. На корпусе есть USB, но он не опробован. Данный модуль является криптографическим средством, на нём сохраняются фискальные данные (чеки), также он генерирует результат криптографических функций с вводными данными (фискальный признак). Конструктивно выполнен из серого пластика с голографической защитной лентой. Интерфейсный разъём осуществляет питание ФН в рабочем режиме и обмен данными по протоколам UART, I2C и RS232. Внутри содержится литиевый элемент питания, который поддерживает работоспособность внутренних часов (RTC). ФН имеет искусственно ограниченный срок действия и подлежит замене каждые 13 месяцев.  Взаимодействовать с ККТ можно через интерфейс RS232, либо по локальной сети при помощи протокола JSON, взаимодействие по которому осуществляется через HTTP-соединение на порт 4444, а также "бинарное" соединение на порт TCP 3333. Производителем разработано ПО TestFR, которое позволяет организовать соединение с ККТ как через RS232, так и через сеть. ПО работает под управлением ОС Windows, имеет весьма «сырой» и не очевидный интерфейс. Пользоваться надо с осторожностью, особенно в момент регистрации ФН, так как эта процедура одноразовая и необратимая, при неправильной регистрации ФН он требует полной замены, так как теряет функциональность. Учитывая дефицитность ФН, требуется эту процедуру делать крайне осторожно.  ККТ в наличии у поставщика/производителя Старрус, заключается договор поставки и приобретается в розницу. На этом этапе проблем нет. ФН на рынке в большом дефиците. Производители ФН (их три) и поставщики кассового оборудования отгружают оптом партии в основном крупным заказчикам. В розницу купить «легально» ФН крайне сложно. ФНС «пообещала» не штрафовать тех, у кого есть договор поставки, но его никто и не заключает. Поставщики кассового оборудования уклоняются от заключения договора поставки ФН, так как на них и так огромная очередь. Замкнутый круг. В некоторых случаях ФН можно приобрести у «своего» оператора ОФД, но в нашем случае наш оператор поставлял ФН только в составе некого «кассового комплекта», который был нами не востребован и в основном предназначался для оффлайн-розницы. В нашем случае единственным выходом было приобретение ФН у «барыги» на Авито по двойной цене по сравнению с отпускной. При приобретении можно проверить экземпляр ФН на специальном ресурсе ФНС.  Квалифицированная электронная подпись требуется для регистрации ККТ в личном кабинете налогоплательщика на сайте ФНС. В теории, можно не иметь КЭП и делегировать регистрацию ККТ своему ОФД, либо зарегистрировать ККТ в отделении ФНС в порядке личной явки. Но так как многие операторы сайтов (юридические лица) уже имеют КЭП для сдачи отчётности и взаимодействия с иными государственными органами, то можно использовать имеющийся для регистрации ККТ. Главное, чтобы КЭП был выдан аккредитованным при Минсвязи УЦ.  Можно выбрать любого ОФД (оператора фискальных данных) из списка аккредитованных при ФНС. Цены одинаковые, протоколы взаимодействия с ККТ и ФНС тоже унифицированные. Услуги стоят порядка 3000 рублей в год за одну кассу с неограниченным количеством чековых транзакций. Три предыдущих пункта можно делать параллельно, друг от друга они не зависят. Далее пункты по шагам. Состоит из трёх последовательных шагов. В принципе, классических 3-way handshake. Но процедуру необходимо завершить за два дня (день осуществления первого шага плюс один рабочий день).  Необходимо в личном кабинете налогоплательщика на сайте ФНС найти в разделе заявлений пункт о регистрации ККТ и заполнить заявление. Всё просто: кроме серийных номеров ФН и ККТ надо ввести данные о месте размещения (подробная справка прилагается там же), а также указать тип размещения, в случае «интернет-сайтов» требуется перечислить обслуживаемые ККТ сайты через точку с запятой. В результате автоматически присваивается регистрационный номер ККТ, который потребуется на последующих шагах. Этот шаг крайне ответственный, так как процедура инициализации ФН необратима и при допущении ошибки ФН придётся поменять, а испорченный хранить пять лет в архиве организации! Проще всего произвести через утилиту TestFR. К этому моменту требуется установить ФН в ККТ, подключить питание и любой из информационных интерфейсов. Надо выбрать «мастер регистрации» в утилите, раздел 11 в меню. По шагам надо ввести данные об организации, СНО, серийные номера ККТ и ФН, регистрационный номер ККТ, выданный ФНС. Дополнительно мастер предложит выбрать профиль ОФД из списка предложенных. В результате ККТ будет переведена в фискальный режим и будет изготовлен первый фискальный документ (ФД) под номером 1 — «Отчёт о регистрации». Ключевым значением в этом документе является фискальный признак (ФП), который является результатом криптографической операции ФН. Также, важным значением ФД является дата с временем так как вредя регистрации является одним из входных значений для генерации ФП. Если что-то пошло не так (как в нашем случае) и данные первого ФД куда-то исчезли, то можно запросить ФД с отчётом о регистрации через раздел «8. ФН», «Печать ФД по номеру», указав в качестве номера цифру 1. Результат появится в поле справа, но, благодаря технической реализации TestFR, может не поместиться на экран. В этом случае поможет CTRL+A в нужной области экрана. В том же личном кабинете налогоплательщика на сайте ФНС необходимо перейти в раздел со списком зарегистрированных ККТ, выбрать регистрируемую и ввести все данные с отчёта о регистрации ККТ. При завершении процедуры регистрации будет сформирована карточка регистрации ККТ, которую можно распечатать и приложить к паспортам ККТ и ФН. Необходимо составить акты ввода в эксплуатацию ККТ и ФН, соответствующие документы являются неотъемлемыми частями паспортов ККТ и ФН. Занести все данные и заверить подписью ответственного лица и удостоверительтной печатью организации при наличии. Данные документы необходимо хранить в архиве организации.  Необходимо выдержать небольшую паузу между регистрацией ККТ в ФНС и подключением ККТ в ОФД, так как есть небольшая задержка с добавлением регистрационного номера ККТ в реестр ФНС. В ОФД необходимо ввести требуемые данные, которые были получены на предыдущих этапах. В результате запроса в реестр ФНС, ККТ будет подключена к ОФД. С этого момента можно использовать ККТ в рабочем режиме. На фискальные запросы ККТ с ФН генерирует ФП и отправляет данные через сетевое подключение ОФД. В случае прерывания работоспособности сети ККТ продолжает работать и накапливать ФД. При возобновлении сетевого подключения к ОФД, ККТ автоматически дошлёт все не отправленные документы. Это вполне штатный случай. Техническая документация производителя предоставляется крупицами по запросу в службу поддержки. Почему они не выложат её в открытый доступ — загадка. Тут продублирована информация из писем технической поддержки: По запросу производитель может предоставить полнофункциональный эмулятор ККТ с ОФД, работающий на мощностях производителя. Может быть полезно при отладке интеграционного решения. Генерирует чеки и высылает их на адрес электронной почты. Документация достаточно «пухлая», по сути, обычному интернет-сайту требуется один метод под названием Complex. Этот метод осуществляет открытие кассовой смены, операцию фискализации продажи с генерацией чека, закрытие кассовой смены. Это более чем достаточно, учитывая что отдельная работа с кассовыми сменами интернет-сайту не нужна в подавляющем большинстве случаев. Полноценный запрос Complex выглядит в эмуляторе примерно так: Важное поле RequestId надо сериализовать, так как каждая операция должна иметь уникальный номер. В поле могут быть как буквы, так и цифры, а производитель рекомендует использовать ещё и префиксы, в случае эксплуатации кассы разными клиентскими экземплярами. Законодательство требует указания в чеке номенклатур товарных позиций, их количества и цен. Просто «пробить» чек на n рублей нельзя. Также указывается, что оплата покрывает: услугу, товар, выполнена ли она сразу или это авансирование. Расшифровка поля в документации. Изменение значения FullResponse на true даст подробный вывод результата, включая данные о смежных операциях, в том числе с кассовыми сменами.  Цены и суммы указаны со множителем 100, то есть с копейками целым числом. Количество указано в тысячных долях, то есть одна штука превращается в Qty = 1000. Значение Cash может быть опущено в случае с оплатой безналичным расчётом (в случае интернет-сайта это обычное явление) Значение NonCash содержит сумму оплаты любыми безналичными методами и интернет деньгами, может содержать несколько значений в зависимости от количества оплаты по чеку различными методами. В обычном случае достаточно одной суммы. Значение TaxMode — система налогообложения организации (выбирается из справочника руководства). Мы решили не взаимодействовать с ККТ напрямую с сайтов, а дописать в нашей биллинговой системе «Ванец» соответствующий функционал. Ванец уже занимается администрированием взаимодействия сайтов с нашей 1С и трансляцией 1С-ного ужаса в нормальный API, здесь мы пошли по аналогичной схеме. Все ответственные аспекты взаимодействия с ККТ реализуются в Ванце, оставив сайтам вполне простой API. Ванец принимает запрос от сайта, проверяет его на правильность, ставит в очередь на выполнение. Из очереди запрос обвешивается дополнительными необходимыми полями и отправляется в ККТ, результат операции сохраняется в биллинге. Рассылкой чеков клиентам занимается ОФД, здесь уже не наша зона ответственности. Но при этом, аттрибуты ФД у нас хранятся в Ванце и мы их можем всегда оттуда извлечь при необходимости. Такая система достаточно легко масштабируется на нужное количество касс при необходимости и позволяет не потерять запрос на чек при временной неработоспособности кассы. Само решение по ряду причин мы открыть не можем, но, в целом, оно совсем несложное. Статья ни разу не рекламная, «за что купили, за то и продаём». По результатам квеста хочется отметить «заслугами»: Sysadmin