При поддержке и доработке веб-решений, интегрированных с базой 1С, часто приходится сталкиваться с нестандартной архитектурой взаимодействия. Рассмотрим ситуацию, когда внешнее ASP.NET-приложение отправляет POST-запросы на прокси-страницах, а в качестве нагрузки передаются XML-структуры с набором специфических атрибутов. Выясним, как сопоставляются параметры внешнего запроса с вызовами внутренних процедур 1С, где именно формируется итоговый XML-ответ и как правильно доработать запрос для получения дополнительных данных, таких как адрес доставки.
Рассмотрим по шагам, как проходит сигнал от клиентского браузера до базы данных и обратно:
srvXml), которая с помощью объекта XMLHttpRequest отправляет подготовленный XML-документ методом POST на ASP.NET-скрипт (например, a909.aspx?1).V81.COMConnector) или Web-сервисы.Проанализируем ситуацию с технической стороны: часто в атрибутах входящего XML передаются управляющие параметры, например a="8_2014". На первый взгляд данный параметр может казаться наименованием таблицы или датой релиза взаимодействия. Однако в описываемой схеме веб-прокси использует значение этого атрибута для вызова соответствующей экспортной функции 1С — в данном случае f8_2014(xdIn).
Таким образом, имя процедуры в общем модуле или модуле внешнего соединения напрямую связывается с идентификатором вызова из веб-интерфейса.
Разберем пример экспортной функции в 1С, которая принимает входящий DOMDocument, выполняет запрос к документам ЗаказПокупателя и формирует итоговый XML-ответ:
Функция f8_2014(xdIn) Экспорт
// Извлекаем параметры из атрибутов входящего XML-документа
agent = Справочники.Проекты.НайтиПоКоду(xdIn.documentElement.getAttribute("b"));
d1 = НачалоДня(Дата(xdIn.documentElement.getAttribute("c")));
d2 = КонецДня(Дата(xdIn.documentElement.getAttribute("d")));
ТекстЗапроса =
"ВЫБРАТЬ
| doc.Номер,
| doc.Дата КАК Дата,
| doc.Контрагент.Наименование КАК КонтрагентНаименование,
| doc.ДоговорКонтрагента.Наименование КАК ДоговорНаименование,
| doc.СуммаДокумента,
| doc.Ссылка,
| ВЫБОР
| КОГДА doc.Проведен ТОГДА ""1""
| ИНАЧЕ ""0""
| КОНЕЦ КАК Проведен,
| ВЫБОР
| КОГДА ВложенныйЗапрос.ПризнакОтгрузки ЕСТЬ НЕОПРЕДЕЛЕНО ТОГДА ""0""
| ИНАЧЕ ВложенныйЗапрос.ПризнакОтгрузки
| КОНЕЦ КАК Отгружен
|ИЗ
| Документ.ЗаказПокупателя КАК doc
| ЛЕВОЕ СОЕДИНЕНИЕ (
| ВЫБРАТЬ
| ЗаказыРеализации.Заказ.Ссылка КАК ЗаказСсылка,
| ""1"" КАК ПризнакОтгрузки
| ИЗ
| РегистрСведений.ЗаказыРеализации КАК ЗаказыРеализации
| ГДЕ
| ЗаказыРеализации.ВРеализации
| И ЗаказыРеализации.Реализация.Проведен
| ) КАК ВложенныйЗапрос
| ПО doc.Ссылка = ВложенныйЗапрос.ЗаказСсылка
|ГДЕ
| doc.Проект = &agent
| И doc.Дата МЕЖДУ &d1 И &d2
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("agent", agent);
Запрос.УстановитьПараметр("d1", d1);
Запрос.УстановитьПараметр("d2", d2);
Выборка = Запрос.Выполнить().Выбрать();
xd = Новый DOMDocument;
root = xd.СоздатьЭлемент("r");
xd.ЗаписатьРебенок(root);
Пока Выборка.Следующий() Цикл
el = xd.СоздатьЭлемент("d");
el.УстановитьАтрибут("a", СокрЛП(Выборка.Номер)); // Номер заказа
el.УстановитьАтрибут("b", СокрЛП(Формат(Выборка.Дата, "ДФ=dd.MM.yyyy"))); // Дата заказа
el.УстановитьАтрибут("c", СокрЛП(Выборка.КонтрагентНаименование) + "/" + СокрЛП(Выборка.ДоговорНаименование)); // Клиент и договор
el.УстановитьАтрибут("d", СокрЛП(Формат(Выборка.СуммаДокумента, "ЧГ="))); // Сумма
el.УстановитьАтрибут("e", СокрЛП(Выборка.Проведен)); // Флаг проведения
el.УстановитьАтрибут("f", СокрЛП(Выборка.Ссылка.УникальныйИдентификатор())); // GUID документа
el.УстановитьАтрибут("g", СокрЛП(Выборка.Отгружен)); // Признак отгрузки
root.ЗаписатьРебенок(el);
КонецЦикла;
Возврат XMLDOMtoString(xd);
КонецФункции
Для того чтобы передать на веб-сайт адрес доставки заказа, необходимо внести изменения как в текст запроса 1С, так и в цикл обхода выборки:
doc.АдресДоставки КАК АдресДоставки.h):
// Внутри цикла Выборка.Следующий() Добавляем адрес доставки:
el.УстановитьАтрибут("h", СокрЛП(Выборка.АдресДоставки));
После внесения изменений клиентский скрипт получит новый атрибут в узле d, который можно будет легко распарсить на веб-странице.
При работе интеграционных механизмов 1С 8.1 под управлением IIS следует учитывать ряд технических нюансов:
comcntrcfg.xml в каталоге conf платформы. Это позволяет подключаться конфигуратором к конкретным COM-сессиям без создания помех пользователям.V81.COMConnector является 32-разрядным. В настройках пула приложений IIS (Application Pool) необходимо обязательно установить значение параметра Разрешить 32-битные приложения (Enable 32-Bit Applications = True).