Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) OleExSup.dll - двумерный массив для Индикатора клиента (число прочтений - 14845 )
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
OleExSup.dll - двумерный массив для Индикатора клиента
05. Августа 2011 :: 20:37
Печать  
Доброго времени суток, есть задача подрубить к 1с 7.7 индикатор клиента LPOS-II-VFD USB, есть штатная обработка на 1с8, работает замечательно, но мне, повторюсь нужно привязать на 1с7. Итак что мы имеем, получается подключиться к индикатору клиента, но при передаче строк на него есть проблема, в 1с8 используется двумерный массив
Код
Выбрать все
МассивСтрок = Новый Массив();
	МассивСтрок.Добавить(Новый Структура("Текст, БегущаяСтрока", Стр1, ТаблицаСтрок[0].БегущаяСтрока));
	МассивСтрок.Добавить(Новый Структура("Текст, БегущаяСтрока", Стр2, ТаблицаСтрок[1].БегущаяСтрока));
//далее мы пихаем это все в индикатор
Ответ = Объект.Драйвер.ВывестиСтрокуНаДисплейПокупателя(Объект.ИДУстройства, МассивСтрок); 


Тут вопросов нет
Нашел компоненту для 1с7 для создания массивов, но походу  массив нельзя/или не знаю как, впихнуть структуру или в данном случае списокЗначений для 1с7
максимум до чего дошел вот этот код
Код
Выбрать все
		    БегущаяСтрока="Истина";
	ТекстСтр1="Тест1";
	ТекстСтр2="Тест2";

	Стр1 = СоздатьОбъект("СписокЗначений");
	Стр1.ДобавитьЗначение(ТекстСтр1,"Текст");
	Стр1.ДобавитьЗначение(БегущаяСтрока,"БегущаяСтрока");

	Стр2 = СоздатьОбъект("СписокЗначений");
	Стр2.ДобавитьЗначение(ТекстСтр2,"Текст");
	Стр2.ДобавитьЗначение(БегущаяСтрока,"БегущаяСтрока");

	Измерение=2;
	Индексы=1;
 	  Массив= СоздатьОбъект("OLESafeArray");
	Массив.Создать(Массив.VarTypes.VT_VARIANT, Измерение, Индексы);
	Массив.УстановитьЗначение(0, 0, Стр1);
	Массив.УстановитьЗначение(1, 0, Стр2);

 


Но кроме того что 1с-ка тупо вылетает без ошибки ничего не выходит, плюс не знаю как правильно его передать потом в метод Объект.Драйвер.ВывестиСтрокуНаДисплейПокупателя(Объект.ИДУстройства, МассивСтрок) как в 1с8
В данном случае передать просто в метод "Массив" ник чему не приводит
Кто чем может помочь, буду очень рад, уже 2 дня ладу дать не могу Печаль((

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #1 - 06. Августа 2011 :: 04:46
Печать  
1. в восмерочном примере у тебя создается не двумерный массив, а одномерный с двумя элементами типа Структура.
аналогичный код для 7:
Массив= СоздатьОбъект("OLESafeArray");
Массив.Создать(Массив.VarTypes.VT_VARIANT, 2);
Массив.УстановитьЗначение(0, Элемент1);
Массив.УстановитьЗначение(1, Элемент2);

Но в коде для 8 применена Структура. В общем случае в 7 нет аналога структуре. Подойдет ли одноименный объект из 1с++ я не знаю.

2. если все таки допускается разложить структуру во второе измерение, то код будет таким:
Массив= СоздатьОбъект("OLESafeArray");
Массив.Создать(Массив.VarTypes.VT_VARIANT, 2, 2);//2 и 2 - размерность первого и второго измерения соответственно
Массив.УстановитьЗначение(0, 0, ТекстСтр1);
Массив.УстановитьЗначение(0, 1, БегущаяСтрока);
Массив.УстановитьЗначение(1, 0, ТекстСтр2);
Массив.УстановитьЗначение(1, 1, БегущаяСтрока);


3.
Вызов метода с передачей массива делается так:
OLEExSup = СоздатьОбъект("OLEExSup");
OLEExSup.ВызватьОЛЕМетод(Объект.Драйвер, "ВывестиСтрокуНаДисплейПокупателя", Объект.ИДУстройства, МассивСтрок);



ps
а вообще не плохо было бы посмотреть техническое описание метода ВывестиСтрокуНаДисплейПокупателя
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #2 - 06. Августа 2011 :: 10:31
Печать  
спасибо, в следующем будут ссылки
  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #3 - 06. Августа 2011 :: 10:31
Печать  
второй вариант вроде пробовал, но не знал как его вывести правильно на дисплей, сейчас еще раз попробую, спасибо,
а на счет тех описания, к сожалению все очень скудно, к этой библиотеке я не нашел подходящего описания, все что есть
тут и тут, там есть еещ вторая библиотека lpos_vfd_lcd.dll - ее использовать не удалось да и описания под нее для 1с нет, есть только под С и делфи, под 1с только lpos_usb_vfd


===== Добавлено

Попробовал Ваш код, вышел вот так:
Код
Выбрать все
    БегущаяСтрока="1";  
	НеБегущаяСтрока="0";
	ТекстСтр1="Тест1";
	ТекстСтр2="Тест2";

	Измерение=2;
	Индексы=2;
    Массив= СоздатьОбъект("OLESafeArray");
	Массив.Создать(Массив.VarTypes.VT_VARIANT , Измерение, Индексы);
	Массив.УстановитьЗначение(0, 0, ТекстСтр1);
	Массив.УстановитьЗначение(0, 1, БегущаяСтрока);    
	Массив.УстановитьЗначение(1, 0, ТекстСтр2);
	Массив.УстановитьЗначение(1, 1, НеБегущаяСтрока);    

	OLEExSup = СоздатьОбъект("OLEExSUP");
	//Передаем массив в метод объекта
	Ответ = OLEExSup.ВызватьОЛЕМетод(Драйвер, "ВывестиСтрокуНаДисплейПокупателя", "1", Массив); 



Но к сожаление 1с-ка ответила вот этим
Код
Выбрать все
Ответ = OLEExSup.ВызватьОЛЕМетод(Драйвер, "ВывестиСтрокуНаДисплейПокупателя", "1", Массив);
{C:\DOCUMENTS AND SETTINGS\ADMINISTRATOR\РАБОЧИЙ СТОЛ\POSUA\ИНДИКАТОРКЛИЕНТА.ERT(96)}: Недопустимый объект 


Под драйвером у меня идет как и в 1с8
ПодключитьВнешнююКомпоненту("Addin.lpos_usb_vfd")
Драйвер=СоздатьОбъект("AddIn.lpos_usb_vfd_extension")

Если поможет то вот тут обработки и билиотеки
а вот тут есть описание, которое прилагается на сайте вендора


Помогите кто чем может


Рассматриваю вариант, переноса 1с7-самописной на 1с8.1 или 8.2, если есть возможность автоматизировать данный вопрос, то пожалуйста поделитесь опытом, всем спасибо заранее
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #4 - 06. Августа 2011 :: 14:52
Печать  
попробуй в качестве элемента массива применить Структуру из 1с++

Стр1=создатьОбъект("Структуру");
Стр1.Вставить("Текст",ТекстСтр1);
Стр1.Вставить("БегущаяСтрока", 1);

Стр2=создатьОбъект("Структуру");
Стр2.Вставить("Текст",ТекстСтр2);
Стр2.Вставить("БегущаяСтрока", 1);

Массив= СоздатьОбъект("OLESafeArray");
Массив.Создать(Массив.VarTypes.VT_VARIANT, 2);
Массив.УстановитьЗначение(0, Стр1);
Массив.УстановитьЗначение(1, Стр2);

OLEExSup.ВызватьОЛЕМетод(Драйвер, "ВывестиСтрокуНаДисплейПокупателя", "1", Массив)
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #5 - 06. Августа 2011 :: 17:17
Печать  
на выводе опять недопустымый объект, значит я обречен?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #6 - 07. Августа 2011 :: 07:51
Печать  
AddIn.lpos_usb_vfd_extension - это объект регистрируемый внешней компонентой. Этот объект скорей всего заточен под 8 и видимо может работать только с восмерошными массивом и структурой.
Есть некий ole-объект AddIn.lpos_usb_vfd, но интерфейс его не известен и вскрыть его у меня не получилось.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #7 - 07. Августа 2011 :: 08:21
Печать  
можно еще попытаться поработать напрямую с LPOS_VFD_LCD.dll вызывая WINAPI функции посредством вреппера
http://forum.script-coding.com/viewtopic.php?id=5341
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #8 - 07. Августа 2011 :: 08:48
Печать  
Не знаком с такими дебрями, но я так понял вызвать метод можно вот так?
Код
Выбрать все
    Скрипт=СоздатьОбъект("DynamicWrapperX");
	Скрипт.Register("LPOS_VFD_LCD.dll", "ВывестиСтрокуНаДисплейПокупателя", "1", Массив);
	res = Скрипт.ВывестиСтрокуНаДисплейПокупателя("1",Массив);	  // ?????.
 




Только с другими методами


Только что нашел описание метода вывестиСтрокуНаДисплейПокупателя
Там типа массива стоит IDispatch [IN] это о чем говорит?


Пробовал создать такое
Код
Выбрать все
	Скрипт=СоздатьОбъект("DynamicWrapperX");
	Скрипт.Register("LPOS_VFD_LCD.dll", "Send_Str", "i=s","r=s");
	Ответ = Скрипт.Send_Str(ТекстСтр1,0,20);
 


Не понял что впихивать в параметры функции, что не пихаю матюкается на неизвестную ошибку или неверный тип данных
Как работать с такими костылями?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #9 - 07. Августа 2011 :: 13:44
Печать  
исходя из описания LPOS_VFD_LCD.dll
функция объявлена так:
long WINAPI send_str (void* str, char row, len);
как мне кажется ее регистрировать нужно так:
Скрипт.Register("LPOS_VFD_LCD.dll", "send_str", "i=pcc","r=l");
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #10 - 07. Августа 2011 :: 13:54
Печать  
не понял зачем передаются такие параметры, но в любом случае драйвер выдал такуюже ошибку на этой строк "неизвестная ошибка"
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #11 - 07. Августа 2011 :: 18:50
Печать  
Вот такая конструкция работает без ошибок?

Код
Выбрать все
Процедура Сформировать()
	Wrap = СоздатьОбъект("DynamicWrapperX");
	Wrap.Register("c:\Temp\LPOS_VFD_LCD.dll", "send_str", "i=sll", "r=l");
	Сообщить(Wrap.send_str("zzzzzz", 0, 3));
КонецПроцедуры 

  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #12 - 07. Августа 2011 :: 19:07
Печать  
Неизвестная ошибка на строке Wrap.Register("c:\Temp\LPOS_VFD_LCD.dll", "send_str", "i=sll", "r=l");
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #13 - 07. Августа 2011 :: 19:18
Печать  
dll в c:\Temp ?
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #14 - 07. Августа 2011 :: 19:25
Печать  
да
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #15 - 08. Августа 2011 :: 04:19
Печать  
Здесь ссылка ничего интересного нет?
  
Наверх
ICQ  
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #16 - 08. Августа 2011 :: 06:05
Печать  
Увы, это был первый сайт к которому я обратился
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #17 - 08. Августа 2011 :: 06:14
Печать  
madvovik писал(а) 07. Августа 2011 :: 19:07:
Неизвестная ошибка на строке Wrap.Register("c:\Temp\LPOS_VFD_LCD.dll", "send_str", "i=sll", "r=l");


Должен работать и на 7.7 и на 8.2.
Ты на обычном компе запускаешь?
  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #18 - 08. Августа 2011 :: 06:18
Печать  
да, win xp sp3 x86
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #19 - 13. Августа 2011 :: 12:03
Печать  
Привет, ты еще не отказался от идеи подрубить компоненту к 7.7?
Попробую посмотреть на след. неделе.
  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #20 - 13. Августа 2011 :: 12:06
Печать  
Я уже всерьез подумываю о переходе на 8.2 но если ты меня выручишь буду очень благодарен
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #21 - 13. Августа 2011 :: 13:57
Печать  
madvovik писал(а) 13. Августа 2011 :: 12:06:
Я уже всерьез подумываю о переходе на 8.2 но если ты меня выручишь буду очень благодарен


Честно говоря, меня удивляет, что для передачи каких-то 2х строк, авторы компоненты используют такую сложную конструкцию - массив и в добавок еще структуру.
  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #22 - 13. Августа 2011 :: 14:17
Печать  
И не говори, я когда увидел ее мне аж жутко стало, так сказать чем больше костылей тем мы модней
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #23 - 15. Августа 2011 :: 14:45
Печать  
Попробуй следующую конструкцию.

Во вложении класс Test и тестовая обработка...
Последовательность действий:
1) Установи класс
2) Открой обработку, нажми сначала "Сформировать", потом "Сформировать 1", будут выдаваться MessageBox'ы....если вылетит, напиши, на каком из них.

В обработке поправь пути до компоненты.
Напиши, что-как.
  

test_lpos.ZIP ( 3 KB | Загрузки )
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #24 - 16. Августа 2011 :: 06:45
Печать  
ОФФ:

Вдруг кому-то пригодиться...

Пока разбирался с это проблемой, параллельно "понял", как в скрипт передать любой 1С-й объект.
Давно уже сделал небольшой скрипт, который позволяет получить указатель на CBLContext, просто число. Имея этот адрес передаем его в скрипт, а там оборачиваем в CBLExportContext и восстанавливаем, как объект. Далее работаем через "точку".

  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #25 - 16. Августа 2011 :: 06:50
Печать  
chessman писал(а) 16. Августа 2011 :: 06:45:
Далее работаем через "точку".
Сумничал, да? А пример кода?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #26 - 16. Августа 2011 :: 07:33
Печать  
Dmitry The Wing писал(а) 16. Августа 2011 :: 06:50:
chessman писал(а) 16. Августа 2011 :: 06:45:
Далее работаем через "точку".
Сумничал, да? А пример кода?


Ну, почему сразу, сумничал... Печаль
Кусок кода из скрипта...

Код
Выбрать все
Sub Test(pCBLContext)
	this_call pObj,	Addr
	res = Wrap.CBLExportContext(pCBLContext)
	Set Obj1C = Wrap.GetObject(pObj)

	Obj1C.SelectItems
	Do While Obj1C.GetItem >0
		Mes.Message Obj1C.GetAttrib(""ИНН"")
	Loop
End Sub
 

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #27 - 16. Августа 2011 :: 08:30
Печать  
Цитата:
Obj1C.GetAttrib(""ИНН"")
это разве через точку Озадачен

через точку это Obj1C.ИНН  Подмигивание
  

1&&2&&3
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #28 - 16. Августа 2011 :: 08:37
Печать  
Еще вариант Улыбка

Код
Выбрать все
	|Sub Test(pCBLContext)
	|	this_call pObj,	Addr
	|	res = Wrap.CBLExportContext(pCBLContext)
	|	Set Obj1C = Wrap.GetObject(pObj)
	|
	|	txtQuery = ""SELECT $Спр.ВидКонтрагента [Вид $Перечисление.ВидыКонтрагентов]	FROM $Справочник.Контрагенты Спр (NOLOCK) ""
	|
	|	Set valTab = Obj1C.ExecuteStatement(txtQuery)
	|	valTab.ChooseLine
	|End Sub
 



Да, с русским там проблема Улыбка
  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #29 - 28. Августа 2011 :: 13:12
Печать  
Извиняюсь был в отпуске, завтра попробую отпишусь, спасибо
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать