Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Примеры. Геокодирование.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkFAAAAf7jmJwMAHGZHrcLKDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript" ></script>
<script type="text/javascript" >
var router;
var myPoints = new Array ();
var myRouts = new Array ();
var strOpen = "OPEN" ;
var strKontr = "Kontragent" ;
var t = new YMaps.Template(
YMaps.Templates.add("my#template" , t);
var KopdinatShirota = 0 ;
var KopdinatDolgota = 0 ;
var UID_Zakaza = "" ;
/*vstavkaStiley;
var map, geoResult;
YMaps.jQuery(function () {
map = new YMaps.Map(YMaps.jQuery("#YMapsID" )[0 ]);
map.setCenter(new YMaps.GeoPoint(37.62 , 55.75 ), 12 );
});
function showAddress (value, contrag, Styles, UID) {
var geocoder = new YMaps.Geocoder(value, {results: 1 , boundedBy: map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get (0 );
var point = new YMaps.GeoPoint(geoResult._point.__lng, geoResult._point.__lat);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}else {
}
});
YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error ) {
alert("Произошла ошибка: " + error );
return null ;
})
}
function showAddressCoord (shirota, dolgota, contrag, Styles, UID) {
var point = new YMaps.GeoPoint(dolgota, shirota);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}
function removeAllOverlays (map) {
map.removeAllOverlays();
}
function AddRoute(wayPoint1, wayPoint2) {
if (myRouts.length>0 ) {lastRouter = myRouts[myRouts.length-1 ]; map.removeOverlay(lastRouter)};
var myRouter = new YMaps.Router([wayPoint1, wayPoint2], [], {viewAutoApply: true });
map.addOverlay(myRouter);
YMaps.Events.observe(myRouter, myRouter.Events.Success, function (myRouter) {
myRouter.getWayPoint(0 ).setIconContent(
myRouter.getWayPoint(1 ).setIconContent(
dlMar = myRouter.getDistance()/1000 ;
document.title =
});
myRouts.push(myRouter);
return true ;
}
function mapRazmer(map, SentrSh, SentrDlg, razmer) {
map.setCenter(new YMaps.GeoPoint(SentrSh, SentrDlg), razmer);
}
function changeStyle(numTochki, imStyle){
var restoreDefault = true ;
tochka = myPoints[numTochki];
tochka.setOptions({style: imStyle}, restoreDefault);
point = tochka.getCoordPoint();
map.setCenter(new YMaps.GeoPoint(point.__lng, point.__lat), 12 );
map.redraw();
return tochka.description;
}
</script>
</head>
<body //~~onload~~>
<div id="YMapsID" style="width:100%;height:100%" ></div>
</form>
</body>
</html>
Код вывода карты:
Код 1C v 8.х
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Макет = ПолучитьМакет( "Макет" ) ;
КодХТМЛ = Макет. ПолучитьТекст( ) ;
СтрокаСтиляНачальная = "var BurG = new YMaps.Style();
|BurG.iconStyle = new YMaps.IconStyle();
|BurG.iconStyle.offset = new YMaps.Point(-12, -12);
|BurG.iconStyle.href = "" http://www.burgerking.ru/favicon.ico"" ;
|BurG.iconStyle.size = new YMaps.Point(20, 20);
|BurG.hideIcon = false;
|BurG.balloonContentStyle = new YMaps.BalloonContentStyle("" my#template"" );" ;
СтрокаСтиляИтоговая = "" ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ВидыОбъектов.Ссылка,
| ВидыОбъектов.ПутьКИконке,
| ВидыОбъектов.Код
|ИЗ
| Справочник.ВидыОбъектов КАК ВидыОбъектов
|ГДЕ
| ВидыОбъектов.ПометкаУдаления = ЛОЖЬ" ;
Результат = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = Результат. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
времСтрокаСтиля = СтрокаСтиляНачальная;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "BurG" , "s" + Строка( ВыборкаДетальныеЗаписи. код) ) ;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "http://www.burgerking.ru/favicon.ico" , сокрЛП( ВыборкаДетальныеЗаписи. ПутьКИконке) ) ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы. ПС;
КонецЦикла ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + СтрокаСтиляНачальная + символы. ПС;
КодХТМЛ = стрЗаменить( КодХТМЛ, "/*vstavkaStiley;" , СтрокаСтиляИтоговая) ;
путьККаталогуКартинок = СтрЗаменить( КаталогПрограммы( ) , "\" , "/" ) ;
КодХТМЛ = СтрЗаменить( КодХТМЛ, "C:/" , путьККаталогуКартинок) ;
ЭлементыФормы. Карта. УстановитьТекст( КодХТМЛ) ;
табАдресов = получитьтабАдресов( ) ;
табУникальныхАдресов = табАдресов. скопировать( ) ;
табУникальныхАдресов. свернуть( "Уник" ) ;
тзДанных = табАдресов. скопировать( ) ;
табАдресов. очистить( ) ;
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура( ) ;
Отбор. Вставить( "Уник" , стр. Уник) ;
Строки = тзДанных. НайтиСтроки( Отбор) ;
НовСтр = табАдресов. добавить( ) ;
НовСтр. уник = стр. уник;
Если Строки. Количество( ) > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр. Адрес = тздстр. Адрес;
НовСтр. КД = тздстр. КД;
НовСтр. КШ = тздстр. КШ;
НовСтр. ВидОбъекта = тздстр. ВидОбъекта;
НовСтр. Наименование= Строка( НовСтр. Наименование) + Строка( тздстр. Наименование) + "; " ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. табАдресов. СоздатьКолонки( ) ;
ВыборМасштаба = "50%" ;
ВыборРегиона = "Москва" ;
ЭлементыФормы. Надпись24 . Заголовок = "Точек: " + Строка( табАдресов. количество( ) ) ;
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
Всего= Строка( табАдресов. Количество( ) ) ; н= 0 ;
Для каждого строкаАдреса Из табАдресов Цикл
н= н+ 1 ; Состояние( "Вывод " + Строка( н) + " из " + Всего) ;
УИД_Дока = Строка( н) ;
имяСтиля = "s" + Строка( строкаАдреса. ВидОбъекта. код) ;
Попытка
Если ЗначениеЗаполнено( строкаАдреса. КД) Тогда
ВызовФункции = "showAddressCoord(" + сокрЛП( строкаАдреса. КШ) + ", " + сокрЛП( строкаАдреса. КД) + ", '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
Иначе
ВызовФункции = "showAddress('" + сокрЛП( строкаАдреса. адрес) + "', '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
КонецЕсли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( ВызовФункции) ;
исключение
Сообщить( "Точка с адресом " + сокрЛП( строкаАдреса. адрес) + " не может быть отбражена на карте!" ) ;
конецПопытки
КонецЦикла ;
ТочкиНеСозданы = Ложь ;
ЭлементыФормы. Карта. ПолучитьТекст( ) ;
КонецПроцедуры
Процедура Кнопка1Нажатие(Элемент)
если ЭлементыФормы. ВыборРегиона. значение = "Москва" Тогда
СтрокаКоординат = "37.64, 55.76, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Тверь" Тогда
СтрокаКоординат = "35.90, 56.83, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Балашиха" Тогда
СтрокаКоординат = "37.97, 55.82, " ;
Иначе
СтрокаКоординат = "37.64, 55.76, " ;
конецесли ;
Если ВыборМасштаба = "" тогда
возврат ;
конецесли ;
числоМасштаба = Число( Лев( ВыборМасштаба, стрдлина( ВыборМасштаба) - 1 ) ) ;
числоМасштаба = числоМасштаба + 5 ;
ВыборМасштаба = строка( числоМасштаба) + "%" ;
ТекущийМасштаб = Строка( Цел( ( числоМасштаба/ 125 ) * ( 20 ) + 4 ) ) ;
если стрДлина( ТекущийМасштаб) = 1 тогда
ТекущийМасштаб = "0" + ТекущийМасштаб;
конецесли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( "mapRazmer(map," + СтрокаКоординат + ТекущийМасштаб + ")" ) ;
КонецПроцедуры
Пример обратного геокодирования - получение координат по адресу:
Код 1C v 8.х Процедура ПолучитьКоординаты() Экспорт
Яндекс = Новый HTTPСоединение( "geocode-maps.yandex.ru" , , , , , Истина ) ;
ВременныйФайл = КаталогВременныхФайлов( ) + "Yandex_geocode_" + СокрЛП( Новый УникальныйИдентификатор) ;
Попытка
Яндекс. Получить( "/1.x/?geocode=" + Адрес + "&results=1" , ВременныйФайл) ;
Исключение
Сообщить( "Ошибка при попытке геокодировать по яндексу адрес: " + Адрес) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ВременныйФайл) ;
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM. Прочитать( ЧтениеXML) ;
СписокText = ДокументДОМ. ПолучитьЭлементыПоИмени( "text" ) ;
СписокPos = ДокументДОМ. ПолучитьЭлементыПоИмени( "pos" ) ;
Если ( СписокText. Количество( ) = 0 ) ИЛИ ( СписокPos. Количество( ) = 0 ) Тогда
Возврат ;
КонецЕсли ;
Для ъ = 0 по СписокText. Количество( ) - 1 Цикл
Координаты = СписокPos[Ъ]. ТекстовоеСодержимое;
Разделитель = Найти( Координаты, " " ) ;
Широта = Число( Сред( Координаты, Разделитель + 1 ) ) ;
Долгота = Число( Лев( Координаты, Разделитель - 1 ) ) ;
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли ;
КД = Долгота;
КШ = Широта;
КонецЦикла ;
КонецПроцедуры
Обработка вырванная из конфигурации: YandexMap.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
В платформе с версии 8.3.6: Потоковое чтение и запись JSON:
Объекты потоковой работы - это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
Код 1C v 8.3
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON. ОткрытьФайл( "ИмяФайла" ) ;
Пока ЧтениеJSON. Прочитать( ) Цикл
TипJSON = ЧтениеJSON. ТипТекущегоЗначения;
Если TипJSON = ТипЗначенияJSON. Число ИЛИ TипJSON = ТипЗначенияJSON. Строка ИЛИ TипJSON = ТипЗначенияJSON. Булево ИЛИ TипJSON = ТипЗначенияJSON. Null Тогда
Значение = ЧтениеJSON. ТекущееЗначение;
ИначеЕсли ТипJSON = ТипЗначенияJSON. Комментарий Тогда
Комментарий = ЧтениеJSON. ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON. ИмяСвойства Тогда
ИмяСвойства = ЧтениеJSON. ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON. НачалоМассива ИЛИ TипJSON = ТипЗначенияJSON. КонецМассива ИЛИ TипJSON = ТипЗначенияJSON. НачалоОбъекта ИЛИ TипJSON = ТипЗначенияJSON. КонецОбъекта ИЛИ TипJSON = ТипЗначенияJSON. Ничего Тогда
КонеиЕсли;
КокецЦикла;
ЧтениеJSON. Закрыть( ) ;
ЗаписьJSON. ПроверятьСтруктуру = Ложь ;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( , Символы. Таб) ;
ЗаписьJSON. ОткрытьФайл( "ИмяФайла" , , , ПараметрыЗаписиJSON) ;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( , Символы. Таб) ;
ЗаписьJSON. ОткрытьФайл( "ИмяФайла" , , , ПараметрыЗаписиJSON) ;
ЗаписьJSON. ЗаписатьНачалоОбъекта( ) ;
ЗаписьJSON. ЗаписатьИмяСвойства( "СвойствоТипаМассив" ) ;
ЗаписьJSON. ЗаписатьНачалоМассива( ) ;
ЗаписьJSON. ЗаписатьИмяСвойства( "СвойствоТипаСтрока" ) ;
ЗаписьJSON. ЗаписатьЗначение( "Значение строка" ) ;
ЗаписьJSON. ЗаписатьИмяСвойства( "СвойствоТипаНеопределено" ) ;
ЗаписьJSON. ЗаписатьЗначение( Неопределено ) ;
ЗаписьJSON. ЗаписатьКонецОбъекта( ) ;
Запись JSON. ЗаписатьКонецМассива ( ) ;
ЗаписьJSON. ЗаписатьКонецОбъекта( ) ;
ЗаписьJSON. Закрыть( ) ;
Результат такой записи:
Код 1C v 8.х
{
"СвойствоТипаМассив" : [
"Значение строка" ,
1.2345 E1,
true,
{
"СвойствоТипаСтрока" : "Значение строка" ,
"СвойствоТипаНеопределено" : null
}
]
}
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
Код 1C v 8.3
[
{
"имя" : "Anton" ,
"фамилия" : "Иванов" ,
"возраст" : 25
},
{
"имя" : "Ирина" ,
"фамилия" : "Иванова" ,
"возраст" : 20
}
]
ЧтениеJSON = Новый ЧтениеJSON( ) ;
ЧтениеJSON. ОткрытьФайл( "ИмяФайла" ) ;
Сотрудники = ПрочитатьJSON( ЧтениеJSON) ;
ЧтениеJSON. Закрыть( ) ;
Для каждого Сотрудник из Сотрудники Цикл
ИмяСотрудника = Сотрудник. имя; ФамилияСотрудника = Сотрудник. фамилия; ВозрастСотрудника = Сотрудник. возраст;
КонецЦикла ;
Структура = Новый Структура;
Вставить( "Фамилия" , "Иванов" ) ;
Зставить( "Имя" , "Иван" ) ;
Вставить( "Отчество" , "Иванович" ) ;
Зставить( "Возраст" , 40 ) ;
Зставить( "Женат" , Истина ) ;
Телефоны = Новый Массив;
Телефоны. Добавить( "8-999-999-99-90" ) ;
Телефоны. Добавить( "8-999-999-99-91" ) ;
Структура. Вставить( "Телефоны" , Телефены) ;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON. ОткрытьФайл( "ИмяФайла" , , , Новый ПapaмeтpыЗaпиcиJS0N( , Символы. Таб) ) ;
ЗаписатьJSON( ЗаписьJSON, Структура) ;
ЗаписьJSON. Закрыть( ) ;
{
"Фамилия" : "Иванов" ,
"Имя" : "Иван" ,
"Отчество" : "Иванович" ,
"Возраст" : 40 ,
"Женат" : true,
"Телефоны" : [
"8-999-999-99-90" ,
"8-999-999-99-91"
]
}
Подробнее вы можете посмотреть здесь
В платформе с версии 8.3.7: Полностью автоматизировали работу с JSON и реализовали в платформе третью группу средств. Они позволяют сериализовать в JSON прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация. Конечно же, мы обеспечили и обратную операцию - десериализацию. Зачем это нужно!?
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее здесь
ДО платформы версии 8.3.6, т.е. 8.3.5 и ниже: На HelpF уже есть статья где описан пример: Работа с форматом JSON в 1С но не приведены функции, вот они:
Код 1C v 8.х Функция ПреобразоватьвСистему(Число10,система) Экспорт
Если система > 36 или система < 2 тогда
Сообщить( "Выбранная система исчисления не поддерживается" ) ;
Возврат - 1 ;
КонецЕсли ;
СтрокаЗначений = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
СтрокаСистема = "" ;
Пока Число10 > 0 цикл
РезДеления = Число10 / система;
ЧислоСистема = цел( РезДеления) ;
остатокОтДеления = Число10 - система* ( ЧислоСистема) ;
СтрокаСистема = сред( СтрокаЗначений, остатокОтДеления+ 1 , 1 ) + СтрокаСистема;
Число10 = ? ( ЧислоСистема= 0 , 0 , РезДеления) ;
КонецЦикла ;
Нечётное = стрДлина( СтрокаСистема) - цел( стрДлина( СтрокаСистема) / 2 ) * 2 ;
Если Нечётное тогда
СтрокаСистема = "0" + СтрокаСистема;
КонецЕсли ;
Возврат СтрокаСистема;
КонецФункции
Функция URLEncode(стр) Экспорт
Длина= СтрДлина( Стр) ;
Итог= "" ;
Для Н= 1 По Длина Цикл
Знак= Сред( Стр, Н, 1 ) ;
Код= КодСимвола( Знак) ;
если ( ( Знак> = "a" ) и ( Знак< = "z" ) ) или
( ( Знак> = "A" ) и ( Знак< = "Z" ) ) или
( ( Знак> = "0" ) и ( Знак< = "9" ) ) тогда
Итог= Итог+ Знак;
Иначе
Если ( Код> = КодСимвола( "А" ) ) И ( Код< = КодСимвола( "п" ) ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 208 , 16 ) + "%" + ПреобразоватьвСистему( 144 + Код- КодСимвола( "А" ) , 16 ) ;
ИначеЕсли ( Код> = КодСимвола( "р" ) ) И ( Код< = КодСимвола( "я" ) ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 209 , 16 ) + "%" + ПреобразоватьвСистему( 128 + Код- КодСимвола( "р" ) , 16 ) ;
ИначеЕсли ( Знак= "ё" ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 209 , 16 ) + "%" + ПреобразоватьвСистему( 145 , 16 ) ;
ИначеЕсли ( Знак= "Ё" ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 208 , 16 ) + "%" + ПреобразоватьвСистему( 129 , 16 ) ;
Иначе
Итог= Итог+ "%" + ПреобразоватьвСистему( Код, 16 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Возврат Итог;
КонецФункции
Функция СформироватьСтрокуJSONИзМассива(Объект)
СтрокаJSON = "[" ;
Для каждого Элемент Из Объект Цикл
Если ТипЗнч( Элемент) = Тип( "Строка" ) Тогда
СтрокаJSON = СтрокаJSON + """ " + Элемент + """ " ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Число" ) Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить( Строка( Элемент) , Символы. НПП, "" ) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Булево" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент, "БЛ=false; БИ=true" ) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Дата" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент - Дата( 1970 , 1 , 1 , 1 , 0 , 0 ) , "ЧГ=0" ) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Массив" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Структура" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "ТаблицаЗначений" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) ;
Иначе
СтрокаJSON = СтрокаJSON + """ " + URLEncode( Строка( Элемент) ) + """ " ;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + "," ;
КонецЦикла ;
Если Прав( СтрокаJSON, 1 ) = "," Тогда
СтрокаJSON = Лев( СтрокаJSON, СтрДлина( СтрокаJSON) - 1 ) ;
КонецЕсли ;
Возврат СтрокаJSON + "]" ;
КонецФункции
Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
СтрокаJSON = "{" ;
Для каждого Элемент Из Объект Цикл
Если Элемент. Значение = "" Тогда
Продолжить;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + """ " + Элемент. Ключ + """ " + ":" ;
Если ТипЗнч( Элемент. Значение) = Тип( "Строка" ) Тогда
СтрокаJSON = СтрокаJSON + """ " + Элемент. Значение + """ " ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Число" ) Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить( Строка( Элемент. Значение) , Символы. НПП, "" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Булево" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент. Значение, "БЛ=false; БИ=true" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Дата" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент. Значение - Дата( 1970 , 1 , 1 , 1 , 0 , 0 ) , "ЧГ=0" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Массив" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Структура" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "ТаблицаЗначений" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
Иначе
СтрокаJSON = СтрокаJSON + """ " + URLEncode( Строка( Элемент. Значение) ) + """ " ;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + "," ;
КонецЦикла ;
Если Прав( СтрокаJSON, 1 ) = "," Тогда
СтрокаJSON = Лев( СтрокаJSON, СтрДлина( СтрокаJSON) - 1 ) ;
КонецЕсли ;
Возврат СтрокаJSON + "}" ;
КонецФункции
Функция СформироватьСтрокуJSON(Объект) Экспорт
СтрокаJSON = "" ;
Если ТипЗнч( Объект) = Тип( "Массив" ) Тогда
СтрокаJSON = СформироватьСтрокуJSONИзМассива( Объект) ;
ИначеЕсли ТипЗнч( Объект) = Тип( "Структура" ) Тогда
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Объект) ;
ИначеЕсли ТипЗнч( Объект) = Тип( "ТаблицаЗначений" ) Тогда
СоставСтруктуры = "" ;
Для каждого Колонка Из Объект. Колонки Цикл
СоставСтруктуры = СоставСтруктуры + ? ( ЗначениеЗаполнено( СоставСтруктуры) , "," , "" ) + Колонка. Имя;
КонецЦикла ;
МассивСтрок = Новый Массив;
Для каждого Строка Из Объект Цикл
СтруктураКолонок = Новый Структура( СоставСтруктуры) ;
ЗаполнитьЗначенияСвойств( СтруктураКолонок, Строка) ;
МассивСтрок. Добавить( СтруктураКолонок) ;
КонецЦикла ;
СтрокаJSON = СформироватьСтрокуJSONИзМассива( МассивСтрок) ;
КонецЕсли ;
Возврат СтрокаJSON;
КонецФункции
Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
НомерЗначения = 0 ;
Пока ТекстJSON < > "" Цикл
ПервыйСимвол = Лев( ТекстJSON, 1 ) ;
Если ПервыйСимвол = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Структура" ) ;
Если ТипДанных = "Структура" Тогда
Результат. Вставить( "Значение" + ? ( НомерЗначения = 0 , "" , НомерЗначения) , Значение) ;
НомерЗначения = НомерЗначения + 1 ;
ИначеЕсли ТипДанных = "Массив" Тогда
Результат. Добавить( Значение) ;
КонецЕсли ;
ИначеЕсли ПервыйСимвол = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Массив" ) ;
Если ТипДанных = "Структура" Тогда
Результат. Вставить( "Значение" + ? ( НомерЗначения = 0 , "" , НомерЗначения) , Значение) ;
НомерЗначения = НомерЗначения + 1 ;
Иначе
Результат. Добавить( Значение) ;
КонецЕсли ;
ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
Если Лев( ТекстJSON, 1 ) = "," Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
КонецЕсли ;
Возврат ;
ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
Если Лев( ТекстJSON, 1 ) = "," Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
КонецЕсли ;
Возврат ;
Иначе
Если ТипДанных = "Структура" Тогда
Поз = Найти( ТекстJSON, ":" ) ;
Если Поз = 0 Тогда
Прервать ;
КонецЕсли ;
ИмяЗначения = СокрЛП( Лев( ТекстJSON, Поз- 1 ) ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз+ 1 ) ) ;
Если Лев( ТекстJSON, 1 ) = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Структура" ) ;
ИначеЕсли Лев( ТекстJSON, 1 ) = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Массив" ) ;
Иначе
Поз = 0 ;
Для Сч = 1 По СтрДлина( ТекстJSON) Цикл
Символ = Сред( ТекстJSON, Сч, 1 ) ;
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "" ;
Иначе
Значение = Лев( ТекстJSON, Поз- 1 ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз + ? ( Сред( ТекстJSON, Поз, 1 ) = "," , 1 , 0 ) ) ) ;
КонецЕсли ;
Значение = СокрЛП( Значение) ;
КонецЕсли ;
Результат. Вставить( ИмяЗначения, Значение) ;
ИначеЕсли ТипДанных = "Массив" Тогда
Поз = 0 ;
Для Сч = 1 По СтрДлина( ТекстJSON) Цикл
Символ = Сред( ТекстJSON, Сч, 1 ) ;
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "" ;
Иначе
Значение = Лев( ТекстJSON, Поз- 1 ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз + ? ( Сред( ТекстJSON, Поз, 1 ) = "," , 1 , 0 ) ) ) ;
КонецЕсли ;
Значение = СокрЛП( Значение) ;
Результат. Добавить( Значение) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
Результат = Новый Структура;
ТекстJSON = СтрЗаменить( ТекстJSON, "\"" " , """ " ) ;
ТекстJSON = СтрЗаменить( ТекстJSON, """ " , "" ) ;
Если Лев( ТекстJSON, 1 ) = "{" Тогда
ЗаполнитьДанныеИзОтветаJSON( Результат, ТекстJSON, "Структура" ) ;
ИначеЕсли Лев( ТекстJSON, 1 ) = "[" Тогда
МассивДанных = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( МассивДанных, ТекстJSON, "Массив" ) ;
Результат. Вставить( "Значение" , МассивДанных) ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Примеры их использования:
Код 1C v 8.х
Данные = Новый Структура( "server,user,hash" ,
10234 , 3745 , "8263ad83ce" ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Массив;
Данные. Добавить( "Nissan" ) ;
Данные. Добавить( "Ford" ) ;
Данные. Добавить( "Audi" ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Структура;
Данные. Добавить( "server" , 10234 ) ;
Данные. Добавить( "users" , Новый Массив) ;
Данные. Добавить( "hash" , "8263ad83ce" ) ;
Данные. users. Добавить( 3745 ) ;
Данные. users. Добавить( 7462 ) ;
Данные. users. Добавить( 2374 ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Структура;
Данные. Вставить( "server" , 10234 ) ;
Данные. Вставить( "users" , Новый Массив) ;
Данные. users. Добавить( Новый Структура( "id,name" , 3745 , "Jack" ) ) ;
Данные. users. Добавить( Новый Структура( "id,name" , 7246 , "Nick" ) ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
ТаблПользователей = Новый ТаблицаЗначений;
ТаблПользователей. Колонки. Добавить( "id" ) ;
ТаблПользователей. Колонки. Добавить( "name" ) ;
НоваяСтрока = ТаблПользователей. Добавить( ) ;
НоваяСтрока. id = 3276 ;
НоваяСтрока. name = "Jack" ;
НоваяСтрока = ТаблПользователей. Добавить( ) ;
НоваяСтрока. id = 3276 ;
НоваяСтрока. name = "Nick" ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Пишите комменты
Недавно, мой постоянный клиент решил проводить маркетинговые исследования по изменению цен на товары у конкурентов... и эти данные захотел использовать в 1С в связке с его прайс-листом + куча отчетов с графиками и процентным отклонением от цен основного конкурента
В результате этого, была написана обработка собирающая данные со страниц разных сайтов. Из целей конфиденциальности - сайты раскрывать не буду...
Вид обработки загрузки данных с сайта в 1С
Ниже код загрузки данных со страницы сайта , смысл такой :
в функция передается адрес страницы сайта полученный текст страницы обрабатывается, удаляются теги из полученного текста формируется ТЗ с данными По названию ищется поставщик из вспомогательного справочника Справочники.Pr_Поставщики.НайтиПоНаименованию(, если нет - создается на выходе ТЗ с данными Код 1C v 8.х Функция ПолучитьТаблицуДанных(Строка)
тзДанных = Новый ТаблицаЗначений;
Сервер = "site.ru" ;
Соединение = Новый HTTPСоединение( Сервер) ;
Заголовки = Новый Соответствие;
Заголовки. Вставить( "host" , Сервер) ;
ТекАдрес = СтрЗаменить( Строка. Наименование. УРЛСтраницы, "http://" , "" ) ;
ТекАдрес = СтрЗаменить( ТекАдрес, Сервер, "" ) ;
Запрос = Новый HTTPЗапрос( ТекАдрес, Заголовки) ;
Ответ = Соединение. Получить( Запрос) ;
Если Ответ. КодСостояния = 200 Тогда
Содержимое= Ответ. ПолучитьТелоКакСтроку( ) ;
НачалоБлока = "<table id=" + """ " + "table-price" + """ " + " cellspacing=" + """ " + "0" + """ " + " border=" + """ " + "1" + """ " + " bordercolor=" + """ " + "#dedede" + """ " + " class=" + """ " + "tablesorter" + """ " + " >" ;
КонецБлока = "</table>" ;
ТекстБлока = Сред( Содержимое, Найти( Содержимое, НачалоБлока) + СтрДлина( НачалоБлока) , Найти( Содержимое, КонецБлока) - Найти( Содержимое, НачалоБлока) - СтрДлина( НачалоБлока) ) ;
обрТекст = СтрЗаменить( ТекстБлока, "<tr>" , "" ) ;
обрТекст = СтрЗаменить( обрТекст, "</tr>" , Символы. ПС) ;
обрТекст = СтрЗаменить( обрТекст, " >" , ">" ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</td> <td>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th class=" + """ " + "sortable_header" + """ " + ">" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th >" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th><th>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</td><td>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, " >" , ">" ) ;
RegExp = Новый COMОбъект( "VBScript.RegExp" ) ;
RegExp. IgnoreCase = Ложь ;
RegExp. Global = Истина ;
RegExp. MultiLine = Истина ;
RegExp. Pattern = "<[^>]*>" ;
обрТекст= RegExp. Replace( обрТекст, "" ) ;
Если СокрЛП( обрТекст) = "Ни одной позиции не найдено." Тогда
Сообщить( Строка( Строка. Наименование) + " = Ни одной позиции не найдено! Строка " + Строка. Наименование) ;
Возврат тзДанных;
КонецЕсли ;
Если Найти( обрТекст, "Страница не найдена" ) > 0 Тогда
Сообщить( Строка( ТекАдрес) + " = Страница не найдена, строка " + Строка. Наименование) ;
Возврат тзДанных;
КонецЕсли ;
Для н= 1 По СтрЧислоСтрок( обрТекст) Цикл
СтрТекста= СтрПолучитьСтроку( обрТекст, н) ;
Если Найти( СтрТекста, "Длина Цена" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, "Длина Цена" , "Длина | Цена" ) ;
КонецЕсли ;
Если Найти( СтрТекста, "Марка стали Цена" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, "Марка стали Цена" , "Марка стали | Цена" ) ;
КонецЕсли ;
Если Найти( СтрТекста, ", Поставщик" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, ", Поставщик" , " | Поставщик" ) ;
КонецЕсли ;
мсДанных = ПолучитьМассивИзСтрокиСРазделителем( СтрТекста, "|" , Истина ) ;
Если н= 1 Тогда
Для Каждого ткЗнач из мсДанных Цикл
СтрЗапрещСимволов = " .,<>"" \/-" ;
ИмяКолонки = ткЗнач;
Для сч33 = 1 по СтрДлина( СтрЗапрещСимволов) Цикл
ЗапрещСимв = Сред( СтрЗапрещСимволов, сч33 , 1 ) ;
ИмяКолонки = СтрЗаменить( ИмяКолонки, ЗапрещСимв, "_" ) ;
КонецЦикла ;
Если НРег( ИмяКолонки) = "поставщик" Тогда
Для Сч_дк = ( Строка. Наименование. Родитель. Поставшик - 2 ) по тзДанных. Колонки. Количество( ) Цикл
тзДанных. Колонки. Добавить( "Колонка_" + ( тзДанных. Колонки. Количество( ) + 1 ) ) ;
КонецЦикла ;
КонецЕсли ;
тзДанных. Колонки. Добавить( ИмяКолонки) ;
КонецЦикла ;
тзДанных. Колонки. Добавить( "ном" , , , 7 ) ;
Иначе
НовСтр = тзДанных. Добавить( ) ; нмас= 0 ;
Для Каждого ткЗнач из мсДанных Цикл
НовСтр[нмас] = ткЗнач;
нмас= нмас+ 1 ;
КонецЦикла ;
НовСтр. ном = н;
КонецЕсли ;
КонецЦикла ;
тзДанных. Колонки. Добавить( "ЕстьСоответствие" , Новый ОписаниеТипов( "Булево" ) ) ;
тзДанных. Колонки. Добавить( "СпрPr_Поставщики" , Новый ОписаниеТипов( "СправочникСсылка.Pr_Поставщики" ) ) ;
Для каждого стр из тзДанных Цикл
текПоставщик = Справочники. Pr_Поставщики. НайтиПоНаименованию( стр[Строка. Наименование. родитель. Поставшик- 1 ]) ;
Если текПоставщик = Справочники. Pr_Поставщики. ПустаяСсылка( ) Тогда
НовЭлем = Справочники. Pr_Поставщики. СоздатьЭлемент( ) ;
НовЭлем. Наименование = СокрЛП( стр[Строка. Наименование. родитель. Поставшик- 1 ]) ;
НовЭлем. Записать( ) ;
текПоставщик = НовЭлем. Ссылка;
КонецЕсли ;
стр. СпрPr_Поставщики = текПоставщик;
КонецЦикла ;
Иначе
тзДанных. Колонки. Добавить( "ЕстьСоответствие" , Новый ОписаниеТипов( "Булево" ) ) ;
тзДанных. Колонки. Добавить( "СпрPr_Поставщики" , Новый ОписаниеТипов( "СправочникСсылка.Pr_Поставщики" ) ) ;
Сообщить( "Ошибка получения данных для строки " + Строка. Наименование) ;
КонецЕсли ;
Возврат тзДанных;
КонецФункции
В коде используется вспомогательная функция ПолучитьМассивИзСтрокиСРазделителем
Код 1C v 8.2 УП
Функция ПолучитьМассивИзСтрокиСРазделителем(Знач Стр, Разделитель = "." , ОбрезатьНепечатныеСимволы = Ложь) Экспорт
МассивСтрок = Новый Массив;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
Фрагмент = Стр;
Если ОбрезатьНепечатныеСимволы Тогда
Фрагмент = СокрЛП( Фрагмент) ;
КонецЕсли ;
МассивСтрок. Добавить( Фрагмент) ;
Возврат МассивСтрок;
КонецЕсли ;
Фрагмент = Лев( Стр, Поз- 1 ) ;
Если ОбрезатьНепечатныеСимволы Тогда
Фрагмент = СокрЛП( Фрагмент) ;
КонецЕсли ;
МассивСтрок. Добавить( Фрагмент) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
Возврат МассивСтрок;
КонецФункции
Конечно, перед тем как мы начали это делать - прошерстили интернет и нашли несколько решений , вот они:
Код 1C v 8.х Соединение = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ИмяВременногоФайла= ПолучитьИмяВременногоФайла( "htm" ) ;
Соединение. open( "GET" , "http://mamba.ru/my" , 0 ) ;
Соединение. send( ) ;
ТаймАут = 200 ;
Начало= ТекущаяДата( ) ;
Пока Соединение. readyState < > 4 И ( ТаймАут= 0 ИЛИ ТекущаяДата( ) - Начало< ТаймАут) Цикл
бфДиалоги. ксОбработкаПрерыванияПользователя( ) ;
КонецЦикла ;
обСохранитьДвоичныйБуферВФайл( Соединение. responseBody, ИмяВременногоФайла) ;
Соединение. open( "POST" , "http://mamba.ru/my" ) ;
Соединение. send( "login=xxx&password=&&&" ) ;
Функция обСохранитьДвоичныйБуферВФайл(Буфер, ИмяФайла) Экспорт
Поток = Новый COMОбъект( "ADODB.Stream" ) ;
Поток. Type = 1 ;
Поток. Mode = 3 ;
Поток. Open( ) ;
Поток. Write( Буфер) ;
Поток. SaveToFile( ИмяФайла) ;
Поток. Close( ) ;
КонецФункции
Код 1C v 8.х НТТР = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ИмяФайлаОтвета = КаталогВременныхФайлов( ) + "filename.tmp" ;
НТТР. open( "GET" , "www.google.com" , 0 , , ) ;
НТТР. send( ) ;
StreamTypeEnum = Новый Структура( "adTypeBinary, adTypeText" , 1 , 2 ) ;
ConnectModeEnum = Новый Структура(
"adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
|adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
|adModeUnknown, adModeWrite" , 1 , 3 , 4194304 , 16 , 4 , 8 , 12 , 0 , 2 ) ;
SaveOptionsEnum = Новый Структура( "adSaveCreateNotExist, adSaveCreateOverWrite" , 1 , 2 ) ;
StreamOut = Новый COMОбъект( "ADODB.Stream" ) ;
StreamOut. Type = StreamTypeEnum. adTypeBinary;
StreamOut. Mode = ConnectModeEnum. adModeReadWrite;
StreamOut. Open( ) ;
StreamOut. Write( НТТР. responseBody) ;
StreamOut. SaveToFile( ИмяФайлаОтвета, SaveOptionsEnum. adSaveCreateOverWrite) ;
StreamOut. Close( ) ;
И даже не этом сайте есть статья : Парсер сайта связного на 1С
Нужен парсер сайта в 1С!? - Обращайтесь, контакты в
профиле Обработка демонстрирует возможности интеграции 1С с картографическими сервисами, в ней поддерживается работа трех поставщиков услуг / карт — Яндекс, Google. Рамблер.
Автор: Діма Головаченко - http://smaylukk.com.ua
но так вот сама обработка + еще 2 :
Скачивать файлы может только зарегистрированный пользователь!
Код Модуля Обработки:
Код 1C v 8.х Перем СтруктураПоставщиковКарт Экспорт ;
Перем СтруктураЧисел;
Функция СформироватьСтрокуJSONИзМассива(Объект)
СтрокаJSON = "[" ;
Для каждого Элемент Из Объект Цикл
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) + "," ;
КонецЦикла ;
Если Прав( СтрокаJSON, 1 ) = "," Тогда
СтрокаJSON = Лев( СтрокаJSON, СтрДлина( СтрокаJSON) - 1 ) ;
КонецЕсли ;
Возврат СтрокаJSON + "]" ;
КонецФункции
Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
СтрокаJSON = "{" ;
Для каждого Элемент Из Объект Цикл
Если Элемент. Значение = "" Тогда
Продолжить;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + """ " + Элемент. Ключ + """ " + ":" ;
Если ТипЗнч( Элемент. Значение) = Тип( "Строка" ) Тогда
СтрокаJSON = СтрокаJSON + """ " + URLEncode( Элемент. Значение) + """ " ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Число" ) Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить( Строка( Элемент. Значение) , Символы. НПП, "" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Булево" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент. Значение, "БЛ=false; БИ=true" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Дата" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( ТекущаяДата( ) - Дата( 1970 , 1 , 1 , 1 , 0 , 0 ) , "ЧГ=0" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Массив" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Структура" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "ТаблицаЗначений" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
Иначе
СтрокаJSON = СтрокаJSON + """ " + URLEncode( Строка( Элемент. Значение) ) + """ " ;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + "," ;
КонецЦикла ;
Если Прав( СтрокаJSON, 1 ) = "," Тогда
СтрокаJSON = Лев( СтрокаJSON, СтрДлина( СтрокаJSON) - 1 ) ;
КонецЕсли ;
Возврат СтрокаJSON + "}" ;
КонецФункции
Функция СформироватьСтрокуJSON(Объект) Экспорт
СтрокаJSON = "" ;
Если ТипЗнч( Объект) = Тип( "Массив" ) Тогда
СтрокаJSON = СформироватьСтрокуJSONИзМассива( Объект) ;
ИначеЕсли ТипЗнч( Объект) = Тип( "Структура" ) Тогда
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Объект) ;
ИначеЕсли ТипЗнч( Объект) = Тип( "ТаблицаЗначений" ) Тогда
СоставСтруктуры = "" ;
Для каждого Колонка Из Объект. Колонки Цикл
СоставСтруктуры = СоставСтруктуры + ? ( ЗначениеЗаполнено( СоставСтруктуры) , "," , "" ) + Колонка. Имя;
КонецЦикла ;
МассивСтрок = Новый Массив;
Для каждого Строка Из Объект Цикл
СтруктураКолонок = Новый Структура( СоставСтруктуры) ;
ЗаполнитьЗначенияСвойств( СтруктураКолонок, Строка) ;
МассивСтрок. Добавить( СтруктураКолонок) ;
КонецЦикла ;
СтрокаJSON = СформироватьСтрокуJSONИзМассива( МассивСтрок) ;
КонецЕсли ;
Возврат СтрокаJSON;
КонецФункции
Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
НомерЗначения = 0 ;
Пока ТекстJSON < > "" Цикл
ПервыйСимвол = Лев( ТекстJSON, 1 ) ;
Если ПервыйСимвол = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Структура" ) ;
Если ТипДанных = "Структура" Тогда
Результат. Вставить( "Значение" + ? ( НомерЗначения = 0 , "" , НомерЗначения) , Значение) ;
НомерЗначения = НомерЗначения + 1 ;
ИначеЕсли ТипДанных = "Массив" Тогда
Результат. Добавить( Значение) ;
КонецЕсли ;
ИначеЕсли ПервыйСимвол = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Массив" ) ;
Если ТипДанных = "Структура" Тогда
Результат. Вставить( "Значение" + ? ( НомерЗначения = 0 , "" , НомерЗначения) , Значение) ;
НомерЗначения = НомерЗначения + 1 ;
Иначе
Результат. Добавить( Значение) ;
КонецЕсли ;
ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
Если Лев( ТекстJSON, 1 ) = "," Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
КонецЕсли ;
Возврат ;
ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
Если Лев( ТекстJSON, 1 ) = "," Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
КонецЕсли ;
Возврат ;
Иначе
Если ТипДанных = "Структура" Тогда
Поз = Найти( ТекстJSON, ":" ) ;
Если Поз = 0 Тогда
Прервать ;
КонецЕсли ;
ИмяЗначения = СокрЛП( Лев( ТекстJSON, Поз - 1 ) ) ;
ИмяЗначения = СтрЗаменить( ИмяЗначения, """ " , "" ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз+ 1 ) ) ;
Если Лев( ТекстJSON, 1 ) = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Структура" ) ;
ИначеЕсли Лев( ТекстJSON, 1 ) = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Массив" ) ;
Иначе
ПервыйКавычка = Ложь ;
ПредпоследнийКавычка = Ложь ;
Поз = 0 ;
Для Сч = 1 По СтрДлина( ТекстJSON) Цикл
Символ = Сред( ТекстJSON, Сч, 1 ) ;
Если Символ = """ " Тогда
Если ПервыйКавычка Тогда
ПредпоследнийКавычка = Истина ;
Иначе
ПервыйКавычка = Истина ;
КонецЕсли ;
КонецЕсли ;
Если ( Символ = "," И ( ( ПервыйКавычка И ПредпоследнийКавычка) Или ( Не ПервыйКавычка И Не ПредпоследнийКавычка) ) ) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "" ;
Иначе
Значение = Лев( ТекстJSON, Поз - 1 ) ;
Значение = СтрЗаменить( Значение, """ " , "" ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз + ? ( Сред( ТекстJSON, Поз, 1 ) = "," , 1 , 0 ) ) ) ;
КонецЕсли ;
Значение = СокрЛП( Значение) ;
КонецЕсли ;
Результат. Вставить( ИмяЗначения, Значение) ;
ИначеЕсли ТипДанных = "Массив" Тогда
Поз = 0 ;
Для Сч = 1 По СтрДлина( ТекстJSON) Цикл
Символ = Сред( ТекстJSON, Сч, 1 ) ;
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "" ;
Иначе
Значение = Лев( ТекстJSON, Поз - 1 ) ;
Значение = СтрЗаменить( Значение, """ " , "" ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз + ? ( Сред( ТекстJSON, Поз, 1 ) = "," , 1 , 0 ) ) ) ;
КонецЕсли ;
Значение = СокрЛП( Значение) ;
Результат. Добавить( Значение) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
Результат = Новый Структура;
ТекстJSON = СтрЗаменить( ТекстJSON, "\"" " , """ " ) ;
Если Лев( ТекстJSON, 1 ) = "{" Тогда
ЗаполнитьДанныеИзОтветаJSON( Результат, ТекстJSON, "Структура" ) ;
ИначеЕсли Лев( ТекстJSON, 1 ) = "[" Тогда
МассивДанных = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( МассивДанных, ТекстJSON, "Массив" ) ;
Результат. Вставить( "Значение" , МассивДанных) ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Функция КодСимволаASCII(Символ)
КодUNICODE = КодСимвола( Символ) ;
Если ( ( КодUNICODE > 1039 ) И ( КодUNICODE < 1104 ) ) Тогда
Возврат ( КодUNICODE - 848 ) ;
ИначеЕсли КодUNICODE = 8470 Тогда
Возврат 185 ;
ИначеЕсли КодUNICODE = 1105 Тогда
Возврат 184 ;
ИначеЕсли КодUNICODE = 1025 Тогда
Возврат 168 ;
Иначе
Возврат КодUNICODE;
КонецЕсли ;
КонецФункции
Функция URLEncode(value)
table = "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14" +
"%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28" +
"%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37%38%39%3A%3B%3C" +
"%3D%3E%3F%40%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50" +
"%51%52%53%54%55%56%57%58%59%5A%5B%5C%5D%5E%5F%60%61%62%63%64" +
"%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78" +
"%79%7A%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C" +
"%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0" +
"%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4" +
"%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8" +
"%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC" +
"%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0" +
"%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF" ;
result = "" ;
length = СтрДлина( value ) ;
Для i = 1 По length Цикл
symbol = Сред( value, i, 1 ) ;
code = КодСимволаASCII( symbol ) ;
result = result + Сред( table, code* 3 + 1 , 3 ) ;
КонецЦикла ;
Возврат result;
КонецФункции
Функция UnicodeEncode(Строка) Экспорт
Результат = Истина ;
Попытка
Рег = Новый COMОбъект( "VBScript.RegExp" ) ;
Рег. IgnoreCase = Истина ;
Рег. Global = Истина ;
Рег. Multiline = Ложь ;
Рег. Pattern = "u[0-9a-f]+" ;
Колекция = Рег. Execute( Строка) ;
Для Каждого Элемент Из Колекция Цикл
Если СтрДЛина( Элемент. value) = 1 Тогда
Продолжить;
КонецЕсли ;
КодСимвола = ПереводЧислаИз16 в10 ( Сред( ВРег( Элемент. value) , 2 ) ) ;
Символ = Символ( КодСимвола) ;
Строка = СтрЗаменить( Строка, "\" + Элемент. value, Символ) ;
КонецЦикла ;
Исключение
Результат = Ложь ;
Сообщить( "Ошибка преобразования из Unicode" , СтатусСообщения. Информация) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПереводЧислаИз16в10(Знач Значение)
Результат = 0 ;
Если ТипЗнч( Значение) < > Тип( "Строка" ) Тогда
Значение = СокрЛП( Строка( Значение) ) ;
КонецЕсли ;
МаксРазрядЦелых = 0 ;
МаксРазрядЦелых = СтрДлина( Значение) - 1 ;
н = МаксРазрядЦелых;
Ин = 1 ;
Пока н > = 0 Цикл
ТекЗначение = СтруктураЧисел. Получить( Сред( Значение, Ин, 1 ) ) * Pow( 16 , н) ;
Результат = Результат + ТекЗначение;
н = н - 1 ;
Ин = Ин + 1 ;
КонецЦикла ;
Возврат Результат;
КонецФункции
СтруктураПоставщиковКарт = Новый Соответствие;
СтруктураПоставщиковКарт. Вставить( 0 , "Яндекс" ) ;
СтруктураПоставщиковКарт. Вставить( 1 , "Гугл" ) ;
СтруктураПоставщиковКарт. Вставить( 2 , "2ГИС" ) ;
СтруктураПоставщиковКарт. Вставить( 3 , "Рамблер" ) ;
СтруктураЧисел = Новый Соответствие;
СтруктураЧисел. Вставить( "0" , 0 ) ;
СтруктураЧисел. Вставить( "1" , 1 ) ;
СтруктураЧисел. Вставить( "2" , 2 ) ;
СтруктураЧисел. Вставить( "3" , 3 ) ;
СтруктураЧисел. Вставить( "4" , 4 ) ;
СтруктураЧисел. Вставить( "5" , 5 ) ;
СтруктураЧисел. Вставить( "6" , 6 ) ;
СтруктураЧисел. Вставить( "7" , 7 ) ;
СтруктураЧисел. Вставить( "8" , 8 ) ;
СтруктураЧисел. Вставить( "9" , 9 ) ;
СтруктураЧисел. Вставить( "A" , 10 ) ;
СтруктураЧисел. Вставить( "B" , 11 ) ;
СтруктураЧисел. Вставить( "C" , 12 ) ;
СтруктураЧисел. Вставить( "D" , 13 ) ;
СтруктураЧисел. Вставить( "E" , 14 ) ;
СтруктураЧисел. Вставить( "F" , 15 ) ;
Код Формы Управляемой:
Код 1C v 8.2 УП
&НаКлиенте
Процедура НайтиАдрес(Команда)
НайтиАдресНаКарте(ТекАдрес);
КонецПроцедуры
&НаКлиенте
Процедура ИнициализацияКарты(Команда)
ИнициализироватьКарту();
КонецПроцедуры
&НаКлиенте
Процедура СправочнаяИнформация(Команда)
Элементы.ГруппаСправка.Видимость = Не Элементы.ГруппаСправка.Видимость;
КонецПроцедуры
&НаКлиенте
Процедура Разработчик(Команда)
ЗапуститьПриложение("http://smaylukk.com.ua/?lang=Ru");
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ТипКарты = Параметры.ТипКарты;
ТекОбъект = РеквизитФормыВЗначение("Объект");
Поставщик = ТекОбъект.СтруктураПоставщиковКарт.Получить(Объект.ТипКарты);
Макет = ТекОбъект.ПолучитьМакет("Справка");
ТекстСправки = Макет.ПолучитьОбласть("Справка" + Поставщик).Область().Текст;
Справка = ТекстСправки;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.ГруппаСправка.Видимость = Ложь;
Заголовок = "Работа с картами. Поставщик - " + Поставщик;
ИнициализироватьКарту();
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
//удаление временных файлов
Для Каждого ТекЭлемент Из МассивВременныхФайлов Цикл
УдалитьФайлы(ТекЭлемент.Значение);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
//Процедура составляет имя процедуры поставщика
// и запускает ее на исполнение
//Параметры:
// НачалоИмени - Строка
Процедура ВыполнитьПроцедуруПоставщика(ИмяПроцедуры)
Выполнить ИмяПроцедуры;
КонецПроцедуры
&НаКлиенте
//процедура инициализирует карту постащика из макета
Процедура ИнициализироватьКарту()
Текст = ПолучитьТекстМакета("Макет" + Поставщик);
Эксплорер = Текст;
КонецПроцедуры
&НаСервере
Функция ПолучитьТекстМакета(ИмяМакета)
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
Результат = Макет.ПолучитьТекст();
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОчисткаКарты()
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "Reset()";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
///////////////////////////////////////////////////////////////////////
///////////////////ГЕОКОДИРОВАНИЕ И ПОИСК АДРЕСА///////////////////////
///////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура НайтиАдресНаКарте(Адрес = "")
//поиск адреса
Если Адрес = "" Тогда
Адрес = "Москва";
КонецЕсли;
// дальше пробуем с помощью геокодинга вывести данные поиска в таблицу
ТаблицаАдресов.Очистить();
ПоискАдреса(Адрес);
Если Поставщик = "Яндекс" Тогда
ПроизвестиГеокодинг_Яндекс();
ИначеЕсли Поставщик = "Гугл" Тогда
ПроизвестиГеокодинг_Гугл();
ИначеЕсли Поставщик = "Рамблер" Тогда
ПроизвестиГеокодинг_Рамблер();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоискАдреса(Адрес)
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "FindAdres(""" + Адрес + """);";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаСервере
//Процедура выводит в таблицу данные геокдинга Яндекса
//
//Параметры:
// ТекАдрес - Строка
Процедура ПроизвестиГеокодинг_Яндекс()
Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru");
ВременныйФайл = КаталогВременныхФайлов() + "Yandex_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Яндекс.Получить("/1.x/?geocode=" + ТекАдрес + "&results=10", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по яндексу адрес: " + ТекАдрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ВременныйФайл);
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
СписокText = ДокументДОМ.ПолучитьЭлементыПоИмени("text");
СписокPos = ДокументДОМ.ПолучитьЭлементыПоИмени("pos");
Если (СписокText.Количество() = 0) ИЛИ (СписокPos.Количество() = 0) Тогда
Возврат;
КонецЕсли;
Для ъ = 0 по СписокText.Количество()-1 Цикл
Координаты = СписокPos[Ъ].ТекстовоеСодержимое;
Разделитель = Найти(Координаты," ");
Широта = Число(Сред(Координаты, Разделитель + 1));
Долгота = Число(Лев(Координаты, Разделитель - 1));
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли;
стрАдрес = ТаблицаАдресов.Добавить();
Если СписокText.Количество() > ъ Тогда
стрАдрес.Адрес = СписокText[Ъ].ТекстовоеСодержимое;
стрАдрес.Широта = Широта;
стрАдрес.Долгота = Долгота;
КонецЕсли;
КонецЦикла;
МассивВременныхФайлов.Добавить(ВременныйФайл);
КонецПроцедуры
&НаСервере
//Процедура выводит в таблицу данные геокдинга Гугл
//
//Параметры:
// ТекАдрес - Строка
Процедура ПроизвестиГеокодинг_Гугл()
Гугл = Новый HTTPСоединение("maps.googleapis.com");
ВременныйФайл = КаталогВременныхФайлов() + "Google_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Гугл.Получить("/maps/api/geocode/xml?address=" + ТекАдрес + "&language=ru&sensor=false", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по Google адрес: " + ТекАдрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ВременныйФайл);
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
ТаблицаРезультатов = ДокументДОМ.ПолучитьЭлементыПоИмени("result");
Если ДокументДОМ.ПолучитьЭлементыПоИмени("status")[0].ТекстовоеСодержимое <> "OK" ИЛИ ТаблицаРезультатов.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для ТекРезультат = 0 по ТаблицаРезультатов.Количество() -1 Цикл
СписокText = ТаблицаРезультатов[ТекРезультат].ПолучитьЭлементыПоИмени("formatted_address");
ЭлементыШиротаДолгота = ТаблицаРезультатов[ТекРезультат].ПолучитьЭлементыПоИмени("location");
Широта = ЭлементыШиротаДолгота[0].ПолучитьЭлементыПоИмени("lat")[0].ТекстовоеСодержимое;
Долгота = ЭлементыШиротаДолгота[0].ПолучитьЭлементыПоИмени("lng")[0].ТекстовоеСодержимое;
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли;
стрАдрес = ТаблицаАдресов.Добавить();
стрАдрес.Широта = Широта;
стрАдрес.Долгота = Долгота;
стрАдрес.Адрес = СписокText[0].ТекстовоеСодержимое;
КонецЦикла;
МассивВременныхФайлов.Добавить(ВременныйФайл);
КонецПроцедуры
&НаСервере
//Процедура выводит в таблицу данные геокдинга Рамблер
//
//Параметры:
// ТекАдрес - Строка
Процедура ПроизвестиГеокодинг_Рамблер()
ТемпАдрес = СтрЗаменить(ТекАдрес, " ", "+");
Рамблер = Новый HTTPСоединение("maps.rambler.ru");
ВременныйФайл = КаталогВременныхФайлов() + "Рамблер_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Рамблер.Получить("/search/?&a=search&q=" + ТемпАдрес + "&n=10", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по Рамблер адрес: " + ТекАдрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
а = 1;
Т = Новый ТекстовыйДокумент;
Т.Прочитать(ВременныйФайл);
СтрокаОтвет = Т.ПолучитьТекст();
Результат = РеквизитФормыВЗначение("Объект").UnicodeEncode(СтрокаОтвет);
Если Результат Тогда
СтруктураJSON = РеквизитФормыВЗначение("Объект").ЗаполнитьСтруктуруИзОтветаJSON(СтрокаОтвет);
КонецЕсли;
МассивРезультатов = СтруктураJSON.res;
//обрабатываем элементы массива - только адреса. POI можно обработать отдельно пожеланию
Для Каждого Результат Из МассивРезультатов Цикл
Для Каждого ТекРезультат Из Результат.matches Цикл
стрАдрес = ТаблицаАдресов.Добавить();
стрАдрес.Долгота = Число(ТекРезультат.x);
стрАдрес.Широта = Число(ТекРезультат.y);
Если Результат.type = "addr" Тогда //Результат.type = "poi" - содержит в себе список точек интереса
стрАдрес.Адрес = ТекРезультат.addr;
Иначе
стрАдрес.Адрес = ТекРезультат.name + " - " + ТекРезультат.addr;
КонецЕсли;
КонецЦикла;
КонецЦикла;
МассивВременныхФайлов.Добавить(ВременныйФайл);
КонецПроцедуры
&НаКлиенте
Процедура ОбратнПоискАдреса(Широта, Долгота, Адрес)
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "ReverseSearchAdres(" + Широта + "," + Долгота + ", """ + Адрес + """);";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаАдресовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ТаблицаАдресов[ВыбраннаяСтрока].Широта) И ЗначениеЗаполнено(ТаблицаАдресов[ВыбраннаяСтрока].Долгота) Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
Широта = Формат(ТаблицаАдресов[ВыбраннаяСтрока].Широта, "ЧЦ=10; ЧДЦ=7; ЧРД=.; ЧРГ=");
Долгота = Формат(ТаблицаАдресов[ВыбраннаяСтрока].Долгота, "ЧЦ=10; ЧДЦ=7; ЧРД=.; ЧРГ=");
ОбратнПоискАдреса(Широта, Долгота, ТаблицаАдресов[ВыбраннаяСтрока].Адрес);
КонецПроцедуры
&НаКлиенте
Процедура ТекАдресПриИзменении(Элемент)
НайтиАдресНаКарте(ТекАдрес);
КонецПроцедуры
///////////////////////////////////////////////////////////////////////
///////////////////МАРШРУТИЗАЦИЯ, КЛАСТЕРА И ПОЛИГОН///////////////////////////////////////
///////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ЭксплорерПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
ПолучитьКоординаты();
КонецПроцедуры
&НаКлиенте
Процедура ПостроитьМаршрут(Команда)
Если ТаблицаТочек.Количество() <= 1 Тогда
Предупреждение("Недостаточно точек для построение маршрута!");
Возврат;
КонецЕсли;
Если Поставщик = "Яндекс" Тогда
ПостроитьМаршрут_Яндекс();
ИначеЕсли Поставщик = "Гугл" Тогда
ПостроитьМаршрут_Гугл();
ИначеЕсли Поставщик = "Рамблер" Тогда
ПостроитьМаршрут_Рамблер();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
//Процедура выстраивает маршрут для Яндекса
//
//Параметры:
//
Процедура ПостроитьМаршрут_Яндекс()
ПараметрыМаршрута = ПолучитьПараметрыМаршрутаЯндекс();
ОчисткаКарты();
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "calcRoute(" + ПараметрыМаршрута + ")";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
//Функция получает массив точек, для передачи параметров в Яндекс
//
//Параметры:
//
//Возвращаемое значение:
// Строка
Функция ПолучитьПараметрыМаршрутаЯндекс()
Результат = "";
Результат = Результат + "[[" + СтрЗаменить(Строка(ТаблицаТочек[0].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[0].Долгота), ",", ".") + "],";
Для Ин = 1 По ТаблицаТочек.Количество() - 2 Цикл
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ин].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ин].Долгота), ",", ".") + "],";
КонецЦикла;
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Долгота), ",", ".") + "]]";
Возврат Результат;
КонецФункции
&НаКлиенте
//Процедура выстраивает маршрут для Гугл
//
//Параметры:
//
Процедура ПостроитьМаршрут_Гугл()
ПараметрыМаршрута = ПолучитьПараметрыМаршрутаГугл();
ОчисткаКарты();
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "calcRoute(" + ПараметрыМаршрута + ")";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
//Функция получает массив точек, для передачи параметров в Гугл
//
//Параметры:
//
//Возвращаемое значение:
// Строка
Функция ПолучитьПараметрыМаршрутаГугл()
Результат = "";
ВнутрМассив = "";
Результат = Результат + "[[" + СтрЗаменить(Строка(ТаблицаТочек[0].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[0].Долгота), ",", ".") + "],";
Если ТаблицаТочек.Количество() = 2 Тогда
Результат = Результат + "[],";
Иначе
Для Ин = 1 По ТаблицаТочек.Количество() - 2 Цикл
ВнутрМассив = ВнутрМассив + "[" + СтрЗаменить(Строка(ТаблицаТочек[ин].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ин].Долгота), ",", ".") + "],";
КонецЦикла;
Результат = Результат + "[" + Сред(ВнутрМассив, 1, СтрДлина(ВнутрМассив) - 1) + "],";
КонецЕсли;
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Долгота), ",", ".") + "]]";
Возврат Результат;
КонецФункции
&НаКлиенте
//Процедура выстраивает маршрут для Рамблера
//
//Параметры:
//
Процедура ПостроитьМаршрут_Рамблер()
ПараметрыМаршрута = ПолучитьПараметрыМаршрутаРамблер();
ОчисткаКарты();
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "calcRoute(" + ПараметрыМаршрута + ")";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
//Функция получает массив точек, для передачи параметров в Рамблер
//
//Параметры:
//
//Возвращаемое значение:
// Строка
Функция ПолучитьПараметрыМаршрутаРамблер()
Результат = "";
Результат = Результат + "[[" + СтрЗаменить(Строка(ТаблицаТочек[0].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[0].Долгота), ",", ".") + "],";
Для Ин = 1 По ТаблицаТочек.Количество() - 2 Цикл
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ин].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ин].Долгота), ",", ".") + "],";
КонецЦикла;
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Долгота), ",", ".") + "]]";
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура СоздатьКластер(Команда)
Если ТаблицаТочек.Количество() <= 1 Тогда
Предупреждение("Недостаточно точек для построение кластера!");
Возврат;
КонецЕсли;
ОчисткаКарты();
ПостроитьКластера();
КонецПроцедуры
&НаКлиенте
Процедура ПостроитьКластера()
Кол = ТаблицаТочек.Количество();
Индекс = 1;
Для Каждого ТекСтрока Из ТаблицаТочек Цикл
Широта = формат(ТекСтрока.Широта, "ЧРД=.");
Долгота = формат(ТекСтрока.Долгота, "ЧРД=.");
СодержимоеТочки = "Содерижмое точки"; //опять же можно вставить свое название
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "addToPointArray(" + Широта + "," + Долгота + ", '" + ТекСтрока.Точка + "', """ + СодержимоеТочки + """);";
Элементы.Эксплорер.document.getElementById("WebClient").click();
Состояние("Обработан " + Индекс + " из " + кол);
Индекс = Индекс + 1;
КонецЦикла;
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "drawCluster();";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьВсе(Команда)
ОчисткаКарты();
ТаблицаТочек.Очистить();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьКарту(Команда)
ОчисткаКарты();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьТаблицу(Команда)
ТаблицаТочек.Очистить();
КонецПроцедуры
&НаКлиенте
//Процедура получает координаты установленной точки
Процедура ПолучитьКоординаты()
Попытка
ЧислоТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 12));
КоординатаX = Элементы.Эксплорер.document.getElementById("CoordX").value;
КоординатаX = ЧислоТип.ПривестиЗначение(КоординатаX);
КоординатаY = Элементы.Эксплорер.document.getElementById("CoordY").value;
КоординатаY = ЧислоТип.ПривестиЗначение(КоординатаY);
Кол = ТаблицаТочек.Количество();
Если КоординатаX > 0 И КоординатаY > 0 И (Кол = 0 Или КоординатаX <> ТаблицаТочек[Кол - 1].Широта И КоординатаY <> ТаблицаТочек[Кол - 1].Долгота) Тогда
НоваяСтрока = ТаблицаТочек.Добавить();
НоваяСтрока.Точка = "Точка" + ТаблицаТочек.Количество();
НоваяСтрока.Широта = КоординатаX;
НоваяСтрока.Долгота = КоординатаY;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПострениеПолигона(Команда)
Если ТаблицаТочек.Количество() <= 1 Тогда
Предупреждение("Недостаточно точек для построение полигона!");
Возврат;
КонецЕсли;
ОчисткаКарты();
ПостроитьПолигон();
КонецПроцедуры
&НаКлиенте
//Процедура выстраивает маршрут для Рамблера
//
//Параметры:
//
Процедура ПостроитьПолигон()
МассивТочек = "[";
Для Каждого ТекТочка Из ТаблицаТочек Цикл
Широта = формат(ТекТочка.Широта, "ЧРД=.");
Долгота = формат(ТекТочка.Долгота, "ЧРД=.");
МассивТочек = МассивТочек + "[" + Широта + "," + Долгота + "],";
КонецЦикла;
МассивТочек = Сред(МассивТочек, 1, СтрДлина(МассивТочек) - 1) + "]";
Цвет16 = Получить16Цвет();
Название = "Полигон";//вставить свое
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "createPolygon(" + МассивТочек + ", '" + Название + "', '" + Цвет16 + "');";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаСервере
//Функция возвращает значение случайного цвета в 16-ричном формате
//
//Параметры:
// нет
//Возвращаемое значение:
// Строка
Функция Получить16Цвет()
Результат = "";
Строка16 = "0123456789ABCDEF";
ГСЧ = Новый ГенераторСлучайныхЧисел;
Результат = "#";
Для н = 1 По 6 Цикл
м = ГСЧ.СлучайноеЧисло(1, 16);
Результат = Результат + Сред(Строка16, м, 1);
КонецЦикла;
Возврат Результат;
КонецФункции
Возникла задача отправлять счета почтой. PDFcreator не подошёл поскольку не удалось вместить счёт на одну страницу по ширине. Решил попробовать OpenOffice. Как сохранять в PDF нашёл быстро, а вот как уместить счёт на одну страницу вширь искал долго.
В версии 1С 8.2.232 появилась возможность сохранять табличный документ в xls файл на сервера под линуксом. А вот работать с Опеном офисом из-под линукса пока не получается. Собственно комментари ненужны. Вот весь код. Самое интересное это бодание со стилями страниц в Опене Офисе. Жаль что этот фрагмент работает только на клиенте. На сервере вопрос не решается *08
Код 1C v 8.2 УП Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Письмо. Основание. Пустая( ) Тогда
Возврат
КонецЕсли ;
Попытка
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Исключение
Возврат
КонецПопытки ;
Заказ = Письмо. Основание. ПолучитьОбъект( ) ;
Расшифровка= Новый Структура;
Расшифровка. Вставить( "СсылкаНаВнешнююОбработку" , Константы. ПФСчетаДляКлиента. Получить( ) ) ;
Расшифровка. Вставить( "ВидПечатнойФормы" , Перечисления. ВидыДополнительныхВнешнихОбработок. ПечатнаяФорма) ;
Расшифровка. Вставить( "НомерСтроки" , 1 ) ;
тд = УниверсальныеМеханизмы. НапечататьВнешнююФорму( Заказ, Расшифровка) ;
ВременныйФайл = ПолучитьИмяВременногоФайла( ) ;
ВременныйФайлXLS = ВременныйФайл + ".xls" ;
ВременныйФайлPDF = ВременныйФайл + ".pdf" ;
тд. Записать( ВременныйФайлXLS, ТипФайлаТабличногоДокумента. XLS97) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
НастройкиОткрытия = Новый COMSafeArray( "VT_VARIANT" , 1 ) ;
PropertyValue = ServiceManager. Bridge_GetStruct( "com.sun.star.beans.PropertyValue" ) ;
PropertyValue. Name = "Hidden" ;
PropertyValue. Value = Истина ;
НастройкиОткрытия. SetValue( 0 , PropertyValue) ;
ВременныйФайлXLS_какУРЛ = "file:///" + СтрЗаменить( ВременныйФайлXLS, "\" , "/" ) ;
ОпенОфис = Desktop. LoadComponentFromURL( ВременныйФайлXLS_какУРЛ, "_blank" , 0 , НастройкиОткрытия) ;
Стили = ОпенОфис. StyleFamilies. getByName( "PageStyles" ) ;
Для поз = 0 по Стили. count - 1 Цикл
МойСтиль = Стили. getByIndex( поз) ;
МойСтиль. ScaleToPagesX = 1 ;
КонецЦикла ;
НастройкиСохранения = Новый COMSafeArray( "VT_VARIANT" , 1 ) ;
PropertyValue = ServiceManager. Bridge_GetStruct( "com.sun.star.beans.PropertyValue" ) ;
PropertyValue. Name = "FilterName" ;
PropertyValue. Value = "calc_pdf_Export" ;
НастройкиСохранения. SetValue( 0 , PropertyValue) ;
ВременныйФайлPDF_какУРЛ = "file:///" + СтрЗаменить( ВременныйФайлPDF, "\" , "/" ) ;
ОпенОфис. storeToURL( ВременныйФайлPDF_какУРЛ, НастройкиСохранения) ;
ОпенОфис. close( - 1 ) ;
ОпенОфис = Неопределено ;
объектПисьмо = Письмо. ПолучитьОбъект( ) ;
стрВложение = объектПисьмо. Вложения. Добавить( ) ;
стрВложение. ИмяФайла = "Счёт " + Строка( Заказ. Номер) + ".pdf" ;
стрВложение. Файл = Новый ХранилищеЗначения( Новый ДвоичныеДанные( ВременныйФайлPDF) ) ;
объектПисьмо. Записать( ) ;
Попытка
УдалитьФайлы( ВременныйФайлXLS) ;
УдалитьФайлы( ВременныйФайлPDF) ;
Исключение
КонецПопытки ;
КонецПроцедуры
Автор:
Трактор
Функция позволяющая выполнить выгрузку табличного документа в PDF средствами OpenOffice
Код 1C v 8.х
Функция ВыгрузитьТабличныйДокументВPDF(ДанныеВыгрузки, ПутьВыгрузки, ИмяФайлаБезРасширения)
Если НЕ ЗначениеЗаполнено( ПутьВыгрузки) Тогда
ПутьВыгрузки = КаталогВременныхФайлов( ) ;
КонецЕсли ;
ПутьВыгрузки = ? ( Прав( ПутьВыгрузки, 1 ) = "\" , ПутьВыгрузки, ПутьВыгрузки + "\" ) ;
РасширениеXSL = ".xls" ;
РасширениеPDF = ".pdf" ;
ПолноеИмяФайлаXLS = ПутьВыгрузки + ИмяФайлаБезРасширения + РасширениеXSL;
#Если Клиент Тогда
Состояние( "Создание временного файла..." ) ;
#КонецЕсли
Попытка
Если ТипЗнч( ДанныеВыгрузки) = Тип( "ТабличныйДокумент" ) Тогда
ДанныеВыгрузки. Записать( ПолноеИмяФайлаXLS, "XLS" ) ;
ИначеЕсли ТипЗнч( ДанныеВыгрузки) = Тип( "ТекстовыйДокумент" ) Тогда
ДанныеВыгрузки. Записать( ПолноеИмяФайлаXLS, "XLS" ) ;
Иначе
#Если Клиент Тогда
Сообщить( "Данные для выгрузки переданы в неподдерживаемом формате. Дальнейшее выполнение невозможно." + Символы. ПС + ОписаниеОшибки( ) ) ;
#КонецЕсли
Возврат 0 ;
КонецЕсли ;
Исключение
#Если Клиент Тогда
Сообщить( "Произошла ошибка при выгрузке временного файла. Возможно ошибка доступа к папке, в которую происходит запись." + Символы. ПС + ОписаниеОшибки( ) ) ;
#КонецЕсли
Возврат 0 ;
КонецПопытки ;
Попытка
#Если Клиент Тогда
Состояние( "Открытие компоненты OpenOffice..." ) ;
#КонецЕсли
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Скрипт = Новый COMОбъект( "MSScriptControl.ScriptControl" ) ;
Скрипт. language = "javascript" ;
Скрипт. AddObject( "OpenOffice" , ServiceManager) ;
#Если Клиент Тогда
Состояние( "Открытие временного файла..." ) ;
#КонецЕсли
Скрипт. eval( "Массив=new Array()" ) ;
Массив = Скрипт. eval( "Массив" ) ;
Скрипт. eval( "Массив[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')" ) ;
Скрипт. eval( "Массив[0].Name = 'Hidden'" ) ;
Скрипт. eval( "Массив[0].Value = true" ) ;
Скрипт. AddCode( "function SetItem(ind,val){Массив[ind]=val}" ) ;
Скрипт. AddObject( "ServiceManager" , ServiceManager) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
Document = Desktop. LoadComponentFromURL( "file:///" + ПолноеИмяФайлаXLS, "_blank" , 0 , Массив) ;
#Если Клиент Тогда
Состояние( "Запись в PDF..." ) ;
#КонецЕсли
Скрипт. eval( "Массив2=new Array()" ) ;
Массив2 = Скрипт. eval( "Массив2" ) ;
Скрипт. eval( "Массив2[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')" ) ;
Скрипт. eval( "Массив2[0].Name = 'FilterName'" ) ;
Скрипт. eval( "Массив2[0].Value = 'writer_pdf_Export'" ) ;
ПолноеИмяФайлаPDF = "file:///" + СтрЗаменить( ПолноеИмяФайлаXLS, РасширениеXSL, РасширениеPDF) ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, ВРег( РасширениеXSL) , РасширениеPDF) ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, "\" , "/" ) ;
Document. storeToURL( ПолноеИмяФайлаPDF, Массив2 ) ;
Document. close( - 1 ) ;
Document = Неопределено ;
Desktop = Неопределено ;
#Если Клиент Тогда
Состояние( "Удаление временного файла..." ) ;
#КонецЕсли
Попытка
УдалитьФайлы( ПолноеИмяФайлаXLS) ;
Исключение
#Если Клиент Тогда
Сообщить( "Произошла ошибка при удалении временного файла. Возможно, потребуется удалить его вручную." + Символы. ПС + ОписаниеОшибки( ) ) ;
#КонецЕсли
КонецПопытки ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, "file:///" , "" ) ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, "/" , "\" ) ;
#Если Клиент Тогда
Состояние( "Выгрузка выполнена." ) ;
Предупреждение( "Выгрузка выполнена." + Символы. ПС + ПолноеИмяФайлаPDF) ;
#КонецЕсли
Возврат ПолноеИмяФайлаPDF;
Исключение
Document. close( - 1 ) ;
#Если Клиент Тогда
Предупреждение( ОписаниеОшибки( ) ) ;
#КонецЕсли
Возврат 0 ;
КонецПопытки
КонецФункции
Автор:
doom_2001 Код 1C v 8.х Соединение = Новый HTTPСоединение( "export.rbc.ru" ) ;
ИмяФайла = ПолучитьИмяВременногоФайла( ".txt" ) ;
СтрокаСоединения= "/free/" + Источник+ "/free.fcgi?period=DAILY&tickers=" + Валюта1 + "&d1=" + День1 + "&m1=" + Месяц1 + "&y1=" + Год1 + "&d2=" + День2 + "&m2=" + Месяц2 + "&y2=" + Год2 + "&separator=%7C&data_format=BROWSER" ;
СтрокаСоединения= СтрЗаменить( СтрокаСоединения, " " , "" ) ;
Попытка
Соединение. Получить( СтрокаСоединения, ИмяФайла) ;
Исключение
Сообщить( "Невозможно получить курс по адресу http://export.rbc.ru" + СтрокаСоединения) ;
КонецПопытки ;
КурсыТекст= Новый ТекстовыйДокумент;
КурсыТекст. Прочитать( ИмяФайла) ;
Код 1C v 8.х
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект( "MSXML2.XMLHTTP" ) ;
соминет. open ( "GET" , Адресс, Ложь ) ;
соминет. send( ) ;
Возврат соминет. responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
Возврат Формат( Дат, "ДФ="" гггг/ММ/дд"" " ) ;
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
Для А = 1 по Список. Количество( ) цикл
Если Список[а- 1 ]. Пометка тогда
Сообщить( "Загружаем курсы для " + Строка( Список[а- 1 ]. Значение) ) ;
Код = Строка( Список[а- 1 ]. Значение. Код) ;
Дат = ПериодС;
Пока Дат < = ПериодПо цикл
Стр = ПолучитьКакСтроку( "http://cbrates.rbc.ru/tsv/" + Код+ "/" + ПреобразоватьДату( Дат) + ".tsv" ) ;
Поз = Найти( Стр, Символы. Таб) ;
Если Поз = 0 Тогда
Дат = Дат + 86400 ;
Продолжить;
КонецЕсли ;
Кратность = Число( СокрЛП( Лев( стр, Поз- 1 ) ) ) ;
курс = Число( СокрЛП( Сред( Стр, Поз+ 1 , СтрДлина( Стр) - Поз) ) ) ;
Сообщить( "Дата=" + Строка( Дат) + " Курс=" + Строка( курс) + " Кратность=" + Строка( Кратность) ) ;
Запись = РегистрыСведений. КурсыВалют. СоздатьМенеджерЗаписи( ) ;
Запись. Период = Дат;
Запись. Валюта = Список[а- 1 ]. Значение. Ссылка;
Запись. Курс = Курс;
Запись. Кратность = Кратность;
Запись. Записать( Истина ) ;
Дат = Дат + 86400 ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код 1C v 7.x
перем тзПустышка;
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
если стрНазвание = "стрУРЛа" тогда
запуститьприложение( стрУРЛа) ;
конецесли ;
конецпроцедуры
процедура кнПолучить()
стрИмяФайла = каталогпользователя( ) + "$$$$.###" ;
олеХМЛ = создатьобъект( "Microsoft.XMLHTTP" ) ;
олеХМЛ. Open( "GET" , стрУРЛа, 0 ) ;
олеХМЛ. Send( ) ;
олеАДО = создатьобъект( "ADODB.Stream" ) ;
олеАДО. Mode = 3 ;
олеАДО. Type = 1 ;
олеАДО. Open( ) ;
олеШелл = создатьобъект( "MSScriptControl.ScriptControl" ) ;
олеШелл. Language = "vbscript" ;
олеШелл. AddObject( "oleADO" , олеАДО) ;
олеШелл. AddObject( "oleXML" , олеХМЛ) ;
олеШелл. Eval( "oleADO.Write(oleXML.ResponseBody)" ) ;
олеАДО. SaveToFile( стрИмяФайла, 2 ) ;
олеАДО. Close( ) ;
олеАДО. Mode= 3 ;
олеАДО. Type = 2 ;
олеАДО. CharSet= "UTF-8" ;
олеАДО. Open( ) ;
олеАДО. LoadFromFile( стрИмяФайла) ;
стрТемп = "" ;
пока олеАДО. EOS( ) = 0 цикл
стрТемп = стрТемп + олеАДО. ReadText( - 2 ) + разделительстрок;
конеццикла ;
олеАДО. Close( ) ;
фс. УдалитьФайл( стрИмяФайла) ;
чисПозиция = найти( стрТемп, "Официальные курсы валют на" ) ;
если чисПозиция = 0 тогда
предупреждение( "Не получилось получить курсы валют" ) ;
иначе
тзТемп = создатьобъект( "ТаблицаЗначений" ) ;
тзПустышка. Выгрузить( тзТемп) ;
стрТемп = сред( стрТемп, чисПозиция) ;
дтКурса = дата( стрзаменить( стрполучитьстроку( стрТемп, 2 ) , "/" , "." ) ) ;
чисПозиция = 18 ;
чисКоличествоСтрок = стрколичествострок( стрТемп) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция) ;
пока найти( стрТекущая, "input type="" checkbox"" name="" idval"" " ) > 0 цикл
тзТемп. НоваяСтрока( ) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция + 1 ) ;
тзТемп. Количество = число( стрТекущая) ;
тзТемп. Наименование = сокрлп( стрзаменить( стрзаменить( стрТекущая, тзТемп. Количество, "" ) , "</td>" , "" ) ) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция + 2 ) ;
стрТекущая = сокрлп( стрзаменить( стрзаменить( стрТекущая, "<td class="" gen7"" align="" center"" >" , "" ) , "</td>" , "" ) ) ;
тзТемп. Код1 = лев( стрТекущая, 3 ) ;
тзТемп. Код2 = прав( стрТекущая, 3 ) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция + 5 ) ;
тзТемп. Курс = число( стрзаменить( стрзаменить( стрТекущая, "<td class="" gen7"" align="" center"" >" , "" ) , "</td>" , "" ) ) ;
чисПозиция = чисПозиция + 17 ;
если чисПозиция > чисКоличествоСтрок тогда
стрТекущая = "" ;
иначе
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция) ;
конецесли ;
конеццикла ;
тзТемп. Выгрузить( тзКурсов) ;
конецесли ;
конецпроцедуры
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D" ;
тзПустышка = создатьобъект( "ТаблицаЗначений" ) ;
тзПустышка. НоваяКолонка( "Количество" , "число" , 3 , 0 , "" , 5 ) ;
тзПустышка. НоваяКолонка( "Наименование" , "строка" , , , "Наименование" , 70 ) ;
тзПустышка. НоваяКолонка( "Код1" , "строка" , 3 , , "код" , 10 ) ;
тзПустышка. НоваяКолонка( "Код2" , "строка" , 3 , , "код" , 10 ) ;
тзПустышка. НоваяКолонка( "Курс" , "число" , 7 , 2 , "Курс" , 10 ) ;
тзПустышка. Выгрузить( тзКурсов) ;
Код 1C v 7.x Код
Функция глОткрытьТаблицуВExcel(Таблица, ИмяЛиста = "" , ОтображатьЯрлычки = 1, ОтображатьСетку = 1, УдалитьСтроки = 0, УдалитьСтолбцы = 0) Экспорт
Перем Excel, ExcelWB, ExcelSh, ExcelPS, ИмяФайла, Рез, Зн, Зн1 ;
Если ТипЗначенияСтр( Таблица) < > "Таблица" Тогда
Возврат 0 ;
КонецЕсли ;
Попытка
Excel = СоздатьОбъект( "Excel.Application" )
Исключение
Сообщить( "Не удалось открыть MS Excel" , "!" ) ;
Возврат 0 ;
КонецПопытки ;
Пока 1 = 1 Цикл
ИмяФайла = КаталогВременныхФайлов( ) + "1c" + СтрЗаменить( ТекущееВремя( ) , ":" , "" ) ;
Если ( ФС. СуществуетФайл( ИмяФайла+ ".tmp" ) = 1 ) или ( ФС. СуществуетФайл( ИмяФайла+ ".xls" ) = 1 ) Тогда
ФС. УдалитьФайл( ИмяФайла+ ".tmp" ) ;
ФС. УдалитьФайл( ИмяФайла+ ".xls" )
Иначе
Прервать;
КонецЕсли
КонецЦикла ;
Таблица. Записать( ИмяФайла+ ".tmp" , "XLS" ) ;
Если ФС. СуществуетФайл( ИмяФайла+ ".tmp" ) = 0 Тогда
Сообщить( "Ошибка записи файла "" " + ИмяФайла + "tmp"" " , "!" ) ;
Excel = "" ;
Возврат 0 ;
КонецЕсли ;
Рез = 1 ;
Попытка
ExcelWB = Excel. Workbooks. Add( ИмяФайла+ ".tmp" ) ;
Попытка
ExcelPS = ExcelWB. Sheets( 1 ) . PageSetup;
Зн = ExcelPS. LeftHeader; Зн1 = СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( Зн, "#P" , "&P" ) , "#Q" , "&N" ) , "#T" , "&T" ) , "#D" , "&D" ) ; Если Зн < > Зн1 Тогда ExcelPS. LeftHeader = Зн1 КонецЕсли ;
Зн = ExcelPS. CenterHeader; Зн1 = СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( Зн, "#P" , "&P" ) , "#Q" , "&N" ) , "#T" , "&T" ) , "#D" , "&D" ) ; Если Зн < > Зн1 Тогда ExcelPS. CenterHeader = Зн1 КонецЕсли ;
Зн = ExcelPS. RightHeader; Зн1 = СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( Зн, "#P" , "&P" ) , "#Q" , "&N" ) , "#T" , "&T" ) , "#D" , "&D" ) ; Если Зн < > Зн1 Тогда ExcelPS. RightHeader = Зн1 КонецЕсли ;
Зн = ExcelPS. LeftFooter; Зн1 = СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( Зн, "#P" , "&P" ) , "#Q" , "&N" ) , "#T" , "&T" ) , "#D" , "&D" ) ; Если Зн < > Зн1 Тогда ExcelPS. LeftFooter = Зн1 КонецЕсли ;
Зн = ExcelPS. CenterFooter; Зн1 = СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( Зн, "#P" , "&P" ) , "#Q" , "&N" ) , "#T" , "&T" ) , "#D" , "&D" ) ; Если Зн < > Зн1 Тогда ExcelPS. CenterFooter = Зн1 КонецЕсли ;
Зн = ExcelPS. RightFooter; Зн1 = СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( Зн, "#P" , "&P" ) , "#Q" , "&N" ) , "#T" , "&T" ) , "#D" , "&D" ) ; Если Зн < > Зн1 Тогда ExcelPS. RightFooter = Зн1 КонецЕсли ;
Исключение
КонецПопытки ;
ExcelWB. SaveAs( ИмяФайла+ ".xls" , - 4143 ) ;
ExcelWB. Close( 0 ) ;
ExcelWB = Excel. Workbooks. Add( ИмяФайла+ ".xls" ) ;
Попытка
ExcelSh = ExcelWB. Sheets( 1 ) ;
Если ПустаяСтрока( ИмяЛиста) = 0 Тогда
ExcelSh. Name = ИмяЛиста
КонецЕсли ;
Если ОтображатьЯрлычки = 1 Тогда
ExcelWB. Windows( 1 ) . DisplayWorkbookTabs = 1 ;
ExcelWB. Windows( 1 ) . TabRatio = 0.6
КонецЕсли ;
Если ОтображатьСетку = 0 Тогда
ExcelWB. Windows( 1 ) . DisplayGridlines = 0
КонецЕсли ;
Если УдалитьСтроки > 0 Тогда
ExcelSh. Range( ExcelSh. Rows( 1 ) , ExcelSh. Rows( УдалитьСтроки) ) . Delete( )
КонецЕсли ;
Если УдалитьСтолбцы > 0 Тогда
ExcelSh. Range( ExcelSh. Columns( 1 ) , ExcelSh. Columns( УдалитьСтолбцы) ) . Delete( )
КонецЕсли ;
Исключение
КонецПопытки ;
ExcelWB. Saved = 0 ;
Исключение
Сообщить( "Ошибка открытия файла в MS Excel" , "!" ) ; Рез = 0
КонецПопытки ;
Попытка
Excel. Visible = 1
Исключение
КонецПопытки ;
ExcelWB = "" ; ExcelSh = "" ; ExcelPS = "" ; Excel = "" ;
ФС. УдалитьФайл( ИмяФайла+ ".tmp" ) ;
ФС. УдалитьФайл( ИмяФайла+ ".xls" ) ;
Возврат Рез
КонецФункции
Автор неизвестен, если код ваш, напишите в комментариях Состав информационной базы В данном разделе приводится перечень и описание наиболее важных для системы 1С:Предприятие файлов, размещаемых в каталоге информационной базы. Указанная информация приводится для того, чтобы дать специалистам осуществляющим конфигурирование и администрирование 1С:Предприятия лучшее представление о внутренней организации информационных массивов. Например, она может быть использована для оценки использования ресурсов теми или иными объектами информационной базы или механизмами системы.
Создавать решения построенные на манипулирование данными, хранящимися в файлах информационной базы системы 1С:Предприятия средствами не штатными для 1С:Предприятия категорически не рекомендуется . Это объясняется сложностью поддержания логической целостности объектов информационной базы и возможностью изменения структур данных в последующих версиях. А также особенностями организации таких механизмов 1С:Предприятия, как "Управление распределенными информационными базами", возможностью хранения таблиц базы данных как в файлах DBF/CDX так и в среде сервера баз данных MS SQL Server и другими подобными причинами.
Итак в каталоге информационной базы размещаются:
Файл конфигурации (1 CV7.MD) Файл словаря данных (1С V7.DD или 1 CV7.DDS в зависимости от формата хранения таблиц базы данных)
Файл списка пользователей ( USRDEF\USERS.USR)
Файлы таблиц и индексов базы данных
В файле конфигурации (1 CV7.MD ) находится конфигурация системы: метаданные, интерфейсы и права.
Имя файла словаря данных зависит от формата хранения таблиц базы данных. В случае, если для хранения таблиц базы данных используются файлы DBF/CDX , словарем данных является файл 1 CV7.DD . Если же таблицы базы данных размещаются в среде MS SQL Server , то имя файла словаря данных - 1 CV7.DDS . Словарь данных содержит описание структуры таблиц и индексов базы данных системы 1С:Предприятие. Для MS SQL Server словарь данных содержит также описание хранимых процедур.
Файл списка пользователей - USERS.USR размещается в подкаталоге USRDEF каталога информационной базы. Данный файл содержит список пользователей с указанием для каждого пользователя набора прав, интерфейса и другой информации, связанной с пользователем. В случае, если для хранения таблиц и индексов базы данных используются файлы DBF/CDX , то указанные файлы также размещаются в каталоге информационной базы. Каждой из таблиц соответствует файл . DBF . Если у таблицы имеются индексы, то к ней также относится соответствующий файл CDX . Файлы . DBF и . CDX , относящиеся к одной таблице имеют одинаковые имена. Например, таблице 1 SJOURN соответствуют файлы 1 SJOURN.DBF и 1 SJOURN.CDX.
Ниже приведен перечень таблиц, которые могут входить в базу данных системы 1С:Предприятие(Файлы Назначение):
1SUSERS Системная таблица: отслеживание числа соединений с базой данных, счетчик изменений данных пользователями.
1SSYSTEM Системная таблица: содержит общие параметры информационной базы (точку актуальности, рассчитанный период бухгалтерских итогов, периодичность оперативных итогов и т. п.).
1SCONST Содержит значения констант, периодических реквизитов справочников и бухгалтерских счетов.
1SJOURN Содержит заголовки всех документов (внутренний идентификатор, номер, дату, время, общие реквизиты, по которым установлен отбор)
1SCRDOC Содержит вхождения документов в графы отбора, списки подчиненных документов, вхождения документов в общие журналы, для которых определен состав документов.
1SDNLOCK Содержит временный список номеров документов, которые в данный момент вводятся, для автоматической нумерации документов с учетом вводимых.
1SUIDCTL Используется для дополнительного контроля уникальности внутренней идентификации объектов (документов, справочников, бухгалтерских счетов).
1SBLOB Содержит значения реквизитов справочников, документов, счетов имеющих тип "Строка неограниченной длины". Также содержит описания шаблонов типовых операций.
SC* Содержит данные справочника конкретного вида. Каждый справочник хранится в отдельном файле.
DH* Содержит данные реквизитов шапки и общих реквизитов без признака "Отбор" документа конкретного вида. Создается при наличии у документа соответствующих реквизитов.
DT* Содержит данные реквизитов табличной части документа конкретного вида. Создается при наличии у документа соответствующих реквизитов.
1SACCS Содержит список бухгалтерских счетов всех планов счетов .
1SOPER Содержит данные бухгалтерских операций (сумму, содержание, дополнительные реквизиты). Содержит одну строку на документ, по которому создана операция.
1SENTRY Содержит бухгалтерские проводки.
1SBKTTLC Содержит рассчитанные бухгалтерские итоги оборотов между синтетическими счетами.
1SBKTTL Содержит рассчитанные бухгалтерские итоги остатков и оборотов по синтетическим счетам и объектам аналитики.
1SCORENT Содержит список корректных проводок.
1SACCSEL Содержит вхождения проводок в отборы по бухгалтерским счетам.
1SSBSEL Содержит список вхождений проводок в отборы по субконто.
1STOPER Содержит список типовых операций.
RA* Содержит движения регистра конкретного вида.
RG* Содержит итоги регистра конкретного вида (остатки для регистров остатков, обороты для оборотных регистров).
CJ* Содержит данные журнала расчетов конкретного вида.
CJPROP Содержит свойства журналов расчетов (расчетный период, глубина просмотра и т.п.)
CL Содержит данные календарей всех видов.
1SUPDTS Системная таблица компоненты "Управление распределенными ИБ". Содержит таблицу регистрации изменений. Создается только для распределенных ИБ.
1SDWNLDS Системная таблица компоненты "Управление распределенными ИБ". Содержит таблицу регистрации произведенных выгрузок изменений. Создается только для распределенных ИБ.
1SDBSET Системная таблица компоненты "Управление распределенными ИБ". Содержит список информационных баз, входящих в распределенную ИБ. Создается только для распределенных ИБ.
В случае, если таблицы базы данных системы 1С:Предприятие размещаются в среде MS SQL Server , то в каталоге информационной базы появляется файл 1 CV7.DBA , содержащий ссылку на соответствующую базу данных, находящуюся на сервере баз данных. Состав таблиц, хранимых в среде сервера баз данных практически идентичен приведенному выше составу файлов в формате DBF/CDX . Исключение составляет хранение строк неограниченной длины, которое в формате MS SQL Server не выделяется в отдельную таблицу.