Имя: Пароль:
1C
1С v8
Контроль наличия подключенных устройств
0 Mikhail Volkov
 
25.10.17
18:55
При наличие подключенных устройств к компьютеру в Сервис/Параметры добавляется вкладка Свойства независимо от версии 1С. Как то можно программно контролировать есть подключенное устройство, включено оно, или нет?
Ну забыл кассир кассу включить, и пытается чек отбить. Надо выдать предупреждение, что касса не включена. Особенно в терминале, если порт не пробросился.
1 lodger
 
25.10.17
19:02
"пытается чек отбить" - "Надо выдать предупреждение"
ну так. когда пытается - ком объект даст ошибку подключения. обработать код ошибки. сообщить юзеру.
2 Mikhail Volkov
 
25.10.17
19:09
(1) Зачем, куда Com-объект? Контроль порта нужен, есть что на нем, или нет? Система это делает, но как?
3 Сияющий в темноте
 
25.10.17
19:30
естб wmi,где можно все спросить,но права админа нужны
в терминале,сложнее,так как нужно по сети на машину заходить,хотя списое проброшенных портов можно увидеть,
нл если порт физический,то даже если кассу не вкоючили  прлброс все равно будет
4 Mikhail Volkov
 
26.10.17
10:02
(3) Админские проверки может дадут результат, но хотелось проверять доступность непустого порта (с подключенным оборудованием) средствами 1С. Никак?
5 Остап Сулейманович
 
26.10.17
10:09
(0)
1. Вкладку настройки внешних устройств добавляет внешняя компонента.
2. Внешняя компонента чаще всего имеет средства проверки состояния оборудования. Тем более компоненты кассовых аппаратов.
6 piter3
 
26.10.17
10:10
тестустройства проводить
7 Йохохо
 
26.10.17
10:12
(4) зачем проверять порт, если есть возможность проверить кассу?
ЗЫ "Ну забыл кассир кассу включить" зачем кассу выключать?
8 Остап Сулейманович
 
26.10.17
10:13
+ (5) На ИТС можно почитать "Требования к разработке драйверов для фискальных регистраторов". Там есть ответы на все ваши вопросы.
Пример обязательного метода внешней компоненты:
"
ТестУстройства (DeviceTest)    МассивЗначений
(ValuesArray)    
IDispatch*
[IN]

Массив значений для настройки подключения

BOOL

Выполняет пробное подключение и опрос устройства. При успешном выполнении подключения в описании возвращается описание устройства. При отрицательном результате возвращается описание возникшей проблемы при подключении.
ДополнительноеОписание (AdditionalDescription)    
BSTR
[OUT]

Описание результата выполнения теста
"
9 piter3
 
26.10.17
10:13
Только вот тут проблема есть,пока вы проверки делаете то пробить чек по моему нельзя
10 Сияющий в темноте
 
26.10.17
10:14
если фискальный регистратор,то проще запросить его состояние командой драйвера,и узнать,что,например,в нем нет бумаги или что-то еще странное
11 Остап Сулейманович
 
26.10.17
10:15
(9)
Открыть
Проверить
Пробить чек
Закрыть
12 Tarlich
 
26.10.17
10:15
а вы не видели  есть проверить все торговое оборудование , может вызвать данную функцию и смотреть что вернет -))
13 piter3
 
26.10.17
10:18
(11) Тест относительно длительная процедура
14 Галахад
 
гуру
26.10.17
10:31
Чего-то непонятно. 1С и сама проверяет подключение торгового оборудования при каждом открытии формы Чека.
15 Mikhail Volkov
 
26.10.17
12:44
(14) Да, проверяет. В Альфа-Авто это все делает "черный ящик" СЗУО - Сервер защиты и управления оборудованием. Но обращение к нему чревато необратимой ошибкой "Порт недоступен"! Это происходит когда комп с ФР еще не включен (или ФР не включено питание), не вошел в терминал, не вошел в Альфа-Авто, не подключил ФР к Альфа-Авто. Самое печальное, когда все эти условия будут выполнены, то ошибка "Порт недоступен" не сбросится, если порт уже будет испорчен другим пользователем неудачной попыткой подключения ФР.
Сперва боролись организационно: 1-м в Альфа-Авто входит кассир с компа с ФР. Все остальные ждут кассира, курят бамбук. Трудно выполнимо. Ослабили, входить в Альфа-Авто можно, но кассой не пользоваться, ждать разрешения...
Вот и хочу сделать предварительный контроль без обращения СЗУО, и выдавать это разрешение.

(8) Хотел что-то попроще админское (но без прав админа не проверить)... Наверное без этого не обойтись?
Глянул, с ходу не нашел примера проверки доступности подключенного устройства. Буду изучать...
16 Галахад
 
гуру
26.10.17
12:48
(15) Какие-то ужасы.

(16) Ну можно впилить типовую проверку. Там вроде все прозрачно.
17 piter3
 
26.10.17
12:49
(15) Может софт поменять:))))
18 Mikhail Volkov
 
26.10.17
18:39
(8) Что-то на ИТС не нашел "Пример обязательного метода внешней компоненты". Можно поточнее ссылку?
Покопался в старой ТиС, нашел свою обработку по снятию X/Z отчета, так все просто было:
Процедура СформироватьX()
    
    ФР = СоздатьОбъект("AddIn.FprnM45");
    // занимаем порт
    ФР.DeviceEnabled = 1;
    Если ФР.ResultCode <> 0 тогда
        Сообщить("Не удалось занять порт", "!");
        Возврат;
    КонецЕсли;

    // если смена открыта снимаем Z-отчет
      Если ФР.SessionOpened = 1 тогда

        // Отчет по секциям
        ФР.Mode = 2;
        Если ФР.SetMode() <> 0 тогда
            Сообщить("Не удалось войти в режим регистрации", "!");
            Возврат;
        КонецЕсли;
//        ФР.SetMode();
        ФР.ReportType = 7;
        ФР.Report();
    
        // снимаем X-отчет
        ФР.Mode = 2;
        ФР.SetMode();
        ФР.ReportType = 2;
        ФР.Report();
    Иначе
        Предупреждение("Не открыта кассовая смена!",60);
      КонецЕсли;

    // освобождаем порт
    ФР.DeviceEnabled=0;  
КонецПроцедуры  

Мне что-то подобное нужно: занять порт, если ФР.ResultCode вернет 0 - все хорошо, освобождаем порт. Но где, как указать IP-адрес компа с ФР?
19 Vaflya
 
26.10.17
18:49
ну так описание к обслуживающему драйверу берете и смотрите что там есть, обычно есть МодельУстройства или ВерсияПрошивки, там много
20 isa2net
 
26.10.17
19:15
21 Остап Сулейманович
 
26.10.17
20:17
(18) Искать нужно :
"Требования к разработке драйверов для фискальных регистраторов"
22 Сияющий в темноте
 
26.10.17
21:43
Если Альфа Авто так хреново работает,то проще в ней переписать работу с кассой,т.к.всё равно так не методы 1с а свой кривоколесый велосипед
23 NorthWind
 
26.10.17
21:59
(18) да нигде не надо. Под нужной учетной записью Windows настраиваете нужный вам регистратор - локальный или удаленный - неважно. И все, под тем же пользователем вы можете пытаться логиниться на него средствами драйвера. IP удаленной машины не ваща забота, это все сохранено в настройках драйвера.
24 Mikhail Volkov
 
27.10.17
06:56
(20) Да! Только ты нашел: "В Program Files \ATOL\Drivers8\Samples примеры и там ECR = new ActiveXObject ("AddIn.FPrnM45");"?
У себя смотрел c:\Program Files (x86)\ATOL\Drivers8\Samples\FprnM\1CV80\ обработку Пример - не нашел в нем ECR = new ActiveXObject ("AddIn.FPrnM45");!?
Это теперь вместо ФР = СоздатьОбъект("AddIn.FprnM45");?

(23) Так оно, для пользователей, которым сисадмин настроил профиль в Сервис/Параметры/Свойства уже прописан IP-адрес:6220 пользователю остается нажать кнопочку "Проверка связи", и если в Результате: 0 - ошибок нет (пишет: АТОЛ 11Ф, №... ФИСК), то пользователь может спокойно подключать кассу и отбить чек. С гарантией, что это не приведет к необратимой ошибке: -3 Порт недоступен, после которой придется сервер перезагружать!
Пока это лишь рекомендация для пользователей: делать проверку связи с ФР перед каждым отбитие чека. Потому что касса по 2-3 раза на дню отваливается. Ее желательно автоматизировать: как только пользователь ставит в документе галку "Для пробития на фискальном регистраторе".
25 NorthWind
 
27.10.17
09:03
(24) ну автоматизируйте, кто не велит-то? Берете руководство к драйверу и пишете эту "проверку связи". Как я понимаю, достаточно попытаться сделать DeviceEnabled = 1, после чего проверить состояние.
26 isa2net
 
27.10.17
12:59
(24) Я это из примера на jscript код выдрал, в 1c? конечно, СоздатьОбъект
27 Mikhail Volkov
 
27.10.17
13:53
(26) Это 1С7, для 8-й нашел примеры в Драйвер ККМ. Руководство программиста "C:\Program Files (x86)\ATOL\Drivers8\Doc\Drivers8_FprnM_PM.pdf"
Процедура ПриНачалеРаботыСистемы()
    Попытка
        // Загрузка внешней компоненты
        ЗагрузитьВнешнююКомпоненту ("C:\Program Files (x86)\ATOL\Drivers8\Bin\FPrnM1C.dll");
        Сообщить("Внешняя компонента загружена");
        Попытка
            // Создание объекта
            ККМ = Новый("AddIn.FPrnM8");
        Исключение
            Сообщить("Объект не найден!");
        КонецПопытки;
    Исключение
        Сообщить("Внешняя компонента драйвера не найдена");
    КонецПопытки;
КонецПроцедуры

Но ККМ не на сервере терминалов, а на локальном компьютере. Надо наверное его IP-адрес указать. Но как? В принципе ККМ = Новый("AddIn.FPrnM8"); - это Com-объект, когда к другой базе цепляюсь по Com-соединению, указываю СтрокаПодключения:
ТекCOMОбъект = БазаCOM.Connect(СтрокаПодключения); в ней путь (для файловой базы). А здесь как указать?
28 isa2net
 
27.10.17
15:00
(27) Так это у вас натив объект по идее, он подцепит все настройки которые вы прописали в драйвере.
Если так
// занимаем порт
  
  ККМ.DeviceEnabled = 1;
  Если ККМ.ResultCode <> 0 тогда
    Возврат;
  КонецЕсли;
29 Mikhail Volkov
 
27.10.17
17:41
(28) Это да, но у меня пока "Объект не найден!", ККМ = Новый("AddIn.FPrnM8"); - не создается!? Почему? Не зарегистрирована FPrnM1C.dll, или что?
30 isa2net
 
27.10.17
18:16
(29) бинарник 1с 32 битный запускаете?
31 Mikhail Volkov
 
27.10.17
18:23
FPrnM8 заменил на FPrnM45 - заработало!? Для проверки порта и эта пойдет, но почему с FPrnM8 не работает?

В итоге получилось:

Функция ПроверкаСвязиФР(IP_Адрес = "", ТекстСообщения = "") Экспорт

    Если ПустаяСтрока(IP_Адрес) Тогда
        ТекстСообщения = "Не указан IP-адрес ФР";
        Возврат Ложь;
    КонецЕсли;
    
    ФР = ЗагрузитьВнешнююFPrnM1C(ТекстСообщения);
    Если ФР = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
//    ФР.АдресХоста = "10.0.13.179:6220";    // IP-адрес AKIT-09
    ФР.АдресХоста = IP_Адрес + ":6220";
//    ФР.Password = 30;
    ФР.DeviceEnabled = 1;    // занимаем порт
    Результат = ФР.ResultCode;
    ТекстСообщения = "Ошибка проверки связи с ФР: " + ФР.ResultDescription;
//    Если Результат <> 0 тогда
//        Возврат Результат;
//    КонецЕсли;
    ФР.DeviceEnabled = 0;    // освобождаем порт
    Возврат Результат;

КонецФункции // ПроверкаСвязиФР()

Но ФР.АдресХоста - только IP-адрес нужен, по имени компа не понимает!? 1С умеет имя в IP-адрес преобразовывать?
32 isa2net
 
27.10.17
18:31
(31) 127.0.0.1
33 Mikhail Volkov
 
27.10.17
18:51
(32) Не, нужен IP-адрес того компа, к которому подключен ФР. Сейчас я знаю какой, но его могут на другой комп переставить...
34 NorthWind
 
27.10.17
23:24
(33) вообще говоря, имя в свойствах драйвера я прописывал и работало. По типу CAS-01:6220. Но я всё равно не понимаю, нафига вам это явно указывать, если у вас все это уже настроено в драйвере... По идее, вам в самом простом случае вообще достаточно тупо DeviceEnabled вызвать безо всяких приготовлений, потому как устройство у вас - одно и оно уже настроено под этим пользователем.
35 piter3
 
27.10.17
23:26
(34) ну хочет человек по хитрому,пусть попробует)
36 Mikhail Volkov
 
28.10.17
05:30
(34) В (15) подробно объяснял: борьба с ошибкой "Порт недоступен", чтобы лишний раз сервер не перезагружать. Полагаться на настройки под основного пользователя ФР нельзя (он может еще дома спит), приходится указывать настройки явно.
Согласен ФР.Password = 30; - лишнее, и прочие за комментированные строчки.
А имя компа в IP-адрес преобразовывать можно в самой функции пингования:

Функция PingIP_Адреса(IP_Адрес = "", ТекстСообщения = "") Экспорт

    Если ПустаяСтрока(IP_Адрес) Тогда
        Возврат Ложь;
    ИначеЕсли IP_Адрес = НРег(СокрЛП(ИмяКомпьютера())) Тогда
        Возврат Истина;
    КонецЕсли;
    objShell = Новый COMОбъект("WScript.Shell");
    objScriptExec = objShell.Exec("ping.exe -n 1 " + IP_Адрес);
    strPingResults = НРег(objScriptExec.StdOut.ReadAll());
    Результат = Найти(strPingResults, "ttl=") > 0;
    ТекстСообщения = ?(Результат, ТекстСообщения, ?(СтрЧислоВхождений(IP_Адрес, ".") >= 3, "IP-адрес", "Компьютер") + ": '" + ВРег(IP_Адрес) + "' - недоступен!");
    IP_Адрес = ?(СтрЧислоВхождений(IP_Адрес, ".") >= 3, IP_Адрес, Сред(strPingResults, Найти(strPingResults, "[") + 1, Найти(strPingResults, "]") - Найти(strPingResults, "[")));
    Возврат Результат;

КонецФункции // PingIP_Адреса()

Правда при этом черное окно мигает, убрать его можно?
37 NorthWind
 
29.10.17
14:24
(36) у меня есть скрипт на VBS, где пинг реализован средствами WMI. Могу дать. Правда, по общению с вами мне что-то кажется, что вы же все равно не будете переводить с VBS на 1С... Ниже скрипт.

Set WshShell = WScript.CreateObject("Wscript.Shell")
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set InFile = filesys.OpenTextFile("g:\spisok.txt", 1)

While Not InFile.AtEndOfStream

strHost = InFile.ReadLine
Set OutFile = filesys.OpenTextFile("g:\" & strHost & ".txt", 8, true)
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strHost & "'")
For Each objStatus in colPings
If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
OutFile.WriteLine strHost & vbTab & Time & vbTab & "недоступен"
Else
OutFile.WriteLine strHost & vbTab & Time & vbTab & "доступен"
End If
Next
OutFile.Close

WEnd

InFile.Close
38 Mikhail Volkov
 
29.10.17
14:36
(37) Готовый брал v8: Как средствами 1C проверить ping (Ping monitor)?, добавил преобразование имени в IP_Адрес:
IP_Адрес = ?(СтрЧислоВхождений(IP_Адрес, ".") >= 3, IP_Адрес, ?(Найти(strPingResults, "[") = 0, "", Сред(strPingResults, Найти(strPingResults, "[") + 1, Найти(strPingResults, "]") - Найти(strPingResults, "[") - 1)));
39 Mikhail Volkov
 
02.11.17
10:57
Функция ПроверкаСвязиФР() (31) создавалось лишь для проверки, что комп с ФР включен, и порт доступен, можно подключать ФР к 1С, и отбивать чеки на нем. Но возникла следующая ситуация: пользователь в ПКО ставит галку "Для пробития на фискальном регистраторе", сразу идет эта проверка - все ОК, открывается Фронт кассира, на нем жмет кнопку "Отбить чек", запускает функцию ВыполнитьКомандуОборудования(). И она выдает код ошибки: -11 "Устройство не включено"!? Как ошибка формируется посмотреть не могу, выдает Рарус_Компонента.ЗаказатьВыполнениеДействияСинхронно(). Решил для отладки перед этим свою ПроверкаСвязиФР() вставить. Она выдает "Порт занят" - это понятно, занят самим ФР.
А в функции ПроверкаСвязиФР() как-то можно определять кем занят порт: самим ФР или чем-то другим?
40 Mikhail Volkov
 
02.11.17
15:06
Сумбурно написал? Переписал свою функцию, чтобы состояние "Порт занят" как ошибку не выдавала:

Функция ПроверкаСвязиФР(IP_Адрес = "", ТекстСообщения = "", ПортЗанят = Истина) Экспорт

    Если ПустаяСтрока(IP_Адрес) Тогда
        ТекстСообщения = "Не указан IP-адрес ФР";
        Возврат Ложь;
    КонецЕсли;
    
    Попытка
        ФР = Новый("AddIn.FprnM45");
    Исключение
        ФР = ЗагрузитьВнешнююFPrnM1C(ТекстСообщения);
    КонецПопытки;
    Если СтрЧислоВхождений(IP_Адрес, ".") < 3
    И Не ДоступностьIP_Адреса(IP_Адрес, ТекстСообщения) Тогда
        Возврат Ложь;
    КонецЕсли;
    Если ФР = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
    ФР.АдресХоста = IP_Адрес + ":6220";
    ФР.DeviceEnabled = 1;    // занимаем порт
    Результат = ФР.ResultCode;
    Если Результат <> 0 И Не(ПортЗанят И Найти(ФР.ResultDescription, "Порт занят") > 0) Тогда
        ТекстСообщения = "Ошибка проверки связи с ФР: " + ФР.ResultDescription;
        Возврат Ложь;
    КонецЕсли;
    ФР.DeviceEnabled = 0;    // освобождаем порт
    Возврат Истина;

КонецФункции // ПроверкаСвязиФР()

да вот сомнения, что порт будет занят, но не ФР, а чем-то другим?
41 Сияющий в темноте
 
02.11.17
22:45
у раруса включение устройства,это действие меняющен состояние обьекта устройства и к самому устройству относится опосредовано
42 Mikhail Volkov
 
03.11.17
13:08
(41) > к самому устройству относится опосредовано
Как это понимать? Команду глТорговоеОборудование.ВключитьОборудование() выполняет, показывает статус Включено. А как чек отбить выдает код ошибки: -11 "Устройство не включено"!?
43 NorthWind
 
04.11.17
10:29
(42) а вы не хотите этот вопрос задать ТП раруса? Если у вас альфа - авто куплена, то чего вы мучаетесь? Это не ваша головная боль. Нехай апгрейд этого СЗУО дают, может есть версия без косяков.
44 Mikhail Volkov
 
04.11.17
11:44
(43) У них один ответ http://rarus.ru/forum/forum7/topic11558/message72783/ - переустановка СЗУО из того же дистрибутива. Сколько можно?
45 Mikhail Volkov
 
04.11.17
11:47
+ Похоже проблема админская 1С + АТОЛ 11Ф + ФФД 1.05
46 Mikhail Volkov
 
06.11.17
07:10
(42) В обработке ТорговоеОборудование функции ВключитьОборудование() есть такой фрагмент:

// Не то что включено, а даже еще и зарезервировано под текущую сессию - просто отлично!
//    Возврат НомОшибки; // Оборудование уже и так включено, возвращаем ОК (НомОшибки=0) вот и все.

Я конечно его за комментировал, но опасаюсь, что в СЗУО есть нечто подобное: где-то стоит признак, что ФР уже подключен, а он отвалился, в итоге подключения ФР не происходит. Думаю свое альтернативное подключение делать, в чем оно заключается?
Функция ПроверкаСвязиФР() (40) работает по принципу занимаем порт/освобождаем порт. А если не освобождать порт, то ФР останется подключенным, или нужны еще какие-то команды? Какие?
47 Mikhail Volkov
 
10.11.17
15:48
Сегодня выдало "ФР: Ошибка выполнения команды "ПробитьЧек" КодОшибки: -3 800 Описание: В ККМ нет денег для выплаты". Рарус-1С советуют: Отключите контроль наличных в настройках драйвера ККМ Атол. За более подробной информацией обращайтесь в Атол, например, http://forum.atol.ru/index.php?showtopic=30779
Подскажите, как отключить контроль наличных в 1С?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан