При работе в многопользовательском режиме на терминальном сервере (RDP / RemoteApp) в старых конфигурациях 1С на обычных формах (таких как «Комплексная автоматизация 1.1», «Управление торговлей 10.3» или «Управление производственным предприятием 1.3») часто возникает неприятная техническая проблема. При открытии кассовых или товарных документов (ПКО, РКО, Реализации товаров и услуг) у всех пользователей система «зависает» на 20–30 секунд, после чего выдает ошибку подключения к фискальному регистратору или ККТ.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы торгового оборудования в 1С и рассмотрим несколько эффективных способов решения — от простых настроек прав до программной доработки системы.
Для связи физического устройства (в нашем примере — ККТ Атол) с информационной базой 1С используется подсистема торгового оборудования. По умолчанию 1С привязывает настройки каждой кассы к конкретному рабочему месту. Идентификатором этого рабочего места выступает имя компьютера, которое система получает с помощью стандартной функции платформы ИмяКомпьютера().
При работе на локальных компьютерах этот механизм работает отлично: у каждого пользователя свой уникальный ПК, и 1С безошибочно определяет, к какому компьютеру подключена касса. Однако в терминальном режиме (RDP) ситуация кардинально меняется:
ИмяКомпьютера() возвращает одно и то же имя терминального сервера (например, TS-SERVER).Рассмотрим по шагам четыре практических способа решения этой проблемы.
Если вам необходимо решить проблему быстро и без изменения метаданных конфигурации (чтобы сохранить базу на стандартной поддержке), наиболее простым решением будет пересмотр прав доступа пользователей.
Выясним причину, почему этот метод работает под капотом. При открытии кассовых документов конфигурация инициализирует модуль работы с торговым оборудованием только в том случае, если у пользователя есть права на управление ККТ. Если у пользователя отсутствуют специализированные роли, система просто пропускает шаг инициализации оборудования.
Чтобы избавить обычных пользователей (менеджеров, бухгалтеров) от зависаний при открытии документов, достаточно отключить у них в конфигураторе две роли:
ИспользованиеТорговогоОборудованияПолныеПраваВажное ограничение метода: данный способ не подойдет в двух случаях:
ИспользованиеТорговогоОборудования заблокирует работу со всеми устройствами сразу.Если способ с отключением ролей вам не подходит, решением станет небольшая доработка конфигурации. Наша задача — научить 1С различать пользователей терминала по имени их реальных физических компьютеров, с которых они запускают RDP-сессию.
В операционной системе Windows при подключении по RDP создается переменная окружения %CLIENTNAME%, в которой хранится имя удаленного клиентского компьютера. Мы можем использовать ее в коде 1С.
Найдем в конфигурации функцию, отвечающую за определение имени компьютера для торгового оборудования (обычно это функция ПолучитьИмяКомпьютераТО() или аналогичная в общем модуле ПолучитьИмяКомпьютера() в обработке обслуживания ТО) и перепишем ее.
Рассмотрим более надежный и безопасный вариант реализации функции с использованием объекта WScript.Shell:
Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
// По умолчанию берем стандартное имя сервера
мИмяКомпьютера = ВРег(ИмяКомпьютера());
// Пытаемся получить имя физического ПК клиента через окружение Windows
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
ИмяКлиента = ВРег(СокрЛП(WshShell.ExpandEnvironmentStrings("%CLIENTNAME%")));
// Проверяем, что значение не пустое, не равно локальной консоли и корректно прочиталось
Если ИмяКлиента <> "" И ИмяКлиента <> "CONSOLE" И ИмяКлиента <> "%CLIENTNAME%" Тогда
// Формируем уникальный идентификатор: ИмяСервера_ИмяКлиента
мИмяКомпьютера = мИмяКомпьютера + "_" + ИмяКлиента;
КонецЕсли;
Исключение
// Исключение сработает, если COM-объект недоступен (например, клиент запущен на Linux)
ЗаписьЖурналаРегистрации("ПодключениеТО", УровеньЖурналаРегистрации.Предупреждение,,,
"Не удалось получить имя клиента RDP: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции
Разберем по шагам, как работает этот алгоритм:
мИмяКомпьютера сначала инициализируется стандартным именем сервера.WScript.Shell мы запрашиваем значение переменной окружения %CLIENTNAME%.Попытка...Исключение гарантирует безопасность исполнения кода. Если база в будущем будет запускаться на сервере под управлением Linux или на macOS-клиентах, система не упадет в критическую ошибку, а продолжит работу по дефолтному сценарию.ИмяСервера_ИмяКлиента (например, SERVER1C_WORKSTATION05) гарантирует стопроцентную уникальность рабочего места, исключая конфликты имен, если у сотрудников дома совпадают сетевые имена компьютеров при подключении через VPN.Важное действие после внедрения кода: после изменения этой функции в справочнике «Торговое оборудование» для вашего кассира автоматически определится новое рабочее место (новое имя компьютера). Вам потребуется один раз зайти под учетной записью кассира и заново привязать и настроить ККТ Атол к созданному рабочему месту. Для остальных сотрудников никаких настроек делать не нужно — у них определятся свои уникальные имена компьютеров, для которых ККТ не настроена, и попытки подключения при открытии документов прекратятся.
Посмотрим на логику работы документов в типовой конфигурации «Комплексная автоматизация 1.1». По умолчанию подключение торгового оборудования и захват порта происходят в обработчике события ПриОткрытии формы документа. Это не всегда оправданно, так как большинство пользователей открывают документы просто для просмотра, редактирования или проведения, и чек им печатать не требуется.
Альтернативный и очень эффективный вариант доработки — отложенное (lazy) подключение ККТ:
ПриОткрытии формы документов.Такой подход полностью исключает зависания документов при их открытии другими пользователями, а порт кассы остается занятым только в те короткие секунды, когда физически происходит печать чека.
Если проброс локальных портов через RDP работает нестабильно (порты периодически «отваливаются» или меняют свои номера при переподключении сессий), рассмотрим вариант использования сетевых технологий.
Вместо прямой привязки ККТ к COM-порту в терминале можно использовать специализированный софт:
Выбирайте наиболее подходящий для вашей инфраструктуры метод — от простой настройки ролей до изящной доработки кода получения имени рабочей станции — и ваши пользователи навсегда забудут о раздражающих задержках при работе с документами!