Имя: Пароль:
1C
1С v8
Самописный драйвер Native Api
0 MasterYoda
 
23.03.17
15:40
Вопрос следующий:
Пишу для себя самописный драйвер Native Api для работы с китайским принтером этикеток. Использую для этого всем известный пример с диска ИТС для ВК на С++.
В "Требования к разработке драйверов подключаемого оборудования (версия 2.1)" https://its.1c.ru/db/metod8dev#content:4829:hdoc
есть метод ПолучитьОписание(GetDescription) который при вызове должен вернуть 7 параметров с различными типами. Как обработать вызов данного метода в С++ чтоб он вернул эти 7 параметров. Кстати они имеют имена, которые, я так понял, в коде не используются (может ошибаюсь). Хотелось бы понять что необходимо передать в указатель pvarRetValue при вызове данного метода. Может у кого есть шаблон драйвера или фрагмент кода с обязательными методами, поделитесь пожалуйста.
Заранее благодарен за помощь
1 Кирпич
 
23.03.17
16:03
(0)  "что необходимо передать в указатель pvarRetValue" ну наверное True, если всё хорошо.
Ибо сказано: "Обеспечить возможность реализации функционала в полном объеме (должны быть реализованы и работать все методы) для подключаемого типа оборудования. Если оборудованием данная функция не поддерживается, должно возвращаться "False", а в описании ошибки, возвращаемом методом ПолучитьОшибку (GetLastError), содержится текст, что данная функция оборудованием не поддерживается. "
2 Garykom
 
гуру
23.03.17
16:12
там что используется любимая еще со времен 77 передача параметров по ссылке для заполнения?
3 Кирпич
 
23.03.17
16:14
(0) "Как обработать вызов данного метода в С++ чтоб он вернул эти 7 параметров."
ну тупо писать в переданные параметры то, что 1с требует.
4 Кирпич
 
23.03.17
16:15
(2) а при чем тут 77? это всегда использовалось везде и всегда будет использоваться.
5 Кирпич
 
23.03.17
16:18
(0) "Может у кого есть шаблон драйвера или фрагмент кода с обязательными методами, поделитесь пожалуйста." бери любой драйвер, вызывай у него эти самые обязательные функции и смотри, что он тебе возвращает.
6 Garykom
 
гуру
23.03.17
16:26
(4) А тупо вернуть составное значение/структуру никак да?
Зачем извраты с

Наименование = "";
Описание = "";
ТипОборудования = "";
...
Если ОбъектВК.ПолучитьОписание(Наименование, Описание, ТипОборудования, ...) Тогда...

Когда можно было

Результат = ОбъектВК.ПолучитьОписание();
Если Результат[0] Тогда
Наименование = Результат[1];
...

ну или как то так
7 Кирпич
 
23.03.17
16:31
(6) в NativeAPI структур нету. да и вариант со структурами ни чем не лучше, чем вариант с переменными.
8 Garykom
 
гуру
23.03.17
16:39
(7) Пофиг что нету, сериализация в string сейчас где угодно есть, это намного проще чем эти перечисления переменных.
И намного легче обеспечить совместимость при обновлениях.
9 Garykom
 
гуру
23.03.17
16:43
(0) <paParams> Тип: tVariant* Указатель на массив структур tVariant, содержащий значения параметров метода. Если метод не имеет параметров, то содержит NULL.
10 Кирпич
 
23.03.17
16:53
(8) "это намного проще чем эти перечисления переменных". афигенно проще. ты меня когда нибудь до инфаркта доведешь. я с тобой спорить не буду.
11 lock19
 
23.03.17
16:54
(8) "сериализация в string сейчас где угодно есть"
ascii string..
12 Garykom
 
гуру
23.03.17
16:54
(10) Ну для меня проще :)
Просто как подумаю что нужно передавать/заполнять неизвестное заранее число параметров...
13 Garykom
 
гуру
23.03.17
16:56
14 Кирпич
 
23.03.17
16:57
(12)было

Наименование = "";
Описание = "";
ТипОборудования = "";
ОбъектВК.ПолучитьОписание(Наименование, Описание,ТипОборудования)

стало

Описание = ""
ОбъектВК.ПолучитьОписание(Описание);
Наименование = "";
Описание = "";
ТипОборудования = "";
РазобратьJSON(Описание,Наименование, Описание,ТипОборудования);
15 lock19
 
23.03.17
16:57
(13) utf
16 Garykom
 
гуру
23.03.17
17:00
(14) нифига передача строки в готовую функцию же которая структуру вернет
17 Кирпич
 
23.03.17
17:00
+(14) плюс еще функция РазобратьJSON на две страницы. офигенное упрощение
18 Кирпич
 
23.03.17
17:01
(16) так структур нету. есть же строки, сам говорил.
19 Garykom
 
гуру
23.03.17
17:02
(17) ну с этой точки зрения да, согласен
20 Garykom
 
гуру
23.03.17
17:02
(18) разобратьjson сразу возвращает структуру и все подразумевал
21 Serginio1
 
23.03.17
17:06
(20) Надо использовать Ъ
22 Кирпич
 
23.03.17
17:06
(20) хрен редьки не слаще
23 Кирпич
 
23.03.17
17:06
(21) ты работу то нашел?
24 lock19
 
23.03.17
17:08
(20) Так ведь разобратьНаименованиеОписаниеТипОборудования тоже сразу вернёт структуру.
25 Garykom
 
гуру
23.03.17
17:08
(24) см (22) ))
26 lock19
 
23.03.17
17:08
(21) Лучше Ё
27 lock19
 
23.03.17
17:09
(25) нет накладных на де/сериализацию
28 Garykom
 
гуру
23.03.17
17:10
(27) угу и тут к нам пришел 54-ФЗ...
29 Кирпич
 
23.03.17
17:10
(25) 22 сантиметра?
30 Garykom
 
гуру
23.03.17
17:12
(28)+ с остоянным обновлением дров в виде native api, а так можно было бы только железо прошивку обновлять и легонько код в 1С и все, дрова прежние замечательно работали бы без обновлений
31 Кирпич
 
23.03.17
17:12
(27) не спорь с ним. он может сказать, что земля плоская и хрен ты его переспоришь.
32 Garykom
 
гуру
23.03.17
17:12
(30) *с постоянным
33 Serginio1
 
23.03.17
17:12
(23) Ищу.
(26) Я Ъ уже запантентовал
34 Garykom
 
гуру
23.03.17
17:13
(31) Не просто сказать, а аргументированно доказать! :)
35 Кирпич
 
23.03.17
17:13
(33) ты патентное бюро открыл что ли?
36 Кирпич
 
23.03.17
17:15
(34) ага. земля плоская, потому что мне так кажется. знаем мы твои аргументы.
37 Serginio1
 
23.03.17
17:15
(35) Нет я в статьях опубликовал, а значит имею авторские права. Шутка. Пользуйтесь на здоровье. Можно и Ё
38 lock19
 
23.03.17
17:17
(31) Ну, я так тоже умею)
39 MasterYoda
 
24.03.17
06:04
(9) paParams это входящте параметры для метода. Я не понимаю как на С++ записать в pvarRetValue эти семь параметров. Именно синтаксис. Хотелось бы взглянуть на пример, но их нет. Похоже должна вернуться структура. А как ее реализовать в tVariant не соображу. Именно в виде кода. Принцип то понятен. Пишешь то что надо, а как?
40 Кирпич
 
24.03.17
08:29
(39) в эти же  параметры и пиши, балда
41 Кирпич
 
24.03.17
08:30
В документации же написано out
42 MasterYoda
 
25.03.17
17:10
Еще вопрос. Скомпилировал компоненту которая на ИТС. при вызове ее с 1С она подключается и работает, но только с англоязычными методами. Пытаешься вызвать метод, например "Компонента.Включить()" вылетает ошибка не найден метод. А при отладке в VS в переданном значении (wsPropName) кракозябры как будто не совпадает кодировка. Соответственно из массива доступных методов на русском языке не возможно найти совпадения.
Кстати использую:
MS Visual Studio Community 2015
1С:Предприятие 8.3 (8.3.9.1850)
43 Garykom
 
гуру
25.03.17
18:13
(42) Открой для себя разные кодировки UTF8/CP1251 и как их перекодировать
44 MasterYoda
 
26.03.17
10:47
(43) Знаю я про кодировки. Но дело в том, что демо-компонента из ИТС, как заявляет 1с и прочие программеры, должна работать "из коробки". Т.е. вопрос разности кодировок и прочих типов решен в шаблоне и примере обработки изначально. Однако у меня не робит... Не могу врубиться куда копать. Теперь из 1с приходит нормальная строка вида:
wsPropName = 0x0000000005c2e5a8 L"Включен"
а в константе бардак:
g_PropNamesRu = 0x000007fedf994050 {0x000007fedf961f18 L"Включен", 0x000007fedf961f38 L"ЕстьТаймер"}
Мозг взрывается, и настройки проекта менял и платформы (32-, 64 бита). Не выходит каменный цветок. Помогите разобраться плиз...
45 Serginio1
 
26.03.17
11:00
А g_PropNamesRu какой тип имеет?
Используй wstring
46 lock19
 
26.03.17
11:16
В MS Visual Studio Community 2015 так же разумным было бы выбирать XP-совместимый тулчейн.
47 Кирпич
 
26.03.17
11:31
(44) может у тебя исходник в какой нибудь левой кодировке?
48 MasterYoda
 
26.03.17
12:16
(45) static const wchar_t *g_PropNamesRu[] = {L"Включен", L"ЕстьТаймер"};
(47) Исходники как есть с диска
(46) Попробовал v140_xp результат тот же.

Кто-нибудь собирал эту библиотеку?
49 Кирпич
 
26.03.17
12:20
(48) ну я собирал года 3 назад. у меня всё работало
50 Кирпич
 
26.03.17
12:46
скачал, попробовал. точно не работает. преобразовал текст в UTF-8 и заработало. раньше было в UTF-8 без BOM
51 Кирпич
 
26.03.17
12:54
+(50) для автора: преобразовал файл AddInNative.cpp
52 MasterYoda
 
26.03.17
15:01
(51) Помогло. Спасибо. Неочевидное для меня решение)))
53 Garykom
 
гуру
26.03.17
15:28
(52) Кста вместо того чтобы убить кучу времени на разбор/изучение как писать нативные ВК под 1С, можно же просто взять готовую нативную ВК от Serginio1 и заюзать силу "Ъ".

100% под китайский термопринтер есть примеры на C#
54 Кирпич
 
26.03.17
15:36
(53) "убить кучу времени на разбор/изучение как писать нативные ВК под 1С" - повысится ЧСВ и в резюме напишет С++, "заюзать силу 'Ъ'" - ничего не повысится нигде, да и еще будут смотреть как на дебила, если кому рассказать.
55 MasterYoda
 
26.03.17
17:13
(54) Резюме у меня нет, я не программист-профессионал, у меня даже образование юридическое, но могу писать программы по собственным ТЗ. Пишу для себя, так сказать, для общего развития. Программировать начал в 7 лет на РК-86(если кто вообще сейчас знает что это) на чистом BASIC, с тех пор только самообучение, помощь подобных форумов, но чем дальше тем менее отзывчив народ становится, ерничают. Вообще я не писатель, я более читатель, вопросы задаю мало, когда мозг совсем взрывается.
56 MasterYoda
 
26.03.17
17:21
(53) Принтер у меня и так работает как Win-принтер, но хотелось бы использовать потенциал заложенный в него китайцами.
Если я отнимаю Ваше драгоценное время, извините. А вообще, огромное спасибо за Вашу помощь, реально помогли
57 Serginio1
 
27.03.17
11:30
(54) Ну на меня как на дебила не смотрят, только удивляются.
(55) Почитай для интереса
Использование классов .Net в 1С для новичков
58 MasterYoda
 
31.03.17
14:36
(57) Спасибо за доп информацию. Я раньше писал с использованием .Net, ща хочется что-то посвободнее(универсальнее).
Кстати я уже написал полностью взаимодействие с 1с (подключается по стандарту 1С:Совместимо) за исключением возврата ошибок. Т.к. еще не работал над исключениями и толком функционал dll-ки не написал. Но "типа" фискальная память с сохранением в файле уже робит.
Еще раз спасибо за помощь. Я с начала думал, что возвращаемые данные надо как-то структурировать и записать в paParams, оказалось все проще.