1с найтипокоду не работает
Внешние компоненты можно использовать на разных операционных системах:
А также может быть 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") - НАХОДИТ
- "Бухгалтерія для України 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>"
Читайте также: