Необходимо провести тестирование фискального регистратора в Windows и в WINE. 1. Тестирование и настройка при помощи тестовой утилиты, входящей в состав драйвера АТОЛ. 2. Подключение сканера ШК в 1С и работа с ним.
Настройка в 1С описана по адресу: http://www.atol.ru/support/encyclopedy/1c/1s77-all/1c77-scan/
Все как написано удается осуществить корректно, но при попытке ввести в 1С штрих код для товара ничего не получается.
Сканер пишет в COM-порт строки, состояющие из штрих-кода и символов завершения строки. Они без проблем читаются под Linux с помощью примитивной программы. В логах 1С следующее: 0009:Call KERNEL32.ReadFile(0000072c,0032e604,00001000,0032e564,0032e550) ret=02cef403 0009:Ret KERNEL32.ReadFile() retval=00000000 ret=02cef403 0009:Call KERNEL32.GetLastError() ret=02cef40c 0009:Ret KERNEL32.GetLastError() retval=000003e5 ret=02cef40c 0009:Call KERNEL32.WaitForSingleObject(00000724,000005dc) ret=02cecf40 0009:Ret KERNEL32.WaitForSingleObject() retval=00000102 ret=02cecf40 0x3e5 - это ERROR_IO_PENDING. То есть надо дождаться завершения операции чтения. 1С ждёт её в течении 1500 мс, но не дожидается (0x102 - WAIT_TIMEOUT). Если сделать хак, заставляющий Wine вместо 1500 мс ждать вечно, то всё зависает. При поиске оборудования ReadFile завершается сразу же и штрих-код читается: 0009:Call KERNEL32.ReadFile(0000072c,02bbe5f8,00000008,0032d838,0032d824) ret=02cef403 0009:Ret KERNEL32.ReadFile() retval=00000001 ret=02cef403 0009:Call KERNEL32.WaitForSingleObject(000006e0,000005dc) ret=02cecf40 0009:Call KERNEL32.GetOverlappedResult(0000072c,0032d824,0032d838,00000000) ret=02cef459 Написал тестовую программу для Wine, читающую штрих-код со сканера. В ней ReadFile тоже возвращает ERROR_IO_PENDING, но чтение завершается за конечное время и всё прекрасно работает.
Под Wine ReadFile читает COM-порт, пока не прочитает заданное 3-м аргументом число байт. Под Windows он может завершиться, прочитав меньше. Из MSDN: "When reading from a communications device, the behavior of ReadFile is determined by the current communication time-out as set and retrieved by using the SetCommTimeouts and GetCommTimeouts functions".
Пофиксил. Исправление не совсем правильное, но для того чтобы исправить правильно надо проверить, как ведёт себя Windows при поступлении данных на COM-порт с разной скоростью и при различных комбинациях параметров в структуре COMMTIMEOUTS, так что пока пусть будет так.
Проверил еще раз, все работает. Ждем релиза и закрываем.
На последней версии в тестовой программе для сканера от АТОЛ не открывается меню настройки свойств сканера. WINE@Etersoft 1.0.11 eter9/eter5 Драйвера версии: DTO6_2009_10_09.zip
При использовании DTO6_2009_10_09.zip происходит падение при регистрации DLL.
Created attachment 1343 [details] wine regsvr32 Scaner1C.dll
Scaner1C.dll успешно регистрируется, если в директорию, где она находится, скопировать DTO_comm.dll из ATOL/Drivers/Bin.
При нажатии на кнопку "Поиск оборудования..." кроме окна поиска оборудования появляется ещё какое-то окно "Dialog" с кнопками OK и Cancel. 1С очень сильно тормозит, когда открыты эти окна, хотя процессор загружен не на 100%. Штрих-коды в окне поиска оборудования читаются, хоть и с большой задержкой. При вводе штрих-кода в самой 1С она на какое-то время подвисает, но потом штрих-код таки вводится.
С более старым дистрибутивом DTO6_2008_10_06.zip таких проблем нет.
Решена путем использования более старых драйверов.