Функция получение содержимого адреса url (веб-страницы) методом GET // Возвращает содержимое ответа HTTP-сервера, полученного методом GET, в виде строки или двоичных данных
// ** Coded by Sergey (aka Porutchik) * 2014 http://forum.aeroion.ru/cat1.html //
// Параметры
// СерверПриемник - - доменное имя сервера или полный адрес (url) запрашиваемой ссылки.
// Может включать протокол (http://, https://) и порт.
// АдресСтраницы - - опционально. Адрес страницы на сервере без протокола (http://, https://),
// доменного имени сервера (хоста) и порта.
// Если не указано, адрес страницы будет извлечён из параметра СерверПриемник
// ПараметрыСоединения - - опционально. Структура, содержащая дополнительные параметры для HTTPСоединение.
// Назначение ключей:
// Логин или Пользователь - Тип Строка - Имя пользователя на указанном сервере.
// Пароль - Тип Строка - Пароль пользователя на указанном сервере.
// Прокси - Тип ИнтернетПрокси - Прокси, используемый для соединения с сервером.
// Таймаут - Тип Число - Таймаут осуществляемого соединения и операций, в секундах. 0 - не устанавливать таймаут..
// ЗаголовкиHTTP - - опционально.
// Заголовки, которые будут отправлены на сервер в виде соответствия: "Заголовок" - "Значение".
// Если указано, функция возвратит в программу заголовки HTTP-ответа с кодом состояния в ключе StatusCode,
// имя файла в ключе FileName, url-кодированное имя в ключе EncodeFileName
// ПолучитьКакДвоичныеДанные - - опционально. Определяет, в каком виде получить содержимое ответа сервера
// По умолчанию Ложь.
// ЗащищенноеСоединение - - опционально. По умолчанию Ложь.
// Если Истина, соединение будет происходить по протоколу https://
//
// Возвращаемое значение:
// , - содержимое ответа сервера, если ресурс найден по указанному адресу.
//
Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
Знач ПараметрыСоединения = Неопределено, ЗаголовкиHTTP = Неопределено,
Знач ПолучитьКакДвоичныеДанные = Ложь, Знач ЗащищенноеСоединение = Ложь) Экспорт
Перем ИмяФайлаОтветаКодированное, ИмяФайлаОтвета, Порт, Логин, Пользователь, Пароль, Прокси, Таймаут;
Если Не ЗначениеЗаполнено(СерверПриемник) Тогда Возврат Неопределено; КонецЕсли;
Если ТипЗнч(ЗаголовкиHTTP) Тип("Соответствие") Тогда ЗаголовкиHTTP = Новый Соответствие; КонецЕсли;
Если Найти(Нрег(СерверПриемник), "https://") = 1 Тогда ЗащищенноеСоединение = Истина; КонецЕсли;
Протокол = ?(Найти(Нрег(СерверПриемник), "https://") = 1 ИЛИ ЗащищенноеСоединение, "https://", "http://");
Если Лев(НРег(СерверПриемник), СтрДлина(Протокол)) = Протокол Тогда
СерверПриемник = Сред(СерверПриемник, СтрДлина(Протокол) + 1);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(АдресСтраницы) Тогда
Позиция = Найти(СерверПриемник, "/");
Если Позиция > 0 Тогда
АдресСтраницы = Сред(СерверПриемник, Позиция, СтрДлина(СерверПриемник));
СерверПриемник = Лев(СерверПриемник, Позиция - 1);
Иначе
АдресСтраницы = "/";
КонецЕсли;
КонецЕсли;
СерверПриемник = СтрЗаменить(СерверПриемник, "/", "");
//Выделяем порт из доменного имени
ПозицияДвоеточия = Найти(СерверПриемник, ":");
Если ПозицияДвоеточия > 0 Тогда
Порт = Число(Сред(СерверПриемник, ПозицияДвоеточия + 1));
СерверПриемник = Лев(СерверПриемник, ПозицияДвоеточия - 1);
КонецЕсли;
Если ТипЗнч(ПараметрыСоединения) = Тип("Структура") Тогда
Для каждого КлючЗначение из ПараметрыСоединения Цикл
Значение = КлючЗначение.Значение; Выполнить(КлючЗначение.Ключ + " = Значение;");
КонецЦикла;
Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Логин);
КонецЕсли;
НТТР = Новый HTTPСоединение(СерверПриемник, Порт, Пользователь, Пароль, Прокси, Таймаут,
?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));
//Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
ОтветHTTP = НТТР.Получить(Новый HTTPЗапрос(АдресСтраницы, ЗаголовкиHTTP)); //
ОшибкаЗапроса = (ОтветHTTP.КодСостояния >= 400);
//После получения ответа сервера необходимо проверить статус или код состояния.
//http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.... //Если сервер вернул один из статусов переадресации
//301 Moved Permanently («перемещено навсегда») или 302 Moved Temporarily («перемещено временно»),
//то в этом случае можно попытаться перейти на ресурс, на который переадресовал сервер
Если ОтветHTTP.КодСостояния = 301 или ОтветHTTP.КодСостояния = 302 Тогда
Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
//Адрес страницы переадресации содержится в поле Location заголовка ответа
АдресСтраницы = ОтветHTTP.Заголовки["Location"]; //
Если ЗначениеЗаполнено(АдресСтраницы) Тогда
Если Найти(НРег(АдресСтраницы), "http://") = 0 И Найти(НРег(АдресСтраницы), "https://") = 0 Тогда
АдресСтраницы = ?(Лев(АдресСтраницы, 1) = "/", Сред(АдресСтраницы, 2), АдресСтраницы);
Если Найти(АдресСтраницы, СерверПриемник + "/") = 0 Тогда
АдресСтраницы = Протокол + СерверПриемник + ?(ЗначениеЗаполнено(Порт), ":" + Порт, "") + "/" + АдресСтраницы;
КонецЕсли;
КонецЕсли;
//Если сервер вернул cookies (http://ru.wikipedia.org/wiki/HTTP_cookie, http://www.faqs.org/rfcs/rfc6265.html?#41;, //вставим их в заголовки для передачи на страницу перехода
Куки = ОтветHTTP.Заголовки["Set-Cookie"];//
Если ЗначениеЗаполнено(Куки) Тогда ЗаголовкиHTTP.Вставить("Cookie", Куки); КонецЕсли;
//Рекурсивный вызов
Возврат ПолучитьСодержимоеВебАдреса(АдресСтраницы, , , ЗаголовкиHTTP, ПолучитьКакДвоичныеДанные, ЗащищенноеСоединение);//
КонецЕсли;
КонецЕсли;
ИначеЕсли ОтветHTTP.КодСостояния >= 100 И ОтветHTTP.КодСостояния 0 Тогда
ТипСодержимого = ОтветHTTP.Заголовки["Content-Type"];
//http://ru.wikipedia.org/wiki/Список_MIME-типов Если Найти(ТипСодержимого, "text/") = 1 ИЛИ Найти(ТипСодержимого, "/javascript")
ИЛИ Найти(ТипСодержимого, "+xml") ИЛИ Найти(ТипСодержимого, "/xml") 0 ИЛИ Найти(ТипСодержимого, "/json") 0 Тогда
ПолучитьКакДвоичныеДанные = Ложь;
ИначеЕсли Найти(ТипСодержимого, "image/") = 1 ИЛИ Найти(ТипСодержимого, "video/") = 1
ИЛИ Найти(ТипСодержимого, "application/") = 1 ИЛИ Найти(ТипСодержимого, "audio/") = 1 Тогда
//Если содержимое полученного ответа представляет собой изображение, видео, приложение,
//возвращаем двоичные данные, так как возвращать в виде строки не имеет смысла.
ПолучитьКакДвоичныеДанные = Истина;
КонецЕсли;
//Некоторые сервера возвращают в типе содержимого имя отданного файла, например image/png; name="Имя файла.png"
//или отдают в заголовке Content-Disposition: attachment; filename=Имя файла.png (http://www.http11.ru/post.php?post=2) Если ОтветHTTP.Заголовки["Content-Disposition"] Неопределено Тогда
ТипСодержимого = ОтветHTTP.Заголовки["Content-Disposition"];
КонецЕсли;
ТипСодержимого = СтрЗаменить(СтрЗаменить(ТипСодержимого, """", ""), "'", "");
//в ключе filename*=UTF-8'' содержится url-кодированное имя файла
ПозицияИмениФайла = Найти(ТипСодержимого, "filename*=UTF-8");
Если ПозицияИмениФайла 0 Тогда
ИмяФайлаОтветаКодированное = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("filename*=UTF-8"));
ПозицияДвоеточия = Найти(ИмяФайлаОтветаКодированное, ";");
Если ПозицияДвоеточия 0 Тогда
ИмяФайлаОтветаКодированное = Лев(ИмяФайлаОтветаКодированное, ПозицияДвоеточия - 1);
КонецЕсли;
КонецЕсли;
//в ключе filename= содержится обычное имя файла
ПозицияИмениФайла = Найти(ТипСодержимого, "name=");
Если ПозицияИмениФайла 0 Тогда
ИмяФайлаОтвета = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("name="));
ПозицияДвоеточия = Найти(ИмяФайлаОтвета, ";");
Если ПозицияДвоеточия 0 Тогда
ИмяФайлаОтвета = Лев(ИмяФайлаОтвета, ПозицияДвоеточия - 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗаголовкиHTTP = ОтветHTTP.Заголовки;
//Добавляем в заголовки ответа код состояния (ответа) HTTP-сервера и имя файла содержимого, если есть.
ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
Если ЗначениеЗаполнено(ИмяФайлаОтвета) Тогда ЗаголовкиHTTP.Вставить("FileName", ИмяФайлаОтвета); КонецЕсли;
Если ЗначениеЗаполнено(ИмяФайлаОтветаКодированное) Тогда
ЗаголовкиHTTP.Вставить("EncodeFileName", ИмяФайлаОтветаКодированное);
КонецЕсли;
Если ОшибкаЗапроса ИЛИ НЕ ПолучитьКакДвоичныеДанные Тогда Возврат ОтветHTTP.ПолучитьТелоКакСтроку(); КонецЕсли;
Возврат ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
КонецФункции // ПолучитьСодержимоеВебАдреса()
//Источник: http://forum.aeroion.ru/topic749.html [/pre]Примеры использования:
// Получение содержимого в виде строки//
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса("
//
ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Referer", "a href="http://some_site.com/" )"="">http://some_site.com/") ;
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(" Категория: Нет
Как декодировать (преобразовать) 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
Функция ДекодироватьUniCodeВJSON(стрВходящая)
Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
Текст = "" ;
Для каждого Элемент Из ДанныеЛога Цикл
Текст = Текст + ? ( НЕ ПустаяСтрока( Текст) , Символы. ПС, "" ) ;
Текст = Текст + Элемент. Ключ + " = " + Элемент. Значение;
КонецЦикла ;
Возврат Текст;
Запись = Новый ЗаписьJSON;
Запись. УстановитьСтроку( Новый ПараметрыЗаписиJSON( ПереносСтрокJSON. Нет) ) ;
ЗаписатьJSON( Запись, ДанныеЛога, ) ;
Возврат Запись. Закрыть( ) ;
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив( 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-пакеты Как строку вида 2023-07-24T15:35:34+03:00 (формат ISO 8601) преобразовать в дату? Стандарт ISO 8601, составлен таким образом, что:
Строка даты-времени сплошная без пробельных разделителей Латинские символы используются в качестве разделителей/идентификаторов: D - дни, Y - годы, Z - идентификатор UTC и т.д., например можно задать промежуток времени: P4Y3M2D1H - 4 года, 3 месяца, 2 дня и 1 час. Буква T выбрана в качестве уникального разделителя времени, остальные буквы латинского алфавита (почти все) задействованы под разные цели и они не пересекаются. Соответственно упрощается парсинг ISO-8601 строки: имеется заранее известный набор флагов/символов/маркеров, опираясь на которые, можно достаточно быстро разбить строку на нужные составляющие и при этом сохраняется требование к human readability самой строки.
Конвертация даты из формата ISO8601 в дату 1С:
Код 1C v 8.3
Дата1 С = XMLЗначение( Тип( "Дата" ) , "2023-07-24T15:35:34+03:00" ) ;
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт
КонвертированнаяДата = Новый Структура( "Дата, Миллисекунды" ) ;
АвтоконвертированнаяДата = XMLЗначение( Тип( "Дата" ) , Дата) ;
Миллисекунды = Сред( Дата, 21 ) ;
Миллисекунды = СокрЛП( СтрЗаменить( Миллисекунды, "Z" , "" ) ) ;
Если НЕ ПустаяСтрока( Миллисекунды) Тогда
ЧислоМиллисекунд = Число( Миллисекунды) ;
Если ЧислоМиллисекунд > = 500 Тогда
АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1 ;
КонецЕсли ;
КонецЕсли ;
КонвертированнаяДата. Дата = АвтоконвертированнаяДата;
КонвертированнаяДата. Миллисекунды = Миллисекунды;
Возврат КонвертированнаяДата;
КонецФункци
Категория:
Работа с Датами (Временем) Отправка SMS через SMS.ru Один из самый простых сервисов для работы с смс.
Регистрируемся на сайта sms.ru Добавляем отправителя, проходим все проверки и разрешения (очень просто и быстро) Получаем API ключ и начинаем кодить в 1С. Сама отправка смс, через http, выглядит вот так
https://sms.ru/sms/send?api_id=ВАШ_АПИ_КЛЮЧ&to=Номер1,Номер2&msg=hello+world&json=1 [/pre]
Для примера , у меня будет цикл по запросу, который отправляет заранее заданный текст из справочника, клиентам.
В нем у нас есть 2 объекта.
1) HTTP соединения
2) HTTP Запрос
В запрос кидаем сформированную строку, в которой есть
1) API ключ - записан в константы
2) Текст, из справочника (с заменой)
3) номер телефона из заказа (у кого откуда )
4) конец строки JSON= 1 , означает получение ответа от сайта , о успешной или не успешной отправке смс с кодами авторизации/отправки в формате JSON (Разбор JSON отдельная тема)
В запросе, указываем адрес который идет после sms.ru, начиная со слэша!
В соединении, если httpS , не указываем изначально , какой это протокол, указать порт и создать объект защищенного соединения.
В остальном, все как в коде, в любом виде =)
Код 1C v 8.х
Соединение = Новый HTTPСоединение( "sms.ru" , 443 , , , , , Новый ЗащищенноеСоединениеOpenSSL) ;
Запрос = Новый HTTPЗапрос;
Пока ВыборкаДляСмс. Следующий( ) Цикл
ВремФайл = ПолучитьИмяВременногоФайла( "txt" ) ;
текст = СтрЗаменить( Справочники. МДО_ТекстыСМС. НайтиПоКоду( "000000001" ) . Текст, "*номер*" , ВыборкаДляСмс. НомерЗаказа) ;
запрос. АдресРесурса = "/sms/send?api_id=" + Константы. SMSru_ApiКлюч. Получить( ) + "&to=" + СтрЗаменить( ВыборкаДляСмс. ТелефонИзЗаказа, " " , "" ) + "&from=" + Константы. SMSru_Отправитель. Получить( ) + "&msg=" + текст+ "&json=1" ;
Соединение. ВызватьHTTPМетод( "GET" , Запрос, ВремФайл) ;
ИзменитьСтатусСМС( ВремФайл, ВыборкаДляСмс. Заказ) ;
КонецЦикла ;
Категория:
COM-объекты, WMI, WSH Как получить координаты выделенной области на Яндекс Карте? На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:
Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат
Код инициализации карты и обработчик кнопки получения координат:
Код 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>
Категория:
Географическая схема Как очистить справочник удалив все не используемые элементы? Очень часто менеджеры дублируют информацию в справочниках и время от времени их приходится чистить.
Но как удалить только те элементы справочника, которые не используются в документах?
Следующий пример кода поможет это сделать(в примере обрабатывается 4 справочника: Сотрудники, ФизЛица, Договора и Контрагенты) Скачать: Обработка для УТ 10 :
Код 1C v 8.х сп= Новый СписокЗначений;
сп. Добавить( "СотрудникиОрганизаций" ) ;
сп. Добавить( "ФизическиеЛица" ) ;
сп. Добавить( "ДоговорыКонтрагентов" ) ;
сп. Добавить( "Контрагенты" ) ;
Для Каждого стр из сп Цикл
текСпр= стр. Значение;
Запрос = Новый Запрос;
Текст =
"ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка
|ИЗ
| Справочник.%текСпр% КАК СотрудникиОрганизаций
|ГДЕ
| НЕ СотрудникиОрганизаций.ПометкаУдаления И НЕ СотрудникиОрганизаций.ЭтоГруппа" ;
Запрос. Текст = СтрЗаменить( Текст, "%текСпр%" , текСпр) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
итЗаписей = Строка( ВыборкаДетальныеЗаписи. Количество( ) ) ;
ном= 0 ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
ном= ном+ 1 ; Состояние( текСпр+ ": " + Строка( ном) + " из " + итЗаписей) ;
СсылкаНаУдаляемыйЭлемент = ВыборкаДетальныеЗаписи. Ссылка;
МассивСсылок = Новый Массив;
МассивСсылок. Добавить( СсылкаНаУдаляемыйЭлемент) ;
НайденныеСсылки = НайтиПоСсылкам( МассивСсылок) ;
Если НайденныеСсылки. Количество( ) > 0 Тогда
Сообщить( "Нельзя удалять элемент:" + Строка( СсылкаНаУдаляемыйЭлемент) + ", на него имеются ссылки" , СтатусСообщения. Внимание) ;
Иначе
Сообщить( "Удаляем элемент:" + Строка( СсылкаНаУдаляемыйЭлемент) , СтатусСообщения. Информация) ;
УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент. ПолучитьОбъект( ) ;
УдаляемыйЭлемент. Удалить( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
Категория:
Справочники Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1 ;
НачалоСтолбец = 1 ;
КонецЕсли ;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтрока < ТабДок. ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1 ;
КонецЦикла ;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтолбец < ТабДок. ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1 ;
КонецЦикла ;
КонецЕсли ;
КонецСтрока = ? ( КонецСтрока = Неопределено , ТабДок. ВысотаТаблицы, КонецСтрока) ;
КонецСтолбец = ? ( КонецСтолбец = Неопределено , ТабДок. ШиринаТаблицы, КонецСтолбец) ;
ЭтоТаблица = ( ТипЗнч( СтруктураКолонок) = Тип( "ТаблицаЗначений" ) ) ;
ТабЗначений = ПолучитьТаблицуВывода( СтруктураКолонок) ;
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений. Добавить( ) ;
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ? ( ЭтоТаблица, Колонка. Наименование, Колонка. Ключ) ;
пИндексКолонки = ? ( ЭтоТаблица, Колонка. СтолбецОтчёт, ИндексКолонки) ;
Если ТабДок. Область( ИндексСтроки, пИндексКолонки) . СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Текст;
КонецЕсли ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
КонецЦикла ;
Возврат ТабЗначений;
КонецФункции ;
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли ;
НачалоСтрока = ? ( НачалоСтрока = Неопределено , 1 , НачалоСтрока) ;
НачалоСтолбец = ? ( НачалоСтолбец = Неопределено , 1 , НачалоСтолбец) ;
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Текст = ? ( ПустаяСтрока( Колонка. Заголовок) , Колонка. Имя, Колонка. Заголовок) ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЕсли ;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . СодержитЗначение = Истина ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . ТипЗначения = Новый ОписаниеТипов( Колонка. ТипЗначения) ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Значение = Элемент[Колонка. Имя];
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции ;
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок. Прочитать( ИмяФайла) ;
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл1 = ТабДок. Область( 1 , ИндексКолонки) ;
Обл2 = ТабДок. Область( 2 , ИндексКолонки) ;
ИмяКолонки = СокрЛП( Обл1 . Текст) ;
ИмяКолонки = ? ( Найти( ИмяКолонки, " " ) > 0 , СтрЗаменить( ТРег( ИмяКолонки) , " " , "" ) , ИмяКолонки) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл2 = ТабДок. Область( 1 , ИндексКолонки) ;
ИмяКолонки = "К" + Формат( ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0" ) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
КонецЕсли ;
Таблица = ПреобразоватьТДвТЗ( ТабДок, СтруктураКолонок, ? ( ЕстьЗаголовок, 2 , 1 ) , 1 ) ;
Возврат Таблица;
КонецФункции ;
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД( ТабЗначений, Неопределено , 1 , 1 , ЕстьЗаголовок) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. MXL) ;
КонецПроцедуры ;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS Word HTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010
Код 1C v 8.3
Функция ЗагрузитьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов( ) + ИмяФайла;
Текст = Новый ЧтениеТекста( Путь, КодировкаТекста. UTF8) ;
стрТЗ = Текст. Прочитать( ) ;
Текст. Закрыть( ) ;
ТЗ = ЗначениеИзСтрокиВнутр( стрТЗ) ;
Возврат ТЗ;
КонецФункции
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1 ;
Символ160 = Символ( 160 ) ;
Для каждого полеТЗ из ЗаписьТЗ цикл
типПоляТЗ = ТипЗнч( полеТЗ) ;
если типПоляТЗ = Тип( "Число" ) тогда
полеТЗ= Строка( полеТЗ) ;
полеТЗ= СтрЗаменить( полеТЗ, Символ160 , "" ) ;
полеТЗ= СтрЗаменить( полеТЗ, "," , "." ) ;
иначеесли типПоляТЗ = Тип( "Строка" ) тогда
иначе
полеТЗ = строка( полеТЗ) ;
КонецЕсли ;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
номерСтроки= 1 ;
номКолонки= 1 ;
ТабличныйДокумент = новый ТабличныйДокумент;
Для НомКол= 0 по ТаблицаЗначений. Колонки. Количество( ) - 1 Цикл
имяКолонки= ТаблицаЗначений. Колонки[НомКол]. Имя;
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = имяКолонки;
ЖирныйШрифт = ? ( ЖирныйШрифт = Неопределено , Новый Шрифт( Ячейка. Шрифт, , , Истина ) , ЖирныйШрифт) ;
Ячейка. Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
НомСтр= 1 ;
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1 ;
ЗаписьТЗ2 ТабДок( записьТЗ, НомСтр, ТабличныйДокумент) ;
КонецЦикла ;
КонецФункции
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
НаимКолонок2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
Таблица2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
ТабличныйДокумент. Записать( ФайлMxl, ТипФайлаТабличногоДокумента. MXL) ;
ТабличныйДокумент. Показать( ФайлMxl, ФайлMxl) ;
Возврат 0 ;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl() ;
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat" ;
ТЗ = ЗагрузитьТЗизФайла( файл_мТЗИсходныеДанные) ;
ФайлMxl = КаталогВременныхФайлов( ) + СтрЗаменить( файл_мТЗИсходныеДанные, ".dat" , ".mxl" ) ;
ТаблицаЗначений2 Mxl( ТЗ, ФайлMxl) ;
КонецФункции
Тест_ВыгрузитьТЗвMxl( ) ;
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Фоновые задания: Пример запуска выполнения процедуры / функции на сервере Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()?
В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера.
Пользователь на своем клиенте открывает обработку, устанавливает параметры и нажимает выгрузить.
Выгрузка идет не с компьютера клиента, а создается фоновое задание на сервере!
На клиенте в модуле Кнопки Выгрузить:
Код 1C v 8.3 Процедура КоманднаяПанель1ВыгрузитьНаСайт(Кнопка)
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания. Добавить( Группа) ;
ФоновыеЗадания. Выполнить( "МодульРегламентныхЗаданий.ВыгрузкаПрайсаНАФТП" ,
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор,
"Выгрузка прайса на сайт" ) ;
ПоказатьОповещениеПользователя( "Выгрузка прайса на сайт" , , "Запущено задание выгрузки прайса на сайт, проверьте данные на сайте через 2-3 минуты..." , БиблиотекаКартинок. Информация32 ) ;
ПараметрыФоновогоЗадания - это переменные функции, они задаются по порядку как определены в вызываемой функции.
На сервере в общем модуле МодульРегламентныхЗаданий:
Код 1C v 8.3 Процедура ВыгрузкаПрайсаНАФТП(Группа) Экспорт
Запрос = Новый Запрос( ) ;
Запрос. Текст =
"ВЫБРАТЬ
| ПрайсЛист1СрезПоследних.НоменклатураПрайса,
| ПрайсЛист1СрезПоследних.Цена
|ИЗ
| РегистрСведений.ПрайсЛист.СрезПоследних(, Поставщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ПрайсЛист1СрезПоследних
|ГДЕ
| &Условие
| И ПрайсЛист1СрезПоследних.НоменклатураПрайса.ИДдляСайта > 0" ;
Если ЗначениеЗаполнено( Группа) Тогда
Запрос. Текст = СтрЗаменить( Запрос. Текст, "&Условие" , "ПрайсЛист1СрезПоследних.НоменклатураПрайса В ИЕРАРХИИ(&НоменклатураПрайса)" )
Иначе
Запрос. Текст = СтрЗаменить( Запрос. Текст, "&Условие" , "ИСТИНА" )
КонецЕсли ;
Запрос. УстановитьПараметр( "НоменклатураПрайса" , Группа) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Текст = Новый ТекстовыйДокумент;
Пока Выборка. Следующий( ) Цикл
НомПрайса = Выборка. НоменклатураПрайса;
ЦенаА = Выборка. Цена;
Цена = Ценообразование. ОкруглитьЦену( ЦенаА * ( 1 + НомПрайса. Наценка20 / 100 ) + НомПрайса. Надбавка20 , НомПрайса. ПорядокОкругления, НомПрайса. ОкруглятьВБольшуюСторону) ;
Если Цена > 0 Тогда
Текст. ДобавитьСтроку( "" + Формат( НомПрайса. ИДдляСайта, "ЧГ=0" ) + ";" + Формат( Цена, "ЧГ=0" ) ) ;
КонецЕсли ;
КонецЦикла ;
ПутьКФайлВыгр = "\\FG-1\1c_data\naSite\vigruz.csv" ;
Текст. Записать( ПутьКФайлВыгр, "windows-1251" ) ;
КаталогНаSFTPСервере = "/sitetest.ru/public_html/p" ;
Попытка
ИмяПользователя = "serveruser" ;
ПарольПользователя = "password" ;
Сервер = "192.253.6.47" ;
Порт = "21" ;
Прокси = Новый ИнтернетПрокси( ) ;
Прокси. Пользователь = ИмяПользователя;
Прокси. Пароль = ПарольПользователя;
FTPСоединение = Новый FTPСоединение( Сервер, , ИмяПользователя, ПарольПользователя, , Ложь ) ;
FTPСоединение. УстановитьТекущийКаталог( КаталогНаSFTPСервере) ;
ТекущийКаталог = FTPСоединение. ТекущийКаталог( ) ;
Исключение
КонецПопытки ;
FTPСоединение. Записать( ПутьКФайлВыгр, "vigruz.csv" ) ;
НТТР = Новый HTTPСоединение( "sitetest.ru" ) ;
ФайлРезультата = ПолучитьИмяВременногоФайла( ) ;
НТТР. Получить( "/p/import_price.php" , ФайлРезультата) ;
КонецПроцедуры
Как Получить фоновые задания?
Напишем в процедуре обработки нажания следующий код:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПолучитьФоновыеЗадания(Команда)
ПолучитьФоновыеЗаданияНаСервере( ) ;
КонецПроцедуры
Текст процедуры на сервере:
Код 1C v 8.2 УП &НаСервере
Процедура ПолучитьФоновыеЗаданияНаСервере()
ПараметрыОтбора = Новый Структура( "Наименование" , "Тестовое задание" ) ;
СписокФоновыхЗаданий = ФоновыеЗадания. ПолучитьФоновыеЗадания( ПараметрыОтбора) ;
Для каждого Задание Из СписокФоновыхЗаданий Цикл
Сообщить( Задание. Наименование) ;
КонецЦикла ;
КонецПроцедуры
В окно сообщений выведутся наименования выполняющихся и выполненных в 1С фоновых заданий с наименованием "Тестовое задание", так как мы сделали отбор именно по этому наименованию.
Категория:
Регламентные задания, Фоновые задания Импорт/экспорт CSV в ТЗ Код 1C v 8.х
&НаСервереБезКонтекста
Функция ПреобразоватьТекстCSVвТЗ(ТекстCSV="" , Разделитель=";" ) Экспорт
ТЗ = Новый ТаблицаЗначений;
ОсобаяСтрока = "$#%^&*!xyxb$#%&*!^" ;
НомерСтроки = 1 ;
Стр = СтрПолучитьСтроку( ТекстCSV, НомерСтроки) ;
Пока НомерСтроки < = СтрЧислоСтрок( ТекстCSV) Цикл
СтрокаТЗ = ТЗ. Добавить( ) ;
НомерПоля = 0 ;
Пока Стр < > "" Цикл
Токен = "" ;
ПозицияРазделителя = Найти( стр, Разделитель) ;
ПозицияОткрКавычек = Найти( стр, """ " ) ;
Если ( ПозицияРазделителя > ПозицияОткрКавычек ИЛИ ПозицияРазделителя = 0 ) И ПозицияОткрКавычек > 0 Тогда
Токен = Сред( Стр, 1 , ПозицияОткрКавычек) ;
Стр = СтрЗаменить( Сред( Стр, ПозицияОткрКавычек+ 1 ) , """ "" " , ОсобаяСтрока) ;
ПозицияЗакрКавычек = Найти( Стр, """ " ) ;
Пока ПозицияЗакрКавычек = 0 Цикл
Токен = Токен + Стр + Символы. ПС;
НомерСтроки = НомерСтроки + 1 ;
Стр = СтрПолучитьСтроку( ТекстCSV, НомерСтроки) ;
Стр = СтрЗаменить( Стр, """ "" " , ОсобаяСтрока) ;
ПозицияЗакрКавычек = Найти( Стр, """ " ) ;
КонецЦикла ;
ПозицияРазделителя= Найти( Сред( Стр, ПозицияЗакрКавычек) , Разделитель) ;
ПозицияРазделителя = ? ( ПозицияРазделителя> 0 , ПозицияЗакрКавычек + ПозицияРазделителя- 1 , 0 ) ;
КонецЕсли ;
Токен = Токен + ? ( ПозицияРазделителя> 0 , Сред( Стр, 1 , ПозицияРазделителя- 1 ) , Стр) ;
Стр = ? ( ПозицияРазделителя> 0 , Сред( Стр, ПозицияРазделителя+ 1 ) , "" ) ;
Если Лев( Токен, 1 ) = """ " Тогда
Токен = Сред( Токен, 2 ) ;
Токен = ? ( Прав( Токен, 1 ) = """ " , Сред( Токен, 1 , СтрДлина( Токен) - 1 ) , Токен) ;
КонецЕсли ;
Токен = СтрЗаменить( Токен, ОсобаяСтрока, """ " ) ;
НомерПоля = НомерПоля + 1 ;
Если ТЗ. Колонки. Количество( ) < НомерПоля Тогда
ТЗ. Колонки. Добавить( "Колонка" + НомерПоля, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЕсли ;
СтрокаТЗ[НомерПоля- 1 ] = Токен;
КонецЦикла ;
НомерСтроки = НомерСтроки + 1 ;
Стр = СтрПолучитьСтроку( ТекстCSV, НомерСтроки) ;
КонецЦикла ;
Возврат ТЗ;
КонецФункции
&НаСервереБезКонтекста
Функция ПреобразоватьТЗвТекстCSV(ТЗ, Разделитель = ";" , флЭкспортироватьИменаКолонок = Ложь) Экспорт
ТекстCSV = "" ;
Если флЭкспортироватьИменаКолонок Тогда
ПодготовленнаяСтрока = "" ;
Для Каждого Колонка Из ТЗ. Колонки Цикл
ПодготовленнаяСтрока = ПодготовленнаяСтрока + Колонка. Имя + Разделитель;
КонецЦикла ;
ПодготовленнаяСтрока = Лев ( ПодготовленнаяСтрока, СтрДлина( ПодготовленнаяСтрока) - 1 ) ;
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы. ПС;
КонецЕсли ;
Для Каждого Строка Из ТЗ Цикл
ПодготовленнаяСтрока = "" ;
Для Каждого Колонка Из ТЗ. Колонки Цикл
ПреобразованноеПоле = Строка[Колонка. Имя];
Если Найти( ПреобразованноеПоле, """ " ) Тогда
ПреобразованноеПоле = СтрЗаменить( ПреобразованноеПоле, """ " , """ "" " ) ;
КонецЕсли ;
Если Найти( ПреобразованноеПоле, Разделитель) ИЛИ Найти( ПреобразованноеПоле, Символы. ПС) ИЛИ Найти( ПреобразованноеПоле, """ " ) Тогда
ПреобразованноеПоле = """ " + ПреобразованноеПоле + """ " ;
КонецЕсли ;
ПодготовленнаяСтрока = ПодготовленнаяСтрока + ПреобразованноеПоле + Разделитель;
КонецЦикла ;
ПодготовленнаяСтрока = Лев ( ПодготовленнаяСтрока, СтрДлина( ПодготовленнаяСтрока) - 1 ) ;
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы. ПС;
КонецЦикла ;
Возврат ТекстCSV;
КонецФункции
Источник
Категория:
Работа с Таблицей Значений Дата создания объекта по ссылке (GUID) Код позволяет получить информацию о дате и времени создания объекта ИБ (документ, элемент справочника) по уникальному идентификатору (GUID)
Позволяет узнать, когда был создан документ или элемент справочника. Для получения информации используется уникальный идентификатор объекта в ИБ.
Код 1C v 8.3 Функция ДатаСозданияСсылки(Ссылка) Экспорт
Если НЕ ЗначениеЗаполнено( Ссылка) Тогда
Возврат Неопределено ;
КонецЕсли ;
Момент = Дата( 1 , 1 , 1 ) ;
Попытка
УИ = Строка( Ссылка. УникальныйИдентификатор( ) ) ;
УИ = ВРег( СтрЗаменить( УИ, "-" , "" ) ) ;
Если Сред( УИ, 13 , 1 ) = "1" Тогда
Значение16 = ВРег( Сред( УИ, 14 , 3 ) + Сред( УИ, 9 , 4 ) + Сред( УИ, 1 , 8 ) ) ;
Цифры16 = "123456789ABCDEF" ;
Значение10 = 0 ;
Длина16 = СтрДлина( Значение16 ) ;
Для Ном = 1 По Длина16 Цикл
Значение10 = Значение10 + Pow( 16 , Длина16 - Ном) * Найти( Цифры16 , Сред( Значение16 , Ном, 1 ) ) ;
КонецЦикла ;
Значение10 = Значение10 / 10000000 ;
Момент = Дата( 1582 , 10 , 15 , 3 , 0 , 0 ) + Значение10 ;
КонецЕсли ;
Исключение
КонецПопытки ;
Возврат Момент;
КонецФункции
Категория:
Встроенные Функции ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст= Неопределено Тогда
Если ТипЗнч( рВетка) < > Тип( "ДеревоЗначений" ) Тогда Возврат КонецЕсли ;
Если ТипЗнч( рПараметры) < > Тип( "Структура" ) Тогда рПараметры= Новый Структура КонецЕсли ;
стрКолонок= ? ( рПараметры. Свойство( "Колонки" ) , рПараметры. Колонки, Неопределено ) ;
Если ТипЗнч( стрКолонок) < > Тип( "Структура" ) Тогда стрКолонок= Новый Структура КонецЕсли ;
рПоказыватьУровни= ? ( рПараметры. Свойство( "ПоказыватьУровни" ) , рПараметры. ПоказыватьУровни, Ложь ) ;
рШагОтступа= ? ( рПараметры. Свойство( "ШагОтступа" ) , рПараметры. ШагОтступа, 2 ) ;
рДеревоДляТеста= рВетка;
рЗапись= Новый ЗаписьXML;
рЗапись. УстановитьСтроку( ) ;
СериализаторXDTO. ЗаписатьXML( рЗапись, рДеревоДляТеста) ;
стро= рЗапись. Закрыть( ) ;
стро= СтрЗаменить( стро, "xmlns=" , "xmlns:myns1C=" ) ;
рЧтение= Новый ЧтениеXML;
рЧтение. УстановитьСтроку( стро) ;
постр= Новый ПостроительDOM;
рДокументДОМ= постр. Прочитать( рЧтение) ;
рВыражение= "/ValueTree/row" ; максКолвоУровней= 1 ;
рРазыменователь= Новый РазыменовательПространствИменDOM( рДокументДОМ) ;
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
рРезультат= рДокументДОМ. ВычислитьВыражениеXPath( рВыражение, рДокументДОМ, рРазыменователь, ТипРезультатаDOMXPath. Любой) ;
Если рРезультат. ПолучитьСледующий( ) = Неопределено Тогда Прервать КонецЕсли ;
рВыражение= рВыражение+ "/row" ;
максКолвоУровней= максКолвоУровней+ 1 ;
КонецЦикла ;
максКолвоУровней= максКолвоУровней- 1 ;
строПробелы= " " ;
строРазделители= "===============================================================================================" ;
строОтступы= "___________________________________________________________________________________________" ;
секШапка1 = "|[_HCS" + Лев( строПробелы, максКолвоУровней* рШагОтступа) + "]|" ;
секГорРазделитель1 = "|" + Лев( строОтступы, максКолвоУровней* рШагОтступа+ 6 ) + "|" ;
рШиринаКолонкиИерархии= СтрДлина( секШапка1 ) - 2 ;
строПолейШапки= "#Поле _HCS
| #Выравнивание Центр" ;
строПолейЗаписи= "" ;
Если рПоказыватьУровни Тогда
секШапка1 = секШапка1 + "[_Level]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, 8 ) + "|" ;
строПолейШапки= строПолейШапки+ "
|#Поле _Level
| #Выравнивание Центр" ;
строПолейЗаписи= "#Поле _Level
| #Выравнивание Центр
| #Забивать Истина" ;
КонецЕсли ;
мИменКолонок= Новый Массив;
Для каждого кол Из рВетка. Колонки Цикл
Если стрКолонок. Количество( ) < > 0 и не стрКолонок. Свойство( кол. Имя) Тогда Продолжить КонецЕсли ;
рДлинаИмениКолонки= СтрДлина( кол. Имя) ;
рНужнаяШирина= Макс( ? ( кол. Ширина< 3 , 10 , кол. Ширина) , рДлинаИмениКолонки) ;
секШапка1 = секШапка1 + "[" + кол. Имя+ Лев( строПробелы, рНужнаяШирина- рДлинаИмениКолонки) + "]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, рНужнаяШирина+ 1 ) + "=|" ;
строПолейШапки= строПолейШапки+ "
|#Поле " + кол. Имя+ "
| #Выравнивание Центр" ;
рОписТипов= кол. ТипЗначения;
Если рОписТипов. Типы( ) . Количество( ) = 1 и рОписТипов. СодержитТип( Тип( "Булево" ) ) Тогда
рВыравнивание= "Центр" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Число" ) ) Тогда
рВыравнивание= "Право" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Строка" ) ) и рОписТипов. КвалификаторыСтроки. Длина= 0 Тогда
рВыравнивание= "ПоШирине" ;
Иначе
рВыравнивание= "Лево" ;
КонецЕсли ;
строПолейЗаписи= строПолейЗаписи+ ? ( ПустаяСтрока( строПолейЗаписи) , "" , Символы. ПС) + "#Поле " + кол. Имя+ "
| #Выравнивание " + рВыравнивание;
Попытка
Если ЗначениеЗаполнено( стрКолонок[кол. Имя]) Тогда
строПолейЗаписи= строПолейЗаписи+ "
| #Формат "" " + СокрЛП( стрКолонок[кол. Имя]) + """ " ;
КонецЕсли ;
Исключение
КонецПопытки ;
мИменКолонок. Добавить( кол. Имя) ;
КонецЦикла ;
секШапка2 = СтрЗаменить( СтрЗаменить( секШапка1 , "[" , "<" ) , "]" , ">" ) ;
секЗапись1 = секШапка1 ; секЗапись2 = секШапка2 ;
секГорРазделитель2 = СтрЗаменить( СтрЗаменить( секГорРазделитель1 , "=" , "-" ) , "|" , "+" ) ;
секГорРазделитель1 = СтрЗаменить( секГорРазделитель1 , "_" , "=" ) ;
секГорРазделитель2 = СтрЗаменить( секГорРазделитель2 , "_" , " " ) ;
тМакет= Новый ТекстовыйДокумент;
тМакет. ДобавитьСтроку( "#Область Шапка" ) ;
тМакет. ДобавитьСтроку( строПолейШапки) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( секШапка1 ) ;
тМакет. ДобавитьСтроку( секШапка2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
тМакет. ДобавитьСтроку( "" ) ;
тМакет. ДобавитьСтроку( "#Область Запись" ) ;
тМакет. ДобавитьСтроку( строПолейЗаписи) ;
тМакет. ДобавитьСтроку( секЗапись1 ) ;
тМакет. ДобавитьСтроку( секЗапись2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель2 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
рПараметры. Вставить( "ИсходныйМакет" , тМакет) ;
рТекст= Новый ТекстовыйДокумент;
сек= тМакет. ПолучитьОбласть( "Шапка" ) ;
сек. Параметры. _HCS= "Иерархия" ;
Для каждого имякол Из мИменКолонок Цикл
кол= рВетка. Колонки[имякол];
сек. Параметры[кол. Имя]= ? ( ПустаяСтрока( кол. Заголовок) , кол. Имя, кол. Заголовок) ;
КонецЦикла ;
рТекст. Вывести( сек) ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , тМакет. ПолучитьОбласть( "Запись" ) ) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "Отступ" , 0 ) ;
пар. Вставить( "ШагОтступа" , рШагОтступа) ;
ВывестиДеревоЗначенийВТекст( рВетка, рТекст, пар) ;
Иначе
мИменКолонок= рПараметры. МассивИмёнКолонок;
рСекция= рПараметры. ТекущаяСекция;
рОтступ= рПараметры. Отступ;
рШиринаКолонкиИерархии= рПараметры. ШиринаКолонкиИерархии;
рПоказыватьУровни= рПараметры. ПоказыватьУровни;
строОтступы= "_________________________________________________________________________________________________________" ;
строПробелы= " " ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , рПараметры. ТекущаяСекция) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "ШагОтступа" , рПараметры. ШагОтступа) ;
пар. Вставить( "Отступ" , рОтступ+ рПараметры. ШагОтступа) ;
Для каждого рПодветка Из рВетка. Строки Цикл
рСекция. Параметры. _HCS= Лев( строПробелы, рОтступ) + "\" + Лев( строОтступы, рШиринаКолонкиИерархии- рОтступ- 1 ) ;
Если рПоказыватьУровни Тогда
рСекция. Параметры. _Level= рПодветка. Уровень( ) ;
КонецЕсли ;
Для каждого имякол Из мИменКолонок Цикл
рСекция. Параметры[имякол]= рПодветка[имякол];
КонецЦикла ;
рТекст. Вывести( рСекция) ;
ВывестиДеревоЗначенийВТекст( рПодветка, рТекст, пар)
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( "ВывестиДеревоЗначенийВТекст, ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
КонецПопытки ;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Скрипт автообновления типовых конфигураций Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. Подойдет как рабочая заготовка для собственных "обновляторов". В текущем виде все работает. Надо только занести свои переменные.
Код 1C v 8.3
Перем мРасположениеОбновлений;
Перем мИтсЛогин;
Перем мИтсПароль;
Перем home;
Перем DumpIB;
Перем ФайлСписокОбновленийZIP;
Перем ФайлСписокОбновленийXML;
Перем КодВозврата;
Функция ФайлСуществует(Знач ПутьКФайлу) Экспорт
Файл = Новый Файл( ПутьКФайлу) ;
Возврат Файл. Существует( ) ;
КонецФункции
Процедура УстановитьКонстанты()
каталог_tmplts = "D:\tmplts" ;
мИтсЛогин = "---" ;
мИтсПароль = "---" ;
мРасположениеОбновлений = каталог_tmplts + "\1c" ;
home = каталог_tmplts + "\1Cupdate" ;
DumpIB = home + "\DumpIB\" ;
ФайлСписокОбновленийXML = home + "\v8cscdsc.xml" ;
ФайлСписокОбновленийZIP = home + "\v8upd11.zip" ;
Если НЕ ФайлСуществует( home) Тогда
СоздатьКаталог( home) ;
КонецЕсли ;
Если НЕ ФайлСуществует( DumpIB) Тогда
СоздатьКаталог( DumpIB) ;
КонецЕсли ;
Если НЕ ФайлСуществует( мРасположениеОбновлений) Тогда
СоздатьКаталог( мРасположениеОбновлений) ;
КонецЕсли ;
КонецПроцедуры
Функция ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
ПараметрыБазы = Неопределено ;
Попытка
COMОбъект = Новый COMОбъект( "V" + мВерсияПлатформы+ ".COMConnector" ) ;
Исключение
Сообщить( "Не удалось создать COM-объект!" ) ;
Возврат ПараметрыБазы;
КонецПопытки ;
ПутьКБазе = "srvr="" " + СокрЛП( мИмяСервера) + """ ;" + "ref="" " + СокрЛП( мИмяБазы) + """ ;" ;
СтрокаСоединения = ПутьКБазе + "Usr="" " + СокрЛП( мБазаЛогин) + """ ;" + "Pwd="" " + СокрЛП( мБазаПароль) + """ ;" ;
Попытка
V82 = COMОбъект. Connect( СтрокаСоединения) ;
Исключение
Сообщить( СтрокаСоединения) ;
Сообщить( "Внешнее соединение не установлено!" ) ;
Возврат ПараметрыБазы;
КонецПопытки ;
ПараметрыБазы = Новый Структура;
ПараметрыБазы. Вставить( "ТекущаяВерсия" , v82. Метаданные. Версия) ;
ПараметрыБазы. Вставить( "ПутьКПлатформе" , v82. КаталогПрограммы( ) + "1cv8.exe" ) ;
Возврат ПараметрыБазы;
КонецФункции
Процедура УстановитьCOMСоединение(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Попытка
COMОбъект = Новый COMОбъект( "V" + мВерсияПлатформы+ ".COMConnector" ) ;
Исключение
Сообщить( "Не удалось создать COM-объект!" ) ;
Возврат ;
КонецПопытки ;
ПутьКБазе = "srvr="" " + СокрЛП( мИмяСервера) + """ ;" +
"ref="" " + СокрЛП( мИмяБазы) + """ ;" ;
СтрокаСоединения = ПутьКБазе +
"Usr="" " + СокрЛП( мБазаЛогин) + """ ;" +
"Pwd="" " + СокрЛП( мБазаПароль) + """ ;" ;
Сообщить( СтрокаСоединения) ;
Попытка
V82 = COMОбъект. Connect( СтрокаСоединения) ;
Исключение
Сообщить( СтрокаСоединения) ;
Сообщить( "Внешнее соединение не установлено!" ) ;
Возврат ;
КонецПопытки ;
КонецПроцедуры
Функция ВыполнитьЗагрузкуСпискаОбновлений(ИмяФайлаЗагрузки,ТекущаяВерсияКонфигурации)
СообщениеОбОшибке = "Ошибка при чтении файла списка обновлений." ;
Если НЕ ФайлСуществует( ИмяФайлаЗагрузки) Тогда
Сообщить( "Нету XML файла (списка обновлений)" ) ;
Возврат Неопределено ;
КонецЕсли ;
ВерсияДляОбновления = Неопределено ;
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ИмяФайлаЗагрузки) ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
ДатаФормирования = ЧтениеXML. Значение;
ЧтениеXML. Прочитать( ) ;
Пока ЧтениеXML. Прочитать( ) Цикл
Если ЧтениеXML. Имя = "v8u:updateList" Тогда
Прервать ;
Иначе
Конфигурация = ЧтениеXML. ПолучитьАтрибут( "configuration" ) ;
Пока ЧтениеXML. Прочитать( ) Цикл
Если ЧтениеXML. Имя = "v8u:update" Тогда
Прервать ;
Иначе
Если ЧтениеXML. Имя = "v8u:vendor" Тогда
ЧтениеXML. Прочитать( ) ;
Поставщик = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:version" Тогда
ЧтениеXML. Прочитать( ) ;
Версия = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:file" Тогда
ЧтениеXML. Прочитать( ) ;
ПутьКФайлуОбновления = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:size" Тогда
ЧтениеXML. Прочитать( ) ;
РазмерФайлаОбновления = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:target" Тогда
ЧтениеXML. Прочитать( ) ;
Если ЧтениеXML. Значение = ТекущаяВерсияКонфигурации Тогда
ВерсияДляОбновления = Версия;
КонецЕсли ;
КонецЕсли ;
ЧтениеXML. Прочитать( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Исключение
Сообщить( СообщениеОбОшибке) ;
ЧтениеXML. Закрыть( ) ;
Возврат Неопределено ;
КонецПопытки ;
ЧтениеXML. Закрыть( ) ;
Возврат ВерсияДляОбновления;
КонецФункции
Процедура ПроверитьОбновлениеКонфигурации(мИмяСервера,мИмяБазы,мТипКонфигурации,мВерсияРелиза,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Сообщить( "----------------------------------------------------------------------" ) ;
УдалитьФайлы( ФайлСписокОбновленийXML) ;
УдалитьФайлы( ФайлСписокОбновленийZIP) ;
СерверОбновлений = Новый HTTPСоединение( "downloads.1c.ru" , , мИтсЛогин, мИтсПароль, ) ;
ЗапросКСерверуОбновлений = Новый HTTPЗапрос( "/ipp/ITSREPV/V8Update/Configs/" + мТипКонфигурации+ "/" + мВерсияРелиза+ "/" + мВерсияПлатформы+ "/v8upd11.zip" ) ;
СерверОбновлений. Получить( ЗапросКСерверуОбновлений, ФайлСписокОбновленийZIP) ;
ФайлZip = Новый ЧтениеZipФайла( ФайлСписокОбновленийZIP) ;
ФайлZip. ИзвлечьВсе( home) ;
ФайлZip. Закрыть( ) ;
УдалитьФайлы( ФайлСписокОбновленийZIP) ;
ПараметрыComБазы = ВернутьРелизИПлатформу( мИмяСервера, мИмяБазы, мВерсияПлатформы, мБазаЛогин, мБазаПароль) ;
Если ПараметрыComБазы = Неопределено Тогда
Возврат ;
КонецЕсли ;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений( ФайлСписокОбновленийXML, ПараметрыComБазы. ТекущаяВерсия) ;
ТребуетсяОбновление = Ложь ;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ" ) ;
Возврат ;
КонецЕсли ;
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " update: " + ВерсияДляОбновления) ;
КомандаПакетногоАрхивирования = """ " + ПараметрыComБазы. ПутьКПлатформе + """ " + " CONFIG /S" + мИмяСервера+ "\" + мИмяБазы+ " /N"" " + мБазаЛогин+ """ /P"" " + мБазаПароль+ """ /DumpIB " + DumpIB + мИмяБазы + ".dt /OUT "" " + home+ "\" + мИмяБазы+ ".log"" -NoTruncate" ;
ЗапуститьПриложение( КомандаПакетногоАрхивирования, , Истина , КодВозврата) ;
Если КодВозврата = 0 Тогда
Сообщить( "Резервная копия успешно создана." ) ;
Иначе
Сообщить( "Ошибка при создании резервной копии" ) ;
Возврат ;
КонецЕсли ;
Версия_Для_Обновления = СтрЗаменить( ВерсияДляОбновления, "." , "_" ) ;
Если НЕ ФайлСуществует( мРасположениеОбновлений + "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления+ "\" ) Тогда
Заголовки = Новый Соответствие( ) ;
Заголовки. Вставить( "User-Agent" , "1C+Enterprise/8.2" ) ;
СерверОбновлений = Новый HTTPСоединение( "downloads.v8.1c.ru" , , мИтсЛогин, мИтсПароль, ) ;
СтрокаЗапросHTTP = "/tmplts/1c/" + мТипКонфигурации+ "/" + Версия_Для_Обновления + "/1cv8.zip" ;
Сообщить( СтрокаЗапросHTTP) ;
ЗапросКСерверуОбновлений = Новый HTTPЗапрос( СтрокаЗапросHTTP, Заголовки) ;
СерверОбновлений. Получить( ЗапросКСерверуОбновлений, мРасположениеОбновлений+ "\1cv8.zip" ) ;
ФайлZip = Новый ЧтениеZipФайла( мРасположениеОбновлений+ "\1cv8.zip" ) ;
ФайлZip. ИзвлечьВсе( мРасположениеОбновлений+ "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления) ;
ФайлZip. Закрыть( ) ;
УдалитьФайлы( мРасположениеОбновлений+ "\1cv8.zip" ) ;
КонецЕсли ;
КомандаПакетногоОбновления = """ " + ПараметрыComБазы. ПутьКПлатформе + """ " + " CONFIG /S" + мИмяСервера+ "\" + мИмяБазы+ " /N"" " + мБазаЛогин+ """ /P"" " + мБазаПароль+ """ /UpdateCfg " + мРасположениеОбновлений+ "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления + "\1cv8.cfu /UpdateDBCfg /OUT "" " + home+ "\" + мИмяБазы+ ".log"" -NoTruncate" ;
ЗапуститьПриложение( КомандаПакетногоОбновления, , Истина , КодВозврата) ;
Если КодВозврата = 0 Тогда
Сообщить( "База Успешно обновлена" ) ;
Иначе
Сообщить( "ОШИБКА ПРИ ОБНОВЛЕНИИ" ) ;
Возврат ;
КонецЕсли ;
ПараметрыComБазы = ВернутьРелизИПлатформу( мИмяСервера, мИмяБазы, мВерсияПлатформы, мБазаЛогин, мБазаПароль) ;
Если ПараметрыComБазы = Неопределено Тогда
Возврат ;
КонецЕсли ;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений( ФайлСписокОбновленийXML, ПараметрыComБазы. ТекущаяВерсия) ;
ТребуетсяОбновление = Ложь ;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ" ) ;
Возврат ;
КонецЕсли ;
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " update: " + ВерсияДляОбновления) ;
КонецПроцедуры
УстановитьКонстанты( ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_el" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_spb" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_domx" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_el" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_ip" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_guild" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_lebedeva" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_porsche" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_service" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
Источник
Категория:
Администрирование Яндекс карта : вывод точек на карту Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Примеры. Геокодирование.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkFAAAAf7jmJwMAHGZHrcLKDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript" ></script>
<script type="text/javascript" >
var router;
var myPoints = new Array ();
var myRouts = new Array ();
var strOpen = "OPEN" ;
var strKontr = "Kontragent" ;
var t = new YMaps.Template(
YMaps.Templates.add("my#template" , t);
var KopdinatShirota = 0 ;
var KopdinatDolgota = 0 ;
var UID_Zakaza = "" ;
/*vstavkaStiley;
var map, geoResult;
YMaps.jQuery(function () {
map = new YMaps.Map(YMaps.jQuery("#YMapsID" )[0 ]);
map.setCenter(new YMaps.GeoPoint(37.62 , 55.75 ), 12 );
});
function showAddress (value, contrag, Styles, UID) {
var geocoder = new YMaps.Geocoder(value, {results: 1 , boundedBy: map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get (0 );
var point = new YMaps.GeoPoint(geoResult._point.__lng, geoResult._point.__lat);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}else {
}
});
YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error ) {
alert("Произошла ошибка: " + error );
return null ;
})
}
function showAddressCoord (shirota, dolgota, contrag, Styles, UID) {
var point = new YMaps.GeoPoint(dolgota, shirota);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}
function removeAllOverlays (map) {
map.removeAllOverlays();
}
function AddRoute(wayPoint1, wayPoint2) {
if (myRouts.length>0 ) {lastRouter = myRouts[myRouts.length-1 ]; map.removeOverlay(lastRouter)};
var myRouter = new YMaps.Router([wayPoint1, wayPoint2], [], {viewAutoApply: true });
map.addOverlay(myRouter);
YMaps.Events.observe(myRouter, myRouter.Events.Success, function (myRouter) {
myRouter.getWayPoint(0 ).setIconContent(
myRouter.getWayPoint(1 ).setIconContent(
dlMar = myRouter.getDistance()/1000 ;
document.title =
});
myRouts.push(myRouter);
return true ;
}
function mapRazmer(map, SentrSh, SentrDlg, razmer) {
map.setCenter(new YMaps.GeoPoint(SentrSh, SentrDlg), razmer);
}
function changeStyle(numTochki, imStyle){
var restoreDefault = true ;
tochka = myPoints[numTochki];
tochka.setOptions({style: imStyle}, restoreDefault);
point = tochka.getCoordPoint();
map.setCenter(new YMaps.GeoPoint(point.__lng, point.__lat), 12 );
map.redraw();
return tochka.description;
}
</script>
</head>
<body //~~onload~~>
<div id="YMapsID" style="width:100%;height:100%" ></div>
</form>
</body>
</html>
Код вывода карты:
Код 1C v 8.х
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Макет = ПолучитьМакет( "Макет" ) ;
КодХТМЛ = Макет. ПолучитьТекст( ) ;
СтрокаСтиляНачальная = "var BurG = new YMaps.Style();
|BurG.iconStyle = new YMaps.IconStyle();
|BurG.iconStyle.offset = new YMaps.Point(-12, -12);
|BurG.iconStyle.href = "" http://www.burgerking.ru/favicon.ico"" ;
|BurG.iconStyle.size = new YMaps.Point(20, 20);
|BurG.hideIcon = false;
|BurG.balloonContentStyle = new YMaps.BalloonContentStyle("" my#template"" );" ;
СтрокаСтиляИтоговая = "" ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ВидыОбъектов.Ссылка,
| ВидыОбъектов.ПутьКИконке,
| ВидыОбъектов.Код
|ИЗ
| Справочник.ВидыОбъектов КАК ВидыОбъектов
|ГДЕ
| ВидыОбъектов.ПометкаУдаления = ЛОЖЬ" ;
Результат = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = Результат. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
времСтрокаСтиля = СтрокаСтиляНачальная;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "BurG" , "s" + Строка( ВыборкаДетальныеЗаписи. код) ) ;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "http://www.burgerking.ru/favicon.ico" , сокрЛП( ВыборкаДетальныеЗаписи. ПутьКИконке) ) ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы. ПС;
КонецЦикла ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + СтрокаСтиляНачальная + символы. ПС;
КодХТМЛ = стрЗаменить( КодХТМЛ, "/*vstavkaStiley;" , СтрокаСтиляИтоговая) ;
путьККаталогуКартинок = СтрЗаменить( КаталогПрограммы( ) , "\" , "/" ) ;
КодХТМЛ = СтрЗаменить( КодХТМЛ, "C:/" , путьККаталогуКартинок) ;
ЭлементыФормы. Карта. УстановитьТекст( КодХТМЛ) ;
табАдресов = получитьтабАдресов( ) ;
табУникальныхАдресов = табАдресов. скопировать( ) ;
табУникальныхАдресов. свернуть( "Уник" ) ;
тзДанных = табАдресов. скопировать( ) ;
табАдресов. очистить( ) ;
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура( ) ;
Отбор. Вставить( "Уник" , стр. Уник) ;
Строки = тзДанных. НайтиСтроки( Отбор) ;
НовСтр = табАдресов. добавить( ) ;
НовСтр. уник = стр. уник;
Если Строки. Количество( ) > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр. Адрес = тздстр. Адрес;
НовСтр. КД = тздстр. КД;
НовСтр. КШ = тздстр. КШ;
НовСтр. ВидОбъекта = тздстр. ВидОбъекта;
НовСтр. Наименование= Строка( НовСтр. Наименование) + Строка( тздстр. Наименование) + "; " ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. табАдресов. СоздатьКолонки( ) ;
ВыборМасштаба = "50%" ;
ВыборРегиона = "Москва" ;
ЭлементыФормы. Надпись24 . Заголовок = "Точек: " + Строка( табАдресов. количество( ) ) ;
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
Всего= Строка( табАдресов. Количество( ) ) ; н= 0 ;
Для каждого строкаАдреса Из табАдресов Цикл
н= н+ 1 ; Состояние( "Вывод " + Строка( н) + " из " + Всего) ;
УИД_Дока = Строка( н) ;
имяСтиля = "s" + Строка( строкаАдреса. ВидОбъекта. код) ;
Попытка
Если ЗначениеЗаполнено( строкаАдреса. КД) Тогда
ВызовФункции = "showAddressCoord(" + сокрЛП( строкаАдреса. КШ) + ", " + сокрЛП( строкаАдреса. КД) + ", '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
Иначе
ВызовФункции = "showAddress('" + сокрЛП( строкаАдреса. адрес) + "', '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
КонецЕсли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( ВызовФункции) ;
исключение
Сообщить( "Точка с адресом " + сокрЛП( строкаАдреса. адрес) + " не может быть отбражена на карте!" ) ;
конецПопытки
КонецЦикла ;
ТочкиНеСозданы = Ложь ;
ЭлементыФормы. Карта. ПолучитьТекст( ) ;
КонецПроцедуры
Процедура Кнопка1Нажатие(Элемент)
если ЭлементыФормы. ВыборРегиона. значение = "Москва" Тогда
СтрокаКоординат = "37.64, 55.76, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Тверь" Тогда
СтрокаКоординат = "35.90, 56.83, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Балашиха" Тогда
СтрокаКоординат = "37.97, 55.82, " ;
Иначе
СтрокаКоординат = "37.64, 55.76, " ;
конецесли ;
Если ВыборМасштаба = "" тогда
возврат ;
конецесли ;
числоМасштаба = Число( Лев( ВыборМасштаба, стрдлина( ВыборМасштаба) - 1 ) ) ;
числоМасштаба = числоМасштаба + 5 ;
ВыборМасштаба = строка( числоМасштаба) + "%" ;
ТекущийМасштаб = Строка( Цел( ( числоМасштаба/ 125 ) * ( 20 ) + 4 ) ) ;
если стрДлина( ТекущийМасштаб) = 1 тогда
ТекущийМасштаб = "0" + ТекущийМасштаб;
конецесли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( "mapRazmer(map," + СтрокаКоординат + ТекущийМасштаб + ")" ) ;
КонецПроцедуры
Пример обратного геокодирования - получение координат по адресу:
Код 1C v 8.х Процедура ПолучитьКоординаты() Экспорт
Яндекс = Новый HTTPСоединение( "geocode-maps.yandex.ru" , , , , , Истина ) ;
ВременныйФайл = КаталогВременныхФайлов( ) + "Yandex_geocode_" + СокрЛП( Новый УникальныйИдентификатор) ;
Попытка
Яндекс. Получить( "/1.x/?geocode=" + Адрес + "&results=1" , ВременныйФайл) ;
Исключение
Сообщить( "Ошибка при попытке геокодировать по яндексу адрес: " + Адрес) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ВременныйФайл) ;
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM. Прочитать( ЧтениеXML) ;
СписокText = ДокументДОМ. ПолучитьЭлементыПоИмени( "text" ) ;
СписокPos = ДокументДОМ. ПолучитьЭлементыПоИмени( "pos" ) ;
Если ( СписокText. Количество( ) = 0 ) ИЛИ ( СписокPos. Количество( ) = 0 ) Тогда
Возврат ;
КонецЕсли ;
Для ъ = 0 по СписокText. Количество( ) - 1 Цикл
Координаты = СписокPos[Ъ]. ТекстовоеСодержимое;
Разделитель = Найти( Координаты, " " ) ;
Широта = Число( Сред( Координаты, Разделитель + 1 ) ) ;
Долгота = Число( Лев( Координаты, Разделитель - 1 ) ) ;
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли ;
КД = Долгота;
КШ = Широта;
КонецЦикла ;
КонецПроцедуры
Обработка вырванная из конфигурации: YandexMap.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Использование форматированного документа для создания описаний на сайте В 1С хранится номенклатура, которая в последствии выгружается на сайт.
Для каждой выгружаемой номенклатуры нужно указать описание! Но не обычный текст, а хорошо оформленный, со списками, курсив, выделение:
Реализовано следующим образом:
Реквизит объекта ОписаниеОсновное Реквизит формы фдОсновноеОписание
Код, который при изменении форматированного документа, помещает кусок HTML кода находящегося в BODY в реквизит ОписаниеОсновное:
Код 1C v 8.3 &НаКлиенте
Процедура фдОсновноеОписаниеПриИзменении(Элемент)
Вложение = Новый Структура; текТекст = "" ;
фдОсновноеОписание. ПолучитьHTML( текТекст, Вложение) ;
текТекст= СтрЗаменить ( текТекст, "center'" , "center;'" ) ;
текТекст= СтрЗаменить ( текТекст, "right'" , "right;'" ) ;
текТекст= СтрЗаменить ( текТекст, "justify'" , "justify;'" ) ;
Содержимое= текТекст; НачалоБлока = "<body>" ; КонецБлока = "</body>" ;
текТекст = Сред( Содержимое, Найти( Содержимое, НачалоБлока) + СтрДлина( НачалоБлока) , Найти( Содержимое, КонецБлока) - Найти( Содержимое, НачалоБлока) - СтрДлина( НачалоБлока) ) ;
Объект. ОписаниеОсновное = СокрЛП( текТекст) ;
КонецПроцедуры
При открытии:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
фдОсновноеОписание. УстановитьHTML( Объект. ОписаниеОсновное, Новый Структура) ;
КонецПроцедуры
Категория:
Форматированный документ 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? Код 1C v 7.x
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе
Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯчейки, Док, ТекстВЯчейке, ТабКурсов;
Url = "http://www.bank.gov.ua/control/uk/curmetal/currency/search?formType=searchFormDate&time_step=" + ? ( Ежедневно = 1 , "daily" , "monthly" ) +
"&date=" + Формат( ДатаКурса, "ДДДММГГГГ" ) + "&outer=table&execute=run&time=" + _GetPerformanceCounter( ) ;
Сообщить( Url) ;
Reader = СоздатьОбъект( "MSXML2.XMLHTTP" ) ;
Reader. Open( "Get" , Url, 0 ) ;
Reader. Send( ) ;
Пока Reader. ReadyState < > 4 Цикл
Состояние( "Чтение данных за <" + ДатаКурса + "> " ) ;
КонецЦикла ;
Док = СоздатьОбъект( "HtmlFile" ) ;
Док. open( "text/html" ) ;
Док. write( Reader. ResponseText) ;
Док. close( ) ;
HtmlTab = Док. getElementsByTagName( "table" ) . item( 5 ) ;
ТабКурсов = СоздатьОбъект( "ТаблицаЗначений" ) ;
ТабКурсов. НоваяКолонка( "ЦифрКод" , "Строка" , 3 , , "Цифр. код" ) ;
ТабКурсов. НоваяКолонка( "БуквКод" , "Строка" , 3 , , "Букв. код" ) ;
ТабКурсов. НоваяКолонка( "Название" , "Строка" ) ;
ТабКурсов. НоваяКолонка( "Курс" , "Число" , 14 , 4 ) ;
ТабКурсов. НоваяКолонка( "Кратность" , "Число" , 9 , 0 ) ;
Строк = HtmlTab. rows. length;
Для НомСтроки = 1 По Строк Цикл
Р = HtmlTab. rows( НомСтроки - 1 ) ;
Если ( НомСтроки = 1 ) Или ( Р. cells. length < > 5 ) Тогда
Продолжить;
КонецЕсли ;
ТабКурсов. НоваяСтрока( ) ;
ТабКурсов. ЦифрКод = СокрЛП( Р. cells( 0 ) . innerText) ;
ТабКурсов. БуквКод = СокрЛП( Р. cells( 1 ) . innerText) ;
ТабКурсов. Название = СокрЛП( Р. cells( 3 ) . innerText) ;
ТабКурсов. Курс = 0 + СтрЗаменить( СокрЛП( Р. cells( 4 ) . innerText) , " " , "" ) ;
ТабКурсов. Кратность = 0 + СтрЗаменить( СокрЛП( Р. cells( 2 ) . innerText) , " " , "" ) ;
КонецЦикла ;
Reader = 0 ;
ТабКурсов. ВыбратьСтроку( , "Курсы за " + ДатаКурса) ;
Возврат ТабКурсов;
КонецФункции
Категория:
HTML, JS, VML