Как решить проблему зависания COM-порта сканера штрихкодов в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

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

Почему возникает проблема? Анализируем возможные причины

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

  1. Некорректная обработка буфера COM-порта. Когда данные со сканера поступают очень быстро, а программа 1С не успевает их обрабатывать, они начинают накапливаться в буфере COM-порта. Если буфер переполняется, данные могут быть потеряны, а порт, или сама компонента vk_rs232, может зависнуть. Некоторые компоненты позволяют настраивать глубину буфера, но это не всегда полностью решает проблему при высокоинтенсивном потоке данных или при значительной загрузке компьютера другими процессами.
  2. Конфликты доступа к порту. Если несколько приложений или процессов (например, служба печати, другое ПО для работы с оборудованием) пытаются одновременно получить доступ к одному и тому же COM-порту, возникают ошибки "отказано в доступе", что может привести к зависаниям. В терминальных сессиях COM-порты могут "отваливаться" из-за особенностей работы сервера, который может отключать неиспользуемые устройства для экономии энергии. В таких случаях иногда помогает отключение функции управления питанием для USB-хабов в диспетчере устройств.
  3. Неподходящий режим работы сканера. Сканеры штрихкодов могут функционировать в нескольких режимах:
    • Эмуляция клавиатуры: Считанный штрихкод передается как ввод с клавиатуры. Для 1С 7.7 это наименее удобный режим, так как штрихкод не попадает в процедуру ОбработкаВнешнегоСобытия, и для его получения требуются дополнительные действия (например, установка курсора в нужное поле).
    • Эмуляция COM-порта (Virtual COM): Сканер создает виртуальный COM-порт, через который данные передаются в 1С. Этот режим предпочтительнее для 1С, поскольку он позволяет программе автоматически обрабатывать данные через механизм внешних событий.
    • Собственный USB-режим: Некоторые сканеры имеют собственный USB-интерфейс, требующий специализированного драйвера.
  4. Отсутствие или несовместимость драйверов. Для корректной работы сканера в режиме COM-порта необходим соответствующий драйвер, как правило, предоставленный производителем устройства или универсальные драйверы (например, от АТОЛ). Отсутствие или устаревшая версия драйвера может приводить к нестабильной работе и зависаниям.

Переход на специализированные драйверы: Ключ к стабильности

Прямая работа с COM-портом через компоненты типа vk_rs232, особенно в старых версиях 1С, может быть капризной и нестабильной. Наиболее надежным и рекомендуемым решением является переход на специализированные драйверы торгового оборудования, такие как ScanOpos.dll (часто входит в состав 1С) или драйверы от компании АТОЛ. Эти драйверы разработаны специально для интеграции с 1С, обеспечивают более стабильную работу, асинхронную обработку событий и дополнительные функциональные возможности.

Решение 1: Использование компоненты ScanOpos.dll

ScanOpos.dll – это внешняя компонента, которая предоставляет стандартизированный интерфейс для работы со сканерами штрихкодов в 1С, включая 1С 7.7. Она является частью набора "1С:Драйверы торгового оборудования" и обеспечивает более надежное взаимодействие со сканером, чем прямое обращение к COM-порту.

Подключение компоненты ScanOpos.dll

Для начала, нам потребуется объявить глобальную переменную, которая будет хранить объект сканера. Обычно это делается в глобальном модуле:

Перем Сканер Экспорт;

Затем, при начале работы системы, например, в процедуре ПриНачалеРаботыСистемы(), мы должны вызвать функцию для подключения сканера. Давайте рассмотрим пример такой функции, которую мы можем разместить в глобальном модуле:


Функция ПодключитьСканер()
    Рез = 0;
    Если ЗагрузитьВнешнююКомпоненту("ScanOpos.dll") = 0 Тогда
        ОписаниеРезультата = "Не удалось загрузить внешнюю компоненту ScanOpos.dll !";
    Иначе
        Попытка
            Сканер = СоздатьОбъект("AddIn.Scanner");
        Исключение
            // Здесь мы можем обработать исключение, если объект не создался
        КонецПопытки;
        Если ПустоеЗначение(Сканер) = 1 Тогда
            ОписаниеРезультата = "Не удалось создать объект внешней компоненты с программным идентификатором AddIn.Scanner";
        Иначе
            Если Сканер.УстройствоВключено = 1 Тогда
                // Устройство уже включено, все хорошо
                Рез = 1;
            Иначе
                // Если устройство не включено, пытаемся подсоединить его
                Если Сканер.Подсоединить("Scanner") <> 0 Тогда
                    ОписаниеРезультата = "Не удалось подсоединить устройство";
                Иначе
                    // Получаем монопольный доступ к устройству
                    Если Сканер.Занять(1) <> 0 Тогда
                        ОписаниеРезультата = "Не удалось получить монопольный доступ у устройству";
                    Иначе
                        // Включаем устройство
                        Сканер.УстройствоВключено = 1;
                        Если Сканер.Результат <> 0 Тогда
                            ОписаниеРезультата = "Не удалось включить устройство";
                        Иначе
                            Рез = 1;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Если Рез = 1 Тогда
        // Очищаем буферы компоненты для исключения "мусора"
        Сканер.ОчиститьВход();
        Сканер.ОчиститьВыход();
        // Включаем режим немедленной посылки данных (каждый скан генерирует событие)
        Сканер.ПосылкаДанных = 1;
    КонецЕсли;
    Возврат Рез;
КонецФункции // ПодключитьСканер()

Мы видим, что функция ПодключитьСканер() выполняет несколько важных шагов:

  1. Загружает внешнюю компоненту ScanOpos.dll.
  2. Создает объект сканера с программным идентификатором AddIn.Scanner.
  3. Проверяет, активно ли устройство. Если нет, пытается его подсоединить и занять, получая монопольный доступ.
  4. Включает устройство.
  5. После успешного подключения очищает входной и выходной буферы сканера и устанавливает свойство ПосылкаДанных в 1. Это гарантирует, что каждый считанный штрихкод будет немедленно отправлен в 1С в виде внешнего события.

Обработка событий сканера

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


Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если Событие = "BarCodeValue" Тогда
        ШкАМ = СокрЛП(Данные); // Получаем штрихкод и обрезаем пробелы
        Сообщить(ШкАМ);       // Выводим штрихкод для отладки
        // А тут, мы можем делать с полученным ШК, что хотим:
        // - Найти товар в базе
        // - Добавить строку в табличную часть
        // - Выполнить другие операции
    КонецЕсли;
    Попытка
        // Важно: после обработки события, снова включаем посылку данных,
        // чтобы сканер был готов к следующему сканированию.
        Сканер.ПосылкаДанных = 1;
    Исключение
        Сообщить("Сканер не подключен или произошла ошибка при активации!");
    КонецПопытки;
КонецПроцедуры

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

Решение 2: Использование драйверов АТОЛ

Драйверы торгового оборудования от компании АТОЛ — это еще одно очень популярное и надежное решение для подключения сканеров штрихкодов и другого оборудования к 1С. Они отличаются высокой стабильностью и широкой совместимостью с различными моделями сканеров.

Особенности драйверов АТОЛ

Мы должны учитывать, что существуют разные версии драйверов АТОЛ. Для 1С 7.7 часто используются более старые версии, например, до 6.xx (6.24). Эти версии часто распространялись бесплатно. Более новые версии драйверов могут требовать лицензии или ключа защиты, и без них могут вносить задержки в работу (например, около секунды при сканировании).

Преимущества драйверов АТОЛ включают:

  1. Универсальность: Поддерживают широкий спектр сканеров.
  2. Надежность: Обеспечивают стабильное взаимодействие с оборудованием.
  3. Настраиваемость: Позволяют тонко настроить параметры COM-порта, суффиксы (например, #13 для Enter после штрихкода) и другие параметры.

Настройка сканера для работы с АТОЛ

При использовании драйверов АТОЛ, общая схема работы с ними в 1С 7.7 будет похожа на работу со ScanOpos.dll, но с учетом специфики объекта драйвера АТОЛ. Обычно мы выполняем следующие шаги:

  1. Установка драйвера: Загружаем и устанавливаем драйвер АТОЛ на рабочую станцию.
  2. Настройка сканера: Переводим сканер в режим эмуляции COM-порта (Virtual COM), если он изначально настроен как клавиатурный. Для этого используем специальные штрихкоды программирования из инструкции к сканеру.
  3. Настройка порта в драйвере: С помощью утилиты настройки драйвера АТОЛ (обычно поставляется с драйвером) указываем номер COM-порта, к которому подключен сканер, скорость обмена (Baud Rate), биты данных, стоп-биты и четность. Мы также можем настроить суффиксы и префиксы, если это необходимо.
  4. Подключение в 1С: В 1С 7.7 мы будем использовать СоздатьОбъект() для создания объекта драйвера АТОЛ (например, "AddIn.ATOL_Scanner", точный ProgID зависит от версии драйвера) и далее работать с его методами и свойствами для подключения и получения данных. Механизм ОбработкаВнешнегоСобытия() также будет использоваться для получения штрихкодов.

Дополнительные рекомендации для стабильной работы со сканерами ШК

Чтобы обеспечить максимальную стабильность работы сканеров штрихкодов в 1С 7.7, рекомендуем учитывать следующие моменты:

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

Переходя от прямого взаимодействия с COM-портом через компоненты вроде vk_rs232 к специализированным драйверам, таким как ScanOpos.dll или драйверы АТОЛ, мы значительно повышаем стабильность и надежность работы сканеров штрихкодов в 1С 7.7. Эти решения предоставляют стандартизированный и более отказоустойчивый механизм для обработки внешних событий, что позволяет нам избежать хаотичных зависаний и потери данных. Мы всегда уделяем внимание правильной настройке как самого сканера, так и драйвера, чтобы обеспечить бесперебойную работу нашего торгового оборудования.

← На главную