COM-подключение к базе 7.7 из .NET, .NET Core Инсталяция:> dotnet add package sabatex.V1C77
или добавить через NUGET пакет sabatex.V1C77.
Добавить пространство имен: using sabatex.V1C77;
пример использованя: ---C#
static void Main(string[] args) { // создаём строку соединения var connection = new sabatex.V1C77.Models.Connection { DataBasePath = @"C:\demo\1SBUKRD", // путь к базе PlatformType = sabatex.V1C77.Models.EPlatform1C.V77M, // платформа 1С77 UserName = "Админов", // имя пользователя UserPass = "" // пароль или пустая строка }; // соединяемся с 1С77 // using (var _1c77 = sabatex.V1C77.COMObject1C77.CreateConnection(connection)) { // перебор всего справочника Контрагенты var contr = _1c77.GlobalContext.CreateObject("Справочник.Контрагенты"); if (contr.Method<double>("ВыбратьЭлементы") == 1) { while (contr.Method<double>("ПолучитьЭлемент")==1) { if (contr.Method<double>("ЭтоГруппа") == 1) continue; var name = contr.GetProperty<string>("Наименование"); Console.WriteLine(name); } } } } [/pre] соответствие типов данных 1С7.7 и C#
строка - string число - doubl дата - DataTime остальное - V1C77COMObject
возможно использовать bool для замены double(0- false;1 - true) тогда выражение сократится к if (contr.Method("ВыбратьЭлементы"))
Категория:
OLE, ActiveX Отправка почты через Mail.ru с использованием технологии шифрования SSL Часто клиенты просят сделать автоматическую отправку счетов или отчетов на электронную почту, ниже приведены примеры кода для разных версий 1С:
Код 1C v 8.3
Функция ПолучитьПрофильПочты()
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль. АдресСервераSMTP = "smtp.mail.ru" ;
Профиль. АдресСервераPOP3 = "pop.mail.ru" ;
Профиль. ПортPOP3 = 995 ;
Профиль. ПортSMTP = 465 ;
Профиль. Пользователь = "s_v@inbox.ru" ;
Профиль. Пароль = "8mFTnDjC4KftTzh" ;
Профиль. ПользовательSMTP = "s_v@inbox.ru" ;
Профиль. ПарольSMTP = "8mFTnDjC4KftTzh" ;
Профиль. АутентификацияSMTP = СпособSMTPАутентификации. Login;
Профиль. ИспользоватьSSLPOP3 = Истина ;
Профиль. ИспользоватьSSLSMTP = Истина ;
Возврат Профиль;
КонецФункции
Процедура ОсновныеДействияФормыСчетОтправитьНаПочту(Кнопка)
Если ЗначениеЗаполнено( Ответственный. ПочтаДляОтправкиСчета) Тогда
Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;
Текст = Письмо. Тексты. Добавить( "В приложении счет" ) ;
Текст. ТипТекста = ТипТекстаПочтовогоСообщения. ПростойТекст;
Письмо. Тема = Строка( Ссылка) ;
Письмо. Отправитель = "s_vmeste@inbox.ru" ;
Письмо. ИмяОтправителя = "1С" ;
Письмо. Получатели. Добавить( Ответственный. ПочтаДляОтправкиСчета) ;
врфайл= ПолучитьИмяВременногоФайла( "pdf" ) ;
текТабдок= СчетФаксимилеТовары( ) ;
текТабдок. Записать( врфайл, ТипФайлаТабличногоДокумента. PDF) ;
Письмо. Вложения. Добавить( врфайл) ;
Попытка
Почта. Подключиться( ПолучитьПрофильПочты( ) ) ; Почта. Послать( Письмо) ; Предупреждение( "Письмо отправлено" , 3 ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
КонецПопытки ;
Почта. Отключиться( ) ;
Письмо. Вложения. Очистить( ) ;
Иначе
Предупреждение( "В настройках ответственного не указана почта для отправки счета" ) ;
КонецЕсли ;
КонецПроцедуры
С версиями 8.2 сложнее, так как все почтовые сервисы перешли на SSL, а медоты:
Код 1C v 8.3 Профиль. ИспользоватьSSLPOP3 = Истина ;
Профиль. ИспользоватьSSLSMTP = Истина ;
появились только в 8.3.1 , остается использовать stunnel или CDO :
Код 1C v 8.2 УП
Функция ПослатьПоПочте(Знач Адрессаты, ТемаСообщения = "" ,ТекстСообщения = "" ,СписокВложений = "" ) Экспорт
Оправитель = "s_v@inbox.ru" ;
Пароль = "8mFTnDjC4KftTzh" ;
loConfig = Новый COMОбъект( "CDO.Configuration" ) ;
loCdoMessage = Новый COMОбъект( "CDO.Message" ) ;
loCdoMessage. Configuration = loConfig;
loCdoMessage. From = Строка( "1С <" + Оправитель+ ">" ) ;
loCdoMessage. To = Адрессаты;
loCdoMessage. Subject = ? ( ТемаСообщения= "" , "1С" , ТемаСообщения) ;
loCdoMessage. TextBody = "1C" ;
HTMLBody = "<html>
|<head>
|<meta content="" text/html; charset=Windows-1251"" http-equiv="" content-type"" >
|<title> Тестовое сообщение </title>
|</head>
|<body>
|<h4>" + ТекстСообщения + "</h4>
|<p></p>
|</body>
|</html>" ;
loCdoMessage. HTMLBody = HTMLBody;
Если ТипЗнч( СписокВложений) = Тип( "Строка" ) И Не СписокВложений = "" Тогда
Попытка
loCdoMessage. AddAttachment( СписокВложений) ;
Исключение
КонецПопытки ;
ИначеЕсли ТипЗнч( СписокВложений) = Тип( "СписокЗначений" ) Тогда
Для каждого ПутьКВложению Из СписокВложений Цикл
Попытка
loCdoMessage. AddAttachment( ПутьКВложению. Значение) ;
Исключение
КонецПопытки ;
КонецЦикла ;
КонецЕсли ;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/sendusing" ) . Value = 2 ;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ) . Value = "smtp.mail.ru" ;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ) . Value = "465" ;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ) . Value = 1 ;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/sendusername" ) . Value = Оправитель;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ) . Value = Пароль;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ) . Value = 1 ;
loConfig. Fields. Item( "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout" ) . Value = 60 ;
loConfig. Fields. Update( ) ;
Попытка
loCdoMessage. Send( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат Ложь ;
КонецПопытки ;
КонецФункции
Процедура ОсновныеДействияФормыСчетТовары(Кнопка)
Если ЗначениеЗаполнено( Менеджер. ПочтаДляОтправкиСчета) Тогда
врфайл= ПолучитьИмяВременногоФайла( "xls" ) ;
текТабдок= СчетФаксимилеТовары( ) ;
текТабдок. Записать( врфайл, ТипФайлаТабличногоДокумента. XLS) ;
ПослатьПоПочте( Менеджер. ПочтаДляОтправкиСчета, Строка( Ссылка) , "Счет в приложении" , врфайл) ;
Предупреждение( "Письмо отправлено" , 3 ) ;
Иначе
Предупреждение( "В настройках ответственного не указана почта для отправки счета" ) ;
КонецЕсли ;
КонецПроцедуры
Через stunnel в 1С код, менять не нужно, только установить программу и изменить настройки подключения к почтовому ящику
Скачиваем stunnel c официального сайта (stunnel.org) и запускаем инсталятор, жмем yes при установке спросит страну и ваши данные, это нужно для создания сертификата на вашем компьютере.
После запуска в трее появится его иконка, правой клавишей и редактировать edit configuration
В блокноте откроется файл настроек, там будет пример для gmail дополняем или заменяем его следующим:
Код Batch File (DOS, CMD, BAT) [gmail-pop3]
client = yes
accept = 127 .0 .0 .1 :10110
connect = pop.gmail.com:995
[gmail-imap]
client = yes
accept = 127 .0 .0 .1 :10143
connect = imap.gmail.com:993
[gmail-smtp]
client = yes
accept = 127 .0 .0 .1 :10025
connect = smtp.gmail.com:465
[yandex-pop3]
client = yes
accept = 127 .0 .0 .1 :20110
connect = pop.yandex.ru:995
[yandex-imap]
client = yes
accept = 127 .0 .0 .1 :20143
connect = imap.yandex.ru:993
[yandex-smtp]
client = yes
accept = 127 .0 .0 .1 :20025
connect = smtp.yandex.ru:465
[mail-pop3]
client = yes
accept = 127 .0 .0 .1 :30110
connect = pop.mail.ru:995
[mail-imap]
client = yes
accept = 127 .0 .0 .1 :30143
connect = imap.mail.ru:993
[mail-smtp]
client = yes
accept = 127 .0 .0 .1 :30025
connect = smtp.mail.ru:465
Сохраняем файл и делаем Reload configuration
В настройка 1С меняем порты для работы
gmail
pop3 10110
imap 10143
smtp 10025
yandex
pop3 20110
imap 20143
smtp 20025
mail
pop3 30110
imap 30143
smtp 30025
Если в коде прописано, то:
Код 1C v 8.х Функция ПолучитьПрофильПочты()
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль. АдресСервераSMTP = "localhost" ;
Профиль. АдресСервераPOP3 = "localhost" ;
Профиль. ПортPOP3 = 30110 ;
Профиль. ПортSMTP = 30025 ;
Профиль. Пользователь = "s_v@inbox.ru" ;
Профиль. Пароль = "8mFTnDjC4KftTzh" ;
Профиль. ПользовательSMTP = "s_v@inbox.ru" ;
Профиль. ПарольSMTP = "8mFTnDjC4KftTzh" ;
Профиль. АутентификацияSMTP = СпособSMTPАутентификации. Login;
Возврат Профиль;
КонецФункции
Все, можно отправлять и проверять работу через консоль Show log window в меню
P.S. Почтовый ящик в примерах не рабочий, как пример
Категория:
Работа с Интернет, Почтой (Mail), FTP Проверка на дублирование контрагентов по ИНН и КПП Часто клиенты просят включить при записи контрагента проверку на дублирование, в некоторых конфигурациях это встроенный функционал, а если этого нет, то:
1. Создаем общий модуль
и помещаем в него процедуру:
Код 1C v 8.3
Процедура ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения(ИНН, КПП, Источник, Отказ) Экспорт
Если Не ЗначениеЗаполнено( ИНН) ИЛИ Не ЗначениеЗаполнено( КПП) Тогда
Возврат ;
КонецЕсли ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(Контрагенты.Код) КАК Код,
| Контрагенты.Наименование,
| ПРЕДСТАВЛЕНИЕ(Контрагенты.КПП) КАК КПП
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН =ИНН
| И Контрагенты.КПП =КПП" ;
Если Не ЗначениеЗаполнено( Источник) Тогда
Запрос. Текст = Запрос. Текст + "
|И Контрагенты.Ссылка <>ссылкаТекущийКонтрагент" ;
КонецЕсли ;
Запрос. УстановитьПараметр( "ссылкаТекущийКонтрагент" , Источник) ;
Запрос. УстановитьПараметр( "ИНН" , ИНН) ;
Запрос. УстановитьПараметр( "КПП" , КПП) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Если Не РезультатЗапроса. Пустой( ) Тогда
ТекстСообщения = "ВНИМАНИЕ! Существуют контрагенты с таким же ИНН/КПП (" + ИНН+ "/" + КПП+ "):" ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
ТекстСообщения = ТекстСообщения + Символы. ПС + Строка( ВыборкаДетальныеЗаписи. Код) + " " + Строка( ВыборкаДетальныеЗаписи. Наименование) ;
КонецЦикла ;
Сообщение = Новый СообщениеПользователю;
Сообщение. Текст = ТекстСообщения;
Сообщение. Сообщить( ) ;
Отказ = Истина ;
КонецЕсли ;
КонецПроцедуры
2. в форме контрагента в процедуру перед записью добавляем:
Код 1C v 8.3 Процедура ПередЗаписью(Отказ)
мЭтоНовый = ЭтоНовый( ) ;
мИНН = Ссылка. ИНН;
Если ОбособленноеПодразделение И ЗначениеЗаполнено( ГоловнойКонтрагент) И ГоловнойКонтрагент < > Ссылка Тогда
ИНН = ГоловнойКонтрагент. ИНН;
КонецЕсли ;
all4cf. ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения( ИНН, КПП, Ссылка, Отказ) ;
КонецПроцедуры
Результат:
Категория:
Полезные, Универсальные Функции Пример создания SQL запроса к EXEL. Код 1C v 8.3 [c83]
Здесь я расскажу как правильно формировать SQL запрос к EXEL дабы правильно подрубаться через разные методы подключения и создания ComОбьектов, так как в инете много разного пишут по этому поводу но конкретики что делать нет. . . .
Приступим, создаем или открываем заполненную таблицу exel, далее заходим во вкладку данные выбираем "Из других источников и выбираем ИЗ Microsoft Quer" далее выбираете источник Базы Данных "Exel Files" далее будет выбор книги не стал делать скрин так как там просто нужно выбрать файл какой мы открываем( "Пользователь /ПутьФайла/Файл" ) , далее появится форма создания запроса здесь выбираем нужный лист жмем стрелку переноса в столбцы запроса жмём далее, пропускаем все предложенные варианты, так как там будет предрлагатся задать правило отбора данных, порядок сортировки и тп. задача стояла в простом запросе так что пропускаем все условия, далее на заключительном шаге выбираем "Просмотр или изменение данных Microsoft Quer" жмём готово.
Откроется "Microsoft Query" представляет собой программу для переноса данных из внешних источников в программы Microsoft Office, в частности Microsoft Excel - это из справки о программе, а на деле это программа дает возможность строить правильный запрос к exel как сложные так и простые, о построении сложных подробнее можно почитать в справке о программе, а чтобы увидеть как обратится к exel из 1 с достаточно нажать кнопку SQL так называемый режим SQL и мы увидим запрос SQL который можно использовать при написании выгрузки и загрузки exel. . . в моём случае загрузка в бд через ADODB. Connection упиралась в SQLзапрос, так как я не мог его построить правильно, а здесь уже готовый запрос который подходит по синтаксису к 1 с.
Пример кода чтения EXEL.
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл= Новый Файл( ПутьКФайлу) ;
Если Файл. Существует( ) Тогда Стр_Файл= Файл. ПолноеИмя;
Если Прав( Стр_Путь, 1 ) = "\" Тогда Стр_Путь= Лев( Стр_Путь, СтрДлина( Стр_Путь) - 1 ) ;
КонецЕсли ;
|DriverId=790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект( "ADODB.Connection" ) ;
Попытка Об_Конект. Open( Стр_Конект) ;
Исключение Сообщить( ОписаниеОшибки( ) ) ;
Сообщить ( "Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл [" + Стр_Файл+ "] открыт другим пользователем." ) ;
Возврат Ложь ; КонецПопытки ;
Стр_SQL = "SELECT `Лист1$`.Город,`Лист1$`.Заправка FROM`C:\Users\User_scan\Desktop\файл.xls`.`Лист1$``Лист1$`" ;
Об_РекордСет = Новый COMОбъект( "ADODB.Recordset" ) ;
Попытка Об_РекордСет= Об_Конект. Execute( Стр_SQL) ;
Исключение Сообщить( "Не удадлось выполнить запрос к файлу Excel
|" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Номер = 1 ;
Пока НЕ Об_РекордСет. EOF Цикл
Для каждого ОБ_Поле Из Об_РекордСет. Fields Цикл
КонецЦикла ;
КонецЦикла ;
Сообщить( Номер) ;
Об_Конект. Close( ) ;
Об_Конект= Неопределено ;
Об_РекордСет= Неопределено ;
Возврат Истина ;
Иначе Сообщить( "Файл " + ПутьКФайлу+ " не найден!" ) ;
Возврат Ложь ;
КонецЕсли ;
КонецФункции
[/pre]
Категория:
COM-объекты, WMI, WSH Преобразование ТаблицыЗначений во временную таблицу Код 1C v 8.х Процедура ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
ТипизированнаяТЗ = Новый ТаблицаЗначений;
Для й= 1 По Тз. Количество( ) Цикл ТипизированнаяТЗ. Добавить( ) ;
КонецЦикла ;
ДЗТипов = Новый ДеревоЗначений;
ДЗТипов. Колонки. Добавить( "ИмяКолонки" ) ;
ДЗТипов. Колонки. Добавить( "ТипЗначений" ) ;
Для Каждого Колонка из Тз. Колонки Цикл
СтрокаКолонки = ДЗТипов. Строки. Добавить( ) ;
СтрокаКолонки. ИмяКолонки = Колонка. Имя;
ТекСТрокаТипа = СтрокаКолонки. Строки. Добавить( ) ;
ТекСТрокаТипа. ИмяКолонки = Колонка. Имя;
ТекСТрокаТипа. ТипЗначений = ТипЗнч( тз[0 ][Колонка. Имя]) ;
Для Каждого СтокаТЗ из Тз Цикл
ТекТип = ТипЗнч( СтокаТЗ[Колонка. Имя]) ;
Если НЕ ТекТип = ТекСТрокаТипа. ТипЗначений Тогда
Если СтрокаКолонки. Строки. Найти( ТекТип, "ТипЗначений" ) = Неопределено Тогда
ТекСТрокаТипа = СтрокаКолонки. Строки. Добавить( ) ;
ТекСТрокаТипа. ИмяКолонки = Колонка. Имя;
ТекСТрокаТипа. ТипЗначений = ТекТип;
КонецЕслИ ;
КонецЕслИ ;
КонецЦикла ;
МассивТипов = СтрокаКолонки. Строки. ВыгрузитьКолонку( "ТипЗначений" ) ;
ТипизированнаяТЗ. Колонки. Добавить( Колонка. Имя, Новый ОписаниеТипов( МассивТипов) , Колонка. Заголовок) ;
ТипизированнаяТЗ. ЗагрузитьКолонку( Тз. ВыгрузитьКолонку( Колонка) , Колонка. Имя) ;
КонецЦикла ;
КонецПроцедуры
Источник
Категория:
Запросы Скрипт автообновления типовых конфигураций Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. Подойдет как рабочая заготовка для собственных "обновляторов". В текущем виде все работает. Надо только занести свои переменные.
Код 1C v 8.3
Перем мРасположениеОбновлений;
Перем мИтсЛогин;
Перем мИтсПароль;
Перем home;
Перем DumpIB;
Перем ФайлСписокОбновленийZIP;
Перем ФайлСписокОбновленийXML;
Перем КодВозврата;
Функция ФайлСуществует(Знач ПутьКФайлу) Экспорт
Файл = Новый Файл( ПутьКФайлу) ;
Возврат Файл. Существует( ) ;
КонецФункции
Процедура УстановитьКонстанты()
каталог_tmplts = "D:\tmplts" ;
мИтсЛогин = "---" ;
мИтсПароль = "---" ;
мРасположениеОбновлений = каталог_tmplts + "\1c" ;
home = каталог_tmplts + "\1Cupdate" ;
DumpIB = home + "\DumpIB\" ;
ФайлСписокОбновленийXML = home + "\v8cscdsc.xml" ;
ФайлСписокОбновленийZIP = home + "\v8upd11.zip" ;
Если НЕ ФайлСуществует( home) Тогда
СоздатьКаталог( home) ;
КонецЕсли ;
Если НЕ ФайлСуществует( DumpIB) Тогда
СоздатьКаталог( DumpIB) ;
КонецЕсли ;
Если НЕ ФайлСуществует( мРасположениеОбновлений) Тогда
СоздатьКаталог( мРасположениеОбновлений) ;
КонецЕсли ;
КонецПроцедуры
Функция ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
ПараметрыБазы = Неопределено ;
Попытка
COMОбъект = Новый COMОбъект( "V" + мВерсияПлатформы+ ".COMConnector" ) ;
Исключение
Сообщить( "Не удалось создать COM-объект!" ) ;
Возврат ПараметрыБазы;
КонецПопытки ;
ПутьКБазе = "srvr="" " + СокрЛП( мИмяСервера) + """ ;" + "ref="" " + СокрЛП( мИмяБазы) + """ ;" ;
СтрокаСоединения = ПутьКБазе + "Usr="" " + СокрЛП( мБазаЛогин) + """ ;" + "Pwd="" " + СокрЛП( мБазаПароль) + """ ;" ;
Попытка
V82 = COMОбъект. Connect( СтрокаСоединения) ;
Исключение
Сообщить( СтрокаСоединения) ;
Сообщить( "Внешнее соединение не установлено!" ) ;
Возврат ПараметрыБазы;
КонецПопытки ;
ПараметрыБазы = Новый Структура;
ПараметрыБазы. Вставить( "ТекущаяВерсия" , v82. Метаданные. Версия) ;
ПараметрыБазы. Вставить( "ПутьКПлатформе" , v82. КаталогПрограммы( ) + "1cv8.exe" ) ;
Возврат ПараметрыБазы;
КонецФункции
Процедура УстановитьCOMСоединение(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Попытка
COMОбъект = Новый COMОбъект( "V" + мВерсияПлатформы+ ".COMConnector" ) ;
Исключение
Сообщить( "Не удалось создать COM-объект!" ) ;
Возврат ;
КонецПопытки ;
ПутьКБазе = "srvr="" " + СокрЛП( мИмяСервера) + """ ;" +
"ref="" " + СокрЛП( мИмяБазы) + """ ;" ;
СтрокаСоединения = ПутьКБазе +
"Usr="" " + СокрЛП( мБазаЛогин) + """ ;" +
"Pwd="" " + СокрЛП( мБазаПароль) + """ ;" ;
Сообщить( СтрокаСоединения) ;
Попытка
V82 = COMОбъект. Connect( СтрокаСоединения) ;
Исключение
Сообщить( СтрокаСоединения) ;
Сообщить( "Внешнее соединение не установлено!" ) ;
Возврат ;
КонецПопытки ;
КонецПроцедуры
Функция ВыполнитьЗагрузкуСпискаОбновлений(ИмяФайлаЗагрузки,ТекущаяВерсияКонфигурации)
СообщениеОбОшибке = "Ошибка при чтении файла списка обновлений." ;
Если НЕ ФайлСуществует( ИмяФайлаЗагрузки) Тогда
Сообщить( "Нету XML файла (списка обновлений)" ) ;
Возврат Неопределено ;
КонецЕсли ;
ВерсияДляОбновления = Неопределено ;
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ИмяФайлаЗагрузки) ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
ДатаФормирования = ЧтениеXML. Значение;
ЧтениеXML. Прочитать( ) ;
Пока ЧтениеXML. Прочитать( ) Цикл
Если ЧтениеXML. Имя = "v8u:updateList" Тогда
Прервать ;
Иначе
Конфигурация = ЧтениеXML. ПолучитьАтрибут( "configuration" ) ;
Пока ЧтениеXML. Прочитать( ) Цикл
Если ЧтениеXML. Имя = "v8u:update" Тогда
Прервать ;
Иначе
Если ЧтениеXML. Имя = "v8u:vendor" Тогда
ЧтениеXML. Прочитать( ) ;
Поставщик = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:version" Тогда
ЧтениеXML. Прочитать( ) ;
Версия = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:file" Тогда
ЧтениеXML. Прочитать( ) ;
ПутьКФайлуОбновления = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:size" Тогда
ЧтениеXML. Прочитать( ) ;
РазмерФайлаОбновления = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:target" Тогда
ЧтениеXML. Прочитать( ) ;
Если ЧтениеXML. Значение = ТекущаяВерсияКонфигурации Тогда
ВерсияДляОбновления = Версия;
КонецЕсли ;
КонецЕсли ;
ЧтениеXML. Прочитать( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Исключение
Сообщить( СообщениеОбОшибке) ;
ЧтениеXML. Закрыть( ) ;
Возврат Неопределено ;
КонецПопытки ;
ЧтениеXML. Закрыть( ) ;
Возврат ВерсияДляОбновления;
КонецФункции
Процедура ПроверитьОбновлениеКонфигурации(мИмяСервера,мИмяБазы,мТипКонфигурации,мВерсияРелиза,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Сообщить( "----------------------------------------------------------------------" ) ;
УдалитьФайлы( ФайлСписокОбновленийXML) ;
УдалитьФайлы( ФайлСписокОбновленийZIP) ;
СерверОбновлений = Новый HTTPСоединение( "downloads.1c.ru" , , мИтсЛогин, мИтсПароль, ) ;
ЗапросКСерверуОбновлений = Новый HTTPЗапрос( "/ipp/ITSREPV/V8Update/Configs/" + мТипКонфигурации+ "/" + мВерсияРелиза+ "/" + мВерсияПлатформы+ "/v8upd11.zip" ) ;
СерверОбновлений. Получить( ЗапросКСерверуОбновлений, ФайлСписокОбновленийZIP) ;
ФайлZip = Новый ЧтениеZipФайла( ФайлСписокОбновленийZIP) ;
ФайлZip. ИзвлечьВсе( home) ;
ФайлZip. Закрыть( ) ;
УдалитьФайлы( ФайлСписокОбновленийZIP) ;
ПараметрыComБазы = ВернутьРелизИПлатформу( мИмяСервера, мИмяБазы, мВерсияПлатформы, мБазаЛогин, мБазаПароль) ;
Если ПараметрыComБазы = Неопределено Тогда
Возврат ;
КонецЕсли ;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений( ФайлСписокОбновленийXML, ПараметрыComБазы. ТекущаяВерсия) ;
ТребуетсяОбновление = Ложь ;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ" ) ;
Возврат ;
КонецЕсли ;
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " update: " + ВерсияДляОбновления) ;
КомандаПакетногоАрхивирования = """ " + ПараметрыComБазы. ПутьКПлатформе + """ " + " CONFIG /S" + мИмяСервера+ "\" + мИмяБазы+ " /N"" " + мБазаЛогин+ """ /P"" " + мБазаПароль+ """ /DumpIB " + DumpIB + мИмяБазы + ".dt /OUT "" " + home+ "\" + мИмяБазы+ ".log"" -NoTruncate" ;
ЗапуститьПриложение( КомандаПакетногоАрхивирования, , Истина , КодВозврата) ;
Если КодВозврата = 0 Тогда
Сообщить( "Резервная копия успешно создана." ) ;
Иначе
Сообщить( "Ошибка при создании резервной копии" ) ;
Возврат ;
КонецЕсли ;
Версия_Для_Обновления = СтрЗаменить( ВерсияДляОбновления, "." , "_" ) ;
Если НЕ ФайлСуществует( мРасположениеОбновлений + "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления+ "\" ) Тогда
Заголовки = Новый Соответствие( ) ;
Заголовки. Вставить( "User-Agent" , "1C+Enterprise/8.2" ) ;
СерверОбновлений = Новый HTTPСоединение( "downloads.v8.1c.ru" , , мИтсЛогин, мИтсПароль, ) ;
СтрокаЗапросHTTP = "/tmplts/1c/" + мТипКонфигурации+ "/" + Версия_Для_Обновления + "/1cv8.zip" ;
Сообщить( СтрокаЗапросHTTP) ;
ЗапросКСерверуОбновлений = Новый HTTPЗапрос( СтрокаЗапросHTTP, Заголовки) ;
СерверОбновлений. Получить( ЗапросКСерверуОбновлений, мРасположениеОбновлений+ "\1cv8.zip" ) ;
ФайлZip = Новый ЧтениеZipФайла( мРасположениеОбновлений+ "\1cv8.zip" ) ;
ФайлZip. ИзвлечьВсе( мРасположениеОбновлений+ "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления) ;
ФайлZip. Закрыть( ) ;
УдалитьФайлы( мРасположениеОбновлений+ "\1cv8.zip" ) ;
КонецЕсли ;
КомандаПакетногоОбновления = """ " + ПараметрыComБазы. ПутьКПлатформе + """ " + " CONFIG /S" + мИмяСервера+ "\" + мИмяБазы+ " /N"" " + мБазаЛогин+ """ /P"" " + мБазаПароль+ """ /UpdateCfg " + мРасположениеОбновлений+ "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления + "\1cv8.cfu /UpdateDBCfg /OUT "" " + home+ "\" + мИмяБазы+ ".log"" -NoTruncate" ;
ЗапуститьПриложение( КомандаПакетногоОбновления, , Истина , КодВозврата) ;
Если КодВозврата = 0 Тогда
Сообщить( "База Успешно обновлена" ) ;
Иначе
Сообщить( "ОШИБКА ПРИ ОБНОВЛЕНИИ" ) ;
Возврат ;
КонецЕсли ;
ПараметрыComБазы = ВернутьРелизИПлатформу( мИмяСервера, мИмяБазы, мВерсияПлатформы, мБазаЛогин, мБазаПароль) ;
Если ПараметрыComБазы = Неопределено Тогда
Возврат ;
КонецЕсли ;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений( ФайлСписокОбновленийXML, ПараметрыComБазы. ТекущаяВерсия) ;
ТребуетсяОбновление = Ложь ;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ" ) ;
Возврат ;
КонецЕсли ;
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " update: " + ВерсияДляОбновления) ;
КонецПроцедуры
УстановитьКонстанты( ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_el" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_spb" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_domx" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_el" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_ip" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_guild" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_lebedeva" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_porsche" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_service" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
Источник
Категория:
Администрирование 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.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить(
Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
КонецЦикла ;
КонецПроцедуры
Категория:
Работа с Деревом Значений Пример создания внешней печатной формы для управляемого приложения Пример создания внешней печатной формы АКТа для Бухгалтерии 3.0
1. В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя.
2. В модуле обработки пишем код. Постараюсь его максимально комментировать. Главное должно быть:
функция ПечатьВнешнейПечатнойФормы табличного документа - которая выведет данные в макет функция Печать - вызывается из конфигурации! в нее передается массив печатаемых объектов и функция СведенияОВнешнейОбработке(). Она необходима для регистрации печатной формы в справочнике ДополнительныеОтчетыИОбработки, в ней собирается структура с данными для подключения формы. Эта функция, а также ряд сопутствующих ей, практически одинаковы для всех печатных форм, поэтому их можно просто копировать в новую печатную форму ничего не меняя.
Код 1C v 8.3
Функция ПечатьВнешнейПечатнойФормы(МассивОбъектов, ОбъектыПечати, Подписант) Экспорт
ТабДок = новый ТабличныйДокумент;
Макет = ПолучитьМакет( "Макет" ) ;
ОбластьШапки = Макет. ПолучитьОбласть( "Шапка" ) ;
ОбластьДанные = Макет. ПолучитьОбласть( "Данные" ) ;
ОбластьПодвал = Макет. ПолучитьОбласть( "Подвал" ) ;
Запрос = новый запрос;
Запрос. УстановитьПараметр( "МассивОбъектов" , МассивОбъектов) ;
Запрос. Текст = "ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.Сумма,
| РеализацияТоваровУслугТовары.Количество,
| РеализацияТоваровУслугТовары.Цена,
| РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваровУслугУслуги.Номенклатура,
| РеализацияТоваровУслугУслуги.Сумма,
| РеализацияТоваровУслугУслуги.Количество,
| РеализацияТоваровУслугУслуги.Цена,
| РеализацияТоваровУслугУслуги.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
|ГДЕ
| РеализацияТоваровУслугУслуги.Ссылка В(&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Ссылка" ;
ОбщаяВыборка = Запрос. Выполнить( ) . Выгрузить( ) ;
Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл
ОбластьШапки. Параметры. ТекстЗаголовка = "Акт № " + СсылкаНаОбъект. Номер;
ОбластьШапки. Параметры. Организация = СсылкаНаОбъект. Организация;
ТабДок. Вывести( ОбластьШапки) ;
Отбор = Новый Структура;
Отбор. Вставить( "Ссылка" , СсылкаНаОбъект) ;
Выборка = ОбщаяВыборка. НайтиСтроки( Отбор) ;
ИтогоСумма = 0 ;
ИтогоКоличество = 0 ;
Для Каждого Стр из Выборка Цикл
ЗаполнитьЗначенияСвойств( ОбластьДанные. Параметры, Стр) ;
ИтогоСумма = ИтогоСумма + Стр. Сумма;
ИтогоКоличество = ИтогоКоличество + Стр. Количество;
ТабДок. Вывести( ОбластьДанные) ;
КонецЦикла ;
ОбластьПодвал. Параметры. ИтогоСумма = ИтогоСумма;
ОбластьПодвал. Параметры. Подписант = Подписант;
ТабДок. Вывести( ОбластьПодвал) ;
ТабДок. ВывестиГоризонтальныйРазделительСтраниц( ) ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции
Процедура Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью. НужноПечататьМакет( КоллекцияПечатныхФорм, "АКТПечатьВнешняя" ) Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы( МассивОбъектовНазначения, ОбъектыПечати, "" ) ;
УправлениеПечатью. ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "АКТПечатьВнешняя" , "АКТ (внешний)" , ТабличныйДокумент) ;
ИначеЕсли УправлениеПечатью. НужноПечататьМакет( КоллекцияПечатныхФорм, "АКТПечатьВнешняяИван" ) Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы( МассивОбъектовНазначения, ОбъектыПечати, "Иванов А.Ю." ) ;
УправлениеПечатью. ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "АКТПечатьВнешняяИван" , "АКТ (внешний) Иванов" , ТабличныйДокумент) ;
ИначеЕсли УправлениеПечатью. НужноПечататьМакет( КоллекцияПечатныхФорм, "АКТПечатьВнешняяПетр" ) Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы( МассивОбъектовНазначения, ОбъектыПечати, "Петров В.С." ) ;
УправлениеПечатью. ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "АКТПечатьВнешняяПетр" , "АКТ (внешний) Петров" , ТабличныйДокумент) ;
КонецЕсли ;
КонецПроцедуры
#Область СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации. Вставить( "Вид" , "ПечатнаяФорма" ) ;
МассивНазначений = Новый Массив;
МассивНазначений. Добавить( "Документ.РеализацияТоваровУслуг" ) ;
ПараметрыРегистрации. Вставить( "Назначение" , МассивНазначений) ;
ПараметрыРегистрации. Вставить( "Наименование" , "АКТ (Внешний)" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , ЛОЖЬ ) ;
ПараметрыРегистрации. Вставить( "Версия" , "1.0" ) ;
ПараметрыРегистрации. Вставить( "Информация" , "Дополнительная печатная форма" ) ;
ТаблицаКоманд = ПолучитьТаблицуКоманд( ) ;
ДобавитьКоманду( ТаблицаКоманд, "Внешний: АКТ" , "АКТПечатьВнешняя" , "ВызовСерверногоМетода" , Истина , "ПечатьMXL" ) ;
ДобавитьКоманду( ТаблицаКоманд, "Внешний: АКТ (Иванов)" , "АКТПечатьВнешняяИван" , "ВызовСерверногоМетода" , Истина , "ПечатьMXL" ) ;
ДобавитьКоманду( ТаблицаКоманд, "Внешний: АКТ (Петров)" , "АКТПечатьВнешняяПетр" , "ВызовСерверногоМетода" , Истина , "ПечатьMXL" ) ;
ПараметрыРегистрации. Вставить( "Команды" , ТаблицаКоманд) ;
Возврат ПараметрыРегистрации;
КонецФункции
#КонецОбласти
#Область Вспомогательное
Функция ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы = Неопределено, НаименованиеОбработки = "" , Информация = "" , Версия = "1.0" )
Если ТипЗнч( ОбъектыНазначенияФормы) = Тип( "Строка" ) Тогда
ОбъектНазначенияФормы = ОбъектыНазначенияФормы;
ОбъектыНазначенияФормы = Новый Массив;
ОбъектыНазначенияФормы. Добавить( ОбъектНазначенияФормы) ;
КонецЕсли ;
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации. Вставить( "Вид" , "ПечатнаяФорма" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , Истина ) ;
ПараметрыРегистрации. Вставить( "Назначение" , ОбъектыНазначенияФормы) ;
Если Не ЗначениеЗаполнено( НаименованиеОбработки) Тогда
НаименованиеОбработки = ЭтотОбъект. Метаданные( ) . Представление( ) ;
КонецЕсли ;
ПараметрыРегистрации. Вставить( "Наименование" , НаименованиеОбработки) ;
Если Не ЗначениеЗаполнено( Информация) Тогда
Информация = ЭтотОбъект. Метаданные( ) . Комментарий;
КонецЕсли ;
ПараметрыРегистрации. Вставить( "Информация" , Информация) ;
ПараметрыРегистрации. Вставить( "Версия" , Версия) ;
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды. Колонки. Добавить( "Представление" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Идентификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Использование" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "ПоказыватьОповещение" , Новый ОписаниеТипов( "Булево" ) ) ;
Команды. Колонки. Добавить( "Модификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ВызовСерверногоМетода" , ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL" )
НоваяКоманда = ТаблицаКоманд. Добавить( ) ;
НоваяКоманда. Представление = Представление;
НоваяКоманда. Идентификатор = Идентификатор;
НоваяКоманда. Использование = Использование;
НоваяКоманда. ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда. Модификатор = Модификатор;
КонецПроцедуры
#КонецОбласти
3. Добавляем макет вывода печатной формы:
4. Сохраняем и добавляем в конфигурацию:
Подключается через Администрирование - Печатные формы, отчеты и обработки:
Создаете новую обработку, записывайте и при открытии документа Реализация, нажав на Печать - появляются доступные печатные формы с разными подписывающими.
Скачать Шаблон внешней печатной формы для управляемого приложения
Категория:
Внешние печатные формы, отчеты и обработк�… Универсальные функции работы с регистрами сведений Разработка любой конфигурации потребует использования регистров сведений! Чтобы упростить запись и чтение данных в регистре сведений, Вы можете использовать универсальные функции:
Код 1C v 8.х
Процедура ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, Знач ИмяРегистра, Загрузка = Ложь) Экспорт
НаборЗаписей = СоздатьНаборЗаписейРегистраСведений( СтруктураЗаписи, ИмяРегистра) ;
НоваяЗапись = НаборЗаписей. Добавить( ) ;
ЗаполнитьЗначенияСвойств( НоваяЗапись, СтруктураЗаписи) ;
НаборЗаписей. ОбменДанными. Загрузка = Загрузка;
НаборЗаписей. Записать( ) ;
КонецПроцедуры
Процедура ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, Знач ИмяРегистра) Экспорт
МетаданныеРегистра = Метаданные. РегистрыСведений[ИмяРегистра];
МенеджерЗаписи = РегистрыСведений[ИмяРегистра]. СоздатьМенеджерЗаписи( ) ;
Для Каждого Измерение ИЗ МетаданныеРегистра. Измерения Цикл
Если СтруктураЗаписи. Свойство( Измерение. Имя) Тогда
МенеджерЗаписи[Измерение. Имя] = СтруктураЗаписи[Измерение. Имя];
КонецЕсли ;
КонецЦикла ;
МенеджерЗаписи. Прочитать( ) ;
ЗаполнитьЗначенияСвойств( МенеджерЗаписи, СтруктураЗаписи) ;
МенеджерЗаписи. Записать( ) ;
КонецПроцедуры
Процедура УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, ИмяРегистра, Загрузка = Ложь) Экспорт
НаборЗаписей = СоздатьНаборЗаписейРегистраСведений( СтруктураЗаписи, ИмяРегистра) ;
НаборЗаписей. ОбменДанными. Загрузка = Загрузка;
НаборЗаписей. Записать( ) ;
КонецПроцедуры
Функция СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, ИмяРегистра) Экспорт
МетаданныеРегистра = Метаданные. РегистрыСведений[ИмяРегистра];
НаборЗаписей = РегистрыСведений[ИмяРегистра]. СоздатьНаборЗаписей( ) ;
Для Каждого Измерение ИЗ МетаданныеРегистра. Измерения Цикл
Если СтруктураЗаписи. Свойство( Измерение. Имя) Тогда
НаборЗаписей. Отбор[Измерение. Имя]. Установить( СтруктураЗаписи[Измерение. Имя]) ;
КонецЕсли ;
КонецЦикла ;
Возврат НаборЗаписей;
КонецФункции
Категория:
Регистры сведений Загрузка данных в документ из табличного документа (в ТД скопировано из Excel) Частенько пользователи просят упростить ввод данных в программу используя копирование таблиц из Excel. Ниже я приведу пример как загрузить данные скопированные из Excel:
Создаем форму для загрузки данных:
внутри пишем код:
Код 1C v 8.х
ТаблицаДанных = Новый ТаблицаЗначений;
НомерКолонки = 0 ;
Пока Истина Цикл
НомерКолонки = НомерКолонки + 1 ;
ИмяКолонки = ТабДок. Область( 1 , НомерКолонки) . Текст;
Если ПустаяСтрока( ИмяКолонки) Тогда
Прервать ;
КонецЕсли ;
ТаблицаДанных. Колонки. Добавить( "К" + Строка( НомерКолонки) ) ;
КонецЦикла ;
СчетчикКолонок = НомерКолонки - 1 ;
НомерСтроки = 1 ; ФлагПрерывания = Ложь ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
Стр = ТаблицаДанных. Добавить( ) ;
Для А = 1 ПО СчетчикКолонок Цикл
ТекстКолонки = ТабДок. Область( НомерСтроки, А) . Текст;
Если ПустаяСтрока( ТекстКолонки) Тогда
Если А = КолонкаИндекса Тогда
Флагпрерывания = Истина ;
ТаблицаДанных. Удалить( Стр) ;
КонецЕсли ;
Иначе
Стр[А - 1 ] = ТекстКолонки
КонецЕсли ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаДанных
КонецФункции
Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
тзДанных= ПолучитьТЗИзМакета( ЭлементыФормы. ПолеТД) ;
Закрыть( тзДанных) ;
КонецПроцедуры
В документ добавлена кнопка - Загрузка из Excel ее код:
Код 1C v 8.х
Функция РазобратьДату(ИзмДата) ;
Возврат Дата( Сред( ИзмДата, 7 , 4 ) + Сред( ИзмДата, 4 , 2 ) + Сред( ИзмДата, 0 , 2 ) ) ;
КонецФункции
Процедура ЗагрузитьИзЕкселНажатие(Элемент)
тзДанных = ПолучитьФорму( "ФормаЗагрузкиИзExcel" ) . ОткрытьМодально( ) ;
ГрафикПлатежейКлиент. Очистить( ) ;
Для Каждого стр из тзДанных Цикл
нСтр = ГрафикПлатежейКлиент. Добавить( ) ;
нСтр. Дата = РазобратьДату( стр. К1 ) ;
нСтр. Сумма = стр. К2 ;
нСтр. СуммаАкта = стр. К3 ;
КонецЦикла ;
КонецПроцедуры
Смысл в том что из Excel копируют таблицу:
Жмут на кнопку загрузить и в документе Табличная часть заполняется автоматически:
Категория:
Табличный документ Чтение данных с сайта в формате XML и загрузка в 1С При разработке веб проекта нам потребовалось получать с одного сайта данные в формате XML и загружать их в 1С.
Сайт выдает XML вида (Ссылка на этот xml в коде, внизу):
Код 1C v 8.3 This XML file does not appear to have any style information associated with it. The document tree is shown below.
< updates version= "1.0" generator= "SEOBudget" url= "http://seobudget.ru/updates/" >
< update id= "cy" name= "Обновление тИЦ Яндекса" >
< date id= "1823" index= "1419324939" timestamp= "1419324939" > 23.12 . 2014 11 : 55 : 39 MSK< / date>
< date id= "1792" index= "1415776885" timestamp= "1415776885" > 12.11 . 2014 10 : 21 : 25 MSK< / date>
< date id= "1760" index= "1412923802" timestamp= "1412924102" > 10.10 . 2014 10 : 55 : 02 MSK< / date>
< / update>
< update id= "serp" name= "Обновление поисковой выдачи Яндекса" >
< date id= "1872" index= "1424898000" timestamp= "1425604249" > 06.03 . 2015 04 : 10 : 49 MSK< / date>
< date id= "1871" index= "1423602000" timestamp= "1425586715" > 05.03 . 2015 23 : 18 : 35 MSK< / date>
< date id= "1868" index= "1423602000" timestamp= "1425402241" > 03.03 . 2015 20 : 04 : 01 MSK< / date>
< / update>
< update id= "yaca" name= "Обновление Яндекс.Каталога" >
< date id= "1875" index= "1425931200" timestamp= "1425973201" > 10.03 . 2015 10 : 40 : 01 MSK< / date>
< date id= "1874" index= "1425758400" timestamp= "1425886502" > 09.03 . 2015 10 : 35 : 02 MSK< / date>
< date id= "1873" index= "1425585600" timestamp= "1425628803" > 06.03 . 2015 11 : 00 : 03 MSK< / date>
< / update>
< update id= "pr" name= "Обновление Google PR" >
< date id= "1512" index= "1386353345" timestamp= "1386353345" > 06.12 . 2013 22 : 09 : 05 MSK< / date>
< date id= "1265" index= "1360130400" timestamp= "1360130400" > 06.02 . 2013 10 : 00 : 00 MSK< / date>
< date id= "1196" index= "1352376123" timestamp= "1352376123" > 08.11 . 2012 16 : 02 : 03 MSK< / date>
< / update>
< update id= "user" name= "Обновление ПФ в Яндексе" >
< date id= "1799" index= "1415950021" timestamp= "1416986821" > 26.11 . 2014 10 : 27 : 01 MSK< / date>
< date id= "1763" index= "1409237032" timestamp= "1413211432" > 13.10 . 2014 18 : 43 : 52 MSK< / date>
< date id= "1665" index= "1400617705" timestamp= "1401222505" > 28.05 . 2014 00 : 28 : 25 MSK< / date>
< / update>
< / updates> < br>
В результате была написана обработка загрузки данных с сайта в 1С, ее код:
Код 1C v 8.3 &НаСервере
Функция ЧтениеXMLВДерево(Путь)
Дерево = Новый ДеревоЗначений;
Дерево. Колонки. Добавить( "Имя" ) ;
Дерево. Колонки. Добавить( "Значение" ) ;
XMLФайл = Новый ЧтениеXML;
XMLФайл. ОткрытьФайл( Путь) ;
ПрочитатьXMLПоТегам( XMLФайл, Дерево. Строки) ;
XMLФайл. Закрыть( ) ;
ТекДанные = Неопределено ;
Для каждого СтрокаП из Дерево. Строки Цикл
Для каждого СтрокаВ из СтрокаП. Строки Цикл
Для каждого СтрокаТ из СтрокаВ. Строки Цикл
Если СтрокаТ. Значение = "cy" тогда
ТекДанные = Перечисления. Показатель. TiC;
ИначеЕсли СтрокаТ. Значение = "serp" тогда
ТекДанные = Перечисления. Показатель. SYa;
ИначеЕсли СтрокаТ. Значение = "yaca" тогда
ТекДанные = Перечисления. Показатель. CatYa;
ИначеЕсли СтрокаТ. Значение = "pr" тогда
ТекДанные = Перечисления. Показатель. RP;
ИначеЕсли СтрокаТ. Значение = "user" тогда
ТекДанные = Перечисления. Показатель. PFYa;
КонецЕсли ;
Для каждого СтрокаД из СтрокаТ. Строки Цикл
Если СтрокаД. Имя= "timestamp" Тогда
ДатаИзменения = МестноеВремя( '19700101 '+ СтрокаД. значение) ;
НовЗапись = РегистрыСведений. ТиЦиRP. СоздатьМенеджерЗаписи( ) ;
НовЗапись. Показатель = ТекДанные;
НовЗапись. Период = ДатаИзменения;
НовЗапись. Записать( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
КонецФункции
&НаСервереБезКонтекста
Процедура ПрочитатьXMLПоТегам(XMLФайл, ТекущийНаборСтрок)
Пока XMLФайл. Прочитать( ) Цикл
Если XMLФайл. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
НоваяСтрока = ТекущийНаборСтрок. Добавить( ) ;
НоваяСтрока. Имя = XMLФайл. Имя;
НоваяСтрока. Значение = "" ;
Пока XMLФайл. ПрочитатьАтрибут( ) Цикл
НоваяСтрокаАтрибут = НоваяСтрока. Строки. Добавить( ) ;
НоваяСтрокаАтрибут. Имя = XMLФайл. Имя;
НоваяСтрокаАтрибут. Значение = СокрЛП( XMLФайл. Значение) ;
КонецЦикла ;
ПрочитатьXMLПоТегам( XMLФайл, НоваяСтрока. Строки) ;
ИначеЕсли XMLФайл. ТипУзла = ТипУзлаXML. КонецЭлемента Тогда
Возврат ;
ИначеЕсли XMLФайл. ТипУзла = ТипУзлаXML. Текст Тогда
ТекущийНаборСтрок. Родитель. Значение = СокрЛП( XMLФайл. Значение) ;
Иначе
Сообщить( "Тип узла: " + XMLФайл. ТипУзла + " НЕ ОБРАБОТАН" , СтатусСообщения. Важное) ;
Конецесли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура СборXML(Команда)
ЧтениеXMLВДерево( "http://seobudget.ru/downloads/updates.xml" ) ;
КонецПроцедуры
Результат загруженный в регистр сведений:
Категория:
Работа с Интернет, Почтой (Mail), FTP Некоторые особенности работы с настройками прав доступа пользователей в типовых конфигурациях на УФ Разработчики в управляемых приложениях применили новый механизм настройки прав доступа, о которых и пойдет речь.
Будут перечислены все те грабли, которые собрал автор, чтобы вы о них знали.
Наверняка, уже все знают, что из себя представляет новая система, поэтому предистория вкрадце:
Как было раньше( в обычном приложении):
Есть документ. Есть Роли - ПолныеПрава, ДокументНетДоступа, ДокументТолькоЧтение, ДокументЧтениеИРедактирование. В конфигураторе(аналогичный механизм в реж предприятия) вы выставляете пользователям эти роли и у них появляются соответствующие права доступа на документ. Все просто и скучно и даже зевать хочется.
С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа.
Теперь:
Вводная та же. Чтобы дать пользователю какие-то права на документ - сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект, который объединяет роли в группы ролей. Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N - количество ролей), но на практике количество профилей определяется количеством должностных обязанностей пользователей в организации и их гораздо меньше, чем ролей.
Создаем профили Бесправный(с ролью ДокументНетДоступа), Аудитор(с ролью ДокументТолькоЧтение), Бухгалтер(с ролью ДокументЧтениеИРедактирование).
Чтобы "привязать" эти профили к пользователям - нужно создать элементы справочника ГруппыДоступа. В типовых они создаются автоматически, когда вы отмечаете галочками профили для пользователя. Этот справочник соединяет профиль и пользователя(или нескольких пользователей).
При записи этого элемента справочника система автоматически добавляет роли (из профиля) в роли пользователя. Поэтому не стоит напрямую редактировать роли в конфигураторе, как раньше - при редактировании прав в Предприятии все роли в конфигураторе будут обновлены на роли из профилей пользователя. Кроме того, будет наблюдаться явное противоречение между набором профилей с ролями и ролями, установленными в конфигураторе.
Как хранятся роли в Профиле групп доступа, спросите вы. Ведь роли - это объекты МД, это не ссылочные типы. Отвечаю - для этого(и не только) разработчики создали служебный справочник ИдентификаторыОбъектовМетаданных, в котором хранится( в иерархии!) имена, синонимы, значения пустых ссылок всех объектов МД. Если вы хотите создать Профиль программно и добавить в него роль, то код примерно будет таким:
Код 1C v 8.2 УП РодительРоли = Справочники. ИдентификаторыОбъектовМетаданных. НайтиПоНаименованию( "Роли" ) ;
ИдентификаторМоейРоли = Справочники. ИдентификаторыОбъектовМетаданных. НайтиПоРеквизиту( "Имя" , "МояРоль" , РодительРоли) ;
Если ЗначениеЗаполнено( ИдентификаторМоейРоли) Тогда
НайденныйИдентификаторМоейРоли = МойПрофиль. Роли. Найти( ИдентификаторМоейРоли ) ;
Если НайденныйИдентификаторМоейРоли= неопределено тогда
НовСтрока = МойПрофиль. Роли. Добавить( ) ;
НовСтрока. Роль = ИдентификаторМоейРоли;
КонецЕсли ;
КонецЕсли ;
Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:
Код 1C v 8.2 УП Справочники. ИдентификаторыОбъектовМетаданных. ОбновитьДанныеСправочника( ИСТИНА , ЛОЖЬ , ЛОЖЬ ) ;
Процедуру следует запускать каждый раз, когда вы вносите изменения в метаданные, особенно когда изменяете роли, объекты, связанные с новыми ролями.
Отлично. Роль добавили, идентификаторы обновили.
Но обратная связь не работает - вы в режиме предприятия назначили пользователю профиль( с созданием группы доступа), а роль у пользователя в конфигураторе не добавилась! Что делать?
За синхронизацию ролей/профилей отвечает константа ПараметрыРаботыПользователей. Если роли не обновляются в конфигураторе, следует обновить её значение:
Код 1C v 8.2 УП Константы. ПараметрыРаботыПользователей. СоздатьМенеджерЗначения( ) . ОбновитьОбщиеПараметры( ) ;
Хорошо, скажите вы. А как быть, если я хочу создать группы доступа программно? Да не вопрос. Единственное ограничение - не допускаются дубли связок Профиль-Пользоваль в группах доступа. Примерный код будет таким:
Код 1C v 8.2 УП
Если МойПрофиль = Справочники. ПрофилиГруппДоступа. Администратор Тогда
ГруппаДоступаАдм = Справочники. ГруппыДоступа. Администраторы;
Если ГруппаДоступаАдм. Пользователи. Найти( МойПользователь) = неопределено Тогда
ГруппаДоступаАдмОб= ГруппаДоступаАдм. ПолучитьОбъект( ) ;
НовСтрока = ГруппаДоступаАдмОб. Пользователи. Добавить( ) ;
НовСтрока. Пользователь = МойПользователь;
ГруппаДоступаАдмОб. Записать( ) ;
КонецЕсли ;
Иначе
Запрос = новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
|ГруппыДоступа.Ссылка
|ИЗ
|Справочник.ГруппыДоступа КАК ГруппыДоступа
|ГДЕ
|ГруппыДоступа.Профиль = &Профиль
|И (ГруппыДоступа.Пользователь = &Пользователь
|ИЛИ ГруппыДоступа.Пользователи.Пользователь = &Пользователь)
|И НЕ ГруппыДоступа.ПометкаУдаления " ;
Запрос. УстановитьПараметр( "Профиль" , МойПрофиль) ;
Запрос. УстановитьПараметр( "Пользователь" , МойПользователь) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если НЕ Выборка. Следующий( ) тогда
МояГруппаДоступаОб = справочники. ГруппыДоступа. СоздатьЭлемент( ) ;
МояГруппаДоступаОб. Наименование = Строка( МойПрофиль) ;
МояГруппаДоступаОб. Пользователь = мойПользователь;
Нов = МояГруппаДоступаОб. Пользователи. Добавить( ) ;
Нов. Пользователь = МойПользователь;
МояГруппаДоступаОб. Профиль = МойПрофиль;
МояГруппаДоступаОб. Записать( ) ;
КонецЕсли ;
КонецЕсли ;
После выполнения этого кода, если все, что нужно обновлено - типовая конфигурация добавит пользователю роли.
Раз уж пошли по программному пути, вот код, который добавляет пользователя в справочник Пользователи и ПользователяИБ в ПользователиИнформационнойБазы:
Код 1C v 8.2 УП ПользовательИБ = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
ПользовательИБ. имя = "Иванов" ;
ПользовательИБ. ПолноеИмя = "Иванов Иван Иванович" ;
ПользовательИБ. АутентификацияСтандартная = ИСТИНА ;
ПользовательИБ. Пароль = "" ;
ПользовательИБ. записать( ) ;
Пользователь = Справочники. Пользователи. НайтиПоРеквизиту( "ИдентификаторПользователяИБ" , ПользовательИБ. УникальныйИдентификатор) ) ;
если Пользователь. Наименование = "" Тогда
ПользовательОб = Справочники. Пользователи. СоздатьЭлемент( ) ;
ОписаниеПользователяИБ = Пользователи. НовоеОписаниеПользователяИБ( ) ;
ЗаполнитьЗначенияСвойств( ОписаниеПользователяИБ, ПользовательИБ) ;
ОписаниеПользователяИБ. УникальныйИдентификатор = Соединение. NewObject( "УникальныйИдентификатор" , ПользовательИБ. УникальныйИдентификатор) ;
ПользовательОб. Наименование = ОписаниеПользователяИБ. ПолноеИмя;
ОписаниеПользователяИБ. Вставить( "Действие" , "Записать" ) ;
ПользовательОб. ДополнительныеСвойства. Вставить( "ОписаниеПользователяИБ" , ОписаниеПользователяИБ) ;
ПользовательОб. записать( ) ;
КонецЕсли ;
Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользовательИБ у вас сам создатся.
И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователемИБ, которого нет в справочнике Пользователи.
Автор: Stim - Источник
Категория:
Управляемое приложение, Тонкий клиент Как сформировать диаграмму с типом График В этом примере построим диаграмму с типом График , вида:
Вот код ее формирования:
Код 1C v 8.х Процедура ГрафикКолВоДоставок()
ТабД = Новый ТаблицаЗначений;
ТабД. Колонки. Добавить( "ДатаК" ) ;
ТабД. Колонки. Добавить( "Всего" ) ;
кп = КонПериодаЛ;
нп = кп- ( 86400 ) ;
Пока кп> НачПериодаЛ Цикл
Состояние( "Кол-во Доставок на: " + Строка( кп) ) ;
КоличествоДоставок = 0 ; Тоннаж = 0 ;
Привилегированный. ПолучитьКоличествоДоставок( кп, КоличествоДоставок, Тоннаж) ;
Нстр = ТабД. Добавить( ) ;
Нстр. ДатаК= кп;
Нстр. Всего = КоличествоДоставок;
кп = нп;
нп = кп- ( 86400 ) ;
КонецЦикла ;
ДиаграммаВП = ЭлементыФормы. ДиаграммаКолВоДоставок;
ДиаграммаВП. КоличествоТочек= 0 ;
ТабД. Сортировать( "ДатаК Возр" ) ;
Для Каждого СтрТраб из ТабД Цикл
Точка= ДиаграммаВП. Точки. Добавить( Формат( СтрТраб. Получить( 0 ) , "ДФ=dd.MM" ) ) ;
Индекс= 0 ;
Попытка
ДиаграммаВП. УстановитьЗначение( Точка, ДиаграммаВП. Серии[0 ], ? ( СтрТраб. Получить( 1 ) = Неопределено , 0 , СтрТраб. Получить( 1 ) ) ) ;
Исключение
КонецПопытки ;
КонецЦикла ;
КонецПроцедуры
Категория:
Диаграмма