Как реализовать печать товарного чека из «Касса МойСклад» на 80-мм принтере

Системный администратор Управленческий учет Торговля и дистрибуция
← На главную

При работе с облачными сервисами автоматизации розничной торговли, такими как «МойСклад», пользователи часто сталкиваются с жестко заданными форматами печатных форм. Стандартное приложение «Касса МойСклад» ориентировано на печать товарных чеков в формате А4 или А5 через PDF, что совершенно не подходит для компактных термопринтеров с шириной ленты 80 мм. В этой статье мы разберем технические способы решения этой проблемы, начиная от использования виртуальных портов и заканчивая автоматизацией через API.

Метод 1: Использование виртуального монитора портов mfilemon

Проанализируем наиболее гибкое решение, предложенное техническими специалистами. Проблема стандартной печати заключается в том, что приложение формирует готовый документ и отправляет его на системный принтер без возможности изменения макета. Мы можем перехватить этот поток данных с помощью специального инструмента — mfilemon (Multi-File Port Monitor).

Разберем алгоритм работы этого метода по шагам:

  1. Установка монитора порта: Мы устанавливаем mfilemon, который создает виртуальный порт в системе Windows.
  2. Настройка принтера: В панели управления создается новый принтер, который использует этот виртуальный порт. В настройках порта указывается путь к исполняемому файлу (скрипту или .exe), который будет запускаться каждый раз, когда на этот принтер приходит задание.
  3. Обработка данных: Монитор порта передает данные печати (обычно в формате PDF или PostScript) вашему приложению-обработчику.

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


// Псевдокод логики обработки чека
ПутьКФайлу = ПолучитьАргументКоманднойСтроки(); // Получаем путь к PDF
КартинкаЧека = КонвертироватьPDFвИзображение(ПутьКФайлу);
ОбрезаннаяКартинка = ОбрезатьПоля(КартинкаЧека, Ширина80мм);
ОтправитьНаПринтер(ОбрезаннаяКартинка, "Название_Термопринтера");

Этот метод позволяет полностью игнорировать стандартные настройки «МойСклад» и формировать чек так, как вам удобно.

Метод 2: Эмуляция сетевого принтера (RSVP)

Другой продвинутый способ — заставить систему думать, что она печатает на сетевой принтер, в то время как данные перехватываются специальным сервером. Разберем проект rsvp (Remote Spooler Virtual Printer). Это решение позволяет создать виртуальный принтер, который принимает данные по сети и сохраняет их или обрабатывает.

Рассмотрим преимущества этого подхода:

Метод 3: Настройка пользовательских шаблонов через веб-интерфейс

Если мы не хотим использовать сложные программные «костыли», стоит проверить возможности самой системы «МойСклад». Хотя приложение «Касса» ограничено, основной веб-интерфейс позволяет создавать свои шаблоны печатных форм. Рассмотрим, как это применить для узкой ленты.

Выясним причину, по которой стандартный шаблон не подходит: он имеет фиксированные поля для формата А5. Однако в редакторе шаблонов «МойСклад» (доступном через браузер в разделе «Настройки» -> «Печать») можно создать новый шаблон документа «Продажа».

Разберем настройку по шагам:

  1. Создаем новый шаблон на основе системного.
  2. В настройках страницы указываем ширину 72 мм (для ленты 80 мм с учетом полей) и произвольную длину.
  3. Удаляем лишние колонки (например, «Артикул» или «НДС»), чтобы текст не сжимался.
  4. Увеличиваем шрифт для ключевых полей.

Важный момент: Если печатать такой документ через браузер на чековый принтер, он подтянется корректно. Однако приложение «Касса» может продолжать навязывать свой стандартный формат. В этом случае печать придется выполнять не из интерфейса кассира, а из раздела «Продажи» основного аккаунта.

Метод 4: Прямая работа через JSON API

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

Посмотрим на алгоритм реализации:

  1. Пишется небольшая фоновая служба (например, на C# или Node.js).
  2. Служба с определенной периодичностью опрашивает API «МойСклад» на предмет появления новых документов в разделе retailstore/v1/retaildemand (Розничные продажи).
  3. При обнаружении новой продажи служба забирает состав чека (номенклатуру, количество, цены).
  4. Данные форматируются в набор команд ESC/POS и отправляются напрямую в порт принтера (например, COM или USB через Generic/Text Only драйвер).

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


{
  "name": "00001",
  "moment": "2023-10-27 12:00:00",
  "positions": [
    {
      "quantity": 2,
      "price": 15000,
      "assortment": { "name": "Ручка шариковая Синяя" }
    }
  ],
  "sum": 30000
}

Метод 5: Использование эмуляторов ККТ (Фискальных регистраторов)

Приложение «Касса МойСклад» отлично умеет печатать чеки, если оно «думает», что подключено к фискальному регистратору (ФР). Мы можем воспользоваться этим, установив программный эмулятор ФР (например, эмулятор протокола АТОЛ).

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

Сравнение с переходом на 1С:Розница

В ходе обсуждения часто возникает вопрос: а не проще ли перейти на 1С:Розница? Разберем этот вариант подробнее. В 1С механизмы печати чеков и товарных чеков изначально крайне гибкие. Вы можете использовать объект Макет, настроить его под любой размер бумаги и программно управлять каждой строкой.

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


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ТоварныйЧек");
Область = Макет.ПолучитьОбласть("Строка");
// Заполнение параметров области
ТабДок.Вывести(Область);
ТабДок.ИмяПринтера = "ЧековыйПринтер80мм";
ТабДок.Напечатать(РежимИспользованияПринтера.БезПредварительногоПросмотра);

Однако, если вы уже настроили учет в «МойСклад», использование одного из вышеописанных методов с виртуальными принтерами или API позволит сэкономить значительные ресурсы на миграции системы учета.

Итоговые рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших технических ресурсов:

Каждый из этих способов позволяет обойти ограничение «МойСклад» и обеспечить покупателей красивыми и читаемыми товарными чеками на стандартной 80-мм ленте.

← На главную