• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Тсд Cipher 8000 С Драйвером Scancode И 1с Тис 7.70.921.

  • Автор темы dimi3o
  • Дата начала
D

dimi3o

Всем привет!
Пытаюсь запустить работу ТСД CipherLab 8000-C на предприятии с 1С 7.7 ТиС 9.2 (7.70.921), который забросили в черный угол 8 лет назад. Использую прошивку Scancode.
Поставил ядро: K8000V334. Прошивку: U8000241-IG09. Задачу: 1c_8000 (от 12.08.2009). В задачу никаких изменений не вносил, просто загрузил и всё. Далее в 1С подключаю драйвер версии 6.0.4.0(Scancode). Тут все успешно (При включении 1С одинарный звуковой сигнал от ТСД). В настройках все параметры и порты верные.
Но при нажатии кнопки "Выгрузить в ТСД Cipher" в "Справочники.Номенклатура" вылезает следующая ошибка:

Документ = Форма.Параметр.Получить("Контекст");
{\EXTFORMS\PRNFORMS\CIPHERLAB.ERT(13)}: Поле агрегатного объекта не обнаружено (Получить)


Пробовал даже совсем старую версию драйвера Scancode для 1С от 2004 года. Там форма открывается и даже идет обработка ровно до момента передачи в ТСД, где выдает ошибку: "Терминал сбора данных: ошибка при выгрузке в базу Невозможно перевести терминал в режим загрузки!".

Если ввести штрих-код из нашей базы вручную в ТСД при вводе количества и потом заполнить реализацию, то всё без проблем передается и товар находит! Полдела уже есть и очень хотелось бы решить проблему с выгрузкой БД в ТСД.

Где то вычитал, что это проблема совместимости версий ТиС, типа редакция 7.70.921 не работает с драйвером последней версии Scancode.ru. Там вроде тестировалось все на 7.70.924 или 7.70.925. Но сейчас база уже работает и все переустановить проблемно. Может кто знает что нужно исправить в коде?

Нарыл, что объект "параметры" не является списком значений в модуле Номенклатура:

Код:
Процедура ПоКнопкеПечать()

Если ПустоеЗначение(НомерТекущейФормы) = 1 Тогда
НомерТекущейФормы = 1;
КонецЕсли;

Если НомерТекущейФормы = 1 Тогда
// ЭТИКЕТКА

ПечатьЭтикетки();
ИначеЕсли НомерТекущейФормы = 2 Тогда
// ЦЕННИК

ПечатьЦенника();
Иначе
// внешняя обработка

Параметры = глВзятьКонтекст(Контекст);  
ОткрытьФорму("Отчет", Параметры, глКаталогПечФорм + ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы,"Файл"));
КонецЕсли;

КонецПроцедуры // ПоКнопкеПечать()


Исправил:
Код:
Параметры = глВзятьКонтекст(Контекст);  
на
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(глВзятьКонтекст(Контекст), "Контекст");

Но появилась новая ошибка:
Документ.ВыбратьСтроки();
{EXTFORMS\PRNFORMS\CIPHERLAB.ERT(15)}: Поле агрегатного объекта не обнаружено (ВыбратьСтроки)


Вот код "CIPHERLAB.ERT" в \PRNFORMS\:

Код:
Процедура ПриОткрытии()
Перем Данные;

Параметры = СоздатьОбъект("СписокЗначений");
Параметры.Установить("Процесс", "выгрузить");
Параметры.Установить("Объект" , глТерминал);

Документ = Форма.Параметр.Получить("Контекст");
Если ПустоеЗначение(Документ) = 0 Тогда
Документ.ВыбратьСтроки();
Данные = СоздатьОбъект("ТаблицаЗначений"); 
Данные.НоваяКолонка("ШтрихКод");
Данные.НоваяКолонка("Номенклатура");
Данные.НоваяКолонка("Цена");
Данные.НоваяКолонка("Количество");

Пока Документ.ПолучитьСтроку() = 1 Цикл
Баркод = Документ.Номенклатура.БазоваяЕдиница.Штрихкод;
Если ПустоеЗначение(Баркод) = 1 Тогда
Сообщить("Для " + Документ.Номенклатура.Наименование + " нет штрихкода - не выгружаем");
Продолжить;
КонецЕсли;

Данные.НоваяСтрока();
Данные.ШтрихКод = Баркод;
Данные.Номенклатура = Документ.Номенклатура.Наименование;
Данные.Цена = Документ.Цена;
Данные.Количество = Документ.Количество;

//Если ПроверитьШтрихкод(Форма.Штрихкод) = 0 Тогда

//	Сообщить("У товара """ + Форма.Наименование + """ штрихкод не задан или имеет неверный формат!");

//Иначе

//		

//

//КонецЕсли;

КонецЦикла;	
Параметры.Установить("Данные" , Данные);
Иначе
Параметры.Установить("Данные" , "");
КонецЕсли;
//ааа = Форма.Параметр.Получить("Контекст");


РезТекст = глОборудованиеКоманда("Терминал", глТерминалОбработка, Параметры);
Если ПустоеЗначение(РезТекст) = 0 Тогда
Сообщить(РезТекст);
Иначе
Если Параметры.Получить("Результат") = 0 Тогда
Сообщить("Терминал сбора данных: ошибка при выгрузке в базу");
Сообщить(Параметры.Получить("ОписаниеРезультата"));
КонецЕсли;
КонецЕсли;

// закрываем фому

СтатусВозврата(0);

КонецПроцедуры // ПриОткрытии


Заранее спасибо за помощь!
 
Д

Дайнеко

* Ошибка не CIPHERLAB.ERT а в головном модуле, а именно какие параметры он дает.
* Судя по смыслу, надо передать документ, но почему-то вложить его в СписокЗначений (может раньше список был большой)
* Так и дайте текущий документ. Аллах его ведает, что еще делает ф-ия глВзятьКонтекст()! В урну ее!
Код:
Параметры.ДобавитьЗначение(Контекст, "Контекст");
 
D

dimi3o

* Ошибка не CIPHERLAB.ERT а в головном модуле, а именно какие параметры он дает.
* Судя по смыслу, надо передать документ, но почему-то вложить его в СписокЗначений (может раньше список был большой)
* Так и дайте текущий документ. Аллах его ведает, что еще делает ф-ия глВзятьКонтекст()! В урну ее!
Код:
Параметры.ДобавитьЗначение(Контекст, "Контекст");

Ну вообще я так и сделал. Даже если написать:

Код:
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(Контекст, "Контекст");

вместо моего варианта:

Код:
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(глВзятьКонтекст(Контекст), "Контекст");

чем, в свою очередь, я заменил строку в процедуре ПоКнопкеПечать():

Код:
Параметры = глВзятьКонтекст(Контекст);

результат получаем один и тот же:

Документ.ВыбратьСтроки();
{K:\ARHIV\ТОРГОВЫЕ\1C\РАБОЧАЯ_РАЗВ(ТА06.01.13)\EXTFORMS\PRNFORMS\CIPHERLAB.ERT(15)}: Поле агрегатного объекта не обнаружено (ВыбратьСтроки)
 
Д

Дайнеко

А стажи- ка, мил человек! Этот чертов Контекст является документом?
Процедура ПоКнопкеПечать() находтся в документе?


И не надо метаться.
В обработке стоит:
Код:
Документ = Форма.Параметр.Получить("Контекст");
Документ.ВыбратьСтроки()
Значит ей передается именно документ. Варианта всего 2:

Код:
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(Контекст, "Контекст");
ИЛИ
Код:
Параметры.ДобавитьЗначение(ТекщийДокумент(), "Контекст");


При условии, что вызов иди от документа!!!
А еще написать перед:
Сообщить(ТипЗначенияСтр(Документ));
Документ.ВыбратьСтроки()
 
D

dimi3o

Выгрузка в ТСД - это принтформа, которая вызывается в "ФормаСписок" номенклатуры. Ну это та форма, которая появляется при нажатии кнопочки "номенклатура". Там такая стрелочка внизу со списком принтформ - что распечатать. Ну разработчики ПО Scancode туда закинулы свою принтформу "Выгрузка в ТСД", чтобы передавать всю номенклатуру или её группу в ТСД.
Замечу, что раньше в их драйвере код принтформы выглядел следующим образом:
Код:
Процедура ПриОткрытии()
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.Установить("Процесс", "выгрузить");
Параметры.Установить("Объект" , глТерминал);
//Параметры.Установить("Данные" , Данные);
РезТекст = глОборудованиеКоманда("Терминал", глТерминалОбработка, Параметры);
Если ПустоеЗначение(РезТекст) = 0 Тогда
Сообщить(РезТекст);
Иначе
Если Параметры.Получить("Результат") = 0 Тогда
Сообщить("Терминал сбора данных: ошибка при выгрузке в базу");
Сообщить(Параметры.Получить("ОписаниеРезультата"));
КонецЕсли;
КонецЕсли;

// закрываем фому
СтатусВозврата(0);
КонецПроцедуры // ПриОткрытии
Тут нет никакого документа и ВыбратьСтроки(). Выгрузка в ТСД проходит, но я очень сомневаюсь в правильности работы процедуры. Не зря же всё-таки люди добавили эти 20 строк кода, спустя 6 лет.

ГрупповойКонтекст - вот, что возвращает Сообщить(ТипЗначенияСтр(Документ));

Вот картинка формы-списка номенклатуры с кнопкой "Выгрузить в ТСД" с рабочего стола:
1.jpg
 
D

dimi3o

Решение оказалось следующим. Заменить это:

Код:
Параметры = глВзятьКонтекст(Контекст);

на это:

Код:
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(ТекущийЭлемент(), "Номенклатура");

в основном модуле номенклатуры "ФормаСписок".
Спасибо за помощь, Дайнеко!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!