Циклы в языке 1С, примеры и тест - какой цикл быстрее? Циклы применяются для выполнения каких либо повторяющихся действий, возможные варианты перебора в цикле:
Перебираем строки с помощью цикла Для каждого
Код 1C v 8.3 Для каждого ТекСтрока Из КоллекцияСтрок Цикл
КонецЦикла ;
Перебираем строки с помощью цикла Пока
Код 1C v 8.3 Пока л < КолСтрок Цикл
КонецЦикла ;
Перебираем строки с помощью цикла Для
Код 1C v 8.3 Для л= 0 по КолСтрок Цикл
КонецЦикла
Еще вариант, но советую его использовать только в без выходных ситуациях, Если
Код 1C v 8.3 ~НачалоЦикла:
Если л < > КоличествоИтераций Тогда
Перейти ~НачалоЦикла;
КонецЕсли ;
Примеры циклов Код 1C v 8.2 УП &НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как организовать цикл в 1с 8.3, 8.2
// Для Цикл
Для Счетчик = 1 По 5 Цикл
Сообщить(Счетчик); // 1 2 3 4 5
КонецЦикла;
// Для Каждого Цикл
Дни = Новый Массив();
Дни.Добавить("Понедельник");
Дни.Добавить("Вторник");
Дни.Добавить("Среда");
Для Каждого Элемент Из Дни Цикл
Сообщить(Элемент); // Понедельник Вторник Среда
КонецЦикла;
// Пока Цикл
Счетчик = 0;
Пока Счетчик < Дни.Количество() Цикл
Сообщить(Дни[Счетчик]); // Понедельник Вторник Среда
Счетчик = Счетчик + 1;
КонецЦикла;
/// Как организовать обратный цикл в 1с 8.3, 8.2
Счетчик = Дни.Количество() - 1;
Пока Счетчик >= 0 Цикл
Сообщить(Дни[Счетчик]); // Среда Вторник Понедельник
Счетчик = Счетчик - 1;
КонецЦикла;
/// Как прервать цикл в 1с 8.3, 8.2
Для Счетчик = 1 По 5 Цикл
Если Счетчик > 2 Тогда
Прервать;
КонецЕсли;
Сообщить(Счетчик); // 1 2
КонецЦикла;
/// Как принудительно продолжить цикл в 1с 8.3, 8.2
Для Счетчик = 1 По 5 Цикл
Если Счетчик <> 3 Тогда
Продолжить;
КонецЕсли;
Сообщить(Счетчик); // 3
КонецЦикла;
КонецПроцедуры
А какой цикл работает быстрее? Итак, я нашел пять способов, как можно организовать цикл средствами 1С.
Первый вид цикла, назовем его условно «Для По » выглядит так:
Код 1C v 8.х Для н = 0 по КоличествоИтераций Цикл
КакиеТоДействия( ) ;
КонецЦикла ;
Второй вид «Для Каждого »:
Код 1C v 8.х Для Каждого ЭлементКоллекции из Коллекция Цикл
КакиеТоДействия( ) ;
КонецЦикла ;
Третий «Пока »:
Код 1C v 8.х Пока н < > КоличествоИтераций Цикл
КакиеТоДействия( ) ;
н = н + 1 ;
КонецЦикла ;
Далее вспомнил ассемблерную молодость & цикл «Если »:
Код 1C v 8.х ~НачалоЦикла:
Если н < > КоличествоИтераций Тогда
КакиеТоДействия( ) ;
н = н + 1 ;
Перейти ~НачалоЦикла;
КонецЕсли ;
Ну и напоследок «Рекурсия »
Код 1C v 8.х Процедура РекурсивныйЦикл(н, КоличествоИтераций)
КакиеТоДействия( ) ;
Если н < > КоличествоИтераций Тогда
РекурсивныйЦикл( н+ 1 , КоличествоИтераций) ;
КонецЕсли ;
КонецПроцедуры
Естественно, что относить рекурсию к циклам не совсем корректно, но тем ни менее с её помощью можно добиться похожих результатов. Сразу оговорюсь, что в дальнейшем тестировании рекурсия не участвовала. Во первых все тесты проводились при 1 000 000 итераций, а рекурсия выпадает уже при 2 000. Во вторых скорость рекурсии в десятки раз меньше, чем скорость остальных циклов.
Последнее отступление. Одним из условий было выполнение в цикле каких-либо действий. Во первых пустой цикл используется очень редко. Во вторых цикл «ДляКаждого» используется для какой-либо коллекции, а значит и остальные циклы должны работать с коллекцией, чтобы тестирование проходило в одинаковых условиях.
Ну что ж, поехали. В качестве тела цикла использовалось чтение из заранее заполненного массива.
Код 1C v 8.х ПриемникТестовогоЗначения = ТестовыйМассив. Получить( н) ;
или, при использовании цикла «Для Каждого »
Код 1C v 8.х ПриемникТестовогоЗначения = Элем;
Тестирование проводилось на платформе 8.3.5.1231 для трех видов интерфейса (Обычное приложение, Управляемое приложение и Такси).
Результаты для 8.3.5.1231
Интерфейс ДляПо ДляКаждого Пока Если Обычное приложение 5734,2 4680,4 7235,4 7263,0 Управляемое приложение 5962,4 4882,6 7497,4 7553,6 Такси 5937,2 4854,6 7500,8 7513,0
Числа это время в миллисекундах полученное с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах() , которую я вызывал до цикла и после его завершения. Числа дробные, потому что я использовал среднее арифметическое пяти замеров. Почему я не использовал Замер производительности? У меня не было цели замерить скорость каждой строчки кода, только скорость циклов с одинаковым результатом работы.
Казалось бы и все, но & тестировать так тестировать!
Результаты для 8.2.19.106
Интерфейс ДляПо ДляКаждого Пока Если Обычное приложение 4411,8 3497,2 5432,0 5454,0 Управляемое приложение 4470,8 3584,8 5522,6 5541,0
В среднем платформа 8.2 на 25% быстрее, чем 8.3. Я немножко не ожидал такой разницы и решил провести тест на другой машине. Скажу только, что там 8.2 была быстрее процентов на 20.
Почему? Не знаю, дезасемблировать ядро в мои планы не входило, но в замер производительности я все же заглянул. Оказалось, что сами циклические операции в 8.3 проходят несколько быстрее, чем в 8.2. Но на строке
Код 1C v 8.х ПриемникТестовогоЗначения = ТестовыйМассив. Получить( н) ;
то есть при считывании элемента коллекции в переменную происходит значительное снижение производительность.
Для себя я сделал несколько выводов:
1. Если есть возможность использовать специализированный цикл & «Для Каждого», то лучше использовать его. Кстати, сам по себе он отрабатывает дольше чем другие циклы, но скорость доступа к элементу коллекции у него на много выше.
2. Если заранее знаешь количество итераций & используй «Для По». «Пока» отработает медленнее.
3. Если использовать цикл «Если» & другие программисты тебя явно не поймут.
В статье использованы материалы с хабра и хелпме
Категория:
Встроенные Функции ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст= Неопределено Тогда
Если ТипЗнч( рВетка) < > Тип( "ДеревоЗначений" ) Тогда Возврат КонецЕсли ;
Если ТипЗнч( рПараметры) < > Тип( "Структура" ) Тогда рПараметры= Новый Структура КонецЕсли ;
стрКолонок= ? ( рПараметры. Свойство( "Колонки" ) , рПараметры. Колонки, Неопределено ) ;
Если ТипЗнч( стрКолонок) < > Тип( "Структура" ) Тогда стрКолонок= Новый Структура КонецЕсли ;
рПоказыватьУровни= ? ( рПараметры. Свойство( "ПоказыватьУровни" ) , рПараметры. ПоказыватьУровни, Ложь ) ;
рШагОтступа= ? ( рПараметры. Свойство( "ШагОтступа" ) , рПараметры. ШагОтступа, 2 ) ;
рДеревоДляТеста= рВетка;
рЗапись= Новый ЗаписьXML;
рЗапись. УстановитьСтроку( ) ;
СериализаторXDTO. ЗаписатьXML( рЗапись, рДеревоДляТеста) ;
стро= рЗапись. Закрыть( ) ;
стро= СтрЗаменить( стро, "xmlns=" , "xmlns:myns1C=" ) ;
рЧтение= Новый ЧтениеXML;
рЧтение. УстановитьСтроку( стро) ;
постр= Новый ПостроительDOM;
рДокументДОМ= постр. Прочитать( рЧтение) ;
рВыражение= "/ValueTree/row" ; максКолвоУровней= 1 ;
рРазыменователь= Новый РазыменовательПространствИменDOM( рДокументДОМ) ;
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
рРезультат= рДокументДОМ. ВычислитьВыражениеXPath( рВыражение, рДокументДОМ, рРазыменователь, ТипРезультатаDOMXPath. Любой) ;
Если рРезультат. ПолучитьСледующий( ) = Неопределено Тогда Прервать КонецЕсли ;
рВыражение= рВыражение+ "/row" ;
максКолвоУровней= максКолвоУровней+ 1 ;
КонецЦикла ;
максКолвоУровней= максКолвоУровней- 1 ;
строПробелы= " " ;
строРазделители= "===============================================================================================" ;
строОтступы= "___________________________________________________________________________________________" ;
секШапка1 = "|[_HCS" + Лев( строПробелы, максКолвоУровней* рШагОтступа) + "]|" ;
секГорРазделитель1 = "|" + Лев( строОтступы, максКолвоУровней* рШагОтступа+ 6 ) + "|" ;
рШиринаКолонкиИерархии= СтрДлина( секШапка1 ) - 2 ;
строПолейШапки= "#Поле _HCS
| #Выравнивание Центр" ;
строПолейЗаписи= "" ;
Если рПоказыватьУровни Тогда
секШапка1 = секШапка1 + "[_Level]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, 8 ) + "|" ;
строПолейШапки= строПолейШапки+ "
|#Поле _Level
| #Выравнивание Центр" ;
строПолейЗаписи= "#Поле _Level
| #Выравнивание Центр
| #Забивать Истина" ;
КонецЕсли ;
мИменКолонок= Новый Массив;
Для каждого кол Из рВетка. Колонки Цикл
Если стрКолонок. Количество( ) < > 0 и не стрКолонок. Свойство( кол. Имя) Тогда Продолжить КонецЕсли ;
рДлинаИмениКолонки= СтрДлина( кол. Имя) ;
рНужнаяШирина= Макс( ? ( кол. Ширина< 3 , 10 , кол. Ширина) , рДлинаИмениКолонки) ;
секШапка1 = секШапка1 + "[" + кол. Имя+ Лев( строПробелы, рНужнаяШирина- рДлинаИмениКолонки) + "]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, рНужнаяШирина+ 1 ) + "=|" ;
строПолейШапки= строПолейШапки+ "
|#Поле " + кол. Имя+ "
| #Выравнивание Центр" ;
рОписТипов= кол. ТипЗначения;
Если рОписТипов. Типы( ) . Количество( ) = 1 и рОписТипов. СодержитТип( Тип( "Булево" ) ) Тогда
рВыравнивание= "Центр" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Число" ) ) Тогда
рВыравнивание= "Право" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Строка" ) ) и рОписТипов. КвалификаторыСтроки. Длина= 0 Тогда
рВыравнивание= "ПоШирине" ;
Иначе
рВыравнивание= "Лево" ;
КонецЕсли ;
строПолейЗаписи= строПолейЗаписи+ ? ( ПустаяСтрока( строПолейЗаписи) , "" , Символы. ПС) + "#Поле " + кол. Имя+ "
| #Выравнивание " + рВыравнивание;
Попытка
Если ЗначениеЗаполнено( стрКолонок[кол. Имя]) Тогда
строПолейЗаписи= строПолейЗаписи+ "
| #Формат "" " + СокрЛП( стрКолонок[кол. Имя]) + """ " ;
КонецЕсли ;
Исключение
КонецПопытки ;
мИменКолонок. Добавить( кол. Имя) ;
КонецЦикла ;
секШапка2 = СтрЗаменить( СтрЗаменить( секШапка1 , "[" , "<" ) , "]" , ">" ) ;
секЗапись1 = секШапка1 ; секЗапись2 = секШапка2 ;
секГорРазделитель2 = СтрЗаменить( СтрЗаменить( секГорРазделитель1 , "=" , "-" ) , "|" , "+" ) ;
секГорРазделитель1 = СтрЗаменить( секГорРазделитель1 , "_" , "=" ) ;
секГорРазделитель2 = СтрЗаменить( секГорРазделитель2 , "_" , " " ) ;
тМакет= Новый ТекстовыйДокумент;
тМакет. ДобавитьСтроку( "#Область Шапка" ) ;
тМакет. ДобавитьСтроку( строПолейШапки) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( секШапка1 ) ;
тМакет. ДобавитьСтроку( секШапка2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
тМакет. ДобавитьСтроку( "" ) ;
тМакет. ДобавитьСтроку( "#Область Запись" ) ;
тМакет. ДобавитьСтроку( строПолейЗаписи) ;
тМакет. ДобавитьСтроку( секЗапись1 ) ;
тМакет. ДобавитьСтроку( секЗапись2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель2 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
рПараметры. Вставить( "ИсходныйМакет" , тМакет) ;
рТекст= Новый ТекстовыйДокумент;
сек= тМакет. ПолучитьОбласть( "Шапка" ) ;
сек. Параметры. _HCS= "Иерархия" ;
Для каждого имякол Из мИменКолонок Цикл
кол= рВетка. Колонки[имякол];
сек. Параметры[кол. Имя]= ? ( ПустаяСтрока( кол. Заголовок) , кол. Имя, кол. Заголовок) ;
КонецЦикла ;
рТекст. Вывести( сек) ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , тМакет. ПолучитьОбласть( "Запись" ) ) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "Отступ" , 0 ) ;
пар. Вставить( "ШагОтступа" , рШагОтступа) ;
ВывестиДеревоЗначенийВТекст( рВетка, рТекст, пар) ;
Иначе
мИменКолонок= рПараметры. МассивИмёнКолонок;
рСекция= рПараметры. ТекущаяСекция;
рОтступ= рПараметры. Отступ;
рШиринаКолонкиИерархии= рПараметры. ШиринаКолонкиИерархии;
рПоказыватьУровни= рПараметры. ПоказыватьУровни;
строОтступы= "_________________________________________________________________________________________________________" ;
строПробелы= " " ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , рПараметры. ТекущаяСекция) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "ШагОтступа" , рПараметры. ШагОтступа) ;
пар. Вставить( "Отступ" , рОтступ+ рПараметры. ШагОтступа) ;
Для каждого рПодветка Из рВетка. Строки Цикл
рСекция. Параметры. _HCS= Лев( строПробелы, рОтступ) + "\" + Лев( строОтступы, рШиринаКолонкиИерархии- рОтступ- 1 ) ;
Если рПоказыватьУровни Тогда
рСекция. Параметры. _Level= рПодветка. Уровень( ) ;
КонецЕсли ;
Для каждого имякол Из мИменКолонок Цикл
рСекция. Параметры[имякол]= рПодветка[имякол];
КонецЦикла ;
рТекст. Вывести( рСекция) ;
ВывестиДеревоЗначенийВТекст( рПодветка, рТекст, пар)
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( "ВывестиДеревоЗначенийВТекст, ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
КонецПопытки ;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Деноминация 2016 в 1С Чтобы провести деноминацию в 1С на 1 июля 2016 года, нужно учесть, что желательно учёт вести в двух суммовых измерениях в белорусских рублях старого и нового образца. Однако, даже если Вы решите упростить задачу и проведёте деноминацию в программе вручную или с помощью обработки на 1 июля, то есть деноминируете итоги в соотношении 1:10000 , то получите "кашу" в базе данных. Такие отчёты как ОСВ, акт сверки, карточка счёта, журнал-ордер и все остальные в программе 1С будут воспринимать данную операцию как "логичную". Обороты за период "поплывут", а итоги будут суммировать старые и новые деньги как равнозначные . Поэтому этот вариант исключим сразу.
Пять вариантов решения:
1)Корректный вариант!Разделить базу данных на две. Во второй провести деноминацию 1 июля.
Выполнить доработку форм и метаданных до копеек. Первое полугодие в первой базе оставить как есть. А учёт во втором полугодии, во второй базе, уже начать вести в денежном выражении нового образца. Перед разбиением базы на две, нужно доработать модуль и все метаданные, создать её копию и сделать свёртку обработкой WRAP.ert. Потом, этой же обработкой, в новой базе провести деноминацию - убрать из уже сделанных, во втором квартале, проводок и метаданных "0000". Но есть один недостаток. Разбивая базу на две Вы лишитесь оперативность при получении данных. Теперь, например, для того чтобы построить акт сверки за год по контрагенту - придётся делать это в двух базах! Выбирая этот вариант нужно понимать все нюансы разделения базы на полугодия.
2)Корректный вариант! Проведение деноминации в рабочей базе (без разделения):
Выполнить доработку форм и метаданных до копеек. Создать сторнированные проводоки с учётом коэффициента деноминации 10000 (то есть если на Сч.по Дт.=3.000.000 -> будет сделана проводка Дт. -2.999.700 -> в итоге Сч.Дт=300). Внимание! Нужно иметь ввиду, что отчёты желательно строить в двух экземплярах (до 1 июля и после).
Выполнить доработку форм и метаданных до копеек.
3) Корректный вариант, но очень затратный! Доработать все метаданные 1С для деноминации и провести её на 1 июля 2016 года.
Самый дорогой вариант для предприятия.
В версии 8.2 и 8.3 можно создать дополнительное измерение "сумма в рублях старого образца".
В версии 7.7 на невалютных счетах можно использовать вал.сумму или доп.забалансовый счёт (рубли образца 2009 года).
Плюс ко всему придётся переделать практически все объекты метаданных. Отчеты, справочники, документы, обработки, глобальный(7.7) и общие(8) модули, план счетов, регистры и т.п. Реализовать данный метод смогут лишь крупные предприятия с массивным штатом программистов 1С.
4) Признан некорректным! Продолжить вести учёт в старых денежных единицах.
Совершенно не затратный и для большинства компаний самый оптимальный, так как делать то ничего и не надо. Коротко говоря - оставить всё как есть. В шапке некоторых отчётов, например, акта сверки, для корректности, можно добавить фразу типа этой: "в расчётах используется белорусский рубль образца 2000 года".
5) Признан н екорректным! Разделить базу данных на две. Во второй провести деноминацию 1 января.
"Закрыть" период (первое полугодие) в первой базе, чтобы больше не вносить туда изменения. Во второй базе сделать свёртку обработкой WRAP.ert на 1 января. Незабудьте предварительно создать копию. Соответственно с 1 января 2016г. учёт будет деноминированный. Помните, что вносить изменения (если таковые будут) до 01 июля 2016 придётся вносить в обе информационные базы. В начале 2017 можно будет свернуть и обрезать Вашу рабочую базу на 1 июля. Так у Вас будет две базы: 1-я до 1.07.2016 (без деноминации) и 2-я после 1.07.2016 (с деноминацией).
6) Признан н екорректным! Доработать только отчёты в 1С для деноминации 1 июля 2016 года.
В отчётах, которыми чаще всего пользуются бухгалтера для отправки данных "внешним" контрагентам (акт сверки, деб.задолженность, отчёт по движению ДС и т.п.), выводить дополнительную строку с коэффициентом 1:10000 под суммой с названием "сумма в белорусских рублях образца 2009 года".
Категория:
1С Общие вопросы - Обычные формы Google maps : вывод точек на карту и режим панорамы В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают!
Для клиента нужно было сделать вывод объектов на карту
С возможностью просмотра панорамы:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=8" >
<style type="text/css" >
html { height: 100 % }
body { height: 100 %; margin: 0 px; padding: 0 px }
#map { height: 100 % }
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.9&sensor=false" ></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript" ></script>
<script type="text/javascript" src="http://www.sitedev.by/lab/markerclusterer/markerclusterer.js" ></script>
<script type="text/javascript" >
var latlng;
var markers = [];
var myMap;
var index = 1 ;
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var infoWindow = new google.maps.InfoWindow;
var clusterer, mcOptions;
var trafficLayer = new google.maps.TrafficLayer();
var trafficOn = false ;
var noclick = false ;
var PointArray = [];
var polygons = [];
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
latlng = new google.maps.LatLng(55.75 , 37.62 );
var myOptions = {
zoom: 12 ,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
disableDoubleClickZoom: true ,
panControl: true ,
zoomControl: true ,
mapTypeControl: true ,
scaleControl: true ,
streetViewControl: true ,
overviewMapControl: true
};
myMap = new google.maps.Map(document.getElementById("map" ),
myOptions);
google.maps.event.addListener(myMap,
noclick = true ;
document.getElementById(
document.getElementById(
});
google.maps.event.addListener(myMap,
infoWindow.close();
if (!noclick) {
addMarker(event.latLng);
}else {
noclick = false ;
}
});
mcOptions = {gridSize: 3 , maxZoom: 15 };
clusterer = new MarkerClusterer(myMap, markers, mcOptions);
//отображение кнопки управления трафиком - все спер с примера, только подцепил свою функцию
var trafficControlDiv = document.createElement(
trafficControlDiv.style.padding =
// Set CSS for the control border
var controlUI = document.createElement(
controlUI.style.backgroundColor =
controlUI.style.borderStyle =
controlUI.style.borderWidth =
controlUI.style.cursor =
controlUI.style.textAlign =
controlUI.title =
trafficControlDiv.appendChild(controlUI);
// Set CSS for the control interior
var controlText = document.createElement(
controlText.style.fontFamily =
controlText.style.fontSize =
controlText.style.paddingLeft =
controlText.style.paddingRight =
controlText.innerHTML =
controlUI.appendChild(controlText);
google.maps.event.addDomListener(controlUI,
if (!trafficOn){
trafficOn = true ;
trafficLayer.setMap(myMap);
}else {
trafficOn = false ;
trafficLayer.setMap(null );
}
});
trafficControlDiv.index = 1 ;
myMap.controls[google.maps.ControlPosition.TOP_RIGHT].push(trafficControlDiv);
};
//добавляем маркер и отправляем в массив
function addMarker(location) {
marker = new google.maps.Marker({
position: location,
map: myMap,
title:
});
infoWindow.setContent(marker.title);
infoWindow.open(myMap, marker);
google.maps.event.addListener(marker,
var mark = this;
var latLng = mark.getPosition();
infoWindow.setContent(mark.title);
infoWindow.open(myMap, mark);});
markers.push(marker);
index++;
document.getElementById(
document.getElementById(
}
function calcRoute(options) {
//вытягиваем из массива переданных параметров значения
//и преобразуем их в формат LatLng
var option1 = options[0 ];//начальная точка
var option2 = options[1 ];//промежуточные точки
var option3 = options[2 ];//конечная точка
var start = new google.maps.LatLng(option1[0 ], option1[1 ]); //первый
var end = new google.maps.LatLng(option3[0 ], option3[1 ]); //последний
//получаем транзитные точки
var waypts = [];
if (option2.length > 0 ) {
for (var i = 0 , l = option2.length; i < l; i++) {
temp = option2[i];
Qcoord = new google.maps.LatLng(temp[0 ], temp[1 ])
waypts.push({
location:Qcoord,
stopover:true
});
}
}
//return;
var request = {
origin: start,
destination: end ,
waypoints: waypts,
optimizeWaypoints: true ,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request , function (response , status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setMap(myMap);
directionsDisplay.setDirections(response );
var total = 0 ;
var myroute = response .routes[0 ];
for (i = 0 ; i < myroute.legs.length; i++) {
total += myroute.legs[i].distance.value;
}
total = total / 1000 ;
document.getElementById(
//генерация события для перехвата в 1 С
var evt = document.createEventObject();
document.body.fireEvent(
}else {
alert(status);
}
});
}
function Reset(){
directionsDisplay.setMap(null );
for (var i = 0 ; i < markers.length; i++) {
markers[i].setMap(null );
}
markers = [];
index = 1 ;
//обнуляем кластер маркеров
clusterer.clearMarkers();
for (var i = 0 ; i < polygons.length; i++) {
polygons[i].setMap(null );
}
polygons = [];
PointArray = [];
}
function FindAdres(Adres){
Reset();
var geocoder = new google.maps.Geocoder();
geocoder.geocode( {
if (status == google.maps.GeocoderStatus.OK) {
latlng = results[0 ].geometry.location;
myMap.panTo(latlng);
marker = new google.maps.Marker({
map: myMap,
position: latlng,
animation: google.maps.Animation.BOUNCE,
title:Adres
});
markers.push(marker);
infoWindow.setContent(marker.title);
infoWindow.open(myMap, marker);
} else {
alert("Ничего не найдено: " + status);
}
});
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
latlng = new google.maps.LatLng(CoordX, CoordY);
myMap.panTo(latlng);
var marker = new google.maps.Marker({
map: myMap,
position: latlng,
animation: google.maps.Animation.BOUNCE,
title:Adres
});
markers.push(marker);
infoWindow.setContent(marker.title);
infoWindow.open(myMap, marker);
}
function addToPointArray(CoordX, CoordY, ID, IconT, Text){
var latLng = new google.maps.LatLng(CoordX, CoordY);
var point = new google.maps.Marker({
PointArray.push(point);
}
function drawCluster(){
clusterer.addMarkers(PointArray);
//myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
//создаем массив координат вершин многоугольника
var paths = [];
for (var i = 0 , l = ArrayPoint.length; i < l; i++) {
var temp = ArrayPoint[i];
Qcoord = new google.maps.LatLng(temp[0 ], temp[1 ])
paths.push(Qcoord);
};
// Создаем многоугольник
myPolygon = new google.maps.Polygon({
paths: paths,
strokeColor: color,
strokeOpacity: 0.6 ,
strokeWeight: 5 ,
fillColor: "#0000FF"
});
myPolygon.setMap(myMap);
polygons.push(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById(
document.getElementById(
var WebClientOperation = document.getElementById("WebClientOperation" ).value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0" : // ничего не делаем
var a = 1 ;
default : // запускаем функцию
eval (WebClientOperation);
}
document.getElementById(
}
</script>
</head>
<body onload="initialize()" >
<div id="map" style="width:100%; height:100%" ></div>
<input type="hidden" id="CoordX" name="CoordX" value="0" ></input>
<input type="hidden" id="CoordY" name="CoordY" value="0" ></input>
<input type="hidden" id="RouteInfo" name="RouteInfo" value="" ></input>
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0" ></input>
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();" ></input>
</body>
</html>
Код вывода карты:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов( ) + "Карта.html" ;
Ф = новый Файл( ПутьКФайлу) ;
Если Ф. Существует( ) Тогда
УдалитьФайлы( ПутьКФайлу) ;
КонецЕсли ;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект. ПолучитьМакет( "МакетГугл" ) ;
Т. УстановитьТекст( ТД. ПолучитьТекст( ) ) ;
Т. Записать( ПутьКФайлу) ;
ЭлементыФормы. Эксплорер. Перейти( ПутьКФайлу) ;
КонецПроцедуры
Процедура ОчиститьКарту()
ЭлементыФормы. Эксплорер. Документ. parentWindow. eval( "Reset()" ) ;
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту( ) ;
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
ОчиститьКарту( ) ;
СписокВидов = Новый СписокЗначений;
Для Каждого стр из ВыборВывода Цикл
если стр. пометка тогда СписокВидов. Добавить( стр. наименование) ; КонецЕсли ;
КонецЦикла ;
табАдресов. Очистить( ) ;
табАдресов = получитьтабАдресов( СписокВидов) ;
табУникальныхАдресов = табАдресов. скопировать( ) ;
табУникальныхАдресов. свернуть( "Уник" ) ;
тзДанных = табАдресов. скопировать( ) ;
табАдресов. очистить( ) ;
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура( ) ;
Отбор. Вставить( "Уник" , стр. Уник) ;
Строки = тзДанных. НайтиСтроки( Отбор) ;
НовСтр = табАдресов. добавить( ) ;
НовСтр. уник = стр. уник;
Если Строки. Количество( ) > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр. Адрес = тздстр. Адрес;
НовСтр. КД = тздстр. КД;
НовСтр. КШ = тздстр. КШ;
НовСтр. ВидОбъекта = тздстр. ВидОбъекта;
НовСтр. Наименование= Строка( НовСтр. Наименование) + Строка( тздстр. Наименование) + "; " ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. табАдресов. СоздатьКолонки( ) ;
ВыборМасштаба = "50%" ;
ВыборРегиона = "Москва" ;
ЭлементыФормы. Надпись24 . Заголовок = "Точек: " + Строка( табАдресов. количество( ) ) ;
Кол = табАдресов. Количество( ) ;
Индекс = 0 ;
Для Каждого ТекСтрока Из табАдресов Цикл Индекс = Индекс + 1 ; Если НЕ ЗначениеЗаполнено( ТекСтрока. КД) тогда Продолжить; КонецЕсли ;
Широта = формат( ТекСтрока. КШ, "ЧРД=." ) ;
Долгота = формат( ТекСтрока. КД, "ЧРД=." ) ;
СодержимоеТочки = СокрЛП( ТекСтрока. ВидОбъекта) + ": " + СокрЛП( ТекСтрока. адрес) ;
Попытка
ЭлементыФормы. Эксплорер. Документ. parentWindow. eval( "addToPointArray(" + Широта + "," + Долгота + ", '" + Строка( Индекс) + "', '" + СокрЛП( ТекСтрока. ВидОбъекта. ПутьКИконке) + "', "" " + СодержимоеТочки + """ );" ) ;
Исключение
Сообщить( "addToPointArray(" + Широта + "," + Долгота + ", '" + Строка( Индекс) + "', '" + СокрЛП( ТекСтрока. ВидОбъекта. ПутьКИконке) + "', "" " + СодержимоеТочки + """ );" , СтатусСообщения. Внимание) ;
КонецПопытки ;
Состояние( "Вывожу на карту " + Индекс + " из " + кол) ;
КонецЦикла ;
ЭлементыФормы. Эксплорер. Документ. parentWindow. eval( "drawCluster();" ) ;
КонецПроцедуры
Вырванная из конфигурации обработка GMaps.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Яндекс карта : вывод точек на карту Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Примеры. Геокодирование.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkFAAAAf7jmJwMAHGZHrcLKDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript" ></script>
<script type="text/javascript" >
var router;
var myPoints = new Array ();
var myRouts = new Array ();
var strOpen = "OPEN" ;
var strKontr = "Kontragent" ;
var t = new YMaps.Template(
YMaps.Templates.add("my#template" , t);
var KopdinatShirota = 0 ;
var KopdinatDolgota = 0 ;
var UID_Zakaza = "" ;
/*vstavkaStiley;
var map, geoResult;
YMaps.jQuery(function () {
map = new YMaps.Map(YMaps.jQuery("#YMapsID" )[0 ]);
map.setCenter(new YMaps.GeoPoint(37.62 , 55.75 ), 12 );
});
function showAddress (value, contrag, Styles, UID) {
var geocoder = new YMaps.Geocoder(value, {results: 1 , boundedBy: map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get (0 );
var point = new YMaps.GeoPoint(geoResult._point.__lng, geoResult._point.__lat);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}else {
}
});
YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error ) {
alert("Произошла ошибка: " + error );
return null ;
})
}
function showAddressCoord (shirota, dolgota, contrag, Styles, UID) {
var point = new YMaps.GeoPoint(dolgota, shirota);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}
function removeAllOverlays (map) {
map.removeAllOverlays();
}
function AddRoute(wayPoint1, wayPoint2) {
if (myRouts.length>0 ) {lastRouter = myRouts[myRouts.length-1 ]; map.removeOverlay(lastRouter)};
var myRouter = new YMaps.Router([wayPoint1, wayPoint2], [], {viewAutoApply: true });
map.addOverlay(myRouter);
YMaps.Events.observe(myRouter, myRouter.Events.Success, function (myRouter) {
myRouter.getWayPoint(0 ).setIconContent(
myRouter.getWayPoint(1 ).setIconContent(
dlMar = myRouter.getDistance()/1000 ;
document.title =
});
myRouts.push(myRouter);
return true ;
}
function mapRazmer(map, SentrSh, SentrDlg, razmer) {
map.setCenter(new YMaps.GeoPoint(SentrSh, SentrDlg), razmer);
}
function changeStyle(numTochki, imStyle){
var restoreDefault = true ;
tochka = myPoints[numTochki];
tochka.setOptions({style: imStyle}, restoreDefault);
point = tochka.getCoordPoint();
map.setCenter(new YMaps.GeoPoint(point.__lng, point.__lat), 12 );
map.redraw();
return tochka.description;
}
</script>
</head>
<body //~~onload~~>
<div id="YMapsID" style="width:100%;height:100%" ></div>
</form>
</body>
</html>
Код вывода карты:
Код 1C v 8.х
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Макет = ПолучитьМакет( "Макет" ) ;
КодХТМЛ = Макет. ПолучитьТекст( ) ;
СтрокаСтиляНачальная = "var BurG = new YMaps.Style();
|BurG.iconStyle = new YMaps.IconStyle();
|BurG.iconStyle.offset = new YMaps.Point(-12, -12);
|BurG.iconStyle.href = "" http://www.burgerking.ru/favicon.ico"" ;
|BurG.iconStyle.size = new YMaps.Point(20, 20);
|BurG.hideIcon = false;
|BurG.balloonContentStyle = new YMaps.BalloonContentStyle("" my#template"" );" ;
СтрокаСтиляИтоговая = "" ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ВидыОбъектов.Ссылка,
| ВидыОбъектов.ПутьКИконке,
| ВидыОбъектов.Код
|ИЗ
| Справочник.ВидыОбъектов КАК ВидыОбъектов
|ГДЕ
| ВидыОбъектов.ПометкаУдаления = ЛОЖЬ" ;
Результат = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = Результат. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
времСтрокаСтиля = СтрокаСтиляНачальная;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "BurG" , "s" + Строка( ВыборкаДетальныеЗаписи. код) ) ;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "http://www.burgerking.ru/favicon.ico" , сокрЛП( ВыборкаДетальныеЗаписи. ПутьКИконке) ) ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы. ПС;
КонецЦикла ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + СтрокаСтиляНачальная + символы. ПС;
КодХТМЛ = стрЗаменить( КодХТМЛ, "/*vstavkaStiley;" , СтрокаСтиляИтоговая) ;
путьККаталогуКартинок = СтрЗаменить( КаталогПрограммы( ) , "\" , "/" ) ;
КодХТМЛ = СтрЗаменить( КодХТМЛ, "C:/" , путьККаталогуКартинок) ;
ЭлементыФормы. Карта. УстановитьТекст( КодХТМЛ) ;
табАдресов = получитьтабАдресов( ) ;
табУникальныхАдресов = табАдресов. скопировать( ) ;
табУникальныхАдресов. свернуть( "Уник" ) ;
тзДанных = табАдресов. скопировать( ) ;
табАдресов. очистить( ) ;
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура( ) ;
Отбор. Вставить( "Уник" , стр. Уник) ;
Строки = тзДанных. НайтиСтроки( Отбор) ;
НовСтр = табАдресов. добавить( ) ;
НовСтр. уник = стр. уник;
Если Строки. Количество( ) > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр. Адрес = тздстр. Адрес;
НовСтр. КД = тздстр. КД;
НовСтр. КШ = тздстр. КШ;
НовСтр. ВидОбъекта = тздстр. ВидОбъекта;
НовСтр. Наименование= Строка( НовСтр. Наименование) + Строка( тздстр. Наименование) + "; " ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. табАдресов. СоздатьКолонки( ) ;
ВыборМасштаба = "50%" ;
ВыборРегиона = "Москва" ;
ЭлементыФормы. Надпись24 . Заголовок = "Точек: " + Строка( табАдресов. количество( ) ) ;
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
Всего= Строка( табАдресов. Количество( ) ) ; н= 0 ;
Для каждого строкаАдреса Из табАдресов Цикл
н= н+ 1 ; Состояние( "Вывод " + Строка( н) + " из " + Всего) ;
УИД_Дока = Строка( н) ;
имяСтиля = "s" + Строка( строкаАдреса. ВидОбъекта. код) ;
Попытка
Если ЗначениеЗаполнено( строкаАдреса. КД) Тогда
ВызовФункции = "showAddressCoord(" + сокрЛП( строкаАдреса. КШ) + ", " + сокрЛП( строкаАдреса. КД) + ", '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
Иначе
ВызовФункции = "showAddress('" + сокрЛП( строкаАдреса. адрес) + "', '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
КонецЕсли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( ВызовФункции) ;
исключение
Сообщить( "Точка с адресом " + сокрЛП( строкаАдреса. адрес) + " не может быть отбражена на карте!" ) ;
конецПопытки
КонецЦикла ;
ТочкиНеСозданы = Ложь ;
ЭлементыФормы. Карта. ПолучитьТекст( ) ;
КонецПроцедуры
Процедура Кнопка1Нажатие(Элемент)
если ЭлементыФормы. ВыборРегиона. значение = "Москва" Тогда
СтрокаКоординат = "37.64, 55.76, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Тверь" Тогда
СтрокаКоординат = "35.90, 56.83, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Балашиха" Тогда
СтрокаКоординат = "37.97, 55.82, " ;
Иначе
СтрокаКоординат = "37.64, 55.76, " ;
конецесли ;
Если ВыборМасштаба = "" тогда
возврат ;
конецесли ;
числоМасштаба = Число( Лев( ВыборМасштаба, стрдлина( ВыборМасштаба) - 1 ) ) ;
числоМасштаба = числоМасштаба + 5 ;
ВыборМасштаба = строка( числоМасштаба) + "%" ;
ТекущийМасштаб = Строка( Цел( ( числоМасштаба/ 125 ) * ( 20 ) + 4 ) ) ;
если стрДлина( ТекущийМасштаб) = 1 тогда
ТекущийМасштаб = "0" + ТекущийМасштаб;
конецесли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( "mapRazmer(map," + СтрокаКоординат + ТекущийМасштаб + ")" ) ;
КонецПроцедуры
Пример обратного геокодирования - получение координат по адресу:
Код 1C v 8.х Процедура ПолучитьКоординаты() Экспорт
Яндекс = Новый HTTPСоединение( "geocode-maps.yandex.ru" , , , , , Истина ) ;
ВременныйФайл = КаталогВременныхФайлов( ) + "Yandex_geocode_" + СокрЛП( Новый УникальныйИдентификатор) ;
Попытка
Яндекс. Получить( "/1.x/?geocode=" + Адрес + "&results=1" , ВременныйФайл) ;
Исключение
Сообщить( "Ошибка при попытке геокодировать по яндексу адрес: " + Адрес) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ВременныйФайл) ;
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM. Прочитать( ЧтениеXML) ;
СписокText = ДокументДОМ. ПолучитьЭлементыПоИмени( "text" ) ;
СписокPos = ДокументДОМ. ПолучитьЭлементыПоИмени( "pos" ) ;
Если ( СписокText. Количество( ) = 0 ) ИЛИ ( СписокPos. Количество( ) = 0 ) Тогда
Возврат ;
КонецЕсли ;
Для ъ = 0 по СписокText. Количество( ) - 1 Цикл
Координаты = СписокPos[Ъ]. ТекстовоеСодержимое;
Разделитель = Найти( Координаты, " " ) ;
Широта = Число( Сред( Координаты, Разделитель + 1 ) ) ;
Долгота = Число( Лев( Координаты, Разделитель - 1 ) ) ;
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли ;
КД = Долгота;
КШ = Широта;
КонецЦикла ;
КонецПроцедуры
Обработка вырванная из конфигурации: YandexMap.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Как программно сформировать отчет СКД указав параметры и на выходе получить таблице значений? В одном документе для расчета потребовалось получать данные из отчета на СКД, реализовал следующим образом:
Код 1C v 8.х
СхемаОст = Отчеты. ТоннажПоЭкспедиторам. ПолучитьМакет( "ОсновнаяСхемаКомпоновкиДанных" ) ;
КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекНастройки. Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных( СхемаОст) ) ;
КомпоновщикНастроекНастройки. ЗагрузитьНастройки( СхемаОст. НастройкиПоУмолчанию) ;
КомпоновщикНастроекНастройки. Настройки. ПараметрыДанных. УстановитьЗначениеПараметра( "НачалоПериода" , НачалоМесяца( МесяцРасчета) ) ;
КомпоновщикНастроекНастройки. Настройки. ПараметрыДанных. УстановитьЗначениеПараметра( "КонецПериода" , КонецМесяца( МесяцРасчета) ) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета. Выполнить( СхемаОст, КомпоновщикНастроекНастройки. Настройки, , , Тип( "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений" ) ) ;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновкиДанных) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода. УстановитьОбъект( ДанныеТЗ) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновкиДанных) ;
ТоннажПоЭкспедиторам. Очистить( ) ;
Для каждого СтрокаТЗ Из ДанныеТЗ Цикл
Если ЗначениеЗаполнено( СтрокаТЗ. Экспедитор) и СтрокаТЗ. Доставка= Неопределено Тогда
нСтр = ТоннажПоЭкспедиторам. Добавить( ) ;
ЗаполнитьЗначенияСвойств( нСтр, СтрокаТЗ) ;
нСтр. Сотрудник= СтрокаТЗ. Экспедитор;
Иначе
Продолжить;
КонецЕсли ;
КонецЦикла ;
Категория:
Схема Компоновки Данных Как узнать текущие релизы 7.7 для Украины Код 1C v 7.x
Функция ПолучитьВерсии()
Перем Url, HtmlTab, Строк, Р, НомСтроки, Таб, Версия, ДатаВремя;
ОчиститьОкноСообщений( ) ;
СтатусВозврата( 0 ) ;
Url = "http://www.1c.ru/ukraina/support/release.jsp?time=" + _GetPerformanceCounter( ) ;
Сообщить( Url) ;
IE = СоздатьОбъект( "InternetExplorer.Application" ) ;
IE. Navigate( Url) ;
Пока ( IE. readyState < > 4 ) Или ( IE. Busy = - 1 ) Цикл
Состояние( "Получение страницы... " + Url) ;
КонецЦикла ;
HtmlTab = IE. Document. getElementsByTagName( "table" ) . item( 4 ) . rows( 0 ) . cells( 4 ) . childNodes. item( 10 ) ;
Строк = HtmlTab. rows. length;
Таб = СоздатьОбъект( "ТаблицаЗначений" ) ;
Таб. НоваяКолонка( "Версия" , "Строка" ) ;
Таб. НоваяКолонка( "Дата" , "Дата" ) ;
Таб. НоваяКолонка( "Время" , "Строка" ) ;
Таб. НоваяКолонка( "Продукт" , "Строка" ) ;
Для НомСтроки = 1 По Строк Цикл
Р = HtmlTab. rows( НомСтроки - 1 ) ;
Если Р. cells. length < > 3 Тогда
Продолжить;
КонецЕсли ;
Версия = Р. cells( 2 ) . innerText;
Если Найти( Версия, "7.70." ) = 0 Тогда
Продолжить;
КонецЕсли ;
ДатаВремя = Р. cells( 0 ) . innerText;
Таб. НоваяСтрока( ) ;
Таб. Дата = ДатаВремя;
Таб. Время = Сред( ДатаВремя, 12 ) ;
Таб. Продукт = Р. cells( 1 ) . innerText;
Таб. Версия = Версия;
КонецЦикла ;
Таб. Сортировать( "Дата-,Время-" ) ;
Возврат Таб;
КонецФункции
Категория:
HTML, JS, VML 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? Код 1C v 7.x
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе
Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯчейки, Док, ТекстВЯчейке, ТабКурсов;
Url = "http://www.bank.gov.ua/control/uk/curmetal/currency/search?formType=searchFormDate&time_step=" + ? ( Ежедневно = 1 , "daily" , "monthly" ) +
"&date=" + Формат( ДатаКурса, "ДДДММГГГГ" ) + "&outer=table&execute=run&time=" + _GetPerformanceCounter( ) ;
Сообщить( Url) ;
Reader = СоздатьОбъект( "MSXML2.XMLHTTP" ) ;
Reader. Open( "Get" , Url, 0 ) ;
Reader. Send( ) ;
Пока Reader. ReadyState < > 4 Цикл
Состояние( "Чтение данных за <" + ДатаКурса + "> " ) ;
КонецЦикла ;
Док = СоздатьОбъект( "HtmlFile" ) ;
Док. open( "text/html" ) ;
Док. write( Reader. ResponseText) ;
Док. close( ) ;
HtmlTab = Док. getElementsByTagName( "table" ) . item( 5 ) ;
ТабКурсов = СоздатьОбъект( "ТаблицаЗначений" ) ;
ТабКурсов. НоваяКолонка( "ЦифрКод" , "Строка" , 3 , , "Цифр. код" ) ;
ТабКурсов. НоваяКолонка( "БуквКод" , "Строка" , 3 , , "Букв. код" ) ;
ТабКурсов. НоваяКолонка( "Название" , "Строка" ) ;
ТабКурсов. НоваяКолонка( "Курс" , "Число" , 14 , 4 ) ;
ТабКурсов. НоваяКолонка( "Кратность" , "Число" , 9 , 0 ) ;
Строк = HtmlTab. rows. length;
Для НомСтроки = 1 По Строк Цикл
Р = HtmlTab. rows( НомСтроки - 1 ) ;
Если ( НомСтроки = 1 ) Или ( Р. cells. length < > 5 ) Тогда
Продолжить;
КонецЕсли ;
ТабКурсов. НоваяСтрока( ) ;
ТабКурсов. ЦифрКод = СокрЛП( Р. cells( 0 ) . innerText) ;
ТабКурсов. БуквКод = СокрЛП( Р. cells( 1 ) . innerText) ;
ТабКурсов. Название = СокрЛП( Р. cells( 3 ) . innerText) ;
ТабКурсов. Курс = 0 + СтрЗаменить( СокрЛП( Р. cells( 4 ) . innerText) , " " , "" ) ;
ТабКурсов. Кратность = 0 + СтрЗаменить( СокрЛП( Р. cells( 2 ) . innerText) , " " , "" ) ;
КонецЦикла ;
Reader = 0 ;
ТабКурсов. ВыбратьСтроку( , "Курсы за " + ДатаКурса) ;
Возврат ТабКурсов;
КонецФункции
Категория:
HTML, JS, VML Как получить курсы валют с сайта http://finance.ua/ за любую дату ? Код 1C v 7.x
Функция ПолучитьТаблицуКурсов(ДатаКурса)
Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯчейки, Док, ТекстВЯчейке, ТабКурсов;
Reader = СоздатьОбъект( "MSXML2.XMLHTTP" ) ;
Url = "http://tables.finance.ua/ru/currency/official/-/1/" + ДатаГод( ДатаКурса) + "/" + ДатаМесяц( ДатаКурса) + "/" + ДатаЧисло( ДатаКурса) + "?time=" + _GetPerformanceCounter( ) ;
Сообщить( Url) ;
Reader. Open( "Get" , Url, 0 ) ;
Reader. Send( ) ;
Пока Reader. ReadyState < > 4 Цикл
Состояние( "Чтение данных за <" + ДатаКурса + "> " ) ;
КонецЦикла ;
Док = СоздатьОбъект( "HtmlFile" ) ;
Док. open( "text/html" ) ;
Док. write( Reader. ResponseText) ;
Док. close( ) ;
HtmlTab = Док. getElementByID( "currency-official-table" ) ;
Строк = HtmlTab. rows. length;
ТабКурсов = СоздатьОбъект( "ТаблицаЗначений" ) ;
ТабКурсов. НоваяКолонка( "ЦифрКод" , "Строка" , 3 , , "Цифр. код" ) ;
ТабКурсов. НоваяКолонка( "БуквКод" , "Строка" , 3 , , "Букв. код" ) ;
ТабКурсов. НоваяКолонка( "Название" , "Строка" ) ;
ТабКурсов. НоваяКолонка( "Курс" , "Число" , 14 , 4 ) ;
ТабКурсов. НоваяКолонка( "Кратность" , "Число" , 9 , 0 ) ;
Для НомСтроки = 1 По Строк Цикл
Р = HtmlTab. rows( НомСтроки - 1 ) ;
Если ( НомСтроки = 1 ) Или ( Р. cells. length < > 7 ) Тогда
Продолжить;
КонецЕсли ;
ТабКурсов. НоваяСтрока( ) ;
ТабКурсов. ЦифрКод = СокрЛП( Р. cells( 0 ) . innerText) ;
ТабКурсов. БуквКод = СокрЛП( Р. cells( 1 ) . innerText) ;
ТабКурсов. Название = СокрЛП( Р. cells( 3 ) . innerText) ;
ТабКурсов. Курс = 0 + СтрЗаменить( СокрЛП( Р. cells( 4 ) . innerText) , " " , "" ) ;
ТабКурсов. Кратность = 0 + СтрЗаменить( СокрЛП( Р. cells( 2 ) . innerText) , " " , "" ) ;
КонецЦикла ;
Reader = 0 ;
ТабКурсов. ВыбратьСтроку( , "Курсы за " + ДатаКурса) ;
Возврат ТабКурсов;
КонецФункции
Категория:
HTML, JS, VML Как получить текст из html? Один мой хороший клиент использует встроенный в 1С почтовый клиент.
До этого все работало хорошо, но недавно из-за установки нового банк-клиента на компьютере обновили Internet Explorer до 11 версии - стала появляться ошибка:
Поле объекта не обнаружено innerText
Пришлось немного доработать типовую функцию получения текста из html:
Код 1C v 8.х Функция ПреобразоватьТекстИзХТМЛФорматаВПростой(ТекстВФорматеХТМЛ) Экспорт
Попытка
НовыйHTMLДокумент = Новый COMОбъект( "HtmlFile" ) ;
НовыйHTMLДокумент. open( "text/html" ) ;
НовыйHTMLДокумент. write( ТекстВФорматеХТМЛ) ;
НовыйHTMLДокумент. close( ) ;
Возврат СтрЗаменить( НовыйHTMLДокумент. all. item( 0 ) . innerText, Символ( 13 ) , "" ) ;
Исключение
Построитель = Новый ПостроительDOM;
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML. УстановитьСтроку( ТекстВФорматеХТМЛ) ;
ДокументHTML = Построитель. Прочитать( ЧтениеHTML) ;
Возврат СокрЛП( ДокументHTML. Тело. ТекстовоеСодержимое) ;
КонецПопытки ;
КонецФункции
еще функции пример получения:
Код 1C v 8.х
Функция удИзменитьФорматТекста(ЭУHTML,ЭУТекст, Кнопка) Экспорт
Если ТипЗнч( Кнопка) = Тип( "Строка" ) Тогда
НовыйВидТекстаПисьма = Кнопка;
ЕстьКнопка = Ложь ;
Иначе
Если Кнопка. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
НовыйВидТекстаПисьма = Кнопка. Текст;
ЕстьКнопка = Истина ;
КонецЕсли ;
Если Найти( НовыйВидТекстаПисьма, "Простой текст" ) > 0 Тогда
ИсходныйТекст = ЭУHTML. ПолучитьТекст( ) ;
НачалоBODY = Найти( ИсходныйТекст, "<BODY>" ) ;
КонецBODY = Найти( ИсходныйТекст, "</BODY>" ) ;
Если ЕстьКнопка и ( НачалоBODY > 0 И КонецBODY > 0 И ( НачалоBODY + 6 ) < КонецBODY) Тогда
СтрокаВопроса = "Будет потеряно форматирование текста. Продолжить?" ;
ОтветНаВопрос = Вопрос( СтрокаВопроса, РежимДиалогаВопрос. ДаНет, , КодВозвратаДиалога. Нет) ;
Если ОтветНаВопрос < > КодВозвратаДиалога. Да Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЕсли ;
ФорматТекста = ЭУHTML. Документ. all. item( 0 ) . innerText;
ЭУТекст. Значение = СтрЗаменить( ФорматТекста, Символ( 13 ) , "" ) ;
ЭУТекст. Видимость = Истина ;
ЭУHTML. Видимость = Ложь ;
ЭУHTML. УстановитьТекст( "" ) ;
Иначе
ФорматХТМЛ = СтрЗаменить( ЭУТекст. Значение, Символы. ПС, "<BR>" ) ;
ЭУHTML. УстановитьТекст( ФорматХТМЛ) ;
ЭУHTML. Видимость = Истина ;
ЭУТекст. Видимость = Ложь ;
КонецЕсли ;
Если ЕстьКнопка Тогда
Кнопка. Пометка = Истина ;
КонецЕсли ;
Возврат Истина ;
КонецФункции
Категория:
Работа с Интернет, Почтой (Mail), FTP Что такое менеджер временных таблиц и как с ним работать? В 1С есть такая замечательная вещь, как МенеджерВременныхТаблиц . Этот объект позволяет передавать временные таблицы из одного запроса в другой. То есть, мы можем создать временную таблицу в запросе, прерваться, выполнить какой-нибудь код, и продолжить работу с этой временной таблицей дальше.
Код 1C v 8.2 УП Запрос = Новый Запрос;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос. МенеджерВременныхТаблиц = МВТ;
Запрос. Текст = "ВЫБРАТЬ
| ТЧ.Номенклатура
|ПОМЕСТИТЬ ВременнаяТЗ
|ИЗ
| &ТЧ КАК ТЧ
|ГДЕ
| ТЧ.Номенклатура В ИЕРАРХИИ(&Номенклатура)
| И ТЧ.Цена < 5" ;
Запрос. УстановитьПараметр( "Номенклатура" , Номенклатура) ;
Запрос. УстановитьПараметр( "ТЧ" , ТЧ) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Запрос2 = Новый Запрос;
Запрос2 . Текст = "ВЫБРАТЬ
| ВременнаяТЗ.Номенклатура
|ИЗ
| ВременнаяТЗ КАК ВременнаяТЗ" ;
Запрос2 . МенеджерВременныхТаблиц = МВТ;
РезультатЗапроса = Запрос2 . Выполнить( ) . Выгрузить( ) ;
Например, в отчете в зависимости от выбранных настроек первичные данные обрабатываются тем или иным способом. Тогда имеет смысл в одной процедуре сформировать эти данные и поместить их во временную таблицу, которую уже передаем через менеджер временных таблиц в другую процедуру, отвечающую за выбранный способ обработки. Это позволит сократить код, сделать запросы более читаемыми. А так же в случае, если возникнут изменения в методике подготовки первичных данных для обработки, то потребуется внести изменения только в один запрос, а не в каждый.
В качестве примера работы с менеджером временных таблиц приведу следующую обработку.
Я создаю менеджер временных таблиц, и передаю его последовательно в каждую процедуру, для создания и объединения временных таблиц. Результат выводится в сводную таблицу.
Код 1C v 8.2 УП &НаКлиенте
Процедура ЗаполнитьСводную(Команда)
ЗаполнитьСводнуюНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСводнуюНаСервере()
МенВТ = Новый МенеджерВременныхТаблиц;
ПолучитьДанныеА( МенВТ) ;
ПолучитьДанныеБ( МенВТ) ;
ЗагрузитьСводные( МенВТ) ;
МенВТ. Закрыть( ) ;
КонецПроцедуры
&НаСервере
Процедура ПолучитьДанныеА(МенВремТаб)
Запрос = Новый Запрос;
Запрос. МенеджерВременныхТаблиц = МенВремТаб;
Запрос. Текст = "ВЫБРАТЬ
| ТаблицаА.Контрагент КАК Контрагент,
| ТаблицаА.Сумма
|ПОМЕСТИТЬ ТабА
|ИЗ
|ТаблицаА КАК ТаблицаА
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент" ;
Запрос. УстановитьПараметр( "ТаблицаА" , ТаблицаА. Выгрузить( ) ) ;
Запрос. Выполнить( ) ;
КонецПроцедуры
&НаСервере
Процедура ПолучитьДанныеБ(МенВремТаб)
Запрос = Новый Запрос;
Запрос. МенеджерВременныхТаблиц = МенВремТаб;
Запрос. Текст = "ВЫБРАТЬ
| ТаблицаБ.Контрагент КАК Контрагент,
| ТаблицаБ.Комментарий
|ПОМЕСТИТЬ ТабБ
|ИЗ
|ТаблицаБ КАК ТаблицаБ
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент" ;
Запрос. УстановитьПараметр( "ТаблицаБ" , ТаблицаБ. Выгрузить( ) ) ;
Запрос. Выполнить( ) ;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьСводные(МенВремТаб)
Запрос = Новый Запрос;
Запрос. МенеджерВременныхТаблиц = МенВремТаб;
Запрос. Текст = "ВЫБРАТЬ
| ЕСТЬNULL(ТабА.Контрагент, ТабБ.Контрагент) КАК Контрагент,
| ЕСТЬNULL(ТабА.Сумма, 0) КАК Сумма,
| ЕСТЬNULL(ТабБ.Комментарий, "" "" ) КАК Комментарий
|ИЗ
| ТабА КАК ТабА
| ПОЛНОЕ СОЕДИНЕНИЕ ТабБ КАК ТабБ
| ПО ТабА.Контрагент = ТабБ.Контрагент
|
|УПОРЯДОЧИТЬ ПО
| Контрагент
|АВТОУПОРЯДОЧИВАНИЕ" ;
ТаблицаСводная. Загрузить( Запрос. Выполнить( ) . Выгрузить( ) ) ;
КонецПроцедуры
Категория:
Запросы Функции для работы с ZIP-архивами В работе часто приходится сжимать выгруженные данные в zip архив, отправлять по почте, и потом автоматически разархивировать полученный zip файл:
Код 1C v 8.х
Функция РаспаковатьZipФайл(Знач ПолноеИмяФайлаАрхива, Знач ПутьРаспаковкиФайлов, Знач ПарольАрхива = "" ) Экспорт
Результат = Истина ;
Попытка
Архиватор = Новый ЧтениеZipФайла( ПолноеИмяФайлаАрхива, ПарольАрхива) ;
Исключение
Архиватор = Неопределено ;
СообщитьОбОшибке( КраткоеПредставлениеОшибки( ИнформацияОбОшибке( ) ) ) ;
Возврат Ложь ;
КонецПопытки ;
Попытка
Архиватор. ИзвлечьВсе( ПутьРаспаковкиФайлов, РежимВосстановленияПутейФайловZIP. НеВосстанавливать) ;
Исключение
СтрокаСообщения = НСтр( "ru = 'Ошибка при распаковке файлов архива: %1 в каталог: %2'" ) ;
СтрокаСообщения = ПодставитьПараметрыВСтроку( СтрокаСообщения, ПолноеИмяФайлаАрхива, ПутьРаспаковкиФайлов) ;
Сообщить( СтрокаСообщения) ;
Результат = Ложь ;
КонецПопытки ;
Архиватор. Закрыть( ) ;
Архиватор = Неопределено ;
Возврат Результат;
КонецФункции
Функция ЗапаковатьВZipФайл(Знач ПолноеИмяФайлаАрхива, Знач МаскаУпаковкиФайлов, Знач ПарольАрхива = "" ) Экспорт
Результат = Истина ;
Попытка
Архиватор = Новый ЗаписьZipФайла( ПолноеИмяФайлаАрхива, ПарольАрхива) ;
Исключение
Архиватор = Неопределено ;
СообщитьОбОшибке( КраткоеПредставлениеОшибки( ИнформацияОбОшибке( ) ) ) ;
Возврат Ложь ;
КонецПопытки ;
Попытка
Архиватор. Добавить( МаскаУпаковкиФайлов, РежимСохраненияПутейZIP. НеСохранятьПути) ;
Архиватор. Записать( ) ;
Исключение
СтрокаСообщения = НСтр( "ru = 'Ошибка при запаковке файлов архива: %1 из каталог: %2'" ) ;
СтрокаСообщения = ПодставитьПараметрыВСтроку( СтрокаСообщения, ПолноеИмяФайлаАрхива, МаскаУпаковкиФайлов) ;
Сообщить( СтрокаСообщения) ;
Результат = Ложь ;
КонецПопытки ;
Архиватор = Неопределено ;
Возврат Результат;
КонецФункции
В примере используется строковая функция ПодставитьПараметрыВСтроку ():
Код 1C v 8.х
Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт
Если СтрокаПодстановки = Неопределено ИЛИ СтрДлина( СтрокаПодстановки) = 0 Тогда
Возврат "" ;
КонецЕсли ;
Результат = "" ;
НачПозиция = 1 ;
Позиция = 1 ;
Пока Позиция < = СтрДлина( СтрокаПодстановки) Цикл
СимволСтроки = Сред( СтрокаПодстановки, Позиция, 1 ) ;
Если СимволСтроки < > "%" Тогда
Позиция = Позиция + 1 ;
Продолжить;
КонецЕсли ;
Результат = Результат + Сред( СтрокаПодстановки, НачПозиция, Позиция - НачПозиция) ;
Позиция = Позиция + 1 ;
СимволСтроки = Сред( СтрокаПодстановки, Позиция, 1 ) ;
Если СимволСтроки = "%" Тогда
Позиция = Позиция + 1 ;
НачПозиция = Позиция;
Результат = Результат + "%" ;
Продолжить;
КонецЕсли ;
Попытка
НомерПараметра = Число( СимволСтроки) ;
Исключение
ВызватьИсключение НСтр( "ru='Входная строка СтрокаПодстановки имеет неверный формат: %'" + СимволСтроки) ;
КонецПопытки ;
Если СимволСтроки = "1" Тогда
ЗначениеПараметра = Параметр1 ;
ИначеЕсли СимволСтроки = "2" Тогда
ЗначениеПараметра = Параметр2 ;
ИначеЕсли СимволСтроки = "3" Тогда
ЗначениеПараметра = Параметр3 ;
ИначеЕсли СимволСтроки = "4" Тогда
ЗначениеПараметра = Параметр4 ;
ИначеЕсли СимволСтроки = "5" Тогда
ЗначениеПараметра = Параметр5 ;
ИначеЕсли СимволСтроки = "6" Тогда
ЗначениеПараметра = Параметр6 ;
ИначеЕсли СимволСтроки = "7" Тогда
ЗначениеПараметра = Параметр7 ;
ИначеЕсли СимволСтроки = "8" Тогда
ЗначениеПараметра = Параметр8 ;
ИначеЕсли СимволСтроки = "9" Тогда
ЗначениеПараметра = Параметр9 ;
Иначе
ВызватьИсключение НСтр( "ru='Входная строка СтрокаПодстановки имеет неверный формат: %'" + ЗначениеПараметра) ;
КонецЕсли ;
Если ЗначениеПараметра = Неопределено Тогда
ЗначениеПараметра = "" ;
Иначе
ЗначениеПараметра = Строка( ЗначениеПараметра) ;
КонецЕсли ;
Результат = Результат + ЗначениеПараметра;
Позиция = Позиция + 1 ;
НачПозиция = Позиция;
КонецЦикла ;
Если ( НачПозиция < = СтрДлина( СтрокаПодстановки) ) Тогда
Результат = Результат + Сред( СтрокаПодстановки, НачПозиция, СтрДлина( СтрокаПодстановки) - НачПозиция + 1 ) ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Категория:
Работа с Файлами и Каталогами Универсальный парсер 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 Отправка почты через CDO (работает c SSL) &НаСервереБезКонтекста
Функция ПолучитьДанныеЯщикаСистемнойЗаписи()
СистемнаяУчетнаяЗаписьЭлектроннойПочты = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("СерверSMTP", СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.СерверИсходящейПочтыSMTP));
СтруктураНастроек.Вставить("ПользовательSMTP",СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПользовательSMTP));
СтруктураНастроек.Вставить("ПарольSMTP", СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПарольSMTP));
СтруктураНастроек.Вставить("ПортSMTP", СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПортSMTP);
СтруктураНастроек.Вставить("Отправитель", СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.АдресЭлектроннойПочты));
СтруктураНастроек.Вставить("ИспользоватьSSL", СистемнаяУчетнаяЗаписьЭлектроннойПочты.ИспользоватьSSL);
Возврат СтруктураНастроек;
КонецФункции
//обработка, пример который приведен содержит ТЧ "НаОтправку" с реквизитами "Контрагент" - ссылка на справочник и "Файл" - строка, путь к файлу
//ПолучитьМассивКлиентов() - функция возвращает перечень всех клиентов из данной ТЧ
//
//АдресПолучателя(ЭлементМассива) - функция возвращает e-mail клиента
&НаКлиенте
Процедура ОтправкаПисем()
//тут был прочий код, не относящийся к отправке, он удален
МассивКлиенты = ПолучитьМассивКлиентов();
Для Каждого ЭлементМассива Из МассивКлиенты Цикл
//***************************************
Если АдресПолучателя(ЭлементМассива) = "" Тогда
Сообщить("У контрагента "+ЭлементМассива+" не указан email, письмо отправлено не будет!");
Продолжить;
КонецЕсли;
Кому = АдресПолучателя(ЭлементМассива);
Тема = "Документы";
Текст = "Документы";
СтруктураНастроек = ПолучитьДанныеЯщикаСистемнойЗаписи();
CDO_СерверSMTP = СтруктураНастроек.СерверSMTP;
CDO_ПользовательSMTP = СтруктураНастроек.ПользовательSMTP;
CDO_ПарольSMTP = СтруктураНастроек.ПарольSMTP;
CDO_ПортSMTP = СтруктураНастроек.ПортSMTP;
Отправитель = СтруктураНастроек.Отправитель;
ИспользоватьSSL = СтруктураНастроек.ИспользоватьSSL;
Письмо = Новый COMОбъект("CDO.Message");
Письмо.to = Кому;
Письмо.from = Отправитель;
Письмо.Sender = Отправитель;
//Письмо.cc=Копия;
//Письмо.bcc=СкрКопия;
Отбор = Новый Структура();
Отбор.Вставить("Контрагент",ЭлементМассива);
НайденныеСтроки = Объект.НаОтправку.НайтиСтроки(Отбор);
Для КАЖДОГО СтрДокументы ИЗ НайденныеСтроки ЦИКЛ
Письмо.AddAttachment(СокрЛП(СтрДокументы.Файл));
КонецЦикла;
Письмо.Subject = Тема;
Письмо.TextBody = Текст;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = CDO_СерверSMTP;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;// 0 - Do not authenticate; 1 - basic (clear-text) authentication; 2 - NTLM
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = CDO_ПользовательSMTP;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = CDO_ПарольSMTP;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = CDO_ПортSMTP;
Если ИспользоватьSSL Тогда
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = True;
КонецЕсли;
//Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = ИспользоватьSSL;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
Попытка
Письмо.Configuration.Fields.Update();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Письмо.Send();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Сообщить("Все...");
КонецПроцедуры
Категория:
Работа с Интернет, Почтой (Mail), FTP