При работе со сканерами штрихкодов, подключенными через COM-порт к конфигурациям 1С 7.7, мы можем столкнуться с неожиданными и хаотичными зависаниями обмена данными. Часто это происходит, когда используется сторонняя компонента вроде vk_rs232 для прямого взаимодействия с портом. В этой статье мы подробно разберем, почему возникают такие проблемы и как их эффективно решить, используя более стабильные и специализированные подходы.
Проблемы с COM-портами и сканерами штрихкодов в 1С 7.7 могут иметь множество причин, и часто они проявляются как "зависания" или потеря данных. Давайте рассмотрим основные из них, чтобы лучше понимать природу проблемы:
vk_rs232, может зависнуть. Некоторые компоненты позволяют настраивать глубину буфера, но это не всегда полностью решает проблему при высокоинтенсивном потоке данных или при значительной загрузке компьютера другими процессами.ОбработкаВнешнегоСобытия, и для его получения требуются дополнительные действия (например, установка курсора в нужное поле).Прямая работа с COM-портом через компоненты типа vk_rs232, особенно в старых версиях 1С, может быть капризной и нестабильной. Наиболее надежным и рекомендуемым решением является переход на специализированные драйверы торгового оборудования, такие как ScanOpos.dll (часто входит в состав 1С) или драйверы от компании АТОЛ. Эти драйверы разработаны специально для интеграции с 1С, обеспечивают более стабильную работу, асинхронную обработку событий и дополнительные функциональные возможности.
ScanOpos.dll – это внешняя компонента, которая предоставляет стандартизированный интерфейс для работы со сканерами штрихкодов в 1С, включая 1С 7.7. Она является частью набора "1С:Драйверы торгового оборудования" и обеспечивает более надежное взаимодействие со сканером, чем прямое обращение к COM-порту.
Для начала, нам потребуется объявить глобальную переменную, которая будет хранить объект сканера. Обычно это делается в глобальном модуле:
Перем Сканер Экспорт;
Затем, при начале работы системы, например, в процедуре ПриНачалеРаботыСистемы(), мы должны вызвать функцию для подключения сканера. Давайте рассмотрим пример такой функции, которую мы можем разместить в глобальном модуле:
Функция ПодключитьСканер()
Рез = 0;
Если ЗагрузитьВнешнююКомпоненту("ScanOpos.dll") = 0 Тогда
ОписаниеРезультата = "Не удалось загрузить внешнюю компоненту ScanOpos.dll !";
Иначе
Попытка
Сканер = СоздатьОбъект("AddIn.Scanner");
Исключение
// Здесь мы можем обработать исключение, если объект не создался
КонецПопытки;
Если ПустоеЗначение(Сканер) = 1 Тогда
ОписаниеРезультата = "Не удалось создать объект внешней компоненты с программным идентификатором AddIn.Scanner";
Иначе
Если Сканер.УстройствоВключено = 1 Тогда
// Устройство уже включено, все хорошо
Рез = 1;
Иначе
// Если устройство не включено, пытаемся подсоединить его
Если Сканер.Подсоединить("Scanner") <> 0 Тогда
ОписаниеРезультата = "Не удалось подсоединить устройство";
Иначе
// Получаем монопольный доступ к устройству
Если Сканер.Занять(1) <> 0 Тогда
ОписаниеРезультата = "Не удалось получить монопольный доступ у устройству";
Иначе
// Включаем устройство
Сканер.УстройствоВключено = 1;
Если Сканер.Результат <> 0 Тогда
ОписаниеРезультата = "Не удалось включить устройство";
Иначе
Рез = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Рез = 1 Тогда
// Очищаем буферы компоненты для исключения "мусора"
Сканер.ОчиститьВход();
Сканер.ОчиститьВыход();
// Включаем режим немедленной посылки данных (каждый скан генерирует событие)
Сканер.ПосылкаДанных = 1;
КонецЕсли;
Возврат Рез;
КонецФункции // ПодключитьСканер()
Мы видим, что функция ПодключитьСканер() выполняет несколько важных шагов:
ScanOpos.dll.AddIn.Scanner.ПосылкаДанных в 1. Это гарантирует, что каждый считанный штрихкод будет немедленно отправлен в 1С в виде внешнего события.После того как сканер подключен и настроен на немедленную посылку данных, мы должны реализовать процедуру ОбработкаВнешнегоСобытия() в модуле формы, где планируется использовать сканер. Именно эта процедура будет "ловить" штрихкоды, приходящие от сканера.
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если Событие = "BarCodeValue" Тогда
ШкАМ = СокрЛП(Данные); // Получаем штрихкод и обрезаем пробелы
Сообщить(ШкАМ); // Выводим штрихкод для отладки
// А тут, мы можем делать с полученным ШК, что хотим:
// - Найти товар в базе
// - Добавить строку в табличную часть
// - Выполнить другие операции
КонецЕсли;
Попытка
// Важно: после обработки события, снова включаем посылку данных,
// чтобы сканер был готов к следующему сканированию.
Сканер.ПосылкаДанных = 1;
Исключение
Сообщить("Сканер не подключен или произошла ошибка при активации!");
КонецПопытки;
КонецПроцедуры
В этой процедуре мы проверяем, что событие пришло от сканера и имеет тип "BarCodeValue". Полученные данные (штрихкод) мы записываем в переменную и далее можем использовать по своему усмотрению. Очень важно в конце процедуры снова установить Сканер.ПосылкаДанных = 1;, чтобы сканер был готов принять следующий штрихкод и сгенерировать новое событие.
Драйверы торгового оборудования от компании АТОЛ — это еще одно очень популярное и надежное решение для подключения сканеров штрихкодов и другого оборудования к 1С. Они отличаются высокой стабильностью и широкой совместимостью с различными моделями сканеров.
Мы должны учитывать, что существуют разные версии драйверов АТОЛ. Для 1С 7.7 часто используются более старые версии, например, до 6.xx (6.24). Эти версии часто распространялись бесплатно. Более новые версии драйверов могут требовать лицензии или ключа защиты, и без них могут вносить задержки в работу (например, около секунды при сканировании).
Преимущества драйверов АТОЛ включают:
#13 для Enter после штрихкода) и другие параметры.При использовании драйверов АТОЛ, общая схема работы с ними в 1С 7.7 будет похожа на работу со ScanOpos.dll, но с учетом специфики объекта драйвера АТОЛ. Обычно мы выполняем следующие шаги:
СоздатьОбъект() для создания объекта драйвера АТОЛ (например, "AddIn.ATOL_Scanner", точный ProgID зависит от версии драйвера) и далее работать с его методами и свойствами для подключения и получения данных. Механизм ОбработкаВнешнегоСобытия() также будет использоваться для получения штрихкодов.Чтобы обеспечить максимальную стабильность работы сканеров штрихкодов в 1С 7.7, рекомендуем учитывать следующие моменты:
ОбработкаВнешнегоСобытия(). Как правило, для перевода сканера в этот режим используются специальные штрихкоды программирования из документации производителя.Переходя от прямого взаимодействия с COM-портом через компоненты вроде vk_rs232 к специализированным драйверам, таким как ScanOpos.dll или драйверы АТОЛ, мы значительно повышаем стабильность и надежность работы сканеров штрихкодов в 1С 7.7. Эти решения предоставляют стандартизированный и более отказоустойчивый механизм для обработки внешних событий, что позволяет нам избежать хаотичных зависаний и потери данных. Мы всегда уделяем внимание правильной настройке как самого сканера, так и драйвера, чтобы обеспечить бесперебойную работу нашего торгового оборудования.