Пример представляет собой простой WEB-сайт, использующий данные из информационной базы 1С:Предприятия, и демонстрирует использование средств интеграции 1С:Предприятия 8. Он позволяет получать информацию из справочников, определенных в информационной базе и исполнять запросы на языке запросов 1С:Предприятия. Пример демонстрирует использование следующих средств интеграции, реализованных в 1С:Предприятии 8:
Пример содержит:
Все файлы примера находятся в каталоге 1CITS\EXE\COM_DEMO. Вы можете скопировать файлы примера на свой компьютер.
Для запуска примера выполните следующие действия:
Сайт готов к работе. Его можно открыть в браузере Интернета.
Ниже перечислен полный список файлов представленного примера:
Основным назначением данного примера является демонстрация использования внешнего соединения 1С:Предприятия из другой системы программирования. В качестве такой системы выбран язык JavaScript, встроенный в текст ASP страниц. Исполнение такой страницы происходит в следующем порядке:
Браузер клиента формирует HTTP запрос на определенную ASP страницу.
Получив HTTP запрос, интернет сервер интерпретирует запрошенную ASP страницу. При этом исполняются встроенные в нее скрипты на JavaScript.
Html текст страницы и выходные данные, сформированные в процессе исполнения скрипта, передаются клиентскому браузеру и отображаются на экране.
Интерес представляет процесс исполнения скрипта, использующего средства интеграции 1С:Предприятия. Остановимся на нем подробнее на примере страницы refone.asp, представляющей список групп и элементов выбранного справочника. Рассмотрим его исходный текст (он взят из файла WEB\refone.asp).
Копировать в буфер обменаentConn = new ActiveXObject("v8.comconnector");
conn = entConn.connect("file=c:/demo/democonfig");
conn.КаталогXSLПреобразований = "c:/demo/xsl";
grVal = Request.QueryString("group");
if (grVal.Count == 0)
{
var empty;
Response.Write(conn.getRefOne( Request.QueryString("key")(1), empty));
}
else
Response.Write(conn.getRefOne( Request.QueryString("key")(1), grVal(1)));
Первая строчка создает внешнее соединения. Далее оно настраивается на определенную информационную базу при помощи строки соединения. Параметр file= в этой строке задает каталог, содержащий файловый вариант информационной базы. Далее выполняется установка значения глобальной переменной КаталогXSLПреобразований (имя каталога с файлами XSL-преобразований) модуля внешнего соединения. Далее выполняется анализ параметров http-запроса. Если нет параметра group, то это значит, что запрашиваются элементы и группы справочника верхнего уровня. Если же он есть, то запрашиваются группы и элементы, вложенные в заданную группу.
Основные операции по получению данных из информационной базы выполняет метод getRefOne модуля внешнего соединения. Вот текст этого метода (он взят из файла CONF\ComConnectionTxt.txt):
Копировать в буфер обменаФункция getRefOne(НомерСправочника, СсылкаНаЗапись) Экспорт
СтрокаСоСсылкой = "{""#""," + СсылкаНаЗапись + "}";
МдСпр = Метаданные.Справочники[Число(НомерСправочника) - 1];
Спр = Справочники[МдСпр.Имя];
Если СсылкаНаЗапись = неопределено или СсылкаНаЗапись = "" Тогда
Выборка = Спр.выбрать(Спр.ПустаяСсылка());
Иначе
Выборка = Спр.выбрать(ЗначениеИзСтрокиВнутр(СтрокаСоСсылкой));
КонецЕсли;
РезультатXML = "";
Писатель = Новый XMLWriter;
Писатель.УстановитьСтроку();
Писатель.ЗаписатьОбъявлениеXML();
Писатель.ЗаписатьНачалоЭлемента("reference");
Писатель.ЗаписатьНачалоЭлемента("name");
Писатель.ЗаписатьТекст("" + МдСпр);
Писатель.ЗаписатьКонецЭлемента();
Писатель.ЗаписатьНачалоЭлемента("code");
Писатель.ЗаписатьТекст("" + НомерСправочника);
Писатель.ЗаписатьКонецЭлемента();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Писатель.ЗаписатьНачалоЭлемента("group");
Иначе
Писатель.ЗаписатьНачалоЭлемента("item");
КонецЕсли;
Писатель.ЗаписатьНачалоЭлемента("id");
СтрокаСоСсылкой = ЗначениеВСтрокуВнутр(Выборка.ссылка);
Писатель.ЗаписатьТекст(сред(СтрокаСоСсылкой, 6, СтрДлина(СтрокаСоСсылкой) - 6));
Писатель.ЗаписатьКонецЭлемента();
Писатель.ЗаписатьНачалоЭлемента("code");
Писатель.ЗаписатьТекст("" + Выборка.Код);
Писатель.ЗаписатьКонецЭлемента();
Писатель.ЗаписатьНачалоЭлемента("description");
Писатель.ЗаписатьТекст(Выборка.Наименование);
Писатель.ЗаписатьКонецЭлемента();
Писатель.ЗаписатьКонецЭлемента();
КонецЦикла;
Писатель.ЗаписатьКонецЭлемента();
РезультатXML = Писатель.Закрыть();
Трансформатор = Новый ПреобразованиеXSL;
Трансформатор.ЗагрузитьИзФайла(КаталогXSLПреобразований + "/refone.xsl");
РезультатHTML = Трансформатор.ПреобразоватьИзСтроки(РезультатXML);
Возврат РезультатHTML;
КонецФункции
У приведенной функции 2 параметра. Параметр НомерСправочника определяет справочник, из которого будут выбираться данные. Параметр СсылкаНаЗапись задает группу, элементы и вложенные группы которой необходимо получить. Если параметр СсылкаНаЗапись имеет значение неопределено, то выбираются элементы и группы верхнего уровня.
В начале этой функции выполняется выборка запрошенных данных из информационной базы. Далее выбранные данные преобразуются в XML-формат при помощи объекта XMLWriter. В результате полученные данные в XML-формате становятся значением строки РезультатXML. XML-формат является общепринятым для передачи данных сложной структуры, но он не содержит всей информации для отображения данных в Интернет-браузере.
Далее при помощи объекта ПреобразованиеXSL из полученных данных формируется html-файл. В его формировании участвует файл XSL\refone.xsl, который управляет процессом преобразования данных с использованием языка преобразования данных XSL. Полученные данные в формате html становятся значением строки РезультатHTML и возвращаются функцией в качестве значения. Остается только передать эти данные клиентскому браузеру, что и делается в ASP странице посредством строки
Копировать в буфер обменаResponse.Write(conn.getRefOne(Request.QueryString("key")(1), empty));
где значение метода getRefOne записывается в объект Response.
Аналогично работают и другие страницы. Полезно обратить внимание на приведенный ниже фрагмент ASP страницы WEB\request.asp, который является примером обработки ошибок в процессе исполнения метода внешнего соединения. Причиной ошибки может быть, например, неверно написанный запрос.
Копировать в буфер обменаtry
{
Response.Write(conn.getRequest(recTxt(1)));
}
catch (exc)
{
Response.Write("Ошибка в запросе. Исправьте и повторите еще.");
Response.Write("" + exc.description + "");
}