Отправка почты через 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. на форму, в нашем случае документа, добавляем кнопку (Команда и у нее процедура СоздатьПеремещение(Команда))
2. в ее обработчике пишем код создания документа перемещение товаров и заполняем его
Код 1C v 8.3 &НаСервере
Функция СоздатьПеремещениеНаСервере(ДанныеФормы)
ДанныеФормы. Дата= ТекущаяДата( ) ;
ДанныеФормы. СкладОтправитель = Справочники. Склады. НайтиПоНаименованию( "Склад гарантийного обслуживания" ) ;
ДанныеФормы. СкладПолучатель = Справочники. Склады. НайтиПоНаименованию( "Склад гарантийных" ) ;
новСП= Новый СписокЗначений; н= 0 ;
Для Каждого стр из Объект. ДанныеПоГН Цикл
Если стр. ДанныеПроверки= Перечисления. СтатусПроверкиГарантии. зн0 тогда
новСП. Добавить( Строка( стр. НомерЗаводской) ) ; н= н+ 1 ;
КонецЕсли ;
КонецЦикла ;
Если н> 0 Тогда
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка.Дата КАК ДатаОтгрузки,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка КАК Возврат,
| РеализацияТоваровУслугСерии.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслугСерии.Серия) КАК СерияСТР
|ИЗ
| Документ.ВозвратТоваровОтКлиента.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование В (&Наименование))
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ" ;
Запрос. УстановитьПараметр( "Наименование" , новСП) ;
ТаблицаЗапроса = Запрос. Выполнить( ) . Выгрузить( ) ;
Для каждого стр из новСП Цикл
НайденнаяСтрока= ТаблицаЗапроса. Найти( стр. Значение, "СерияСТР" ) ;
Если НайденнаяСтрока = Неопределено Тогда
Иначе
нстр= ДанныеФормы. Товары. Добавить( ) ;
нстр. Номенклатура = НайденнаяСтрока. Номенклатура;
нстр. Серия= НайденнаяСтрока. Серия;
нстр. КоличествоУпаковок= 1 ;
нстр. Количество= 1 ;
нстр. СтатусУказанияСерий= 2 ;
нстр. СтатусУказанияСерийОтправитель= 2 ;
нстр. СтатусУказанияСерийПолучатель= 2 ;
нстр= ДанныеФормы. Серии. Добавить( ) ;
нстр. Номенклатура = НайденнаяСтрока. Номенклатура;
нстр. Серия= НайденнаяСтрока. Серия;
нстр. Количество= 1 ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
Возврат ДанныеФормы;
КонецФункции
&НаКлиенте
Процедура СоздатьПеремещение(Команда)
Форма= ПолучитьФорму( "Документ.ПеремещениеТоваров.ФормаОбъекта" ) ;
ДанныеФормы= Форма. Объект;
ДанныеФормы= СоздатьПеремещениеНаСервере( ДанныеФормы) ;
КопироватьДанныеФормы( ДанныеФормы, Форма. Объект) ;
Форма. Открыть( ) ;
КонецПроцедуры
Категория:
Документы Пример работы с MS EXCEL (листы, поиск на листе) Код 1C v 8.х ДокументExcel = ПолучитьCOMОбъект( ИмяФайла) ;
Категория:
Работа с Microsoft Office и OpenOffice Добавление дополнительных отчетов и обработок в тонком клиенте БП 3.0, ЗУП 3.0, УТ 11 Любой отчет и обработку можно подключить пользователям как дополнительные отчеты или обработки, вот например пункт в БП - Банк:
Добавление происходит через
далее Дополнительные отчеты и обработки , в списке нажмите Создать и Выберите Файл отчета/обработки:
Перед добавлением файл нужно подготовить, дописать в модуль объекта код подключения:
Для обработок код:
Код 1C v 8.3 Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации. Вставить( "Вид" , "ДополнительнаяОбработка" ) ;
ПараметрыРегистрации. Вставить( "Назначение" , Новый СписокЗначений) ;
ПараметрыРегистрации. Вставить( "Наименование" , "Сравнение документов БУХ и УТ" ) ;
ПараметрыРегистрации. Вставить( "Версия" , "1.0" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , Истина ) ;
ПараметрыРегистрации. Вставить( "Информация" , "" ) ;
ПараметрыРегистрации. Вставить( "Команды" , Новый СписокЗначений) ;
ТаблицаКоманд = ПолучитьТаблицу_Команд( ) ;
ДобавитьКоманду( ТаблицаКоманд,
"Сравнение документов БУХ и УТ" ,
"Сравнение документов БУХ и УТ" ,
"ОткрытиеФормы" ,
Ложь ,
"" ) ;
ПараметрыРегистрации. Вставить( "Команды" , ТаблицаКоманд) ;
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицу_Команд()
Команды = Новый ТаблицаЗначений;
Команды. Колонки. Добавить( "Представление" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Идентификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Использование" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "ПоказыватьОповещение" , Новый ОписаниеТипов( "Булево" ) ) ;
Команды. Колонки. Добавить( "Модификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "" )
НоваяКоманда = ТаблицаКоманд. Добавить( ) ;
НоваяКоманда. Представление = Представление;
НоваяКоманда. Идентификатор = Идентификатор;
НоваяКоманда. Использование = Использование;
НоваяКоманда. ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда. Модификатор = Модификатор;
КонецПроцедуры
Для отчетов и печатных форм меняйте параметр Вид :
Код 1C v 8.3
ПараметрыРегистрации. Вставить( "Вид" , "ДополнительнаяОбработка" ) ;
Возможные значения этого поля приведу в виде таблицы
Значение поля "Вид" Расположение команды
Расширение
файла
ПечатнаяФорма В меню "Печать" на форме объекта или списка epf ЗаполнениеОбъекта В меню "Заполнить" на форме объекта или списка epf СозданиеСвязанныхОбъектов В меню "Создать на основании" - "Создание связанных объектов.." на форме объекта или списка epf Отчет В меню "Отчеты" на форме объекта или списка erf ДополнительнаяОбработка В списке соответствующих подсистем в меню "Сервис" - "Дополнительные обработки" epf ДополнительныйОтчет В списке соответствующих подсистем в меню "Сервис" - "Дополнительные отчеты" erf
Это поле может принимать одно из значений, возвращаемых функциями в типовых конфигурациях:
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<Вид>(). Например, для вида "ПечатнаяФорма" есть функция ВидОбработкиПечатнаяФорма().
Категория:
Внешние печатные формы, отчеты и обработк�… Как очистить справочник удалив все не используемые элементы? Очень часто менеджеры дублируют информацию в справочниках и время от времени их приходится чистить.
Но как удалить только те элементы справочника, которые не используются в документах?
Следующий пример кода поможет это сделать(в примере обрабатывается 4 справочника: Сотрудники, ФизЛица, Договора и Контрагенты) Скачать: Обработка для УТ 10 :
Код 1C v 8.х сп= Новый СписокЗначений;
сп. Добавить( "СотрудникиОрганизаций" ) ;
сп. Добавить( "ФизическиеЛица" ) ;
сп. Добавить( "ДоговорыКонтрагентов" ) ;
сп. Добавить( "Контрагенты" ) ;
Для Каждого стр из сп Цикл
текСпр= стр. Значение;
Запрос = Новый Запрос;
Текст =
"ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка
|ИЗ
| Справочник.%текСпр% КАК СотрудникиОрганизаций
|ГДЕ
| НЕ СотрудникиОрганизаций.ПометкаУдаления И НЕ СотрудникиОрганизаций.ЭтоГруппа" ;
Запрос. Текст = СтрЗаменить( Текст, "%текСпр%" , текСпр) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
итЗаписей = Строка( ВыборкаДетальныеЗаписи. Количество( ) ) ;
ном= 0 ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
ном= ном+ 1 ; Состояние( текСпр+ ": " + Строка( ном) + " из " + итЗаписей) ;
СсылкаНаУдаляемыйЭлемент = ВыборкаДетальныеЗаписи. Ссылка;
МассивСсылок = Новый Массив;
МассивСсылок. Добавить( СсылкаНаУдаляемыйЭлемент) ;
НайденныеСсылки = НайтиПоСсылкам( МассивСсылок) ;
Если НайденныеСсылки. Количество( ) > 0 Тогда
Сообщить( "Нельзя удалять элемент:" + Строка( СсылкаНаУдаляемыйЭлемент) + ", на него имеются ссылки" , СтатусСообщения. Внимание) ;
Иначе
Сообщить( "Удаляем элемент:" + Строка( СсылкаНаУдаляемыйЭлемент) , СтатусСообщения. Информация) ;
УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент. ПолучитьОбъект( ) ;
УдаляемыйЭлемент. Удалить( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
Категория:
Справочники 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
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Как удалить дубли в списке значений Если Вам необходимо почистить список значений от повторяющихся записей, используйте следующий код:
Код 1C v 8.х структошибок = Новый СписокЗначений;
Массив= структошибок. ВыгрузитьЗначения( ) ;
ТекущийИндекс = 0 ;
ВсегоЭлементов = Массив. Количество( ) ;
Пока ТекущийИндекс < ВсегоЭлементов Цикл
Индекс2 = ТекущийИндекс + 1 ;
Пока Индекс2 < ВсегоЭлементов Цикл
Если Массив[Индекс2 ] = Массив[ТекущийИндекс] Тогда
Массив. Удалить( Индекс2 ) ;
ВсегоЭлементов = ВсегоЭлементов - 1 ;
Иначе
Индекс2 = Индекс2 + 1 ;
КонецЕсли ;
КонецЦикла ;
ТекущийИндекс = ТекущийИндекс + 1 ;
КонецЦикла ;
Для Каждого спстр из Массив цикл
Сообщить( спстр) ;
КонецЦикла ;
Категория:
Работа с Списком Значений Как получить за период все отпуска и больничные по сотруднику? Задача: получить в ЗУП 2.5 за определенный период все отпуска и больничные по сотруднику
вот пример запроса и кода:
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст = "
|ВЫБРАТЬ
| ОсновныеНачисленияРаботниковОрганизаций.ПериодДействия,
| ОсновныеНачисленияРаботниковОрганизаций.ПериодДействияНачало,
| ОсновныеНачисленияРаботниковОрганизаций.ПериодДействияКонец,
| ОсновныеНачисленияРаботниковОрганизаций.ВидРасчета,
| ОсновныеНачисленияРаботниковОрганизаций.Сотрудник,
| ОсновныеНачисленияРаботниковОрганизаций.Результат,
| ОсновныеНачисленияРаботниковОрганизаций.НормаДней,
| ОсновныеНачисленияРаботниковОрганизаций.НормаЧасов,
| ОсновныеНачисленияРаботниковОрганизаций.ОтработаноДней,
| ОсновныеНачисленияРаботниковОрганизаций.ОтработаноЧасов,
| ОсновныеНачисленияРаботниковОрганизаций.ОтработаноДнейПоПятидневке
|ИЗ
| РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисленияРаботниковОрганизаций
|ГДЕ
| ОсновныеНачисленияРаботниковОрганизаций.ВидРасчета В(&ВидРасчета)
| И ОсновныеНачисленияРаботниковОрганизаций.Сотрудник =Сотрудник
| И ОсновныеНачисленияРаботниковОрганизаций.ПериодДействия МЕЖДУДатаН ИДатаК
|" ;
кзСписокВидРасчета = Новый СписокЗначений;
кзСписокВидРасчета. Добавить( ПланыВидовРасчета. ОсновныеНачисленияОрганизаций. ОплатаПоСреднемуОтпКалендарныеДни) ;
кзСписокВидРасчета. Добавить( ПланыВидовРасчета. ОсновныеНачисленияОрганизаций. ОплатаПоСреднемуБЛ) ;
Запрос. УстановитьПараметр( "ВидРасчета" , кзСписокВидРасчета) ;
Запрос. УстановитьПараметр( "ДатаК" , КонПериода) ;
Запрос. УстановитьПараметр( "ДатаН" , НачалоМесяца( КонПериода) ) ;
Запрос. УстановитьПараметр( "Сотрудник" , Сотрудник) ;
РезультатЧасовОтпускИБолн = Запрос. Выполнить( ) . Выбрать( ) ;
Категория:
1С Зарплата и Управление Персоналом 2.5 Ввод по строке - поиск по первым символам или в любом месте наименования При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования!
В 1С 8.3 по умолчанию настройки справочника номенклатуры такие:
При такой настройке, механизм поиска в справочнике номенклатуры работает так:
- в справочнике
- в документе вводим первые символы Пета и видим такой результат подсказки:
Но, такой поиск не удобен и менеджеры захотели подбирать номенклатуру по артикулу , например 1320
Для этого изменим настройки указав поиск по Любой части и включив полнотекстовый поиск:
Сохраняем конфигурацию и в режиме предприятие обновляем Полнотекстовый поиск: Меню - Все функции - Стандартные - Управление полнотекстовый поиском
После этого пробуем в документе выполнить поиск по 1320 и видим:
Все Менеджеры пищат как дети на новогодней елке!
Пока писал эту статью нашел в интернете другое решение для платформы 8.2 :
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
ОбработкаПолученияДанныхВыбора (ChoiceDataGetProcessing)
Синтаксис:
ОбработкаПолученияДанныхВыбора(<ДанныеВыбора>, <Параметры>, <СтандартнаяОбработка>)
В модуле менеджера справочника "Номенклатура" пишем:
Код 1C v 8.2 УП Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНОНаименование" ;
Запрос. УстановитьПараметр( "Наименование" , "%" + Параметры. СтрокаПоиска + "%" ) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Таблица = РезультатЗапроса. Выгрузить( ) ;
Массив = Таблица. ВыгрузитьКолонку( "Ссылка" ) ;
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора. ЗагрузитьЗначения( Массив) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
В обработчике - ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбраблтка) для нас важны все три параметра. В первый "ДанныеВыбора" мы загружаем наш список номенклатуры, полученный по нашему алгоритму. Из параметра "Параметры" мы получим значение введенное пользователем, а третьему параметру "СтандартнаяОбработка" мы должны поставить значение "Ложь"(отключаем стандартный алгоритм системы).
В результате одной небольшой процедурой мы полностью решили поставленную задачу.
Категория:
Управляемое приложение, Тонкий клиент Синтаксический анализ JSON - выражения средствами 1С 7.7 Код 1C v 7.x
Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш;
Перем Цифры1 _9, Цифры0 _9, ПервыеСимволыКонстант, ОдносимвольныеЛексемы;
Перем НомЛексемы, ТекЛексема;
Перем JSON_Error;
Перем В_Массив, В_Объект, В_Значение;
Перем НомерСимвола;
Перем ФлагОшибки;
Перем СписокСтроковыхКонстант;
Перем СтекЛексем;
Перем АнализируемаяСтрока;
Перем ТекКаталог, ТекФайл;
Функция ПолучитьОбъект_ТЗ() Далее
Функция ПолучитьМассив_ТЗ() Далее
Функция ТекущиеСимволы(Сколько)
Возврат Сред( АнализируемаяСтрока, НомерСимвола, Сколько) ;
КонецФункции
Функция ПрошлыйСимвол(Сдвиг)
Возврат Сред( АнализируемаяСтрока, НомерСимвола - Сдвиг, 1 ) ;
КонецФункции
Процедура ДобавитьЛексему(Лексема, Значение, Сдвиг)
СтекЛексем. НоваяСтрока( ) ;
СтекЛексем. Лексема = Лексема;
СтекЛексем. Значение = Значение;
НомерСимвола = НомерСимвола + Сдвиг;
КонецПроцедуры
Процедура ОбвестиОбласть(Обл)
Обл. РамкаСнизу( 1 ) ;
Обл. РамкаСверху( 1 ) ;
Обл. РамкаСлева( 1 ) ;
Обл. РамкаСправа( 1 ) ;
КонецПроцедуры
Процедура НапечататьТЗ(Таб, ТЗ, НомС, НомК)
Перем Тип, Обл1 , НС, КС, Ключ, Зн, Обл2 ;
Тип = ТЗ. ПолучитьЗначение( 1 , 1 ) ;
НомС = НомС + 1 ;
Обл1 = Таб. Область( НомС, НомК) ;
ОбвестиОбласть( Обл1 ) ;
Если Тип = В_Значение Тогда
ТипЗн = ТЗ. ПолучитьЗначение( 2 , 1 ) ;
Обл1 . Текст = ТЗ. ПолучитьЗначение( 2 , 2 ) ;
Обл1 . ГоризонтальноеПоложение( 1 ) ;
Если ТипЗн = Л_Число Тогда
Обл1 . ГоризонтальноеПоложение( 2 ) ;
ИначеЕсли ТипЗн = Л_Константа Тогда
Обл1 . Полужирный( 1 ) ;
ИначеЕсли ТипЗн = Л_Строка Тогда
Обл1 . Контроль( 4 ) ;
КонецЕсли ;
Возврат ;
ИначеЕсли ( Тип = В_Объект) Или ( Тип = В_Массив) Тогда
Обл1 . Текст = Тип;
Обл1 . Полужирный( 1 ) ;
Обл1 . ЦветФона( 12648447 ) ;
Обл1 . РамкаСнизу( 5 ) ;
КС = ТЗ. КоличествоСтрок( ) ;
Для НС = 2 По КС Цикл
НомС = НомС + 1 ;
Обл2 = Таб. Область( НомС, НомК) ;
Обл2 . Текст = ТЗ. ПолучитьЗначение( НС, 1 ) ;
Если Тип = В_Массив Тогда
Обл2 . ГоризонтальноеПоложение( 2 ) ;
КонецЕсли ;
ОбвестиОбласть( Обл2 ) ;
НомС = НомС - 1 ;
НапечататьТЗ( Таб, ТЗ. ПолучитьЗначение( НС, 2 ) , НомС, НомК + 1 ) ;
КонецЦикла ;
Иначе
Сообщить( "Фигня " + Тип, "!" ) ;
КонецЕсли ;
КонецПроцедуры
Процедура ВыравнятьТЗ(Таб, ОграничениеШирины)
Перем НомерКол, НомерСтр, МаксШирина, Обл, ТекШирина, ТекДлина;
Для НомерКол = 1 По Таб. ШиринаТаблицы( ) Цикл
МаксШирина = 0 ;
Для НомерСтр = 1 По Таб. ВысотаТаблицы( ) Цикл
Обл = Таб. Область( НомерСтр, НомерКол) ;
ТекШирина = Обл. ШиринаСтолбца( ) ;
ТекДлина = СтрДлина( СокрЛП( Обл. Текст) ) ;
МаксШирина = Макс( МаксШирина, ТекШирина, ТекДлина) ;
КонецЦикла ;
Таб. Область( , НомерКол) . ШиринаСтолбца( Мин( МаксШирина, ОграничениеШирины) ) ;
КонецЦикла ;
КонецПроцедуры
Процедура Напечатать_ТЗ(ТЗ)
Перем Таб, НС, НК, МаксШирина, ТекДлина, Обл;
Таб = СоздатьОбъект( "Таблица" ) ;
МаксНК = 1 ;
НС = 0 ;
НК = 1 ;
НапечататьТЗ( Таб, ТЗ, НС, НК) ;
ВыравнятьТЗ( Таб, 30 ) ;
Таб. Область( 1 , 1 , Таб. ВысотаТаблицы( ) , Таб. ШиринаТаблицы( ) ) . ВертикальноеПоложение( 2 ) ;
Таб. Опции( 0 , 0 ) ;
Таб. Показать( "JSON" ) ;
КонецПроцедуры
Функция Ошибка()
ФлагОшибки = 1 ;
Возврат 0 ;
КонецФункции
Функция ЧитатьКонстанту(ПервСимвол)
Перем КонстантаСтр, ДлинаКонстанты;
КонстантаСтр = СписокСтроковыхКонстант. Получить( ПервСимвол) ;
ДлинаКонстанты = СтрДлина( КонстантаСтр) ;
Если ТекущиеСимволы( ДлинаКонстанты) = КонстантаСтр Тогда
ДобавитьЛексему( Л_Константа, КонстантаСтр, ДлинаКонстанты) ;
Возврат 1 ;
Иначе
Возврат Ошибка( ) ;
КонецЕсли ;
КонецФункции
Процедура ДописатьСимвол(Стр)
Стр = Стр + ТекущиеСимволы( 1 ) ;
НомерСимвола = НомерСимвола + 1 ;
КонецПроцедуры
Функция ЧитатьЧисло()
Перем ЧислоСтр;
ЧислоСтр = "" ;
Если ТекущиеСимволы( 1 ) = "-" Тогда
ДописатьСимвол( ЧислоСтр) ;
КонецЕсли ;
Если Найти( Цифры1 _9, ТекущиеСимволы( 1 ) ) > 0 Тогда
ДописатьСимвол( ЧислоСтр) ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
ИначеЕсли ТекущиеСимволы( 1 ) = "0" Тогда
ДописатьСимвол( ЧислоСтр) ;
Иначе
Возврат Ошибка( ) ;
КонецЕсли ;
Если ТекущиеСимволы( 1 ) = "." Тогда
ДописатьСимвол( ЧислоСтр) ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
КонецЕсли ;
Если ВРег( ТекущиеСимволы( 1 ) ) = "E" Тогда
ДописатьСимвол( ЧислоСтр) ;
Если Найти( "+-" , ТекущиеСимволы( 1 ) ) > 0 Тогда
ДописатьСимвол( ЧислоСтр) ;
КонецЕсли ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
КонецЕсли ;
ДобавитьЛексему( Л_Число, ЧислоСтр, 0 ) ;
Возврат 1 ;
КонецФункции
Функция ЧитатьСтроку()
Перем СтрокаСтр;
СтрокаСтр = "" ;
НомерСимвола = НомерСимвола + 1 ;
Пока ( ТекущиеСимволы( 1 ) < > Л_Кавычка) Или ( ( ТекущиеСимволы( 1 ) = Л_Кавычка) И ( ПрошлыйСимвол( 1 ) = Л_Экран) И ( ПрошлыйСимвол( 2 ) < > Л_Экран) ) Цикл
ДописатьСимвол( СтрокаСтр) ;
КонецЦикла ;
ДобавитьЛексему( Л_Строка, СтрокаСтр, 1 ) ;
Возврат 1 ;
КонецФункции
Функция ПрочитатьФайл(ИмяФайла)
Перем Т, НомерСтрокиФайла, СтрокаРез;
Т = СоздатьОбъект( "Текст" ) ;
Т. Открыть( ИмяФайла) ;
СтрокаРез = "" ;
Для НомерСтрокиФайла = 1 По Т. КоличествоСтрок( ) Цикл
СтрокаРез = СтрокаРез + Т. ПолучитьСтроку( НомерСтрокиФайла) ;
КонецЦикла ;
Возврат СтрокаРез;
КонецФункции
Функция СледующаяЛексема()
НомЛексемы = НомЛексемы + 1 ;
СтекЛексем. ПолучитьСтрокуПоНомеру( НомЛексемы) ;
ТекЛексема = СтекЛексем. Лексема;
Возврат 1 ;
КонецФункции
Функция ОшибкаЛексемы()
Перем РезСтр, НомСтр, ТЛ, ТС;
Сообщить( "Ошибочная лексема № " + НомЛексемы + " : <" + ТекЛексема + ">" , "!" ) ;
РезСтр = "" ;
Для НомСтр = НомЛексемы + 1 По СтекЛексем. КоличествоСтрок( ) Цикл
СтекЛексем. ПолучитьСтрокуПоНомеру( НомСтр) ;
ТЛ = СтекЛексем. Лексема;
Если ТЛ = Л_Строка Тогда
ТС = "<" + ТЛ + "(" + СтекЛексем. Значение + ")>" ;
ИначеЕсли ТЛ = Л_Константа Тогда
ТС = "<" + ТЛ + "(" + СтекЛексем. Значение + ")>" ;
Иначе
ТС = "<" + ТЛ + ">" ;
КонецЕсли ;
РезСтр = РезСтр + ТС + "," ;
КонецЦикла ;
Сообщить( Лев( РезСтр, 400 ) , "!" ) ;
Возврат 0 ;
КонецФункции
Процедура ДобавитьПару(ТЗ, Ключ, Значение)
ТЗ. НоваяСтрока( ) ;
ТЗ. Ключ = Ключ;
ТЗ. Значение = Значение;
КонецПроцедуры
Функция НоваяТЗ(Тип)
Перем _ТЗ;
_ТЗ = СоздатьОбъект( "ТаблицаЗначений" ) ;
_ТЗ. НоваяКолонка( "Ключ" ) ;
_ТЗ. НоваяКолонка( "Значение" ) ;
ДобавитьПару( _ТЗ, Тип, "" ) ;
Возврат _ТЗ;
КонецФункции
Функция ПолучитьПроизвольноеЗначение_ТЗ()
Перем ТЗ;
Если ( ТекЛексема = Л_Строка) Или ( ТекЛексема = Л_Число) Или ( ТекЛексема = Л_Константа) Тогда
ТЗ = НоваяТЗ( В_Значение) ;
ДобавитьПару( ТЗ, ТекЛексема, СтекЛексем. Значение) ;
СледующаяЛексема( ) ;
Возврат ТЗ;
ИначеЕсли ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Возврат ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Возврат ПолучитьМассив_ТЗ( ) ;
КонецЕсли ;
Возврат ОшибкаЛексемы( ) ;
КонецФункции
Функция ДобавитьКлючЗначение(ТЗ)
Перем НовКлюч, НовЗначение;
Если ТекЛексема < > Л_Строка Тогда
Возврат 0 ;
КонецЕсли ;
НовКлюч = СтекЛексем. Значение;
СледующаяЛексема( ) ;
Если ТекЛексема < > Л_Двоеточие Тогда
Возврат ОшибкаЛексемы( ) ;
КонецЕсли ;
СледующаяЛексема( ) ;
НовЗначение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если НовЗначение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
ДобавитьПару( ТЗ, НовКлюч, НовЗначение) ;
Возврат 1 ;
КонецФункции
Функция ПолучитьОбъект_ТЗ()
Перем ТЗ;
ТЗ = НоваяТЗ( В_Объект) ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Если ДобавитьКлючЗначение( ТЗ) = 0 Тогда
Возврат 0 ;
КонецЕсли ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
Если ДобавитьКлючЗначение( ТЗ) = 0 Тогда
Возврат 0 ;
КонецЕсли ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПолучитьМассив_ТЗ()
Перем ТЗ, _Ключ, _Значение;
ТЗ = НоваяТЗ( В_Массив) ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = 0 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = _Ключ + 1 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПрочитатьОбъект_ТЗ()
Перем Рез;
НомЛексемы = 0 ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Рез = ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Рез = ПолучитьМассив_ТЗ( ) ;
Иначе
Рез = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
КонецЕсли ;
Если ( Рез = 0 ) Или ( ТекЛексема < > Л_Финиш) Тогда
ОшибкаЛексемы( ) ;
Возврат 0 ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция СгенерироватьТЗ(НачАнализируемаяСтрока)
Перем НачальныйСимвол, Рез;
АнализируемаяСтрока = НачАнализируемаяСтрока;
СтекЛексем = СоздатьОбъект( "ТаблицаЗначений" ) ;
СтекЛексем. НоваяКолонка( "Лексема" , "Строка" ) ;
СтекЛексем. НоваяКолонка( "Значение" , "Строка" ) ;
ФлагОшибки = 0 ;
НомерСимвола = 1 ;
Пока НомерСимвола < = СтрДлина( АнализируемаяСтрока) Цикл
НачальныйСимвол = ТекущиеСимволы( 1 ) ;
Если Найти( " " + Симв( 9 ) , НачальныйСимвол) > 0 Тогда
НомерСимвола = НомерСимвола + 1 ;
ИначеЕсли НачальныйСимвол = Л_Кавычка Тогда
ЧитатьСтроку( ) ;
ИначеЕсли Найти( ОдносимвольныеЛексемы, НачальныйСимвол) > 0 Тогда
ДобавитьЛексему( НачальныйСимвол, "" , 1 ) ;
ИначеЕсли Найти( ПервыеСимволыКонстант, НачальныйСимвол) > 0 Тогда
Если ЧитатьКонстанту( НачальныйСимвол) = 0 Тогда
Прервать;
КонецЕсли ;
ИначеЕсли Найти( "-" + Цифры0 _9, НачальныйСимвол) > 0 Тогда
Если ЧитатьЧисло( ) = 0 Тогда
Прервать;
КонецЕсли ;
Иначе
Сообщить( "========= " + НомерСимвола, "!" ) ;
Сообщить( НачальныйСимвол, "!" ) ;
Сообщить( "<" + НачальныйСимвол + "> " + КодСимв( НачальныйСимвол) , "!" ) ;
Сообщить( ТекущиеСимволы( 100 ) , "!" ) ;
Возврат 0 ;
КонецЕсли ;
КонецЦикла ;
Если ФлагОшибки < > 0 Тогда
Сообщить( "Ошибка парсинга JSON - выражения" , "!" ) ;
Возврат 0 ;
ИначеЕсли СтекЛексем. КоличествоСтрок( ) = 0 Тогда
Сообщить( "Пустой стек" , "!" ) ;
Возврат 0 ;
КонецЕсли ;
ДобавитьЛексему( Л_Финиш, "" , 0 ) ;
Возврат ПрочитатьОбъект_ТЗ( ) ;
КонецФункции
Функция JSON_Error(Стр = "" )
Если Стр < > "" Тогда
Сообщить( "JSON-ОШИБКА: " + Стр, "!" ) ;
КонецЕсли ;
Возврат JSON_Error;
КонецФункции
Функция JSON_Type(Парам)
Если ТипЗначенияСтр( Парам) < > "ТаблицаЗначений" Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Парам. КоличествоКолонок( ) < > 2 Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Парам. КоличествоСтрок( ) < 2 Тогда
Возврат JSON_Error( ) ;
КонецЕсли ;
Возврат Парам. ПолучитьЗначение( 1 , 1 ) ;
КонецФункции
Функция JSON_GetValue(Парам, Keys)
Перем Тип, До, После, ПозЗакр, Л1 , П2 , Инд, ИндСтр, НС, КвоСтрок;
Тип = JSON_Type( Парам) ;
ПозЗакр = Найти( Keys, "]" ) ;
Если ПозЗакр = 0 Тогда
ПозЗакр = СтрДлина( Keys) + 1 ;
КонецЕсли ;
До = Лев( Keys, ПозЗакр) ;
После = Сред( Keys, ПозЗакр + 1 ) ;
Л1 = Лев( До, 1 ) ;
П2 = Найти( До, "]" ) ;
Если Тип = JSON_Error Тогда
Возврат JSON_Error( "Параметра" ) ;
КонецЕсли ;
КвоСтрок = Парам. КоличествоСтрок( ) ;
Если До = "" Тогда
Если ( Тип = В_Массив) Или ( Тип = В_Объект) Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Тип = В_Значение Тогда
Возврат Парам. ПолучитьЗначение( 2 , 2 ) ;
Иначе
Возврат JSON_Error( "№ 1" ) ;
КонецЕсли ;
ИначеЕсли До = ".length" Тогда
Если ( Тип = В_Массив) Или ( Тип = В_Объект) Тогда
Возврат Парам. КоличествоСтрок( ) - 1 ;
Иначе
Возврат JSON_Error( "Длина скаляра" ) ;
КонецЕсли ;
ИначеЕсли Л1 = "[" Тогда
Если П2 = 0 Тогда
Возврат JSON_Error( "Индексация: <" + До + ">" ) ;
КонецЕсли ;
Инд = Сред( До, 2 , П2 - 2 ) ;
Если ( Найти( "'"" " , Лев( Инд, 1 ) ) > 0 ) И ( Найти( "'"" " , Прав( Инд, 1 ) ) > 0 ) Тогда
ИндСтр = Сред( Инд, 2 , СтрДлина( Инд) - 2 ) ;
Если Тип < > В_Объект Тогда
Возврат JSON_Error( "Строковый индекс <" + ИндСтр + "> только для Объекта" ) ;
КонецЕсли ;
НС = 0 ;
Если Парам. НайтиЗначение( ИндСтр, НС, 1 ) = 1 Тогда
Возврат JSON_GetValue( Парам. ПолучитьЗначение( НС, 2 ) , После) ;
КонецЕсли ;
Возврат JSON_Error( "Нет индекса <" + ИндСтр + ">" ) ;
КонецЕсли ;
ИндЧис = 0 + Инд;
Если "" + ИндЧис < > Инд Тогда
Возврат JSON_Error( "Ошибка 1 числового индекса <" + Инд + ">" ) ;
ИначеЕсли Цел( ИндЧис) < > ИндЧис Тогда
Возврат JSON_Error( "Ошибка 2 числового индекса <" + Инд + "> (нецелый)" ) ;
ИначеЕсли ИндЧис < 0 Тогда
Возврат JSON_Error( "Ошибка 3 числового индекса <" + Инд + "> (отрицательный)" ) ;
ИначеЕсли ИндЧис > ( КвоСтрок - 2 ) Тогда
Возврат JSON_Error( "Ошибка 4 числового индекса <" + Инд + "> (" + ИндЧис + ">" + ( КвоСтрок - 2 ) + ")" ) ;
КонецЕсли ;
Возврат JSON_GetValue( Парам. ПолучитьЗначение( ИндЧис + 1 , 2 ) , После) ;
Иначе
Возврат JSON_Error( "Ошибка 5 <" + До + ">" ) ;
КонецЕсли ;
КонецФункции
Процедура ПриОткрытии()
Перем Рез1 , ТипУзла1 , Зн1 , Значение;
ОчиститьОкноСообщений( ) ;
СтатусВозврата( 0 ) ;
Рез1 = СгенерироватьТЗ( ПрочитатьФайл( ТекКаталог + "j1.json" ) ) ;
Напечатать_ТЗ( Рез1 ) ;
ТипУзла1 = JSON_Type( Рез1 ) ;
Сообщить( "Тип узла: " + ТипУзла1 ) ;
Зн1 = JSON_GetValue( Рез1 , ".length" ) ; Сообщить( "1) Размер: " + Зн1 ) ;
Зн3 = JSON_GetValue( Рез1 , "['1']" ) ; Сообщить( "3) ['1']: <" + Зн3 + ">" ) ;
Зн4 = JSON_GetValue( Рез1 , "[1]" ) ; Сообщить( "4) [1]: <" + Зн4 + ">" ) ;
Зн5 = JSON_GetValue( Рез1 , "['Массив'][6]" ) ; Сообщить( "5) [*]: <" + Зн5 + ">" ) ;
Зн6 = JSON_GetValue( Рез1 , "['Соответствие']['ДопустимоеИмяСвойства']" ) ; Сообщить( "6) [*]: <" + Зн6 + ">" ) ;
КонецПроцедуры
Процедура ДобавитьСтроковуюКонстанту(КонстантаСтр)
Перем ПервыйСимвол;
ПервыйСимвол = Лев( КонстантаСтр, 1 ) ;
ПервыеСимволыКонстант = ПервыеСимволыКонстант + ПервыйСимвол;
СписокСтроковыхКонстант. Установить( ПервыйСимвол, КонстантаСтр) ;
КонецПроцедуры
РасположениеФайла( ТекКаталог, ТекФайл) ;
Л_Лев_Фиг_Скобка = "{" ;
Л_Прав_Фиг_Скобка = "}" ;
Л_Лев_Кв_Скобка = "[" ;
Л_Прав_Кв_Скобка = "]" ;
Л_Двоеточие = ":" ;
Л_Запятая = "," ;
Л_Экран = "\" ;
Л_Кавычка = """ " ;
Л_Финиш = "" ;
Л_Число = "number" ;
Л_Строка = "string" ;
Л_Константа = "const" ;
ОдносимвольныеЛексемы = Л_Лев_Фиг_Скобка + Л_Прав_Фиг_Скобка + Л_Лев_Кв_Скобка + Л_Прав_Кв_Скобка + Л_Двоеточие + Л_Запятая;
Цифры1 _9 = "123456789" ;
Цифры0 _9 = "0" + Цифры1 _9;
В_Массив = "###array" ;
В_Объект = "###object" ;
В_Значение = "###value" ;
СписокСтроковыхКонстант = СоздатьОбъект( "СписокЗначений" ) ;
ПервыеСимволыКонстант = "" ;
ДобавитьСтроковуюКонстанту( "null" ) ;
ДобавитьСтроковуюКонстанту( "false" ) ;
ДобавитьСтроковуюКонстанту( "true" ) ;
JSON_Error = "ERROR" ;
В качестве примера взят файл j1.json :
{
"999": 88,
"Null": null,
"Сэкраном": "\"",
"Ложь": false,
"ОдинСимв": "1",
"1": "11111",
"Пустышка": "",
"Истина": true,
"Число (плавающая точка)": 1.001e-2,
"Число (плавающая)": -1.001e-2,
"Число (фиксированная точка)": -1000.001,
"Дата": "2011-01-01T12:00:00Z",
"Строка (двойная кавычка)": "Двойная кавычка",
"Строка (одинарная кавычка)": "Одинарная кавычка",
"Маскируемые символы": " \\ \/ \b \t \n \f \r \" ",
"Заковыристая строка": "\\n\\",
"Проблемные символы": "Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f; Юникод символы: \u0421\u0430\u0448\u0430\u0020\u003a\u0029",
"Кириллические символы": "’АБВГҐДЂЃЕ?ЁЄЖЗЅИ?ІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ",
"Идентификатор": "a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
"Пустой массив": [],
"Пустой объект": {},
"Массив": [
null,
false,
true,
1.001e-2,
-1000.001,
"2011-01-01T12:00:00Z",
"Двойная кавычка",
"Одинарная кавычка",
"a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
[
"Первый элемент",
"Второй элемент"
],
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
}
],
"Структура":
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
"Соответствие":
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
},
"Ссылка":
{
"Ссылка": "00000000-0000-0000-0000-000000000000",
"Представление": "Неизвестная ссылка"
},
"COMSafeArray": [
0,
1,
2,
3,
4,
5
]
}
Категория:
HTML, JS, VML Как программно создать нового пользователя или скопировать настройки существующего? Часто встречаю вопросы касаемые программного создания и настройки прав пользователей.
В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.
В приложении к статье обработки, код которых приведен ниже: Скачать обработки
Обработки были написаны под УТ, но, при необходимости, вы можете их легко доработать под другие конфигурации.
Управляемое приложение: В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.
! В типовых конфигурациях для работы с пользователями активно используется БСП !
В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ , ПрочитатьПользователяИБ , ЗаписатьПользователяИБ иУдалитьПользователяИБ .
Код создания нового пользователя с использованием БСП:
Код 1C v 8.3 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)
Пользователь = Обработки. НастройкиПользователей. ИмяПользователяИБ( ПользовательСсылка) ;
Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей. Колонки. Добавить( "Пользователь" ) ;
ТаблицаПользователей = Обработки. НастройкиПользователей. ПользователиДляКопирования( ПользовательСсылка, ТаблицаПользователей,
ТипЗнч( ПользовательСсылка) = Тип( "СправочникСсылка.ВнешниеПользователи" ) ) ;
Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники. Добавить( ПользовательПриемник) ;
КонецЦикла ;
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки. Добавить( "НастройкиОтчетов" ) ;
КопируемыеНастройки. Добавить( "НастройкиВнешнегоВида" ) ;
КопируемыеНастройки. Добавить( "ПерсональныеНастройки" ) ;
КопируемыеНастройки. Добавить( "Избранное" ) ;
КопируемыеНастройки. Добавить( "НастройкиПечати" ) ;
КопируемыеНастройки. Добавить( "ПрочиеПользовательскиеНастройки" ) ;
НастройкиСкопированы = Обработки. НастройкиПользователей.
КопированиеНастроекПользователей( ПользовательСсылка, Приемники, КопируемыеНастройки) ;
Возврат НастройкиСкопированы;
КонецФункции
Функция СоздатьНовыйУровеньДоступа(ФИО)
Рез = Справочники. CRM_УровниДоступа. НайтиПоНаименованию( ФИО) ;
Если Рез = Неопределено ИЛИ Рез = Справочники. CRM_УровниДоступа. ПустаяСсылка( ) Тогда
НовыйОбъект = Справочники. CRM_УровниДоступа. СоздатьЭлемент( ) ;
НовыйОбъект. Наименование = ФИО;
НовыйОбъект. Записать( ) ;
возврат НовыйОбъект. Ссылка;
КонецЕсли ;
КонецФункции
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( Объект. ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Наименование) ) ;
ОписаниеПользователяИБ = Пользователи. НовоеОписаниеПользователяИБ( ) ;
ПользовательИБСуществует = Ложь ;
ДоступКИнформационнойБазеРазрешен = Ложь ;
Если ОбщегоНазначенияПовтИсп. РазделениеВключено( ) Тогда
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора = Ложь ;
Иначе
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора =
НЕ Константы. ИспользоватьВнешнихПользователей. Получить( ) ;
КонецЕсли ;
ОписаниеПользователяИБ. АутентификацияСтандартная = Истина ;
ОписаниеПользователяИБ. Роли = Новый Массив;
ПрочитанныеСвойства = Неопределено ;
Если Пользователи. ПрочитатьПользователяИБ(
ПользовательНастроек. ИдентификаторПользователяИБ, ПрочитанныеСвойства
) Тогда
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли" ) ;
КонецЕсли ;
ОписаниеПользователяИБ. Вставить( "Действие" , "Записать" ) ;
ОписаниеПользователяИБ. Вставить( "Имя" , Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Наименование = Объект. ФИОСоздаваемогоПользователя;
НовыйПользователь. ТекущееПодразделение = ПользовательНастроек. ТекущееПодразделение;
НовыйПользователь. CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа( Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь. Недействителен = ложь ;
НовыйПользователь. ДополнительныеСвойства. Вставить(
"ОписаниеПользователяИБ" , ОписаниеПользователяИБ) ;
НовыйПользователь. Записать( ) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Состав. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Пользователи. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
КопированиеВсехНастроек( ПользовательНастроек, НовыйПользователь. Ссылка) ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура СоздатьПользователяНаСервере()
Если НЕ ЗначениеЗаполнено( Объект. ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( Объект. ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
тИзменяемыйПользователь = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ИзменяемыйПользователь. Наименование) ) ;
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ШаблонПользователяДляКопирования. Наименование) ) ;
тИзменяемыйПользователь. Роли. Очистить( ) ;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
тИзменяемыйПользователь. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
тИзменяемыйПользователь. Записать( ) ;
КопированиеВсехНастроек( ШаблонПользователяДляКопирования, ИзменяемыйПользователь) ;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере( Объект. ИзменяемыйПользователь, Объект. ШаблонПользователяДляКопирования) ;
КонецПроцедуры
Обычное приложение: В обычном все проще:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено( ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Код) ) ;
ПользовательИБ = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
ПользовательИБ. Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ. АутентификацияСтандартная = Истина ;
ПользовательИБ. Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ. ПолноеИмя = ФИОСоздаваемогоПользователя;
ПользовательИБ. ПоказыватьВСпискеВыбора = Истина ;
ПользовательИБ. ОсновнойИнтерфейс = Пользователь_Шаблон. ОсновнойИнтерфейс;
ПользовательИБ. Язык = Пользователь_Шаблон. Язык;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
ПользовательИБ. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
ПользовательИБ. Записать( ) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Код = ФИОСоздаваемогоПользователя;
НовыйПользователь. Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь. Родитель = ПользовательНастроек. Родитель;
НовыйПользователь. Подразделение = ПользовательНастроек. Подразделение;
НовыйПользователь. Категория = ПользовательНастроек. Категория;
НовыйПользователь. Руководитель = ПользовательНастроек. Руководитель;
НовыйПользователь. Действует = ПользовательНастроек. Действует;
НовыйПользователь. Записать( ) ;
НаборПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборПользователя. Отбор. Пользователь. Установить( ПользовательНастроек) ;
НаборПользователя. Прочитать( ) ;
НаборНовогоПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборНовогоПользователя. Отбор. Пользователь. Установить( НовыйПользователь. Ссылка) ;
Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя. Добавить( ) ;
ЗаполнитьЗначенияСвойств( НоваяСтрокаНастроек, СтрокаНастроек) ;
НоваяСтрокаНастроек. Пользователь = НовыйПользователь. Ссылка;
Если Найти( СтрокаНастроек. Настройка. Наименование, "Основной ответственный" ) Тогда
НоваяСтрокаНастроек. Значение = НовыйПользователь. Ссылка;
КонецЕсли ;
КонецЦикла ;
Если НаборНовогоПользователя. Количество( ) > 0 Тогда
НаборНовогоПользователя. Записать( ) ;
КонецЕсли ;
сообщить( "Создан пользователь " + ФИОСоздаваемогоПользователя) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. ПользователиГруппы. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
еще пример:
Код 1C v 8.х Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
Пользователь = ПользователиИнформационнойБазы. НайтиПоИмени( ИмяПользователя) ;
Если Пользователь = Неопределено Тогда
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы. ПолучитьПользователей( ) Цикл
Если ТекущийПользователь. ПользовательОС = ДоменноеИмя Тогда
Пользователь = ТекущийПользователь;
Прервать ;
Конецесли ;
КонецЦикла ;
КонецЕсли ;
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
КонецЕсли ;
Пользователь. АутентификацияОС = АутентификацияОС;
Пользователь. АутентификацияСтандартная = Авторизация1 СПредприятия;
Пользователь. ЗапрещеноИзменятьПароль = Истина ;
Пользователь. Имя = ИмяПользователя;
Пользователь. ПолноеИмя = ИмяПользователя;
Пользователь. ПоказыватьВСпискеВыбора = Ложь ;
Пользователь. ПользовательОС = ДоменноеИмя;
Пользователь. Роли. Очистить( ) ;
МассивИменРолей = Новый Массив( ) ;
Для Каждого Роль Из МассивРолей. Role Цикл
МассивИменРолей. Добавить( Роль) ;
КонецЦикла ;
ТекстЗапроса = "ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|ГДЕ
| ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)" ;
Запрос = Новый Запрос( ТекстЗапроса) ;
Запрос. УстановитьПараметр( "МассивИменРолей" , МассивИменРолей) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Для Каждого Роль Из Результат Цикл
НайденнаяРоль = Метаданные. Роли. Найти( Роль. Имя) ;
Если НайденнаяРоль < > Неопределено Тогда
Пользователь. Роли. Добавить( НайденнаяРоль) ;
КонецЕсли ;
КонецЦикла ;
Пользователь. Записать( ) ;
Если Не ПользовательАктивен Тогда
ДективироватьПользователя( Пользователь) ;
КонецЕсли ;
ЗаполнитьСправочникПользователя( Пользователь) ;
Возврат Истина ;
КонецФункции
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ИСТИНА КАК ЕстьПользователь,
| Пользователи.Ссылка КАК Пользователь
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЛОЖЬ,
| NULL" ;
Запрос = Новый Запрос( ТекстЗапроса) ;
Запрос. УстановитьПараметр( "ИдентификаторПользователяИБ" , ПользовательИБ. УникальныйИдентификатор) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) [0 ];
ОписаниеПользователя = Пользователи. НовоеОписаниеПользователяИБ( ) ;
Если Результат. ЕстьПользователь Тогда
ПользовательОбъект = Результат. Пользователь. ПолучитьОбъект( ) ;
Иначе
ПользовательОбъект = Справочники. Пользователи. СоздатьЭлемент( ) ;
ПользовательОбъект. ИдентификаторПользователяИБ = ПользовательИБ. УникальныйИдентификатор;
ПользовательОбъект. Наименование = ПользовательИБ. Имя;
ОписаниеПользователя. Вставить( "Действие" , "Записать" ) ;
ПользовательОбъект. ДополнительныеСвойства. Вставить( "ОписаниеПользователяИБ" , ОписаниеПользователя) ;
КонецЕсли ;
ЗаполнитьЗначенияСвойств( ОписаниеПользователя, ПользовательИБ) ;
Для Каждого Элемент Из ОписаниеПользователя Цикл
ПользовательОбъект. ДополнительныеСвойства. Вставить( Элемент. Ключ, Элемент. Значение) ;
КонецЦикла ;
ПользовательОбъект. ДополнительныеСвойства. Удалить( "Роли" ) ;
ПользовательОбъект. Записать( ) ;
КонецПроцедуры
Категория:
Пользователь, роль доступа, интерфейс Своя нумерация документов (сделали свою, т.к. штатную нумерацию испортили) Обратился ко мне старый клиент и говорит - беда с нумерацией счетов!
Менеджеры, кто как хотел - так и изменял номера документов. с префиксом, без, писали даже б/н. Но тут пришел новый бухгалтер и сказал - нужно с 1 октября запустить авто нумерацию с номера 00010000, но старые счета не трогать!
Попросили - сделали:
т.к. Старые трогать нельзя - простое восстановление нумерации отпадает
Первое решение, которое пришло в голову, сделать выборку по моментувремени создания счета - обратная сортировка - получить первый - и к полученному номеру документа +1
Но оказалось, что бывает такое: менеджеры создают счета сегодня, но ставят дату вчера - и получается только что созданный документ уже не последний пришлось переделать алгоритм.
Нужно сортировать именно по дате создания документа! Реквизита такого нет, но решение было найдено в ГУИДе документа, вот статья на эту тему: Как по GUID определить время и дату создания ссылки?
Только алгоритм решили немного переделать - не получаем дату создания документа, а сортируем по части ГУИДа, которая является началом периода создания документа.
Код получился такой:
Код 1C v 8.2 УП
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый( ) Тогда
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ ПЕРВЫЕ 30
| СчетНаОплатуПокупателю.Номер,
| СчетНаОплатуПокупателю.Ссылка
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|
|УПОРЯДОЧИТЬ ПО
| СчетНаОплатуПокупателю.МоментВремени УБЫВ" ;
Результат = Запрос. Выполнить( ) . Выбрать( ) ;
спНомеров = Новый СписокЗначений;
Пока Результат. Следующий( ) Цикл
тевгуид = Результат. Ссылка. УникальныйИдентификатор( ) ; спНомеров. Добавить( Результат. Ссылка, Сред( тевгуид, 10 , 9 ) + Сред( тевгуид, 0 , 8 ) ) ;
КонецЦикла ;
спНомеров. СортироватьПоПредставлению( НаправлениеСортировки. Убыв) ;
послНомер = спНомеров[0 ]. Значение. Номер;
ДлиНом= СтрДлина( СокрЛП( послНомер) ) ;
Номер = Формат( Число( послНомер) + 1 , "ЧЦ=" + ДлиНом+ "; ЧВН=; ЧГ=0" ) ;
КонецЕсли ;
КонецПроцедуры
Встречалось ли у вас такая ситуация? Как решали?
Категория:
Документы Пример создания внешней печатной формы для управляемого приложения Пример создания внешней печатной формы АКТа для Бухгалтерии 3.0
1. В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя.
2. В модуле обработки пишем код. Постараюсь его максимально комментировать. Главное должно быть:
функция ПечатьВнешнейПечатнойФормы табличного документа - которая выведет данные в макет функция Печать - вызывается из конфигурации! в нее передается массив печатаемых объектов и функция СведенияОВнешнейОбработке(). Она необходима для регистрации печатной формы в справочнике ДополнительныеОтчетыИОбработки, в ней собирается структура с данными для подключения формы. Эта функция, а также ряд сопутствующих ей, практически одинаковы для всех печатных форм, поэтому их можно просто копировать в новую печатную форму ничего не меняя.
Код 1C v 8.3
Функция ПечатьВнешнейПечатнойФормы(МассивОбъектов, ОбъектыПечати, Подписант) Экспорт
ТабДок = новый ТабличныйДокумент;
Макет = ПолучитьМакет( "Макет" ) ;
ОбластьШапки = Макет. ПолучитьОбласть( "Шапка" ) ;
ОбластьДанные = Макет. ПолучитьОбласть( "Данные" ) ;
ОбластьПодвал = Макет. ПолучитьОбласть( "Подвал" ) ;
Запрос = новый запрос;
Запрос. УстановитьПараметр( "МассивОбъектов" , МассивОбъектов) ;
Запрос. Текст = "ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.Сумма,
| РеализацияТоваровУслугТовары.Количество,
| РеализацияТоваровУслугТовары.Цена,
| РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваровУслугУслуги.Номенклатура,
| РеализацияТоваровУслугУслуги.Сумма,
| РеализацияТоваровУслугУслуги.Количество,
| РеализацияТоваровУслугУслуги.Цена,
| РеализацияТоваровУслугУслуги.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
|ГДЕ
| РеализацияТоваровУслугУслуги.Ссылка В(&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Ссылка" ;
ОбщаяВыборка = Запрос. Выполнить( ) . Выгрузить( ) ;
Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл
ОбластьШапки. Параметры. ТекстЗаголовка = "Акт № " + СсылкаНаОбъект. Номер;
ОбластьШапки. Параметры. Организация = СсылкаНаОбъект. Организация;
ТабДок. Вывести( ОбластьШапки) ;
Отбор = Новый Структура;
Отбор. Вставить( "Ссылка" , СсылкаНаОбъект) ;
Выборка = ОбщаяВыборка. НайтиСтроки( Отбор) ;
ИтогоСумма = 0 ;
ИтогоКоличество = 0 ;
Для Каждого Стр из Выборка Цикл
ЗаполнитьЗначенияСвойств( ОбластьДанные. Параметры, Стр) ;
ИтогоСумма = ИтогоСумма + Стр. Сумма;
ИтогоКоличество = ИтогоКоличество + Стр. Количество;
ТабДок. Вывести( ОбластьДанные) ;
КонецЦикла ;
ОбластьПодвал. Параметры. ИтогоСумма = ИтогоСумма;
ОбластьПодвал. Параметры. Подписант = Подписант;
ТабДок. Вывести( ОбластьПодвал) ;
ТабДок. ВывестиГоризонтальныйРазделительСтраниц( ) ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции
Процедура Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью. НужноПечататьМакет( КоллекцияПечатныхФорм, "АКТПечатьВнешняя" ) Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы( МассивОбъектовНазначения, ОбъектыПечати, "" ) ;
УправлениеПечатью. ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "АКТПечатьВнешняя" , "АКТ (внешний)" , ТабличныйДокумент) ;
ИначеЕсли УправлениеПечатью. НужноПечататьМакет( КоллекцияПечатныхФорм, "АКТПечатьВнешняяИван" ) Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы( МассивОбъектовНазначения, ОбъектыПечати, "Иванов А.Ю." ) ;
УправлениеПечатью. ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "АКТПечатьВнешняяИван" , "АКТ (внешний) Иванов" , ТабличныйДокумент) ;
ИначеЕсли УправлениеПечатью. НужноПечататьМакет( КоллекцияПечатныхФорм, "АКТПечатьВнешняяПетр" ) Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы( МассивОбъектовНазначения, ОбъектыПечати, "Петров В.С." ) ;
УправлениеПечатью. ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "АКТПечатьВнешняяПетр" , "АКТ (внешний) Петров" , ТабличныйДокумент) ;
КонецЕсли ;
КонецПроцедуры
#Область СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации. Вставить( "Вид" , "ПечатнаяФорма" ) ;
МассивНазначений = Новый Массив;
МассивНазначений. Добавить( "Документ.РеализацияТоваровУслуг" ) ;
ПараметрыРегистрации. Вставить( "Назначение" , МассивНазначений) ;
ПараметрыРегистрации. Вставить( "Наименование" , "АКТ (Внешний)" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , ЛОЖЬ ) ;
ПараметрыРегистрации. Вставить( "Версия" , "1.0" ) ;
ПараметрыРегистрации. Вставить( "Информация" , "Дополнительная печатная форма" ) ;
ТаблицаКоманд = ПолучитьТаблицуКоманд( ) ;
ДобавитьКоманду( ТаблицаКоманд, "Внешний: АКТ" , "АКТПечатьВнешняя" , "ВызовСерверногоМетода" , Истина , "ПечатьMXL" ) ;
ДобавитьКоманду( ТаблицаКоманд, "Внешний: АКТ (Иванов)" , "АКТПечатьВнешняяИван" , "ВызовСерверногоМетода" , Истина , "ПечатьMXL" ) ;
ДобавитьКоманду( ТаблицаКоманд, "Внешний: АКТ (Петров)" , "АКТПечатьВнешняяПетр" , "ВызовСерверногоМетода" , Истина , "ПечатьMXL" ) ;
ПараметрыРегистрации. Вставить( "Команды" , ТаблицаКоманд) ;
Возврат ПараметрыРегистрации;
КонецФункции
#КонецОбласти
#Область Вспомогательное
Функция ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы = Неопределено, НаименованиеОбработки = "" , Информация = "" , Версия = "1.0" )
Если ТипЗнч( ОбъектыНазначенияФормы) = Тип( "Строка" ) Тогда
ОбъектНазначенияФормы = ОбъектыНазначенияФормы;
ОбъектыНазначенияФормы = Новый Массив;
ОбъектыНазначенияФормы. Добавить( ОбъектНазначенияФормы) ;
КонецЕсли ;
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации. Вставить( "Вид" , "ПечатнаяФорма" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , Истина ) ;
ПараметрыРегистрации. Вставить( "Назначение" , ОбъектыНазначенияФормы) ;
Если Не ЗначениеЗаполнено( НаименованиеОбработки) Тогда
НаименованиеОбработки = ЭтотОбъект. Метаданные( ) . Представление( ) ;
КонецЕсли ;
ПараметрыРегистрации. Вставить( "Наименование" , НаименованиеОбработки) ;
Если Не ЗначениеЗаполнено( Информация) Тогда
Информация = ЭтотОбъект. Метаданные( ) . Комментарий;
КонецЕсли ;
ПараметрыРегистрации. Вставить( "Информация" , Информация) ;
ПараметрыРегистрации. Вставить( "Версия" , Версия) ;
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды. Колонки. Добавить( "Представление" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Идентификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Использование" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "ПоказыватьОповещение" , Новый ОписаниеТипов( "Булево" ) ) ;
Команды. Колонки. Добавить( "Модификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ВызовСерверногоМетода" , ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL" )
НоваяКоманда = ТаблицаКоманд. Добавить( ) ;
НоваяКоманда. Представление = Представление;
НоваяКоманда. Идентификатор = Идентификатор;
НоваяКоманда. Использование = Использование;
НоваяКоманда. ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда. Модификатор = Модификатор;
КонецПроцедуры
#КонецОбласти
3. Добавляем макет вывода печатной формы:
4. Сохраняем и добавляем в конфигурацию:
Подключается через Администрирование - Печатные формы, отчеты и обработки:
Создаете новую обработку, записывайте и при открытии документа Реализация, нажав на Печать - появляются доступные печатные формы с разными подписывающими.
Скачать Шаблон внешней печатной формы для управляемого приложения
Категория:
Внешние печатные формы, отчеты и обработк�… Как сделать Расшифровку в табличном документе Вопрос: Подскажите пожалуйста, каким образом можно сделать следующее.
У меня есть выводимый в табличный документ результат запроса, к ячейке есть расшифровка.
Я хочу чтобы при двойном клике на ячейку выполнялась процедура которая к примеру запускает отчет по расшифровке ячейки.
Ответ: Расшифровки бывают стандартные и нестандартные.
I) Стандартные:
может использоваться как непосредственно в табличном документе, так и в объекте ПолеТабличногоДокумента (т.е.табличный документ, размещенный не в отдельном окне, а непосредственно на форме).
Чтобы Расшифровка сработала, должны выполняться 3 условия:
1) Для ячейки табличного документа, из которой мы хотим вызвать Расшифровку, должно быть установлено свойство ПараметрРасшифровки. Например, мы хотим, чтобы по двойному щелчку на ячейке с названием контрагента открывалась форма элемента справочника Контрагента, чтобы можно было уточнить какие-то данные, которые в отчет не выводятся. Задаем свойству ПараметрРасшифровки какое-нибудь значение, например, РасшифровкаКонтрагента.
2)В процессе вывода областей макета в результирующий табличный документ нужно ОБЯЗАТЕЛЬНО ПРИСВОИТЬ параметру расшифровки значение нужного типа, например:
Код 1C v 8.х ТабДок = Новый ТабличныйДокумент;
Выборка = Справочники. Контрагенты. Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Область = Макет. ПолучитьОбласть( "Строка" ) ;
Область. Параметры. Контрагент = Выборка. Наименование;
Область. Параметры. РасшифровкаКонтрагента = Выборка. Ссылка;
ТабДок. Вывести( Область) ;
КонецЦикла ;
3)Должен быть обеспечен запрет редактирования ячейки с расшифровкой, т.е. нужно указать
ТабДок.ТолькоПросмотр = Истина;
иначе, несмотря на многообещающий вид курсура при наведении на ячейку можно щелкать по ней сколько угодно, но ничего происходить не будет.
II) Нестандартные:
по двойному щелчку на ячейке с расшифровкой можно вызвать свою процедуру. Для реализации этого следует выполнить несколько условий:
1)Вывод табличного документа должен осуществляться в объект ПолеТабличногоДокумента;
2)Должно быть присвоено значение свойству ячейки ПараметрРасшифровки, например, РасшифровкаКонтрагента.
3)Параметру расшифровки РасшифровкаКонтрагента присваивается заполненный при формировании табличного документа нужными значениями СписокЗначений или чаще Структура. В частности, может передаваться имя стандартного отчета конфигурации и параметров, которые нужно задать в форме отчета, например, период дат, номер счета и т.д. А потом этот отчет вызывается как процедура.
4)Для объекта ПолеТабличногоДокумента свойство ТолькоПросмотр нужно установить в значение Истина.
5)Код пользовательской процедуры помещается в процедуру
Код 1C v 8.х ПолеТабличногоДокумента1 ОбработкаРасшифровки( Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Приведу небольшой пример, открывающий для "щелкнутого" контрагента подчиненный справочник.
Код 1C v 8.х Процедура КнопкаСформироватьНажатие(Кнопка)
Контрагенты = Справочники. Контрагенты;
Выборка = Контрагенты. Выбрать( ) ;
Таб = ЭлементыФормы. ПолеТабличногоДокумента1 ;
Макет = ПолучитьМакет( "Макет" ) ;
Пока Выборка. Следующий( ) Цикл
Если Выборка. ЭтоГруппа = Ложь Тогда
Область = Макет. ПолучитьОбласть( "Строка" ) ;
Область. Параметры. Контрагент = Выборка. Наименование;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
СтруктураРасшифровки = Новый Структура;
СтруктураРасшифровки. Вставить( "Контрагент" , Выборка. Ссылка) ;
СтруктураРасшифровки. Вставить( "......." , . . . . . . . . . ) ;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Область. Параметры. РасшифровкаКонтрагента = СтруктураРасшифровки;
ЭлементыФормы. ПолеТабличногоДокумента1 . Вывести( Область) ;
Иначе
Продолжить;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. ПолеТабличногоДокумента1 . ТолькоПросмотр = Истина ;
КонецПроцедуры
Процедура ПолеТабличногоДокумента1ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Договоры = Справочники. Договоры. ПолучитьФормуСписка( ) ;
Договоры. ПараметрОтборПоВладельцу = Расшифровка. Контрагент;
Договоры. Открыть( ) ;
КонецПроцедуры
Категория:
Табличный документ Загрузка картинок в базу 1С (сохранение в хранилище значений) В теме форма: v8: Получение данных из ХралищаЗначений
Bell в управляемом интерфейсе пробует сохранить выбранные картинки в базу 1С, но возникли сложности с сохранением в хранилище значений. как пример Bell приложил CF файл с мини конфигурацией, за что ему большое спасибо, т.к. большая часть материалов этой статьи написана им, я лишь поправил небольшие участки кода связанные с передачей файлов и сохранение в хранилище значений.
Так как везде уже Такси, то CF я перевел в этот режим и в нем демонстрирую.
Имеется справочник Хранилище данных :
Основная Форма Элемента:
Ее код:
Код 1C v 8.3
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект. Ссылка. Пустая( ) Тогда
Объект. Наименование = "." ;
КонецЕсли ;
Если НЕ Параметры. Ключ. Пустая( ) Тогда
ДанныеАдрес = ПолучитьНавигационнуюСсылку( Объект. Ссылка, "ДанныеХЗ" ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект. Ссылка. Пустая( ) Тогда
КонецЕсли ;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища( ДанныеАдрес) Тогда
РежимСжатия = Новый СжатиеДанных( 9 ) ;
ДанныеСохранения = ПолучитьИзВременногоХранилища( ДанныеАдрес) ;
ТекущийОбъект. ДанныеХЗ = Новый ХранилищеЗначения( ДанныеСохранения, РежимСжатия) ;
КонецЕсли ;
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища( ДанныеАдрес) Тогда
УдалитьИзВременногоХранилища( ДанныеАдрес) ;
ДанныеАдрес = ПолучитьНавигационнуюСсылку( ТекущийОбъект. Ссылка, "ДанныеХЗ" ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьДанные(Команда)
ДанныеВыбрать( ) ;
КонецПроцедуры
&НаКлиенте
Процедура СохранитьДанные(Команда)
Если НЕ ЗначениеЗаполнено( Объект. Ссылка) Тогда
Предупреждение( НСтр( "ru = 'Элемент не записан !!!'" ) ) ;
Возврат ;
КонецЕсли ;
ДанныеСохранения = ПолучитьНавигационнуюСсылку( Объект. Ссылка, "ДанныеХЗ" ) ;
ИмяСохранения = Объект. Наименование;
ПолучитьФайл( ДанныеСохранения, ИмяСохранения, Истина ) ;
КонецПроцедуры
&НаКлиенте
Процедура ДанныеВыбрать()
ПолученныеДанныеАдрес = "" ;
Если ПоместитьФайл( ПолученныеДанныеАдрес, , Объект. ДанныеПуть, Истина , УникальныйИдентификатор) Тогда
ДанныеАдрес = ПолученныеДанныеАдрес;
ВыбранныйФайл = Новый Файл( Объект. ДанныеПуть) ;
Объект. Наименование = ВыбранныйФайл. Имя;
Объект. ДанныеТекущаяДата = ТекущаяДата( ) ;
Модифицированность = Истина ;
КонецЕсли ;
КонецПроцедуры
так же имеется общая форма ФормаЗагрузкиФайлов
При помощи ее выбираются файлы изображений и загружаются в справочник - одновременно можно загружать несколько файлов
код формы:
Код 1C v 8.3
&НаКлиенте
Процедура СписокФайловПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина ;
ДобавитьФайлы( ) ;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьФайлы()
ВыборФайла = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Открытие) ;
ВыборФайла. МножественныйВыбор = Истина ;
ВыборФайла. Заголовок = НСтр( "ru = 'Выбор файла'" , "ru" ) ;
ВыборФайла. Фильтр = НСтр( "ru = 'Все файлы'" , "ru" ) + " (*.*)|*.*" ;
ВыборФайла. ПредварительныйПросмотр = Истина ;
Если ВыборФайла. Выбрать( ) Тогда
Для каждого СтрокаФайл Из ВыборФайла. ВыбранныеФайлы Цикл
ОписаниеФайла = Новый Файл( СтрокаФайл) ;
НВС = СписокФайлов. Добавить( ) ;
НВС. ПолноеИмяФайла = СтрокаФайл;
НВС. РазмерФайла = ОписаниеФайла. Размер( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура Загрузить()
Если НЕ ПроверитьЗаполнение( ) Тогда
Возврат ;
КонецЕсли ;
ОчиститьСообщения( ) ;
Если СписокФайлов. Количество( ) = 0 Тогда
Сообщить( "Файлы не выбраны !!!'" ) ;
Возврат ;
КонецЕсли ;
ПомещаемыеФайлы = Новый Массив;
Для каждого СтрокаФайл Из СписокФайлов Цикл
Описание = Новый ОписаниеПередаваемогоФайла( СтрокаФайл. ПолноеИмяФайла, "" ) ;
ПомещаемыеФайлы. Добавить( Описание) ;
КонецЦикла ;
ПомещенныеФайлы = Новый Массив;
СписокЗагруженныхФайлов = Новый СписокЗначений;
Если ПоместитьФайлы( ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь , УникальныйИдентификатор) Тогда
Закрыть( Истина ) ;
Иначе
Сообщение = Новый СообщениеПользователю( ) ;
Сообщение. Текст = НСтр( "ru = 'Файлы не загружены'" , "ru" ) ;
Сообщение. Сообщить( ) ;
КонецЕсли ;
ОповеститьОВыборе( ПомещенныеФайлы) ;
КонецПроцедуры
&НаСервере
Функция ПоместитьВыбранныеФайлыВХранилище(ПомещаемыеФайлы)
АдресХЗ = ПоместитьВоВременноеХранилище( ПомещаемыеФайлы, УникальныйИдентификатор) ;
Возврат АдресХЗ;
КонецФункции
в коде вызывается ОповеститьОВыборе(ПомещенныеФайлы) и срабатывает обработчик в ФормаСпискаДополнительно
Код 1C v 8.3 &НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора. ИмяФормы = "ОбщаяФорма.ФормаЗагрузкиФайлов" Тогда
ОбработкаВыбораПодборНаСервере( ВыбранноеЗначение) ;
КонецЕсли ;
КонецПроцедуры
и следующим кодом идет создание элементов справочника и загрузка изображений из временного хранилища
Код 1C v 8.3 &НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)
Для Каждого СтрокаФайл Из ВыбранноеЗначение Цикл
Файл = Новый Файл( СтрокаФайл. Имя) ;
ХранимыйФайл = Справочники. ХранилищеДанныхСправочники. СоздатьЭлемент( ) ;
ХранимыйФайл. Наименование = Файл. Имя;
ХранимыйФайл. ДанныеПуть = Файл. Путь;
ХранимыйФайл. ДанныеТекущаяДата = ТекущаяДата( ) ;
ХранимыйФайл. ДанныеХЗ = Новый ХранилищеЗначения( ПолучитьИзВременногоХранилища( СтрокаФайл. Хранение) , Новый СжатиеДанных( ) ) ;
ХранимыйФайл. Записать( ) ;
КонецЦикла ;
Элементы. Список. Обновить( ) ;
КонецПроцедуры
Скачать DT - Платформа 8.3.4
Категория:
Работа с Хранилищем Значений