Как очистить ХранилищеЗначение в Управляемой форме
&НаСервере Процедура УдалитьДанныеХЗНаСервере() ЭлементСправочника = РеквизитФормыВЗначение("Объект"); ЭлементСправочника.ХранилищеЗначения = Новый ХранилищеЗначения(Неопределено); ЭлементСправочника.Записать(); ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект"); КонецПроцедуры
Категория:
Работа с Хранилищем Значений Вывод результата запроса на форму УП в таблицу значений (аналог СоздатьКолонки() для УП) при разработке на обычных формах было удобно выводить результат запроса используя метод СоздатьКолоки():
Код 1C v 8.х Процедура ПоискНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументоОборот.Этап,
| ДокументоОборот.Отдел,
| ДокументоОборот.ФИО,
| ДокументоОборот.ДатаВремя КАК Дата_Время,
| ДокументоОборот.Документы,
| ДокументоОборот.Примечание,
| ДокументоОборот.Доставка
|ИЗ
| РегистрСведений.ДокументоОборот КАК ДокументоОборот
|ГДЕ
| ДокументоОборот.Документы ПОДОБНОДокументы
| И ДокументоОборот.Доставка.Дата МЕЖДУДатаН ИДатаК
|
|УПОРЯДОЧИТЬ ПО
| ДокументоОборот.ДатаВремя";
Запрос.УстановитьПараметр("Документы", "%"+СокрЛП(Строка(СтрокаПоиска))+"%");
Запрос.УстановитьПараметр("ДатаК", КонПериода);
Запрос.УстановитьПараметр("ДатаН", НачПериода);
Рез=Запрос.Выполнить();
НайденДок = рез.Выгрузить();
ЭлементыФормы.НайденДок.СоздатьКолонки();
В управляемом приложении метод СоздатьКолоки() не доступен, ниже представлена процедура, которая отображает на управляемой форме содержимое таблицы значений переданное ей в качестве параметра:
Пример формы:
Код вывода результата запроса на управляемую форму :
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений)
// Если руками не создали эелемент формы Таблица, то создается программно
Если Элементы.Найти(ИмяПоляТаблицыФормы) = Неопределено Тогда
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип("ТаблицаФормы"),);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция;
КонецЕсли;
УдаляемыеРеквизиты = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты(ИмяРеквизитаДанныеФормыКоллекция);
Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
УдаляемыеРеквизиты.Добавить(ИмяРеквизитаДанныеФормыКоллекция+"."+РеквизитУдаления.Имя);
// Удаляем элементы формы
Элементы.Удалить(Элементы[ИмяПоляТаблицыФормы+РеквизитУдаления.Имя]);
КонецЦикла;
// Добавление реквизитов в таблицу формы
ДобавляемыеРеквизиты = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка.Заголовок));
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты);
// Добавление элементов форму
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Элементы[ИмяПоляТаблицыФормы]);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка.Имя;
ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
КонецЦикла;
ЗначениеВРеквизитФормы(ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция);
КонецПроцедуры
&НаСервере
Процедура ВПоискНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка КАК Реализация,
| РеализацияТоваровУслугСерии.Ссылка.ЗаказКлиента КАК ЗаказКлиента,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка.Договор КАК Договор
|ИЗ
| Документ.РеализацияТоваровУслуг.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование ПОДОБНОНаименование)
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Наименование", "%"+НомерФН+"%");
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
СоздатьТаблицуФормы("ТЗ","ТЗ",ТаблицаЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура ВПоиск(Команда)
ВПоискНаСервере();
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент Реквизит ~ Как сохранять и восстанавливать значения Объектов и Реквизитов на форме УП? У управляемой формы реквизиты заведенные как реквизиты формы, при закрытии и открытии ее заново могут сохраняться и восстанавливаться, достаточно только поставить напротив галочку сохранять и в свойствах формы выбрать "АвтоматическоеСохранениеДанныхВНастройках" - Использовать.
Подробнее в этой статье Как сохранять и восстанавливать значения реквизитов на форме? и там же пример для обычных форм.
А что же делать с реквизитами, которые выступают в роли реквизитов объектов ?
у них такой настройки нет нет - напишем:
Код 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);
Настройки.Вставить("Склад", Объект.Склад);
Настройки.Вставить("Организация", Объект.Организация);
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек, ИмяПользователя);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СохранитьНастройки();
КонецПроцедуры
Открыв обработку и заполним поля закрываем ее, при следующем открытии все поля заполнены из сохраненных настроек:
Категория:
Работа с Формой (Диалог) и её элементами Как отобразить дерево значений на управляемой форме Создадим новую внешнюю обработку.
Добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
// который будет отображен на управляемой форме
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
СтрокаУ1.Узел = "Узел"+к1;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1.Строки.Добавить();
СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2.Строки.Добавить();
СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
КонецЦикла;
КонецЦикла;
КонецЦикла;
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево",
Новый ОписаниеТипов("ДеревоЗначений")));
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
ЭлементДерево.ПутьКДанным = "Дерево";
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
КонецЦикла;
КонецПроцедуры
Категория:
Работа с Деревом Значений Как в управляемом режиме открыть «старую» форму обработки? Допустим, есть внешняя обработка, написанная для версии 8.1. Можно ли запустить ее в версии 8.2 так, чтобы работать с ее старой, неуправляемой формой? Обработка нужна всего один раз, для переноса данных, и создавать для нее управляемую форму ради одного раза не хочется...
Для внешних обработок (открываемых из отдельного файла) в управляемом режиме использование обычных форм не поддерживается. Поэтому если в конфигурации, работающей в управляемом режиме, необходимо запустить обработку с неуправляемой формой, и не хочется создавать для этой обработки новую, управляемую форму, то сначала такую обработку нужно включить в состав конфигурации.
Обычные (неуправляемые) формы могут работать только в толстом клиенте. Тонкий и веб-клиенты поддерживают работу только с управляемыми формами.
Поэтому, если нужно открыть обычную форму обработки в управляемом интерфейсе приложения, то это возможно только в толстом клиенте, запущенном в режиме управляемого приложения.
Проще всего запустить толстого клиента в режиме управляемого приложения из конфигуратора, указав это в параметрах: Сервис - Параметры - Запуск 1С:Предприятия - Основные - Толстый клиент (управляемое приложение).
При этом нужно помнить, что запуск клиентов в управляемом режиме возможен только в том случае, если у конфигурации отключена совместимость в версией 8.1 (свойство РежимСовместимости ).
Однако этого недостаточно для того, чтобы платформа откорыла старую, неуправляемую форму обработки.
Возможность использования обычных форм в управляемом режиме регулируется специальным свойством конфигурации - ИспользоватьОбычныеФормыВУправляемомПриложении . Это свойство нужно установить.
В палитре свойств конфигурации это свойство отображается не всегда, а только в случае, если в параметрах конфигуратора выбран режим редактирования конфигурации Управляемое приложение и обычное приложение (Сервис - Параметры - Общие ).
Ну и наконец, у объекта, обычную форму которого вы хотите увидеть в управляемом режиме, должна существовать единственная основная форма объекта, и эта форма должна быть обычной, неуправляемой .
В других случаях (если у объекта нет ни одной основной формы или у объекта есть управляемая основная форма) платформой будет по умолчанию генерироваться или открываться (если она есть) управляемая форма.
Категория:
1С Общие вопросы - Управляемые формы и Такс… Как сформировать отчет СКД без проверки прав (в привилегированном режиме)? Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав!
Особенно если настроен RLS
Есть несколько способов как это сделать: 1. Установить привилегированный режим в модуле отчета
Форма отчета должна быть Управляемой, далее в модуле отчета процедура обработчика «При компоновке результата»:
Код 1C v 8.3 //Перехватываем событие вывода компоновки данных в табличный документ и выводим со своим заголовком
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
УстановитьПривилегированныйРежим(Истина);
//Сформируем отчет
СформироватьОтчет(ДокументРезультат, ДанныеРасшифровки);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
2. Формирование в п ривилегированном режиме через Общий модуль с галкой Привелигерованный
Создаем общий модуль
так же как в пункте 1 в обработчике «При компоновке результата» пишем:
Код 1C v 8.3 //Перехватываем событие вывода компоновки данных в табличный документ и выводим со своим заголовком
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МЕ_ДляОтчетаСКД_ПривелРежим.СформироватьОтчетПривРеж(ДокументРезультат, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек);
КонецПроцедуры
В общем модуле МЕ_ДляОтчетаСКД_ПривелРежим код:
Код 1C v 8.3 Процедура СформироватьОтчетПривРеж(ТабличныйДокумент, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек) Экспорт
ТабличныйДокумент.Очистить();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки,,,Ложь);
ВнешниеНаборыДанных = Новый Структура;
/// можно передать внешние данные ВнешниеНаборыДанных.Вставить("тзПродаж", СформироватьТЗПродаж());
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
3. Если включен режим Использовать ограничение на уровне прав доступа - RLS
Часто используется в типовых. Тут в модуле для текущего пользователя можно на время формирования отчету установить параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей в Ложь и RLS не сработает.
Код 1C v 8.3 ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей=Ложь;
После завершения формирования, не забудьте включить rls обратно установив = Истина
4. Если в запросе используется конструкция вида регистратор.дата и это поле не отображается в полях отчета СКД
Допустим Вы сделали запрос по регистру накоплений и через регистратор обратились к дате или сумме документа и при формировании отчета СКД, эти поля недоступны !? как же быть?
Проблема в том - что у регистратором может выступать несколько документов и видимо права чтение/просмотр есть не на все - поэтому через скд эта таблица целиком недоступна, решение:
1. открыть доступ на все регистраторы регистра
2. в запросе четко обозначить тип
Код 1C v 8.3 //примеры
ВЫРАЗИТЬ(ДокументыОплаты.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).СуммаДокумента
//или так
ВЫБОР
КОГДА РАЗНОСТЬДАТ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата,КонецПериода, ДЕНЬ) > ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности
ТОГДА ДОБАВИТЬКДАТЕ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата, ДЕНЬ, ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности)
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ДеньВозникновенияЗадолженности
В дополнении у пункту 1, код процедуры сформировать отчет(). Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах:
Код 1C v 8.3 // Процедура выполняет формирование табличного документа по настройкам СКД
Процедура СформироватьОтчет(ТабличныйДокумент, ДанныеРасшифровки)
УстановитьПривилегированныйРежим(Истина);
// если отчет открывается по расшифровке, отбору, упорядочиванию,
// группировке или условному оформлению - восстановим настройки вывода заголовка,
// т.к., в переданных настройках при этом, вывод заголовка отключен
// для того, чтобы не выводился встроенный заголовок компоновки.
ВосстановитьНастройкиВыводаЗаголовка();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ТабличныйДокумент.Очистить();
// установим обязательные настройки отчета
УстановитьПараметрыОтчета();
// Сделаем копию настроек вывода заголовка
СохранитьНастройкиВыводаЗаголовка();
ВыводитьЗаголовок = ВыводитьЗаголовокОтчета();
Если ВыводитьЗаголовок Тогда
ПрисоединитьЗаголовокОтчетаКТабличномуДокументу(ТабличныйДокумент, ПолучитьТекстЗаголовкаОтчета());
// Отключим в настройках вывод встроенного заголовка
НайденнаяНастройкаВыводаЗаголовка = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок");
НайденнаяНастройкаВыводаЗаголовка.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
НайденнаяНастройкаВыводаЗаголовка.Использование = Истина;
КонецЕсли;
КопияДополнительныхНастроек = УстановитьДополнительныеНастройкиДляРасшифровки();
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
// при необходимости вставим внешние наборы данных в СКД
ВнешниеНаборыДанных = Новый Структура;
ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных();
ВнешниеНаборыДанных.Вставить("ТаблицаВнешнегоНабораДанных",ТаблицаВнешнегоНабораДанных);
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки);
ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы,,,КоличествоФиксируемыхСтолбцов);
ДополнительнаяОбработкаРезультатаОтчета(ТабличныйДокумент);
Если ВыводитьЗаголовок Тогда
// вернем настройки вывода заголовка на место
ВосстановитьНастройкиВыводаЗаголовка();
КонецЕсли;
// восстановим дополнительные настройки
Для Каждого ЭлементСтруктуры Из КопияДополнительныхНастроек Цикл
КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
// сохраненные настройки нужны только при расшифровке и т.п.
// и не будуть давать изменить вывоз заголовка при обычном формировании.
ОчиститьСохраненныеНастройкиВыводаЗаголовка();
УстановитьВидимостьЗаголовкаОтчета(ТабличныйДокумент);
УстановитьВидимостьПараметровОтчета(ТабличныйДокумент);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры // СформироватьОтчет()
Категория:
Схема Компоновки Данных Как обновить динамический список или реквизит на форме клиента? Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закрыть форму и открыть снова - все обновится
НО если нужно обновить сразу в открытой форме , то используйте код:
Код 1C v 8.3 &НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
// Много кода обработки
//...
//...
//...
// ОБНОВИМ динамический список файлы
Элементы.Файлы.Обновить();
// для обновления Реквизитов
ЭтаФорма.Прочитать();
// Обновление данных
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
Обновить() - Обновляет данные в таблице.
Прочитать() - Обновляет объект управляемой формы.
ОбновитьОтображениеДанных() - В принудительном порядке обновляет содержание элементов управления. Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
Категория:
Работа с Формой (Диалог) и её элементами Как установить параметр динамического списка? Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента
Для вывода используется используется запрос:
Код 1C v 8.3 ВЫБРАТЬ
РегистрСведенийFinans.Период,
РегистрСведенийFinans.Клиент,
РегистрСведенийFinans.Движение,
РегистрСведенийFinans.Расшифровка,
РегистрСведенийFinans.СуммаОбщая,
РегистрСведенийFinans.РасходыСервиса,
РегистрСведенийFinans.W1C
ИЗ
РегистрСведений.Finans КАК РегистрСведенийFinans
ГДЕ
РегистрСведенийFinans.Клиент =Клиент
Чтобы при открытии не отображалась информацию по другим клиентам, необходимо установить параметр динамического списка , сделаем это так:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Финансы.Параметры.УстановитьЗначениеПараметра("Клиент", Объект.Ссылка);
КонецПроцедуры
Можно и просто настроить отбор через настройки, используя ЭлементОтбораКомпоновкиДанных
Подробнее об этом: Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором?
Категория:
Работа с Формой (Диалог) и её элементами Как открыть форму списка документов с отбором? Данный код позволяет открыть список документов с установленным отбором, также можно открыть список элементов справочника с нужным отбором
Код 1C v 8.2 УП Форма = ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ФормаСписка"); //Открываем форму
ОтборВладелец =Форма.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); //Добавлям отбор
ОтборВладелец.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; //Как будем сравнивать
ОтборВладелец.Использование = Истина; // Устанавливаем галку использованияНовый ПолеКомпоновкиДанных("Номенклатура")
ОтборВладелец.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент"); //По какому реквизиту будем делать отбор
ОтборВладелец.ПравоеЗначение = Объект.Контрагент; // И само значение отбора
Для того, чтобы открыть форму списка с заранее установленным отбором используйте следующие способы:
Первый способ заключается в том, что при открытии формы можно задать параметр формы Отбор, и открыть форму списка с этим параметром.
Параметр Отбор представляет собой структуру. Имена элементов соответствуют именам полей, по которым производится отбор, а значения содержат значения отбора. Это параметр расширения управляемой формы динамического списка. То есть он существует у форм, основным реквизитом которых является реквизит типа ДинамическийСписок, например у форм списка и форм выбора.
Например, в следующем примере открывается список приходных накладных с отбором по полю Номер, равному 333.
Код 1C v 8.2 УП ЗначениеОтбора = Новый Структура("Номер", "333");
ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыВыбора);
Второй способ
Можно открыть форму списка без параметров:
Код 1C v 8.2 УП ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");
И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номер");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = "000000001";
КонецПроцедуры
Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно, как в первом случае, а и Больше, Меньше и т.п.
Но у такого способа есть и очень существенный недостаток: с этим отбором форма будет открываться всегда. Откуда бы ее ни вызвали. Поэтому такую форму не следует назначать основной. А если все же она основная - то перед установкой отбора необходимо предусмотреть какой-то анализ того, откуда открывается эта форма. Например, анализируя параметры формы.
Третий способ
И наконец, условие отбора можно поместить в произвольный запрос, выбирающий данные для динамического списка.
Например, нам нужно открыть список приходных накладных, в которых присутствует номенклатура, выделенная в списке номенклатуры.
Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные.
Обработчик выполнения этой команды заполним следующим образом:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПриходныеНакладные(Команда)
ПараметрыВыбора = Новый Структура("ФильтрПоТовару", Элементы.Список.ТекущаяСтрока);
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыВыбора);
КонецПроцедуры
В этом обработчике мы открываем форму списка приходных накладных, передавая в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры.
Затем создадим форму списка документов ПриходнаяНакладная и создадим параметр формы ФильтрПоТовару, который мы будем использовать для открытия формы с нужным отбором.
Теперь откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмём Открыть.
В поле Запрос введём следующий текст запроса:
Код 1C v 8.2 УП ВЫБРАТЬ
ДокументПриходнаяНакладная.Номер,
ДокументПриходнаяНакладная.Дата
ИЗ
Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная
ГДЕ
ДокументПриходнаяНакладная.Товары.Товар = &Товар
В запросе мы используем параметр Товар, в который и будет передаваться ссылка на текущую строку в списке номенклатуры, содержащуюся в параметре формы списка приходных накладных ФильтрПоТовару.
Для этого в обработчике события формы списка ПриСозданииНаСервере напишем код для установки значения параметра запроса Товар:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПриОткрытии(Отказ)
Список.Параметры.УстановитьЗначениеПараметра("Товар", Параметры.ФильтрПоТовару);
КонецПроцедуры
Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список. Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару.
В результате по нажатию кнопки Приходные накладные в форме списка номенклатуры мы будем получать список только тех приходных накладных, в которых присутствует номенклатура, выделенная в данный момент в списке номенклатуры.
Категория:
Документы РеквизитФормыВЗначение() и ДанныеФормыВзначение() - Описание и примеры использования gvk2009 подробно и доходчиво описал разницу методов, за что ему огромное спасибо:
В Синтаксис-Помощнике очень скупо написано о процедуре ДанныеФормыВЗначение (), чуть побольше - о РеквизитФормыВЗначение (). И совсем нет примеров использования. Попробуем с этим разобраться.
РеквизитФормыВЗначение() Является методом управляемой формы, компилируется только &НаСервере , контекст формы является для него необходимым, поэтому компиляция &НаСервереБезКонтекста недоступна. На клиенте не работает, поскольку в результате получаем прикладной объект.
Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение () необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.
Для того, чтобы измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().
Вторым параметром метода РеквизитФормыВЗначение является тип значения. Это необязательный параметр. Если обрабатываемый реквизит не является составным типом, то тип будет автоматически получен из реквизита формы. Иначе генерируется исключение времени выполнения.
Примеры:
Код 1C v 8.2 УП // 1)
&НаСервере
Процедура ЗаполнитьТЧПоДаннымПоследнегоДокумента(Контрагент)
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ЗаполнитьТЧПоДаннымПоследнегоДокумента(Контрагент);
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры
// 2)
&НаСервере
Процедура ОчиститьСтрокиСПустойЦенойНаСервере()
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ОчиститьСтрокиСПустойЦеной();
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры
//3)
&НаСервере
Функция ОбъектЗаполнен()
Возврат РеквизитФормыВЗначение("Объект").ПроверитьЗаполнение();
КонецФункции
В указанных выше случаях метод РеквизитФормыВЗначение () похож на метод ПолучитьОбъект (). Разница в том, что первый получает объект, заполненный данными формы, а второй - объект с данными из базы.
ДанныеФормыВзначение() В отличие от метода управляемой формы РеквизитФормыВЗначение(), процедура глобального контекста ДанныеФормыВЗначение() может работать без контекста формы, но именно поэтому, в частности, ей необходимо указывать тип конвертируемых данных.
Обратной процедурой является ЗначениеВДанныеФормы().
Примеры:
Код 1C v 8.2 УП // 1)
&НаСервере
// Инициализация набора констант
НаборКонстантОбъект = ДанныеФормыВЗначение(НаборКонстант, Тип("КонстантыНабор"));
НаборКонстантОбъект.Прочитать();
ЗначениеВДанныеФормы(НаборКонстантОбъект, НаборКонстант);
// 2)
&НаСервере
НаборФорма = Объект.Движения.РегистрУправленческий;
Набор = ДанныеФормыВЗначение(НаборФорма, Тип("РегистрБухгалтерииНаборЗаписей.РегистрУправленческий"));
Если Набор.Количество()=0 Тогда
Возврат;
КонецЕсли;
Набор.УстановитьАктивность(НЕ Набор[0].Активность);
ЗначениеВДанныеФормы(Набор, НаборФорма);
В этом примере на форме отображен набор записей регистра бухгалтерии. При отработке процедуры, активность набора меняется только на форме, в базе при этом ничего не происходит. Активность у набора записей регистра в базе поменяется только после выполнения операции Записать.
Код 1C v 8.2 УП // 3)
&НаКлиенте
Процедура Заполнить(Команда)
ОснРеквизит = Объект;
ВыполнитьНаСервереБезКонтекста(ОснРеквизит);
КопироватьДанныеФормы(ОснРеквизит,Объект)
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервереБезКонтекста(ОснРеквизит)
ОбъектЗначение = ДанныеФормыВЗначение(ОснРеквизит, Тип("ДокументОбъект.АктСверкиВзаиморасчетов"));
//...Выполнение операций с Объектом "ОбъектЗначение"
ЗначениеВДанныеФормы(ОбъектЗначение, ОснРеквизит);
КонецПроцедуры
В этом примере на клиент возвращается ОснРеквизит, содержащий измененные данные. Но его еще нужно "запихать" в отображаемую форму. Для этого используем процедуру глобального контекста КопироватьДанныеФормы().
В большинстве случаев процедуры ДанныеФормыВзначение() и РеквизитФормыВЗначение() взаимозаменяемы. При этом РеквизитФормыВЗначение проще в использовании. Но если требуется использование &НаСервереБезКонтекста - тогда только ДанныеФормыВЗначение.
В качестве иллюстрации взаимозаменяемости Пример 2 еще в двух вариантах:
Код 1C v 8.2 УП // ВАРИАНТ 1
&НаКлиенте
Процедура Активность(Команда)
ОснРеквизитДвижения = Объект.Движения.РегистрУправленческий;
АктивностьНаСервереБезКонтекста(ОснРеквизитДвижения);
КопироватьДанныеФормы(ОснРеквизитДвижения,Объект.Движения.РегистрУправленческий);
КонецПроцедуры // Активность()
&НаСервереБезКонтекста
Процедура АктивностьНаСервереБезКонтекста(ОснРеквизитДвижения)
Набор = ДанныеФормыВЗначение(ОснРеквизитДвижения, Тип("РегистрБухгалтерииНаборЗаписей.РегистрУправленческий"));
Если Набор.Количество()=0 Тогда
Возврат;
КонецЕсли;
Набор.УстановитьАктивность(НЕ Набор[0].Активность);
ЗначениеВДанныеФормы(Набор, ОснРеквизитДвижения);
КонецПроцедуры // АктивностьНаСервереБезКонтекста()
// ВАРИАНТ 2
&НаСервере
Процедура АктивностьНаСервере()
НаборФорма = РеквизитФормыВЗначение("Объект");
Набор = НаборФорма.Движения.РегистрУправленческий;
Если Набор.Количество()=0 Тогда
Возврат;
КонецЕсли;
Набор.УстановитьАктивность(НЕ Набор[0].Активность);
ЗначениеВРеквизитФормы(НаборФорма, "Объект");
КонецПроцедуры // АктивностьНаСервере()
Категория:
Управляемое приложение, Тонкий клиент Как вызвать программно стандартную команду "Перечитать" у управляемой формы Расширение
управляемой формы для справочника (Managed form extension for catalogs) - Прочитать (Read)
Синтаксис: Прочитать()
Описание: Обновляет объект
управляемой формы.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент.
Код 1C v 8.2 УП ЭтаФорма.Прочитать();
Код 1C v 8.2 УП
&НаКлиенте
Процедура Обновить(Команда)
ЭтаФорма.Прочитать();
ОбновитьПодвалФормы();
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Настройка периода, интервала динамического списка Вот несколько вариантов
Программной установки периода, интервала динамического списка на управляемой форме
Код 1C v 8.2 УП Элементы.ДинамическийСписок.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.Сегодня);
//или
Элементы.Список.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотКвартал);
Код 1C v 8.2 УП
Элементы.Список.Период.Вариант = СтруктураПараметров.Период.Вариант;
Элементы.Список.Период.ДатаНачала = СтруктураПараметров.Период.ДатаНачала;
Элементы.Список.Период.ДатаОкончания = СтруктураПараметров.Период.ДатаОкончания;
//Или
СП = Элементы.Список.Период;
СП.ДатаНачала = НачалоМесяцы(РабочаяДата);
СП.ДатаОкончания = КонецМесяца(РабочаяДата);
Категория:
Документы Как сформировать отчет при открытии? Проще всего сделать это путем передачи параметра в отчет:
Код 1C v 8.2 УП &НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрВыполненияКоманды)
ПараметрФормы = Новый Структура("СформироватьПриОткрытии", Истина);
ОткрытьФорму(
"Отчет.Материалы.Форма",
ПараметрыФормы,
ПараметрВыполненияКоманды.Источник,
ПараметрВыполненияКоманды.Уникальность,
ПараметрВыполненияКоманды.Окно
);
КонецПроцедуры
Но можно сделать это и самостоятельно из кода
управляемой формы отчета:
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
АвтоОтображениеСостояния = РежимАвтоОтображенияСостояния.НеОтображать;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СформироватьОтчетНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчетНаСервере()
ЭтотОтчет = РеквизитФормыВЗначение("Отчет");
ЭтотОтчет.СкомпоноватьРезультат(Результат);
КонецПроцедуры
Категория:
Схема Компоновки Данных Яндекс, Google, Рамблер Карты и 1С Обработка демонстрирует возможности интеграции 1С с картографическими сервисами, в ней поддерживается работа трех поставщиков услуг / карт — Яндекс, Google. Рамблер.
Автор: Діма Головаченко - http://smaylukk.com.ua
но так вот сама обработка + еще 2 :
Скачивать файлы может только зарегистрированный пользователь!
Код Модуля Обработки:
Код 1C v 8.х Перем СтруктураПоставщиковКарт Экспорт;
Перем СтруктураЧисел;
/////////////////////////РАБОТА С JSON //////////////////////////////////////////
Функция СформироватьСтрокуJSONИзМассива(Объект)
СтрокаJSON = "[";
Для каждого Элемент Из Объект Цикл
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент) + ",";
КонецЦикла;
Если Прав(СтрокаJSON, 1) = "," Тогда
СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
КонецЕсли;
Возврат СтрокаJSON + "]";
КонецФункции
Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
СтрокаJSON = "{";
Для каждого Элемент Из Объект Цикл
Если Элемент.Значение = "" Тогда
Продолжить;
КонецЕсли;
СтрокаJSON = СтрокаJSON + """" + Элемент.Ключ + """" + ":";
Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
СтрокаJSON = СтрокаJSON + """" + URLEncode(Элемент.Значение) + """";
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Число") Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, "");
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Булево") Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение, "БЛ=false; БИ=true");
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Дата") Тогда
// преобразование в unixtime
Строка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, 1) = """" Тогда
// ПервыйКавычка = Истина;
//КонецЕсли;
Поз = Найти(ТекстJSON, ":");
Если Поз = 0 Тогда
// неверный формат, прервемся
Прервать;
КонецЕсли;
//ПредпоследнийКавычка = Ложь;
//Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда
// ПредпоследнийКавычка = Истина;
//КонецЕсли;
ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз - 1));
ИмяЗначения = СтрЗаменить(ИмяЗначения, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
Если Лев(ТекстJSON, 1) = "{" Тогда
// значение является структурой
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
// значение является массивом
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
Иначе
// обычное значение
ПервыйКавычка = Ложь;
ПредпоследнийКавычка = Ложь;
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = """" Тогда
Если ПервыйКавычка Тогда
ПредпоследнийКавычка = Истина;
Иначе
ПервыйКавычка = Истина;
КонецЕсли;
КонецЕсли;
Если (Символ = "," И ((ПервыйКавычка И ПредпоследнийКавычка) Или (Не ПервыйКавычка И Не ПредпоследнийКавычка))) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
//ПредпоследнийКавычка = Ложь;
//Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда
// ПредпоследнийКавычка = Истина;
//КонецЕсли;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
КонецЕсли;
Результат.Вставить(ИмяЗначения, Значение);
ИначеЕсли ТипДанных = "Массив" Тогда
// обычное значение
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
//ПредпоследнийКавычка = Ложь;
//Если Сред(ТекстJSON, Поз - 1, 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, "Массив");
Результат.Вставить("Значение", МассивДанных);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КодСимволаASCII(Символ)
КодUNICODE = КодСимвола(Символ);
Если ((КодUNICODE > 1039) И (КодUNICODE < 1104)) Тогда
Возврат (КодUNICODE - 848);
ИначеЕсли КодUNICODE = 8470 Тогда
Возврат 185;
ИначеЕсли КодUNICODE = 1105 Тогда
Возврат 184;
ИначеЕсли КодUNICODE = 1025 Тогда
Возврат 168;
Иначе
Возврат КодUNICODE;
КонецЕсли;
КонецФункции
Функция URLEncode(value)
table = "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14" +
"%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28" +
"%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37%38%39%3A%3B%3C" +
"%3D%3E%3F%40%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50" +
"%51%52%53%54%55%56%57%58%59%5A%5B%5C%5D%5E%5F%60%61%62%63%64" +
"%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78" +
"%79%7A%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C" +
"%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0" +
"%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4" +
"%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8" +
"%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC" +
"%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0" +
"%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF";
result = "";
length = СтрДлина( value );
Для i = 1 По length Цикл
symbol = Сред( value, i, 1 );
//code = КодСимвола( symbol );
code = КодСимволаASCII( symbol );
result = result + Сред( table, code*3 + 1, 3 );
КонецЦикла;
Возврат result;
КонецФункции
/////////////////////////РАБОТА С JSON //////////////////////////////////////////
//Функция декодирует полученный unicod текст - из ответа геокодера Рамблера
// в привычный нам
//Параметры:
// Строка
//Возвращаемое значение:
// Строка
Функция UnicodeEncode(Строка) Экспорт
Результат = Истина;
Попытка
//регулярное выражение
Рег = Новый COMОбъект("VBScript.RegExp");
Рег.IgnoreCase = Истина;
Рег.Global = Истина;
Рег.Multiline = Ложь;
Рег.Pattern = "u[0-9a-f]+";
Колекция = Рег.Execute(Строка);
Для Каждого Элемент Из Колекция Цикл
Если СтрДЛина(Элемент.value) = 1 Тогда
Продолжить;
КонецЕсли;
КодСимвола = ПереводЧислаИз16в10(Сред(ВРег(Элемент.value), 2));
Символ = Символ(КодСимвола);
Строка = СтрЗаменить(Строка, "\" + Элемент.value, Символ);
КонецЦикла;
Исключение
Результат = Ложь;
Сообщить("Ошибка преобразования из Unicode", СтатусСообщения.Информация);
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПереводЧислаИз16в10(Знач Значение)
Результат = 0;
//перевод значения в строку
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
Значение = СокрЛП(Строка(Значение));
КонецЕсли;
МаксРазрядЦелых = 0;
МаксРазрядЦелых = СтрДлина(Значение) - 1;
н = МаксРазрядЦелых;
Ин = 1;
Пока н >= 0 Цикл
ТекЗначение = СтруктураЧисел.Получить(Сред(Значение, Ин, 1)) * Pow(16, н);
Результат = Результат + ТекЗначение;
н = н - 1;
Ин = Ин + 1;
КонецЦикла;
Возврат Результат;
КонецФункции
///////////////////////////
СтруктураПоставщиковКарт = Новый Соответствие;
СтруктураПоставщиковКарт.Вставить(0, "Яндекс");
СтруктураПоставщиковКарт.Вставить(1, "Гугл");
СтруктураПоставщиковКарт.Вставить(2, "2ГИС");
СтруктураПоставщиковКарт.Вставить(3, "Рамблер");
СтруктураЧисел = Новый Соответствие;
СтруктураЧисел.Вставить("0", 0);
СтруктураЧисел.Вставить("1", 1);
СтруктураЧисел.Вставить("2", 2);
СтруктураЧисел.Вставить("3", 3);
СтруктураЧисел.Вставить("4", 4);
СтруктураЧисел.Вставить("5", 5);
СтруктураЧисел.Вставить("6", 6);
СтруктураЧисел.Вставить("7", 7);
СтруктураЧисел.Вставить("8", 8);
СтруктураЧисел.Вставить("9", 9);
СтруктураЧисел.Вставить("A", 10);
СтруктураЧисел.Вставить("B", 11);
СтруктураЧисел.Вставить("C", 12);
СтруктураЧисел.Вставить("D", 13);
СтруктураЧисел.Вставить("E", 14);
СтруктураЧисел.Вставить("F", 15);
Код Формы Управляемой:
Код 1C v 8.2 УП
&НаКлиенте
Процедура НайтиАдрес(Команда)
НайтиАдресНаКарте(ТекАдрес);
КонецПроцедуры
&НаКлиенте
Процедура ИнициализацияКарты(Команда)
ИнициализироватьКарту();
КонецПроцедуры
&НаКлиенте
Процедура СправочнаяИнформация(Команда)
Элементы.ГруппаСправка.Видимость = Не Элементы.ГруппаСправка.Видимость;
КонецПроцедуры
&НаКлиенте
Процедура Разработчик(Команда)
ЗапуститьПриложение("http://smaylukk.com.ua/?lang=Ru");
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ТипКарты = Параметры.ТипКарты;
ТекОбъект = РеквизитФормыВЗначение("Объект");
Поставщик = ТекОбъект.СтруктураПоставщиковКарт.Получить(Объект.ТипКарты);
Макет = ТекОбъект.ПолучитьМакет("Справка");
ТекстСправки = Макет.ПолучитьОбласть("Справка" + Поставщик).Область().Текст;
Справка = ТекстСправки;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.ГруппаСправка.Видимость = Ложь;
Заголовок = "Работа с картами. Поставщик - " + Поставщик;
ИнициализироватьКарту();
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
//удаление временных файлов
Для Каждого ТекЭлемент Из МассивВременныхФайлов Цикл
УдалитьФайлы(ТекЭлемент.Значение);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
//Процедура составляет имя процедуры поставщика
// и запускает ее на исполнение
//Параметры:
// НачалоИмени - Строка
Процедура ВыполнитьПроцедуруПоставщика(ИмяПроцедуры)
Выполнить ИмяПроцедуры;
КонецПроцедуры
&НаКлиенте
//процедура инициализирует карту постащика из макета
Процедура ИнициализироватьКарту()
Текст = ПолучитьТекстМакета("Макет" + Поставщик);
Эксплорер = Текст;
КонецПроцедуры
&НаСервере
Функция ПолучитьТекстМакета(ИмяМакета)
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
Результат = Макет.ПолучитьТекст();
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОчисткаКарты()
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "Reset()";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
///////////////////////////////////////////////////////////////////////
///////////////////ГЕОКОДИРОВАНИЕ И ПОИСК АДРЕСА///////////////////////
///////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура НайтиАдресНаКарте(Адрес = "")
//поиск адреса
Если Адрес = "" Тогда
Адрес = "Москва";
КонецЕсли;
// дальше пробуем с помощью геокодинга вывести данные поиска в таблицу
ТаблицаАдресов.Очистить();
ПоискАдреса(Адрес);
Если Поставщик = "Яндекс" Тогда
ПроизвестиГеокодинг_Яндекс();
ИначеЕсли Поставщик = "Гугл" Тогда
ПроизвестиГеокодинг_Гугл();
ИначеЕсли Поставщик = "Рамблер" Тогда
ПроизвестиГеокодинг_Рамблер();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоискАдреса(Адрес)
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "FindAdres(""" + Адрес + """);";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаСервере
//Процедура выводит в таблицу данные геокдинга Яндекса
//
//Параметры:
// ТекАдрес - Строка
Процедура ПроизвестиГеокодинг_Яндекс()
Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru");
ВременныйФайл = КаталогВременныхФайлов() + "Yandex_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Яндекс.Получить("/1.x/?geocode=" + ТекАдрес + "&results=10", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по яндексу адрес: " + ТекАдрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ВременныйФайл);
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
СписокText = ДокументДОМ.ПолучитьЭлементыПоИмени("text");
СписокPos = ДокументДОМ.ПолучитьЭлементыПоИмени("pos");
Если (СписокText.Количество() = 0) ИЛИ (СписокPos.Количество() = 0) Тогда
Возврат;
КонецЕсли;
Для ъ = 0 по СписокText.Количество()-1 Цикл
Координаты = СписокPos[Ъ].ТекстовоеСодержимое;
Разделитель = Найти(Координаты," ");
Широта = Число(Сред(Координаты, Разделитель + 1));
Долгота = Число(Лев(Координаты, Разделитель - 1));
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли;
стрАдрес = ТаблицаАдресов.Добавить();
Если СписокText.Количество() > ъ Тогда
стрАдрес.Адрес = СписокText[Ъ].ТекстовоеСодержимое;
стрАдрес.Широта = Широта;
стрАдрес.Долгота = Долгота;
КонецЕсли;
КонецЦикла;
МассивВременныхФайлов.Добавить(ВременныйФайл);
КонецПроцедуры
&НаСервере
//Процедура выводит в таблицу данные геокдинга Гугл
//
//Параметры:
// ТекАдрес - Строка
Процедура ПроизвестиГеокодинг_Гугл()
Гугл = Новый HTTPСоединение("maps.googleapis.com");
ВременныйФайл = КаталогВременныхФайлов() + "Google_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Гугл.Получить("/maps/api/geocode/xml?address=" + ТекАдрес + "&language=ru&sensor=false", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по Google адрес: " + ТекАдрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ВременныйФайл);
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
ТаблицаРезультатов = ДокументДОМ.ПолучитьЭлементыПоИмени("result");
Если ДокументДОМ.ПолучитьЭлементыПоИмени("status")[0].ТекстовоеСодержимое <> "OK" ИЛИ ТаблицаРезультатов.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для ТекРезультат = 0 по ТаблицаРезультатов.Количество() -1 Цикл
СписокText = ТаблицаРезультатов[ТекРезультат].ПолучитьЭлементыПоИмени("formatted_address");
ЭлементыШиротаДолгота = ТаблицаРезультатов[ТекРезультат].ПолучитьЭлементыПоИмени("location");
Широта = ЭлементыШиротаДолгота[0].ПолучитьЭлементыПоИмени("lat")[0].ТекстовоеСодержимое;
Долгота = ЭлементыШиротаДолгота[0].ПолучитьЭлементыПоИмени("lng")[0].ТекстовоеСодержимое;
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли;
стрАдрес = ТаблицаАдресов.Добавить();
стрАдрес.Широта = Широта;
стрАдрес.Долгота = Долгота;
стрАдрес.Адрес = СписокText[0].ТекстовоеСодержимое;
КонецЦикла;
МассивВременныхФайлов.Добавить(ВременныйФайл);
КонецПроцедуры
&НаСервере
//Процедура выводит в таблицу данные геокдинга Рамблер
//
//Параметры:
// ТекАдрес - Строка
Процедура ПроизвестиГеокодинг_Рамблер()
ТемпАдрес = СтрЗаменить(ТекАдрес, " ", "+");
Рамблер = Новый HTTPСоединение("maps.rambler.ru");
ВременныйФайл = КаталогВременныхФайлов() + "Рамблер_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Рамблер.Получить("/search/?&a=search&q=" + ТемпАдрес + "&n=10", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по Рамблер адрес: " + ТекАдрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
а = 1;
Т = Новый ТекстовыйДокумент;
Т.Прочитать(ВременныйФайл);
СтрокаОтвет = Т.ПолучитьТекст();
Результат = РеквизитФормыВЗначение("Объект").UnicodeEncode(СтрокаОтвет);
Если Результат Тогда
СтруктураJSON = РеквизитФормыВЗначение("Объект").ЗаполнитьСтруктуруИзОтветаJSON(СтрокаОтвет);
КонецЕсли;
МассивРезультатов = СтруктураJSON.res;
//обрабатываем элементы массива - только адреса. POI можно обработать отдельно пожеланию
Для Каждого Результат Из МассивРезультатов Цикл
Для Каждого ТекРезультат Из Результат.matches Цикл
стрАдрес = ТаблицаАдресов.Добавить();
стрАдрес.Долгота = Число(ТекРезультат.x);
стрАдрес.Широта = Число(ТекРезультат.y);
Если Результат.type = "addr" Тогда //Результат.type = "poi" - содержит в себе список точек интереса
стрАдрес.Адрес = ТекРезультат.addr;
Иначе
стрАдрес.Адрес = ТекРезультат.name + " - " + ТекРезультат.addr;
КонецЕсли;
КонецЦикла;
КонецЦикла;
МассивВременныхФайлов.Добавить(ВременныйФайл);
КонецПроцедуры
&НаКлиенте
Процедура ОбратнПоискАдреса(Широта, Долгота, Адрес)
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "ReverseSearchAdres(" + Широта + "," + Долгота + ", """ + Адрес + """);";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаАдресовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ТаблицаАдресов[ВыбраннаяСтрока].Широта) И ЗначениеЗаполнено(ТаблицаАдресов[ВыбраннаяСтрока].Долгота) Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
Широта = Формат(ТаблицаАдресов[ВыбраннаяСтрока].Широта, "ЧЦ=10; ЧДЦ=7; ЧРД=.; ЧРГ=");
Долгота = Формат(ТаблицаАдресов[ВыбраннаяСтрока].Долгота, "ЧЦ=10; ЧДЦ=7; ЧРД=.; ЧРГ=");
ОбратнПоискАдреса(Широта, Долгота, ТаблицаАдресов[ВыбраннаяСтрока].Адрес);
КонецПроцедуры
&НаКлиенте
Процедура ТекАдресПриИзменении(Элемент)
НайтиАдресНаКарте(ТекАдрес);
КонецПроцедуры
///////////////////////////////////////////////////////////////////////
///////////////////МАРШРУТИЗАЦИЯ, КЛАСТЕРА И ПОЛИГОН///////////////////////////////////////
///////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ЭксплорерПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
ПолучитьКоординаты();
КонецПроцедуры
&НаКлиенте
Процедура ПостроитьМаршрут(Команда)
Если ТаблицаТочек.Количество() <= 1 Тогда
Предупреждение("Недостаточно точек для построение маршрута!");
Возврат;
КонецЕсли;
Если Поставщик = "Яндекс" Тогда
ПостроитьМаршрут_Яндекс();
ИначеЕсли Поставщик = "Гугл" Тогда
ПостроитьМаршрут_Гугл();
ИначеЕсли Поставщик = "Рамблер" Тогда
ПостроитьМаршрут_Рамблер();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
//Процедура выстраивает маршрут для Яндекса
//
//Параметры:
//
Процедура ПостроитьМаршрут_Яндекс()
ПараметрыМаршрута = ПолучитьПараметрыМаршрутаЯндекс();
ОчисткаКарты();
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "calcRoute(" + ПараметрыМаршрута + ")";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
//Функция получает массив точек, для передачи параметров в Яндекс
//
//Параметры:
//
//Возвращаемое значение:
// Строка
Функция ПолучитьПараметрыМаршрутаЯндекс()
Результат = "";
Результат = Результат + "[[" + СтрЗаменить(Строка(ТаблицаТочек[0].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[0].Долгота), ",", ".") + "],";
Для Ин = 1 По ТаблицаТочек.Количество() - 2 Цикл
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ин].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ин].Долгота), ",", ".") + "],";
КонецЦикла;
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Долгота), ",", ".") + "]]";
Возврат Результат;
КонецФункции
&НаКлиенте
//Процедура выстраивает маршрут для Гугл
//
//Параметры:
//
Процедура ПостроитьМаршрут_Гугл()
ПараметрыМаршрута = ПолучитьПараметрыМаршрутаГугл();
ОчисткаКарты();
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "calcRoute(" + ПараметрыМаршрута + ")";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
//Функция получает массив точек, для передачи параметров в Гугл
//
//Параметры:
//
//Возвращаемое значение:
// Строка
Функция ПолучитьПараметрыМаршрутаГугл()
Результат = "";
ВнутрМассив = "";
Результат = Результат + "[[" + СтрЗаменить(Строка(ТаблицаТочек[0].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[0].Долгота), ",", ".") + "],";
Если ТаблицаТочек.Количество() = 2 Тогда
Результат = Результат + "[],";
Иначе
Для Ин = 1 По ТаблицаТочек.Количество() - 2 Цикл
ВнутрМассив = ВнутрМассив + "[" + СтрЗаменить(Строка(ТаблицаТочек[ин].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ин].Долгота), ",", ".") + "],";
КонецЦикла;
Результат = Результат + "[" + Сред(ВнутрМассив, 1, СтрДлина(ВнутрМассив) - 1) + "],";
КонецЕсли;
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Долгота), ",", ".") + "]]";
Возврат Результат;
КонецФункции
&НаКлиенте
//Процедура выстраивает маршрут для Рамблера
//
//Параметры:
//
Процедура ПостроитьМаршрут_Рамблер()
ПараметрыМаршрута = ПолучитьПараметрыМаршрутаРамблер();
ОчисткаКарты();
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "calcRoute(" + ПараметрыМаршрута + ")";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
//Функция получает массив точек, для передачи параметров в Рамблер
//
//Параметры:
//
//Возвращаемое значение:
// Строка
Функция ПолучитьПараметрыМаршрутаРамблер()
Результат = "";
Результат = Результат + "[[" + СтрЗаменить(Строка(ТаблицаТочек[0].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[0].Долгота), ",", ".") + "],";
Для Ин = 1 По ТаблицаТочек.Количество() - 2 Цикл
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ин].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ин].Долгота), ",", ".") + "],";
КонецЦикла;
Результат = Результат + "[" + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Широта), ",", ".") + "," + СтрЗаменить(Строка(ТаблицаТочек[ТаблицаТочек.Количество() - 1].Долгота), ",", ".") + "]]";
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура СоздатьКластер(Команда)
Если ТаблицаТочек.Количество() <= 1 Тогда
Предупреждение("Недостаточно точек для построение кластера!");
Возврат;
КонецЕсли;
ОчисткаКарты();
ПостроитьКластера();
КонецПроцедуры
&НаКлиенте
Процедура ПостроитьКластера()
Кол = ТаблицаТочек.Количество();
Индекс = 1;
Для Каждого ТекСтрока Из ТаблицаТочек Цикл
Широта = формат(ТекСтрока.Широта, "ЧРД=.");
Долгота = формат(ТекСтрока.Долгота, "ЧРД=.");
СодержимоеТочки = "Содерижмое точки"; //опять же можно вставить свое название
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "addToPointArray(" + Широта + "," + Долгота + ", '" + ТекСтрока.Точка + "', """ + СодержимоеТочки + """);";
Элементы.Эксплорер.document.getElementById("WebClient").click();
Состояние("Обработан " + Индекс + " из " + кол);
Индекс = Индекс + 1;
КонецЦикла;
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "drawCluster();";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьВсе(Команда)
ОчисткаКарты();
ТаблицаТочек.Очистить();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьКарту(Команда)
ОчисткаКарты();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьТаблицу(Команда)
ТаблицаТочек.Очистить();
КонецПроцедуры
&НаКлиенте
//Процедура получает координаты установленной точки
Процедура ПолучитьКоординаты()
Попытка
ЧислоТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 12));
КоординатаX = Элементы.Эксплорер.document.getElementById("CoordX").value;
КоординатаX = ЧислоТип.ПривестиЗначение(КоординатаX);
КоординатаY = Элементы.Эксплорер.document.getElementById("CoordY").value;
КоординатаY = ЧислоТип.ПривестиЗначение(КоординатаY);
Кол = ТаблицаТочек.Количество();
Если КоординатаX > 0 И КоординатаY > 0 И (Кол = 0 Или КоординатаX <> ТаблицаТочек[Кол - 1].Широта И КоординатаY <> ТаблицаТочек[Кол - 1].Долгота) Тогда
НоваяСтрока = ТаблицаТочек.Добавить();
НоваяСтрока.Точка = "Точка" + ТаблицаТочек.Количество();
НоваяСтрока.Широта = КоординатаX;
НоваяСтрока.Долгота = КоординатаY;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПострениеПолигона(Команда)
Если ТаблицаТочек.Количество() <= 1 Тогда
Предупреждение("Недостаточно точек для построение полигона!");
Возврат;
КонецЕсли;
ОчисткаКарты();
ПостроитьПолигон();
КонецПроцедуры
&НаКлиенте
//Процедура выстраивает маршрут для Рамблера
//
//Параметры:
//
Процедура ПостроитьПолигон()
МассивТочек = "[";
Для Каждого ТекТочка Из ТаблицаТочек Цикл
Широта = формат(ТекТочка.Широта, "ЧРД=.");
Долгота = формат(ТекТочка.Долгота, "ЧРД=.");
МассивТочек = МассивТочек + "[" + Широта + "," + Долгота + "],";
КонецЦикла;
МассивТочек = Сред(МассивТочек, 1, СтрДлина(МассивТочек) - 1) + "]";
Цвет16 = Получить16Цвет();
Название = "Полигон";//вставить свое
Элементы.Эксплорер.document.getElementById("WebClientOperation").value = "createPolygon(" + МассивТочек + ", '" + Название + "', '" + Цвет16 + "');";
Элементы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
&НаСервере
//Функция возвращает значение случайного цвета в 16-ричном формате
//
//Параметры:
// нет
//Возвращаемое значение:
// Строка
Функция Получить16Цвет()
Результат = "";
Строка16 = "0123456789ABCDEF";
ГСЧ = Новый ГенераторСлучайныхЧисел;
Результат = "#";
Для н = 1 По 6 Цикл
м = ГСЧ.СлучайноеЧисло(1, 16);
Результат = Результат + Сред(Строка16, м, 1);
КонецЦикла;
Возврат Результат;
КонецФункции
Категория:
COM-объекты, WMI, WSH Фунции отвечающие за обмен данных с формой на сервере. РеквизитФормыВЗначение - Преобразует указанный реквизит формы в объект прикладного типа.
Код 1C v 8.2 УП &НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ПеречитатьДанныеПоСертификатам(ДокументОбъект);
КонецПроцедуры
ЗначениеВРеквизитФормы – Преобразует объект прикладного типа в реквизит
управляемой формы
Код 1C v 8.2 УП // При изменении реквизитов
&НаСервере
Процедура ПриИзмененииПартнераСервер()
СправочникОбъект = РеквизитФормыВЗначение("Объект");
СправочникОбъект.ЗаполнитьУсловияПродажПоУмолчанию();
ЗначениеВРеквизитФормы(СправочникОбъект, "Объект");
УстановитьВидимостьЭлементовПоРегулярностиСервер();
КонецПроцедуры
ДанныеФормыВЗначение – Преобразует данные формы в объект прикладного типа.
Код 1C v 8.2 УП &НаСервере
Функция НовыйЭлементСправочника()
СправочникОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Номенклатура"));
СправочникОбъект.Записать();
............................
ЗначениеВДанныеФормы – Преобразует объект прикладного типа в универсальный объект данных.
Код 1C v 8.2 УП &НаСервере
Процедура НовыйЧекНаСервере()
НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
НовыйЧек.Партнер = Справочники.Партнеры.РозничныйПокупатель;
НовыйЧек.ОбработкаЗаполнения(Новый Структура("КассаККМ", Объект.КассаККМ), Истина);
ЗначениеВДанныеФормы(НовыйЧек, Объект);
Категория:
Управляемое приложение, Тонкий клиент