Привет, Хабр!

А вы когда-нибудь задумывались, каким образом ваша покупка на угловой заправке или в супермаркете превращается в акт, сохраняющийся в электронной памяти кассового аппарата? Эти устройства - настоящие живые свидетели каждой транзакции, но как они работают внутри?

Мы рассмотрим аппаратную архитектуру, операционные системы, языки программирования, методы обработки фискальных данных и многие другие аспекты, которые составляют суть программирования кассовых аппаратов. Вдобавок, я предоставлю примеры кода и практические инсайты, которые помогут вам понять, как это делается в реальном мире.

Аппаратная архитектура кассовых аппаратов

Процессоры и микроконтроллеры

Кассовые аппараты используют разнообразные процессоры и микроконтроллеры в зависимости от их функциональности и целевой аудитории. Эти чипы обычно оптимизированы для выполнения фискальных операций и имеют низкое энергопотребление.

Пример кода:

// Пример кода для микроконтроллера Atmel AVR
#include <avr/io.h>

int main() {
    // Инициализация портов для управления периферийными устройствами
    DDRB |= (1 << PB0); // Например, управление принтером
    DDRC |= (1 << PC1); // Установка контроля за датчиками ввода
    // Основной цикл программы
    while (1) {
        // Ваш код обработки транзакции
    }
    return 0;
}

Устройства ввода и вывода

Кассовые аппараты обязаны взаимодействовать с разнообразными устройствами ввода и вывода. Это включает в себя клавиатуры, сканеры штрих-кодов, экраны сенсорных дисплеев и многие другие устройства. Программирование взаимодействия с ними требует внимания к деталям и знаний о протоколах обмена данными.

Пример кода:

# Пример кода для обработки ввода с клавиатуры в Python
import keyboard

def process_keyboard_input(key):
    # Обработка нажатия клавиши
    print(f'Нажата клавиша: {key}')

keyboard.on_press(process_keyboard_input)
keyboard.wait()

Хранение данных

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

Пример кода:

// Пример Java-кода для записи данных на SD-карту
import java.io.FileWriter;
import java.io.IOException;

public class DataStorage {
    public void saveToFiscalMemory(String data) {
        try {
            FileWriter writer = new FileWriter("fiscal_data.txt");
            writer.write(data);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Коммуникационные интерфейсы

Кассовые аппараты часто взаимодействуют с внешними системами, такими как банковские серверы, системы учета и налоговые органы. Для этого они оборудованы разнообразными коммуникационными интерфейсами, такими как Ethernet, USB, и последовательные порты.

Пример кода:

// Пример C#-кода для отправки данных по Ethernet
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class NetworkCommunication {
    public void SendDataOverEthernet(string data) {
        try {
            IPAddress ipAddress = IPAddress.Parse("192.168.0.1");
            int port = 8080;
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
                socket.Connect(new IPEndPoint(ipAddress, port));
                byte[] bytes = Encoding.ASCII.GetBytes(data);
                socket.Send(bytes);
            }
        } catch (Exception ex) {
            Console.WriteLine($"Ошибка при отправке данных: {ex.Message}");
        }
    }
}

Операционные системы для кассовых аппаратов

Специализированные операционные системы для кассовых аппаратов обычно ориентированы на выполнение ограниченного набора задач. Они обеспечивают высокую степень безопасности и стабильности, что важно для фискальных приложений.

Примером такой ОС является "ОС ККТ" (Кассовых Контрольных Точек), используемая в России. Эта ОС позволяет взаимодействовать с различными периферийными устройствами, записывать фискальные данные и передавать их налоговым органам.

Пример кода:

// Пример кода для работы с фискальными функциями в ОС ККТ
void PrintFiscalReceipt() {
    // Инициализация соединения с ОС ККТ
    KKTConnection connection = new KKTConnection();
    
    // Добавление товаров к чеку
    connection.AddItemToReceipt("Товар 1", 500.0, 1, 20.0);
    connection.AddItemToReceipt("Товар 2", 300.0, 2, 18.0);
    
    // Закрытие чека и отправка данных в ОС ККТ
    connection.CloseReceipt();
}

Программирование на базе встраиваемых операционных систем

В некоторых случаях кассовые аппараты могут работать на встраиваемых операционных системах, таких как Linux или Windows Embedded. Эти системы предоставляют больше гибкости и функциональности, но также требуют более глубоких знаний разработчика.

Программирование на встраиваемых операционных системах предоставляет больше возможностей для разработчиков в плане выбора языка программирования и библиотек. Однако, важно помнить, что с большей свободой приходит большая ответственность по обеспечению безопасности и стабильности системы.

Языки программирования и инструменты

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

  1. C/C++: Языки C и C++ широко используются в разработке кассовых аппаратов благодаря их низкоуровневым возможностям и скорости выполнения.

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

  3. Java: Java используется на встраиваемых операционных системах для создания приложений, обеспечивающих взаимодействие с кассовыми аппаратами.

Разработка на близком к железу языке требует особого внимания к деталям и низкоуровневой работе с аппаратными ресурсами. Вот три примера кода на языке C/C++, демонстрирующих работу с аппаратурой кассового аппарата:

1. Использование GPIO-портов:

#include <iostream>
#include <wiringPi.h>

int main() {
    if (wiringPiSetup() == -1) {
        std::cout << "Ошибка инициализации WiringPi." << std::endl;
        return 1;
    }
    
    int ledPin = 0; // Номер GPIO-пина
    
    pinMode(ledPin, OUTPUT);
    
    while (true) {
        digitalWrite(ledPin, HIGH);
        delay(1000);
        digitalWrite(ledPin, LOW);
        delay(1000);
    }
    
    return 0;
}

2. Работа с последовательным портом:

#include <iostream>
#include <wiringSerial.h>

int main() {
    int serialPort;
    if ((serialPort = serialOpen("/dev/ttyS0", 9600)) < 0) {
        std::cout << "Ошибка открытия последовательного порта." << std::endl;
        return 1;
    }
    
    while (true) {
        serialPuts(serialPort, "Hello, World!");
        delay(1000);
    }
    
    return 0;
}

3. Работа с прерываниями:

#include <iostream>
#include <wiringPi.h>

void handleInterrupt() {
    std::cout << "Прерывание сработало!" << std::endl;
}

int main() {
    if (wiringPiSetup() == -1) {
        std::cout << "Ошибка инициализации WiringPi." << std::endl;
        return 1;
    }
    
    int buttonPin = 1;
    pinMode(buttonPin, INPUT);
    wiringPiISR(buttonPin, INT_EDGE_RISING, &handleInterrupt);
    
    while (true) {
        // Ожидание прерывания
    }
    
    return 0;
}

Оптимизация производительности

Оптимизация производительности важна, особенно при работе с кассовыми аппаратами, которые должны обеспечивать мгновенную реакцию на операции. Некоторые методы оптимизации включают:

  • Использование аппаратного ускорения: Применение аппаратных решений, таких как аппаратное ускорение шифрования, для оптимизации фискальных операций.

  • Многопоточность: Разделение выполнения задач на множество потоков может увеличить производительность при обработке параллельных операций, таких как печать и ввод данных.

  • Оптимизированный код: Постоянная оптимизация кода, устранение утечек памяти и ненужных операций помогут увеличить производительность.

Проектирование архитектуры ПО

Архитектурный паттерн "Model-View-Controller" или MVC) - это подход, который позволяет разделять программу на логические компоненты, упрощая тем самым разработку, тестирование и поддержку ПО. В случае кассовых аппаратов, это может выглядеть следующим образом:

  1. Модель (Model): Этот уровень отвечает за обработку данных и бизнес-логику. Пример кода:

public class Sale {
    private List<Item> items;
    private double totalAmount;

    public void addItem(Item item) {
        items.add(item);
        recalculateTotalAmount();
    }

    public double getTotalAmount() {
        return totalAmount;
    }

    private void recalculateTotalAmount() {
        totalAmount = items.stream().mapToDouble(Item::getPrice).sum();
    }
}
  1. Представление (View): Этот уровень отвечает за отображение данных и взаимодействие с пользователем. Пример кода:

public class ReceiptView {
    public void displayReceipt(Sale sale) {
        System.out.println("Чек:");
        for (Item item : sale.getItems()) {
            System.out.println(item.getName() + ": " + item.getPrice());
        }
        System.out.println("Итого: " + sale.getTotalAmount());
    }
}
  1. Контроллер (Controller): Этот уровень управляет взаимодействием между моделью и представлением. Пример кода:

public class SaleController {
    private Sale sale;
    private ReceiptView receiptView;

    public SaleController() {
        sale = new Sale();
        receiptView = new ReceiptView();
    }

    public void addItemToSale(String name, double price) {
        Item item = new Item(name, price);
        sale.addItem(item);
        receiptView.displayReceipt(sale);
    }
}

Сетевое взаимодействие и базы данных обеспечивают сохранность данных и возможность обмена информацией. Примеры:

  1. Сетевое взаимодействие: Для взаимодействия с удаленными серверами, такими как банковские системы, можно использовать протоколы, такие как HTTP. Пример кода:

public class BankIntegration {
    public void processPayment(Sale sale) {
        // Отправка данных о продаже на сервер банка
        // HTTP-запрос
        // Обработка ответа
    }
}
  1. Базы данных: Для хранения и управления фискальными данными можно использовать SQL-базы данных или NoSQL-системы в зависимости от требований. Пример кода:

public class DatabaseHandler {
    public void saveSaleToDatabase(Sale sale) {
        // SQL-запрос для сохранения данных о продаже
    }
}

Многозадачность и обработка событий важны для обеспечения отзывчивости и эффективной работы кассовых аппаратов:

  1. Многозадачность: Пример кода для создания потока обработки фискальных операций:

public class FiscalThread extends Thread {
    public void run() {
        // Логика обработки фискальных операций
    }
}
  1. Обработка событий: Пример кода для обработки событий, таких как нажатия на клавиши или сканирование штрих-кодов:

public class EventListener {
    public void handleKeyPress(KeyPressEvent event) {
        // Логика обработки нажатия клавиши
    }

    public void handleBarcodeScan(BarcodeScanEvent event) {
        // Логика обработки сканирования штрих-кода
    }
}

Проектирование архитектуры ПО для кассовых аппаратов требует внимания к деталям, оптимизации производительности и учета специфики бизнес-процессов.

Обработка фискальных данных

Фискальные данные включают информацию о продажах, налоговых ставках, чеках и другие сведения, которые необходимы для налоговой отчетности. Понимание форматов и структуры фискальных данных критически важно для создания соответствующей функциональности в кассовых аппаратах.

  1. Формат JSON:

JSON (JavaScript Object Notation) - это легко читаемый и распространенный формат для обмена данными. Его структура состоит из пар "ключ: значение", что делает его удобным для представления фискальных данных. Пример:

{
    "transaction_id": "12345",
    "items": [
        {
            "name": "Product A",
            "price": 10.0
        },
        {
            "name": "Product B",
            "price": 15.0
        }
    ],
    "total_amount": 25.0,
    "tax": 5.0
}
  1. Формат XML:

XML (Extensible Markup Language) также часто используется для представления фискальных данных. Он имеет иерархическую структуру, что облегчает организацию данных. Пример:

<transaction>
    <transaction_id>12345</transaction_id>
    <items>
        <item>
            <name>Product A</name>
            <price>10.0</price>
        </item>
        <item>
            <name>Product B</name>
            <price>15.0</price>
        </item>
    </items>
    <total_amount>25.0</total_amount>
    <tax>5.0</tax>
</transaction>
  1. Формат CSV:

CSV (Comma-Separated Values) представляет собой текстовый формат, в котором данные разделены запятыми. Этот формат прост и часто используется для экспорта и импорта фискальных данных. Пример:

transaction_id, name, price
12345, Product A, 10.0
12345, Product B, 15.0

Пример кода: Для сохранения фискальных данных в формате JSON на языке Python:

import json

data = {
    "transaction_id": "12345",
    "items": [
        {
            "name": "Product A",
            "price": 10.0
        },
        {
            "name": "Product B",
            "price": 15.0
        }
    ],
    "total_amount": 25.0,
    "tax": 5.0
}

with open("fiscal_data.json", "w") as file:
    json.dump(data, file)

Соответствие нормативам и законодательству

Обеспечение соответствия нормативам и законодательству важно для кассовых аппаратов, так как они обязаны соблюдать налоговые и фискальные законы:

Проверка уникальности номера чека:

public boolean isReceiptNumberUnique(String receiptNumber) {
    // Запрос к базе данных для проверки уникальности номера чека
    // Возврат true, если номер уникальный, иначе false
}
  1. Расчет налогов:

public double calculateTaxes(List<Item> items, double taxRate) {
    // Расчет суммы налогов на основе товаров и налоговой ставки
}
  1. Сохранение фискальных данных:

public void saveFiscalData(FiscalData data) {
    // Сохранение данных о продаже в базе данных
}

Соответствие нормативам и законодательству - ключевой аспект при разработке кассовых аппаратов, так как это обеспечивает легальность и надежность фискальных операций. Корректная обработка фискальных данных и их представление в удобном формате помогает соблюдать требования налоговых органов и предоставлять четкую отчетность.

Средства тестирования и отладки

Имитация железа и тестовые окружения

  1. Имитация железа:

Имитация железа может быть критически важной, особенно при разработке кассовых аппаратов, когда доступ к фактическому оборудованию ограничен. Пример имитации печатающего устройства на языке Python:

class EmulatedPrinter:
    def print_receipt(self, items, total_amount):
        for item in items:
            print(f"{item['name']}: {item['price']}")
        print(f"Total Amount: {total_amount}")
  1. Тестовые окружения:

Создание тестовых окружений позволяет проводить изолированные тесты, не затрагивая боевое оборудование. Пример тестового окружения с использованием библиотеки pytest на Python:

import pytest

@pytest.fixture
def emulated_printer():
    return EmulatedPrinter()

def test_receipt_printing(emulated_printer):
    items = [{"name": "Product A", "price": 10.0}, {"name": "Product B", "price": 15.0}]
    total_amount = 25.0
    emulated_printer.print_receipt(items, total_amount)

Методы отладки и мониторинга

  1. Логирование:

Логирование является мощным инструментом для отладки. Профессиональные разработчики используют библиотеки логирования, такие как log4j для Java или winston для Node.js, чтобы записывать сообщения о работе программы.

Пример логирования на Python с использованием библиотеки logging:

import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger("cash_register")

def some_function():
    logger.debug("This is a debug message.")
    logger.info("This is an info message.")
    logger.warning("This is a warning message.")
    logger.error("This is an error message.")
  1. Инструменты отладки:

Профессиональные среды разработки, такие как Visual Studio, PyCharm или Eclipse, предоставляют мощные инструменты отладки. Эти инструменты позволяют устанавливать точки останова, отслеживать значения переменных и выполнять шаг за шагом.

Пример использования отладчика в Visual Studio для C++:

#include <iostream>

int main() {
    int x = 5;
    int y = 10;
    int result = x + y;
    std::cout << "Result: " << result << std::endl;
    return 0;
}
  1. Мониторинг производительности:

Использование инструментов мониторинга производительности, таких как Prometheus или New Relic, помогает выявить и решить узкие места в приложении.

Пример использования Prometheus для мониторинга производительности HTTP-сервера:

scrape_configs:
  - job_name: 'http_server'
    static_configs:
      - targets: ['localhost:9090']

Профессиональные средства тестирования и отладки являются неотъемлемой частью разработки кассовых аппаратов.

Безопасность и защита данных

Безопасность и защита данных - это фундаментальные аспекты разработки кассовых аппаратов, особенно с учетом конфиденциальности и финансовых данных, которые они обрабатывают. В данной части статьи мы рассмотрим аутентификацию, авторизацию, защиту от несанкционированного доступа и фальсификации данных.

Аутентификация и авторизация операторов

  1. Аутентификация операторов:

Аутентификация - это процесс проверки подлинности оператора перед предоставлением доступа к системе. Операторы должны проходить процедуру аутентификации, например, с использованием уникальных идентификаторов и паролей.

Пример кода на Python для аутентификации оператора:

def authenticate_operator(username, password):
    # Запрос к базе данных для проверки правильности пароля
    if check_password(username, password):
        return True
    return False
  1. Авторизация операторов:

Авторизация определяет, какие действия и функции доступны для каждого оператора. Каждому оператору присваиваются роли и права доступа.

Пример кода на Java для авторизации оператора:

public class Operator {
    private String username;
    private Set<String> roles;

    public boolean hasPermission(String permission) {
        return roles.contains(permission);
    }
}

Защита от несанкционированного доступа

  1. Ограничение доступа:

Защита от несанкционированного доступа подразумевает, что операторы имеют доступ только к тем функциям и данным, которые им разрешены. Это может быть достигнуто с помощью уровней доступа и проверок разрешений.

Пример кода на C# для ограничения доступа:

public class CashRegister {
    public void ProcessSale(Operator operator, Sale sale) {
        if (operator.HasPermission(Permission.SaleProcessing)) {
            // Обработка продажи
        }
    }
}
  1. Защита от атак:

Кассовые аппараты подвержены атакам, включая попытки взлома или внедрения вредоносного ПО. Защита от таких атак требует применения современных методов шифрования и обновлений безопасности.

Защита от фальсификации данных

  1. Электронная подпись:

Электронные подписи позволяют проверить целостность данных и подлинность оператора. Они особенно важны при сохранении фискальных данных.

Пример кода на PHP для создания и проверки электронной подписи:

$privateKey = openssl_pkey_new();
$data = "Some data to sign";
$signature = "";
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
  1. Хэширование данных:

Хэширование помогает обеспечить целостность данных. Хэши вычисляются для каждой транзакции и могут быть использованы для проверки фальсификации данных.

Пример кода на Python для хеширования данных:

import hashlib

data = "Some data to hash"
hashed_data = hashlib.sha256(data.encode()).hexdigest()

Важно уделять должное внимание этим аспектам при разработке кассовых аппаратов.

Стандарты и сертификации

Соблюдение стандартов и нормативов, а также процедуры сертификации, являются обязательными этапами в разработке кассовых аппаратов. Это не только гарантирует качество продукта, но и обеспечивает его легальность и безопасность.

Примеры стандартов:

  • ISO 8583 - международный стандарт для финансовых транзакций. Он определяет формат сообщений и поля для обмена данными между кассовыми аппаратами и банковскими системами.

  • Fiscal API - стандарт для взаимодействия с налоговыми органами, устанавливающий требования к формату и структуре данных, предоставляемых в отчетности.

  • EMV - стандарт для безопасных платежей с использованием чиповых карт. Он определяет протоколы и процедуры для обработки платежей.

Процедуры сертификации

  1. Процесс сертификации:

Процесс сертификации обычно включает в себя следующие этапы:

  • Тестирование:
    Устройство проходит тестирование на соответствие стандартам и нормативам. Это включает в себя функциональное тестирование, тестирование безопасности и другие виды проверок.

  • Документация:
    Подготовка необходимой документации, включая технические спецификации, тестовые отчеты и другие документы.

  • Подача заявки:
    Заявка на сертификацию подается в компетентный орган, который занимается выдачей сертификатов.

  • Проверка и аудит:
    Орган сертификации проводит проверку предоставленных данных и может провести аудит на месте.

  • Выдача сертификата:
    После успешной сертификации устройству выдается соответствующий сертификат.

Пример:

Предположим, вы разрабатываете кассовый аппарат, который должен принимать кредитные карты. Для обеспечения соблюдения стандартов, ваша команда выполняет тестирование согласно стандарту EMV. После успешного прохождения тестов, вы подаете заявку на сертификацию в аккредитованный орган по сертификации платежных устройств. После проверки и аудита устройства, вам выдают сертификат, подтверждающий соблюдение стандартов EMV. Этот сертификат демонстрирует, что ваш кассовый аппарат безопасен и соответствует требованиям платежных систем.

Заключение

Разработка кассовых аппаратов - это сложная и ответственная задача, требующая высокой квалификации и строгого соблюдения стандартов и нормативов. В данной статье мы глубоко исследовали каждый этап этого процесса, начиная с аппаратной архитектуры и операционных систем, и заканчивая безопасностью и сертификацией. Профессиональные разработчики, работающие в этой области, понимают, что кассовые аппараты не просто инструменты для обработки платежей, а критически важные системы, которые взаимодействуют с финансовыми данными и налоговыми органами.

Мы обсудили:

  • Важность оптимизации производительности и использования близкого к железу программирования для достижения максимальной эффективности.

  • Проектирование архитектуры ПО, которое обеспечивает надежную и масштабируемую работу кассовых аппаратов.

  • Обработку фискальных данных и их соответствие нормативам и законодательству.

  • Средства тестирования и отладки, которые помогают гарантировать надежность и безопасность ПО.

  • Безопасность и защиту данных, включая аутентификацию, авторизацию, защиту от несанкционированного доступа и фальсификации данных.

  • Важность соблюдения стандартов и процедур сертификации для обеспечения легальности и безопасности кассовых аппаратов.

Если вы хотите глубоко погрузиться в ту или иную сферу программирования, предлагаю заглянуть в каталог курсов OTUS. Также напоминаю, что на странице каждого курса вы можете зарегистрироваться на бесплатные уроки, которые проходят каждую неделю.

Комментарии (16)


  1. nikolz
    17.10.2023 13:58

    "Эти устройства - настоящие живые свидетели каждой транзакции, но как они работают внутри?"

    скорее железные или кремниевые, но не живые.


  1. Kragius
    17.10.2023 13:58
    +7

    За список терминов - спасибо. А статья то будет?


  1. homeles
    17.10.2023 13:58
    +7

    Очень похоже на очередной "курсач" - относительно хороший - темы разложены, примеры даны - "но ни о чем". Как там в одном анекдоте - "нам дали точную информацию, но воспользоваться мы ей не можем" ?!?!.....


  1. Emulyator
    17.10.2023 13:58

    Меня больше интересует ответ на вопрос: почему в онлайн кассах фискальный накопитель реализован так странно? Нет, я понимаю, что без него не обойтись, ведь если нет обмена с интернетом, то надо куда-то сохранять данные (до 30 дней по закону). Интересует меня, почему все еще надо на нем хранить ВСЕ данные, если они и так уходят в налоговою в реальном времени? Почему с переходом на "онлайн кассы" не решили этот регулярный гемморой с переполнением и истечением срока действия накопителя(это вообще что за срок такой, чем обусловлен)?


    1. serafims
      17.10.2023 13:58
      -2

      Допустим, интернет отключился. Как купить воды?


    1. Akina
      17.10.2023 13:58

      Почему с переходом на "онлайн кассы" не решили этот регулярный гемморой с переполнением

      А это чисто случайно не косячок ли определённой линейки, конкретной модели или даже определённой версии прошивки? А то есть у меня под наблюдением и поддержкой на работе несколько штук - и ни на одном такой штукенции как переполнение нет в принципе.


      1. gravity
        17.10.2023 13:58

        Нет, ~ 250000 документов аппаратный предел.


        1. Akina
          17.10.2023 13:58

          То есть если в течение месяца без сна и отдыха штамповать чеки по штуке каждые 10-11 секунд - как раз в этот аппаратный предел и впишешься. Практически - нереально.


          1. gravity
            17.10.2023 13:58
            +1

            Для обычного бизнеса, не реально. Для массового обслуживания населения (продажа билетов, оплата связи, оплата тарифов) переполнение наступает через 2 месяца работы.


    1. Kobystan
      17.10.2023 13:58

      Охрана коммерческих интересов производителей фискальных накопителей. Логика такая- бьешь много чеков, большие продажи, можешь купить больше фискальных накопителей.

      А так контроль ради контроля. Надо же госаппарату чем-то заниматься. Помнится были относительно недавно времена когда большинство торговых точек были освобождены от обязанности применять кассовый аппарат и нечего плохого не случилось ни с наполнением бюджета, ни с правами потребителей. Это было с 2009 по 2015 года примерно когда можно было выдавать покупателю "иной документ" вместо чека. Большая часть точек выдавала "иные документы" напечатанные на переделанных кассовых аппаратах, их обозвали во избежание путаницы чекопечатающими машинками(ЧПМ). Закон позволял выписывать "иные документы" хоть от руки.

      Не знаю почему закон не изменили при широком распространении смартфонов. Поднес смартфон покупателя к смартфону продавца, перевелись деньги, обратно пришел квиток-чек. Все.


    1. LoveMeOrHateMe
      17.10.2023 13:58

      Вроде как при помощи него шифруются данные, точнее получается фискальный признак, который удостоверяет реальность транзакции. Иначе можно было бы слать что угодно и кому угодно.


    1. RollJam
      17.10.2023 13:58
      +1

      История ровно как и с отчётностью. Не смотря на то, что отчёт ты сдал - хранить их ты обязан 5 лет. С фискальником все аналогично, после закрытия архива фн, ФНС может его затребовать в течении пяти лет.
      По срокам, 15 мес для пользователей на ОСНО, 13 мес (ставится тот же фн на 15, но работает меньше) - если пользователь работает с подакцизом (в т.ч. пиво, сидра и тд), все остальные режимы - 36 месяцев. Но при этом, ёмкость у самих ФН одна и та же)

      Вообще ожидал, что в посте расскажут как раз про такие моменты и подчерпну что-то новое, но, видимо, надо самому собраться и написать)


  1. serafims
    17.10.2023 13:58

    Вообще, кассовые аппараты эпохи до x86-POS и до андроидных планшетов весьма интересные устройства, показывающий архитектуру классического ПК на базе именно процессора, с внешней памятью, внешними шинными интерфейсами, когда на одной шине висит куча периферии, переключается она адресными выходами процессора, которые, собственно, продолжают оперативную память (для процессоров семейства 8051, к примеру) Советую глянуть на схемотехнику отечественных аппаратов конца девяностых, середины 2000х, вникая в суть и назначение каждой микросхемы.

    По сути это такие микрокомпьютеры, а когда-то они были как взрослые настольные ЭВМ. Такой аппарат, при наличии эмулятора ЭСППЗУ (ну чтоб не возиться с ультрафиолетом) может быть тренажёрном для программирования.


    1. kazakevich
      17.10.2023 13:58

      Доводилось разбирать такие аппараты, сейчас есть куча рабочих 80С31 и статических ОЗУ.

      Может быть у вас есть схемы Э3 кассовых аппаратов на базе контроллеров 8051(8031)?


  1. hogstaberg
    17.10.2023 13:58

    Смешались в кучу AVR, python, java, кони, люди.


  1. AKudinov
    17.10.2023 13:58

    Статью как будто ChatGPT написал.
    После вот этого вот:
    "Эти чипы обычно оптимизированы для выполнения фискальных операций"
    я упал под стол и дальше читать не смог.