Функция получение содержимого адреса 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/") ;
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(" Категория: Нет
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.GetProperty<string>("Наименование"); Console.WriteLine(name); } } } } [/pre] соответствие типов данных 1С7.7 и C#
строка - string число - doubl дата - DataTime остальное - V1C77COMObject
возможно использовать bool для замены double(0- false;1 - true) тогда выражение сократится к if (contr.Method("ВыбратьЭлементы"))
Категория:
OLE, ActiveX Как найти документ по уникальному идентификатору через com соединение? Потребовалось написать небольшую синхронизацию данных в дополнении к стандартной УТ-БП, нужно по уникальному идентификатору искать документы:
Стандартное Соединение.Справочники.Номенклатура.ПолучитьСсылку(УИ);
Выдает ошибку {Форма.Форма.Форма(301)}: Ошибка при вызове метода контекста (ПолучитьСсылку): Произошла исключительная ситуация: Несоответствие типов (параметр номер '1')
Нужно уникальный идентификатор создавать в com: Соединение.Справочники.Номенклатура.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИ)));
Рабочий пример:
Код 1C v 8.3 &НаСервере
Функция ПодключитьБазуНаСервере(Соединение = "")
Объект.ФайловаяБазаДанных=Ложь;
Объект.Сервер="srv1с";
Объект.База="buh";
Объект.ИмяПользователя="Obmen";
Объект.Пароль="1qaz";
// Подключение к 1С
Если Объект.ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + Объект.ПутьКБазе + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Объект.Сервер + "'; ref='" + Объект.База + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
КонецЕсли;
Попытка
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(СтрокаПодключения);
ЕстьСоединение = Истина;
Исключение
ЕстьСоединение = Ложь;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат Соединение;
КонецФункции
&НаСервере
Процедура ОбновитьДанныеПлатежейНаСервере()
Соединение = ПодключитьБазуНаСервере();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК Ссылка,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ОснованиеПлатежа,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма КАК Сумма
|ИЗ
|Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа
|ГДЕ
|НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа ССЫЛКА Документ.ЗаказКлиента";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
УИД = ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор();
СсылкаНаДок = Соединение.Документы.ПоступлениеНаРасчетныйСчет.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));
//Сообщить(СсылкаНаДок.Номер);
Для каждого СтрокаИсточник Из СсылкаНаДок.РасшифровкаПлатежа Цикл
//Сообщить("Счет: "+Строка(СтрокаИсточник.СчетНаОплату.Номер));
УИД = Соединение.String(СтрокаИсточник.СчетНаОплату.УникальныйИдентификатор());
текДок= Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
Если ЗначениеЗаполнено(текДок) Тогда
Сообщить(текДок);
текОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
текОбъект.РасшифровкаПлатежа[0].ОснованиеПлатежа= текДок;
текОбъект.РасшифровкаПлатежа[0].Заказ= текДок;
текОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеПлатежей(Команда)
ОбновитьДанныеПлатежейНаСервере();
КонецПроцедуры
Категория:
COM-объекты, WMI, WSH Как показать сообщение пользователю? методы: СообщениеПользователю и ПоказатьОповещениеПользователя В 1С предполагается, что СообщениеПользователю выводятся для того, чтобы сообщить пользователю об ошибках.
А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя() .
СообщениеПользователю выводит сообщение пользователю (после окончания обработки) или сохраняет его в очередь, если сообщение невозможно вывести прямо сейчас.
Пример вывода сообщения на клиенте:
Код 1C v 8.3 Если ЗначениеЗаполнено( объект. ИнтернетМагазин) Тогда
Иначе
сбп= Новый СообщениеПользователю;
сбп. Текст = "Укажите интернет-магазин данные которого Вы загружаете!" ;
сбп. Поле= "ИнтернетМагазин" ;
сбп. ПутьКДанным = "Объект" ;
сбп. Сообщить( ) ;
КонецЕсли ;
При обработке на сервере:
Необходимо зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИРеквизитаФормы(). Сделать это можно следующим образом:
Код 1C v 8.3 &НаСервере
Процедура ПроцедураВызываемаяСКлиента(ОбъектДанных)
Документ = ДанныеФормыВЗначение( Объект, Тип( "ДокументОбъект.ПоступлениеТМЦ" ) ) ;
УстановитьСоответствиеОбъектаИРеквизитаФормы( Документ, "Объект" ) ;
ДействиеСОбъектом( Документ) ;
КонецПроцедуры
В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени "Объект".
Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:
Код 1C v 8.3 &НаСервере
Процедура ДействиеСОбъектом(ОбъектДанных)
Сообщение = Новый СообщениеПользователю( ) ;
Сообщение. Текст = "В строке 11 табличной части "" Номенклатура"" не хватает " +
НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
Сообщение. Поле = "Номенклатура[10].Количество" ;
Сообщение. УстановитьДанные( ОбъектДанных) ;
Сообщение. Сообщить( ) ;
КонецПроцедуры ;
В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары "Объект/ИмяРеквизитаФормы". В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.
Примеры заполнения свойства Поле объекта СообщениеПользователю ТипШаблонПример
Реквизит ИмяРеквизита Контрагент Табличная часть ИмяТабличнойЧасти Скидки Реквизит табличной части ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита Номенклатура[10].Количество Реквизит набора записей [ИндексСтроки].ИмяРеквизита [10].Курс
Еще примеры:
Код 1C v 8.3 &НаКлиенте
Процедура ДействиеСОбъектомНаКлиенте(ОбъектДанных)
Сообщение = Новый СообщениеПользователю( ) ;
Сообщение. Текст = "В строке 11 табличной части "" Номенклатура"" не хватает " +
НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
Сообщение. Поле = "Номенклатура[10].Количество" ;
Сообщение. КлючДанных = ОбъектДанных. Ссылка;
Сообщение. ПутьКДанным = "Объект" ;
Сообщение. Сообщить( ) ;
КонецПроцедуры ;
&НаСервере
Процедура Сообщить4НаСервере()
Сообщение4 = новый СообщениеПользователю;
Сообщение4 . УстановитьДанные( РеквизитФормыВЗначение( "Объект" ) ) ;
Сообщение4 . Текст = "4. Сообщение привязанное к реквизиту шапки Организация" ;
Сообщение4 . Поле = "Организация" ;
Сообщение4 . Сообщить( ) ;
КонецПроцедуры
Сообщение = Новый СообщениеПользователю;
Сообщение. Поле = "Комментарий" ;
Сообщение. Текст = "Заполните комментарий" ;
Сообщение. Сообщить( ) ;
Сообщение = Новый СообщениеПользователю;
Сообщение. Поле = "Товары[0].Количество" ;
Сообщение. Текст = "Не заполнено количество товара в первой строке!" ;
Сообщение. УстановитьДанные( ЭтотОбъект) ;
Сообщение. Сообщить( ) ;
ОбщегоНазначенияКлиентСервер. СообщитьПользователю( “Текст ошибки”,
ЭтотОбъект,
"Договор" , ,
Отказ) ;
ОбщегоНазначенияКлиентСервер. СообщитьПользователю( НСтр( "ru = 'Дублирование пременной'" ) , ,
"Запросы[" + ИдентификаторСтроки+ "].ИмяПеременнойЗапроса" ,
"Объект" , Отказ) ;
ПоказатьОповещениеПользователя - оповещение возникает в правом нижнем углу приложения и сообщает о совершенном действии. В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет, и есть возможность внимательно его прочитать:
Код 1C v 8.3 ПоказатьОповещениеПользователя( НСтр( "ru = 'Выполнение:'" ) , ПолучитьНавигационнуюСсылку( Объект) , "Выгрузка завершена, все ОК!" , БиблиотекаКартинок. ПолнотекстовыйПоискДалее) ;
Код 1C v 8.3 &НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПолучитьДатуЗапретаРедактирования( ) > = Объект. Дата Тогда
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку( Объект. Ссылка) ;
ПоказатьОповещениеПользователя( "Только просмотр!" ,
НавигационнаяСсылка,
"Разрешен только просмотр документа!" ) ;
КонецЕсли ;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДатуЗапретаРедактирования()
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Константы.ДатаЗапретаРедактирования
|ИЗ
| Константы КАК Константы" ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Возврат РезультатЗапроса. Выгрузить( ) [0 ]. ДатаЗапретаРедактирования;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Строку в дату по форматной строке Код 1C v 8.х
Функция СтрокаВДату(Знач Строка, Знач ФорматДаты) Экспорт
Ч = Новый Соответствие;
Для ё = 1 По СтрДлина( ФорматДаты) + 6 Цикл
Ч[Сред( ФорматДаты + "dMyHms" , ё, 1 ) ] = 0
КонецЦикла ;
Для ё = 1 По СтрДлина( ФорматДаты) Цикл
Ч[Сред( ФорматДаты, ё, 1 ) ] = 10 * Ч[Сред( ФорматДаты, ё, 1 ) ] + Найти( "123456789" , Сред( Строка, ё, 1 ) ) ;
КонецЦикла ;
Ч["y" ] = Ч["y" ] + ? ( 0 < Ч["y" ] И Ч["y" ] < 50 , 2000 , ? ( 0 < Ч["y" ] И Ч["y" ] < 100 , 1900 , 0 ) ) ;
Возврат Дата( Макс( Ч["y" ], 1 ) , Макс( Ч["M" ], 1 ) , Макс( Ч["d" ], 1 ) , Ч["H" ], Ч["m" ], Ч["s" ]) ;
КонецФункции
Источник
Категория:
Работа с Датами (Временем) Скрипт автообновления типовых конфигураций Батник на "языке 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" , "Администратор" , "Администратор" ) ;
Источник
Категория:
Администрирование Как установить HTTP соединение через прокси (proxy) сервер В этом посте я покажу несколько примеров HTTP соединения используя прокси сервера:
Общий пример установки параметров прокси:
Код 1C v 8.х
Соединение = Новый HTTPСоединение( "www.mysite.ru" ) ;
Соединение = Новый HTTPСоединение( "www.mysite.ru" , 8080 ) ;
ПроксиСервер = Новый интернетПрокси;
ПроксиСервер. Пользователь = имяПользователя;
ПроксиСервер. Пароль = парольПользователя;
Соединение = Новый HTTPСоединение( "www.mysite.ru" , , , , ПроксиСервер, Истина ) ;
Пример загрузки файла
Код 1C v 8.х
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер. Пользователь = "userfile" ;
ПроксиСервер. Пароль = "12345" ;
ПроксиСервер. Установить( "http" , "10.1.1.23" , "3185" ) ;
СерверИсточник = "shop.com" ;
Адрес = "/price.asp" ;
ИмяВходящегоФайла = "c:\temp\input.html" ;
НТТР = Новый HTTPСоединение( СерверИсточник, , , , ПроксиСервер) ;
НТТР. Получить( Адрес, ИмяВходящегоФайла) ;
ВходящийФайл = Новый Файл( ИмяВходящегоФайла) ;
Вот пример загрузки файла
Код 1C v 8.х //Создаем Файл для отправки
ИмяФайлаHTML = КаталогВременныхФайлов() + “My1cV8bNdr”;
ФайлHTML = Новый ЗаписьТекста(ИмяФайлаHTML, КодировкаТекста.ANSI);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr”);
ФайлHTML.ЗаписатьСтроку(”content-disposition: form-data; name=”"userfile”"; filename=”"test.htm”"”);
ФайлHTML.ЗаписатьСтроку(”Content-Type: text/html”);
ФайлHTML.ЗаписатьСтроку(”");
ФайлHTML.ЗаписатьСтроку(”Дальше вставляем html код.”);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr–”);
ФайлHTML.Закрыть();
// Если необходимо использовать прокси
ПроксиСервер = Новый ИнтернетПрокси();
ПроксиСервер.Сервер(”адрес прокси”);
ПроксиСервер.Порт(”порт прокси”);
ПроксиСервер.Пользователь = “пользователь прокси”;
ПроксиСервер.Пароль = “пароль прокси”;
// Формируем заголовок для запроса
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить(”Content-Type”, “multipart/form-data; boundary=My1cV8bNdr”);
// Устанавливаем соединение и отпровляем запрос
HTTP = Новый HTTPСоединение(”сервер куда соединяемся”, , , , ПроксиСервер);
HTTP.ОтправитьДляОбработки(ИмяФайлаHTML, “/upload.php”, КаталогВременныхФайлов() + “result.htm”, ЗаголовокHTTP);
HTTP = Неопределено;
Категория:
Работа с Интернет, Почтой (Mail), FTP Реквизит ~ Как сохранять и восстанавливать значения Объектов и Реквизитов на форме УП? У управляемой формы реквизиты заведенные как реквизиты формы, при закрытии и открытии ее заново могут сохраняться и восстанавливаться, достаточно только поставить напротив галочку сохранять и в свойствах формы выбрать "АвтоматическоеСохранениеДанныхВНастройках" - Использовать.
Подробнее в этой статье Как сохранять и восстанавливать значения реквизитов на форме? и там же пример для обычных форм.
А что же делать с реквизитами, которые выступают в роли реквизитов объектов ?
у них такой настройки нет нет - напишем:
Код 1C v 8.3 &НаСервере
Процедура ВосстановитьНастройки()
КлючОбъекта = "ЗагрузкаИЗPDF_All4CF.ru" ;
КлючНастроек = "ЗагрузкаИЗPDF_All4CF.ru" ;
ОписаниеНастроек = "ЗагрузкаИЗPDF_All4CF.ru" ;
ИмяПользователя = "" ;
ЗначениеНастроек = ХранилищеОбщихНастроек. Загрузить( КлючОбъекта, КлючНастроек, ОписаниеНастроек, ИмяПользователя) ;
Если ТипЗнч( ЗначениеНастроек) = Тип( "Соответствие" ) Тогда
Объект. Склад = ЗначениеНастроек. Получить( "Склад" ) ;
Объект. Организация = ЗначениеНастроек. Получить( "Организация" ) ;
Объект. ПутьКPDF2TXT = ЗначениеНастроек. Получить( "ПутьКPDF2TXT" ) ;
Объект. ПутьКPDF = ЗначениеНастроек. Получить( "ПутьКPDF" ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ВосстановитьНастройки( ) ;
КонецПроцедуры
&НаСервере
Процедура СохранитьНастройки()
КлючОбъекта = "ЗагрузкаИЗPDF_All4CF.ru" ;
КлючНастроек = "ЗагрузкаИЗPDF_All4CF.ru" ;
ОписаниеНастроек = "ЗагрузкаИЗPDF_All4CF.ru" ;
ИмяПользователя = "" ;
Настройки = Новый Соответствие;
Настройки. Вставить( "ПутьКPDF2TXT" , Объект. ПутьКPDF2TXT) ;
Настройки. Вставить( "ПутьКPDF" , Объект. ПутьКPDF) ;
Настройки. Вставить( "Склад" , Объект. Склад) ;
Настройки. Вставить( "Организация" , Объект. Организация) ;
ХранилищеОбщихНастроек. Сохранить( КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек, ИмяПользователя) ;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СохранитьНастройки( ) ;
КонецПроцедуры
Открыв обработку и заполним поля закрываем ее, при следующем открытии все поля заполнены из сохраненных настроек:
Категория:
Работа с Формой (Диалог) и её элементами Синтаксический анализ JSON - выражения средствами 1С 7.7 Код 1C v 7.x
Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш;
Перем Цифры1 _9, Цифры0 _9, ПервыеСимволыКонстант, ОдносимвольныеЛексемы;
Перем НомЛексемы, ТекЛексема;
Перем JSON_Error;
Перем В_Массив, В_Объект, В_Значение;
Перем НомерСимвола;
Перем ФлагОшибки;
Перем СписокСтроковыхКонстант;
Перем СтекЛексем;
Перем АнализируемаяСтрока;
Перем ТекКаталог, ТекФайл;
Функция ПолучитьОбъект_ТЗ() Далее
Функция ПолучитьМассив_ТЗ() Далее
Функция ТекущиеСимволы(Сколько)
Возврат Сред( АнализируемаяСтрока, НомерСимвола, Сколько) ;
КонецФункции
Функция ПрошлыйСимвол(Сдвиг)
Возврат Сред( АнализируемаяСтрока, НомерСимвола - Сдвиг, 1 ) ;
КонецФункции
Процедура ДобавитьЛексему(Лексема, Значение, Сдвиг)
СтекЛексем. НоваяСтрока( ) ;
СтекЛексем. Лексема = Лексема;
СтекЛексем. Значение = Значение;
НомерСимвола = НомерСимвола + Сдвиг;
КонецПроцедуры
Процедура ОбвестиОбласть(Обл)
Обл. РамкаСнизу( 1 ) ;
Обл. РамкаСверху( 1 ) ;
Обл. РамкаСлева( 1 ) ;
Обл. РамкаСправа( 1 ) ;
КонецПроцедуры
Процедура НапечататьТЗ(Таб, ТЗ, НомС, НомК)
Перем Тип, Обл1 , НС, КС, Ключ, Зн, Обл2 ;
Тип = ТЗ. ПолучитьЗначение( 1 , 1 ) ;
НомС = НомС + 1 ;
Обл1 = Таб. Область( НомС, НомК) ;
ОбвестиОбласть( Обл1 ) ;
Если Тип = В_Значение Тогда
ТипЗн = ТЗ. ПолучитьЗначение( 2 , 1 ) ;
Обл1 . Текст = ТЗ. ПолучитьЗначение( 2 , 2 ) ;
Обл1 . ГоризонтальноеПоложение( 1 ) ;
Если ТипЗн = Л_Число Тогда
Обл1 . ГоризонтальноеПоложение( 2 ) ;
ИначеЕсли ТипЗн = Л_Константа Тогда
Обл1 . Полужирный( 1 ) ;
ИначеЕсли ТипЗн = Л_Строка Тогда
Обл1 . Контроль( 4 ) ;
КонецЕсли ;
Возврат ;
ИначеЕсли ( Тип = В_Объект) Или ( Тип = В_Массив) Тогда
Обл1 . Текст = Тип;
Обл1 . Полужирный( 1 ) ;
Обл1 . ЦветФона( 12648447 ) ;
Обл1 . РамкаСнизу( 5 ) ;
КС = ТЗ. КоличествоСтрок( ) ;
Для НС = 2 По КС Цикл
НомС = НомС + 1 ;
Обл2 = Таб. Область( НомС, НомК) ;
Обл2 . Текст = ТЗ. ПолучитьЗначение( НС, 1 ) ;
Если Тип = В_Массив Тогда
Обл2 . ГоризонтальноеПоложение( 2 ) ;
КонецЕсли ;
ОбвестиОбласть( Обл2 ) ;
НомС = НомС - 1 ;
НапечататьТЗ( Таб, ТЗ. ПолучитьЗначение( НС, 2 ) , НомС, НомК + 1 ) ;
КонецЦикла ;
Иначе
Сообщить( "Фигня " + Тип, "!" ) ;
КонецЕсли ;
КонецПроцедуры
Процедура ВыравнятьТЗ(Таб, ОграничениеШирины)
Перем НомерКол, НомерСтр, МаксШирина, Обл, ТекШирина, ТекДлина;
Для НомерКол = 1 По Таб. ШиринаТаблицы( ) Цикл
МаксШирина = 0 ;
Для НомерСтр = 1 По Таб. ВысотаТаблицы( ) Цикл
Обл = Таб. Область( НомерСтр, НомерКол) ;
ТекШирина = Обл. ШиринаСтолбца( ) ;
ТекДлина = СтрДлина( СокрЛП( Обл. Текст) ) ;
МаксШирина = Макс( МаксШирина, ТекШирина, ТекДлина) ;
КонецЦикла ;
Таб. Область( , НомерКол) . ШиринаСтолбца( Мин( МаксШирина, ОграничениеШирины) ) ;
КонецЦикла ;
КонецПроцедуры
Процедура Напечатать_ТЗ(ТЗ)
Перем Таб, НС, НК, МаксШирина, ТекДлина, Обл;
Таб = СоздатьОбъект( "Таблица" ) ;
МаксНК = 1 ;
НС = 0 ;
НК = 1 ;
НапечататьТЗ( Таб, ТЗ, НС, НК) ;
ВыравнятьТЗ( Таб, 30 ) ;
Таб. Область( 1 , 1 , Таб. ВысотаТаблицы( ) , Таб. ШиринаТаблицы( ) ) . ВертикальноеПоложение( 2 ) ;
Таб. Опции( 0 , 0 ) ;
Таб. Показать( "JSON" ) ;
КонецПроцедуры
Функция Ошибка()
ФлагОшибки = 1 ;
Возврат 0 ;
КонецФункции
Функция ЧитатьКонстанту(ПервСимвол)
Перем КонстантаСтр, ДлинаКонстанты;
КонстантаСтр = СписокСтроковыхКонстант. Получить( ПервСимвол) ;
ДлинаКонстанты = СтрДлина( КонстантаСтр) ;
Если ТекущиеСимволы( ДлинаКонстанты) = КонстантаСтр Тогда
ДобавитьЛексему( Л_Константа, КонстантаСтр, ДлинаКонстанты) ;
Возврат 1 ;
Иначе
Возврат Ошибка( ) ;
КонецЕсли ;
КонецФункции
Процедура ДописатьСимвол(Стр)
Стр = Стр + ТекущиеСимволы( 1 ) ;
НомерСимвола = НомерСимвола + 1 ;
КонецПроцедуры
Функция ЧитатьЧисло()
Перем ЧислоСтр;
ЧислоСтр = "" ;
Если ТекущиеСимволы( 1 ) = "-" Тогда
ДописатьСимвол( ЧислоСтр) ;
КонецЕсли ;
Если Найти( Цифры1 _9, ТекущиеСимволы( 1 ) ) > 0 Тогда
ДописатьСимвол( ЧислоСтр) ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
ИначеЕсли ТекущиеСимволы( 1 ) = "0" Тогда
ДописатьСимвол( ЧислоСтр) ;
Иначе
Возврат Ошибка( ) ;
КонецЕсли ;
Если ТекущиеСимволы( 1 ) = "." Тогда
ДописатьСимвол( ЧислоСтр) ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
КонецЕсли ;
Если ВРег( ТекущиеСимволы( 1 ) ) = "E" Тогда
ДописатьСимвол( ЧислоСтр) ;
Если Найти( "+-" , ТекущиеСимволы( 1 ) ) > 0 Тогда
ДописатьСимвол( ЧислоСтр) ;
КонецЕсли ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
КонецЕсли ;
ДобавитьЛексему( Л_Число, ЧислоСтр, 0 ) ;
Возврат 1 ;
КонецФункции
Функция ЧитатьСтроку()
Перем СтрокаСтр;
СтрокаСтр = "" ;
НомерСимвола = НомерСимвола + 1 ;
Пока ( ТекущиеСимволы( 1 ) < > Л_Кавычка) Или ( ( ТекущиеСимволы( 1 ) = Л_Кавычка) И ( ПрошлыйСимвол( 1 ) = Л_Экран) И ( ПрошлыйСимвол( 2 ) < > Л_Экран) ) Цикл
ДописатьСимвол( СтрокаСтр) ;
КонецЦикла ;
ДобавитьЛексему( Л_Строка, СтрокаСтр, 1 ) ;
Возврат 1 ;
КонецФункции
Функция ПрочитатьФайл(ИмяФайла)
Перем Т, НомерСтрокиФайла, СтрокаРез;
Т = СоздатьОбъект( "Текст" ) ;
Т. Открыть( ИмяФайла) ;
СтрокаРез = "" ;
Для НомерСтрокиФайла = 1 По Т. КоличествоСтрок( ) Цикл
СтрокаРез = СтрокаРез + Т. ПолучитьСтроку( НомерСтрокиФайла) ;
КонецЦикла ;
Возврат СтрокаРез;
КонецФункции
Функция СледующаяЛексема()
НомЛексемы = НомЛексемы + 1 ;
СтекЛексем. ПолучитьСтрокуПоНомеру( НомЛексемы) ;
ТекЛексема = СтекЛексем. Лексема;
Возврат 1 ;
КонецФункции
Функция ОшибкаЛексемы()
Перем РезСтр, НомСтр, ТЛ, ТС;
Сообщить( "Ошибочная лексема № " + НомЛексемы + " : <" + ТекЛексема + ">" , "!" ) ;
РезСтр = "" ;
Для НомСтр = НомЛексемы + 1 По СтекЛексем. КоличествоСтрок( ) Цикл
СтекЛексем. ПолучитьСтрокуПоНомеру( НомСтр) ;
ТЛ = СтекЛексем. Лексема;
Если ТЛ = Л_Строка Тогда
ТС = "<" + ТЛ + "(" + СтекЛексем. Значение + ")>" ;
ИначеЕсли ТЛ = Л_Константа Тогда
ТС = "<" + ТЛ + "(" + СтекЛексем. Значение + ")>" ;
Иначе
ТС = "<" + ТЛ + ">" ;
КонецЕсли ;
РезСтр = РезСтр + ТС + "," ;
КонецЦикла ;
Сообщить( Лев( РезСтр, 400 ) , "!" ) ;
Возврат 0 ;
КонецФункции
Процедура ДобавитьПару(ТЗ, Ключ, Значение)
ТЗ. НоваяСтрока( ) ;
ТЗ. Ключ = Ключ;
ТЗ. Значение = Значение;
КонецПроцедуры
Функция НоваяТЗ(Тип)
Перем _ТЗ;
_ТЗ = СоздатьОбъект( "ТаблицаЗначений" ) ;
_ТЗ. НоваяКолонка( "Ключ" ) ;
_ТЗ. НоваяКолонка( "Значение" ) ;
ДобавитьПару( _ТЗ, Тип, "" ) ;
Возврат _ТЗ;
КонецФункции
Функция ПолучитьПроизвольноеЗначение_ТЗ()
Перем ТЗ;
Если ( ТекЛексема = Л_Строка) Или ( ТекЛексема = Л_Число) Или ( ТекЛексема = Л_Константа) Тогда
ТЗ = НоваяТЗ( В_Значение) ;
ДобавитьПару( ТЗ, ТекЛексема, СтекЛексем. Значение) ;
СледующаяЛексема( ) ;
Возврат ТЗ;
ИначеЕсли ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Возврат ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Возврат ПолучитьМассив_ТЗ( ) ;
КонецЕсли ;
Возврат ОшибкаЛексемы( ) ;
КонецФункции
Функция ДобавитьКлючЗначение(ТЗ)
Перем НовКлюч, НовЗначение;
Если ТекЛексема < > Л_Строка Тогда
Возврат 0 ;
КонецЕсли ;
НовКлюч = СтекЛексем. Значение;
СледующаяЛексема( ) ;
Если ТекЛексема < > Л_Двоеточие Тогда
Возврат ОшибкаЛексемы( ) ;
КонецЕсли ;
СледующаяЛексема( ) ;
НовЗначение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если НовЗначение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
ДобавитьПару( ТЗ, НовКлюч, НовЗначение) ;
Возврат 1 ;
КонецФункции
Функция ПолучитьОбъект_ТЗ()
Перем ТЗ;
ТЗ = НоваяТЗ( В_Объект) ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Если ДобавитьКлючЗначение( ТЗ) = 0 Тогда
Возврат 0 ;
КонецЕсли ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
Если ДобавитьКлючЗначение( ТЗ) = 0 Тогда
Возврат 0 ;
КонецЕсли ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПолучитьМассив_ТЗ()
Перем ТЗ, _Ключ, _Значение;
ТЗ = НоваяТЗ( В_Массив) ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = 0 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = _Ключ + 1 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПрочитатьОбъект_ТЗ()
Перем Рез;
НомЛексемы = 0 ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Рез = ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Рез = ПолучитьМассив_ТЗ( ) ;
Иначе
Рез = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
КонецЕсли ;
Если ( Рез = 0 ) Или ( ТекЛексема < > Л_Финиш) Тогда
ОшибкаЛексемы( ) ;
Возврат 0 ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция СгенерироватьТЗ(НачАнализируемаяСтрока)
Перем НачальныйСимвол, Рез;
АнализируемаяСтрока = НачАнализируемаяСтрока;
СтекЛексем = СоздатьОбъект( "ТаблицаЗначений" ) ;
СтекЛексем. НоваяКолонка( "Лексема" , "Строка" ) ;
СтекЛексем. НоваяКолонка( "Значение" , "Строка" ) ;
ФлагОшибки = 0 ;
НомерСимвола = 1 ;
Пока НомерСимвола < = СтрДлина( АнализируемаяСтрока) Цикл
НачальныйСимвол = ТекущиеСимволы( 1 ) ;
Если Найти( " " + Симв( 9 ) , НачальныйСимвол) > 0 Тогда
НомерСимвола = НомерСимвола + 1 ;
ИначеЕсли НачальныйСимвол = Л_Кавычка Тогда
ЧитатьСтроку( ) ;
ИначеЕсли Найти( ОдносимвольныеЛексемы, НачальныйСимвол) > 0 Тогда
ДобавитьЛексему( НачальныйСимвол, "" , 1 ) ;
ИначеЕсли Найти( ПервыеСимволыКонстант, НачальныйСимвол) > 0 Тогда
Если ЧитатьКонстанту( НачальныйСимвол) = 0 Тогда
Прервать;
КонецЕсли ;
ИначеЕсли Найти( "-" + Цифры0 _9, НачальныйСимвол) > 0 Тогда
Если ЧитатьЧисло( ) = 0 Тогда
Прервать;
КонецЕсли ;
Иначе
Сообщить( "========= " + НомерСимвола, "!" ) ;
Сообщить( НачальныйСимвол, "!" ) ;
Сообщить( "<" + НачальныйСимвол + "> " + КодСимв( НачальныйСимвол) , "!" ) ;
Сообщить( ТекущиеСимволы( 100 ) , "!" ) ;
Возврат 0 ;
КонецЕсли ;
КонецЦикла ;
Если ФлагОшибки < > 0 Тогда
Сообщить( "Ошибка парсинга JSON - выражения" , "!" ) ;
Возврат 0 ;
ИначеЕсли СтекЛексем. КоличествоСтрок( ) = 0 Тогда
Сообщить( "Пустой стек" , "!" ) ;
Возврат 0 ;
КонецЕсли ;
ДобавитьЛексему( Л_Финиш, "" , 0 ) ;
Возврат ПрочитатьОбъект_ТЗ( ) ;
КонецФункции
Функция JSON_Error(Стр = "" )
Если Стр < > "" Тогда
Сообщить( "JSON-ОШИБКА: " + Стр, "!" ) ;
КонецЕсли ;
Возврат JSON_Error;
КонецФункции
Функция JSON_Type(Парам)
Если ТипЗначенияСтр( Парам) < > "ТаблицаЗначений" Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Парам. КоличествоКолонок( ) < > 2 Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Парам. КоличествоСтрок( ) < 2 Тогда
Возврат JSON_Error( ) ;
КонецЕсли ;
Возврат Парам. ПолучитьЗначение( 1 , 1 ) ;
КонецФункции
Функция JSON_GetValue(Парам, Keys)
Перем Тип, До, После, ПозЗакр, Л1 , П2 , Инд, ИндСтр, НС, КвоСтрок;
Тип = JSON_Type( Парам) ;
ПозЗакр = Найти( Keys, "]" ) ;
Если ПозЗакр = 0 Тогда
ПозЗакр = СтрДлина( Keys) + 1 ;
КонецЕсли ;
До = Лев( Keys, ПозЗакр) ;
После = Сред( Keys, ПозЗакр + 1 ) ;
Л1 = Лев( До, 1 ) ;
П2 = Найти( До, "]" ) ;
Если Тип = JSON_Error Тогда
Возврат JSON_Error( "Параметра" ) ;
КонецЕсли ;
КвоСтрок = Парам. КоличествоСтрок( ) ;
Если До = "" Тогда
Если ( Тип = В_Массив) Или ( Тип = В_Объект) Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Тип = В_Значение Тогда
Возврат Парам. ПолучитьЗначение( 2 , 2 ) ;
Иначе
Возврат JSON_Error( "№ 1" ) ;
КонецЕсли ;
ИначеЕсли До = ".length" Тогда
Если ( Тип = В_Массив) Или ( Тип = В_Объект) Тогда
Возврат Парам. КоличествоСтрок( ) - 1 ;
Иначе
Возврат JSON_Error( "Длина скаляра" ) ;
КонецЕсли ;
ИначеЕсли Л1 = "[" Тогда
Если П2 = 0 Тогда
Возврат JSON_Error( "Индексация: <" + До + ">" ) ;
КонецЕсли ;
Инд = Сред( До, 2 , П2 - 2 ) ;
Если ( Найти( "'"" " , Лев( Инд, 1 ) ) > 0 ) И ( Найти( "'"" " , Прав( Инд, 1 ) ) > 0 ) Тогда
ИндСтр = Сред( Инд, 2 , СтрДлина( Инд) - 2 ) ;
Если Тип < > В_Объект Тогда
Возврат JSON_Error( "Строковый индекс <" + ИндСтр + "> только для Объекта" ) ;
КонецЕсли ;
НС = 0 ;
Если Парам. НайтиЗначение( ИндСтр, НС, 1 ) = 1 Тогда
Возврат JSON_GetValue( Парам. ПолучитьЗначение( НС, 2 ) , После) ;
КонецЕсли ;
Возврат JSON_Error( "Нет индекса <" + ИндСтр + ">" ) ;
КонецЕсли ;
ИндЧис = 0 + Инд;
Если "" + ИндЧис < > Инд Тогда
Возврат JSON_Error( "Ошибка 1 числового индекса <" + Инд + ">" ) ;
ИначеЕсли Цел( ИндЧис) < > ИндЧис Тогда
Возврат JSON_Error( "Ошибка 2 числового индекса <" + Инд + "> (нецелый)" ) ;
ИначеЕсли ИндЧис < 0 Тогда
Возврат JSON_Error( "Ошибка 3 числового индекса <" + Инд + "> (отрицательный)" ) ;
ИначеЕсли ИндЧис > ( КвоСтрок - 2 ) Тогда
Возврат JSON_Error( "Ошибка 4 числового индекса <" + Инд + "> (" + ИндЧис + ">" + ( КвоСтрок - 2 ) + ")" ) ;
КонецЕсли ;
Возврат JSON_GetValue( Парам. ПолучитьЗначение( ИндЧис + 1 , 2 ) , После) ;
Иначе
Возврат JSON_Error( "Ошибка 5 <" + До + ">" ) ;
КонецЕсли ;
КонецФункции
Процедура ПриОткрытии()
Перем Рез1 , ТипУзла1 , Зн1 , Значение;
ОчиститьОкноСообщений( ) ;
СтатусВозврата( 0 ) ;
Рез1 = СгенерироватьТЗ( ПрочитатьФайл( ТекКаталог + "j1.json" ) ) ;
Напечатать_ТЗ( Рез1 ) ;
ТипУзла1 = JSON_Type( Рез1 ) ;
Сообщить( "Тип узла: " + ТипУзла1 ) ;
Зн1 = JSON_GetValue( Рез1 , ".length" ) ; Сообщить( "1) Размер: " + Зн1 ) ;
Зн3 = JSON_GetValue( Рез1 , "['1']" ) ; Сообщить( "3) ['1']: <" + Зн3 + ">" ) ;
Зн4 = JSON_GetValue( Рез1 , "[1]" ) ; Сообщить( "4) [1]: <" + Зн4 + ">" ) ;
Зн5 = JSON_GetValue( Рез1 , "['Массив'][6]" ) ; Сообщить( "5) [*]: <" + Зн5 + ">" ) ;
Зн6 = JSON_GetValue( Рез1 , "['Соответствие']['ДопустимоеИмяСвойства']" ) ; Сообщить( "6) [*]: <" + Зн6 + ">" ) ;
КонецПроцедуры
Процедура ДобавитьСтроковуюКонстанту(КонстантаСтр)
Перем ПервыйСимвол;
ПервыйСимвол = Лев( КонстантаСтр, 1 ) ;
ПервыеСимволыКонстант = ПервыеСимволыКонстант + ПервыйСимвол;
СписокСтроковыхКонстант. Установить( ПервыйСимвол, КонстантаСтр) ;
КонецПроцедуры
РасположениеФайла( ТекКаталог, ТекФайл) ;
Л_Лев_Фиг_Скобка = "{" ;
Л_Прав_Фиг_Скобка = "}" ;
Л_Лев_Кв_Скобка = "[" ;
Л_Прав_Кв_Скобка = "]" ;
Л_Двоеточие = ":" ;
Л_Запятая = "," ;
Л_Экран = "\" ;
Л_Кавычка = """ " ;
Л_Финиш = "" ;
Л_Число = "number" ;
Л_Строка = "string" ;
Л_Константа = "const" ;
ОдносимвольныеЛексемы = Л_Лев_Фиг_Скобка + Л_Прав_Фиг_Скобка + Л_Лев_Кв_Скобка + Л_Прав_Кв_Скобка + Л_Двоеточие + Л_Запятая;
Цифры1 _9 = "123456789" ;
Цифры0 _9 = "0" + Цифры1 _9;
В_Массив = "###array" ;
В_Объект = "###object" ;
В_Значение = "###value" ;
СписокСтроковыхКонстант = СоздатьОбъект( "СписокЗначений" ) ;
ПервыеСимволыКонстант = "" ;
ДобавитьСтроковуюКонстанту( "null" ) ;
ДобавитьСтроковуюКонстанту( "false" ) ;
ДобавитьСтроковуюКонстанту( "true" ) ;
JSON_Error = "ERROR" ;
В качестве примера взят файл j1.json :
{
"999": 88,
"Null": null,
"Сэкраном": "\"",
"Ложь": false,
"ОдинСимв": "1",
"1": "11111",
"Пустышка": "",
"Истина": true,
"Число (плавающая точка)": 1.001e-2,
"Число (плавающая)": -1.001e-2,
"Число (фиксированная точка)": -1000.001,
"Дата": "2011-01-01T12:00:00Z",
"Строка (двойная кавычка)": "Двойная кавычка",
"Строка (одинарная кавычка)": "Одинарная кавычка",
"Маскируемые символы": " \\ \/ \b \t \n \f \r \" ",
"Заковыристая строка": "\\n\\",
"Проблемные символы": "Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f; Юникод символы: \u0421\u0430\u0448\u0430\u0020\u003a\u0029",
"Кириллические символы": "’АБВГҐДЂЃЕ?ЁЄЖЗЅИ?ІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ",
"Идентификатор": "a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
"Пустой массив": [],
"Пустой объект": {},
"Массив": [
null,
false,
true,
1.001e-2,
-1000.001,
"2011-01-01T12:00:00Z",
"Двойная кавычка",
"Одинарная кавычка",
"a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
[
"Первый элемент",
"Второй элемент"
],
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
}
],
"Структура":
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
"Соответствие":
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
},
"Ссылка":
{
"Ссылка": "00000000-0000-0000-0000-000000000000",
"Представление": "Неизвестная ссылка"
},
"COMSafeArray": [
0,
1,
2,
3,
4,
5
]
}
Категория:
HTML, JS, VML Как программно установить отбор в СКД Код 1C v 8.х Процедура ВашРеквизитПриИзменении(Элемент)
СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); //сюда впихнуть нужный вид сравнения
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); // вид сравнения
Если ЗначениеЗаполнено(Кампейны) тогда
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
Иначе
СоответствиеНовогоОтбора.Вставить("Использование",Ложь);
КонецЕсли;
СоответствиеНовогоОтбора.Вставить("Значение",Кампейны);
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
КонецПроцедуры
Процедура ИзменитьОтбор(ЭлементСтруктуры, СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
Иначе
НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных(нПоле);
НовыйЭлементОтбора.ЛевоеЗначение = нПоле;
НовыйЭлементОтбора.Использование = нИспользование;
НовыйЭлементОтбора.ВидСравнения = нВидСравнения;
НовыйЭлементОтбора.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Категория:
Схема Компоновки Данных 1C: Enterprise Development Tools И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С:
«1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений системы программ «1С:Предприятие 8».
Планируется, что он будет использоваться для создания приложений параллельно с текущим инструментом (конфигуратором). При этом формат разрабатываемых приложений будет полностью соответствовать текущим версиям 1С:Предприятия 8. Преимуществами нового инструмента разработки являются: интегрированная среда разработки (соответствие современным тенденциям и требованиям), быстрое развитие инструментов разработки, возможность расширения инструментов разработки. В DT заложена принципиально новая архитектура, которая обеспечивает большой запас развития для реализации различных механизмов автоматизации разработки и повышения удобства разработки. В ознакомительной версии возможности этой архитектуры задействованы только в небольшой части. В данный момент важно реализовать функциональность, аналогичную конфигуратору, но основное предназначение DT в возможности создания новых мощных инструментов для разработчика.
DT разработан с использованием открытой платформы Eclipse (www.eclipse.org). За счет данной интеграции технологий, инструмент объединил в себе преимущества как инструментов разработки «1С:Предприятия», так и стандартных возможностей Eclipse.
Схема работы Конфигуратора
Конфигуратор (входящий в состав системы программ «1С:Предприятие» версии 8.x) работает с конфигурацией, описывающей прикладное решение. Конфигуратор подключается к информационной базе, в которой (во внутреннем формате) хранится конфигурация. В один момент времени конфигуратор может работать только с одной информационной базой, и, как следствие, только с той конфигурацией, которая хранится в этой информационной базе. Более того, для запуска и отладки используется одна версия платформы «1С:Предприятие» – та, с помощью которой выполняется подключение к информационной базе.
Схема работы «1C:Enterprise Development Tools»
DT предлагает принципиально другую схему работы.
Во-первых, конфигурация хранится не в информационной базе, а в файловой системе. Из этого вытекает возможность использования популярной системы контроля версий (git, svn), что, очевидно, является вторым существенным преимуществом. При этом следует понимать, что DT не реализует работу с системой контроля версий самостоятельно, а использует готовые механизмы платформы Eclipse. Поэтому использоваться может только та система контроля версий, поддержка (расширение) которой есть в Eclipse.
Хранение редактируемой конфигурации в файловой системе, а не в информационной базе, означает, что редактирование конфигурации можно выполнять вообще без системы «1С:Предприятие», установленной на компьютере разработчика. Однако, при необходимости запустить прикладное решение или отладить какой-то механизм, наличие установленной версии «1С:Предприятия» является обязательным.
Главные Enterprise Development Tools отличия от обычного Конфигуратора: 1. Платформа Eclipse и возможность написания своих плагинов для удобства работы
2 . Кросплатформенность, т.е наконец-то можно работать на Mac
3. Конфигурация хранится не в информационной базе, а в файловой системе. Из этого вытекает возможность использования популярной системы контроля версий (git, svn)
4. Разрабатываемая конфигурация может использоваться с разными информационными базами и разными версиями «1С:Предприятия»
5. Одновременно можно редактировать несколько конфигураций
6. Работа в DT имеет некоторые отличия в части работы с объектами конфигурации и сохранения результатов работы, т.к. используется платформа Eclipse
7. Более удобная и быстрая командная разработка
Скачиваем и запускаем установку: 1. Сначала платформу 8.3.6
2. потом Enterprise Development Tools
Скачиваем, разархивируем и запускаем DT.exe и получаем ошибку , но это не проблема
Надо установить Java RE, идем на сайт oracle и скачиваем соответствующую вашей операционной системе версию и устанавливаем
иииииии - барабанная дробь вот она, новая среда разработки:
При первом запуске будет запрошен каталог хранения рабочей области. Установка флажка Use this as the default and do not ask again (Использовать это значение по умолчанию в дальнейшем) приведет к тому, что указанный каталог будет автоматически использовать при последующих запусках DT. Для смены рабочей области следует использовать команду File – Switch Workspace (Файл – Сменить рабочую область).
Открылся 1C: Enterprise Development Tools:
Добавление конфигурации Добавить конфигурации можно по разному, можно загрузить из файла, можно из файлов, можно из git, а можно через импорт существующей базы.
В правом нижнем углу отображены Информационные базы, импортируем одну для теста:
Появляется окно
Если что-то не так, то изменяем и жмем Готово (Кстати, если база открыта в обычном конфигураторе, то вылетит ошибка!)
Идет импорт, спросит пользователя и пароль...
На моем Core i5 с 6 ГБ оперативки, импорт тестовой базы размером 2.5 мегабайта шел чуть больше минуты. И вот с открытым справочником Номенклатура:
Форма
Модуль (подсветка синтаксиса попроще)
Мгновенное определение ошибок (наведя курсор):
Щелкнув по красному крестику - предлагает решение, Создать Элемен , хотя надо просто дописать букву т
Слева в разделе Схема отражены все функции модуля, можно быстро перемещаться по ним:
Синтаксис-помощник мгновенно показывает информацию по свойству или функции на которой установлен курсор
Еще один интересный раздел, все огрехи в конфигурации:
Схема компоновки данных из отчета:
Так же мгновенно показывает ошибки и недочеты в запросе!
Конструктор запроса выглядит так:
Открыть Перспективу
Отладка - думаю, понятно и не буду останавливаться
Ресурсы - показывает разложенную по файлам конфигурацию. Каждый файл можно открыть для просмотра:
Синхронизация совместной работы - допустим через Git
Git - Подключение к Git
Справочная система Справка , по сути, как и в обычном конфигураторе, только дополненная, выглядит так:
Использование помощника HelpF.pro Наш помощник пока работает только под Windows, но вскоре мы скомпилируем под Linux и Mac
Открыв код, жмем Alt+H и в появившемся окне вводим запрос (например проверка это новый?) и жмем Найти
В результатах поиска выбираем нужное нам:
Далее в статье (1) выделяем нужный нам код и (2) жмем появившуюся кнопку Вставить
Результат вставки:
Кроме этого работают и горячие клавиши:
Вот пример нажатия Alt+D (Внимание! Alt - правый, левый работает штатно):
Скачать Онлайн помощника 1С
Подведем итоги В целом новая платформа порадовала и удивила. Подождем когда она выйдет из тестовой версии и будут работать все объекты.
И наконец-то Eclipse - свои плагины, Git - нормальное хранение версий и командная работа. В общем - 1С идет в ногу со временем и старается для нас!
Категория:
Enterprise Development Tools Универсальный парсер RSS для 1С На одном проекте - клиент попросил отображать в программе данные, которые выдаю специализированные сайта в формате RSS - Что делать !?
Писать парсер rss для 1С
Первым делом, взглянув на ссылки, подумал что - обычный XML, сейчас его разложу и быстренько загружу в базу, но:
Выяснилось что сайты имеют разные форматы ввода RSS и главное они не валидные(
таким образом, написав небольшой код, который получает ссылку, далее XMLФайл.Прочитать() на одном сайте проходил на ура (этот пример я описывал в статье: Чтение данных с сайта в формате XML и загрузка в 1С ), а вот второй сайт, и третий тоже, при попытке прочитать() выдавали:
{ОбщийМодуль.РегЗадания.Модуль(79)}: Ошибка при вызове метода контекста (Прочитать)
Пока XMLФайл.Прочитать() Цикл
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Extra content at the end of the document
SystemId url rss
решил попробовать на rss других известных сайтов - 80% из проверяемых выдавали ошибку
Пришлось написать прямой построчный парсер RSS: Структура конфигурации
ИсточникиRSS - URL на RSS, ДанныеRSS - сюда записываются загруженные данные новостей
Код получился таким(в принципе код универсальный, но возможно что-то придется подпилить):
Код 1C v 8.3
Процедура ПрочитатьRSS(ИсточникRSS)
url = ИсточникRSS. UrlRSS;
Если Найти( url, ".ru" ) > 0 Тогда urlСервер = Лев( url, Найти( url, ".ru" ) + 2 ) ;
ИначеЕсли Найти( url, ".com" ) > 0 Тогда urlСервер = Лев( url, Найти( url, ".com" ) + 3 ) ;
ИначеЕсли Найти( url, ".org" ) > 0 Тогда urlСервер = Лев( url, Найти( url, ".org" ) + 3 ) ;
ИначеЕсли Найти( url, ".info" ) > 0 Тогда urlСервер = Лев( url, Найти( url, ".info" ) + 4 ) ;
ИначеЕсли Найти( url, ".pro" ) > 0 Тогда urlСервер = Лев( url, Найти( url, ".pro" ) + 3 ) ;
КонецЕсли ;
Если Лев( url, 5 ) = "https" Тогда
ssl = Новый ЗащищенноеСоединениеOpenSSL( неопределено , неопределено ) ;
ТекАдрес = СтрЗаменить( url, urlСервер, "" ) ; Сервер = СтрЗаменить( urlСервер, "https://" , "" ) ;
Соединение = Новый HTTPСоединение( Сервер, , , , ,
5 ,
ssl
) ;
Иначе
ТекАдрес = СтрЗаменить( url, urlСервер, "" ) ; Сервер = СтрЗаменить( urlСервер, "http://" , "" ) ;
Соединение = Новый HTTPСоединение( Сервер) ;
КонецЕсли ;
Заголовки = Новый Соответствие;
Заголовки. Вставить( "host" , Сервер) ;
Запрос = Новый HTTPЗапрос( ТекАдрес, Заголовки) ;
Ответ = Соединение. Получить( Запрос) ;
Если Ответ. КодСостояния = 200 Тогда
Содержимое= Ответ. ПолучитьТелоКакСтроку( ) ;
Содержимое = СтрЗаменить( Содержимое, "<br/>" , "|" ) ;
Содержимое = СтрЗаменить( Содержимое, "<![CDATA[" , "" ) ; Содержимое = СтрЗаменить( Содержимое, "]]>" , "" ) ;
Содержимое = СтрЗаменить( Содержимое, Символы. ПС, "" ) ; Содержимое = СтрЗаменить( Содержимое, Символы. ВК, "" ) ;
Содержимое = СтрЗаменить( Содержимое, Символы. ВТаб, "" ) ; Содержимое = СтрЗаменить( Содержимое, Символы. Таб, "" ) ;
Содержимое = СтрЗаменить( Содержимое, "><" , ">" + Символы. ПС+ "<" ) ;
RegExp = Новый COMОбъект( "VBScript.RegExp" ) ;
RegExp. IgnoreCase = Ложь ;
RegExp. Global = Истина ;
RegExp. MultiLine = Истина ;
RegExp. Pattern = "<[^>]*>" ;
ЭтоЗапись= Ложь ;
Для н= 1 По СтрЧислоСтрок( Содержимое) Цикл
обрТекст= СтрПолучитьСтроку( Содержимое, н) ;
Если обрТекст = "<item>" Тогда
ЗаписьСтр = Новый Структура( ) ; ЭтоЗапись= Истина ; Продолжить;
ИначеЕсли обрТекст = "</item>" Тогда
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ДанныеRSS.Ссылка
|ИЗ
| Справочник.ДанныеRSS КАК ДанныеRSS
|ГДЕ
| ДанныеRSS.ИсточникRSS =ИсточникRSS
| И ДанныеRSS.link ПОДОБНОlink" ;
Запрос. УстановитьПараметр( "link" , "%" + ЗаписьСтр. link+ "%" ) ;
Запрос. УстановитьПараметр( "ИсточникRSS" , ИсточникRSS) ;
РезультатЗапроса = Запрос. Выполнить( ) . Выбрать( ) ;
Если РезультатЗапроса. Следующий( ) Тогда
Иначе
НовЭлем = Справочники. ДанныеRSS. СоздатьЭлемент( ) ;
ЗаполнитьЗначенияСвойств( НовЭлем, ЗаписьСтр) ;
НовЭлем. ИсточникRSS = ИсточникRSS;
НовЭлем. Записать( ) ;
КонецЕсли ;
ЭтоЗапись= Ложь ; Продолжить;
КонецЕсли ;
Если ЭтоЗапись Тогда
Если Найти( обрТекст, "title>" ) > 0 и Найти( обрТекст, "/title>" ) > 0 Тогда
обрТекст = СтрЗаменить( обрТекст, "title" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "<>" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "</>" , "" ) ;
ЗаписьСтр. Вставить( "Наименование" , СокрЛП( обрТекст) ) ;
КонецЕсли ;
Если Найти( обрТекст, "link>" ) > 0 и Найти( обрТекст, "/link>" ) > 0 Тогда
обрТекст = СтрЗаменить( обрТекст, "link" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "<>" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "</>" , "" ) ;
ЗаписьСтр. Вставить( "link" , СокрЛП( обрТекст) ) ;
КонецЕсли ;
Если Найти( обрТекст, "description>" ) > 0 и Найти( обрТекст, "/description>" ) > 0 Тогда
обрТекст = СтрЗаменить( обрТекст, "description" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "<>" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "</>" , "" ) ;
обрТекст= RegExp. Replace( обрТекст, "" ) ;
ЗаписьСтр. Вставить( "desc" , СокрЛП( обрТекст) ) ;
КонецЕсли ;
Если Найти( обрТекст, "pubDate>" ) > 0 и Найти( обрТекст, "/pubDate>" ) > 0 Тогда
обрТекст = СтрЗаменить( обрТекст, "pubDate" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "<>" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "</>" , "" ) ;
ЗаписьСтр. Вставить( "pubDate" , ПреобразоватьRFC822КДате0 ( СокрЛП( обрТекст) ) ) ;
КонецЕсли ;
Если Найти( обрТекст, "enclosure" ) > 0 Тогда
обрТекст = СтрЗаменить( обрТекст, """ " , "" ) ; обрТекст = СтрЗаменить( обрТекст, "<enclosure url=" , "" ) ;
обрТекст = СтрЗаменить( обрТекст, "<enclosure url=" , "" ) ; обрТекст = СтрЗаменить( обрТекст, "type=image/png length=/>" , "" ) ;
ЗаписьСтр. Вставить( "img" , СокрЛП( обрТекст) ) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Процедура ПроверкаRSS() Экспорт
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ИсточникиRSS.Ссылка КАК Ссылка
|ИЗ
| Справочник.ИсточникиRSS КАК ИсточникиRSS
|ГДЕ
| ИсточникиRSS.Использовать
| И ДОБАВИТЬКДАТЕ(ИсточникиRSS.ДатаПоследнегоОбновления, СЕКУНДА, ИсточникиRSS.ПериодОбновленияВСекундах) <ТекДата" ;
Запрос. УстановитьПараметр( "ТекДата" , ТекущаяДата( ) ) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
ПрочитатьRSS( ВыборкаДетальныеЗаписи. Ссылка) ;
ТекОб = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
ТекОб. ДатаПоследнегоОбновления = ТекущаяДата( ) ;
ТекОб. Записать( ) ;
КонецЦикла ;
КонецПроцедуры
Функция ПреобразоватьRFC822КДате0(ДатаВФорматеRFC822) Экспорт
КопияСтроки = ДатаВФорматеRFC822;
СтруктураДаты = Новый Структура( "Год,Месяц,День,Час,Минута,Секунда" , "" , "" , "" , "" , "" , "" ) ;
Месяцы = Новый Структура( "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec" , "01" , "02" , "03" , "04" , "05" , "06" , "07" , "08" , "09" , "10" , "11" , "12" ) ;
Для каждого КлючИЗначение Из Месяцы Цикл
Позиция = Найти( КопияСтроки, КлючИЗначение. Ключ) ;
Если Позиция > 0 Тогда
СтруктураДаты. Месяц = КлючИЗначение. Значение;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Состояние = 0 ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 1 " , ", 01 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 2 " , ", 02 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 3 " , ", 03 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 4 " , ", 04 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 5 " , ", 05 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 6 " , ", 06 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 7 " , ", 07 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 8 " , ", 08 " ) ;
КопияСтроки = СтрЗаменить( КопияСтроки, ", 9 " , ", 09 " ) ;
Для ш= 0 По СтрДлина( КопияСтроки) Цикл
ТекущийСимвол = Сред( КопияСтроки, ш, 1 ) ;
ТекСимволЦифра= ЭтоЦифра( ТекущийСимвол) ;
Если ТекСимволЦифра И Состояние = 0 Тогда
СтруктураДаты. День = СтруктураДаты. День + ТекущийСимвол;
Состояние = 1 ;
ИначеЕсли ТекСимволЦифра И Состояние = 1 Тогда
СтруктураДаты. День = СтруктураДаты. День + ТекущийСимвол;
Состояние = 2 ;
ИначеЕсли ТекСимволЦифра И Состояние = 2 Тогда
СтруктураДаты. Год = СтруктураДаты. Год + ТекущийСимвол;
Состояние = 3 ;
ИначеЕсли ТекСимволЦифра И Состояние = 3 Тогда
СтруктураДаты. Год = СтруктураДаты. Год + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = " " И Состояние = 3 Тогда
Состояние = 4 ;
ИначеЕсли ТекСимволЦифра И Состояние = 4 Тогда
СтруктураДаты. Час = СтруктураДаты. Час + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = ":" И Состояние = 4 Тогда
Состояние = 5 ;
ИначеЕсли ТекСимволЦифра И Состояние = 5 Тогда
СтруктураДаты. Минута = СтруктураДаты. Минута + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = ":" И Состояние = 5 Тогда
Состояние = 6 ;
ИначеЕсли ТекСимволЦифра И Состояние = 6 Тогда
СтруктураДаты. Секунда = СтруктураДаты. Секунда + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = " " И Состояние = 6 Тогда
Прервать ;
КонецЕсли ;
КонецЦикла ;
Попытка
Результат = Дата( СтруктураДаты. Год+ СтруктураДаты. Месяц+ СтруктураДаты. День
+ СтруктураДаты. Час+ СтруктураДаты. Минута+ СтруктураДаты. Секунда) ;
Исключение
Результат = Неопределено ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ЭтоЦифра(Символ) Экспорт
Если ( КодСимвола( Символ) > = 48 ) И ( КодСимвола( Символ) < = 57 ) Тогда Возврат Истина ; Иначе Возврат ложь ; КонецЕсли ;
КонецФункции
Функция ПолучитьСимвол(КопияСтроки, ш)
Возврат Сред( КопияСтроки, ш, 1 ) ;
КонецФункции
Результат загрузки новостей RSS HelpF.pro
Кстати, как позже выяснилось, здесь уже есть статья с примером через IE и DOM: Получения новостей с RSS-канала сайта buh.ru
Категория:
Работа с Интернет, Почтой (Mail), FTP Обмен данными с сайтом используя формат JSON в 1С Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
В платформе с версии 8.3.6: Потоковое чтение и запись JSON:
Объекты потоковой работы - это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
Код 1C v 8.3
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON. ОткрытьФайл( "ИмяФайла" ) ;
Пока ЧтениеJSON. Прочитать( ) Цикл
TипJSON = ЧтениеJSON. ТипТекущегоЗначения;
Если TипJSON = ТипЗначенияJSON. Число ИЛИ TипJSON = ТипЗначенияJSON. Строка ИЛИ TипJSON = ТипЗначенияJSON. Булево ИЛИ TипJSON = ТипЗначенияJSON. Null Тогда
Значение = ЧтениеJSON. ТекущееЗначение;
ИначеЕсли ТипJSON = ТипЗначенияJSON. Комментарий Тогда
Комментарий = ЧтениеJSON. ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON. ИмяСвойства Тогда
ИмяСвойства = ЧтениеJSON. ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON. НачалоМассива ИЛИ TипJSON = ТипЗначенияJSON. КонецМассива ИЛИ TипJSON = ТипЗначенияJSON. НачалоОбъекта ИЛИ TипJSON = ТипЗначенияJSON. КонецОбъекта ИЛИ TипJSON = ТипЗначенияJSON. Ничего Тогда
КонеиЕсли;
КокецЦикла;
ЧтениеJSON. Закрыть( ) ;
ЗаписьJSON. ПроверятьСтруктуру = Ложь ;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( , Символы. Таб) ;
ЗаписьJSON. ОткрытьФайл( "ИмяФайла" , , , ПараметрыЗаписиJSON) ;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( , Символы. Таб) ;
ЗаписьJSON. ОткрытьФайл( "ИмяФайла" , , , ПараметрыЗаписиJSON) ;
ЗаписьJSON. ЗаписатьНачалоОбъекта( ) ;
ЗаписьJSON. ЗаписатьИмяСвойства( "СвойствоТипаМассив" ) ;
ЗаписьJSON. ЗаписатьНачалоМассива( ) ;
ЗаписьJSON. ЗаписатьИмяСвойства( "СвойствоТипаСтрока" ) ;
ЗаписьJSON. ЗаписатьЗначение( "Значение строка" ) ;
ЗаписьJSON. ЗаписатьИмяСвойства( "СвойствоТипаНеопределено" ) ;
ЗаписьJSON. ЗаписатьЗначение( Неопределено ) ;
ЗаписьJSON. ЗаписатьКонецОбъекта( ) ;
Запись JSON. ЗаписатьКонецМассива ( ) ;
ЗаписьJSON. ЗаписатьКонецОбъекта( ) ;
ЗаписьJSON. Закрыть( ) ;
Результат такой записи:
Код 1C v 8.х
{
"СвойствоТипаМассив" : [
"Значение строка" ,
1.2345 E1,
true,
{
"СвойствоТипаСтрока" : "Значение строка" ,
"СвойствоТипаНеопределено" : null
}
]
}
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
Код 1C v 8.3
[
{
"имя" : "Anton" ,
"фамилия" : "Иванов" ,
"возраст" : 25
},
{
"имя" : "Ирина" ,
"фамилия" : "Иванова" ,
"возраст" : 20
}
]
ЧтениеJSON = Новый ЧтениеJSON( ) ;
ЧтениеJSON. ОткрытьФайл( "ИмяФайла" ) ;
Сотрудники = ПрочитатьJSON( ЧтениеJSON) ;
ЧтениеJSON. Закрыть( ) ;
Для каждого Сотрудник из Сотрудники Цикл
ИмяСотрудника = Сотрудник. имя; ФамилияСотрудника = Сотрудник. фамилия; ВозрастСотрудника = Сотрудник. возраст;
КонецЦикла ;
Структура = Новый Структура;
Вставить( "Фамилия" , "Иванов" ) ;
Зставить( "Имя" , "Иван" ) ;
Вставить( "Отчество" , "Иванович" ) ;
Зставить( "Возраст" , 40 ) ;
Зставить( "Женат" , Истина ) ;
Телефоны = Новый Массив;
Телефоны. Добавить( "8-999-999-99-90" ) ;
Телефоны. Добавить( "8-999-999-99-91" ) ;
Структура. Вставить( "Телефоны" , Телефены) ;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON. ОткрытьФайл( "ИмяФайла" , , , Новый ПapaмeтpыЗaпиcиJS0N( , Символы. Таб) ) ;
ЗаписатьJSON( ЗаписьJSON, Структура) ;
ЗаписьJSON. Закрыть( ) ;
{
"Фамилия" : "Иванов" ,
"Имя" : "Иван" ,
"Отчество" : "Иванович" ,
"Возраст" : 40 ,
"Женат" : true,
"Телефоны" : [
"8-999-999-99-90" ,
"8-999-999-99-91"
]
}
Подробнее вы можете посмотреть здесь
В платформе с версии 8.3.7: Полностью автоматизировали работу с JSON и реализовали в платформе третью группу средств. Они позволяют сериализовать в JSON прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация. Конечно же, мы обеспечили и обратную операцию - десериализацию. Зачем это нужно!?
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее здесь
ДО платформы версии 8.3.6, т.е. 8.3.5 и ниже: На HelpF уже есть статья где описан пример: Работа с форматом JSON в 1С но не приведены функции, вот они:
Код 1C v 8.х Функция ПреобразоватьвСистему(Число10,система) Экспорт
Если система > 36 или система < 2 тогда
Сообщить( "Выбранная система исчисления не поддерживается" ) ;
Возврат - 1 ;
КонецЕсли ;
СтрокаЗначений = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
СтрокаСистема = "" ;
Пока Число10 > 0 цикл
РезДеления = Число10 / система;
ЧислоСистема = цел( РезДеления) ;
остатокОтДеления = Число10 - система* ( ЧислоСистема) ;
СтрокаСистема = сред( СтрокаЗначений, остатокОтДеления+ 1 , 1 ) + СтрокаСистема;
Число10 = ? ( ЧислоСистема= 0 , 0 , РезДеления) ;
КонецЦикла ;
Нечётное = стрДлина( СтрокаСистема) - цел( стрДлина( СтрокаСистема) / 2 ) * 2 ;
Если Нечётное тогда
СтрокаСистема = "0" + СтрокаСистема;
КонецЕсли ;
Возврат СтрокаСистема;
КонецФункции
Функция URLEncode(стр) Экспорт
Длина= СтрДлина( Стр) ;
Итог= "" ;
Для Н= 1 По Длина Цикл
Знак= Сред( Стр, Н, 1 ) ;
Код= КодСимвола( Знак) ;
если ( ( Знак> = "a" ) и ( Знак< = "z" ) ) или
( ( Знак> = "A" ) и ( Знак< = "Z" ) ) или
( ( Знак> = "0" ) и ( Знак< = "9" ) ) тогда
Итог= Итог+ Знак;
Иначе
Если ( Код> = КодСимвола( "А" ) ) И ( Код< = КодСимвола( "п" ) ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 208 , 16 ) + "%" + ПреобразоватьвСистему( 144 + Код- КодСимвола( "А" ) , 16 ) ;
ИначеЕсли ( Код> = КодСимвола( "р" ) ) И ( Код< = КодСимвола( "я" ) ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 209 , 16 ) + "%" + ПреобразоватьвСистему( 128 + Код- КодСимвола( "р" ) , 16 ) ;
ИначеЕсли ( Знак= "ё" ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 209 , 16 ) + "%" + ПреобразоватьвСистему( 145 , 16 ) ;
ИначеЕсли ( Знак= "Ё" ) Тогда
Итог= Итог+ "%" + ПреобразоватьвСистему( 208 , 16 ) + "%" + ПреобразоватьвСистему( 129 , 16 ) ;
Иначе
Итог= Итог+ "%" + ПреобразоватьвСистему( Код, 16 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Возврат Итог;
КонецФункции
Функция СформироватьСтрокуJSONИзМассива(Объект)
СтрокаJSON = "[" ;
Для каждого Элемент Из Объект Цикл
Если ТипЗнч( Элемент) = Тип( "Строка" ) Тогда
СтрокаJSON = СтрокаJSON + """ " + Элемент + """ " ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Число" ) Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить( Строка( Элемент) , Символы. НПП, "" ) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Булево" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент, "БЛ=false; БИ=true" ) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Дата" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент - Дата( 1970 , 1 , 1 , 1 , 0 , 0 ) , "ЧГ=0" ) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Массив" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "Структура" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) ;
ИначеЕсли ТипЗнч( Элемент) = Тип( "ТаблицаЗначений" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент) ;
Иначе
СтрокаJSON = СтрокаJSON + """ " + URLEncode( Строка( Элемент) ) + """ " ;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + "," ;
КонецЦикла ;
Если Прав( СтрокаJSON, 1 ) = "," Тогда
СтрокаJSON = Лев( СтрокаJSON, СтрДлина( СтрокаJSON) - 1 ) ;
КонецЕсли ;
Возврат СтрокаJSON + "]" ;
КонецФункции
Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
СтрокаJSON = "{" ;
Для каждого Элемент Из Объект Цикл
Если Элемент. Значение = "" Тогда
Продолжить;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + """ " + Элемент. Ключ + """ " + ":" ;
Если ТипЗнч( Элемент. Значение) = Тип( "Строка" ) Тогда
СтрокаJSON = СтрокаJSON + """ " + Элемент. Значение + """ " ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Число" ) Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить( Строка( Элемент. Значение) , Символы. НПП, "" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Булево" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент. Значение, "БЛ=false; БИ=true" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Дата" ) Тогда
СтрокаJSON = СтрокаJSON + Формат( Элемент. Значение - Дата( 1970 , 1 , 1 , 1 , 0 , 0 ) , "ЧГ=0" ) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Массив" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "Структура" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
ИначеЕсли ТипЗнч( Элемент. Значение) = Тип( "ТаблицаЗначений" ) Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON( Элемент. Значение) ;
Иначе
СтрокаJSON = СтрокаJSON + """ " + URLEncode( Строка( Элемент. Значение) ) + """ " ;
КонецЕсли ;
СтрокаJSON = СтрокаJSON + "," ;
КонецЦикла ;
Если Прав( СтрокаJSON, 1 ) = "," Тогда
СтрокаJSON = Лев( СтрокаJSON, СтрДлина( СтрокаJSON) - 1 ) ;
КонецЕсли ;
Возврат СтрокаJSON + "}" ;
КонецФункции
Функция СформироватьСтрокуJSON(Объект) Экспорт
СтрокаJSON = "" ;
Если ТипЗнч( Объект) = Тип( "Массив" ) Тогда
СтрокаJSON = СформироватьСтрокуJSONИзМассива( Объект) ;
ИначеЕсли ТипЗнч( Объект) = Тип( "Структура" ) Тогда
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Объект) ;
ИначеЕсли ТипЗнч( Объект) = Тип( "ТаблицаЗначений" ) Тогда
СоставСтруктуры = "" ;
Для каждого Колонка Из Объект. Колонки Цикл
СоставСтруктуры = СоставСтруктуры + ? ( ЗначениеЗаполнено( СоставСтруктуры) , "," , "" ) + Колонка. Имя;
КонецЦикла ;
МассивСтрок = Новый Массив;
Для каждого Строка Из Объект Цикл
СтруктураКолонок = Новый Структура( СоставСтруктуры) ;
ЗаполнитьЗначенияСвойств( СтруктураКолонок, Строка) ;
МассивСтрок. Добавить( СтруктураКолонок) ;
КонецЦикла ;
СтрокаJSON = СформироватьСтрокуJSONИзМассива( МассивСтрок) ;
КонецЕсли ;
Возврат СтрокаJSON;
КонецФункции
Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
НомерЗначения = 0 ;
Пока ТекстJSON < > "" Цикл
ПервыйСимвол = Лев( ТекстJSON, 1 ) ;
Если ПервыйСимвол = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Структура" ) ;
Если ТипДанных = "Структура" Тогда
Результат. Вставить( "Значение" + ? ( НомерЗначения = 0 , "" , НомерЗначения) , Значение) ;
НомерЗначения = НомерЗначения + 1 ;
ИначеЕсли ТипДанных = "Массив" Тогда
Результат. Добавить( Значение) ;
КонецЕсли ;
ИначеЕсли ПервыйСимвол = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Массив" ) ;
Если ТипДанных = "Структура" Тогда
Результат. Вставить( "Значение" + ? ( НомерЗначения = 0 , "" , НомерЗначения) , Значение) ;
НомерЗначения = НомерЗначения + 1 ;
Иначе
Результат. Добавить( Значение) ;
КонецЕсли ;
ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
Если Лев( ТекстJSON, 1 ) = "," Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
КонецЕсли ;
Возврат ;
ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
Если Лев( ТекстJSON, 1 ) = "," Тогда
ТекстJSON = СокрЛП( Сред( ТекстJSON, 2 ) ) ;
КонецЕсли ;
Возврат ;
Иначе
Если ТипДанных = "Структура" Тогда
Поз = Найти( ТекстJSON, ":" ) ;
Если Поз = 0 Тогда
Прервать ;
КонецЕсли ;
ИмяЗначения = СокрЛП( Лев( ТекстJSON, Поз- 1 ) ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз+ 1 ) ) ;
Если Лев( ТекстJSON, 1 ) = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Структура" ) ;
ИначеЕсли Лев( ТекстJSON, 1 ) = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( Значение, ТекстJSON, "Массив" ) ;
Иначе
Поз = 0 ;
Для Сч = 1 По СтрДлина( ТекстJSON) Цикл
Символ = Сред( ТекстJSON, Сч, 1 ) ;
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "" ;
Иначе
Значение = Лев( ТекстJSON, Поз- 1 ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз + ? ( Сред( ТекстJSON, Поз, 1 ) = "," , 1 , 0 ) ) ) ;
КонецЕсли ;
Значение = СокрЛП( Значение) ;
КонецЕсли ;
Результат. Вставить( ИмяЗначения, Значение) ;
ИначеЕсли ТипДанных = "Массив" Тогда
Поз = 0 ;
Для Сч = 1 По СтрДлина( ТекстJSON) Цикл
Символ = Сред( ТекстJSON, Сч, 1 ) ;
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "" ;
Иначе
Значение = Лев( ТекстJSON, Поз- 1 ) ;
ТекстJSON = СокрЛП( Сред( ТекстJSON, Поз + ? ( Сред( ТекстJSON, Поз, 1 ) = "," , 1 , 0 ) ) ) ;
КонецЕсли ;
Значение = СокрЛП( Значение) ;
Результат. Добавить( Значение) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
Результат = Новый Структура;
ТекстJSON = СтрЗаменить( ТекстJSON, "\"" " , """ " ) ;
ТекстJSON = СтрЗаменить( ТекстJSON, """ " , "" ) ;
Если Лев( ТекстJSON, 1 ) = "{" Тогда
ЗаполнитьДанныеИзОтветаJSON( Результат, ТекстJSON, "Структура" ) ;
ИначеЕсли Лев( ТекстJSON, 1 ) = "[" Тогда
МассивДанных = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON( МассивДанных, ТекстJSON, "Массив" ) ;
Результат. Вставить( "Значение" , МассивДанных) ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Примеры их использования:
Код 1C v 8.х
Данные = Новый Структура( "server,user,hash" ,
10234 , 3745 , "8263ad83ce" ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Массив;
Данные. Добавить( "Nissan" ) ;
Данные. Добавить( "Ford" ) ;
Данные. Добавить( "Audi" ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Структура;
Данные. Добавить( "server" , 10234 ) ;
Данные. Добавить( "users" , Новый Массив) ;
Данные. Добавить( "hash" , "8263ad83ce" ) ;
Данные. users. Добавить( 3745 ) ;
Данные. users. Добавить( 7462 ) ;
Данные. users. Добавить( 2374 ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Структура;
Данные. Вставить( "server" , 10234 ) ;
Данные. Вставить( "users" , Новый Массив) ;
Данные. users. Добавить( Новый Структура( "id,name" , 3745 , "Jack" ) ) ;
Данные. users. Добавить( Новый Структура( "id,name" , 7246 , "Nick" ) ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
ТаблПользователей = Новый ТаблицаЗначений;
ТаблПользователей. Колонки. Добавить( "id" ) ;
ТаблПользователей. Колонки. Добавить( "name" ) ;
НоваяСтрока = ТаблПользователей. Добавить( ) ;
НоваяСтрока. id = 3276 ;
НоваяСтрока. name = "Jack" ;
НоваяСтрока = ТаблПользователей. Добавить( ) ;
НоваяСтрока. id = 3276 ;
НоваяСтрока. name = "Nick" ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Пишите комменты
Категория:
Работа с Интернет, Почтой (Mail), FTP Как мы писали парсер сайта с ценами для 1С Недавно, мой постоянный клиент решил проводить маркетинговые исследования по изменению цен на товары у конкурентов... и эти данные захотел использовать в 1С в связке с его прайс-листом + куча отчетов с графиками и процентным отклонением от цен основного конкурента
В результате этого, была написана обработка собирающая данные со страниц разных сайтов. Из целей конфиденциальности - сайты раскрывать не буду...
Вид обработки загрузки данных с сайта в 1С
Ниже код загрузки данных со страницы сайта , смысл такой :
в функция передается адрес страницы сайта полученный текст страницы обрабатывается, удаляются теги из полученного текста формируется ТЗ с данными По названию ищется поставщик из вспомогательного справочника Справочники.Pr_Поставщики.НайтиПоНаименованию(, если нет - создается на выходе ТЗ с данными Код 1C v 8.х Функция ПолучитьТаблицуДанных(Строка)
тзДанных = Новый ТаблицаЗначений;
Сервер = "site.ru" ;
Соединение = Новый HTTPСоединение( Сервер) ;
Заголовки = Новый Соответствие;
Заголовки. Вставить( "host" , Сервер) ;
ТекАдрес = СтрЗаменить( Строка. Наименование. УРЛСтраницы, "http://" , "" ) ;
ТекАдрес = СтрЗаменить( ТекАдрес, Сервер, "" ) ;
Запрос = Новый HTTPЗапрос( ТекАдрес, Заголовки) ;
Ответ = Соединение. Получить( Запрос) ;
Если Ответ. КодСостояния = 200 Тогда
Содержимое= Ответ. ПолучитьТелоКакСтроку( ) ;
НачалоБлока = "<table id=" + """ " + "table-price" + """ " + " cellspacing=" + """ " + "0" + """ " + " border=" + """ " + "1" + """ " + " bordercolor=" + """ " + "#dedede" + """ " + " class=" + """ " + "tablesorter" + """ " + " >" ;
КонецБлока = "</table>" ;
ТекстБлока = Сред( Содержимое, Найти( Содержимое, НачалоБлока) + СтрДлина( НачалоБлока) , Найти( Содержимое, КонецБлока) - Найти( Содержимое, НачалоБлока) - СтрДлина( НачалоБлока) ) ;
обрТекст = СтрЗаменить( ТекстБлока, "<tr>" , "" ) ;
обрТекст = СтрЗаменить( обрТекст, "</tr>" , Символы. ПС) ;
обрТекст = СтрЗаменить( обрТекст, " >" , ">" ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</td> <td>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th class=" + """ " + "sortable_header" + """ " + ">" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th >" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th><th>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</td><td>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, " >" , ">" ) ;
RegExp = Новый COMОбъект( "VBScript.RegExp" ) ;
RegExp. IgnoreCase = Ложь ;
RegExp. Global = Истина ;
RegExp. MultiLine = Истина ;
RegExp. Pattern = "<[^>]*>" ;
обрТекст= RegExp. Replace( обрТекст, "" ) ;
Если СокрЛП( обрТекст) = "Ни одной позиции не найдено." Тогда
Сообщить( Строка( Строка. Наименование) + " = Ни одной позиции не найдено! Строка " + Строка. Наименование) ;
Возврат тзДанных;
КонецЕсли ;
Если Найти( обрТекст, "Страница не найдена" ) > 0 Тогда
Сообщить( Строка( ТекАдрес) + " = Страница не найдена, строка " + Строка. Наименование) ;
Возврат тзДанных;
КонецЕсли ;
Для н= 1 По СтрЧислоСтрок( обрТекст) Цикл
СтрТекста= СтрПолучитьСтроку( обрТекст, н) ;
Если Найти( СтрТекста, "Длина Цена" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, "Длина Цена" , "Длина | Цена" ) ;
КонецЕсли ;
Если Найти( СтрТекста, "Марка стали Цена" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, "Марка стали Цена" , "Марка стали | Цена" ) ;
КонецЕсли ;
Если Найти( СтрТекста, ", Поставщик" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, ", Поставщик" , " | Поставщик" ) ;
КонецЕсли ;
мсДанных = ПолучитьМассивИзСтрокиСРазделителем( СтрТекста, "|" , Истина ) ;
Если н= 1 Тогда
Для Каждого ткЗнач из мсДанных Цикл
СтрЗапрещСимволов = " .,<>"" \/-" ;
ИмяКолонки = ткЗнач;
Для сч33 = 1 по СтрДлина( СтрЗапрещСимволов) Цикл
ЗапрещСимв = Сред( СтрЗапрещСимволов, сч33 , 1 ) ;
ИмяКолонки = СтрЗаменить( ИмяКолонки, ЗапрещСимв, "_" ) ;
КонецЦикла ;
Если НРег( ИмяКолонки) = "поставщик" Тогда
Для Сч_дк = ( Строка. Наименование. Родитель. Поставшик - 2 ) по тзДанных. Колонки. Количество( ) Цикл
тзДанных. Колонки. Добавить( "Колонка_" + ( тзДанных. Колонки. Количество( ) + 1 ) ) ;
КонецЦикла ;
КонецЕсли ;
тзДанных. Колонки. Добавить( ИмяКолонки) ;
КонецЦикла ;
тзДанных. Колонки. Добавить( "ном" , , , 7 ) ;
Иначе
НовСтр = тзДанных. Добавить( ) ; нмас= 0 ;
Для Каждого ткЗнач из мсДанных Цикл
НовСтр[нмас] = ткЗнач;
нмас= нмас+ 1 ;
КонецЦикла ;
НовСтр. ном = н;
КонецЕсли ;
КонецЦикла ;
тзДанных. Колонки. Добавить( "ЕстьСоответствие" , Новый ОписаниеТипов( "Булево" ) ) ;
тзДанных. Колонки. Добавить( "СпрPr_Поставщики" , Новый ОписаниеТипов( "СправочникСсылка.Pr_Поставщики" ) ) ;
Для каждого стр из тзДанных Цикл
текПоставщик = Справочники. Pr_Поставщики. НайтиПоНаименованию( стр[Строка. Наименование. родитель. Поставшик- 1 ]) ;
Если текПоставщик = Справочники. Pr_Поставщики. ПустаяСсылка( ) Тогда
НовЭлем = Справочники. Pr_Поставщики. СоздатьЭлемент( ) ;
НовЭлем. Наименование = СокрЛП( стр[Строка. Наименование. родитель. Поставшик- 1 ]) ;
НовЭлем. Записать( ) ;
текПоставщик = НовЭлем. Ссылка;
КонецЕсли ;
стр. СпрPr_Поставщики = текПоставщик;
КонецЦикла ;
Иначе
тзДанных. Колонки. Добавить( "ЕстьСоответствие" , Новый ОписаниеТипов( "Булево" ) ) ;
тзДанных. Колонки. Добавить( "СпрPr_Поставщики" , Новый ОписаниеТипов( "СправочникСсылка.Pr_Поставщики" ) ) ;
Сообщить( "Ошибка получения данных для строки " + Строка. Наименование) ;
КонецЕсли ;
Возврат тзДанных;
КонецФункции
В коде используется вспомогательная функция ПолучитьМассивИзСтрокиСРазделителем
Код 1C v 8.2 УП
Функция ПолучитьМассивИзСтрокиСРазделителем(Знач Стр, Разделитель = "." , ОбрезатьНепечатныеСимволы = Ложь) Экспорт
МассивСтрок = Новый Массив;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
Фрагмент = Стр;
Если ОбрезатьНепечатныеСимволы Тогда
Фрагмент = СокрЛП( Фрагмент) ;
КонецЕсли ;
МассивСтрок. Добавить( Фрагмент) ;
Возврат МассивСтрок;
КонецЕсли ;
Фрагмент = Лев( Стр, Поз- 1 ) ;
Если ОбрезатьНепечатныеСимволы Тогда
Фрагмент = СокрЛП( Фрагмент) ;
КонецЕсли ;
МассивСтрок. Добавить( Фрагмент) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
Возврат МассивСтрок;
КонецФункции
Конечно, перед тем как мы начали это делать - прошерстили интернет и нашли несколько решений , вот они:
Код 1C v 8.х Соединение = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ИмяВременногоФайла= ПолучитьИмяВременногоФайла( "htm" ) ;
Соединение. open( "GET" , "http://mamba.ru/my" , 0 ) ;
Соединение. send( ) ;
ТаймАут = 200 ;
Начало= ТекущаяДата( ) ;
Пока Соединение. readyState < > 4 И ( ТаймАут= 0 ИЛИ ТекущаяДата( ) - Начало< ТаймАут) Цикл
бфДиалоги. ксОбработкаПрерыванияПользователя( ) ;
КонецЦикла ;
обСохранитьДвоичныйБуферВФайл( Соединение. responseBody, ИмяВременногоФайла) ;
Соединение. open( "POST" , "http://mamba.ru/my" ) ;
Соединение. send( "login=xxx&password=&&&" ) ;
Функция обСохранитьДвоичныйБуферВФайл(Буфер, ИмяФайла) Экспорт
Поток = Новый COMОбъект( "ADODB.Stream" ) ;
Поток. Type = 1 ;
Поток. Mode = 3 ;
Поток. Open( ) ;
Поток. Write( Буфер) ;
Поток. SaveToFile( ИмяФайла) ;
Поток. Close( ) ;
КонецФункции
Код 1C v 8.х НТТР = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ИмяФайлаОтвета = КаталогВременныхФайлов( ) + "filename.tmp" ;
НТТР. open( "GET" , "www.google.com" , 0 , , ) ;
НТТР. send( ) ;
StreamTypeEnum = Новый Структура( "adTypeBinary, adTypeText" , 1 , 2 ) ;
ConnectModeEnum = Новый Структура(
"adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
|adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
|adModeUnknown, adModeWrite" , 1 , 3 , 4194304 , 16 , 4 , 8 , 12 , 0 , 2 ) ;
SaveOptionsEnum = Новый Структура( "adSaveCreateNotExist, adSaveCreateOverWrite" , 1 , 2 ) ;
StreamOut = Новый COMОбъект( "ADODB.Stream" ) ;
StreamOut. Type = StreamTypeEnum. adTypeBinary;
StreamOut. Mode = ConnectModeEnum. adModeReadWrite;
StreamOut. Open( ) ;
StreamOut. Write( НТТР. responseBody) ;
StreamOut. SaveToFile( ИмяФайлаОтвета, SaveOptionsEnum. adSaveCreateOverWrite) ;
StreamOut. Close( ) ;
И даже не этом сайте есть статья : Парсер сайта связного на 1С
Нужен парсер сайта в 1С!? - Обращайтесь, контакты в
профиле Категория:
Работа с Интернет, Почтой (Mail), FTP База 1С при запуске уходит в дамп и вылетает В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает.
Как правило, решение одно: Отключить аппаратное ускорение видеокарты
В Windows XP:
Откройте свойства экрана. Это можно сделать через Панель управления, или просто щелкнув правой кнопкой мыши по любому месту рабочего стола, свободному от окон и значков, и выбрав пункт контекстного меню «Свойства». В открывшемся окне настройки дисплея перейдите на закладку «Параметры» и нажмите кнопку «Дополнительно». В открывшемся окне свойств видеокарты перейдите на вкладку «Диагностика». Передвиньте движок «Ускорение» в крайнюю левую позицию («нет») и нажмите «Применить» или «Ок». Аппаратное ускорение отключено. Изменения вступят в силу после перезагрузки системы.
В Windows 7:
Откройте Панель управления (Пуск & Панель управления). Найдите и откройте элемент «Экран». В левой части открывшегося окна щелкните по ссылке «Настройка параметров экрана». В открывшемся окне нажмите на ссылку «Дополнительные параметры». Перейдите на вкладку «Диагностика» и нажмите кнопку «Изменить параметры». В открывшемся окне передвиньте движок в крайнее левое положение («нет») и нажмите «Ок». Если UAC включен, придется подтвердить, что изменения санкционированы пользователем. Аппаратное ускорение отключено. Изменения вступят в силу после перезагрузки системы.
В Windows 7 в некоторых случаях кнопка «Изменить параметры» будет неактивна. В этом случае отключить аппаратное ускорение невозможно, так как видеокарта и ее драйвер не поддерживают манипуляции аппаратным ускорением.
Еще возможные варианты решения
Если антивирус Касперский, то можно попробовать отключить самозащиту и переименовать файлы kloehk.dll и mzvkbd3.dll в папке Касперского. (Ошибка возникала на старых версиях 2011 года, но еще иногда встречается) Проверить соответствие релиза платформы/конфигурации. Попробовать зайти в базу с другой платформы.
Категория:
Системные Ошибки