Функция получение содержимого адреса 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 //Функция читает полученный 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-пакеты COM-подключение к базе 7.7 из .NET, .NET Core Инсталяция:> dotnet add package sabatex.V1C77
или добавить через NUGET пакет sabatex.V1C77.
Добавить пространство имен: using sabatex.V1C77;
пример использованя: ---C#
static void Main(string[] args) { // создаём строку соединения var connection = new sabatex.V1C77.Models.Connection { DataBasePath = @"C:\demo\1SBUKRD", // путь к базе PlatformType = sabatex.V1C77.Models.EPlatform1C.V77M, // платформа 1С77 UserName = "Админов", // имя пользователя UserPass = "" // пароль или пустая строка }; // соединяемся с 1С77 // using (var _1c77 = sabatex.V1C77.COMObject1C77.CreateConnection(connection)) { // перебор всего справочника Контрагенты var contr = _1c77.GlobalContext.CreateObject("Справочник.Контрагенты"); if (contr.Method<double>("ВыбратьЭлементы") == 1) { while (contr.Method<double>("ПолучитьЭлемент")==1) { if (contr.Method<double>("ЭтоГруппа") == 1) continue; var name = contr.Get Property<string>("Наименование"); Console.WriteLine(name); } } } } [/pre] соответствие типов данных 1С7.7 и C#
строка - string число - doubl дата - DataTime остальное - V1C77COMObject возможно использовать bool для замены double(0- false;1 - true) тогда выражение сократится к if (contr.Method("ВыбратьЭлементы"))
Категория:
OLE, ActiveX Битая ссылка, , Уникальный Идентификатор, GUID - Управляемые формы Категория:
1С Общие вопросы - Управляемые формы и Такс… Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же утрачен.
На сегодня облачные хранилища часто заменяют физические носители информации. Как правило, облачные хранилища предоставляют бесплатно от 2 до 15 ГБ дискового пространства, кому-то этого будет вполне достаточно.
ПО Effector Saver позволяет настроить периодичное резервное копирование информационной базы 1С в облако. И задать количество хранения файлов резервной копии, отдельно для каждого хранилища.
Таким образом, вы можете установить удобное время для бэкапа и управлять количеством копий базы данных.
Далее в статье рассмотрим как с помощью Effector Saver настроить бэкап информационной базы 1С:Предприятия в облако Яндекс.Диск.
На компьютере где производится настройка, должна быть установлена программа 1С:Предприятие и подключена необходимая база данных.
Скачиваем программу с оф. сайта Скачать Effector Saver
Запускаем файл инсталляции Мастера установки. На последнем этапе Мастера установки, соглашаемся с запуском программы и нажимаем «Завершить » .
На панели инструментов нажимаем «Задачи» & «Добавить задачу» .
Выбираем тип новой задачи «Резервное копирование 1С:Предприятие 8» , нажмите «Создать» .
Во вкладке «Подключение к 1С» нажимаем «Выбрать базу 1С:Предприятия из списка и заполнить основные параметры» .
В открывшемся окне «Выбор базы 1С:Предприятия» указываем необходимую базу и нажимаем «Выбрать» .
Поля «Наименование:» , «Исполняемый файл:» , «Вариант базы:» и «Каталог базы:» автоматически заполнятся в соответствии с выбранной базой.
Необходимо только заполнить имя и пароль пользователя указанной базы, под которым будет запускаться резервное копирование средствами Конфигуратора 1С:Предприятия.
Если используете программную лицензию 1С, то установите флаг «Использовать программную лицензию 1С» .
На вкладке «Отключение пользователей» , устанавливаем флаг «Завершить работу пользователей 1С:Предприятия» .
В Effector Saver доступно два варианта завершения работы пользователей:
- если у вас файловой база выберите «Вызвать штатное завершение работы пользователей» ;
- если у вас клиент-серверная база выберите «Завершить сеансы на сервер 1С:Предприятие» . Если в кластере 1С:Предприятия создан пользователь «администратор кластера», установите флажок «Кластер требует авторизации» . Заполните поля: «Имя администратора кластера:» и «Пароль администратора кластера:» . Если порт подключения к Агенту сервера отличный от стандартного, установите флажок «Используется нестандартный порт агента сервера» . Заполните поле «Порт агента сервера:» (по умолчанию 1540).
На следующей вкладке «Хранилище архивов» указываем, где следует хранить создаваемые архивы.
Для добавления нового хранилища архива, нажимаем на кнопку «+» . В открывшемся окне, нажимаем «Создать новое хранилище» .
Из выпадающего списка, выберите, «Яндекс.Диск » . Доступны и другие варианты: Локальная/сетевая папка, FTP/FTPS, WebDAV, Google Диск, Dropbox, OneDrive, Облако Mail.Ru.
Поле «Название:» , оставим как есть. Нажимаем «Авторизация» .
Откроется окно браузера, в котором необходимо ввести логин и пароль для доступа к Яндекс.Диску. Затем нажмите «Разрешить» , после этого окно браузера автоматически закроется.
Далее укажем папку для хранения бэкапа базы 1С, нажимаем на кнопку с тремя точками и выбираем папку, (если папки нет, создайте ее).
Для управления количеством копий базы данных, устанавливаем флаг «Автоматически удалять устаревшие резервные копии» , и заполняем параметр «Хранить количество копий» , например 3. Нажимаем «ОК» .
На следующей вкладке назначим расписание. В поле «Назначить задание:» , выберите нужный интервал времени и заполните параметр «Время начала:» .
В верхней части окна настройки устанавливаем флажок «Выполнять задачу по расписанию» и нажимаем кнопку «Сохранить» .
Резервное копирование информационной базы 1С на Яндекс.Диск будет осуществляться автоматически в соответствии с установленным расписанием.
Категория:
1С ERP Управление предприятием 2.0 Как уменьшить вес картинок в базе данных или изменить размер, ширину или высоту картинок? Иногда возникает необходимость обработать фотографии в 1С автоматически, уменьшить вес картинок в килобайтах, за счет удаления из файла не нужной технической информации и сглаживания цветов, или изменить размер, уменьшить картинку пропорционально задав максимальный размер по ширине или высоте.В этом случае можно:1) установить специальные библиотеки в операционной системе для работы с графикой, н-р GFLAx и подключать их как com-объекты2) использовать api сервисов, таких как optipic.io .
Рассмотрим оба варианта:1) Использование GFLAxСкачиваем и устанавливаем библиотеку GFLAx, скачать можно здесь https://www.xnview.com/en/#downloads
Далее её надо зарегистрировать в Windows. Для этого запускаем CMD.exe с правами администратора и набираем: regsrv32 "путь_к_DLL\GFLAx.dll"Далее уже в программе, для пропорционального изменения размера файла до максимального размера в 500 пикселей можно вставить такой код:
Код 1C v 8.х GFLAx = Новый COMОбъект("GFLAx.GFLAx");
GFLAx.LoadBitmap(ИмяИсходногоФайла);
// Получаем исходный размер картинки
Ширина = GFLAx.Width;
Высота = GFLAx.Height;
//определяем максимальную сторону по которой будем проводить пропорциональное изменениеДелитель= ?(Ширина>Высота, Делитель=Ширина/500, Делитель=Высота/500);
НоваяШирина = Ширина/Делитель;
НоваяВысота = Высота/Делитель;
GFLAx.Resize(Цел(НоваяШирина),Цел(НоваяВысота));
GFLAx.SaveBitmapИмяВыходногоФайла);
Данный способ требует специальных настроек операционной системы, навыков системного администрирования и данный способ не проводит полноценную оптимизацию картинки.Кроме того, на компьютере или сервере, где производиться оптимизация эта библиотека должна быть установлена.2) Использование сервиса optipic.io Подобные сервисы обычно платные, но стоимость использования не высокая, а качество и гибкость существенно выше.
Преимущества использования сервиса optipic.io в проектах 1С:
Легко подключить Не нужно устанавливать дополнительные библиотеки в операционной системе Можно использовать как для оптимизации изображений, так и для изменения размера изображения в пикселях (ресайз) Не зависит от операционной системы и типа используемого клиента Конфигурация будет работать после переезда на другой компьютер или сервер Качество и эффективность сжатия производятся в самом оптимальном виде Использование сервиса можно легко встроить в любой свой проект на 1С. Для этого можно добавить себе функцию, в которую передавать имя файла с исходной картинкой и параметры оптимизации. А в качестве ответа получить имя файла уже оптимизированного сервисом.
Пример такой функции для 1C8:
Код 1C v 8.х Функция ОптимизироватьКартинку(ФайлКартинкиИсходный, Качество=70, НужноИзменятьРазмер=Ложь, МаксимальнаяШирина=1000, МаксимальнаяВысота=1000) Экспорт
ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
email = "ВашEmail";
Пароль = "ВашПароль";
Соедиенение = Новый HTTPСоединение("optipic.io", , email, Пароль, , ,ssl);
СкриптНаСайте = "api/compress?quality="+Качество+"&from=1c";
Если НужноИзменятьРазмер Тогда
СкриптНаСайте = СкриптНаСайте + "&maxwidth="+Формат(МаксимальнаяШирина, "ЧГ=")+"&maxheight="+Формат(МаксимальнаяВысота, "ЧГ=");
КонецЕсли;
НовыйФайлКартинки = ПолучитьИмяВременногоФайла();
Попытка
Результат = Соедиенение.ОтправитьДляОбработки(ФайлКартинкиИсходный, СкриптНаСайте, НовыйФайлКартинки);
Возврат НовыйФайлКартинки;
Исключение
//Обработка ошибки
//Не удалось получить файл
//Или нужно пополнить баланс
Возврат ФайлКартинкиИсходный;
КонецПопытки;
КонецФункции
И далее в коде обращаться к данной функции, н-р так
Код 1C v 8.х НовыйФайл = ОптимизироватьКартинку(ФайлКартинкиИсходный, 70, Истина, 500, 500);
Категория:
1С ERP Управление предприятием 2.0 Отправка 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.get ElementById("WebClientOperation").value = Команда;
ЭлементыФормы.Эксплорер.document.get ElementById("WebClient").click();
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры
Процедура ПолучитьКоординатыНажатие(Элемент)
ВыполнитьСкрипт("Get GEO();");
ТекКоординаты=ЭлементыФормы.Эксплорер.document.get ElementById("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.get ElementById('CoordX').value = "0";
document.get ElementById('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);
Get GEO();
});
}
function addMarker(coordPosition){
myPlacemark = new ymaps.Placemark(coordPosition, {
// Свойства
// Текст метки
iconContent: 'Точка'+index
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
document.get ElementById('CoordX').value = coordPosition[0].toPrecision(15);
document.get ElementById('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.get ElementById('RouteInfo').value = "Длина маршрута - " + route.get HumanLength() + ". Время - " + route.get HumanJamsTime();
//генерация события для перехвата в 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.get Bounds());
}
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.get Coordinates(), {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.get Coordinates(), {
// Свойства
// Текст метки
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.get ElementById('CoordX').value = "0";
document.get ElementById('CoordY').value = "0";
var WebClientOperation = document.get ElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.get ElementById('WebClientOperation').value = "0";
}
function Get GEO(){
polygon.editor.stopEditing();
printGeometry(polygon.geometry.get Coordinates());
}
// Выводит массив координат геообъекта в <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>
Категория:
Географическая схема Ошибка загрузки библиотеки libWand.so Установили мини сервер 1С на Cent OS 7 + Postgree SQL , Подключились через консоль, создали базу, загрузи DT и при открытии программы:
Ошибка загрузки библиотеки libWand.so по причине:Библиотека не обнаружена. Часть функций будет недоступна.
Обратитесь к разделу справочной системы «1С:Предприятие - Работа пользователя – Особенности работы в Linux – Внешние библиотеки»
Решение:
Ошибку libwand.so лечится установкой старого пакета libwand
Для 1С 32х:
apt-get install imagemagick-6.q16:i386
apt-get install imagemagick:i386
Для 1С 64х
apt-get install imagemagick-6.q16
apt-get install imagemagick
+ В интернете нашлись рекомендации 1С правда они от 2013г)
Если при запуске из командной строки /opt/1C/v8.3/i386/1cv8 (или для 64разр /opt/1C/v8.3/x86_64/1cv8) ругается на отсутствие libWand.so то:
либо не установлен imagemagick, либо отсутствует символьная ссылка на эту библиотеку.
Во втором случае ищем что у нас есть:
sudo find /usr/lib/ -name "libMagickWand.so*" -print
получим например:
/usr/lib/libMagickWand.so.3.0.0
/usr/lib/libMagickWand.so.3
создадим ссылку на любой из них
ln -s -T /usr/lib/libMagickWand.so.3 /usr/lib/libWand.so
Категория:
Администрирование Проверка регулярного выражения без внешних компонент Код 1C v 8.х &НаКлиенте
Функция ПроверитьСтроку(Строка, Фасет)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(
"<Model xmlns=""http://v8.1c.ru/8.1/xdto"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""Model"">
|<package target Namespace=""sample-my-package"">
|<valueType name=""testtypes"" base=""xs:string"">
|<pattern>" + Фасет + "</pattern>
|</valueType>
|<objectType name=""TestObj"">
|<property xmlns:d4p1=""sample-my-package"" name=""TestItem"" type=""d4p1:testtypes""/>
|</objectType>
|</package>
|</Model>");
Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
Пакет = МояФабрикаXDTO.Пакеты.Получить("sample-my-package");
Тест = МояФабрикаXDTO.Создать(Пакет.Получить("TestObj"));
Попытка
Тест.TestItem = Строка;
Возврат Истина
Исключение
Возврат Ложь
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура Модель(Команда)
Сообщить(ПроверитьСтроку("01.01.2012","\d{2}\.\d{2}\.\d{4}"));
Сообщить(ПроверитьСтроку("01.01.20121","\d{2}\.\d{2}\.\d{4}"));
КонецПроцедуры
Источник
Категория:
Регулярные выражения Преобразование ТаблицыЗначений во временную таблицу Код 1C v 8.х Процедура ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
ТипизированнаяТЗ = Новый ТаблицаЗначений;
Для й=1 По Тз.Количество() Цикл ТипизированнаяТЗ.Добавить(); //Создаем строки
КонецЦикла;
ДЗТипов = Новый ДеревоЗначений;
ДЗТипов.Колонки.Добавить("ИмяКолонки");
ДЗТипов.Колонки.Добавить("ТипЗначений");
Для Каждого Колонка из Тз.Колонки Цикл
СтрокаКолонки = ДЗТипов.Строки.Добавить();
СтрокаКолонки.ИмяКолонки = Колонка.Имя;
ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
ТекСТрокаТипа.ИмяКолонки = Колонка.Имя; //Заполняется для красоты
ТекСТрокаТипа.ТипЗначений = ТипЗнч(тз[0][Колонка.Имя]);
Для Каждого СтокаТЗ из Тз Цикл
ТекТип = ТипЗнч(СтокаТЗ[Колонка.Имя]);
Если НЕ ТекТип = ТекСТрокаТипа.ТипЗначений Тогда
Если СтрокаКолонки.Строки.Найти(ТекТип, "ТипЗначений")=Неопределено Тогда
ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
ТекСТрокаТипа.ИмяКолонки = Колонка.Имя;//Заполняется для красоты
ТекСТрокаТипа.ТипЗначений = ТекТип;
КонецЕслИ;
КонецЕслИ;
КонецЦикла;
МассивТипов = СтрокаКолонки.Строки.ВыгрузитьКолонку("ТипЗначений");
ТипизированнаяТЗ.Колонки.Добавить(Колонка.Имя, Новый ОписаниеТипов(МассивТипов),Колонка.Заголовок);
ТипизированнаяТЗ.ЗагрузитьКолонку(Тз.ВыгрузитьКолонку(Колонка),Колонка.Имя);
КонецЦикла;
КонецПроцедуры
Источник
Категория:
Запросы Импорт/экспорт CSV в ТЗ Код 1C v 8.х //ПреобразоватьТекстCSVвТЗ () импортирует данные в ТЗ из текста формата CSV
//Параметры:
//ТекстCSV - Строка, содержащая текст в формате csv
//Разделитель - Для формата CSV разделителем является ',', но т.к.
// Excel берет разделитель из региональных стандартов, то
// используется ';', поддерживает многострочные поля
//
&НаСервереБезКонтекста
Функция ПреобразоватьТекст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
//Параметры:
//ТЗ - Таблица значений данные которые сохраняются в файл
//флЭкспортироватьИменаКолонок - Первой строкой выводить имена колонок
//Разделитель - Для формата CSV разделителем является ',', но т.к.
// Excel берет разделитель из региональных стандартов, то
// используется ';'
//
&НаСервереБезКонтекста
Функция ПреобразоватьТЗвТекстCSV(ТЗ, Разделитель = ";", флЭкспортироватьИменаКолонок = Ложь) Экспорт
ТекстCSV = "";
Если флЭкспортироватьИменаКолонок Тогда
//Если нужно выгружать наименование колонок Выгружаем
ПодготовленнаяСтрока = "";
Для Каждого Колонка Из ТЗ.Колонки Цикл
ПодготовленнаяСтрока = ПодготовленнаяСтрока + Колонка.Имя + Разделитель;
КонецЦикла;
ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1);
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС;
КонецЕсли;
Для Каждого Строка Из ТЗ Цикл
ПодготовленнаяСтрока = "";
Для Каждого Колонка Из ТЗ.Колонки Цикл
ПреобразованноеПоле = Строка[Колонка.Имя];
//по правилам CSV если поле содержит двойные ковычки они должны повторятся дважды
Если Найти(ПреобразованноеПоле,"""") Тогда
ПреобразованноеПоле = СтрЗаменить(ПреобразованноеПоле,"""","""""");
КонецЕсли;
//по правилам CSV если поле содержит перенос строки или запятую оно должно заключатся в двойные кавычки
Если Найти(ПреобразованноеПоле,Разделитель) ИЛИ Найти(ПреобразованноеПоле,Символы.ПС) ИЛИ Найти(ПреобразованноеПоле,"""") Тогда
ПреобразованноеПоле = """" + ПреобразованноеПоле + """";
КонецЕсли;
ПодготовленнаяСтрока = ПодготовленнаяСтрока + ПреобразованноеПоле + Разделитель;
КонецЦикла;
ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1);
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС;
КонецЦикла;
Возврат ТекстCSV;
КонецФункции
Источник
Категория:
Работа с Таблицей Значений Функция разбора (разложения) строки в массив, аналог СтрРазделить Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",",
Знач ПропускатьПустыеСтроки = Неопределено)
Результат = Новый Массив;
// для обеспечения обратной совместимости
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;
Возврат Результат;
КонецФункции
Источник
зы: админ, вот искал аналог СтрРазделить с игнорированием пустых строк - не нашел,зато нашел много дублей: https://helpf.pro/faq/view/504.html https://helpf.pro/faq/view/171.html https://helpf.pro/faq/view/351.html
, объедини пожалуйста.
зыы: кнопкой вставки ссылки невозможно пользоваться, ну что за извращенство с подменю, сделай одинарной как везде.
Категория:
Работа с Текстом (Строкой) ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП // Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу.
//
// Параметры:
// рВетка - дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип колонок. Если хватит
// объявленных позиционных строк-заполнителей, всё поместится. Если иерархия слишком глубока, строки просто надо нарастить;
// рТекст - на входе должен быть равен Неопределено; на выходе по окончании работы содержит результатный текстовый документ;
// рПараметры - структура дополнительных настроек, допустимые ключи:
// Колонки - структура колонок, которые подлежат выводу. Если пуста или имеет тип, отличный от структуры, выводятся все колонки;
// если в ключах структуры указаны имена колонок, будут выведены только они. В значениях структуры можно передать строковое
// представление формата, согласно которому должны будут форматироваться выводимые значения. По умолчанию формата нет;
// ПоказыватьУровни - булево, управляет выводом №№ уровней (метод Уровень()), по умолчанию выключено;
// ШагОтступа - число, определяющее шаг в символах, используемый для показа псевдографики иерархии веток в дереве.
//
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст=Неопределено Тогда // первая итерация, шапочный вызов исходной части
//---------------------------------------------------------------------------------------------------------------------------
// Разбираем входные данные
Если ТипЗнч(рВетка)<>Тип("ДеревоЗначений") Тогда Возврат КонецЕсли;
Если ТипЗнч(рПараметры)<>Тип("Структура") Тогда рПараметры=Новый Структура КонецЕсли;
стрКолонок=?(рПараметры.Свойство("Колонки"),рПараметры.Колонки,Неопределено);
Если ТипЗнч(стрКолонок)<>Тип("Структура") Тогда стрКолонок=Новый Структура КонецЕсли;
рПоказыватьУровни=?(рПараметры.Свойство("ПоказыватьУровни"),рПараметры.ПоказыватьУровни,Ложь); // затратное дело, кстати
рШагОтступа=?(рПараметры.Свойство("ШагОтступа"),рПараметры.ШагОтступа,2); // для отображения отступа в колонке иерархии
//---------------------------------------------------------------------------------------------------------------------------
// Определяем максимальное количество уровней
// Также можно получить максимальный уровень, "плоско" перебрав все строки (например, получив их через НайтиСтроки)
// и в цикле для каждой вызывая Уровень() и определяя максимум.
// Вариант через СКД и служебное поле "Уровень" ни на одной известной мне платформе не работоспособен (нехватка памяти).
//
//
//рДеревоДляТеста=КакНибудьСкопироватьДерево(рВетка);
//рДеревоДляТеста.Колонки.Вставить(0,"_Level",Новый ОписаниеТипов("Булево")); // самый экономный вариант, с сохранением иерархии
//мНенужных=Новый Массив;
//Для й=1 По рДеревоДляТеста.Колонки.Количество()-1 Цикл
// мНенужных.Добавить(рДеревоДляТеста.Колонки[й]);
//КонецЦикла;
//Для каждого кол Из мНенужных Цикл
// рДеревоДляТеста.Колонки.Удалить(кол);
//КонецЦикла;
//
рДеревоДляТеста=рВетка; // пока сериализуем прямо всё дерево (неоптимально, но...)
рЗапись=Новый ЗаписьXML;
рЗапись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(рЗапись,рДеревоДляТеста);
стро=рЗапись.Закрыть();
//
стро=СтрЗаменить(стро,"xmlns=","xmlns:myns1C="); // иначе не будет работать XPath
//
рЧтение=Новый ЧтениеXML;
рЧтение.УстановитьСтроку(стро);
постр=Новый ПостроительDOM;
рДокументДОМ=постр.Прочитать(рЧтение);
рВыражение="/ValueTree/row"; максКолвоУровней=1;
рРазыменователь=Новый РазыменовательПространствИменDOM(рДокументДОМ);
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
рРезультат=рДокументДОМ.ВычислитьВыражениеXPath(рВыражение,рДокументДОМ,рРазыменователь,ТипРезультатаDOMXPath.Любой);
Если рРезультат.ПолучитьСледующий()=Неопределено Тогда Прервать КонецЕсли;
рВыражение=рВыражение+"/row";
максКолвоУровней=максКолвоУровней+1;
КонецЦикла;
максКолвоУровней=максКолвоУровней-1; // можно и так: СтрЧислоВхождений(рВыражение,"/row")-1;
//---------------------------------------------------------------------------------------------------------------------------
// готовим исходный макет вывода
строПробелы=" ";
строРазделители="===============================================================================================";
строОтступы="___________________________________________________________________________________________"; // тут нужны чуть для другого
//
секШапка1="|[_HCS"+Лев(строПробелы,максКолвоУровней*рШагОтступа)+"]|"; // HierarchyColumnShow
секГорРазделитель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 // Путь к обновлениям
Перем мРасположениеОбновлений;
//Параметры для подключения к серверу обновления 1С
Перем мИтсЛогин;
Перем мИтсПароль;
//****
Перем 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-объект с идентификатором V82.COMConnector
COMОбъект = Новый COMОбъект("V"+мВерсияПлатформы+".COMConnector"); //выйдет V82.COMConnector
Исключение
Сообщить("Не удалось создать COM-объект!");
Возврат ПараметрыБазы;
КонецПопытки;
ПутьКБазе = "srvr="""+ СокрЛП(мИмяСервера) +""";" + "ref=""" + СокрЛП(мИмяБазы) +""";";
СтрокаСоединения = ПутьКБазе + "Usr="""+ СокрЛП(мБазаЛогин) +""";" + "Pwd="""+ СокрЛП(мБазаПароль) + """;";
Попытка
//Устанавливаем внешнее соединение с информационной базой через COM-соединение
V82 = COMОбъект.Connect(СтрокаСоединения);
Исключение
Сообщить(СтрокаСоединения);
Сообщить("Внешнее соединение не установлено!");
Возврат ПараметрыБазы;
КонецПопытки;
ПараметрыБазы = Новый Структура;
ПараметрыБазы.Вставить("ТекущаяВерсия", v82.Метаданные.Версия);
ПараметрыБазы.Вставить("ПутьКПлатформе",v82.КаталогПрограммы() + "1cv8.exe");
Возврат ПараметрыБазы;
КонецФункции
Процедура УстановитьCOMСоединение(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Попытка
//Создаем COM-объект с идентификатором V82.COMConnector
COMОбъект = Новый COMОбъект("V"+мВерсияПлатформы+".COMConnector"); //выйдет V82.COMConnector
Исключение
Сообщить("Не удалось создать COM-объект!");
Возврат;
КонецПопытки;
//Инициализируем строку подключения к информационной базе:
// Если ФайловаяИБ Тогда
//Файловый вариант
// ПутьКБазе = "File="""+ СокрЛП(КаталогИБ) +""";";
// Иначе
//Серверных вариант
ПутьКБазе = "srvr="""+ СокрЛП(мИмяСервера) +""";"+
"ref=""" + СокрЛП(мИмяБазы) +""";";
// КонецЕсли;
СтрокаСоединения = ПутьКБазе +
"Usr="""+ СокрЛП(мБазаЛогин) +""";"+
"Pwd="""+ СокрЛП(мБазаПароль) +""";";
Сообщить(СтрокаСоединения);
Попытка
//Устанавливаем внешнее соединение с информационной базой через COM-соединение
V82 = COMОбъект.Connect(СтрокаСоединения);
Исключение
Сообщить(СтрокаСоединения);
Сообщить("Внешнее соединение не установлено!");
Возврат;
КонецПопытки;
КонецПроцедуры
// Загрузка списка обновлений из файла XML
// Достаем из XML файла, наибольший номер возможного обновления
Функция ВыполнитьЗагрузкуСпискаОбновлений(ИмяФайлаЗагрузки,ТекущаяВерсияКонфигурации)
СообщениеОбОшибке = "Ошибка при чтении файла списка обновлений.";
Если НЕ ФайлСуществует(ИмяФайлаЗагрузки) Тогда
Сообщить("Нету XML файла (списка обновлений)");
Возврат Неопределено;
КонецЕсли;
ВерсияДляОбновления = Неопределено;
Попытка
// ТаблицаЗначений = Новый ТаблицаЗначений;
// ТаблицаЗначений.Колонки.Добавить("Конфигурация", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("Поставщик", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("Версия", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("ВерсияДляОбновления", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("ПутьКФайлуОбновления", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("РазмерФайлаОбновления", Тип("Число"));
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаЗагрузки);
ЧтениеXML.Прочитать(); // <?xml version="1.0" encoding="UTF-8" ?>
// Дата формирования файла.
ЧтениеXML.Прочитать();
ЧтениеXML.Прочитать();
ДатаФормирования = ЧтениеXML.Значение;
ЧтениеXML.Прочитать();
// Читаем начало элемента Update или конец элемента UpdateList.
Пока Чтение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.Значение = ТекущаяВерсияКонфигурации Тогда //279 Новые в конце. на последнюю полученную и будем обновяться
ВерсияДляОбновления = Версия;
КонецЕсли;
КонецЕсли;
ЧтениеXML.Прочитать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Исключение
Сообщить(СообщениеОбОшибке);
ЧтениеXML.Закрыть();
Возврат Неопределено;
КонецПопытки;
//Возврат ТаблицаЗначений;
ЧтениеXML.Закрыть();
Возврат ВерсияДляОбновления;
КонецФункции // ВыполнитьЗагрузкуСпискаОбновлений()
//Входящие Сервер - База - ТипКонфигурации - ВерсияРелиза - ВерсияПлатформы-ИТС логин и пароль необязательно
Процедура ПроверитьОбновлениеКонфигурации(мИмяСервера,мИмяБазы,мТипКонфигурации,мВерсияРелиза,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Сообщить("----------------------------------------------------------------------");
//удалить старые файлы
УдалитьФайлы(ФайлСписокОбновленийXML);
УдалитьФайлы(ФайлСписокОбновленийZIP);
// Качаем v8cscdsc.xml в виде v8upd11.zip
// Создание HTTP-соединения с сервером обновлений
СерверОбновлений = Новый HTTPСоединение("downloads.1c.ru",,мИтсЛогин,мИтсПароль,);
ЗапросКСерверуОбновлений = Новый HTTPЗапрос("/ipp/ITSREPV/V8Update/Configs/"+мТипКонфигурации+"/"+мВерсияРелиза+"/"+мВерсияПлатформы+"/v8upd11.zip");
СерверОбновлений.Получить(ЗапросКСерверуОбновлений,ФайлСписокОбновленийZIP);
// Распаковываем v8cscdsc.xml
Файл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";
//NoTruncate - не очищать логи
//Сообщить(КомандаПакетногоАрхивирования);
ЗапуститьПриложение(КомандаПакетногоАрхивирования,,Истина,КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Резервная копия успешно создана.");
Иначе
Сообщить("Ошибка при создании резервной копии");
Возврат;
КонецЕсли;
Версия_Для_Обновления = СтрЗаменить(ВерсияДляОбновления, ".", "_"); //в каталоге шаблонов через подчеркивание храняться
//качаем новую версию, если уже не скачено
Если НЕ ФайлСуществует(мРасположениеОбновлений +"\"+мТипКонфигурации+"\"+Версия_Для_Обновления+"\") Тогда
//качаем новую
// Создание HTTP-соединения с сервером обновлений
Заголовки = Новый Соответствие();
Заголовки.Вставить("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: " + ВерсияДляОбновления);
//----- Запрос версии конфигурации базы...
КонецПроцедуры
УстановитьКонстанты();
//ОСНОВНЫЕ
//ЗУП 2.5
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_el","HRM","25","82","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_spb","HRM","25","82","Администратор","Администратор");
//БП 3.0
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_domx","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_el","Accounting","30","83","Администратор","Администратор");
//СВЕТЛАНЫ
//БП 3.0
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_ip","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_guild","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_lebedeva","Accounting","30","83","Администратор","Администратор");
//ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_service","AccountingBase","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_porsche","Accounting","30","83","Администратор","Администратор");
//ЗУП 2.5
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_service","HRM","25","82","Администратор","Администратор");
Источник
Категория:
Администрирование