Как получить координаты выделенной области на Яндекс Карте? На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:
Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат
Код инициализации карты и обработчик кнопки получения координат:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов( ) + "yamaps.html" ;
Ф = новый Файл( ПутьКФайлу) ;
Если Ф. Существует( ) Тогда
УдалитьФайлы( ПутьКФайлу) ;
КонецЕсли ;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект. ПолучитьМакет( "МакетЯндекс" ) ;
Т. УстановитьТекст( ТД. ПолучитьТекст( ) ) ;
Т. Записать( ПутьКФайлу) ;
ЭлементыФормы. Эксплорер. Перейти( ПутьКФайлу) ;
КонецПроцедуры
Процедура ВыполнитьСкрипт(Команда) Экспорт
ЭлементыФормы. Эксплорер. document. getElementById( "WebClientOperation" ) . value = Команда;
ЭлементыФормы. Эксплорер. document. getElementById( "WebClient" ) . click( ) ;
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту( ) ;
КонецПроцедуры
Процедура ПолучитьКоординатыНажатие(Элемент)
ВыполнитьСкрипт( "GetGEO();" ) ;
ТекКоординаты= ЭлементыФормы. Эксплорер. document. getElementById( "geometry" ) . innerText;
ТекКоординаты= СтрЗаменить( ТекКоординаты, "Координаты: [" , "" ) ;
МассивСтроки = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( ТекКоординаты, "], [ " ) ;
Точки. Очистить( ) ;
Для Каждого стр из МассивСтроки Цикл
Текстр= СтрЗаменить( стр, "[" , "" ) ;
Текстр= СтрЗаменить( Текстр, "]" , "" ) ;
Текстр= СокрЛП( Текстр) ;
нСтрок= Точки. Добавить( ) ;
симвЗапятой= Найти( Текстр, "," ) ;
нСтрок. Широта= Лев( Текстр, симвЗапятой- 1 ) ;
нСтрок. Долгота= Сред( Текстр, симвЗапятой+ 2 , СтрДлина( Текстр) ) ;
КонецЦикла ;
КонецПроцедуры
Макет
Код VBS <!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var index = 1;
var MyMap, route;
var clusterer;
var PointArray = [];
var noclick = false;
ymaps.ready(init);
function init(){
myMap = new ymaps.Map ("map", {
center: [55.75, 37.62],
zoom: 10
}),
polygon = new ymaps.GeoObject({
geometry: {
type: "Polygon",
coordinates: []
}
});
myMap.behaviors.enable('scrollZoom');
myMap.behaviors.disable('dblClickZoom');
myMap.events.add('click', function (e) {
if (!noclick) {
// addMarker(e.get('coords'));
}else{
noclick = false;
}
});
myMap.events.add('drag end', function (e) {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});
// создадим кластеризатор и запретим приближать карту при клике на кластеры
//clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true, synchAdd: true});
//myMap.geoObjects.add(clusterer);
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
$('input ').attr('disabled', false);
// Обработка нажатия на любую кнопку.
$('input ').click(
function () {
// Отключаем кнопки, чтобы на карту нельзя было
// добавить более одного редактируемого объекта (чтобы в них не запутаться).
$('input ').attr('disabled', true);
GetGEO();
});
}
function addMarker(coordPosition){
myPlacemark = new ymaps.Placemark(coordPosition, {
// Свойства
// Текст метки
iconContent: 'Точка'+index
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
document.getElementById('CoordX').value = coordPosition[0].toPrecision(15);
document.getElementById('CoordY').value = coordPosition[1].toPrecision(15);
index++;
}
function calcRoute(options){
ymaps.route(options, {
// Опции маршрутизатора
mapStateAutoApply: true, // автоматически позиционировать карту
avoidTrafficJams: false // Учитывать пробки
}).then(
function (router) {
route = router;
myMap.geoObjects.add(route);
//заполняем и сохраняем инфо про маршрут
document.getElementById('RouteInfo').value = "Длина маршрута - " + route.getHumanLength() + ". Время - " + route.getHumanJamsTime();
//генерация события для перехвата в 1С
var evt = document.createEventObject();
document.body.fireEvent('ondatasetcomplete', evt);
},
function (error) {
alert("Возникла ошибка: " + error.message);
});
}
function calcLine(options){
var poly = new ymaps.Polyline(options, {
hintContent: "Маршрут",
balloonContent: "Маршрут экспедитора",
balloonContentHeader: "",
balloonContentBody: "",
balloonContentFooter: ""
}, {
cursor: "pointer",
draggable: false,
hasBalloon: true,
hasHint: true,
interactiveZIndex: false,
opacity: 1,
openBalloonOnClick: true,
openEmptyBalloon: false,
openEmptyHint: false,
openHintOnHover: true,
strokeColor: '#E33926',
strokeOpacity: 0.8,
strokeStyle: '',
strokeWidth: 5,
syncOverlayInit: false,
visible: true
});
myMap.geoObjects.add(poly);
myMap.setBounds(poly.geometry.getBounds());
}
function Reset(){
// Удаляем все геообъекты на карте
myMap.geoObjects.removeAll();
PointArray = [];
index = 1;
}
function ChangeCityMSK(){
myMap.panTo([55.75, 37.62], {
flying: 1
});
}
function ChangeCitySPB(){
myMap.panTo([59.938531, 30.313497], {
flying: 1
});
}
function ChangeCityKRAS(){
myMap.panTo([45.04, 38.97], {
flying: 1
});
}
function ChangePlace(k,d){
myMap.panTo([k, d], {
flying: 1
});
}
function FindAdres(Adres){
Reset();
var myGeocoder = ymaps.geocode(Adres);
myGeocoder.then(
function (res){
var firstGeoObject = res.geoObjects.get(0);
if(firstGeoObject != null){
myMap.panTo(
// Координаты нового центра карты
firstGeoObject.geometry.getCoordinates(), {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}else{
alert("Ничего не найдено");}
}
);
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
var CoordPosition = [CoordX, CoordY];
myMap.panTo(
// Координаты нового центра карты
CoordPosition, {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayM(CoordX, CoordY, TextC, Text){
var CoordPosition = [CoordX, CoordY];
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Text
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: TextC
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayPointOne(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent: ID,
hintContent: ID,
balloonContent: Text,
balloonContentBody: Text
}
});
myMap.geoObjects.add(point);
}
function addToPointArray(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent: ID,
hintContent: ID,
balloonContent: Text,
balloonContentBody: Text
}
});
PointArray.push(point);
}
function drawCluster(){
clusterer.add(PointArray);
myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
// Создаем многоугольник
myPolygon = new ymaps.Polygon([
// Координаты вершин внешней границы многоугольника.
ArrayPoint
], {
//Свойства
hintContent: Name
}, {
// Опции.
// Цвет заливки (зеленый)
fillColor: color,
// Цвет границ (синий)
strokeColor: '#0000FF',
// Прозрачность (полупрозрачная заливка)
opacity: 0.6,
// Ширина линии
strokeWidth: 5,
// Стиль линии
strokeStyle: 'shortdash'
});
myMap.geoObjects.add(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.getElementById('WebClientOperation').value = "0";
}
function GetGEO(){
polygon.editor.stopEditing();
printGeometry(polygon.geometry.getCoordinates());
}
// Выводит массив координат геообъекта в <div id="geometry">
function printGeometry (coords) {
$('#geometry').html('Координаты: ' + stringify(coords));
function stringify (coords) {
var res = '';
if ($.isArray(coords)) {
res = '[ ';
for (var i = 0, l = coords.length; i < l; i++) {
if (i > 0) {
res += ', ';
}
res += stringify(coords[i]);
}
res += ' ]';
} else if (typeof coords == 'number') {
res = coords.toPrecision(6);
} else if (coords.toString) {
res = coords.toString();
}
return res;
}
}
</script>
</head>
<body>
<div id="geometry"/></div>
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input >
<input type="hidden" id="CoordY" name="CoordY" value="0"></input >
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input >
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input >
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input >
<!-- <input type="button" value="Завершить редактирование" id="stopEditPolyline"/> -->
</body>
</html>
Категория:
Географическая схема Как установить HTTP соединение через прокси (proxy) сервер В этом посте я покажу несколько примеров HTTP соединения используя прокси сервера:
Общий пример установки параметров прокси:
Код 1C v 8.х
Соединение = Новый HTTPСоединение( "www.mysite.ru" ) ;
Соединение = Новый HTTPСоединение( "www.mysite.ru" , 8080 ) ;
ПроксиСервер = Новый интернетПрокси;
ПроксиСервер. Пользователь = имяПользователя;
ПроксиСервер. Пароль = парольПользователя;
Соединение = Новый HTTPСоединение( "www.mysite.ru" , , , , ПроксиСервер, Истина ) ;
Пример загрузки файла
Код 1C v 8.х // Укажем настройки прокси-сервера
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер.Пользователь = "userfile";
ПроксиСервер.Пароль = "12345";
ПроксиСервер.Установить("http", "10.1.1.23", "3185");
СерверИсточник = "shop.com";
Адрес = "/price.asp";
ИмяВходящегоФайла = "c:\temp\input .html";
// Укажем в HTTP соединении что у нас есть проксик
НТТР = Новый HTTPСоединение(СерверИсточник,,,, ПроксиСервер);
НТТР.Получить(Адрес, ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
Вот пример загрузки файла
Код 1C v 8.х //Создаем Файл для отправки
ИмяФайлаHTML = КаталогВременныхФайлов() + “My1cV8bNdr”;
ФайлHTML = Новый ЗаписьТекста(ИмяФайлаHTML, КодировкаТекста.ANSI);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr”);
ФайлHTML.ЗаписатьСтроку(”content-disposition: form-data; name=”"userfile”"; filename=”"test.htm”"”);
ФайлHTML.ЗаписатьСтроку(”Content-Type: text/html”);
ФайлHTML.ЗаписатьСтроку(”");
ФайлHTML.ЗаписатьСтроку(”Дальше вставляем html код.”);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr–”);
ФайлHTML.Закрыть();
// Если необходимо использовать прокси
ПроксиСервер = Новый ИнтернетПрокси();
ПроксиСервер.Сервер(”адрес прокси”);
ПроксиСервер.Порт(”порт прокси”);
ПроксиСервер.Пользователь = “пользователь прокси”;
ПроксиСервер.Пароль = “пароль прокси”;
// Формируем заголовок для запроса
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить(”Content-Type”, “multipart/form-data; boundary=My1cV8bNdr”);
// Устанавливаем соединение и отпровляем запрос
HTTP = Новый HTTPСоединение(”сервер куда соединяемся”, , , , ПроксиСервер);
HTTP.ОтправитьДляОбработки(ИмяФайлаHTML, “/upload.php”, КаталогВременныхФайлов() + “result.htm”, ЗаголовокHTTP);
HTTP = Неопределено;
Категория:
Работа с Интернет, Почтой (Mail), FTP Google maps : вывод точек на карту и режим панорамы В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают!
Для клиента нужно было сделать вывод объектов на карту
С возможностью просмотра панорамы:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=8">
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.9&sensor=false"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="http://www.sitedev.by/lab/markerclusterer/markerclusterer.js"></script>
<script type="text/javascript">
var latlng;
var markers = [];
var myMap;
var index = 1;
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var infoWindow = new google.maps.InfoWindow;
var clusterer, mcOptions;
var trafficLayer = new google.maps.TrafficLayer();
var trafficOn = false;
var noclick = false;
var PointArray = [];
var polygons = [];
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
latlng = new google.maps.LatLng(55.75, 37.62);
var myOptions = {
zoom: 12,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
disableDoubleClickZoom: true,
panControl: true,
zoomControl: true,
mapTypeControl: true,
scaleControl: true,
streetViewControl: true,
overviewMapControl: true
};
myMap = new google.maps.Map(document.getElementById("map"),
myOptions);
google.maps.event.addListener(myMap, 'dragend', function() {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});
google.maps.event.addListener(myMap, 'click', function(event) {
infoWindow.close();
if (!noclick) {
addMarker(event.latLng);
}else{
noclick = false;
}
});
mcOptions = {gridSize: 3, maxZoom: 15};
clusterer = new MarkerClusterer(myMap, markers, mcOptions);
//отображение кнопки управления трафиком - все спер с примера, только подцепил свою функцию
var trafficControlDiv = document.createElement('div');
trafficControlDiv.style.padding = '5px';
// Set CSS for the control border
var controlUI = document.createElement('div');
controlUI.style.backgroundColor = 'white';
controlUI.style.borderStyle = 'solid';
controlUI.style.borderWidth = '2px';
controlUI.style.cursor = 'pointer';
controlUI.style.textAlign = 'center';
controlUI.title = 'нажмите для вкл/выкл трафика';
trafficControlDiv.appendChild(controlUI);
// Set CSS for the control interior
var controlText = document.createElement('div');
controlText.style.fontFamily = 'Arial,sans-serif';
controlText.style.fontSize = '12px';
controlText.style.paddingLeft = '4px';
controlText.style.paddingRight = '4px';
controlText.innerHTML = '<b>Трафик</b>';
controlUI.appendChild(controlText);
google.maps.event.addDomListener(controlUI, 'click', function (){
if (!trafficOn){
trafficOn = true;
trafficLayer.setMap(myMap);
}else{
trafficOn = false;
trafficLayer.setMap(null);
}
});
trafficControlDiv.index = 1;
myMap.controls[google.maps.ControlPosition.TOP_RIGHT].push(trafficControlDiv);
};
//добавляем маркер и отправляем в массив
function addMarker(location) {
marker = new google.maps.Marker({
position: location,
map: myMap,
title: 'Точка'+index
});
infoWindow.setContent(marker.title);
infoWindow.open(myMap, marker);
google.maps.event.addListener(marker, 'click', function(){
var mark = this;
var latLng = mark.getPosition();
infoWindow.setContent(mark.title);
infoWindow.open(myMap, mark);});
markers.push(marker);
index++;
document.getElementById('CoordX').value = location.lat();
document.getElementById('CoordY').value = location.lng();
}
function calcRoute(options) {
//вытягиваем из массива переданных параметров значения
//и преобразуем их в формат LatLng
var option1 = options[0];//начальная точка
var option2 = options[1];//промежуточные точки
var option3 = options[2];//конечная точка
var start = new google.maps.LatLng(option1[0], option1[1]); //первый
var end = new google.maps.LatLng(option3[0], option3[1]); //последний
//получаем транзитные точки
var waypts = [];
if(option2.length > 0) {
for(var i = 0, l = option2.length; i < l; i++) {
temp = option2[i];
Qcoord = new google.maps.LatLng(temp[0], temp[1])
waypts.push({
location:Qcoord,
stopover:true
});
}
}
//return;
var request = {
origin: start,
destination: end,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setMap(myMap);
directionsDisplay.setDirections(response);
var total = 0;
var myroute = response.routes[0];
for (i = 0; i < myroute.legs.length; i++) {
total += myroute.legs[i].distance.value;
}
total = total / 1000;
document.getElementById('RouteInfo').value = "Длина маршрута - " + total + "км.";
//генерация события для перехвата в 1С
var evt = document.createEventObject();
document.body.fireEvent('ondatasetcomplete', evt);
}else{
alert(status);
}
});
}
function Reset(){
directionsDisplay.setMap(null);
for (var i = 0; i < markers.length; i++) {
markers[i].setMap(null);
}
markers = [];
index = 1;
//обнуляем кластер маркеров
clusterer.clearMarkers();
for (var i = 0; i < polygons.length; i++) {
polygons[i].setMap(null);
}
polygons = [];
PointArray = [];
}
function FindAdres(Adres){
Reset();
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': Adres}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
latlng = results[0].geometry.location;
myMap.panTo(latlng);
marker = new google.maps.Marker({
map: myMap,
position: latlng,
animation: google.maps.Animation.BOUNCE,
title:Adres
});
markers.push(marker);
infoWindow.setContent(marker.title);
infoWindow.open(myMap, marker);
} else {
alert("Ничего не найдено: " + status);
}
});
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
latlng = new google.maps.LatLng(CoordX, CoordY);
myMap.panTo(latlng);
var marker = new google.maps.Marker({
map: myMap,
position: latlng,
animation: google.maps.Animation.BOUNCE,
title:Adres
});
markers.push(marker);
infoWindow.setContent(marker.title);
infoWindow.open(myMap, marker);
}
function addToPointArray(CoordX, CoordY, ID, IconT, Text){
var latLng = new google.maps.LatLng(CoordX, CoordY);
var point = new google.maps.Marker({'position': latLng, title: Text, icon: IconT});
PointArray.push(point);
}
function drawCluster(){
clusterer.addMarkers(PointArray);
//myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
//создаем массив координат вершин многоугольника
var paths = [];
for(var i = 0, l = ArrayPoint.length; i < l; i++) {
var temp = ArrayPoint[i];
Qcoord = new google.maps.LatLng(temp[0], temp[1])
paths.push(Qcoord);
};
// Создаем многоугольник
myPolygon = new google.maps.Polygon({
paths: paths,
strokeColor: color,
strokeOpacity: 0.6,
strokeWeight: 5,
fillColor: "#0000FF"
});
myPolygon.setMap(myMap);
polygons.push(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.getElementById('WebClientOperation').value = "0";
}
</script>
</head>
<body onload="initialize()">
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input >
<input type="hidden" id="CoordY" name="CoordY" value="0"></input >
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input >
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input >
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input >
</body>
</html>
Код вывода карты:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов( ) + "Карта.html" ;
Ф = новый Файл( ПутьКФайлу) ;
Если Ф. Существует( ) Тогда
УдалитьФайлы( ПутьКФайлу) ;
КонецЕсли ;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект. ПолучитьМакет( "МакетГугл" ) ;
Т. УстановитьТекст( ТД. ПолучитьТекст( ) ) ;
Т. Записать( ПутьКФайлу) ;
ЭлементыФормы. Эксплорер. Перейти( ПутьКФайлу) ;
КонецПроцедуры
Процедура ОчиститьКарту()
ЭлементыФормы. Эксплорер. Документ. parentWindow. eval( "Reset()" ) ;
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту( ) ;
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
ОчиститьКарту( ) ;
СписокВидов = Новый СписокЗначений;
Для Каждого стр из ВыборВывода Цикл
если стр. пометка тогда СписокВидов. Добавить( стр. наименование) ; КонецЕсли ;
КонецЦикла ;
табАдресов. Очистить( ) ;
табАдресов = получитьтабАдресов( СписокВидов) ;
табУникальныхАдресов = табАдресов. скопировать( ) ;
табУникальныхАдресов. свернуть( "Уник" ) ;
тзДанных = табАдресов. скопировать( ) ;
табАдресов. очистить( ) ;
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура( ) ;
Отбор. Вставить( "Уник" , стр. Уник) ;
Строки = тзДанных. НайтиСтроки( Отбор) ;
НовСтр = табАдресов. добавить( ) ;
НовСтр. уник = стр. уник;
Если Строки. Количество( ) > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр. Адрес = тздстр. Адрес;
НовСтр. КД = тздстр. КД;
НовСтр. КШ = тздстр. КШ;
НовСтр. ВидОбъекта = тздстр. ВидОбъекта;
НовСтр. Наименование= Строка( НовСтр. Наименование) + Строка( тздстр. Наименование) + "; " ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. табАдресов. СоздатьКолонки( ) ;
ВыборМасштаба = "50%" ;
ВыборРегиона = "Москва" ;
ЭлементыФормы. Надпись24 . Заголовок = "Точек: " + Строка( табАдресов. количество( ) ) ;
Кол = табАдресов. Количество( ) ;
Индекс = 0 ;
Для Каждого ТекСтрока Из табАдресов Цикл Индекс = Индекс + 1 ; Если НЕ ЗначениеЗаполнено( ТекСтрока. КД) тогда Продолжить; КонецЕсли ;
Широта = формат( ТекСтрока. КШ, "ЧРД=." ) ;
Долгота = формат( ТекСтрока. КД, "ЧРД=." ) ;
СодержимоеТочки = СокрЛП( ТекСтрока. ВидОбъекта) + ": " + СокрЛП( ТекСтрока. адрес) ;
Попытка
ЭлементыФормы. Эксплорер. Документ. parentWindow. eval( "addToPointArray(" + Широта + "," + Долгота + ", '" + Строка( Индекс) + "', '" + СокрЛП( ТекСтрока. ВидОбъекта. ПутьКИконке) + "', "" " + СодержимоеТочки + """ );" ) ;
Исключение
Сообщить( "addToPointArray(" + Широта + "," + Долгота + ", '" + Строка( Индекс) + "', '" + СокрЛП( ТекСтрока. ВидОбъекта. ПутьКИконке) + "', "" " + СодержимоеТочки + """ );" , СтатусСообщения. Внимание) ;
КонецПопытки ;
Состояние( "Вывожу на карту " + Индекс + " из " + кол) ;
КонецЦикла ;
ЭлементыФормы. Эксплорер. Документ. parentWindow. eval( "drawCluster();" ) ;
КонецПроцедуры
Вырванная из конфигурации обработка GMaps.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Установка 1с 8.3 и PostgreSQL 9.2.4 на CentOS 6.5 Как всегда, после установки первым делом выполняем обновление системы:
yum update
Установка необходимых пакетов, остальные будут взяты из зависимостей:
yum install openssl098e compat-readline5 compat-libtermcap
yum install readline krb5-libs openssl
yum install freetype webkitgtk unixODBCicu ImageMagick
Важно убедиться в корректности настроек DNS!
Установка postgresql
Предполагаем, что архив пакетов находится в отдельной папке, напр., /opt/inst/pgsql, а файлы БД будут в /opt/pgsql.
cd /opt/inst/pgsql
tar xvf postgresql_9_2_4_1_1C_x86_64_rpm_tar.bz2
yum install *.rpm
mkdir /opt/pgsql
chown postgres.postgres /opt/pgsql/ && chcon -t postgresql_db_t /opt/pgsql/
Инициализация:
su postgres -c '/usr/pgsql-9.2/bin/initdb -D /opt/pgsql --locale=ru_RU.UTF-8'
Исправить путь к файлам БД, переменная PGDATA:
vim /etc/rc.d/init.d/postgresql-9.2
Включение автозапуска и запуск демона PGSQL:
chkconfig postgresql-9.2 on && service postgresql-9.2 start
Создание пользователя БД
su - postgres
cd /usr/pgsql-9.2/bin
createuser --interactive -P
Введите имя новой роли:srv1c
Введите пароль для новой роли:
Повторите его:
Должна ли новая роль иметь полномочия суперпользователя? (y - да/n - нет) y
Новая роль должна иметь право создавать базы данных? (y - да/n - нет) y
Новая роль должна иметь право создавать другие роли? (y - да/n - нет) n
Краткая справка PGSQL
-bash-4.1$ psql
Изменение роли суперпользователя сервера БД
postgres=# ALTER USER srv1c WITH NOSUPERUSER;
postgres=# ALTER USER srv1c WITH SUPERUSER;
Список БД
postgres=# \l
Удаление БД
postgres=# DROP DATABASE base01;
Установка сервера 1С
Предполагаем, что архив пакетов находится в отдельной папке, напр., /opt/inst/1c-enterprise.
cd /opt/inst/1c-enterprise
tar xzf rpm64.tar.gz
yum install *.rpm
chkconfig srv1cv83 on && service srv1cv83 start
Лицензии
Предполагаем, что у нас уже есть работающий сервер сетевых лицензий.
mkdir /opt/1C/v8.3/x86_64/conf
vim /opt/1C/v8.3/x86_64/conf/nethasp.ini
chcon -R -u system_u -r object_r /opt/1C/v8.3/x86_64/conf
Пример файла
[NH_COMMON]
NH_TCPIP = Enabled
[NH_TCPIP]
NH_SERVER_ADDR = licsrv.your.domain
Безопасность
Отключение брандмауэра и расширений безопасности Linux - крайне вредная рекомендация. Более того, каких-то сложных настроек там нет, достаточно добавить пару разрешающих правил для входящего трафика.
vim /etc/sysconfig/iptables
#1C
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1540:1541 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1560:1591 -j ACCEPT
Теперь можно подключаться к серверу из консоли администрирования.
Категория:
Linux: CentOS, Debian, Ubuntu, ALT и д.р Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input .pdf
C:\>PDF2TXT C:\input .pdf -unicode
C:\>PDF2TXT C:\input .pdf -first 10 -last 12
C:\>PDF2TXT C:\input .pdf C:\output.txt
C:\>PDF2TXT C:\input .pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input .pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
ТекЗнч = СокрЛП( Лев( Стр, Поз- 1 ) ) ;
Если ЗначениеЗаполнено( ТекЗнч) Тогда
МассивСтрок. Добавить( ТекЗнч) ;
КонецЕсли ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
тч. Очистить( ) ;
НайденныеФайлы = НайтиФайлы( ПутьКPDF, "*.pdf" , ложь ) ;
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ. Добавить( ) ;
Нстр. ФайлPDF = стр. Имя;
КонецЦикла ;
ЭтаФорма. Обновить( ) ;
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП( ПутьКPDF+ "\" + стр. ФайлPDF) ;
txt = СтрЗаменить( pdf, "pdf" , "txt" ) ;
Команд = ПутьКPDF2TXT+ "\pdf2txt.exe " + pdf+ " " + txt;
ЗапуститьПриложение( Команд, ПутьКPDF, Истина ) ;
стр. ФайлTXT = txt;
Исключение
стр. ФайлTXT = "!!!_ОШИБКА" ;
КонецПопытки ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
КонецЦикла ;
мТекущийПользователь = глЗначениеПеременной( "глТекущийПользователь" ) ;
мСкладПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойСклад" ) ;
мОсновноеПодразделение = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеПодразделение" ) ;
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов" ) ;
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам" ) ;
мВидНоменклатурыПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойВидНоменклатуры" ) ;
мОтражатьВРеглУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете" ) ;
мОтражатьВБухУчета = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете" ) ;
мОтражатьВНалУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете" ) ;
Для каждого стр Из ТЧ Цикл
Состояние( "Загружаю: " + стр. ФайлTXT) ;
текдок= Новый ТекстовыйДокумент;
текдок. Прочитать( стр. ФайлTXT, "UTF-8" ) ;
ЗагрузкаТЧ= Ложь ;
ДокВозвратТоваровОтПокупателя = Документы. ВозвратТоваровОтПокупателя. СоздатьДокумент( ) ;
ДокВозвратТоваровОтПокупателя. Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя. Дата = ОбщегоНазначения. ПолучитьРабочуюДату( ) ;
ДокВозвратТоваровОтПокупателя. УстановитьНовыйНомер( ) ;
ДокВозвратТоваровОтПокупателя. ВидПоступления = Перечисления. ВидыПоступленияТоваров. НаСклад;
ДокВозвратТоваровОтПокупателя. СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя. Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя. ВалютаДокумента = Справочники. Валюты. НайтиПоКоду( "643" ) ;
ДокВозвратТоваровОтПокупателя. УчитыватьНДС = ИСТИНА ;
ДокВозвратТоваровОтПокупателя. СуммаВключаетНДС = ИСТИНА ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
ТСтр = текдок. ПолучитьСтроку( Ном) ;
ТекСтр = СокрЛП( ТСтр) ;
Если Найти( ТекСтр, "Всего по накладной" ) > 0 Тогда
ЗагрузкаТЧ= Ложь ;
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя. Товары Цикл
ОбработкаТабличныхЧастей. РассчитатьКоличествоМестТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуНДСТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
КонецЦикла ;
Попытка
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Проведение) ;
Исключение
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Запись) ;
КонецПопытки ;
стр. Документ = ДокВозвратТоваровОтПокупателя. Ссылка;
стр. Инфо = "Все ОК" ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
Прервать ;
КонецЕсли ;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить( ТекСтр, "подложке " , "подложке" ) ;
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 2 Тогда
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя. Товары. Добавить( ) ;
НоваяСтрока. Номенклатура = Справочники. Номенклатура. НайтиПоКоду( СтрМ[2 ]) ;
НоваяСтрока. ЕдиницаИзмерения = НоваяСтрока. Номенклатура. БазоваяЕдиницаИзмерения;
НоваяСтрока. Коэффициент = 1 ;
НоваяСтрока. Количество = Число( СтрМ[6 ]) ;
НоваяСтрока. Цена = Число( СтрМ[7 ]) ;
НоваяСтрока. Сумма = Число( СтрМ[8 ]) ;
НоваяСтрока. СуммаНДС = Число( СтрМ[11 ]) ;
НоваяСтрока. Качество = Справочники. Качество. Новый ;
Попытка
НоваяСтрока. СтавкаНДС = Перечисления. СтавкиНДС["НДС" + Лев( СокрЛП( СтрМ[9 ]) , 2 ) ];
Исключение
НоваяСтрока. СтавкаНДС = НоваяСтрока. Номенклатура. СтавкаНДС;
КонецПопытки ;
Исключение
Сообщить( "Не загружено: " + ТекСтр) ;
КонецПопытки ;
Иначе
Продолжить;
КонецЕсли ;
Иначе
КонецЕсли ;
Если Найти( ТекСтр, "Товарная накладная" ) > 0 Тогда
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 1 Тогда
ДокВозвратТоваровОтПокупателя. НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1 ];
ТекДата = СтрМ[2 ];
ДокВозвратТоваровОтПокупателя. ДатаВходящегоДокументаЭлектронногоОбмена = Дата( Прав( ТекДата, 4 ) + Сред( ТекДата, 4 , 2 ) + Лев( ТекДата, 2 ) ) ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Грузополучатель:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекОрганизация = Справочники. Организации. НайтиПоРеквизиту( "ИНН" , текИНН) ;
Если ТекОрганизация= Справочники. Организации. ПустаяСсылка( ) Тогда
ДокВозвратТоваровОтПокупателя. Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя. Организация = ТекОрганизация;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Поставщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПоставщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
ДокВозвратТоваровОтПокупателя. Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя. ДоговорКонтрагента = ТекПоставщик. ОсновнойДоговорКонтрагента;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Плательщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПлательщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
КонецЕсли ;
КонецЕсли ;
Если текстр= "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ= Истина ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF2TXT = ДиалогОткрытия. Каталог;
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Категория:
Загрузка данных в 1С Управляем 1С со стороны используя web-сервис Передача команд 1С на выполнение через ссылки в письме.
web-сервисы помогают интегрировать 1С с различными программами, делая её более гибкой. Статей в интеренете достаточно можно, но в основном там описывается выгрузка из 1С, обмен между двумя 1С или 1С и каким-то мощным программным продуктом написанным на C или других языках.
Для меня же была поставлена задача возможности управление 1С через браузер. Как пример: обрабатывать завершение задачи БП в 1С по ссылке в письме (примерно такого типа http://site.ru/?user=000000001&bp=000000555, т.е. отсюда видно, что пользователь 000000001 хочет закрыть задачу 000000555), т.е. пользователь со своего смартфона не имеющего доступа к 1С как таковому, должен получить возможность управлять ею извне. Собственно, более сложной задачей можно поставить написание собственных web-форм, более легких и компактных, с произвольным дизайном для управления 1С.
Задача с точки зрения написания кода 1С очень легкая. Основная сложность заключалась в освоении HTML и JavaScript для управления извне. Начальные знаний по этому вопросу я подчерпнул из статьи Примеры пользования web сервисов 1С из браузера.
Настройка 1С
Для возможности использовать 1С в вебе необходимо:
1. Установить модуль расширения веб-сервера;
2. Настроить Windows: доустановить компоненты IIS и настроить проверку подлинности. Всё это можно прочитать в статье
Настройка веб-клиента 1С:Предприятие 8.2 под Windows 7 x64 и IIS.
Программирование 1С
Теперь можно приступить к конфигурированию.
1. Создадим Web-сервис
Input :
1.1.
Input имеет операцию
Input Data которая принимает два параметра: User и Command, и возвращает параметр типа "boolean (http://www.w3.org/2001/XMLSchema)". Текст функции
Input Data:
Код 1C v 8.х Функция Input Data(User, Command)
обДанные = Справочники.Данные.СоздатьЭлемент();
обДанные.Наименование = User + ":" + Command;
обДанные.Записать();
Возврат Истина;
КонецФункции
1.2. Устанавливаем для
Input URI пространства имен = "http://infostart.ru". Здесь может быть любое уникальное имя, обычно это ссылка на сайт.
1.3. Устанавливаем для
Input имя файла публикации = "
input .1cws". Это имя web-сервиса к которому будем устанавливать соединение.
2. Для наглядности примера создадим справочник Данные, все параметры оставим по умолчанию.
3. Публикуем нашу конфигурацию и web-сервис: Администрирование -> Публикация на веб сервере...
На этом конфигурирование заканчивается, всё остальное сделает за нас 1С.
Разработка HTML страницы
Эта часть далась для меня тяжело, т.к. я ещё только делаю первые шаги в этой теме. Буду рад замачаниям и советам. А так, я постараюсь объяснить всё на пальцах тем, кто как и я знаком по большей части с 1С.
После установки ISS (я уже давал ссылку в начале статьи) на диске C появится каталог C:\inetpub\wwwroot, в этом каталоге располагается сайт. Для локальной машины (на которой установили ISS) он виден так http://localhost/, ну а для пользователей извне, как-то так http://infostart.ru (по правде там немного сложнее, но не суть, мы сейчас не про это). Заглавная страница сайта будет грузиться из файла index.htm каталога C:\inetpub\wwwroot
Исходники файлов можно скачать здесь:
Скачивать файлы может только зарегистрированный пользователь!
Код файла index.htm попытаюсь объяснить как могу, т.к. сам некоторые моменты не понимаю:
Код [html xmlns="http://www.w3.org/1999/xhtml"] // Неважно. Используется в XHTML для объявления пространства имен.
[head] // Предназначен для хранения других элементов, цель которых — помочь браузеру в работе с данными.
[meta http-equiv="Content-Type" content="text/html; charset=utf-8" /] // Неважно. Мета-теги используются для указания описания.
[title]Тест веб сервиса 1С[/title] // Неважно. Определяет заголовок документа, то что видит пользователь как текст вкладки.
[script type="text/javascript" src="../js/connect1c.js"] [/script] // Важно. Подключение JavaScript библиотек. В моём случае это мой модуль соединения с 1С.
[script type="text/javascript" src="../js/parameters.js"] [/script] // Важно. А это модуль обработки параметров строки браузера.
[/head]
[body] // Предназначен для хранения содержания веб-страницы (контента), отображаемого в окне браузера.
[p id="response1C"][/p] // Важно. Метка response1C, куда вернёться ответ запроса 1С.
[/body]
[script type="text/javascript"] // Важно. Начало основного скрипта, который выдёргивает из строки браузера всё что идёт дальше знака вопроса,
а дальше парсит по определенному алгоритму. В нашем случае будут искаться ключевые слова "user=" и "command=".
user = GetParameter("user"); // Важно. Находим значение user. Сам метод GetParameter находится в библиотеке parameters.js, о которой поговорим чуть позже.
command = GetParameter("command"); // Важно. Находим значение command.
Inquiry1C(user, command); // Важно. Запрос к 1С с найденными параметрами. Сам метод Inquiry1C находится в библиотеке connect1c.js
[/script]
[/html]
Заменил < на [, а > - ], замените перед использованием обратно.
Рассмотрим библиотеку parameters.js, которая находится в папке C:\inetpub\wwwroot\js
f
Код unction GetParameter(pName) { // Сам метод я нашёл на просторах интернета.
search = window.location.search; // window.location - это по сути URL, метод search этого объекта возвращает часть адреса после символа "?", включая символ "?".
begin = search.indexOf(pName) + pName.length + 1; // Вычисляем позицию начала строки значения параметра для вырезания. +1 - в нашем случае это знак "=".
Итого, для search = "?user=007" мы найдём позицию начала равной 6 (нумерация с нуля).
end = search.indexOf('&', begin); // Находим позицию конца выражения. В нашем случае, разделение параметров осуществляется знаком "&", и если мы его не найдём,
то позицией конца будет последний символ строки search (смотри дальше код).
if (end == -1) {
end = search.length;
};
return unescape(search.substring(begin, end)); // Метод unescape возвращает строку, содержащую данные типа charString (не знаю зачем это надо,
но видимо такое приведение типа здесь необходимо). Ну а метод substring - извлекает подстроку из строки.
}
Теперь рассмотрим библиотеку connect1c.js, которая также находится в папке C:\inetpub\wwwroot\js
function Inquiry1C(pUser, pCommand) { // Основной метод этой библиотеки. Запрос к 1С.
XMLHTTP = CreateRequestObject(); // Создание XML HTTP запроса. Сам метод я узнал из википедии.
XMLHTTP.open('POST', '../TestWeb/ws/
Input .1cws', true, "Admin", "1"); // Создаём соединение типа POST, где второй параметр - адрес; параметр true - значит асинхронное,
то есть браузер не будет ждать ответа сервера, а продолжит работу; далее пользователь и пароль с правами на операцию
Input Data (этот тот метод, который мы написали в 1С),
саму операцию можно выполнять в привилегированном режиме, чтобы не мучиться с правами для пользователя Admin.
XMLHTTP.onreadystatechange = function() {WhenAnswering1C(XMLHTTP)}; // Когда 1С отработает, автоматически сработает метод WhenAnswering (о нём чуть ниже по тексту этой библиотеки).
XMLHTTP.send(''
+ ' '
+ ' '
+ ''
+ pUser + ' '
+ ''
+ pCommand + ' '
+ ' '); // Отправка XML запроса, где описывается метод к исполнению в 1С, с переданными параметрами из нашей строки URL.
// Строку запроса можно раскурить минут за 5
}
function CreateRequestObject() { // Чудо метод из википедии "Пример использования". По сути, ничего сложного.
if (typeof XMLHttpRequest === 'undefined') {
XMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
function WhenAnswering1C(pXMLHTTP) { // Метод, который срабатывает после обработки запроса 1С.
status = StausRequest(pXMLHTTP); // Вычисляется статус для отправки сообщения пользователю (о нём чуть ниже).
document.getElementById("response1C").appendChild(document.createTextNode(status)); // Вывод на экран в помеченную область response1C (о ней я писал в основном файле).
Метод getElementById возвращает ссылку на узел документа.
Метод appendChild добавляет нод в конце списка дочерных нодов элемента, т.е. встраивает в нашу область нужный нам текст.
}
function StausRequest(pXMLHTTP) // Определение статуса.
{
status = "";
if (pXMLHTTP.readyState == 4) { // Опять же, читая википедию можно понять, readyState - это текущее состояние объекта (0 — не инициализирован, 1 — открыт,
2 — отправка данных, 3 — получение данных и 4 — данные загружены).
if (pXMLHTTP.status != 200) { // status - HTTP-статус в виде числа (404 — «Not Found», 200 — «OK» и т. д.)
status = "Запрос завершился неудачно. Ответ сервера: " + pXMLHTTP.responseText; // responseText -текст ответа на запрос.
Если состояние не 3 или 4, возвращает пустую строку.
}
else {
if (RequestSuccessful(pXMLHTTP)) { // Проверка ответа от 1С (о нём чуть ниже).
status = "Запрос отработан.";
}
else {
status = "Запрос был отклонён.";
};
};
};
return status;
}
function RequestSuccessful(pXMLHTTP) { // Проверка ответа от 1С. Здесь мы получим возвращаемое от 1С значение (в нашем случае 1С может вернуть тип булево).
DOM = pXMLHTTP.responseXML.getElementsByTagName("return")[0]; // responseXML - Текст ответа на запрос в виде XML, который затем может быть обработан посредством DOM.
Если состояние не 4, возвращает null.
response = DOM.childNodes[0].data; // Достаём данные из ответа.
return response == "true"; // Если правда, то правда
По правде, я не смог преобразовать сроку в булево, поэтому пришлось оставить так.
}
Проверка
Открываем браузер и вводим строку "localhost/?user=007&command=hello world!":
После чего можно открыть 1С и убедиться что создался элемент справочника:
На этом пример ознакомления управления 1С извне можно считать законченным
Автор:
Soloist Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Обработчик события для COM объекта Добрый день.
Есть задача:
в элемент управления "Поле HTML документа" загружается некая web форма, на которой есть некий
Input Element. Необходимо реализовать обработчик события onchange этого элемента.
Пытаюсь сделать так:
Код 1C v 8.х Процедура outMsgChange()
КонецПроцедуры
Процедура FWДокументСформирован(Элемент)
FWDoc = ЭтаФорма. ЭлементыФормы. FW. Документ;
Если FWDoc. URLUnencoded= "file:///E:/index.html" Тогда
inMsg = FWDoc. all. inMessage;
outMsg = FWDoc. all. outMessage;
outMsg. onchange = outMsgChange;
КонецЕсли ;
КонецПроцедуры
При проверке модуля возникает ошибка:
Переменная не определена (outMsgChange)
Толстый клиент (обычное приложение)
Есть какие-то варианты назначить для web контрола в качестве обработчика процедуру модуля?
Что-то аналогичное коду на C#:
this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
Спасибо.
Категория:
Работа с Формой (Диалог) и её элементами Выгрузка табличного документа в Google таблицу Надумал когда-то задачу себе: выгрузить содержимое табличного документа в
Google Document . Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.
Для написания функционала использовалась информация про
google document API . Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.
Функция получения маркера следующая:
Код 1C v 8.х Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
АдресКлиентЛогин = "https://www.google.com/accounts/ClientLogin" ;
Если ВидСервиса = "Таблица" Тогда
Сервис = "wise" ;
ИначеЕсли ВидСервиса = "Документ" Тогда
Сервис = "writely" ;
КонецЕсли ;
Попытка
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , АдресКлиентЛогин, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" ) ;
ХМЛХТТП. Send( "Email=" + ПараметрыПользователя. Логин + "&Passwd=" + ПараметрыПользователя. Пароль + "&service=" + Сервис + "&source=Gulp-CalGulp-1.05" ) ;
Исключение
Сообщить( "Ошибка:" + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Если ХМЛХТТП. Status = 200 Тогда
Маркер = ХМЛХТТП. ResponseText;
Маркер = Прав( Маркер, СтрДлина( Маркер) - СтрДлина( "Auth=" ) - Найти( Маркер, "Auth=" ) + 1 ) ;
Возврат Маркер;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.
Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Маркер = ПолучитьМаркер( "Таблица" ) ;
Если Маркер = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Адрес = "https://spreadsheets.google.com/feeds/spreadsheets/private/full" ;
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "GET" , Адрес, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( Null ) ;
Если ХМЛХТТП. Status = 200 Тогда
ОтветСервера = ХМЛХТТП. ResponseText;
ДеревоXML = ПрочитатьResponseTextXML( ОтветСервера) ;
СписокТаблиц = Новый СписокЗначений;
ТаблицаСсылка = "" ;
НазваниеТаблицы = "" ;
Для Каждого Строка Из ДеревоXML. Строки[0 ]. Строки Цикл
Если Строка. ИмяXMLЭлементаДанных = "entry" Тогда
Для Каждого ТекАтрибут Из Строка. Строки Цикл
Если ТекАтрибут. ИмяXMLЭлементаДанных = "link" Тогда
ТекРел = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "rel" ) ;
Если ТекРел. представление = "http://schemas.google.com/spreadsheets/2006#worksheetsfeed" Тогда
ТекСсылка = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "href" ) ;
ТаблицаСсылка = ТекСсылка. Представление;
ТаблицаСсылка = СтрЗаменить( ТаблицаСсылка, "https://" , "http://" ) ;
КонецЕсли ;
КонецЕсли ;
Если ТекАтрибут. ИмяXMLЭлементаДанных = "title" Тогда
НазваниеТаблицы = ТекАтрибут. ЗначениеXMLЭлементаДанных;
КонецЕсли ;
КонецЦикла ;
Если ЗначениеЗаполнено( ТаблицаСсылка) И ЗначениеЗаполнено( НазваниеТаблицы) Тогда
СписокТаблиц. Добавить( ТаблицаСсылка, НазваниеТаблицы) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокТаблиц;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
ТекстСоздания = "
| " + ИДЛиста + "/R" + Строка(Строка) + "C" + Строка(Колонка)+"
| + ИДЛиста + "/R"+ Строка(Строка) + "C" + Строка(Колонка)+"""/>
| + Строка(Строка) + """ col=""" + Строка(Колонка)+ """ input Value=""" + Значение+"""/>
| ";
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("POST", ИДЛиста, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/atom+xml;type=feed");
ХМЛХТТП.SetRequestHeader("X-If-No-Redirect", "true");
ХМЛХТТП.SetRequestHeader("Authorization", "GoogleLogin auth=" + Маркер);
ХМЛХТТП.Send(ТекстСоздания);
Если ХМЛХТТП.Status = 201 Тогда
Возврат Истина;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Ложь;
КонецЕсли;
КонецФункции
Источник Категория:
Табличный документ Выполнение HTTP запроса и сохранение результата в файл Код 1C v 8.х СерверИсточник = http://server.com;
Адрес = "/price.asp";
ИмяВходящегоФайла = "c:\temp\input .html";
НТТР = Новый HTTPСоединение(СерверИсточник);
НТТР.Получить(Адрес, ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
Категория:
Работа с Интернет, Почтой (Mail), FTP Как разобрать web-страницу (html) на текст? Нужно получить из html страницы текст:
Код 1C v 8.х //the_pal, через HTTPСоединение:
СерверИсточник = HTTPserver;
Адрес = "/price.asp";
ИмяВходящегоФайла = "c:\temp\input .html";
НТТР = Новый HTTPСоединение(СерверИсточник);
НТТР.Получить(Адрес, ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
Категория:
Полезные, Универсальные Функции Как в 1С автоматически переключать раскладку клавиатуры? Для этого можно использовать функционал следующих внешних компонент:
1. FormEx смотрите тут.
Код 1C v 7.x Сервис= СоздатьОбъект( "Сервис" ) ;
Сервис. РаскладкаКлавиатуры( "Russian" ) ;
2. Miracle смотрите тут.
3. NetaTable смотрите тут.
Код 1C v 7.x Если ( ЗагрузитьВнешнююКомпоненту( "NetaTable.dll" ) = 1 ) Тогда
РовнаяТаблица= СоздатьОбъект( "AddIn.NTable" ) ;
Иначе
Предупреждение( "Внешняя компонента AddIn.NetaTable НЕ подключена!!!" + РазделительСтрок+ "Работа программы невозможна!!!" ) ;
СтатусВозврата( 0 ) ;
Возврат
КонецЕсли ;
Процедура ПриНачалеВыбораЗначения(ИдентЭлемента,ФлагОтбора)
Если ИдентЭлемента = "Диагноз" Тогда
РовнаяТаблица. УстановитьРаскладку( 67699721 ) ;
ИначеЕсли ИдентЭлемента = "ИсточникФинансирования" Тогда
РовнаяТаблица. УстановитьРаскладку( 68748313 ) ;
КонецЕсли ;
КонецПроцедуры
А можно и без внешних компонент:
Код 1C v 7.x //примеры Sserj
Процедура СменитьРаскладку(Реж)
//Можно и просто через wrapper.dll
//Wrapper = CreateObject("DynamicWrapper");
//Wrapper.Register("USER32.DLL", "ActivateKeyboardLayout", "i=ll", "f=s", "r=l");
//Wrapper.Register("USER32.DLL", "LoadKeyboardLayout", "i=sl", "f=s", "r=l");
//rus = Wrapper.LoadKeyboardLayout("00000419", 0);
//eng = Wrapper.LoadKeyboardLayout("00000409", 0);
//Если Реж = "RUS" Тогда
// Wrapper.ActivateKeyboardLayout(rus, 0);
//ИначеЕсли Реж = "EN" Тогда
// Wrapper.ActivateKeyboardLayout(eng , 0);
//КонецЕсли;
Если Не (Константа.ВключатьНамЛоокВТелефонах = Истина) Тогда
Возврат;
КонецЕсли;
wshShell=createObject("wScript.shell");
Если Реж = "RUS" Тогда
wshShell.SendKeys("^(8)",0);
ИначеЕсли Реж = "EN" Тогда
wshShell.SendKeys("^(9)",0);
КонецЕсли;
КонецПроцедуры // СменитьРаскладку(Реж)
//ЕЩЕ
//Обновляем хоткеи смены языков, для подмены в полях где нужна английская раскладка
текст = СоздатьОбъект("текст");
текст.ДобавитьСтроку("Windows Registry Editor Version 5.00");
текст.ДобавитьСтроку("");
текст.ДобавитьСтроку("[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000100]");
текст.ДобавитьСтроку("""Virtual Key""=hex:39,00,00,00");
текст.ДобавитьСтроку("""Key Modifiers""=hex:02,c0,00,00");
текст.ДобавитьСтроку("""Target IME""=hex:09,04,09,04");
текст.ДобавитьСтроку("");
текст.ДобавитьСтроку("[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000101]");
текст.ДобавитьСтроку("""Virtual Key""=hex:38,00,00,00");
текст.ДобавитьСтроку("""Key Modifiers""=hex:02,c0,00,00");
текст.ДобавитьСтроку("""Target IME""=hex:19,04,19,04");
ИмяФайла = КаталогИБ() + "LangHotKey.reg";
Попытка
текст.Записать(ИмяФайла);
wshShell=createObject("wScript.shell");
StrComand = "regedit /S " + СокрЛП(ИмяФайла);
wshShell.Run(StrComand,1);
//Задерживаемся, иначе скрипт не успевает прочитать файл
Для Сч=1 По 50000 Цикл
КонецЦикла;
ФС.УдалитьФайл(ИмяФайла);
Исключение
КонецПопытки;
Категория:
Полезные, Универсальные Функции Форма ~ Как определить что форма стала активной? Используйте
ВводДоступен
ВводДоступен (Is
Input Available)
Синтаксис:
ВводДоступен()
Возвращаемое значение:
Тип: Булево. Истина - ввод данных в форму возможен (форма активна); Ложь - форма не активна.
Описание:
Определяет, возможен ли ввод данных в форму. Может быть использован для того, чтобы определить, активизирована ли текущая форма.
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Код 1C v 8.х
ПодключитьОбработчикОжидания( "Проверка" , 1 ) ;
Форма. Активизировать( ) ;
Процедура Проверка()
Если ВводДоступен( ) Тогда
Сообщить( "Введите текст" ) ;
КонецЕсли ;
КонецПроцедуры ;
Категория:
Работа с Формой (Диалог) и её элементами Получения курса валют из Интернет Код 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 // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
Категория:
COM-объекты, WMI, WSH