Почему в 1С:Розница открываются две копии РМК и отваливается касса: причины и решение

Системный администратор 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации розничной торговли мы часто сталкиваемся с ситуациями, которые на первый взгляд кажутся мистическими. Одна из таких проблем: кассир работает в РМК (Рабочем месте кассира), и периодически происходит сбой оборудования. При подключении к рабочему месту мы обнаруживаем, что запущено одновременно два экземпляра программы 1С. В одном из них касса работает, а во втором (который кассир видит сейчас) — выдается ошибка подключения, так как порт занят. Сегодня мы подробно разберем, как именно это происходит, почему это частая проблема при работе с банковскими терминалами, и рассмотрим комплекс мер по устранению этой ситуации.

Анализ ситуации: как это происходит технически

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

  1. Кассир пробивает чек и выбирает оплату картой.
  2. 1С передает управление драйверу терминала. В этот момент запускается утилита взаимодействия с пин-падом.
  3. Операционная система может переключить фокус с окна 1С на рабочий стол (или на невидимое окно драйвера, которое потом исчезает), фактически сворачивая 1С или отправляя ее на задний план.
  4. Кассир видит рабочий стол. Думая, что программа закрылась ("вылетела"), он рефлекторно ищет знакомый ярлык 1С и запускает его снова.
  5. Вторая копия программы загружается, пытается инициализировать оборудование. Но COM-порт кассового аппарата (ККТ) уже захвачен первым (свернутым) экземпляром.
  6. Результат: ошибка связи с ФР, паника кассира, остановка продаж.

Еще один неочевидный сценарий — использование сканера штрихкодов в режиме эмуляции клавиатуры. Если фокус находится на рабочем столе, и активен ярлык 1С, случайное считывание штрихкода (или нажатие кнопки на сканере) может послать команду Enter (суффикс сканера), что операционная система интерпретирует как команду "Запустить выделенное приложение".

Решение 1: Настройка драйвера ККТ (Для аппаратов Атол)

Самое элегантное техническое решение, которое позволяет избежать блокировки кассы даже при запуске нескольких копий, — это правильная настройка драйвера торгового оборудования. Если у вас используются фискальные регистраторы фирмы Атол, нам необходимо изменить логику захвата порта. По умолчанию 1С захватывает порт при запуске и держит его до закрытия программы. Это монопольный режим. Однако драйверы Атол позволяют менять это поведение. Разберем алгоритм действий:

  1. Перейдем в раздел Администрирование — Подключаемое оборудование.
  2. Выберем нашу ККТ и откроем ее настройки.
  3. Найдем параметр, который в разных версиях драйвера называется по-разному, но суть одна: Отключаться от ККТ при завершении операции (в новых драйверах) или галочка Временно захватывать устройство.

Важный нюанс: В старых версиях драйверов логика может быть инвертирована. Иногда нужно поставить галочку "Отключаться", а иногда снять "Не отключаться". Внимательно читайте описание настройки в вашей версии драйвера (ДТО 8, 9 или 10). Что это дает? Когда этот режим активен, 1С устанавливает связь с кассой только на момент печати чека. Сразу после пробития чека порт освобождается. Если кассир случайно запустит вторую копию 1С:

  1. Первая копия висит в фоне, но порт она не держит.
  2. Вторая копия запускается и спокойно подключается к кассе.
  3. Ошибки оборудования не возникает.

Решение 2: Организационные меры в Windows

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

  1. Нажмите правой кнопкой мыши на пустом месте рабочего стола.
  2. Выберите меню Вид.
  3. Снимите галочку Отображать значки рабочего стола.

Теперь, если при оплате картой 1С свернется, кассир увидит пустой рабочий стол (просто обои). Ему некуда будет кликнуть. Скорее всего, он посмотрит на панель задач, увидит там уже запущенную 1С и развернет ее кликом мыши. Также рекомендуется настроить саму панель задач и меню "Пуск" так, чтобы лишние программы не отвлекали внимание.

Решение 3: Программный контроль количества копий

Для тех, кто хочет решить проблему кардинально на уровне платформы 1С, существует метод программного запрета запуска второго сеанса для одного и того же пользователя. Если у вас конфигурация версии ПРОФ (как выяснилось в теме), мы можем внести небольшие изменения в логику начала работы системы. Нам нужно проверить, есть ли уже активный сеанс этого пользователя на этом компьютере. В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы можно использовать следующий подход. Проанализируем логику:


Процедура ПриНачалеРаботыСистемы()
	
	// Получаем текущего пользователя и имя компьютера
	ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
	ИмяКомпьютера = ИмяКомпьютера();
	
	// Получаем все активные сеансы
	Сеансы = ПолучитьСеансыИнформационнойБазы();
	
	КоличествоСеансов = 0;
	Для Каждого Сеанс Из Сеансы Цикл
		// Считаем сеансы того же пользователя на том же компьютере
		Если Сеанс.Пользователь.УникальныйИдентификатор = ТекущийПользователь.УникальныйИдентификатор 
			И Сеанс.ИмяКомпьютера = ИмяКомпьютера Тогда
			
			КоличествоСеансов = КоличествоСеансов + 1;
			
		КонецЕсли;
	КонецЦикла;
	
	// Если это второй сеанс (текущий + предыдущий > 1), завершаем работу
	Если КоличествоСеансов > 1 Тогда
		ПоказатьПредупреждение(, "Программа уже запущена! Переключитесь на открытое окно.");
		ЗавершитьРаботуСистемы(Ложь);
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

Данный код не является готовым решением "copy-paste", так как в типовых конфигурациях вроде "Розница 2.3" или "Розница 3.0" уже могут быть встроенные механизмы контроля, которые нужно просто включить в настройках администрирования (раздел "Настройки пользователей и прав"). Однако, приведенный пример демонстрирует принцип: мы не даем запуститься второй копии, принудительно ее закрывая.

Решение 4: Работа со сканером штрихкодов

Как упоминалось в анализе, сканер в режиме клавиатуры ("в разрыв клавиатуры") — это потенциальный источник проблем при потере фокуса. Почему это опасно? Сканер, настроенный как клавиатура, просто "печатает" цифры штрихкода и нажимает Enter туда, где сейчас находится курсор. Если курсор на рабочем столе, а фокус на иконке — произойдет запуск. Рекомендация: Переведите сканеры в режим эмуляции COM-порта (Virtual COM).

  1. Для этого нужно считать специальный настроечный штрихкод из инструкции к сканеру (обычно называется "USB COM" или "USB Serial").
  2. В Windows установить драйвер виртуального COM-порта от производителя сканера.
  3. В 1С в настройках оборудования выбрать драйвер "1С:Сканеры штрихкода (COM)" или Native-драйвер и указать соответствующий COM-порт.

В этом режиме 1С перехватывает событие сканирования как "Внешнее событие", даже если окно не активно (зависит от драйвера, но чаще всего это работает стабильнее), и уж точно такой сканер не сможет случайно "накликать" запуск программ на рабочем столе.

Дополнительные проверки для ОФД

В ходе обсуждения возник справедливый вопрос: если мы используем метод с отключением от ККТ (Решение 1), будут ли уходить данные в ОФД (Оператор фискальных данных)? Здесь все зависит от того, какой канал обмена используется:

При настройке "Отключаться от ККТ" связь 1С с кассой разрывается, но служба EoU продолжает работать параллельно. Поэтому данные в ОФД будут отправляться корректно. Главное — убедиться, что служба EoU запущена и настроена правильно (проверьте файл настроек службы, обычно там указывается порт, на котором "висит" касса).

Итог

Проблема "двух экземпляров" решается комплексно. Наилучший результат дает комбинация методов:

  1. Убрать лишнее: Скрыть значки с рабочего стола кассира.
  2. Настроить оборудование: Включить опцию освобождения порта в драйвере ККТ (если это Атол).
  3. Обучить персонал: Объяснить, что если окно пропало, нужно посмотреть на панель задач внизу, а не запускать программу заново.

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

← На главную