Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3 //Функция читает полученный JSON декадируя текст юникод
Функция ДекодироватьUniCodeВJSON(стрВходящая)
// стрВходящая содержит {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Вариант 1 используя перебор структуры и вывод в текстовую переменную
Текст = "";
Для каждого Элемент Из ДанныеЛога Цикл
//добавим разделитель после предыдущего значения
Текст = Текст + ?(НЕ ПустаяСтрока(Текст), Символы.ПС, "");
//добавим представление ключа и значения:
Текст = Текст + Элемент.Ключ + " = " + Элемент.Значение;
КонецЦикла;
Возврат Текст; //Вернет ok = true description = Статус заказа изменен
// Вариант 2 мспользуя ЗаписьJSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(Запись, ДанныеЛога,);
Возврат Запись.Закрыть(); // Вернет JSON {"ok":"true","description":"Статус заказа изменен"}
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3 //Параметры: Строка в Юникод (обязательный) Тип: Строка. Исходная строка.
//Возвращаемое значение: Тип: Строка. Строка обработанных символов.
//Описание: Возвращает преобразованную строку из формата Unicod.
//Автор: Александр Кияница (treedo)
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив(66) ;
МасУкр[0]="А"; МасУкр[1]="Б"; МасУкр[2]="В"; МасУкр[3]="Г"; МасУкр[4]="Ґ"; МасУкр[5]="Д";
МасУкр[6]="Е"; МасУкр[7]="Є"; МасУкр[8]="Ж"; МасУкр[9]="З"; МасУкр[10]="И"; МасУкр[11]="І";
МасУкр[12]="Ї"; МасУкр[13]="Й"; МасУкр[14]="К"; МасУкр[15]="Л"; МасУкр[16]="М"; МасУкр[17]="Н";
МасУкр[18]="О"; МасУкр[19]="П"; МасУкр[20]="Р"; МасУкр[21]="С"; МасУкр[22]="Т"; МасУкр[23]="У";
МасУкр[24]="Ф"; МасУкр[25]="Х"; МасУкр[26]="Ц"; МасУкр[27]="Ч"; МасУкр[28]="Ш"; МасУкр[29]="Щ";
МасУкр[30]="Ь"; МасУкр[31]="Ю"; МасУкр[32]="Я";
МасУкр[33]="а"; МасУкр[34]="б"; МасУкр[35]="в"; МасУкр[36]="г"; МасУкр[37]="ґ"; МасУкр[38]="д";
МасУкр[39]="е"; МасУкр[40]="є"; МасУкр[41]="ж"; МасУкр[42]="з"; МасУкр[43]="и"; МасУкр[44]="і";
МасУкр[45]="ї"; МасУкр[46]="й"; МасУкр[47]="к"; МасУкр[48]="л"; МасУкр[49]="м"; МасУкр[50]="н";
МасУкр[51]="о"; МасУкр[52]="п"; МасУкр[53]="р"; МасУкр[54]="с"; МасУкр[55]="т"; МасУкр[56]="у";
МасУкр[57]="ф"; МасУкр[58]="х"; МасУкр[59]="ц"; МасУкр[60]="ч"; МасУкр[61]="ш"; МасУкр[62]="щ";
МасУкр[63]="ь"; МасУкр[31]="ю"; МасУкр[65]="я";
МасКод = Новый Массив(66) ;
МасКод[0]="0410"; МасКод[1]="0411"; МасКод[2]="0412"; МасКод[3]="0413"; МасКод[4]="0490"; МасКод[5]="0414";
МасКод[6]="0415"; МасКод[7]="0404"; МасКод[8]="0416"; МасКод[9]="0417"; МасКод[10]="0418"; МасКод[11]="0406";
МасКод[12]="0407"; МасКод[13]="0419"; МасКод[14]="041A"; МасКод[15]="041B"; МасКод[16]="041C"; МасКод[17]="041D";
МасКод[18]="041E"; МасКод[19]="041F"; МасКод[20]="0420"; МасКод[21]="0421"; МасКод[22]="0422"; МасКод[23]="0423";
МасКод[24]="0424"; МасКод[25]="0425"; МасКод[26]="0426"; МасКод[27]="0427"; МасКод[28]="0428"; МасКод[29]="0429";
МасКод[30]="042C"; МасКод[31]="042E"; МасКод[32]="042F";
МасКод[33]="0430"; МасКод[34]="0431"; МасКод[35]="0432"; МасКод[36]="0413"; МасКод[37]="0491"; МасКод[38]="0434";
МасКод[39]="0435"; МасКод[40]="0454"; МасКод[41]="0436"; МасКод[42]="0437"; МасКод[43]="0438"; МасКод[44]="0456";
МасКод[45]="0457"; МасКод[46]="0439"; МасКод[47]="043A"; МасКод[48]="043B"; МасКод[49]="043C"; МасКод[50]="043D";
МасКод[51]="043E"; МасКод[52]="043F"; МасКод[53]="0440"; МасКод[54]="0441"; МасКод[55]="0442"; МасКод[56]="0443";
МасКод[57]="0444"; МасКод[58]="0445"; МасКод[59]="0446"; МасКод[60]="0447"; МасКод[61]="0448"; МасКод[62]="0449";
МасКод[63]="044C"; МасКод[31]="044E"; МасКод[65]="044F";
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина(Строка) Цикл
Если Лев(Строка, 1) = "\" Тогда
Если Лев(Строка, 2) = "\u" Тогда
тмпСтрока = Прав(Лев(Строка, 6),4) ;
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав(тмпСтрока, 1) ;
тмпСтрока = СтрЗаменить(тмпСтрока,СтрокаЗамены,ТРег(СтрокаЗамены));
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
Сообщить("Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Строка = Прав(Строка, (СтрДлина(Строка)-6)) ;
Иначе
Строка = Прав(Строка, (СтрДлина(Строка)-2)) ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев(Строка, 1) ;
Строка = Прав(Строка, (СтрДлина(Строка)-1)) ;
КонецЕсли;
КонецЦикла;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Как получить координаты выделенной области на Яндекс Карте? На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:
Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат
Код инициализации карты и обработчик кнопки получения координат:
Код 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>
Категория:
Географическая схема 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()");
КонецПроцедуры
//к сожалению, другого спососба получить "внутрь 1С" информацию о действии пользователя на карте я не сумел
//действие пользователя на карте изменяет поле HTML-документа, но не вызывает никакого события в 1с-ке
// поэтому через обработчикОжидания делаю непрерывный опрос карты
Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры
// вывод точек на карту
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
ОчиститьКарту();
СписокВидов = Новый СписокЗначений;
Для Каждого стр из ВыборВывода Цикл
если стр.пометка тогда СписокВидов.Добавить(стр.наименование); КонецЕсли;
КонецЦикла;
табАдресов.Очистить();
табАдресов = получитьтабАдресов(СписокВидов);
табУникальныхАдресов = табАдресов.скопировать();
табУникальныхАдресов.свернуть("Уник");
тзДанных = табАдресов.скопировать();
табАдресов.очистить();
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура();
Отбор.Вставить("Уник",стр.Уник);
Строки = тзДанных.НайтиСтроки(Отбор);
НовСтр = табАдресов.добавить();
НовСтр.уник = стр.уник;
Если Строки.Количество() > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр.Адрес = тздстр.Адрес;
НовСтр.КД = тздстр.КД;
НовСтр.КШ = тздстр.КШ;
НовСтр.ВидОбъекта = тздстр.ВидОбъекта;
НовСтр.Наименование=Строка(НовСтр.Наименование)+Строка(тздстр.Наименование)+"; ";
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.табАдресов.СоздатьКолонки();
ВыборМасштаба = "50%";
ВыборРегиона = "Москва";
ЭлементыФормы.Надпись24.Заголовок = "Точек: "+Строка(табАдресов.количество());
Кол = табАдресов.Количество();
Индекс = 0;
Для Каждого ТекСтрока Из табАдресов Цикл Индекс = Индекс + 1; Если НЕ ЗначениеЗаполнено(ТекСтрока.КД) тогда Продолжить; КонецЕсли;
Широта = формат(ТекСтрока.КШ, "ЧРД=.");
Долгота = формат(ТекСтрока.КД, "ЧРД=.");
СодержимоеТочки = СокрЛП(ТекСтрока.ВидОбъекта)+": "+ СокрЛП(ТекСтрока.адрес); //опять же можно вставить свое название
Попытка
ЭлементыФормы.Эксплорер.Документ.parentWindow.eval("addToPointArray(" + Широта + "," + Долгота + ", '" + Строка(Индекс) + "', '" + СокрЛП(ТекСтрока.ВидОбъекта.ПутьКИконке)+ "', """ + СодержимоеТочки + """);");
Исключение
Сообщить("addToPointArray(" + Широта + "," + Долгота + ", '" + Строка(Индекс) + "', '" + СокрЛП(ТекСтрока.ВидОбъекта.ПутьКИконке)+ "', """ + СодержимоеТочки + """);",СтатусСообщения.Внимание);
КонецПопытки;
Состояние("Вывожу на карту " + Индекс + " из " + кол);
КонецЦикла;
ЭлементыФормы.Эксплорер.Документ.parentWindow.eval("drawCluster();");
КонецПроцедуры
Вырванная из конфигурации обработка GMaps.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Яндекс карта : вывод точек на карту Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной 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('<b>$[name]</b><div id="descrID" >$[description]</div>');
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 = 'Дистанция: '+ dlMar.toFixed(2);
});
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.х //берем HTML-текст из макета и доделываем его
//создаем столько стилей, сколько есть различных картинок в папке "icons_"
//Загружаем в поле HTML-документа
//и позиционируем центр карты на Москву
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Макет = ПолучитьМакет("Макет");
КодХТМЛ = Макет.ПолучитьТекст();
СтрокаСтиляНачальная = "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"");";
СтрокаСтиляИтоговая = "";
//
//имяКаталогаКартинок = "D:\!1C\MAPS\icons_";
//КаталогКартинок = Новый Файл(имяКаталогаКартинок);
//Если КаталогКартинок.ЭтоКаталог() тогда
// списокИменКартинок = новый таблицаЗначений;
// списокИменКартинок.Колонки.Добавить("ИмяСтиля");
// списокИменКартинок.Колонки.Добавить("ИмяФайлаКартинки");
// МассивНайденных = НайтиФайлы(имяКаталогаКартинок, "*.gif");
// Для Каждого Файл из МассивНайденных Цикл
//
// времСтрокаСтиля = СтрокаСтиляНачальная;
// времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "BurG", сокрЛП(Файл.ИмяБезРасширения));
// времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "C:/icons_/kv2_5_x.gif", "C:/icons_/" + сокрЛП(Файл.Имя));
//
// СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы.ПС;
//
// КонецЦикла;
//конецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыОбъектов.Ссылка,
| ВидыОбъектов.ПутьКИконке,
| ВидыОбъектов.Код
|ИЗ
| Справочник.ВидыОбъектов КАК ВидыОбъектов
|ГДЕ
| ВидыОбъектов.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
времСтрокаСтиля = СтрокаСтиляНачальная;
времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "BurG", "s"+Строка(ВыборкаДетальныеЗаписи.код));
времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "http://www.burgerking.ru/favicon.ico", сокрЛП(ВыборкаДетальныеЗаписи.ПутьКИконке));
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы.ПС;
КонецЦикла;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + СтрокаСтиляНачальная + символы.ПС;
КодХТМЛ = стрЗаменить(КодХТМЛ, "/*vstavkaStiley;", СтрокаСтиляИтоговая);
путьККаталогуКартинок = СтрЗаменить(КаталогПрограммы(), "\", "/");
КодХТМЛ = СтрЗаменить(КодХТМЛ,"C:/",путьККаталогуКартинок);
ЭлементыФормы.Карта.УстановитьТекст(КодХТМЛ);
табАдресов = получитьтабАдресов();
табУникальныхАдресов = табАдресов.скопировать();
табУникальныхАдресов.свернуть("Уник");
тзДанных = табАдресов.скопировать();
табАдресов.очистить();
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура();
Отбор.Вставить("Уник",стр.Уник);
Строки = тзДанных.НайтиСтроки(Отбор);
НовСтр = табАдресов.добавить();
НовСтр.уник = стр.уник;
Если Строки.Количество() > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр.Адрес = тздстр.Адрес;
НовСтр.КД = тздстр.КД;
НовСтр.КШ = тздстр.КШ;
НовСтр.ВидОбъекта = тздстр.ВидОбъекта;
НовСтр.Наименование=Строка(НовСтр.Наименование)+Строка(тздстр.Наименование)+"; ";
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.табАдресов.СоздатьКолонки();
ВыборМасштаба = "50%";
ВыборРегиона = "Москва";
ЭлементыФормы.Надпись24.Заголовок = "Точек: "+Строка(табАдресов.количество());
КонецПроцедуры
// Вывод точек на карту
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
//имя стиля совпадает с именем картинки без расширения
Всего=Строка(табАдресов.Количество()); н=0;
Для каждого строкаАдреса Из табАдресов Цикл
н=н+1; Состояние("Вывод "+Строка(н)+" из "+Всего);
////ЭТО ПРИМЕР ВЫВОДА ТОГО ИЛИ ИНОГО МАРКЕРА В ЗАВИСИМОСТИ ОТ НЕКОЕГО ПАРАМЕТРА
//Если строкаАдреса.ДокументПродажи.суммаДокумента <1000 тогда
// имяСтиля = "BurG";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <10000 тогда
// имяСтиля = "tr2_3_x";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <20000 тогда
// имяСтиля = "kv3_4_x";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <50000 тогда
// имяСтиля = "tr4_1_x";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <100000 тогда
// имяСтиля = "kv5_2_x";
//Иначе
// имяСтиля = "cr6_3_x";
//конецЕсли;
УИД_Дока = Строка(н);
имяСтиля = "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
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д.
Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки
Путем тестов было вяснено, что проблема не в коде, а происходит это на этапе обращения платформы к SQL серверу... после долгих поисков решений, в интернете была найдена статья, которая помогла в решении данной проблемы:
Кто что блокирует, MS SQL + 1C
В повседневной работе достаточно задействовать только первый блок "/*кто кого*/". Открываем MS SQL Server Management Studio, правой на корень - "new query" - вставляем код запроса (только верхнюю часть до "Кто что блокирует", остальное - для детального анализа), выполняем запрос (вверху есть кнопочка выполнения запроса).
Выполнив запрос, запоминаем "ID виновника", быстренько идем в консоль сервера 1С, заходим в ветку "Сеансы" нашей базы. Видим все соединения с 1С-сервером, ищем там колонку "Соединение с СУБД", чтобы увидеть соединения 1С-сервера с MSSQL-сервером. В колонке будет всего несколько заполненных значений, среди них и будет "ID виновника".
Что делать если его там нет, тут 3 варианта:
1. Вернитесь в MSSQL и сделайте запрос еще несколько раз подряд, если значения меняются или таблица вообще пуста - постоянной блокировки нет, у вас (уже) все в порядке.
2. Сеанс который блокирует MSSQL находится в другой базе т.е. блокировка не в той базе (можно попробовать задействовать ветку всех сеансов в консоли 1С-сервера) - вернитесь в MSSQL и внимательно посмотрите в колонку DB в ней находится название базы.
3. Бывает что ID процесса в 1С-консоли вообще отсутствует, такое тоже бывает если у вас есть какие-то внешние программы подключенные напрямую в базу 1С, если пускаете кого-то в MSSQL напрямую, то вариант не исключен.
Код SQL-запроса:
Код SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dbid AS smallint;
use [ВАШАБАЗА];
SET @dbid=DB_ID();
/*кто кого*/
SELECT DB_NAME(pr1.dbid) AS 'DB'
,pr1.spid AS 'ID жертвы'
,RTRIM(pr1.loginame) AS 'Login жертвы'
,pr2.spid AS 'ID виновника'
,RTRIM(pr2.loginame) AS 'Login виновника'
,pr1.program_name AS 'программа жертвы'
,pr2.program_name AS 'программа виновника'
,txt.[text] AS 'Запрос виновника'
FROM MASTER.dbo.sysprocesses pr1(NOLOCK)
JOIN MASTER.dbo.sysprocesses pr2(NOLOCK)
ON (pr2.spid = pr1.blocked)
OUTER APPLY sys.[dm_exec_sql_text](pr2.[sql_handle]) AS txt
WHERE pr1.blocked <> 0
/* Кто что блокирует */
SELECT s.[nt_username]
,request_session_id
,tran_locks.[request_status]
,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')' [Object]
,txt_blocked.[text]
,COUNT(*) [COUNT]
FROM sys.dm_tran_locks AS tran_locks WITH (NOLOCK)
JOIN sys.sysprocesses AS s WITH (NOLOCK)
ON tran_locks.request_session_id = s.[spid]
JOIN (
SELECT 'KEY' AS sResource_type
,p.[hobt_id] AS [id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'RID' AS sResource_type
,p.[hobt_id] AS [id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'PAGE'
,p.[hobt_id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name)
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'OBJECT'
,o.[object_id]
,QUOTENAME(o.name)
FROM sys.objects o
) AS RD
ON RD.[sResource_type] = tran_locks.resource_type
AND RD.[id] = tran_locks.resource_associated_entity_id
OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt_Blocked
WHERE (
tran_locks.request_mode = 'X'
AND tran_locks.resource_type = 'OBJECT'
)
OR tran_locks.[request_status] = 'WAIT'
GROUP BY
s.[nt_username]
,request_session_id
,tran_locks.[request_status]
,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')'
,txt_blocked.[text]
ORDER BY
6 DESC
IF EXISTS ( SELECT Name
FROM tempdb..sysobjects
WHERE name LIKE '#LOCK_01_01%' )
DROP TABLE #LOCK_01_01
CREATE TABLE #LOCK_01_01
(
spid INT,
dbid INT,
ObjId INT,
IndId SMALLINT,
Type VARCHAR(20),
Resource VARCHAR(50),
Mode VARCHAR(20),
Status VARCHAR(20)
)
INSERT INTO #LOCK_01_01
EXEC sp_lock
select OBJECT_NAME(ObjId) as [Имя объекта], Mode [Тип блокировки (код)],
CASE
WHEN Mode='Sch-S' THEN 'Блокировка стабильности схемы. Гарантирует, что элемент схемы, такой как таблица или индекс, не будет удален до тех пор, пока сеанс связи удерживает блокировку стабильности схемы на данный элемент схемы;'
WHEN Mode='Sch-М' THEN '= Блокировка изменения схемы. Должен поддерживаться любым сеансом связи, во время которого предполагается изменить схему данного ресурса. Гарантирует, что другие сеансы не имеют ссылок на обозначенный объект;'
WHEN Mode='S' THEN 'S = Коллективная блокировка. Удерживающему сеансу предоставлен коллективный доступ к ресурсу;'
WHEN Mode='U' THEN 'U = Блокировка обновления. Указывает блокировку обновления, полученную на ресурсы, которые со временем могут быть обновлены. Используется для предотвращения общей формы взаимоблокировки, которая возникает, когда множество сеансов блокируют ресурсы для потенциального обновления в последующее время;'
WHEN Mode='X' THEN 'X = Монопольная блокировка. Удерживающему сеансу предоставлен исключительный доступ к ресурсу;'
WHEN Mode='IS' THEN 'IS = Блокировка с намерением коллективного доступа. Указывает намерение поместить S блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='IU' THEN 'IU = Блокировка с намерением обновления. Указывает намерение поместить U блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='IX' THEN 'IX = Блокировка с намерением монопольного доступа. Указывает намерение поместить X блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='SIU' THEN 'SIU = Коллективная блокировка с намерением обновления. Указывает коллективный доступ к ресурсу с намерением получения блокировок обновления на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='SIX' THEN 'SIX = Коллективная блокировка с намерением монопольного доступа. Указывает коллективный доступ к ресурсу с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='UIX' THEN 'UIX = Блокировка обновления с намерением монопольного доступа. Указывает блокировку обновления ресурса с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='BU' THEN 'BU = Блокировка массового обновления. Используется для массовых операций;'
--[ ELSE else _result_expression ]
END as [Тип блокировки]
,syspr.spid, syspr.dbid, syspr.open_tran, syspr.status, syspr.hostprocess, syspr.loginame, syspr.hostname
From
#LOCK_01_01
inner join master.dbo.sysprocesses as syspr
on syspr.spid = #LOCK_01_01.spid and syspr.dbid = #LOCK_01_01.dbid
where
#LOCK_01_01.Type = 'TAB'
and
#LOCK_01_01.dbid = @dbid
/* Чем занят сервер*/
SELECT s.[spid]
,s.[loginame]
,s.[open_tran]
,s.[blocked]
,s.[waittime]
,s.[cpu]
,s.[physical_io]
,s.[memusage]
INTO #sysprocesses
FROM sys.[sysprocesses] s
WAITFOR DELAY '00:00:01'
SELECT txt.[text]
,s.[spid]
,s.[loginame]
,s.[hostname]
,DB_NAME(s.[dbid]) [db_name]
,SUM(s.[waittime] -ts.[waittime]) [waittime]
,SUM(s.[cpu] -ts.[cpu]) [cpu]
,SUM(s.[physical_io] -ts.[physical_io]) [physical_io]
,s.[program_name]
FROM sys.[sysprocesses] s
JOIN #sysprocesses ts
ON s.[spid] = ts.[spid]
AND s.[loginame] = ts.[loginame]
OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt
WHERE s.[cpu] -ts.[cpu]
+ s.[physical_io] -ts.[physical_io]
> 500
OR (s.[waittime] -ts.[waittime]) > 3000
GROUP BY
txt.[text]
,s.[spid]
,s.[loginame]
,s.[hostname]
,DB_NAME(s.[dbid])
,s.[program_name]
ORDER BY
[physical_io] DESC
DROP TABLE #sysprocesses
Категория:
Администрирование Управляем 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 имеет операцию InputData которая принимает два параметра: User и Command, и возвращает параметр типа "boolean (http://www.w3.org/2001/XMLSchema)". Текст функции InputData:
Код 1C v 8.х Функция InputData(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 - значит асинхронное,
то есть браузер не будет ждать ответа сервера, а продолжит работу; далее пользователь и пароль с правами на операцию InputData (этот тот метод, который мы написали в 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-пакеты Резервирование центрального кластера 1С и "Безопасное" обновление платформы 1С Тем, кто не сталкивался с 8.2 и всеми проблемами, особенно ранних версий платформы на системах с большим количеством пользователей меры, описанные в этой статье окажутся избыточными. Но все действия продиктованы только опытом, и проверены практикой.
1) Резервный центральный кластер создавать нужно . Это аксиома. Если у вас более 10 пользователей и в течение дня в 1С ведется хоть какая-то работа - выделите хотя бы обычный компьютер с не серверным "железом" под резервный центральный кластер - это пригодится.
2) Резервный центральный кластер - это не кластер включенный в группу резервирования.
Это полноценный центральный кластер, который является копией существующего. Да, это возможно; более того - это нужно делать. Только нужно отключить фоновые задания на резервном кластере серверов. Я не уверен по поводу лицензионного соглашения с 1С, но если в каждый момент времени будет использоваться только один центральный кластер ничего страшного в этом нет. Но сами понимаете, чтобы "подмена" кластеров была "горячей" кое что придется сделать... как минимум сбегать в серверную и переставить ключик. Кроме того резервный центральный кластер можно запускать с ключем -debug (в реестре: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\1C:Enterprise 8.2 Server Agent параметр "imagePath"). И использовать для отладки серверного кода разработчиками. Резервирование центрального кластера в случае использования штатного механизма 1С - штука наверное хорошая, вот только у меня лично она не сработала. Дело в том, что она не работает в случае "подвисания" процесса центрального кластера "rpmngr" - т.е. процесс есть, определить его отсутствие ещё не удаётся, механизм использования резервного центрального кластера не включается. А пока что с центральным кластером чаще всего случались проблемы "зависания" а не "падения".
3) Про 1cestart.exe забудьте. Моё личное мнение конечно, но по-моему этот блок в 1С отдали писать каким-то студентам (что вполне возможно, т.к. стартер не является частью платформы и не особо критичен). Столько ошибок в его работе находили в релизах, столько "глюков" было обнаружено в это простом инструменте, что пользоваться им решительно не советую, особенно в свете того, что далее будет специальный скрипт запуска 1С.
4) Для запуска 1С разработал специальный скрипт:
Код VBS set fso = CreateObject("Scripting.FileSystemObject")
set wso = WScript.CreateObject("Wscript.shell")
Base = "Main"
FileText = \\Сетевая папка\Settings_basedefault.ini"
if Wscript.Arguments.Count() > 0 Then Base = Lcase(WScript.Arguments(0))
S_elect case base
case "Base1"
Filetext = "\\Сетевая папка\Settings_base1.ini"
case "Base2"
Filetext = "\\Сетевая папка\Settings_base2.ini"
case "Base3"
Filetext = "\\Сетевая папка\Settings_base2.ini"
case else
Filetext = "\\Сетевая папка\Settings_basedefault.ini"
end S_elect
if fso.FileExists(FileText) = false then FileText = "\\Сетевая папка\Settings_basedefault.ini"
set file = fso.OpenTextFile(FileText, 1)
Platform = file.ReadLine
Server = file.Readline
cpath = "C:\Program files (x86)\1cv82\" & Platform & "\bin\1cv8.exe"
command = " enterprise /S" & Server & "\" & Base
wso.Exec(cpath & command)
В данном скрипте "Сетевая папка" нужно заменить на адрес общедоступной папки, в которую вы поместите файлы настроек. По умолчанию файл может быть один. Но так же существует возможность для разных баз использовать разные сервера центрального кластера и разные файлы настроек. Это нужно, к примеру, чтобы сперва в работе новую версию платформы "протестировала" бухгалтерия, а потом уже перешли на новую версию основные торгующие подразделения.
файл настроек при этом будет иметь вид:
Код 8.2.14.533
Server1C
Всего 2 строчки. В первой - версия платформы, во второй - имя центрального кластера серверов
Этот скрипт нужно положить в ту же сетевую папку (если безопасность у вас в сети позволяет запускать скрипты из сетевых папок). Если не позволяет - на локальные компьютеры пользователей, и создать ярлыки для баз 1С со строками вида:
Код VBS "C:\Program Files (x86)\1cv82\Run1C.vbs" Base
Где Base - имя базы в кластере для запуска.
Пример скрипта, самосотятельно определяющего текущий EXE-шник 1С:
Код VBS '====================
Set WshShell = CreateObject("WScript.Shell")
PrgDirx86 = trim(WshShell.RegRead("HKEY_CLASSES_ROOT\CLSID\{5CD98F13-1050-4b43-84F2-33AD97CFC287}\LocalServer32\"))
msgbox PrgDirx86
'====================
После этого изменением одной строчки в файле настроек вы сможете переключить запуск пользователей на другую платформу или на другой центральный кластер 1С. Не один раз этот простой скрипт спасал от долгого простоя.
Если имя сервера используется где-то при установке COM соединений - его тоже нужно поменять.
Соответственно при окончательном и бесповоротном падении основного сервера нужно сделать:
а) Останавливаете службу сервера если она ещё сама не остановилась (обязательно нужно это сделать чтобы на сервере не осталось активных пользователей, а то может сбоить нумерация объектов)
б) Переключаете в файле запуск на новый сервер
в) net send * "Перезайдите в 1С"
г) Запускаете 1С с новго сервера - вызываете на всякий случая "ОбновитьНумерациюОбъектов"
д) Включаете фоновые задания но новом кластере серверов
После этого "чините" основной сервер (починка чаще всего заключается в очистке каталога C:\Program Files\1cv82\srvinfo)
И в конце дня те же самые процедуры (кроме оповещения) проделываете для переключения обратно на основной сервер.
Если падение сервера наблюдается после обновления платформы, то к данным действиям нужно еще добавить восстановления COM соединителя на всех клиентских компьютерах (если вы используете COM или OLE) - нудно через установку и удаление программ выбрать нужную вам версию платформы и нажать "восстановить". т.к. COM соединения обычно не используются в критических процессах - они чаще всего нужны для интеграции, то их восстановление "терпит" и вы можете позволить себе обновлять машины, или сделать это групповой политикой, если разрешения для клиентских рабочих станций позволяют.
5) Резервная копия перед обновлением. Обязательно конечно - были уже релизы где все субконто очищались... так что лучше не рисковать
6) Проверка запуска после обновления. Тоже обязательна. И обратите внмание на время запуска... Оно может вдруг увеличиться до оочень большого.
Собственно эта методика позволяет "почти безболезненно" обновлять платформу, и быстро "откатываться" к "старым" релизам в случае возникновения проблем. Так же позволяет быстро переключиться на резервный центральный кластер в случае отказа основного. Успешно работает и опробована в случае работы в едином домене и преимущественно в терминальном режиме. В случае когда не единый домен и пользователи работают не не терминальных серверах появятся ещё "заморочки" с обновлением платформы на клиентских машинах (для них придётся использовать политики групп) и создании общей папки (если не единый домен), но возможности WSH позволяют считать файл из любого места - с этим проблем не будет.
Автор:
Олег Филиппов Категория:
Администрирование Скрипт переустанавливает Платформу 1С и прописывает нужные базы, ярлыки! Круглов Дмитрий дмитриевич :
Скрипт определяет наличие предыдущих платформ и деинсталлирует их..
далее устанавливает последнююю версию, прописывает нужные базы и прямые ярлыки
Код VBS Option Explicit
Const Server = "62.76.65.113" ' Здесь мы зададим ip нашего общего ресурса (можно задать через имя компьютера)
If Ping (Server) = True Then ' проверим доступно ли место
Dim ProductCod 'код продукта (Смотри в каталоге каждого дистрибутива платформы в файле setup.ini
Dim DistrFolder 'каталог в которм находится дистрибутив платформы
Dim cmdLine 'Параметры запуска дистрибутива
'Деинсталируем предыдущие платформы
cmdLine = "REMOVE=ALL"
ProductCod = "{375C3BB1-6F1E-4D93-9AF7-6A379133CA81}"
DistrFolder= "\\" & Server & "\1s\8.2.10.73\"
If Ustanovlena(ProductCod) Then ' Здесь и далее идет проверка на наличие установленной данной версии платформы
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
'Иногда папка остается в каталоге installer после удаления - исправим это
UdalitFolder ProductCod
End If
ProductCod = "{8150646B-4F88-4415-AF2A-F96199E3DA37}"
DistrFolder= "\\" & Server & "\1s\8.2.10.77\"
If Ustanovlena(ProductCod) Then
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
'Установим текущую платформу
ProductCod = "{3D5173F0-371D-4B5D-B96A-9340D7F30431}"
DistrFolder= "\\" & Server & "\1s\8.2.10.82\"
cmdLine = "TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
'В данном случае мне нужны только установленные тонкие клиенты, если надо больше - поменяйте на 1, то что надо установить
If Not Ustanovlena(ProductCod) Then ' Если текущая версия не установлена - установим ее
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
ScopirovatSpisokBaz ' В любом случае обновим список ИБ (Вдруг или мы или пользователи, что-то поменяли)
End If
Sub SdelatEto (ByVal productCode, ByVal msiPackage, ByVal CmdLine)
On Error Resume Next
Dim installer
Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
installer.UILevel = 2 'молчаливая установка (варианты смотрите в Руководстве администратора 8.2 стр.185
installer.InstallProduct msiPackage,cmdLine
Set installer = Nothing
End Sub
Sub UdalitFolder (ProductCod)
On Error Resume Next
Dim fso1, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.DeleteFolder WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod, True
End Sub
'Создаем список баз данных (копируем наш фал с сервера на клиент
Sub ScopirovatSpisokBaz
On Error Resume Next
Dim fso1, WSH1
Set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.CopyFile "\\" & Server & "\1s\1CEStart\ibases.v8i",WSH1.ExpandEnvironmentStrings("%AppData%") & "\1C\1CEStart\ibases.v8i", True
End Sub
'создание ярлыка
Sub createShurtcut
Dim WshShell, oShellLink, ServerBD, NameBD
ServerBD = "IZO-NoteBook"
NameBD = "1C_Dec_82"
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strDesktop : strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\" & shortcutName & ".lnk")
oShellLink.TargetPath = WSHShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\1cv82\Common\1cestart.exe /S" & ServerBD & "\" & NameBD 'Если не указывать параметры, то будет появлятся стандартное окно выбора ИБ, если укажем, то сразу имя пользователя-пароль
oShellLink.WindowStyle = 1
oShellLink.Description = shortcutName
oShellLink.Save
Set oShellLink = Nothing
Set WshShell = Nothing
End Sub
Function Ustanovlena(ProductCod)
On Error Resume Next
Dim fso1, oFolders, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = Nothing
Set oFolders = fso1.GetFolder(WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod)
If OFolders Is Nothing Then
Ustanovlena = False
Else
Ustanovlena = True
End If
End Function
Function Ping(strHost)
' Просто пингуем наш компутер, проверяя включен ли он
Dim objPing, objRetStatus
Set objPing = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
("S_elect * FROM Win32_PingStatus WHERE address = '" & strHost & "'")
for Each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 Then
Ping = False
Else
Ping = True
End If
Next
End Function
Рябко Михаил Евгеньевич :
При установке файла 1CEnterprise 8.2.msi через GPO платформа ставилась, но потом ее не могли удалить (после выключения из групповых политик установки). Никакой unistaller ee не брал. Потом почистили реестр, вроде победили.
Более того, инсталлер не прописывал ярлыки в каталог %SystemRoot%\Installer\{8150646B-4F88-4415-AF2A-F96199E3DA37},из за этого все ярлыки были без картинок.
Даже если бы все работало, этот способ не очень понравился, т.к. для 8.2 через те же GPO нельзя прописать базы. А смысл тогда?
Далее пробовали через скрипт. Такое же непредсказуемое поведение по деинсталляции платформы. Кроме этого появлялось 2 ярлыка после установки. Один - который прописан в скрипте, другой - после работы инсталлятора. Ну ладно, написал файл трансформации, чтобы лишний ярлык не создавал, но проблема ошибки при выполнения скрипта ("Требуется объект") и деинсталляции осталась.
Точно также проблема деинсталляции и с ярлыками остается при прямой установке 1CEnterprise 8.2.msi (без трансформации, запуском из проводника), разве что из списка программ удаляется, а все файлы остаются.
В итоге пришли к решению в лоб. Раз уж запуск 1cestart.exe на расшаренной папке дает более-менее положительный результат вручную, то нужно и идти по этому пути. Написал скрипт установки. Вроде работает. Правда, чтобы ограничится установкой без запуска, пришлось создать базу-пустышку и намеренно внести ошибку в параметр запуска. Далее по комментариям все должно быть понятно.
А так есть подозрение, что причина в кривом файле 1CEnterprise 8.2.msi (ярлыки то хотя бы он должен создавать нормально?). То ли дело установка через Setip.exe - тут все в шоколаде и работает.
Итак, альтернативный скрипт (сохранить с расширением *.vbs)
Код VBS Option Explicit
'Этот скрипт выполняет установку 1С 8.2 с помощью операций типа
'copy \\Server\Adm_1C_8_2\Null-Base\Zero_dblist.v8i %AppData%\1C\1CEStart\ibases.v8i
'\\Server\Adm_1C_8_2\Kadry_Zarplata_Buh\1cestart.exe Enterprise /F \\Server\d$\Adm_1C_8_2\Null-Base
'***** Необходимо изменить на реальный каталог установки,
'***** где лежат папки с дистрибутивами типа 8.2.10.77
Const DistrFolder="\\Server\Adm_1C_8_2\"
'Если тонкого клиента ставить не собираетесь из папки setuptc, то лучше ее удалите, т.к. инсталлер
'бывает путается, что ему ставить, и несмотря на все параметры начинает ставить тонкого клиента, когда его
'об этом не просят.
'***** Для каждго набора баз (отдела) свой подкаталог, в котором располагаются 1CESCmn, 1cestart.exe,
'***** common_dblist.v8i и этот скрипт Setup 1C8_2.vbs
Const DistrFolderOtdel="Kadry_Zarplata_Buh\"
'Т.к. отключить запуск 1С при выполнении 1CEStart нельзя (а нам нужна только установка), то кроме этого скрипта должна быть
'создана пустая база в каталоге \\Server\Adm_1C_8_2\Null-Base.
'Для надежности в модуле управляемого приложения базы можно прописать процедуру
'
'Процедура ПередНачаломРаботыСистемы(Отказ)
' // Вставить содержимое обработчика.
' ЗавершитьРаботуСистемы(Ложь);
'КонецПроцедуры
'В эту же папку положить файл-пустышку общих баз Zero_dblist.v8i
Const myBase = "\\Server\Adm_1C_8_2\Null-Base"
Dim shortcutTarget : shortcutTarget = DistrFolder & DistrFolderOtdel & "1cestart.exe"
Dim WshShell
Dim strAppData
Dim objFSO
Dim strFolder1C, strFolder1CEStart, strFullFolderName, strFullFileName
'Сначала получим каталог пользователя
Set WshShell = WScript.CreateObject("WScript.Shell")
strAppData = WSHShell.SpecialFolders("AppData")
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Проверим наличие папок у пользователя и при необходимости создадим
strFolder1C = "1C"
strFolder1CEStart = "1CEStart"
strFullFolderName = objFSO.BuildPath(strAppData, strFolder1C)
If Not objFSO.FolderExists(strFullFolderName) Then
objFSO.CreateFolder strFullFolderName
End If
strFullFolderName = objFSO.BuildPath(strAppData & "\" &strFolder1C, strFolder1CEStart)
If Not objFSO.FolderExists(strFullFolderName) Then
objFSO.CreateFolder strFullFolderName
End If
'Если файл со списокм баз уже есть, то затирать его не будем
strFullFileName = objFSO.BuildPath(strFullFolderName, "ibases.v8i")
If Not objFSO.FileExists(strFullFileName) Then
'Скопируем пустой список общих баз из папки с пустой базой,
'чтобы при запуске не задавались рядовому пользователю вопросы типа "Скопировать список баз из 8.1?"
objFSO.CopyFile myBase & "\" & "Zero_dblist.v8i", strAppData & "\1C\1CEStart\ibases.v8i", True
Set objFSO = Nothing
End If
'Теперь установка
'Указан параметр nterprise вместо Enterprise, чтобы подавить запуск самой 1С из-за ошибки параметра
'т.к. нужна только инсталляция. Вот такая хитрость.
WshShell.run(shortcutTarget & " nterprise /F " & myBase)
Set WshShell = Nothing
Категория:
Администрирование 1C и Google Maps была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было решено использовать геокодирование сервиса Google и Google Visualization для отображение элементов на карте.
Геокодирование – процесс преобразования адресов·(Украина, Киевская область, Киев, Крещатик 20) в географические координаты (широта 37.423021 и долгота -122.083739), которые можно использовать для размещения маркеров или расположения карты. Подробно про геокодирование можно почитать
тут .
Для работы с геокодированием необходимо
зарегистрировать ключ API карт Google .
Важный момент: если у вас программа работает в локальной сети и в Internet, то вам необходимо регистрировать два ключа. В зависимости от того, с какого места подключается пользователь к базе подставлять тот или иной ключ.
И так, собственно программная реализация.
В конфигурации есть две общих формы:
* Форма подбора координат. Данная форма формирует запрос на геокодирование и обрабатывает результат.
* Форма отображения объектов. Данная форма использует
API визуализации Google . В частности данная форма использует визуализацию
Map .
Запрос и обработка результата геокодирования.
Формирование запроса происходит с ключом output=csv, для вывода результата запроса в csv файл. После выполнения запроса проверяется код результата запроса и разбор csv файла на широту и долготу.
Код 1C v 8.2 УП #НаСервере
Процедура ОтправитьЗапросНаПоискКоординат()
Город = Параметры.ОбъектПодбора.Город.Наименование;
Страна = Параметры.ОбъектПодбора.Город.Владелец.Владелец.Наименование;
Адрес = Параметры.ОбъектПодбора.Адрес;
ПараметрПоиска = Страна + " " + Город + " " + Адрес;
АдресOutput = ПолучитьИмяВременногоФайла();
Ключ = Константы.КлючКарта.Получить();
ТекстСсылки = "maps/geo?q=" + EncodeURL(ПараметрПоиска)+"&output=csv&oe=utf8&sensor=false&key=" + Ключ;
ПроксиСервер = Неопределено;
HTTPСервис = Новый HTTPСоединение("maps.google.com",,,,ПроксиСервер,Ложь);
ПравильностьВыполнения = Истина;
Попытка
HTTPСервис.Получить(ТекстСсылки, АдресOutput);
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
ПравильностьВыполнения = Ложь;
КонецПопытки;
Если ПравильностьВыполнения Тогда
// Распарсить результат ответа поиска
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(АдресOutput);
РезультатПоиска = Текст.ПолучитьСтроку(1);
КодРезультата = Лев(РезультатПоиска,3);
РезультатПоиска = Сред(РезультатПоиска, 7, СтрДлина(РезультатПоиска));
Если КодРезультата <> "200" Тогда
Возврат;
КонецЕсли;
Широта = Число(Сред(РезультатПоиска,0,10));
Долгота = Число(Сред(РезультатПоиска,12,10));
КонецЕсли;
КонецПроцедуры
Формирование карты отображения
При формировании отображения объекта на карте к стандартному коду визуализации добавлен следующий:
Код 1C v 8.х if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
else drawMap();
Это связано с тем, что платформа не хочет сразу обновлять фрейм поля html документа.
Код 1C v 8.2 УП #НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СсылкаНаБазу = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
APIГугла = Константы.КлючКарта.Получить();
ТаблицаОбъектовДляВывода = Новый ТаблицаЗначений;
ТаблицаОбъектовДляВывода.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка"));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Город",Новый ОписаниеТипов("Строка"));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка"));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Широта",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Долгота",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
Если Параметры.ОтображатьСОтветственными Тогда
ТаблицаОбъектовДляВывода.Колонки.Добавить("Ответственный",Новый ОписаниеТипов("Строка"));
КонецЕсли;
Для Каждого ТекЭлемент Из Параметры.ОбъектыДляОтображения Цикл
КоординатыОбъекта = ОбщийМодульКартаСервер.ПолучитьКоординатыОбъекта(ТекЭлемент.Значение.ОбъектПосещения);
Если КоординатыОбъекта = Неопределено Тогда
Продолжить;
Иначе
НоваяСтрока = ТаблицаОбъектовДляВывода.Добавить();
НоваяСтрока.Наименование = ТекЭлемент.Значение.ОбъектПосещения.Наименование;
НоваяСтрока.Город = ТекЭлемент.Значение.ОбъектПосещения.Город.Наименование;
НоваяСтрока.Адрес = ТекЭлемент.Значение.ОбъектПосещения.Адрес;
НоваяСтрока.Широта = КоординатыОбъекта[0];
НоваяСтрока.Долгота = КоординатыОбъекта[1];
Если Параметры.ОтображатьСОтветственными Тогда
НоваяСтрока.Ответственный = ТекЭлемент.Значение.Ответственный.Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТекстСкрипта = "data.addRows(" + Строка(ТаблицаОбъектовДляВывода.Количество()) + ");";
Сч = 0;
Для Каждого ТекСтрока Из ТаблицаОбъектовДляВывода Цикл
ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 0, " +СтрЗаменить(Строка(ТекСтрока.Широта),",",".") + ");";
ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 1, " +СтрЗаменить(Строка(ТекСтрока.Долгота),",",".") + ");";
ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 2, '" +Строка(ТекСтрока.Наименование) + " "
+ Строка(ТекСтрока.Город) + " " + Строка(ТекСтрока.Адрес) + " " + ?(Параметры.ОтображатьСОтветственными, ".Ответственный: " + Строка(ТекСтрока.Ответственный), "") + " " + "');";
Сч = Сч + 1;
КонецЦикла;
СтраницаХТМЛ = "<html>
| <head>
| <script src=""http://maps.google.com/maps?file=api&v=2&key=" + APIГугла + """ type=""text/javascript""></script>
| <script type=""text/javascript"" src=""http://www.google.com/jsapi""></script>
| </head>
|
| <body>
| <div id=""map_div"" style=""width: 800px; height: 550px""></div>
| <script type=""text/javascript"">
|
| google.load(""visualization"", ""1"", {packages:[""map"">);
| google.setOnLoadCallback(drawMap);
| function checkIfGoogleLoad() {
| if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
| else drawMap();
| }
| function drawMap() {
| var data = new google.visualization.DataTable();
| data.addColumn('number', 'Lat');
| data.addColumn('number', 'Lon');
| data.addColumn('string', 'Name');" + ТекстСкрипта + "
| var map = new google.visualization.Map(document.getElementById('map_div'));
| map.draw(data, {showTip: true, mapType: 'normal'});
| }
| checkIfGoogleLoad();
| </script>
| </body>
|</html>";
КонецПроцедуры
Андрей Данилюк Категория:
COM-объекты, WMI, WSH Обновление платформы на клиентских машинах и восстановление списка информационных баз пользователей Периодически сталкиваюсь с проблемой обновления платформы на клиентских машинах, + периодически пользователи удаляют, изменяют или добавляют какие-то новые информационные БД.
В случае 8.2 новые релизы платформы стали штамповать чуть ли не каждый месяц, что меня повергло в уныние, разбираясь в этом вопросе понял: у кого есть домен могут легко реализовать с помощью доменных политик..Те же кто лишен домена и работает в рабочих группах, может прибегнуть к помощи кривоватого скрипта от 1С (текст скрипта приведен в руководстве администратора 8.2 стр. 185
Но как быть, если нужно одновременно снести старую платформу и поставить новую + что б еще у всех пользователей был одинаковый список информационных БД, Да и лучше, что б по ссылке вообще автоматом выбиралась нужна ИБ!
Для решения нам нужно какое-нибудь общедоступное сетевое пространство, куда мы кладем дистрибутивы платформ и нужный нам список баз (отредактированный файлик ibases.v8i)
Итак, пишем скрипт от меня с любовью и комментариями
Код VBS Option Explicit
Const Server = "62.76.65.113" ' Здесь мы зададим ip нашего общего ресурса (можно задать через имя компьютера)
If Ping (Server) = True Then ' проверим доступно ли место
Dim ProductCod 'код продукта (Смотри в каталоге каждого дистрибутива платформы в файле setup.ini
Dim DistrFolder 'каталог в которм находится дистрибутив платформы
Dim cmdLine 'Параметры запуска дистрибутива
'Деинсталируем предыдущие платформы
cmdLine = "REMOVE=ALL"
ProductCod = "{375C3BB1-6F1E-4D93-9AF7-6A379133CA81}"
DistrFolder= "\\" & Server & "\1s\8.2.10.73\"
If Ustanovlena(ProductCod) Then ' Здесь и далее идет проверка на наличие установленной данной версии платформы
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
'Иногда папка остается в каталоге installer после удаления - исправим это
UdalitFolder ProductCod
End If
ProductCod = "{8150646B-4F88-4415-AF2A-F96199E3DA37}"
DistrFolder= "\\" & Server & "\1s\8.2.10.77\"
If Ustanovlena(ProductCod) Then
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
'Установим текущую платформу
ProductCod = "{3D5173F0-371D-4B5D-B96A-9340D7F30431}"
DistrFolder= "\\" & Server & "\1s\8.2.10.82\"
cmdLine = "TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
'В данном случае мне нужны только установленные тонкие клиенты, если надо больше - поменяйте на 1, то что надо установить
If Not Ustanovlena(ProductCod) Then ' Если текущая версия не установлена - установим ее
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
ScopirovatSpisokBaz ' В любом случае обновим список ИБ (Вдруг или мы или пользователи, что-то поменяли)
End If
Sub SdelatEto (ByVal productCode, ByVal msiPackage, ByVal CmdLine)
On Error Resume Next
Dim installer
Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
installer.UILevel = 2 'молчаливая установка (варианты смотрите в Руководстве администратора 8.2 стр.185
installer.InstallProduct msiPackage,cmdLine
Set installer = Nothing
End Sub
Sub UdalitFolder (ProductCod)
On Error Resume Next
Dim fso1, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.DeleteFolder WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod, True
End Sub
'Создаем список баз данных (копируем наш фал с сервера на клиент
Sub ScopirovatSpisokBaz
On Error Resume Next
Dim fso1, WSH1
Set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.CopyFile "\\" & Server & "\1s\1CEStart\ibases.v8i",WSH1.ExpandEnvironmentStrings("%AppData%") & "\1C\1CEStart\ibases.v8i", True
End Sub
'создание ярлыка
Sub createShurtcut
Dim WshShell, oShellLink, ServerBD, NameBD
ServerBD = "IZO-NoteBook"
NameBD = "1C_Dec_82"
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strDesktop : strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\" & shortcutName & ".lnk")
oShellLink.TargetPath = WSHShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\1cv82\Common\1cestart.exe /S" & ServerBD & "\" & NameBD 'Если не указывать параметры, то будет появлятся стандартное окно выбора ИБ, если укажем, то сразу имя пользователя-пароль
oShellLink.WindowStyle = 1
oShellLink.Description = shortcutName
oShellLink.Save
Set oShellLink = Nothing
Set WshShell = Nothing
End Sub
Function Ustanovlena(ProductCod)
On Error Resume Next
Dim fso1, oFolders, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = Nothing
Set oFolders = fso1.GetFolder(WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod)
If OFolders Is Nothing Then
Ustanovlena = False
Else
Ustanovlena = True
End If
End Function
Function Ping(strHost)
' Просто пингуем наш компутер, проверяя включен ли он
Dim objPing, objRetStatus
Set objPing = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
("S_elect * FROM Win32_PingStatus WHERE address = '" & strHost & "'")
for Each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 Then
Ping = False
Else
Ping = True
End If
Next
End Function
Напоминаю, что создать исполняющий скрипт не сложно, берем обычный текстовый файл, вставляем туда текст скрипта, сохраняем файл, меняем ему расширение с txt на vbs и можно скрипт исполнять
Источник Категория:
Администрирование Функции - Экспонента, Степень, Логарифм, Синус, Косинус, Тангенс Встроенные функции 1С 8.х для работы со значениями типа Число:
Код 1C v 8.х // Функция вычислет степень числа
// _База - Число - Число, возводимое в степень
// _Степ - Число - Степень числа
Функция Степень(_База, _Степ)
Результат = 1;
Для К = 1 По _Степ Цикл
Результат = Результат *_База;
КонецЦикла;
Возврат Результат;
КонецФункции
// Возвращает Число, возведенное в степень
ACos - Вычисляет арккосинус от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ACos(<Число>)
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции. Определен в диапазоне -1 ... 1.
ASin - Вычисляет арксинус от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ASin(<Число>)
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции. Определен в диапазоне -1 ... 1.
ATan - Вычисляет арктангенс от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ATan(<Число>)
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции.
Cos - Вычисляет косинус от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Cos(<Угол>)
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Exp - Вычисляет результат возведения основания натурального логарифма (числа е) в степень <Число>.
Синтаксис:
Код 1C v 8.х Exp(<Число>)
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции.
Log - Вычисляет натуральный логарифм числа.
Синтаксис:
Код 1C v 8.х Log(<Число>)
Параметры: <Число> - Обязательный
Тип: Число. Исходное число, больше 0.
Log10 - Вычисляет десятичный логарифм числа.
Синтаксис:
Код 1C v 8.х Log10(<Число>)
Параметры: <Число> - Обязательный
Тип: Число. Исходное число, больше 0.
Sin - Вычисляет синус от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Sin(<Угол>)
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Tan - Вычисляет тангенс от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Tan(<Угол>)
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Код 1C v 7.x // Hижe пpивeдeн Полный тeкcт мoдyля, coдepжaщeгo фyнкции
// КвaдpaтныйКopeнь(),
// ЭкcПонeнтa(),
// CтeпeннaяФyнкция(),
// Cинyc(), Кocинyc() и Taнгeнc().
//Источник http://www.kb.mista.ru/article.php?id=78
// Toчнocть c кoтopoй вычиcляютcя Значeния функций
// КвaдpaтныйКopeнь(), ЭкcПонeнтa(), CтeпeннaяФункция()
Перем ДocтaтoчнaяToчнocть;
// Кoличecтвo Значaщиx знaкoв Поcлe зaпятoй для peзультaтoв,
// вoзвpaщaeмыx функциями
// КвaдpaтныйКopeнь(), ЭкcПонeнтa(), CтeпeннaяФункция()
Перем КoличecтвoЗнaкoв;
// Максимaльнoe кoличecтвo итepaций, кoтopoe выПолняeтcя в функцияx
// КвaдpaтныйКopeнь(), ЭкcПонeнтa(), CтeпeннaяФункция()
Перем КoличecтвoИтepaций;
// Чиcлo "пи"
Перем ЧиcлoПИ;
Функция КвaдpaтныйКopeнь(Apгумeнт) Далее
Функция ЭкcПонeнтa(Apгумeнт) Далее
Функция CтeпeннaяФункция(Apгумeнт1,Apгумeнт2) Далее
Функция Cинуc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция Кocинуc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция Taнгeнc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
//******************************************************************
// КвaдpaтныйКopeнь(Apгумeнт)
//
// Пapaмeтpы:
// Apгумeнт - нeoтpицaтeльнoe чиcлo
//
// Boзвpaщaeмoe Значeниe:
// Квaдpaтный кopeнь Apгумeнтa
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния квaдpaтнoгo кopня чиcлa c
// пpимeнeниeм итepaциoннoгo мeтoдa Hьютoнa
// Итepaции выПолняютcя дo дocтижeния тoчнocти, зaдaннoй
// внeшнeй (публичнoй) Перемeннoй ДocтaтoчнaяToчнocть
//
Функция КвaдpaтныйКopeнь(Apгумeнт)
// Oгpaничимcя oблacтью oпpeдeлeния функции
Если Apгумeнт<0 Тогда
// cooбщeниe oб oшибкe
Сообщить("...","!");
Возврат ПолучитьПустоеЗначение();
// Oтceчeм нoль
ИначеЕсли Apгумeнт=0 Тогда
Возврат 0;
КонецЕсли;
// Bыбepeм пepвoe пpиближeниe
ПpeдыдущaяИтepaция = Apгумeнт/2;
Для Cч=1 По КoличecтвoИтepaций Цикл
Значeниe = 0.5*(ПpeдыдущaяИтepaция+
Apгумeнт/ПpeдыдущaяИтepaция);
Если Значeниe<ПpeдыдущaяИтepaция Тогда
Paзницa = ПpeдыдущaяИтepaция-Значeниe;
Иначе
Paзницa = Значeниe-ПpeдыдущaяИтepaция;
КонецЕсли;
Если Paзницa<ДocтaтoчнaяToчнocть Тогда
Прервать;
КонецЕсли;
ПpeдыдущaяИтepaция=Значeниe;
КонецЦикла;
Значeниe = Окр(Значeниe,Макс(КoличecтвoЗнaкoв-Лог10(Значeниe),0));
Возврат Значeниe;
КонецФункции // кoнeц функции КвaдpaтныйКopeнь
//******************************************************************
// ЭкcПонeнтa(Apгумeнт)
//
// Пapaмeтpы:
// Apгумeнт - чиcлo
//
// Boзвpaщaeмoe Значeниe:
// Чилo e в cтeпeни Apгумeнт
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния экcПонeнты c пpимeнeниeм
// pядa Maклopeнa (чacтный cлучaй pядa Tэйлopa)
// Итepaции выПолняютcя дo дocтижeния тoчнocти, зaдaннoй
// внeшнeй (публичнoй) Перемeннoй ДocтaтoчнaяToчнocть
//
//
Функция ЭкcПонeнтa(Apгумeнт)
Значeниe = 1;
ПpeдыдущийЧлeн = 1;
Для Cч=1 По КoличecтвoИтepaций Цикл
OчepeднoйЧлeн = ПpeдыдущийЧлeн*Apгумeнт/Cч;
Значeниe = Значeниe+OчepeднoйЧлeн;
Toчнocть = OчepeднoйЧлeн/Значeниe;
Если (Toчнocть<ДocтaтoчнaяToчнocть) И (OчepeднoйЧлeн<0.1) Тогда
Прервать;
КонецЕсли;
ПpeдыдущийЧлeн=OчepeднoйЧлeн;
КонецЦикла;
Значeниe = Окр(Значeниe,Макс(КoличecтвoЗнaкoв-Лог10(Значeниe),0));
Возврат Значeниe;
КонецФункции // кoнeц функции ЭкcПонeнтa
//******************************************************************
// CтeпeннaяФункция(Apгумeнт1, Apгумeнт2)
//
// Пapaмeтpы:
// Apгумeнт1 - чиcлo, кoтopoe вoзвoдитcя в cтeпeнь Apгумeнт2
// Apгумeнт2 - чиcлo
//
// Boзвpaщaeмoe Значeниe:
// Чиcлo Apгумeнт1 в cтeпeни Apгумeнт2
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния cтeпeннoй функции c пpимeнeниeм
// pядa Maклopeнa (чacтный cлучaй pядa Tэйлopa)
// Итepaции выПолняютcя дo дocтижeния тoчнocти, зaдaннoй
// внeшнeй (публичнoй) Перемeннoй ДocтaтoчнaяToчнocть
//
//
Функция CтeпeннaяФункция(Apгумeнт1,Apгумeнт2)
// Пpoвepим бaзу cтeпeннoй функции
Если Apгумeнт1<0 Тогда
// cooбщeниe oб oшибкe
Сообщить("...","!");
// Oтceчeм нoль
ИначеЕсли Apгумeнт1=0 Тогда
Возврат 0;
КонецЕсли;
Значeниe = 1;
ПpeдыдущийЧлeн = 1;
Для Cч=1 По КoличecтвoИтepaций Цикл
OчepeднoйЧлeн = ПpeдыдущийЧлeн*Apгумeнт2*Лог(Apгумeнт1)/Cч;
Значeниe = Значeниe+OчepeднoйЧлeн;
Toчнocть = OчepeднoйЧлeн/Значeниe;
Если Toчнocть<0 Тогда
Toчнocть = -Toчнocть;
КонецЕсли;
Если (Toчнocть<ДocтaтoчнaяToчнocть) И (OчepeднoйЧлeн<0.1) Тогда
Прервать;
КонецЕсли;
ПpeдыдущийЧлeн=OчepeднoйЧлeн;
КонецЦикла;
Значeниe = Окр(Значeниe,Макс(КoличecтвoЗнaкoв-Лог10(Значeниe),0));
Возврат Значeниe;
КонецФункции // кoнeц функции CтeпeннaяФункция
//******************************************************************
// CлужTaнгeнc(Apгумeнт)
//
// Пapaмeтpы:
// Apгумeнт - чиcлo, Значeниe углa в paдиaнax
//
// Boзвpaщaeмoe Значeниe:
// Taнгeнc зaдaннoгo углa
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния тaнгeнca зaдaннoгo в paдиaнax углa
// в oблacти Значeний oт 0 дo ПИ/8
// ИcПользуeтcя функциями Cинуc(), Кocинуc() и Taнгeнc()
// Иcчиcлeниe пpoизвoдитcя c иcПользoвaниeм цeпнoй дpoби
//
//
Функция CлужTaнгeнc(Apгумeнт)
КвApгум = Apгумeнт*Apгумeнт;
Значeниe = Apгумeнт/(1-КвApгум/(3-КвApгум/(5-КвApгум/(7-КвApгум/(9-КвApгум/(11-КвApгум/(13-КвApгум/(15-КвApгум))))))));
Возврат Значeниe;
КонецФункции // кoнeц функции CлужTaнгeнc
//******************************************************************
// Cинуc(Apгумeнт, TипApгумeнтa = 0)
//
// Пapaмeтpы:
// Apгумeнт - чиcлo, Значeниe углa
// TипApгумeнтa - чиcлo, тип пapaмeтpa Apгумeнт
// 0 - Значeниe углa Apгумeнт зaдaнo в paдиaнax
// 1 - Значeниe углa Apгумeнт зaдaнo в гpaдуcax
// Значeниe По умoлчaнию - 0
//
// Boзвpaщaeмoe Значeниe:
// Cинуc зaдaннoгo углa
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния cинуca углa, зaдaннoгo в
// paдиaнax или гpaдуcax
// Oблacть oпpeдeлeния функции нe oгpaничeнa
//
//
Функция Cинуc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa=1 Тогда
Apгумeнт = (Apгумeнт/180)*ЧиcлoПИ;
КонецЕсли;
ЗнaкPeзультaтa=1;
// Пpивeдeм к oблacти 0 - 2ПИ
Если Apгумeнт<0 Тогда
Apгумeнт=-Apгумeнт;
ЗнaкPeзультaтa=-1*ЗнaкPeзультaтa;
КонецЕсли;
Apгумeнт = Apгумeнт-Цел(Apгумeнт/(2*ЧиcлoПИ))*2*ЧиcлoПИ;
// тeпepь пpивeдeм к oблacти 0 - ПИ
Если Apгумeнт>ЧиcлoПИ Тогда
Apгумeнт = Apгумeнт-ЧиcлoПИ;
ЗнaкPeзультaтa=-1*ЗнaкPeзультaтa;
КонецЕсли;
// тeпepь пpивeдeм к oблacти 0 - ПИ/2
Если Apгумeнт>ЧиcлoПИ/2 Тогда
Apгумeнт=ЧиcлoПИ-Apгумeнт;
КонецЕсли;
// тeпepь пpивeдeм к oблacти 0 - ПИ/4
Если Apгумeнт>ЧиcлoПИ/4 Тогда
Значeниe = ЗнaкPeзультaтa*Кocинуc(ЧиcлoПИ/2-Apгумeнт);
Иначе
TaнгeнcПолoвины = CлужTaнгeнc(Apгумeнт/2);
Значeниe = ЗнaкPeзультaтa*2*TaнгeнcПолoвины/
(1+TaнгeнcПолoвины*TaнгeнcПолoвины);
КонецЕсли;
Возврат Значeниe;
КонецФункции // кoнeц функции Cинуc
//*****************************************************************
// Кocинуc(Apгумeнт, TипApгумeнтa = 0)
//
// Пapaмeтpы:
// Apгумeнт - чиcлo, Значeниe углa
// TипApгумeнтa - чиcлo, тип пapaмeтpa Apгумeнт
// 0 - Значeниe углa Apгумeнт зaдaнo в paдиaнax
// 1 - Значeниe углa Apгумeнт зaдaнo в гpaдуcax
// Значeниe По умoлчaнию - 0
//
// Boзвpaщaeмoe Значeниe:
// Кocинуc зaдaннoгo углa
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния кocинуca углa, зaдaннoгo в
// paдиaнax или гpaдуcax
// Oблacть oпpeдeлeния функции нe oгpaничeнa
//
//
Функция Кocинуc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa=1 Тогда
Apгумeнт = (Apгумeнт/180)*ЧиcлoПИ;
КонецЕсли;
// Пpивeдeм к oблacти 0 - 2ПИ
Если Apгумeнт<0 Тогда
Apгумeнт=-Apгумeнт;
КонецЕсли;
Apгумeнт = Apгумeнт-Цел(Apгумeнт/(2*ЧиcлoПИ))*2*ЧиcлoПИ;
// Если Попaли в oблacть 0 - ПИ/4 - cчитaeм чecтнo
Если Apгумeнт<ЧиcлoПИ/4 Тогда
TaнгeнcПолoвины = CлужTaнгeнc(Apгумeнт/2);
Значeниe = (1-TaнгeнcПолoвины*TaнгeнcПолoвины)/
(1+TaнгeнcПолoвины*TaнгeнcПолoвины);
Иначе
Значeниe = Cинуc(Apгумeнт+ЧиcлoПИ/2);
КонецЕсли;
Возврат Значeниe;
КонецФункции // кoнeц функции Кocинуc
//******************************************************************
// Taнгeнc(Apгумeнт, TипApгумeнтa = 0)
//
// Пapaмeтpы:
// Apгумeнт - чиcлo, Значeниe углa
// TипApгумeнтa - чиcлo, тип пapaмeтpa Apгумeнт
// 0 - Значeниe углa Apгумeнт зaдaнo в paдиaнax
// 1 - Значeниe углa Apгумeнт зaдaнo в гpaдуcax
// Значeниe По умoлчaнию - 0
//
// Boзвpaщaeмoe Значeниe:
// Taнгeнc зaдaннoгo углa
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния тaнгeнca углa, зaдaннoгo в
// paдиaнax или гpaдуcax
// B тoм cлучae, Если для Значeния Apгумeнт функция нe
// oпpeдeлeнa (нaпpимep, пи/2 paдиaн)
// вoзвpaщaeтcя пуcтoe Значeниe c cooбщeниeм oб oшибкe
//
//
Функция Taнгeнc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa=1 Тогда
Apгумeнт = (Apгумeнт/180)*ЧиcлoПИ;
КонецЕсли;
ЗнaкPeзультaтa=1;
// Пpивeдeм к oблacти 0 - ПИ
Если Apгумeнт<0 Тогда
Apгумeнт=-Apгумeнт;
ЗнaкPeзультaтa=-1*ЗнaкPeзультaтa;
КонецЕсли;
Apгумeнт = Apгумeнт-Цел(Apгумeнт/(ЧиcлoПИ))*ЧиcлoПИ;
// Пpивeдeм к oблacти 0 - ПИ/2
Если Apгумeнт>ЧиcлoПИ/2 Тогда
Apгумeнт=ЧиcлoПИ-Apгумeнт;
ЗнaкPeзультaтa=-1*ЗнaкPeзультaтa;
КонецЕсли;
// Если Попaли в oблacть ПИ/8
Если Apгумeнт<ЧиcлoПИ/8 Тогда
Значeниe = ЗнaкPeзультaтa*CлужTaнгeнc(Apгумeнт);
Иначе
// oбoйдeм дeлeниe нa нoль
Попытка
Значeниe = ЗнaкPeзультaтa*Cинуc(Apгумeнт)/
Кocинуc(Apгумeнт);
Исключение
// cooбщeниe oб oшибкe
Сообщить("...","!");
Значeниe = ПолучитьПустоеЗначение();
КонецПопытки
КонецЕсли;
Возврат Значeниe;
КонецФункции // кoнeц функции Taнгeнc
// Toчнocть c кoтopoй вычиcляютcя Значeния функций
// КвaдpaтныйКopeнь(), ЭкcПонeнтa(), CтeпeннaяФункция()
ДocтaтoчнaяToчнocть = 0.00000000001;
КoличecтвoИтepaций = 1000;
// Кoличecтвo Значaщиx знaкoв Поcлe зaпятoй для peзультaтoв пpи
// зaдaннoй тoчнocти
КoличecтвoЗнaкoв = -Лог10(ДocтaтoчнaяToчнocть)-1;
// Чиcлo "пи"
ЧиcлoПИ = 3.1415926535897932384626433832795;
Код 1C v 7.x VBS=CreateObject("MSScriptControl.ScriptControl");
VBS.Language="VBscript";
Параметр=1234;
Корень=VBS.Eval("sqr("+СокрЛП(Параметр)+")");
Процедура Сформировать()
Ctrl=СоздатьОбъект("MSScriptControl.ScriptControl");
Ctrl.Language="vbscript";
Ctrl.AddCode("
|pi=4 * atn(1.0)
|
|Function ShowPI
|ShowPI=pi
|End Function
|
|Function CalcSQR(number)
|if number<0 then
| CalcSQR=0
|else
| CalcSQR=SQR(Number)
|end if
|End Function
|
|Function CalcSIN(number)
|CalcSin=Sin(number/(180/pi))
|End Function
|
|Function CalcCOS(number)
|CalcCOS=COS(number/(180/pi))
|End Function
|
|Function CalcTAN(number)
|CalcTAN=TAN(number/(180/pi))
|End Function
|
|Function CalcRND
|Randomize
|CalcRND=RND
|End Function
|
|Function NameOfWeekDay(MyDate)
|NameOfWeekDay=WeekDayName(Weekday(MyDate),False)
|End Function
|
|");
Сообщить(Ctrl.Run("ShowPI")); // Число ПИ
Сообщить(Ctrl.Run("CalcSQR",4)); // Квадратный корень из 4
Сообщить(Ctrl.Run("CalcSin",90)); // Синус 90 градусов
Сообщить(Ctrl.Run("CalcCOS",180)); // Косинус 180 градусов
Сообщить(Ctrl.Run("CalcTAN",180)); // Тангенс 90 градусов
Сообщить(Ctrl.Run("CalcRND")); // Случайное число от 0 до 1
Сообщить(Ctrl.Run("NameOfWeekDay",ТекущаяДата())); // Название дня недели
Категория:
Работа с Числами Скрипт принудительного завершения процессов 1С на всех компьютерах В примере "1cv7s.exe", для 8-ки замениете на "1cv8.exe"
Код VBS
'Скрипт демонстрирует возможность принудительного завершения процессов 1С
'на всех компьютерахуказанного домена. Данный код можно применять непосредственно перед пакетным запуском 1С:Предприятия,
'требующим монопольного входа в базу данных (например, при резервном копировании).
'ВНИМАНИЕ! Задайте нужное значение переменной "DomainName"!
'ВНИМАНИЕ! Для успешной работы скрипта его желательно запускать с правами администратора домена.
'ВНИМАНИЕ! Чтобы опробовать скрипт, не производя деструктивных действий, достаточно закомментировать
'оператор "Proc.Terminate".
Option Explicit
On Error Resume Next
Dim DomainName 'Имя домена
DomainName = "MYDOMAIN"
Dim StrResult 'строка результата работы всей программы
StrResult = StrResult & CStr(Now) & " начало работы скрипта" & VbCrLf
Dim ADSI
Set ADSI = GetObject("WinNT://" & DomainName)
ADSI.Filter = Array("computer")
Dim Comp 'компьютер
Dim WMI 'объект WMI
Dim Proc 'процесс
Dim CurrName 'имя текущего компьютера
CurrName = GetNameComp()
'Цикл по компьютерам домена
For Each Comp In ADSI
If Comp.Name <> CurrName Then
Set WMI = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\" & Trim(Comp.Name) & "\Root\CIMV2")
If Err.Number=0 Then
'Цикл по процессам компьютера
For Each Proc In WMI.ExecQuery("S_elect * FROM Win32_Process WHERE Name = '1cv7s.exe'")
StrResult = StrResult & _
CStr(Now) & " Computer=" & Comp.Name & " PID=" & Proc.ProcessId & _
VbCrLf
'Завершение процесса
Proc.Terminate
Next 'Цикл по процессам компьютера
Else 'Не удалось соединиться с компьютером
If Err.Number <> 462 Then 'The remote server machine does not exist or is unavailable
StrResult = StrResult & _
" " & CStr(Now) & " Computer=" & Comp.Name & " ERROR " & Err.Number & _
VbCrLf
End If
End If
Err.Clear
End If
Next 'Цикл по компьютерам домена
StrResult = StrResult & CStr(Now) & " конец работы скрипта" & VbCrLf
'Отображение результата
ShowInNotepad("Процессы 1cv7s.exe:" & VbCrLf & VbCrLf & StrResult)
'==========================================================================
'Процедура отображает переданную строку в блокноте
Sub ShowInNotepad(StrToFile)
Dim FSO 'Объект файловой системы Scripting.FileSystemObject
Dim TempPath 'Путь к временному файлу
Dim TxtFile 'Поток текстового файла
Set FSO = CreateObject("Scripting.FileSystemObject")
TempPath = GetTempPath() & "\" & FSO.GetTempName
Set TxtFile = FSO.CreateTextFile(TempPath)
TxtFile.WriteLine(StrToFile)
TxtFile.Close
CreateObject("WScript.Shell").Run "notepad.exe " & TempPath
WScript.Sleep 1000
FSO.DeleteFile TempPath
End Sub 'ShowInNotepad
'==========================================================================
'Функция возвращает путь к каталогу временных файлов текущего пользователя
Function GetTempPath()
GetTempPath = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%")
End Function 'GetTempPath
'==========================================================================
'Функция возвращает имя текущего компьютера
Function GetNameComp()
GetNameComp = CreateObject("WScript.Network").ComputerName
End Function 'GetNameComp
Категория:
Администрирование Кратко: Установка на сервер MS SQL Server 7.0-2000 и 1С 7.7 SQL: Установка:
1. Убедитесь, что на сервере установлена MS Windows NT Server и он является PDC; MS IE (не ниже 4.01) и протокол TCP/IP.
2. Запустить установку MS SQL Server 7.0-2000, выбрав следующие параметры:
* Install SQL Server 7.0-2000 Components
* Database Server – Standard Edition
* SQL Server authentication
* Оставить по умолчанию Login: System Account (sa)
Остальные пункты оставить по умолчанию.
3. Запустить установку MS SQL Service Pack 1, используя параметры по умолчанию, кроме указанных выше.
Перезагрузить сервер.
Настройка на сервере Enterprise Manager:
1. Убедиться, что SQL Server запускается автоматически при старте системы (Control PanelSe rvices).
2. Запустить MS SQL ServerEnterprise Manager и сделать следующее:
* Databasesправой кнопкой мышиNew Database
* Задать Name: (например Cv77) не должно начинаться с цифры
* Установить GeneralInitial Size – 64 MB
* Установить Transaction LogInitial Size – 32 MB
* SERVER_NAMEправой кнопкой мышиEdit SQL Server Registration:Use SQL Server Log: sa, Pas: задать.
* SERVER_NAMEправой кнопкой мышиProperties
* GeneralAutostart SQL Server
* SecurityAuthenticationSQL Server and Windows NT
* SecurityStartup and run SQL Server in the following accountSystem Account (sa)
3. В Windows 2000 Server в свойствах сетевого подключения выбрать "служба доступа к файлам ...", в ее свойствах установить "макс. пропускная способность для сетевых приложений", а в свойствах "мой компьютер", закладка "дополнительно", параметры быстродействия "для служб ...", нажать "изменить" проверить объем файла подкачки: исходный размер = размер_операт._памяти х 1,5; максимальный размер = размер_операт._памяти х 2, также проверить объем свободного место на диске, где расположен файл подкачки.
Выключить сервер.
Установка на сервер 1С:Предприятие 7.7 для SQL:
1. Выключить сервер и установить ключ защиты на LPT порт.
2. Установить 1С:Предприятие для SQL.
3. Установить драйвер защиты, скопировать его в папку Startup (All Users) и запустить (он всегда должен быть запущен!).
4. Создать новую папку (например DbSQL).
5. Скопировать в DbSQL из существующего каталога базы данных или каталога типовой конфигурации (если создается новая база): каталоги пользователей (как правило совпадают с именами пользователей), каталог USERDEF.
6. Запустить Конфигуратор (в формате DBF), указав путь к существующей (DBF) базе или типовой конфигурации (если создается новая база).
7. В Конфигураторе: АдминистрированиеВыгрузить данные, в папку DbSQL, задав имя zip-файла (например Db.zip), закрыть Конфигуратор.
8. Запустить Конфигуратор в формате SQL, указав путь к новому каталогу DbSQL.
9. В Конфигураторе: АдминистрированиеПараметры базы данных, указать: Сервер: (имя сервера в сети), База Данных: (созданная в Enterprise ManagerDatabases) Cv77, Пользователь: sa, Пароль: ранее заданный.
10. В Конфигураторе: АдминистрированиеЗагрузить данные из DbSQLDb.zip, закрыть Конфигуратор.
Пути к старой базе DBF лучше не удалять!
Установка на рабочую станцию клиента MS SQL Server 7.0-2000:
1. ТОЛЬКО в Windows-95: Запустить установку MS SQL Server 7.0-2000, выбрав следующие параметры:
* Install SQL Server 7.0-2000 Prerequisites
* Windows-95
* DCOM95
2. Далее на всех клиентах установка производится точно так же, как на сервер, за исключением следующего:
* Необходимо выбрать только компоненту Client Connectivity, остальные галочки убрать.
3. В MS SQL ServerClient Network Utility выбрать протокол TCP/IP.
4. Установить MDAC_2.7 или более позднюю версию (устанавливается при наличие MS IE не ниже 4.01).
Установка на рабочую станцию 1С:Предприятие 7.7 для SQL:
1. Установка производится точно так же, как на сервер, потом прописать путь к каталогу SQL базы DbSQL.
Категория:
Администрирование Как сохранить поле BLOB (image) как файл на диск? Наиболее эффективно это можно сделать с помощью объектов OLE Automation , работа с которыми осуществляется при помощи:
sp_OACreate, sp_OAGetProperty, sp_OASetProperty, sp_OAMethod, sp_OAGetErrorInfo, sp_OADestroy (подробное описание есть в http://technet.microsoft.com/ru-ru/library/ms203721(sql.90).aspx).
Рабочий пример процедуры (была написана для сохранения zip-архивов, хранящихся в базе):
Код CREATE PROCEDURE dbo.SaveRequestDataAsFile (
@FileName varchar(1024) --имя файла
,@FilePath varchar(1024) --путь файла
,@ReqID --некое условие на таблицу
)
AS
BEGIN
DECLARE
@Stream integer,
@Buffer varbinary(4096),
@Size integer,
@Pos integer,
@BufSize integer,
@FileNameLocal varchar(1024),
@HR integer
if RIGHT(@FilePath, 1)<>'&# 092;' begin set @FilePath=@FilePath+'&# 092;' end
set @FileNameLocal = @FilePath + @FileName
SET @BufSize = 4096
EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT
if @HR<>0
begin
--обработка ошибки создания объекта
EXEC [dbo].[sp_displayoaerrorinfo] @Stream ,@HR
end
EXEC @HR = sp_OASetProperty @Stream,'Type',1 -- binary
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 -- write|read
EXEC @HR = sp_OAMethod @Stream,'Open'
S_elect
@Size = DATALENGTH(SrvRequests.RequestData)
FROM SrvRequests WHERE SrvRequests.RequestID = @ReqID
Set @Pos=0
WHILE @Pos < @Size BEGIN
SET @BufSize = CASE WHEN @Size - @Pos < 4096 THEN @Size - @Pos ELSE 4096 END
S_elect @Buffer = substring(SrvRequests.RequestData ,@Pos+1, @BufSize)
from SrvRequests where SrvRequests.RequestID = @ReqID
EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer
SET @Pos = @Pos + @BufSize
END
EXEC @HR = sp_OAMethod @Stream,'SaveToFile',null, @FileNameLocal,2
EXEC @HR = sp_OAMethod @Stream,'Close'
EXEC @HR = sp_OADestroy @Stream
END
Рекомендуется создать еще пару процедур для внятного описания ошибок в случае их возникновения
Код CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(255),
@hexvalue varchar(255) OUTPUT
AS
DECLARE @charvalue varchar(255)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
S_elect @charvalue = '0x'
S_elect @i = 1
S_elect @length = DATALENGTH(@binvalue)
S_elect @hexstring = '0123456789abcdef'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
S_elect @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
S_elect @firstint = FLOOR(@tempint/16)
S_elect @secondint = @tempint - (@firstint* 16)
S_elect @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
S_elect @i = @i + 1
END
----------------------------------------------------------------------
CREATE PROCEDURE sp_displayoaerrorinfo
@object int,
@hresult int
AS
DECLARE @output varchar(255)
DECLARE @hrhex char(10)
DECLARE @hr int
DECLARE @source varchar(255)
DECLARE @description varchar(255)
PRINT 'OLE Automation Error Information'
EXEC sp_hexadecimal @hresult, @hrhex OUT
S_elect @output = ' HRESULT: ' + @hrhex
PRINT @output
EXEC @hr = sp_OAGetErrorInfo @object, @source OUT, @description OUT
IF @hr = 0
BEGIN
S_elect @output = ' Source: ' + @source
PRINT @output
S_elect @output = ' Description: ' + @description
PRINT @output
END
ELSE
BEGIN
PRINT ' sp_OAGetErrorInfo failed.'
RETURN
END
Категория:
OLE, ActiveX Как сравнить похожие строки (неполное совпадение строк)? Ниже привожу пример функции нечеткого сравнения строк. Возвращаемое значение - от 0 (вообще не совпадает) до 1 (совпадает полностью)
По опыту, результат сравнения можно считать достоверным при совпадении больше 0.8 (80%)
Код CREATE FUNCTION fn_FuzzyCompareString(
@Stri1 varchar(250),
@Stri2 varchar(250),
@MaxLen int)
RETURNS float
AS
BEGIN
DECLARE @Str1 varchar(250), @Str2 varchar(250), @SCountVar int,
@SCountEq int, @LenStr int, @Res float
DECLARE @NumSymbStr2 int
DECLARE @Cnt1 int, @Cnt2 int
DECLARE @SubStr varchar(250)
SELECT
@LenStr=1,
@SCountVar=0 ,
@SCountEq=0,
@res=0
Set @Str1 = replace(LTRIM(RTRIM(upper(@Stri1))),'.',' ')
Set @Str2 = replace(LTRIM(RTRIM(upper(@Stri2))),'.',' ')
if ((@MaxLen <= 0) or (Len(@Str1)=0) or (Len(@Str2)=0))
Begin
Set @Res=0
End
else
begin
While (@LenStr<=@MaxLen)
BEGIN
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str2))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str2,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str1)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str1))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str1,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str2)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @LenStr=@LEnStr+1
END
end
if @SCountVar=0
SET @Res=0
Else
BEGIN
SET @Res=Convert(Numeric (10,5),@SCountEq)/Convert(Numeric (10,5),@SCountVar)
END
RETURN @Res
END
Использование этой функции (на примере прямого запроса к справочнику ФизЛица для 1С:ТиС 7.7): в выборку попадут все физлица, у которых релевантность выше 0.8
Код DECLARE @FIO varchar(250)
Set @FIO = 'Иванов Петр'
SELECT
Спр.Code as [ФизЛицоКод],
Спр.ID as [ФизЛицо],
Спр.DESCR as [ФИО],
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3) As [Релевантность]
FROM
SC503 as Спр (nolock)
where
ISMARK = 0
and
ISFOLDER = 2
and
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3)>=0.8
GO
Категория:
Полезные, Универсальные Функции