1с найтипокоду не работает

Обновлено: 07.07.2024

Внешние компоненты можно использовать на разных операционных системах:

А также может быть 32-х разрядная версия внешней компоненты и 64-х разрядная.

Внешние компоненты могут использоваться при работе через веб-клиент для браузеров:

  • Google Chrome
  • Microsoft Internet Explorer
  • Mozilla Firefox
  • Safari;

И в мобильной платформе 1С для мобильных операционных систем:

Существует две технологии создания внешних компонент для 1С:

Внешние компоненты разработанные по технологии COM можно использовать только:

  • В тонком и толстом клиентах
  • В веб клиенте, только для ОС Windows

Для подключения внешней компоненты используется метод НачатьПодключениеВнешнейКомпоненты, вторым параметром нужно указать ProgID COM компоненты.

ОбратныйВызов = Новый ОписаниеОповещения ( "ОбратныйВызов" , ЭтотОбъект ) ; НачатьПодключениеВнешнейКомпоненты ( ОбратныйВызов , "AddIn.Test" ) ; Процедура ОбратныйВызов ( Подключено , ДопПараметры ) Экспорт

Также можно использовать синхронный метод ПодключитьВнешнююКомпоненту и асинхронный ПодключитьВнешнююКомпонентуАсинх.

На данный момент данная технология является устаревшей, рекомендуется использовать технологию Native API.

Native API

Внешние компоненты разработанные по технологии Native API можно использовать:

  • В тонком и толстом клиентах
  • В веб-клиенте
  • На сервере
  • В мобильном приложении

Внешняя компонента может быть запакована в ZIP-архив или представлена в виде отдельного файла.

Так как внешние компоненты по технологии Native API могут быть использованы как в Windows, так и в Linux, то желательно помещать в архив с компонентой 5 файлов:

  • dll файл 32-х разрядной версии
  • dll файл 64-х разрядной версии
  • so файл 32-х разрядной версии
  • so файл 64-х разрядной версии
  • Файл-манифест

В этом случае при подключении внешней компоненты платформа сама определит какой файл использовать по файлу-манифесту.

Подключение внешней компоненты на клиенте

Перед подключением внешней компоненты на клиенте, ее сначала нужно установить методом НачатьУстановкуВнешнейКомпоненты. Установка выполняется в каталог компьютера клиента %APPDATA%\1C\1Cv8\ExtCompT. Установка выполняется один раз. В дальнейшем перед использованием компоненты ее нужно только подключать. Подключение выполняется методом НачатьПодключениеВнешнейКомпоненты.

Проблема с вызовом метода ком-объекта 1С - НайтиПо Коду или FindByCode.

Чего установлено: Windows XP, Axapta 3.0 SP2 CIS, 1C - 7.70.018

Ошибка: Метод 'FindByCode' в COM-объекте класса '<unknown>' возвратил код ошибки 0x80070057 (E_INVALIDARG), который означает: Один или более аргументов не верен.

Вот код. Он очень похож на тот кусок, который Маззи запостил и тогда назвал его
заведомо рабочим:

COM c ,
cont ;
int res ;

c = new COM ( "V77.Application" );

res = c . Initialize ( c . RMTrade (), '/D "C:\\1Cv77\\1SBDemo" /M' , 'NO_SPLASH_SHOW' );

if (! res ) throw error ( 'Ошибка при инициализации 1С' );

cont = c . CreateObject ( 'Справочник.Контрагенты' );
pause ;

res = cont . FindByCode ( "000001" , 0 );

print( strfmt ( '%1 - %2' , res , cont . Наименование ()));
pause ;

Imho самым простым решением будет дописать в глобальнике 1C что-нибудь вроде

Функция глПоискПоКоду(Назв, Код) Экспорт
спр = СоздатьОбъект("Справочник." + Назв);
если спр.НайтиПоКоду(Код, 0) = 1 тогда
Возврат спр;
конецЕсли;
КонецФункции

. и вызывать ее как метод объекта application => Возвращаемое значение можно принять в переменную типа COM и использовать.

__________________
- Зацени, Баттхед: я поставил Аксапту!
- Вот клёво! Ну ты даешь, пельмень! Тоже вариант, конечно. Но это не спортивно
Ладно бы оно нигде не работало, так ведь местами работает всё-таки. Значит может, зараза. Изначально опубликовано Tony Green
Вот код. Он очень похож на тот кусок, который Маззи запостил и тогда назвал его
заведомо рабочим:

Рабочий, рабочий. Тогда я проверял.

Тогда мы долго искали с 1Сниками решение, которое работало бы на всех релизах. Вроде пришли к рекомендации, что второй параметр надо передавать как строку

В этот раз не проверял. Если будут сложности - попробую вернутся к этой проблеме вечером.

Ну почему? почему работает вот это:

Dim Appl , Cust As Object

Set Appl = CreateObject ( "V77.Application" )
result = Appl . Initialize ( Appl . RMTrade , "/D""C:\1Cv77\1SBDemo"" /M" , "NO_SPLASH_SHOW" )

If result = 0 Then
MsgBox ( "Приложение не инициализировано" )
Else
Set Cust = Appl . CreateObject ( "Справочник.Контрагенты" )
Cust . FindByCode ( "000031" )
MsgBox ( Cust . Наименование )
End If

var
V , C : Variant ;
begin
V := CreateOleObject ( 'V77.Application' );
V . Initialize ( V . RMTrade , '/D "C:\1Cv77\1SBDemo" /M' , 'NO_SPLASH_SHOW' );

C := V . CreateObject ( 'Справочник.Контрагенты' );

C . FindByCode ( '000031' );
ShowMessage ( C . Наименование );
end ;

COM v77 ,
cust ;
int res ;

v77 = new COM ( "V77.Application" );

res = v77 . Initialize ( v77 . RMTrade (), '/D "C:\\1Cv77\\1SBDemo" /M' , 'NO_SPLASH_SHOW' );

if (! res ) throw error ( 'Ошибка при инициализации 1С' );

cust = v77 . CreateObject ( 'Справочник.Контрагенты' );
res = cust . FindByCode ( "000031" , 0 );
print( cust . Наименование ());
pause ;

COMDispFunction find = new COMDispFunction ( dict , 'НайтиПоКоду' , COMDispContext :: Method );

COMVariant code = new COMVariant ( COMVariantInOut :: In , COMVariantType :: VT_BSTR );
COMVariant attr = new COMVariant ( COMVariantInOut :: In , COMVariantType :: VT_INT );
COMVariant ret = new COMVariant ( COMVariantInOut :: Out_retVal , COMVariantType :: VT_BOOL );

code . bStr ( '000031' );
attr . int ( 0 );

find . call ( code , attr , ret );

так, Tony Green, спокойствие.

Я вчера проверил. Да, не работает с 21 релизом, ни 3.0, ни 2.5.
Раньше работало.
Барабашки нет. Значит что-то изменилось. Задача - выяснить.

Да, действительно. Сам метод отрабатывает, но Аксапта возбуждает исключение.
Исключение возбуждается поскольку метод возвращает ненулевой HRESULT.

Если вы знакомы с COM, то должны знать, что внутри совсем все не так как пишется в коде. У меня подозрение, что 1С в некоторых конфигурациях выполняет код правильно, но возвращает HRESULT.

Аксапта это ловит.
Все басикоподобные языки сильно обертывают и прячут COM-события.

Обратите внимание, что в басике и дельфи вы вызываете FindByCode как МЕТОД, а не как функцию! Обратите внимание, что там где у вас работает нет Retval параметра. Аксапта же всегда вызывает как функцию и хочет получить возвращаемое значение. Здесь то ее похоже и обламывают.

Я протестил и Excel VBA. Excel выполнил не возбудил никаких исключений. У меня подозрение, что он и не смотрит в HRESULT. Т.е. все произошло так, как будто в Аксапте вызов findByCode обернули в Try catch.

Погодите, хочу протестировать с ключом, с соболем и с соароном. Хочу протестировать 18 и 21 релиз, DBF и SQL версию. Обязательно расскажу о результатах.

Пока у меня вопрос: какой HRESULT возвращает 1С, если вызвать ее из Delphi через iDispatch?

kosalex --> kosalex



Просмотр профиля

Тип Кода - Строка
Длина - 11

Справочники.Номенклатура.НайтиПоКоду("17876") - НЕ НАХОДИТ
Справочники.Номенклатура.НайтиПоКоду("017876") - НАХОДИТ

Petre --> Petre



Просмотр профиля Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". kosalex --> kosalex



Просмотр профиля

Смотрел, выставлял, точное соответствие и не точное, не помогает (

Petre --> Petre



Просмотр профиля Нет неточного соответствия. Только точное.
Для неточного пользуйте запрос. Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". kosalex --> kosalex



Просмотр профиля Нет неточного соответствия. Только точное.
Для неточного пользуйте запрос.

НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
Параметры:

Тип: Число; Строка.
Искомый код.
Строка или число в зависимости от настроек справочника в конфигураторе.
<ПоискПоПолномуКоду> (необязательный)

Тип: Булево.
Определяет режим поиска по полному коду. Истина - искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом "/".
Значение по умолчанию: Ложь.
<Родитель> (необязательный)

Тип: СправочникСсылка.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
<Владелец> (необязательный)

Тип: СправочникСсылка.
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Возвращаемое значение:

Тип: СправочникСсылка.<Имя справочника>; Неопределено.
Если не существует ни одного элемента с требуемым кодом, то будет возвращена пустая ссылка.
Если для справочника код не задан (длина = 0), то будет возвращено Неопределено.
Описание:

Осуществляет поиск элемента по его коду.

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Мне кажется, что сначала надо делать проверку на пустой код, а уж потом, если он не пустой, проверять нет ли уже такого в справочнике.<br>И еще нужно добавить проверку на случай если редактируется уже записанный в справочник элемент. Без этой проверки Спр.НайтиПокоду найдет сам себя.<br>

> Без этой проверки Спр.НайтиПокоду(. ) найдет сам себя. Естейственно найдет, если справочник записан.А тут идет речь о создании нового справочника (он пока ещё не записан!).<br>> Мне кажется, что сначала надо делать проверку на пустой код<br>Вот я и делаю проверку на пустой код! Проверка не отрабатывается в процедлуре ПриЗаписи()! В этом то и состоит проблема.

"> Если ПустоеЗначение(СокрЛП(Код))=1 Тогда<br>> Предупреждение("Не указан БИК банка!");<br>> СтатусВозврата(0);<br>> Возврат;<br>> КонецЕсли;<br>Вставила ваш код в процедуру призаписи(). Все работает , элемент с пустым БИКом программа записать не дает. А поверка на существующий -установка галочки у контроля уникальности."

"А вы уверены в том что у вас нет в справочнике элементов с пустым БИК?<br>Еще раз поясняю, поменяйте порядок проверки. Сначала на пустой код, а потом на уникальность.<br>В вашем случае, если в справочнике уже есть элемент с пустым БИК, то всегда будет отрабатывать первая часть кода, а до второй как раз дело и не дойдет, поскольку стоит Возврат;"

"> установка галочки у контроля уникальности.<br>Галочка, давно установлена. Лет 5 назад. Только, выражение "Код не уникален", тоже не до всех доходит.<br>> если в справочнике уже есть элемент с пустым БИК<br>Его и быть не может, т.к. элемент с пустым кодом даже не записывается и начинает ругаться еще до того, как отработается процедура "ПриЗаписи()".<br>Придется, наверно, написать ещё одну процедурку, типа:<br><br>Процедура ПередЗаписью()<br>Если ПустоеЗначение(СокрЛП(Код))=1 Тогда<br>Предупреждение("Не указан БИК банка!");<br>СтатусВозврата(0);<br>Возврат;<br>КонецЕсли;<br>Записать();<br>Форма.Закрыть();<br>КонецПроцедуры<br><br>И вставить её в кнопку "ОК".<br><br>Анекдоты писать можно:<br>Краткий словарь к справочнику "Банки".<br>Код - БИК банка.<br>Не уникален - уже существует.<br>Не верно задан - не заполнен.<br>Редиска - нехороший человек.<br><br>Вот и получается:<br>Не верно задан код - Не заполнен БИК банка.<br>Код не уникален - БИК банка уже существует.<br><br>Слова, при которых нужно не задумываясь вызывать программиста:<br>Поле - это не то, на котором растёт пшеница.<br>Тело - это не голый торс!<br>Агрегатный объект - Не имеет ничего общего с холодильным агрегатом.<br>Переменная - это не женщина с легким поведением.<br>Массив - это не качёк, который весит 200 кг.<br>Индекс - это не то, что пишут на конвертах.<br>"Выходит за границы" - это не эмиграция!<br>И тд. и т.п.<br>Никогда не пытаться их переводить! <br>"

Читайте также: