Имя: Пароль:
1C
1C 7.7
v7: Представление булева в 7.7...
0 MWWRuza
 
гуру
15.10.18
13:26
Добрый день!

Есть некий драйвер, по технологии "COM", естественно разрабатывался изначально под снеговика, с учетом "Требования к разработке драйверов подключаемого оборудования. Версия 2.4", но и под клюшками работает. В принципе, все более-менее нормально, но есть одно НО!
По требованиям к разработке, "Тип возвращаемого значения" - "BOOL".
Под восьмеркой, так и возвращает:
https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-244.jpg
А вот под 7.7, логично было-бы предположить, что должен возвращать 1/0... А вот фиг там:
https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-243.jpg
Какое-то непонятное число... Почему? Косяк в написании драйвера, или я что-то не так делаю? Если я, то как правильно интерпретировать в 7.7 результат выполнения метода?
1 MWWRuza
 
гуру
15.10.18
13:30
В дополнение - под 7.7 драйвер отрабатывает метод "ЗакрытьСмену", смена в ККТ закрывается, Z-отчет печатается, все нормально... Только с возвращаемым значением непонятка...
2 big
 
15.10.18
13:38
А что говорит ТипЗначенияСтр(ВыхПар)?  А если сделать Число(ВыхПар) - что покажет?

ЕМНИП при работе из 7-ки с СОМ ложь это 0, а истина -1
3 ADirks
 
15.10.18
13:39
(0) в спецификации COM
True == -1
False == любое другое значение (но обычно 0)
4 MWWRuza
 
гуру
15.10.18
14:03
(2) Сейчас попробую, но, то, что значение без кавычек, наводит на мысль, что это и так число...

(3) Это понятно... Но, тут то не так...

Да, в дополнение - если принудительно внести в исполнение метода ошибку, например передать пустой первый параметр, то метод не исполняется и возвращается: Результат = 1179648...
Бред какой-то. Конечно, если бы быть уверенным, что так будет всегда, то написать функцию преобразования этих непонятных чисел в 1/0 две секунды, три строчки. Но, где гарантия, что это не абстрактные, случайные числа? Может они от чего-то зависят, и сейчас такие а вдругой момент будут другие? Как узнать?
5 MWWRuza
 
гуру
15.10.18
14:09
(2) Вот:
ТипЗначенияСтр(Результат) = "Число"
Число(Результат) = 1179648

Результат в данном случае "Ложь", так, как смена уже открыта, но, это в принципе без разницы.
6 MWWRuza
 
гуру
15.10.18
14:19
(2) ВыхПар - в данном примере это строка, она результат исполнения другого метода: Spark.ПолучитьОшибку(ВыхПар); Из описания технологии: "Возвращает код и описание последней произошедшей ошибки." Тут все правильно работает.
Нас интересует другая переменная - "Результат".
7 АЛьФ
 
15.10.18
14:31
1179648 = 0х00120000
Явно какая-то константа возвращается.
8 ADirks
 
15.10.18
14:35
(+7) Причём, ребята похоже решили таким образом двух зайцев убить. Типа, и False, и код ошибки заодно.
А может, случайно получилось :)
9 MWWRuza
 
гуру
15.10.18
14:43
(8) Скорее всего случайно. На код ошибки не похоже. Одинаковая фигня возвращается, когда принудительно ошибку вношу, передав пустой первый параметр, и когда ошибка возникает потому, что "смена уже открыта".
Ну да хрен с ней, с "False" имеет право на жизнь, по спецификации - "любое другое значение".
Но, вот с "True" хуже... Должно быть -1 или 1, но ни как ни эта абракадабра - 1245183...
10 Cool_Profi
 
15.10.18
14:49
ложь - 0, не ложь (ака истина) не 0.
В чём проблема?
11 ADirks
 
15.10.18
14:54
хм...
похоже, что всё-же какое-то -1, но не врублюсь как

1245183 == 0x12FFFF
(unsigned short)(-1) == 0xFFFF
шо за 0x12 не догоняю
12 MWWRuza
 
гуру
15.10.18
14:56
(10) Да был бы там 0, не было бы проблем. А там почему-то 1179648. И не факт, что всегда, когда должен быть 0, там именно эта комбинация чисел будет :-(
13 Cool_Profi
 
15.10.18
15:01
(12) Там 0? Нет. Так тебе ещё чего надо?
14 trad
 
15.10.18
15:10
1245183 == 0x12FFFF
1179648 == 0x120000
это VARIANT, где
0x12 - VT_TYPE = VT_UI2
0xFFFF и 0x0000 - собственно сам UI2, который в свою очередь соответствует TRUE и FALSE
15 MWWRuza
 
гуру
15.10.18
15:42
(13) Так там никогда не бывает 0. Даже, когда метод не отработал.

(14) А вот это, очень похоже на правду... Значит, можно считать, что 1245183 это 1, а 1179648 это 0. Тогда, все становится на свои места.
16 MWWRuza
 
гуру
15.10.18
16:49
В общем, как я понял из общения с разработчиком драйвера, в зависимости от того, из какой версии 1С он используется, надо по разному возврат значения делать. Для восьмерки возвращать булево, а для 7.7 число 1/0. Только как из драйвера можно определить, из какой 1С его вызвали? Есть какие-то методы? Драйвер на C++ написан... Кто-нибудь сталкивался с такой задачей?
17 MWWRuza
 
гуру
15.10.18
19:49
Всем спасибо!
Вопрос решен. Разработчик исправил что-то в драйвере, теперь в 7.7 возвращает -1/0, в восьмерке, как и было, булево. Главное - понять, в чем дело, остальное - дело техники :-)
18 Kigo_Kigo
 
15.10.18
21:27
часто замечаю, походу разрабы симофорят наш форум :)
19 MWWRuza
 
гуру
16.10.18
10:46
(18) Ну, не знаю... Наверняка. И это правильно.
Но, в данном случае, я ему сам ссылку на эту ветку форума дал. В моих интересах, что-бы драйвер работал нормально в том числе и под клюшками. У меня на 7.7 с такими кассами пока еще клиентов много.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший