Можно вызывать из 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();
}
}
}