Как устроена интеграция веб-сайта на ASP.NET с 1С 8.1 через XML-запросы и IIS

Программист Управленческий учет IT и автоматизация бизнеса
← На главную

При поддержке и доработке веб-решений, интегрированных с базой 1С, часто приходится сталкиваться с нестандартной архитектурой взаимодействия. Рассмотрим ситуацию, когда внешнее ASP.NET-приложение отправляет POST-запросы на прокси-страницах, а в качестве нагрузки передаются XML-структуры с набором специфических атрибутов. Выясним, как сопоставляются параметры внешнего запроса с вызовами внутренних процедур 1С, где именно формируется итоговый XML-ответ и как правильно доработать запрос для получения дополнительных данных, таких как адрес доставки.

Архитектура взаимодействия веб-приложения и 1С

Рассмотрим по шагам, как проходит сигнал от клиентского браузера до базы данных и обратно:

  1. Отправка запроса с клиента: В браузере торгового агента вызывается JavaScript-функция (например, srvXml), которая с помощью объекта XMLHttpRequest отправляет подготовленный XML-документ методом POST на ASP.NET-скрипт (например, a909.aspx?1).
  2. Обработка на стороне IIS / ASP.NET: ASP.NET-приложение выступает в роли прокси-слоя. Оно принимает incoming XML, считывает его структуру и определяет, какой именно внутренний сервисный метод или функцию 1С требуется вызвать. Взаимодействие веб-сервера с 1С 8.1 обычно осуществляется через COM-соединение (компонент V81.COMConnector) или Web-сервисы.
  3. Выполнение логики в 1С: В конфигурации 1С находится экспортная функция, аргументом которой передается полученный XML-документ (или его DOM-представление). Функция выполнят запрос к базе данных, строит результирующее дерево XML и возвращает его в виде строки.
  4. Формирование ответа клиенту: Прокси-страница перенаправляет полученный XML обратно в клиентский скрипт, где происходит его разбор (parsing) и отображение данных на веб-странице.

Диспетчеризация функций и сопоставление параметров

Проанализируем ситуацию с технической стороны: часто в атрибутах входящего XML передаются управляющие параметры, например a="8_2014". На первый взгляд данный параметр может казаться наименованием таблицы или датой релиза взаимодействия. Однако в описываемой схеме веб-прокси использует значение этого атрибута для вызова соответствующей экспортной функции 1С — в данном случае f8_2014(xdIn).

Таким образом, имя процедуры в общем модуле или модуле внешнего соединения напрямую связывается с идентификатором вызова из веб-интерфейса.

Анализ кода функции обработки запроса в 1С

Разберем пример экспортной функции в 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С, так и в цикл обхода выборки:

  1. В секцию выборки запроса добавим реквизит адреса доставки документа: doc.АдресДоставки КАК АдресДоставки.
  2. В цикле обхода результатов добавим новую строку установки атрибута в XML (например, атрибут h):

// Внутри цикла Выборка.Следующий() Добавляем адрес доставки:
el.УстановитьАтрибут("h", СокрЛП(Выборка.АдресДоставки));

После внесения изменений клиентский скрипт получит новый атрибут в узле d, который можно будет легко распарсить на веб-странице.

Особенности настройки и отладки COM-соединений под IIS

При работе интеграционных механизмов 1С 8.1 под управлением IIS следует учитывать ряд технических нюансов:

← На главную