При автоматизации розничной торговли мы часто сталкиваемся с ситуациями, которые на первый взгляд кажутся мистическими. Одна из таких проблем: кассир работает в РМК (Рабочем месте кассира), и периодически происходит сбой оборудования. При подключении к рабочему месту мы обнаруживаем, что запущено одновременно два экземпляра программы 1С. В одном из них касса работает, а во втором (который кассир видит сейчас) — выдается ошибка подключения, так как порт занят. Сегодня мы подробно разберем, как именно это происходит, почему это частая проблема при работе с банковскими терминалами, и рассмотрим комплекс мер по устранению этой ситуации.
Прежде чем бросаться ограничивать права пользователей, давайте поймем механизм возникновения проблемы. Как выяснилось в ходе обсуждения и диагностики, кассиры не открывают второе окно специально. Корень проблемы кроется во взаимодействии 1С и драйвера эквайрингового терминала (например, Сбербанк или Arcus).
Еще один неочевидный сценарий — использование сканера штрихкодов в режиме эмуляции клавиатуры. Если фокус находится на рабочем столе, и активен ярлык 1С, случайное считывание штрихкода (или нажатие кнопки на сканере) может послать команду Enter (суффикс сканера), что операционная система интерпретирует как команду "Запустить выделенное приложение".
Самое элегантное техническое решение, которое позволяет избежать блокировки кассы даже при запуске нескольких копий, — это правильная настройка драйвера торгового оборудования. Если у вас используются фискальные регистраторы фирмы Атол, нам необходимо изменить логику захвата порта. По умолчанию 1С захватывает порт при запуске и держит его до закрытия программы. Это монопольный режим. Однако драйверы Атол позволяют менять это поведение. Разберем алгоритм действий:
Важный нюанс: В старых версиях драйверов логика может быть инвертирована. Иногда нужно поставить галочку "Отключаться", а иногда снять "Не отключаться". Внимательно читайте описание настройки в вашей версии драйвера (ДТО 8, 9 или 10). Что это дает? Когда этот режим активен, 1С устанавливает связь с кассой только на момент печати чека. Сразу после пробития чека порт освобождается. Если кассир случайно запустит вторую копию 1С:
Если программная настройка драйвера невозможна (например, используется оборудование, не поддерживающее освобождение порта, или старая платформа), мы должны устранить возможность случайного запуска. Поскольку мы выяснили, что проблема возникает из-за того, что кассир видит рабочий стол с ярлыком, давайте уберем этот "соблазн". Действия с рабочим столом:
Теперь, если при оплате картой 1С свернется, кассир увидит пустой рабочий стол (просто обои). Ему некуда будет кликнуть. Скорее всего, он посмотрит на панель задач, увидит там уже запущенную 1С и развернет ее кликом мыши. Также рекомендуется настроить саму панель задач и меню "Пуск" так, чтобы лишние программы не отвлекали внимание.
Для тех, кто хочет решить проблему кардинально на уровне платформы 1С, существует метод программного запрета запуска второго сеанса для одного и того же пользователя.
Если у вас конфигурация версии ПРОФ (как выяснилось в теме), мы можем внести небольшие изменения в логику начала работы системы. Нам нужно проверить, есть ли уже активный сеанс этого пользователя на этом компьютере.
В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы можно использовать следующий подход. Проанализируем логику:
Процедура ПриНачалеРаботыСистемы()
// Получаем текущего пользователя и имя компьютера
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
ИмяКомпьютера = ИмяКомпьютера();
// Получаем все активные сеансы
Сеансы = ПолучитьСеансыИнформационнойБазы();
КоличествоСеансов = 0;
Для Каждого Сеанс Из Сеансы Цикл
// Считаем сеансы того же пользователя на том же компьютере
Если Сеанс.Пользователь.УникальныйИдентификатор = ТекущийПользователь.УникальныйИдентификатор
И Сеанс.ИмяКомпьютера = ИмяКомпьютера Тогда
КоличествоСеансов = КоличествоСеансов + 1;
КонецЕсли;
КонецЦикла;
// Если это второй сеанс (текущий + предыдущий > 1), завершаем работу
Если КоличествоСеансов > 1 Тогда
ПоказатьПредупреждение(, "Программа уже запущена! Переключитесь на открытое окно.");
ЗавершитьРаботуСистемы(Ложь);
Возврат;
КонецЕсли;
КонецПроцедуры
Данный код не является готовым решением "copy-paste", так как в типовых конфигурациях вроде "Розница 2.3" или "Розница 3.0" уже могут быть встроенные механизмы контроля, которые нужно просто включить в настройках администрирования (раздел "Настройки пользователей и прав"). Однако, приведенный пример демонстрирует принцип: мы не даем запуститься второй копии, принудительно ее закрывая.
Как упоминалось в анализе, сканер в режиме клавиатуры ("в разрыв клавиатуры") — это потенциальный источник проблем при потере фокуса.
Почему это опасно?
Сканер, настроенный как клавиатура, просто "печатает" цифры штрихкода и нажимает Enter туда, где сейчас находится курсор. Если курсор на рабочем столе, а фокус на иконке — произойдет запуск.
Рекомендация:
Переведите сканеры в режим эмуляции COM-порта (Virtual COM).
В этом режиме 1С перехватывает событие сканирования как "Внешнее событие", даже если окно не активно (зависит от драйвера, но чаще всего это работает стабильнее), и уж точно такой сканер не сможет случайно "накликать" запуск программ на рабочем столе.
В ходе обсуждения возник справедливый вопрос: если мы используем метод с отключением от ККТ (Решение 1), будут ли уходить данные в ОФД (Оператор фискальных данных)? Здесь все зависит от того, какой канал обмена используется:
При настройке "Отключаться от ККТ" связь 1С с кассой разрывается, но служба EoU продолжает работать параллельно. Поэтому данные в ОФД будут отправляться корректно. Главное — убедиться, что служба EoU запущена и настроена правильно (проверьте файл настроек службы, обычно там указывается порт, на котором "висит" касса).
Проблема "двух экземпляров" решается комплексно. Наилучший результат дает комбинация методов:
Применяя эти методы, вы избавитесь от ложных вызовов по поводу "неработающей кассы" и сэкономите время на администрирование.