В процессе автоматизации розничной и оптовой торговли часто возникает задача экономии на оборудовании. Типичный сценарий: предприятие имеет множество удаленных подразделений (офисов продаж, складов), работающих в одной базе 1С через терминальный сервер (RDP) или тонкий клиент, но пробивать чеки необходимо на одном физическом устройстве. Например, на популярной и бюджетной кассе АТОЛ 30Ф.
Основная проблема, с которой сталкиваются системные администраторы и разработчики при стандартном подключении ККТ — это монопольный захват COM-порта драйвером. Как только один пользователь начинает пробивать чек, порт кассы блокируется. В этот момент другие пользователи при попытке пробития получают критическую ошибку "Порт занят" или "Нет связи с ККТ". В кассовом аппарате по умолчанию отсутствует аппаратная очередь печати.
В данной статье мы подробно разберем, как решить проблему конкурентного доступа и организовать надежную очередь печати чеков из разных рабочих мест 1С на одной физической кассе АТОЛ. Мы проанализируем как классические методы, так и современные штатные механизмы платформы 1С и драйверов ДТО 10.
Начнем с самого простого и современного решения, которое не требует стороннего программного обеспечения или написания сложного кода. Фирма 1С добавила встроенную поддержку совместного использования касс.
Начиная с релизов 1С:Бухгалтерия 8 (версия 3.0.164), а также в актуальных версиях 1С:УНФ и 1С:Розница (начиная с 3.0.9), реализован полноценный механизм «ККТ в общем доступе». Рассмотрим по шагам, как его настроить:
Администрирование — Подключаемое оборудование.При такой схеме платформа 1С самостоятельно берет на себя маршрутизацию запросов и распределение транзакций. Если касса занята печатью чека первого пользователя, запрос второго пользователя временно задерживается на стороне 1С и отправляется повторно сразу после освобождения устройства.
Если конфигурация 1С устарела или требуется более гибкая настройка связи через RDP, идеальным решением станет использование встроенного в современные драйверы АТОЛ инструмента — RPC-сервера (служба ATOL Fiscal Printer Remote Server).
Этот способ пришел на смену сложному веб-серверу и работает гораздо стабильнее в терминальных средах. Проанализируем процесс его настройки:
19524. В настройках службы выберем кассу, которую мы хотим "расшарить" в сеть.TCP/IP, введем IP-адрес компьютера-сервера и порт 19524.Преимущество метода: RPC-сервер АТОЛ оптимизирован для работы по сети. Он минимизирует задержки связи, эффективно пробрасывает команды через VPN-туннели и берет на себя диспетчеризацию портов. Однако, при экстремально высокой одновременной нагрузке (когда несколько десятков человек одновременно нажимают кнопку "Пробить") всё еще могут возникать кратковременные ошибки таймаута, поэтому данный метод лучше всего подходит для умеренной интенсивности продаж.
Если стандартные средства не справляются с потоком запросов от 60 подразделений, мы рекомендуем использовать проверенное временем стороннее решение — программу ККМ-Сервер (kkmserver). Это мощный локальный сервер печати чеков, который идеально решает проблему очередей.
Выясним, как работает эта архитектура:
Для интеграции ККМ-Сервера с 1С обычно используется готовая внешняя компонента или обработка обслуживания, которая подменяет стандартные вызовы фискализации на HTTP-запросы. Посмотрим на упрощенный пример отправки JSON-запроса из 1С:
// Пример формирования структуры запроса на печать чека в ККМ-Сервер
Функция ПробитьЧекЧерезККМСервер(ДанныеЧека)
ЗапросJSON = Новый Соответствие;
ЗапросJSON.Вставить("Command", "RegisterCheck");
ЗапросJSON.Вставить("NumDevice", 1);
ЗапросJSON.Вставить("IsFiscal", Истина);
ЗапросJSON.Вставить("TypeCheck", 0); // 0 - приход
// Наполнение строк чека
МассивСтрок = Новый Массив;
Для Каждого СтрокаТовара Из ДанныеЧека.Товары Цикл
СтрокаЧека = Новый Соответствие;
СтрокаЧека.Вставить("Name", СтрокаТовара.НоменклатураНаименование);
СтрокаЧека.Вставить("Quantity", СтрокаТовара.Количество);
СтрокаЧека.Вставить("Price", СтрокаТовара.Цена);
СтрокаЧека.Вставить("Amount", СтрокаТовара.Сумма);
СтрокаЧека.Вставить("Department", СтрокаТовара.Секция);
СтрокаЧека.Вставить("Tax", СтрокаТовара.СтавкаНДС);
МассивСтрок.Добавить(СтрокаЧека);
КонецЦикла;
ЗапросJSON.Вставить("List", МассивСтрок);
// Сериализация в JSON и отправка
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ЗапросJSON);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
HTTPСоединение = Новый HTTPСоединение("192.168.1.100", 5893); // IP компьютера с кассой
HTTPЗапрос = Новый HTTPЗапрос("/Execute");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбъекта(HTTPЗапрос);
Возврат HTTPОтвет.ПолучитьТелоКакСтроку();
Исключение
ЗаписатьЛогОшибок("Ошибка связи с ККМ-Сервером: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Давайте критически оценим исходные условия задачи: 60 удаленных подразделений и одна касса АТОЛ 30Ф. Использование физической настольной кассы эконом-сегмента для обслуживания такой крупной сети несет огромные риски:
Для решения этих проблем на системном уровне рекомендуем рассмотреть переход на облачную кассу. Фирма 1С предлагает встроенный сервис «1С-Облачная касса», работающий совместно со специализированными фермами касс, такими как АТОЛ Онлайн.
При такой схеме:
Этот вариант является наиболее отказоустойчивым, полностью легальным и масштабируемым решением для распределенных сетей.
Подведем итоги анализа возможных решений:
1С:Бухгалтерия (релиз 3.0.164+) или 1С:УНФ, и нагрузка на кассу распределена во времени, начните со встроенного механизма «ККТ в общем доступе». Это бесплатно и настраивается за 15 минут.