Как передаются параметры в внешнюю компоненту 1С Native

1. greenif 26.01.19 18:44 Сейчас в теме
Есть внешняя компонента 1С Native для работы с фискальными регистраторами.

Отвечаем требованиям
Требования к разработке драйверов для фискальных регистраторов

У компоненты есть параметры настройки, как сказано
ТаблицаПараметров (TableParameters)

В таблице 5 параметров:
IP, Password, Username, LogLevel, DefaultTaxGroup

Они все корректно отображаются в форме настроек компоненты.
Вопрос как значения этих настроек получить назад в компоненте?

При запуске вызывается метод
MethSetParameter(tVariant* pvarRetValue, tVariant* paParams)

Но в него передается только один параметр:
EquipmentType = ФискальныйРегистратор

Остальные параметры не передаются, подскажите пожалуйста как их получить в компоненте?
По теме из базы знаний
Найденные решения
11. greenif 31.01.19 06:31 Сейчас в теме
Все заработало, сложно сказать почему, но кажется из-за того, что один из параметров не был зарегистрирован в
static const wchar_t *g_PropNames[] = { L"Version",L"Name",L"Description",L"EquipmentType",L"InterfaceRevision"....}


И получается перечисление enum Props было длиннее чем выше указанный массив.

P.S. Хоть я и не уверен что проблема была именно в этом.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 26.01.19 23:44 Сейчас в теме
(1) устанавливать нужно каждый параметр по отдельности.
По приведенной ссылке:
Использование оборудования пользователем в процессе работы
Инициализация устройства сохраненными в базе параметрами методом «УстановитьПараметр(SetParameter)».

В 1С:
Функция ПодключитьУстройство(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры) Экспорт
...
	Для Каждого Параметр Из Параметры Цикл
		Если Лев(Параметр.Ключ, 2) = "P_" Тогда
			ЗначениеПараметра = Параметр.Значение;
			ИмяПараметра = Сред(Параметр.Ключ, 3);
			ОбъектДрайвера.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра) 
		КонецЕсли;
	КонецЦикла;
...
КонецФункции
Показать
3. greenif 28.01.19 14:32 Сейчас в теме
(2) Драйвер фискального регистратора разрабатывается для типовых конфигурация 1С.

Соответственно для сервера Торгового Оборудования(ТО) версии выше 2.0, то есть для управляемого режима работы 1С у меня нет возможности писать код на 1С.

Это в "старой" версии ТО сервера для обычного приложения есть возможность указать обработку обслуживания на 1С и в ней самому писать нужный код на 1С.

По приведенной ссылке с спецификацией компонента представляет из себя zip архив с файлом манифеста и соответственно самой DLL.
И согласно той же спецификации сервер ТО должен сам вызывать УстановитьПараметр для каждого параметра из XML таблицы ТаблицаПараметров (TableParameters), но он почему то этого не делает.

Если я что то понял не правильно прошу меня поравить.
4. spacecraft 28.01.19 15:12 Сейчас в теме
(3)
Это в "старой" версии ТО сервера для обычного приложения есть возможность указать обработку обслуживания на 1С и в ней самому писать нужный код на 1С.

В типовых сейчас используется БПО. Код в (2) как раз оттуда.
Загружается "драйвер" в БПО:
ProgID = ДанныеДрайвера.ИдентификаторОбъекта;
			Если ПустаяСтрока(ProgID) Тогда
				ОбъектДрайвера = ""; // Драйвер не требуется
			Иначе
				ProgID1 = ?(Найти(ProgID, "|") > 0, Сред(ProgID, 1, Найти(ProgID, "|")-1), ProgID); 
				ProgID2 = ?(Найти(ProgID, "|") > 0, Сред(ProgID, Найти(ProgID, "|")+1), ProgID); 
				Если ДанныеДрайвера.ПоставляетсяДистрибутивом Тогда
					ПодключитьВнешнююКомпоненту(ProgID1);
				Иначе
					ИмяОбъекта = Сред(ProgID1, Найти(ProgID1, ".") + 1); 
					Префикс = Сред(ProgID1, 1, Найти(ProgID1, ".")); 
					ProgID2 = Префикс + СтрЗаменить(ИмяОбъекта, ".", "_") + "." + ИмяОбъекта;
					Если ДанныеДрайвера.ВСоставеКонфигурации Тогда
						Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет." + ДанныеДрайвера.ИмяМакетаДрайвера, СтрЗаменить(ИмяОбъекта, ".", "_"));
					Иначе
						СсылкаНаДрайвер = ПолучитьНавигационнуюСсылку(ДанныеДрайвера.ДрайверОборудования, "ЗагруженныйДрайвер");
						Результат = ПодключитьВнешнююКомпоненту(СсылкаНаДрайвер, СтрЗаменить(ИмяОбъекта, ".", "_"));
					КонецЕсли;
				КонецЕсли;
				ОбъектДрайвера = Новый (ProgID2);
			КонецЕсли;
Показать

В момент подключения обработчика для параметров не вызывается УстановитьПараметр.
Они вызываются по необходимости, в момент использования МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу. Где тип прописан необходимый тип устройства.
5. greenif 30.01.19 19:28 Сейчас в теме
Спасибо за ответ.

Что значит
Они вызываются по необходимости

?

У меня есть XML таблица с параметрами, эти параметры заполняется в форме элемента справочника Подключаемое Оборудование
IP, Password, Username, LogLevel, DefaultTaxGroup

В спецификации сказано:


Использование оборудования пользователем в процессе работы

1. Инициализация устройства сохраненными в базе параметрами методом «УстановитьПараметр(SetParameter)».
2. Подключение оборудования с помощью метода «Подключить(Open)» с текущими значениями параметров, установленными вызовами метода «УстановитьПараметр(SetParameter)». Метод «Подключить(Open)» возвращает идентификатор подключенного экземпляра устройства.


Обращаю внимание на фразу
установленными вызовами метода «УстановитьПараметр(SetParameter)»


То есть вопрос по сути: Как мне получить значение этих параметров в коде на С++, на котором написан драйвер устройства?

P.S. Все остальные методы
Требования к разработке драйверов подключаемого оборудования. Версия 2.4
, такие как ОткрытьСмену, НапечататьФискСтроку, ЗакрытьЧек или НапечататьЧекВнесенияВыемки вызываются и прекрасно работают.
6. spacecraft 30.01.19 20:58 Сейчас в теме
(5)
У меня есть XML таблица с параметрами, эти параметры заполняется в форме элемента справочника Подключаемое Оборудование

Ок. Заполнились. Далее по Записать/ЗаписатьИЗакрыть выполняется сохранение параметров в справочнике "ПодключаемоеОборудование".

В спецификации сказано:

Тогда уж полностью спецификация:

Регистрация и настройка оборудования

Получение описания драйвера вызовом метода «ПолучитьОписание(GetDescription)».
Получения доступных параметров для настройки драйвера методом «ПолучитьПараметры(GetParameters)».
Построение формы настройки драйвера на основании списка доступных параметров.
Сохранение параметров настройки драйвера в базе данных конфигурации.

Использование оборудования пользователем в процессе работы

Инициализация устройства сохраненными в базе параметрами методом «УстановитьПараметр(SetParameter)».
Подключение оборудования с помощью метода «Подключить(Open)» с текущими значениями параметров, установленными вызовами метода «УстановитьПараметр(SetParameter)». Метод «Подключить(Open)» возвращает идентификатор подключенного экземпляра устройства.
Вызов обязательных функций и методов, специфичных для данного типа подключаемого оборудования, с использованием идентификатора подключенного экземпляра устройства.
Получение кода ошибки и описания ошибки методом «ПолучитьОшибку(GetLastError)» в случае ее возникновения.
Отключение устройства методом «Отключить(Close)» по идентификатору подключенного экземпляра устройства.
Показать


При регистрации и настройки нужно получить описание(параметры) и сохранить их в базе. В справочнике Подключаемое оборудование.
Использование оборудования:
При первом использовании создается объект драйвера. Т.е. подключается внешняя обработка. При подключении автоматически создается объект внутри этой обработки.
Затем происходит заполнение всеми параметрами, которые ранее были сохранены в справочнике. Для каждого параметра вызывается «УстановитьПараметр» отдельно (в цикле).
Соответственно в коде С++ ловить нужно каждый параметр отдельно.

УстановитьПараметр/SetParameter это метод созданный для конкретной вк в коде С++. Ищите/Создайте его.
7. spacecraft 30.01.19 21:36 Сейчас в теме
(5)
Как мне получить значение этих параметров в коде на С++, на котором написан драйвер устройства?


Так как «УстановитьПараметр(SetParameter)» это процедура, то в коде С++ будет вызван:
bool CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray)

куда первым параметром будет передан номер вызываемого метода, который должен быть зарегистрирован. Вторым параметром соответственно передаваемые параметры(указатель на них).
8. greenif 31.01.19 01:13 Сейчас в теме
(7) Спасибо.

Но

bool CAddInNative::HasRetVal(const long lMethodNum)
{	
	if (lMethodNum == eMethSetParameter)
		return false;
	else 
		return true;	
}
Показать


Соответственно Вы правы, УстановитьПараметр вызывается через CallAsProc, вот как она выглядит
bool MGnative::CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray)
{
	switch (lMethodNum)
	{
		case eMethSetParameter: MethSetParameter(paParams); break;
	}
	return true;
}
Показать


А вот как выглядит MethSetParameter

bool MGnative::MethSetParameter(tVariant* paParams) {
	long propNum = FindProp(paParams->pwstrVal);

	Logger::Debug(paParams->pwstrVal);
	Logger::Debug((paParams + 1)->pwstrVal);
	
	SetPropVal(propNum, paParams);
	return true;
}
Показать


Как Вы видите я вывожу в лог название параметра и его значение.
Вот что я вижу в лог файле


[31-01-2019 00:05:18] DEBUG: EquipmentType
[31-01-2019 00:05:18] DEBUG: ФискальныйРегистратор


То есть метод MethSetParameter с другими параметрами не вызывается.

То есть я ожидаю, что MethSetParameter будет вызвана для всех моих параметров, но этого не происходит.
10. greenif 31.01.19 03:56 Сейчас в теме
(7) Вот XML который передает драйвер, это из отладчика 1С.

Он валидный

<?xml version="1.0" encoding="UTF-8"?>
<Settings>
	<Page Caption="Параметры">
		<Parameter Name="P_IP" Caption="IP адрес" TypeValue="String" DefaultValue="192.168.132.114" />
		<Parameter Name="P_Username" Caption="Имя пользователя" TypeValue="String" DefaultValue="" />
		<Parameter Name="P_Password" Caption="Пароль" TypeValue="String" DefaultValue="" />
		<Parameter Name="P_LogLevel" Caption="Журналирование" TypeValue="Number" DefaultValue="2">
			<ChoiceList>
				<Item Value="2">Ошибки</Item>
				<Item Value="1">Информация</Item>
				<Item Value="0">Отладка</Item>
			</ChoiceList>
		</Parameter>
		<Parameter Name="P_DefaultTaxGroup" Caption="Группа для товаров без НДС" TypeValue="Number" DefaultValue="0">
			<ChoiceList>
				<Item Value="1">А</Item>
				<Item Value="2">Б</Item>
				<Item Value="3">В</Item>
				<Item Value="4">Г</Item>
				<Item Value="0">Е</Item>
			</ChoiceList>
		</Parameter>
	</Page>
</Settings>
Показать
9. greenif 31.01.19 01:14 Сейчас в теме
А вот почему этого не происходит для меня остается загадкой.
11. greenif 31.01.19 06:31 Сейчас в теме
Все заработало, сложно сказать почему, но кажется из-за того, что один из параметров не был зарегистрирован в
static const wchar_t *g_PropNames[] = { L"Version",L"Name",L"Description",L"EquipmentType",L"InterfaceRevision"....}


И получается перечисление enum Props было длиннее чем выше указанный массив.

P.S. Хоть я и не уверен что проблема была именно в этом.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот