Автор Тема: Можно ли вызвать из Web-расширения функцию 1С?  (Прочитано 33453 раз)

0 Пользователей и 1 Гость просматривают эту тему.

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #18 : 02 Июль 2009 Четверг 14:09:37 »
Бывает  :)
У меня в модуле стоят только 2 галочки: "Клиент" и "Внешнее соединение"

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #17 : 02 Июль 2009 Четверг 14:09:07 »
Все нормально, теперь из этого непонятного си-шарпа возвращаюсь в родной конфигуратор. Дело сразу пошло!

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #16 : 02 Июль 2009 Четверг 14:08:35 »
Ой, извиняюсь, я не ту комманду написал.
В 1С 7.7 раньше было КаталогИБ() чтобы узнать каталог информационной базы, в 1С8 теперь этой комманды нет, вместо нее сделали: СтрокаСоединенияИнформационнойБазы()
Чтобы узнать каталог ИБ в 1с8, вот так надо, попробуй, чтобы точно быть уверенным что это та база:
string StrTest = (string)V8.Call(connection, connection.Connection, "СтрокаСоединенияИнформационнойБазы");
Попробуй комп перезагрузить, может dll эта старая из памяти не выгрузилась после импорта метаданных.

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #15 : 02 Июль 2009 Четверг 14:07:48 »
Разобрался!
В 1С создал модуль, надо было еще в его свойствах отметить "Глобальный" "Использовать во внешнем соединении". Не знаю какая из них точно нужна, на всякий случай везде галочку поставил.

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #14 : 02 Июль 2009 Четверг 14:07:27 »
Выдал "C:\Program Files\1cv81\bin\"
в свойствах переменной myConnect каталог базы указан правильный.
Я еще покопаюсь, кажется постепенно проясняется.
Спасибо большое!

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #13 : 02 Июль 2009 Четверг 14:06:45 »
Цитировать
Если развернуть дальше - в нескольких местах
Например: TargetSite->DeclaringType->DeclaringMethod

Method may only be called on a Type for which Type.IsGenericParameter is true

Аналогичное сообщение в ветках ReturnType и еще некоторых.
Параметр IsGeneric везде false


Я сейчас в своем проекте ради эксперимента, переименовал рабочую процедуру специально сделал с ошибкой и запустил.
Ошибка теперь у меня один в один как у тебя: "Неизвестное имя. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))"

И это у меня также: Method may only be called on a Type for which Type.IsGenericParameter is true.
Попробуй проверить вот так, может ты не к той базе подключаешься?:
Закомментируй вызов своей процедуры и вставь этот код:

string StrTest = (string)V8.Call(connection, connection.Connection, "КаталогПрограммы");
Response.Write("<h2>" + StrTest + "</h2>");


После выполнения, если ты к базе без ошибок подключился, у тебя на экране отобразится строка - полный путь к твоей базе.
Это стандартная функция 1С, должна работать в любой базе 1С. Попробуй позапускай таким образом другие функции 1С, чтобы понять в чем проблема.
А другие твои функции 1С работают или только эта одна не работает?

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Можно ли вызвать из Web-расширения функцию 1С?
« Ответ #12 : 02 Июль 2009 Четверг 14:05:14 »
Если развернуть дальше - в нескольких местах
Например: TargetSite->DeclaringType->DeclaringMethod

Method may only be called on a Type for which Type.IsGenericParameter is true

Аналогичное сообщение в ветках ReturnType и еще некоторых.
Параметр IsGeneric везде false

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #11 : 02 Июль 2009 Четверг 14:03:55 »
Вот:

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #10 : 02 Июль 2009 Четверг 14:03:13 »
В пункте Actions нажми View Detail..., там написано где проблема в 1С, сделай еще от туда скриншот.

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #9 : 02 Июль 2009 Четверг 14:02:45 »
Нет, все равно пишет ошибку

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
RE: А как сделать импорт метаданных?
« Ответ #8 : 02 Июль 2009 Четверг 14:01:42 »
После установки WEB-расширения, у меня в Visual Studio в меню Tools было меню "Импорт метаданных", но оно потом исчезло.
Но можно делать импорт метаданных и по другому, я так сейчас и делаю. Через меню: Пуск - Программы - 1С Предприятие 8. Web расширение 1.1 - Импорт метаданных
Сам EXE файл импорта метаданных лежит по умолчанию тут: "C:\Program Files\1cV8Web\bin\MDGenerate.exe"
Далее в открывшемся окне выбираешь базу 1С из которой делать импорт метаданных, только после этого C#(ASP.NET) будет знать о твоих изменениях в 1С:
1. Ввожу имя пользователя базы 1С
2. Ввожу пароль пользователя базы 1С
3. Ввожу каталог моего ASP.NET проекта и в нем выбираю папку BIN,
например: c:\Мойпроект\bin
тут должны быть 2 файла, проверь их дату и время, чтобы быть уверенным что они обновились:
c:\Мойпроект\bin\1cv8.dll
c:\Мойпроект\bin\1cv8.xml
Теперь нужно обязательно закрыть текущий ASP проект и открыть его еще раз, после этих операций у меня появляются в моем ASP проекте новые изменения в метаданных 1С.

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
А как сделать импорт метаданных?
« Ответ #7 : 02 Июль 2009 Четверг 14:00:55 »
А как сделать импорт метаданных? Вроде должна быть в меню Tools, у меня нет. Я работаю в web developer 2005 Express. Можно ли выполнить эту операцию каким-то другим способом, из командной строки например?

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
1. Первое что мне приходит в голову, попробуй запусти еще раз "импорт метаданных", это самая частая ошибка. Если в базе 1С чтото менялось, лучше сделать еще раз "импорт метаданных" и у себя в проекте проверь в папке "bin", что у файлов "1cv8.dll" и "1cv8.xml" дата и время изменилась на сегодняшние. Возможно C# просто еще незнает что в 1С появилась новая функция. У меня бывало вылетала такая ошибка, проверяю даты файлов "1cv8.dll" и "1cv8.xml" - свежие, а как потом оказалось я импорт не из той базы 1С сделал :) , есстественно там таких функций нет.
2. Если ничего не получится, выложи текст ошибки или скриншот ошибки.

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
Блин, что делать. Вот кусок кода. Вызывается функция 1с, которой в качестве параметра передается табличная часть.
Возвращаться должная таблица значений. Написал как в примере на диске ИТС

ItemDataSource.GetDataFromForm();
using (V8DbConnection myConnect = ItemDataSource.Connection)
{
myConnect.Open();
try
{
using (ComObject obj = ItemDataSource.GetObject())
{
ComObject TabularPart = (ComObject)V8.Get(myConnect, obj, "ТМЦ"); //Табличная часть документа
[b]using (ComObject valueTable = (ComObject)V8.Call(myConnect, myConnect.Connection, "WebПолучитьПараметрыНоменклатуры", TabularPart))[/b]
{

}
}
}
finally
{
myConnect.Close();
}
}

Ругается на строке, выделенной жирным, ошибка - "неизвестное имя" и на имя функции 1с стрелкой показывает. Функция эта в 1с есть и описана со словом "Экспорт"

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
Цитировать
Модуль, в котором описана функция 1С, не надо указывать?

Нет, общий модуль указывать не надо из C#.
В свойствах общего модуля 1С8 нужно только установить галочку: Внешнее соединение

Цитировать
Даже в самой 1С вызов функции делается с указанием модуля, а из web-расширения он сам значит сам найдет?
В самой 1С, если в модуле установить "Экспорт", то функции будут виды во всей 1С без указания модуля, я у всех своих функций 1С так и сделал (у меня их не так то и много), незнаю правда хороший это подход или нет, может чуток памяти больше тратится, но мне удобнее так программировать :)

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
RE: Пример вызова через WEB-Расширение функции 1С из C#
« Ответ #3 : 02 Июль 2009 Четверг 13:56:51 »
Цитировать
V8.Call(connection, connection.Connection, "ПроверкаИннКпп", ИНН.Value, КПП.Value, Код.Value)

Модуль, в котором описана функция 1С, не надо указывать? Даже в самой 1С вызов функции делается с указанием модуля, а из web-расширения он сам значит сам найдет?

iPRG Team

  • Administrator
  • Full Member
  • *****
  • Сообщений: 188
    • Просмотр профиля
Пример вызова через WEB-Расширение функции 1С из C#
« Ответ #2 : 02 Июль 2009 Четверг 13:56:17 »
Можно вызывать из Web-расширения и функции и процедуры из той базы 1С с которой ты работаешь, только объявляй процедуры и функции как Экспорт.
Я например сделал в своей конфигурации 1С:8 в общих модулях, модуль для процедур и функций для WEB-Расширения, чтобы не путаться, у всех стоит в конце Экспорт.
Вот пример функции 1С которая делает проверку(по ИНН, КПП) при вводе нового контрагента, есть ли такой контрагент уже в базе.

пар_ИНН - Передаем ИНН контрагента в виде строки
пар_КПП - Передаем КПП контрагента в виде строки
пар_Код - Передаем код контрагента в виде строки

Функция ПроверкаИннКпп(пар_ИНН,пар_КПП,пар_Код) Экспорт
Рез="";
тмпЗапрос=Новый Запрос;
ИНН=СокрЛП(пар_ИНН);
КПП=СокрЛП(пар_КПП);
Если (ИНН="")и(КПП="") Тогда
Возврат "У контрагента не введены ИНН и КПП";
КонецЕсли;
Если СокрЛП(КПП)="" Тогда
тмпЗапрос.Текст = "ВЫБРАТЬ
| Контрагенты.Ссылка,
| Контрагенты.Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.Код <> &Код";
тмпЗапрос.УстановитьПараметр("Код",пар_Код);
тмпЗапрос.УстановитьПараметр("ИНН",ИНН);
тмпВыб=тмпЗапрос.Выполнить().Выгрузить();
Если тмпВыб.Количество()>0 Тогда
Для каждого н1 Из тмпВыб Цикл
Рез="Контрагент с таким ИНН уже существует: "+н1.Наименование+"("+ИНН+")";
Прервать;
КонецЦикла;
КонецЕсли;
Иначе
тмпЗапрос.Текст = "ВЫБРАТЬ
| Контрагенты.Ссылка,
| Контрагенты.Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП
| И Контрагенты.Код <> &Код";
тмпЗапрос.УстановитьПараметр("Код",пар_Код);
тмпЗапрос.УстановитьПараметр("ИНН",ИНН);
тмпЗапрос.УстановитьПараметр("КПП",КПП);
тмпВыб=тмпЗапрос.Выполнить().Выгрузить();
Если тмпВыб.Количество()>0 Тогда
Для каждого н1 Из тмпВыб Цикл
Рез="Контрагент с таким ИНН и КПП уже существует: "+н1.Наименование+"("+ИНН+"/"+КПП+")";
Прервать;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Рез;
КонецФункции


А этот код на C#:
Сам вызов функции 1С8 из C# вот:
LabelError.Text = (string)V8.Call(connection, connection.Connection, "ПроверкаИннКпп", ИНН.Value, КПП.Value, Код.Value);
Функция возвращает строку в объект Label на форме.
Если функция возвращает пустую строку, то все нормально контрагента разрешаем вводить, т.к. такого еще нет в базе, если строка не пустая, значит такой контрагент уже есть в базе и запрещаем его вводить. А то до этого, пользователи на вводили у меня в базе кучу одинаковых контрагентов, потом замучаешься в 1С их объединять...
Ниже я скопировал всю процедуру на C#, может еще что там пригодится 

protected void mainPanel_OKCommand(object source, CommandEventArgs e)
{
using (V8DbConnection connection = new V8DbConnection(
System.Configuration.ConfigurationManager.AppSettings[V8Consts.Database],
System.Configuration.ConfigurationManager.AppSettings[V8Consts.UserName],
System.Configuration.ConfigurationManager.AppSettings[V8Consts.UserPassword]))
{
string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (authCookie == null)
{
// There is no authentication cookie.
return;
}

FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
//Response.Write("<h2><I>Здравствуйте " + username + "</I></h2>");
}
catch
{
// Log exception details (omitted for simplicity)
return;
}

if (authTicket == null)
{
// Cookie failed to decrypt.
return;
}


//попытка открыть подключение к ИБ созданное выше
connection.Open();
try
{
LabelError.Text = (string)V8.Call(connection, connection.Connection, "ПроверкаИннКпп", ИНН.Value, КПП.Value, Код.Value);
if (LabelError.Text.Length > 0)
{
}
else
{
mainPanel.doOK();
}

}//Возвращает строку и бул без проблем
finally
{
connection.Close();
}
}
}

mugg

  • Newbie
  • *
  • Сообщений: 26
    • Просмотр профиля
Можно ли вызвать из Web-расширения функцию 1С?
« Ответ #1 : 02 Июль 2009 Четверг 13:53:40 »
Если да, то как к ней обратится. Каким образом можно указать, в каком модуле она находится?