Вывод результата запроса на форму УП в таблицу значений (аналог СоздатьКолонки() для УП) при разработке на обычных формах было удобно выводить результат запроса используя метод СоздатьКолоки():
Код 1C v 8.х Процедура ПоискНажатие(Элемент)
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ДокументоОборот.Этап,
| ДокументоОборот.Отдел,
| ДокументоОборот.ФИО,
| ДокументоОборот.ДатаВремя КАК Дата_Время,
| ДокументоОборот.Документы,
| ДокументоОборот.Примечание,
| ДокументоОборот.Доставка
|ИЗ
| РегистрСведений.ДокументоОборот КАК ДокументоОборот
|ГДЕ
| ДокументоОборот.Документы ПОДОБНОДокументы
| И ДокументоОборот.Доставка.Дата МЕЖДУДатаН ИДатаК
|
|УПОРЯДОЧИТЬ ПО
| ДокументоОборот.ДатаВремя" ;
Запрос. УстановитьПараметр( "Документы" , "%" + СокрЛП( Строка( СтрокаПоиска) ) + "%" ) ;
Запрос. УстановитьПараметр( "ДатаК" , КонПериода) ;
Запрос. УстановитьПараметр( "ДатаН" , НачПериода) ;
Рез= Запрос. Выполнить( ) ;
НайденДок = рез. Выгрузить( ) ;
ЭлементыФормы. НайденДок. СоздатьКолонки( ) ;
В управляемом приложении метод СоздатьКолоки() не доступен, ниже представлена процедура, которая отображает на управляемой форме содержимое таблицы значений переданное ей в качестве параметра:
Пример формы:
Код вывода результата запроса на управляемую форму :
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений)
Если Элементы. Найти( ИмяПоляТаблицыФормы) = Неопределено Тогда
ЭлементРеквизита = Элементы. Добавить( ИмяПоляТаблицыФормы, Тип( "ТаблицаФормы" ) , ) ;
ЭлементРеквизита. ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция;
КонецЕсли ;
УдаляемыеРеквизиты = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты( ИмяРеквизитаДанныеФормыКоллекция) ;
Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
УдаляемыеРеквизиты. Добавить( ИмяРеквизитаДанныеФормыКоллекция+ "." + РеквизитУдаления. Имя) ;
Элементы. Удалить( Элементы[ИмяПоляТаблицыФормы+ РеквизитУдаления. Имя]) ;
КонецЦикла ;
ДобавляемыеРеквизиты = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений. Колонки Цикл
ДобавляемыеРеквизиты. Добавить( Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка. Заголовок) ) ;
КонецЦикла ;
ИзменитьРеквизиты( ДобавляемыеРеквизиты, УдаляемыеРеквизиты) ;
Для каждого Колонка Из ТаблицаЗначений. Колонки Цикл
ЭлементРеквизита = Элементы. Добавить( ИмяПоляТаблицыФормы + Колонка. Имя, Тип( "ПолеФормы" ) , Элементы[ИмяПоляТаблицыФормы]) ;
ЭлементРеквизита. ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка. Имя;
ЭлементРеквизита. Вид = ВидПоляФормы. ПолеВвода;
КонецЦикла ;
ЗначениеВРеквизитФормы( ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция) ;
КонецПроцедуры
&НаСервере
Процедура ВПоискНаСервере()
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка КАК Реализация,
| РеализацияТоваровУслугСерии.Ссылка.ЗаказКлиента КАК ЗаказКлиента,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка.Договор КАК Договор
|ИЗ
| Документ.РеализацияТоваровУслуг.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование ПОДОБНОНаименование)
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ" ;
Запрос. УстановитьПараметр( "Наименование" , "%" + НомерФН+ "%" ) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ТаблицаЗапроса = Запрос. Выполнить( ) . Выгрузить( ) ;
СоздатьТаблицуФормы( "ТЗ" , "ТЗ" , ТаблицаЗапроса) ;
КонецПроцедуры
&НаКлиенте
Процедура ВПоиск(Команда)
ВПоискНаСервере( ) ;
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент запрос ФИО руководителя полностью, сделал на основе оригинальной функции Код 1C v 8.2 УП Функция ОтветственныеЛицаОрганизации(Организация, ДатаСреза, Исполнитель = Неопределено) Экспорт
Результат = Новый Структура( "Руководитель, РуководительДолжность, ГлавныйБухгалтер, Кассир" ) ;
Если Организация < > Неопределено тогда
ЗапросПоЛицам = Новый Запрос( ) ;
ЗапросПоЛицам. УстановитьПараметр( "Организация" , Организация) ;
ЗапросПоЛицам. УстановитьПараметр( "ДатаСреза" , ДатаСреза) ;
ЗапросПоЛицам. Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ОтветственныеЛицаОрганизацииСрезПоследних.ОтветственноеЛицо,
| ОтветственныеЛицаОрганизацииСрезПоследних.Должность.Наименование КАК Должность,
| ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.ФизЛицо) ЕСТЬ NULL ТОГДА ОтветственныеЛицаОрганизацииСрезПоследних.ФизическоеЛицо.Наименование ИНАЧЕ ФИОФизЛицСрезПоследних.Фамилия + ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.Имя) <> "" "" ТОГДА "" "" + (ФИОФизЛицСрезПоследних.Имя) ИНАЧЕ "" "" КОНЕЦ + ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.Отчество) <> "" "" ТОГДА "" "" + (ФИОФизЛицСрезПоследних.Отчество) ИНАЧЕ "" "" КОНЕЦ КОНЕЦ КАК ФИОПолное
|ИЗ
| РегистрСведений.ОтветственныеЛицаОрганизации.СрезПоследних(&ДатаСреза, СтруктурнаяЕдиница =Организация) КАК ОтветственныеЛицаОрганизацииСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаСреза, ФизЛицо ССЫЛКА Справочник.ФизическиеЛица) КАК ФИОФизЛицСрезПоследних
| ПО ОтветственныеЛицаОрганизацииСрезПоследних.ФизическоеЛицо = ФИОФизЛицСрезПоследних.ФизЛицо" ;
Выборка = ЗапросПоЛицам. Выполнить( ) . Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Если Выборка. ОтветственноеЛицо = Перечисления. ОтветственныеЛицаОрганизации. Руководитель Тогда
Результат. Руководитель = Выборка. ФИОПолное;
Результат. РуководительДолжность = Выборка. Должность;
ИначеЕсли Выборка. ОтветственноеЛицо = Перечисления. ОтветственныеЛицаОрганизации. ГлавныйБухгалтер Тогда
Результат. ГлавныйБухгалтер = Выборка. ФИОПолное;
ИначеЕсли Выборка. ОтветственноеЛицо = Перечисления. ОтветственныеЛицаОрганизации. Кассир Тогда
Результат. Кассир = Выборка. ФИОПолное;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Категория:
1С Управление торговлей 10.3 Как программно создать нового пользователя или скопировать настройки существующего? Часто встречаю вопросы касаемые программного создания и настройки прав пользователей.
В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.
В приложении к статье обработки, код которых приведен ниже: Скачать обработки
Обработки были написаны под УТ, но, при необходимости, вы можете их легко доработать под другие конфигурации.
Управляемое приложение: В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.
! В типовых конфигурациях для работы с пользователями активно используется БСП !
В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ , ПрочитатьПользователяИБ , ЗаписатьПользователяИБ иУдалитьПользователяИБ .
Код создания нового пользователя с использованием БСП:
Код 1C v 8.3 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)
Пользователь = Обработки. НастройкиПользователей. ИмяПользователяИБ( ПользовательСсылка) ;
Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей. Колонки. Добавить( "Пользователь" ) ;
ТаблицаПользователей = Обработки. НастройкиПользователей. ПользователиДляКопирования( ПользовательСсылка, ТаблицаПользователей,
ТипЗнч( ПользовательСсылка) = Тип( "СправочникСсылка.ВнешниеПользователи" ) ) ;
Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники. Добавить( ПользовательПриемник) ;
КонецЦикла ;
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки. Добавить( "НастройкиОтчетов" ) ;
КопируемыеНастройки. Добавить( "НастройкиВнешнегоВида" ) ;
КопируемыеНастройки. Добавить( "ПерсональныеНастройки" ) ;
КопируемыеНастройки. Добавить( "Избранное" ) ;
КопируемыеНастройки. Добавить( "НастройкиПечати" ) ;
КопируемыеНастройки. Добавить( "ПрочиеПользовательскиеНастройки" ) ;
НастройкиСкопированы = Обработки. НастройкиПользователей.
КопированиеНастроекПользователей( ПользовательСсылка, Приемники, КопируемыеНастройки) ;
Возврат НастройкиСкопированы;
КонецФункции
Функция СоздатьНовыйУровеньДоступа(ФИО)
Рез = Справочники. CRM_УровниДоступа. НайтиПоНаименованию( ФИО) ;
Если Рез = Неопределено ИЛИ Рез = Справочники. CRM_УровниДоступа. ПустаяСсылка( ) Тогда
НовыйОбъект = Справочники. CRM_УровниДоступа. СоздатьЭлемент( ) ;
НовыйОбъект. Наименование = ФИО;
НовыйОбъект. Записать( ) ;
возврат НовыйОбъект. Ссылка;
КонецЕсли ;
КонецФункции
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( Объект. ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Наименование) ) ;
ОписаниеПользователяИБ = Пользователи. НовоеОписаниеПользователяИБ( ) ;
ПользовательИБСуществует = Ложь ;
ДоступКИнформационнойБазеРазрешен = Ложь ;
Если ОбщегоНазначенияПовтИсп. РазделениеВключено( ) Тогда
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора = Ложь ;
Иначе
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора =
НЕ Константы. ИспользоватьВнешнихПользователей. Получить( ) ;
КонецЕсли ;
ОписаниеПользователяИБ. АутентификацияСтандартная = Истина ;
ОписаниеПользователяИБ. Роли = Новый Массив;
ПрочитанныеСвойства = Неопределено ;
Если Пользователи. ПрочитатьПользователяИБ(
ПользовательНастроек. ИдентификаторПользователяИБ, ПрочитанныеСвойства
) Тогда
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли" ) ;
КонецЕсли ;
ОписаниеПользователяИБ. Вставить( "Действие" , "Записать" ) ;
ОписаниеПользователяИБ. Вставить( "Имя" , Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Наименование = Объект. ФИОСоздаваемогоПользователя;
НовыйПользователь. ТекущееПодразделение = ПользовательНастроек. ТекущееПодразделение;
НовыйПользователь. CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа( Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь. Недействителен = ложь ;
НовыйПользователь. ДополнительныеСвойства. Вставить(
"ОписаниеПользователяИБ" , ОписаниеПользователяИБ) ;
НовыйПользователь. Записать( ) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Состав. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Пользователи. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
КопированиеВсехНастроек( ПользовательНастроек, НовыйПользователь. Ссылка) ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура СоздатьПользователяНаСервере()
Если НЕ ЗначениеЗаполнено( Объект. ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( Объект. ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
тИзменяемыйПользователь = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ИзменяемыйПользователь. Наименование) ) ;
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ШаблонПользователяДляКопирования. Наименование) ) ;
тИзменяемыйПользователь. Роли. Очистить( ) ;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
тИзменяемыйПользователь. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
тИзменяемыйПользователь. Записать( ) ;
КопированиеВсехНастроек( ШаблонПользователяДляКопирования, ИзменяемыйПользователь) ;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере( Объект. ИзменяемыйПользователь, Объект. ШаблонПользователяДляКопирования) ;
КонецПроцедуры
Обычное приложение: В обычном все проще:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено( ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Код) ) ;
ПользовательИБ = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
ПользовательИБ. Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ. АутентификацияСтандартная = Истина ;
ПользовательИБ. Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ. ПолноеИмя = ФИОСоздаваемогоПользователя;
ПользовательИБ. ПоказыватьВСпискеВыбора = Истина ;
ПользовательИБ. ОсновнойИнтерфейс = Пользователь_Шаблон. ОсновнойИнтерфейс;
ПользовательИБ. Язык = Пользователь_Шаблон. Язык;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
ПользовательИБ. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
ПользовательИБ. Записать( ) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Код = ФИОСоздаваемогоПользователя;
НовыйПользователь. Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь. Родитель = ПользовательНастроек. Родитель;
НовыйПользователь. Подразделение = ПользовательНастроек. Подразделение;
НовыйПользователь. Категория = ПользовательНастроек. Категория;
НовыйПользователь. Руководитель = ПользовательНастроек. Руководитель;
НовыйПользователь. Действует = ПользовательНастроек. Действует;
НовыйПользователь. Записать( ) ;
НаборПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборПользователя. Отбор. Пользователь. Установить( ПользовательНастроек) ;
НаборПользователя. Прочитать( ) ;
НаборНовогоПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборНовогоПользователя. Отбор. Пользователь. Установить( НовыйПользователь. Ссылка) ;
Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя. Добавить( ) ;
ЗаполнитьЗначенияСвойств( НоваяСтрокаНастроек, СтрокаНастроек) ;
НоваяСтрокаНастроек. Пользователь = НовыйПользователь. Ссылка;
Если Найти( СтрокаНастроек. Настройка. Наименование, "Основной ответственный" ) Тогда
НоваяСтрокаНастроек. Значение = НовыйПользователь. Ссылка;
КонецЕсли ;
КонецЦикла ;
Если НаборНовогоПользователя. Количество( ) > 0 Тогда
НаборНовогоПользователя. Записать( ) ;
КонецЕсли ;
сообщить( "Создан пользователь " + ФИОСоздаваемогоПользователя) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. ПользователиГруппы. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
еще пример:
Код 1C v 8.х Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
Пользователь = ПользователиИнформационнойБазы. НайтиПоИмени( ИмяПользователя) ;
Если Пользователь = Неопределено Тогда
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы. ПолучитьПользователей( ) Цикл
Если ТекущийПользователь. ПользовательОС = ДоменноеИмя Тогда
Пользователь = ТекущийПользователь;
Прервать ;
Конецесли ;
КонецЦикла ;
КонецЕсли ;
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
КонецЕсли ;
Пользователь. АутентификацияОС = АутентификацияОС;
Пользователь. АутентификацияСтандартная = Авторизация1 СПредприятия;
Пользователь. ЗапрещеноИзменятьПароль = Истина ;
Пользователь. Имя = ИмяПользователя;
Пользователь. ПолноеИмя = ИмяПользователя;
Пользователь. ПоказыватьВСпискеВыбора = Ложь ;
Пользователь. ПользовательОС = ДоменноеИмя;
Пользователь. Роли. Очистить( ) ;
МассивИменРолей = Новый Массив( ) ;
Для Каждого Роль Из МассивРолей. Role Цикл
МассивИменРолей. Добавить( Роль) ;
КонецЦикла ;
ТекстЗапроса = "ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|ГДЕ
| ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)" ;
Запрос = Новый Запрос( ТекстЗапроса) ;
Запрос. УстановитьПараметр( "МассивИменРолей" , МассивИменРолей) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Для Каждого Роль Из Результат Цикл
НайденнаяРоль = Метаданные. Роли. Найти( Роль. Имя) ;
Если НайденнаяРоль < > Неопределено Тогда
Пользователь. Роли. Добавить( НайденнаяРоль) ;
КонецЕсли ;
КонецЦикла ;
Пользователь. Записать( ) ;
Если Не ПользовательАктивен Тогда
ДективироватьПользователя( Пользователь) ;
КонецЕсли ;
ЗаполнитьСправочникПользователя( Пользователь) ;
Возврат Истина ;
КонецФункции
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ИСТИНА КАК ЕстьПользователь,
| Пользователи.Ссылка КАК Пользователь
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЛОЖЬ,
| NULL" ;
Запрос = Новый Запрос( ТекстЗапроса) ;
Запрос. УстановитьПараметр( "ИдентификаторПользователяИБ" , ПользовательИБ. УникальныйИдентификатор) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) [0 ];
ОписаниеПользователя = Пользователи. НовоеОписаниеПользователяИБ( ) ;
Если Результат. ЕстьПользователь Тогда
ПользовательОбъект = Результат. Пользователь. ПолучитьОбъект( ) ;
Иначе
ПользовательОбъект = Справочники. Пользователи. СоздатьЭлемент( ) ;
ПользовательОбъект. ИдентификаторПользователяИБ = ПользовательИБ. УникальныйИдентификатор;
ПользовательОбъект. Наименование = ПользовательИБ. Имя;
ОписаниеПользователя. Вставить( "Действие" , "Записать" ) ;
ПользовательОбъект. ДополнительныеСвойства. Вставить( "ОписаниеПользователяИБ" , ОписаниеПользователя) ;
КонецЕсли ;
ЗаполнитьЗначенияСвойств( ОписаниеПользователя, ПользовательИБ) ;
Для Каждого Элемент Из ОписаниеПользователя Цикл
ПользовательОбъект. ДополнительныеСвойства. Вставить( Элемент. Ключ, Элемент. Значение) ;
КонецЦикла ;
ПользовательОбъект. ДополнительныеСвойства. Удалить( "Роли" ) ;
ПользовательОбъект. Записать( ) ;
КонецПроцедуры
Категория:
Пользователь, роль доступа, интерфейс Как прочитать записи регистра сведений установив отбор и удалить записи? Прочитать записи регистра сведений можно двумя способами: Через Набор Записей или Менеджер
Вот пример через набор записей :
Код 1C v 8.х // Добавление новых данных в существующую запись регистра сведений
НаборЗаписей = РегистрыСведений.ДокументоОборот.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Доставка.Установить(Доставка);
НаборЗаписей.Отбор.Этап.Установить(Этап);
НаборЗаписей.Прочитать();
Для каждого Запись из НаборЗаписей Цикл
Запись.ДатаВремя = ДатаР;
Запись.Отдел = фио .Подразделение;
Запись.ФИО = ПараметрыСеанса.ТекущийПользователь;
Запись.Документы = Документы;
Запись.Примечание = Примечание;
КонецЦикла;
НаборЗаписей.Записать();
Пример с использованием набора записей и менеджера записи:
Код 1C v 8.х НаборЗаписей = РегистрыСведений. CRM_Напоминания. СоздатьНаборЗаписей( ) ;
Отбор = НаборЗаписей. Отбор;
Отбор. Объект. Установить( Объект. Ссылка) ;
Отбор. Завершено. Установить( Ложь ) ;
НаборЗаписей. Прочитать( ) ;
Если НаборЗаписей. Количество( ) > 0 Тогда
Если ЗадаватьВопрос Тогда
ТекстВопроса = "Завершить все напоминания для " + Строка( Объект. Ссылка) + " ?" ;
Ответ = Вопрос( ТекстВопроса, РежимДиалогаВопрос. ДаНет, , КодВозвратаДиалога. Да) ;
Иначе
Ответ = КодВозвратаДиалога. Да
КонецЕсли ;
Если Ответ = КодВозвратаДиалога. Да Тогда
Для каждого Запись Из НаборЗаписей Цикл
РегистрСведенийМенеджерЗаписи = РегистрыСведений. CRM_Напоминания. СоздатьМенеджерЗаписи( ) ;
ЗаполнитьЗначенияСвойств( РегистрСведенийМенеджерЗаписи, Запись) ;
РегистрСведенийМенеджерЗаписи. Прочитать( ) ;
Если РегистрСведенийМенеджерЗаписи. Выбран( ) Тогда
Если НЕ РегистрСведенийМенеджерЗаписи. УдалитьПоИстеченииСрока Тогда
РегистрСведенийМенеджерЗаписи. Завершено = Истина ;
РегистрСведенийМенеджерЗаписи. Записать( ) ;
Иначе
РегистрСведенийМенеджерЗаписи. Удалить( ) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецЕсли ;
А вот пример через менеджер записи:
Код 1C v 8.х МенеджерЗаписи = РегистрыСведений. НоменклатураКонтрагентов. СоздатьМенеджерЗаписи( ) ;
МенеджерЗаписи. Контрагент = Контрагент;
МенеджерЗаписи. Номенклатура = СтрокаТаблицыТовары. Номенклатура;
МенеджерЗаписи. ХарактеристикаНоменклатуры = СтрокаТаблицыТовары. ХарактеристикаНоменклатуры;
МенеджерЗаписи. Прочитать( ) ;
Если МенеджерЗаписи. Выбран( ) Тогда
Вес = МенеджерЗаписи. ВесНоменклатурыКонтрагента;
КонецЕсли ;
Категория:
Регистры сведений Импорт документа Excel через web-клиент Во время реализации задачи по регистрации продаж дистрибьюторов на основании Excel документов столкнулся с интересной задачей. Необходимо реализовать загрузку файла и на стороне сервера обработать его, заполнив табличную часть документа.
Решение состоит из двух функций: клиентской и серверной.
Клиентская часть инициирует выбор файла, передачу выбранного файла на сервер и передача управления серверной процедуре.
Код 1C v 8.2 УП #НаКлиенте
Процедура ИмпортИзВнешнегоФайла(Команда)
Если НЕ ПодключитьРасширениеРаботыСФайлами( ) Тогда
УстановитьРасширениеРаботыСФайлами( ) ;
КонецЕсли ;
Если ПодключитьРасширениеРаботыСФайлами( ) Тогда
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Фильтр = "Текст(*.xls)|*.xls" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. Заголовок = "Выберите файл для импорта" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
Объект. МедицинскиеРаботники. Очистить( ) ;
ДанныеНачинаютсяС = 1 ;
Если Не ВвестиЧисло( ДанныеНачинаютсяС, "Данные начинаются со строки" , 2 , 0 ) Тогда
Возврат ;
КонецЕсли ;
МассивФайлов = ДиалогОткрытияФайла. ВыбранныеФайлы;
ПомещаемыеФайлы = Новый Массив;
Для Каждого Файл Из МассивФайлов Цикл
ТекФайл = Новый Файл( Файл) ;
Описание = Новый ОписаниеПередаваемогоФайла( Файл, "" ) ;
ПомещаемыеФайлы. Добавить( Описание) ;
КонецЦикла ;
ПомещенныеФайлы = Новый Массив;
Если ПоместитьФайлы( ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь , УникальныйИдентификатор) Тогда
ИмпортироватьФайлИзВременногоХранилищаВТЗ( ПомещенныеФайлы, ДанныеНачинаютсяС) ;
КонецЕсли ;
Иначе
Предупреждение( "Файл(ы) не выбран!" ) ;
КонецЕсли ;
Иначе
Предупреждение( НСтр( "ru ='Данная возможность недоступна, так как не подключено расширение работы с файлами.'" , "ru" ) ) ;
КонецЕсли ;
КонецПроцедуры
Серверная процедура перебирает полученные на сервер файлы. Получает COM-объекты и импортирует данные.
Код 1C v 8.2 УП #НаСервере
Процедура ИмпортироватьФайлИзВременногоХранилищаВТЗ(МассивФайлов, ДанныеНачинаютсяС)
ДокументОбъект = РеквизитФормыВЗначение( "Объект" ) ;
Для Каждого ЭлементМассива Из МассивФайлов Цикл
ФайлИзХранилища = ПолучитьИзВременногоХранилища( ЭлементМассива. Хранение) ;
ВременныйФайл = ПолучитьИмяВременногоФайла( "xls" ) ;
ФайлИзХранилища. Записать( ВременныйФайл) ;
Док = ПолучитьCOMОбъект( ВременныйФайл) ;
ФИОУчастника = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 2 ) . Value;
Пока СокрЛП( ФИОУчастника) = "" Цикл
НоваяСтрока = ДокументОбъект. МедицинскиеРаботники. Добавить( ) ;
НоваяСтрока. Фио = ФИОУчастника;
НоваяСтрока. Учреждение = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 7 ) . Value;
НоваяСтрока. Адрес = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 3 ) . Value;
НоваяСтрока. Телефон = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 4 ) . Value;
НоваяСтрока. ЭлПочта = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 5 ) . Value;
НоваяСтрока. Образование = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 6 ) . Value;
ДанныеНачинаютсяС = ДанныеНачинаютсяС + 1 ;
ФИОУчастника = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 2 ) . Value;
КонецЦикла ;
Сообщить( "Импорт завершён" ) ;
Док. Application. Quit( ) ;
КонецЦикла ;
ЗначениеВРеквизитФормы( ДокументОбъект, "Объект" ) ;
КонецПроцедуры
Источник Категория:
Работа с Microsoft Office и OpenOffice Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла( ) ;
Попытка
MSWord = новый COMОбъект( "Word.Application" ) ;
MSWord. Documents. Open( ИмяФайла) ;
MSWordDoc = MSWord. ActiveDocument( ) ;
WordContent = MSWord. ActiveDocument( ) . ActiveWindow. S_election;
Для ТекущаяТаблица = 1 ПО MSWordDoc. Tables. Count Цикл
мТабличнаяЧасть = Неопределено ;
Для ТекущаяСтрока = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Rows. Count Цикл
Для ТекущаяКолонка = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Columns. Count Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока, ТекущаяКолонка) . Range. Text )
, ДокументСсылка) ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
ВсегоСтрокТЧ = 0 ;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть. Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+ 1 ;
КонецЦикла ;
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
MSWordDoc. Tables( ТекущаяТаблица) . Rows. Add( MSWordDoc. Tables( ТекущаяТаблица) . Rows( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) ) ;
КонецЕсли ;
Для ТекКол = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Columns. Count Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ, ТекКол) . Range. Text) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text = ТекстПеременной;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ТекстДокумента = MSWordDoc. Range( 0 , MSWordDoc. Characters. Count) . Text;
Список = ПолучитьСписокПеременных( ТекстДокумента) ;
СтруктураРеквизитов= СтруктураРеквизитовДокумента( ДокументСсылка) ;
ЗначениеРеквизита= "" ;
Для Каждого ЭлементСписка Из Список Цикл
Если СтруктураРеквизитов. Свойство( ЭлементСписка. Значение, ЗначениеРеквизита ) Тогда
WordContent. Find. Execute( "[" + ЭлементСписка. Значение+ "]" , 0 , 0 , 0 , 0 , 0 , - 1 , , , Строка( ЗначениеРеквизита) , 2 ) ;
Иначе
Сообщить( "-> " + ЭлементСписка. Значение+ " - Не найден в структуре документа" ) ;
WordContent. Find. Execute( "[" + ЭлементСписка. Значение+ "]" , 0 , 0 , 0 , 0 , 0 , - 1 , , , " " , 2 ) ;
КонецЕсли ;
КонецЦикла ;
MSWord. S_election. WholeStory( ) ;
MSWord. S_election. Fields. Update( ) ;
MSWord. S_election. HomeKey( ) ;
MSWord. Visible= 1 ;
MSWord. Activate( ) ;
Исключение
Предупреждение( ОписаниеОшибки( ) ) ;
MSWord. Quit( ) ;
КонецПопытки ;
Попытка
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Reflection = ServiceManager. createInstance( "com.sun.star.reflection.CoreReflection" ) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
Args = Новый COMSafeArray( "VT_DISPATCH" , 1 ) ;
OOДокумент = Desktop. loadComponentFromURL( ПреобразоватьВURL( ИмяФайла) , "_blank" , 0 , Args) ;
Для ТекущаяТаблица = 0 ПО OOДокумент. getTextTables( ) . Count- 1 Цикл
мТабличнаяЧасть = Неопределено ;
Для ТекущаяСтрока = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. Count- 1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекущаяКолонка, ТекущаяСтрока) . string )
, ДокументСсылка) ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
ВсегоСтрокТЧ = 0 ;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть. Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+ 1 ;
КонецЦикла ;
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. I_nsertByIndex( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , 1 ) ;
КонецЕсли ;
Для ТекКол = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ) . string) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string = ТекстПеременной;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ТекстДокумента = ООПолучитьТекст( OOДокумент) ;
Список = ПолучитьСписокПеременных( ТекстДокумента) ;
СтруктураРеквизитов= СтруктураРеквизитовДокумента( ДокументСсылка) ;
ЗначениеРеквизита= "" ;
OOЗамена = OOДокумент. CreateReplaceDescriptor( ) ;
Для Каждого ЭлементСписка Из Список Цикл
Если СтруктураРеквизитов. Свойство( ЭлементСписка. Значение, ЗначениеРеквизита ) Тогда
OOЗамена. SearchString = "[" + ЭлементСписка. Значение+ "]" ;
OOЗамена. ReplaceString = Строка( ЗначениеРеквизита) ;
OOДокумент. ReplaceAll( OOЗамена) ;
Иначе
Сообщить( "-> " + ЭлементСписка. Значение+ " - Не найден в структуре документа" ) ;
OOЗамена. SearchString = "[" + ЭлементСписка. Значение+ "]" ;
OOЗамена. ReplaceString = " " ;
OOДокумент. ReplaceAll( OOЗамена) ;
КонецЕсли ;
КонецЦикла ;
OOДокумент. getCurrentController( ) . getFrame( ) . getContainerWindow( ) . setFocus( ) ;
Исключение
Предупреждение( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецПроцедуры
Код 1C v 8.х
Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено)
Если ТипЗнч( Значение) = Тип( "Дата" ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ДФddMMyyyy" , Формат( Значение, "ДФ=dd.MM.yyyy" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ДЛФDD" , Формат( Значение, "ДЛФ=DD" ) ) ;
ИначеЕсли ТипЗнч( Значение) = Тип( "Число" ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧДЦ2ЧГ0" , Формат( Значение, "ЧДЦ=2; ЧГ=0" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧДЦ2" , Формат( Значение, "ЧДЦ=2" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧПропись" , Значение) ;
ИначеЕсли ( ТипЗнч( Значение) = Тип( "СправочникСсылка.КонтактныеЛица" ) ) или ( ТипЗнч( Значение) = Тип( "СправочникСсылка.ФизическиеЛица" ) ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ФИО" , Строка( Значение) ) ;
КонецЕсли
КонецПроцедуры
Процедура ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,РеквизитСсылка,Реквизит,пПредставлениеРеквизита)
мГлубинаРекурсии = мГлубинаРекурсии+ 1 ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "Код" , РеквизитСсылка["Код" ]) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "Наименование" , РеквизитСсылка["Наименование" ]) ;
Для Каждого ЭлементРеквизита Из Реквизит. Реквизиты Цикл
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя, РеквизитСсылка[ЭлементРеквизита. Имя]) ;
Если ( Найти( ЭлементРеквизита. Тип, "Справочник ссылка" ) > 0 ) И ( мГлубинаРекурсии < = 3 ) И ( Найти( ЭлементРеквизита. Тип, "," ) = 0 ) Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, РеквизитСсылка[ЭлементРеквизита. Имя], РеквизитСсылка[ЭлементРеквизита. Имя]. Метаданные( ) , пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя) ;
Иначе
ДобавитьФорматы( ПереченьРеквизитов, РеквизитСсылка[ЭлементРеквизита. Имя], пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя) ;
КонецЕсли
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокПеременных(ТекстШаблона)
СписокПеременных = Новый СписокЗначений( ) ;
ЕщеЕсть = Истина ;
Пока ЕщеЕсть Цикл
ПервыйСимвол = Найти( ТекстШаблона, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ТекстШаблона, "]" ) ;
Если ( ВторойСимвол > 0 И ВторойСимвол > ПервыйСимвол) Тогда
СписокПеременных. Добавить( Сред( ТекстШаблона, ПервыйСимвол + 1 , ВторойСимвол - ПервыйСимвол - 1 ) ) ;
ТекстШаблона = Сред( ТекстШаблона, ВторойСимвол + 1 ) ;
Иначе
ЕщеЕсть = Ложь ;
КонецЕсли ;
Иначе
ЕщеЕсть = Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокПеременных;
КонецФункции
Функция СтруктураРеквизитовДокумента(ДокументСсылка) Экспорт
ПереченьРеквизитов = Новый Структура;
ПереченьРеквизитов. Вставить( "Дата" , ДокументСсылка["Дата" ]) ;
ДобавитьФорматы( ПереченьРеквизитов, ДокументСсылка["Дата" ], "Дата" ) ;
ПереченьРеквизитов. Вставить( "Номер" , ДокументСсылка["Номер" ]) ;
Реквизиты = ДокументСсылка. Метаданные( ) . Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
мГлубинаРекурсии = 1 ;
ПереченьРеквизитов. Вставить( Реквизит. Имя, ДокументСсылка[Реквизит. Имя]) ;
ДобавитьФорматы( ПереченьРеквизитов, ДокументСсылка[Реквизит. Имя], Реквизит. Имя, ДокументСсылка) ;
Если Найти( Реквизит. Тип, "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, ДокументСсылка[Реквизит. Имя], ДокументСсылка[Реквизит. Имя]. Метаданные( ) , Реквизит. Имя) ;
Иначе
КонецЕсли ;
КонецЦикла ;
ТабличныеЧасти = ДокументСсылка. Метаданные( ) . ТабличныеЧасти;
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Если ТабличнаяЧасть. Имя = "Характеристики" Тогда
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть. Имя] Цикл
мПредставлениеРеквизита = "Характеристика" + "_" + СтрЗаменить( СтрокаТабличнойЧасти["ВидХарактеристики" ], " " , "_" ) ;
мЗначение = СтрокаТабличнойЧасти["ЗначениеХарактеристики" ];
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
Если Найти( ТипЗнч( мЗначение) , "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, мЗначение, мЗначение. Метаданные( ) , мПредставлениеРеквизита) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
Реквизиты = ТабличнаяЧасть. Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть. Имя] Цикл
мГлубинаРекурсии = 1 ;
мПредставлениеРеквизита = "_" + СтрокаТабличнойЧасти. НомерСтроки+ "_" + ТабличнаяЧасть. Имя+ "_НомерСтроки" ;
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, Строка( СтрокаТабличнойЧасти. НомерСтроки) ) ;
мПредставлениеРеквизита = "_" + СтрокаТабличнойЧасти. НомерСтроки+ "_" + ТабличнаяЧасть. Имя+ "_" + Реквизит. Имя;
мЗначение = СтрокаТабличнойЧасти[Реквизит. Имя];
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
Если Найти( ТипЗнч( мЗначение) , "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, мЗначение, мЗначение. Метаданные( ) , мПредставлениеРеквизита) ;
Иначе
КонецЕсли ;
КонецЦикла ;
Если Реквизит. Тип. СодержитТип( Тип( "Число" ) ) Тогда
мЗначение = ДокументСсылка[ТабличнаяЧасть. Имя]. Итог( Реквизит. Имя) ;
мПредставлениеРеквизита = "Итог" + "_" + ТабличнаяЧасть. Имя+ "_" + Реквизит. Имя;
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
Возврат ПереченьРеквизитов;
КонецФункции
Функция ИмяТабличнойЧастиВСтроке(Строка,ДокументСсылка)
ТабличнаяЧасть= Неопределено ;
Если НЕ ПустаяСтрока( Строка) Тогда
ТабличнаяЧасть = ДокументСсылка. Метаданные( ) . ТабличныеЧасти. Найти( Строка)
КонецЕсли ;
Возврат ТабличнаяЧасть;
КонецФункции
Функция ПолучитьСтартПеременной(ПереданнаяСтрока) Экспорт
СтартПеременной = "" ;
ПервыйСимвол = Найти( ПереданнаяСтрока, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ПереданнаяСтрока, "]" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > ПервыйСимвол) Тогда
Переменная = ( Сред( ПереданнаяСтрока, ПервыйСимвол+ 1 , ВторойСимвол- ПервыйСимвол- 1 ) ) ;
ВторойСимвол = Найти( Переменная, "_" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > 1 ) Тогда
СтартПеременной = Сред( Переменная, 1 , ВторойСимвол- 1 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Возврат СтартПеременной;
КонецФункции
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока) Экспорт
Переменная = "" ;
ПервыйСимвол = Найти( ПереданнаяСтрока, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ПереданнаяСтрока, "]" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > ПервыйСимвол) Тогда
Переменная = ( Сред( ПереданнаяСтрока, ПервыйСимвол+ 1 , ВторойСимвол- ПервыйСимвол- 1 ) ) ;
КонецЕсли ;
КонецЕсли ;
Возврат Переменная;
КонецФункции
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить( ИмяФайла, "\" , "/" ) ;
КонецФункции
Функция ООПолучитьТекст(OOДокумент)
Текст = "" ;
oParEnum = OOДокумент. getText( ) . createEnumeration( ) ;
Пока oParEnum. hasMoreElements( ) Цикл
oPar = oParEnum. nextElement( ) ;
Если oPar. supportsService( "com.sun.star.text.Paragraph" ) ТОгда
Текст = Текст + oPar. getString( ) ;
ИначеЕсли oPar. supportsService( "com.sun.star.text.TextTable" ) Then
КонецЕсли ;
КонецЦикла ;
Для ТекущаяТаблица = 0 ПО OOДокумент. getTextTables( ) . Count- 1 Цикл
Для ТекущаяСтрока = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. Count- 1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
Текст = Текст + OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекущаяКолонка, ТекущаяСтрока) . string;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
Возврат Текст;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Загрузка данных из XML файла в Таблицу Значений и вывод в Табличный документ Код 1C v 7.x Перем ИмяПути, ИмяФайла;
Перем xmlParser;
Функция УстановитьКомпоненту()
Если ЗагрузитьВнешнююКомпоненту( КаталогИБ( ) + "ExtFormsv7plus.dll" ) = 0 Тогда
Если ЗагрузитьВнешнююКомпоненту( "v7plus.dll" ) = 0 Тогда
Сообщить( "Не удалось обнаружить компоненту V7Plus.dll!" ) ;
Возврат 0 ;
КонецЕсли ;
КонецЕсли ;
Попытка
xmlParser = СоздатьОбъект( "Addin.XmlParser" ) ;
Исключение
Сообщить( "Не удалось создать объект Addin.XmlParser!" ) ;
Возврат 0 ;
КонецПопытки ;
Возврат 1 ;
КонецФункции
Процедура Выполнить()
стрИмяФайла= ИмяПути+ ИмяФайла;
таб= СоздатьОбъект( "ТаблицаЗначений" ) ;
таб. НоваяКолонка( "Ф" , "Строка" , 50 , 0 ) ;
таб. НоваяКолонка( "И" , "Строка" , 50 , 0 ) ;
таб. НоваяКолонка( "О" , "Строка" , 50 , 0 ) ;
таб. НоваяКолонка( "ДатаР" , "Дата" ) ;
таб. НоваяКолонка( "_01" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_02" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_03" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_04" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_05" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_06" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_07" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_08" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_09" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_10" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_11" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_12" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "СумГод" , "Число" , 18 , 2 ) ;
таб. НоваяКолонка( "ОблГод" , "Число" , 18 , 2 ) ;
таб. НоваяКолонка( "УдерГод" , "Число" , 18 , 2 ) ;
таб. НоваяКолонка( "Индекс" , "Строка" , 6 , 0 ) ;
таб. НоваяКолонка( "Регион" , "Строка" , 2 , 0 ) ;
таб. НоваяКолонка( "Город" , "Строка" , 20 , 0 ) ;
таб. НоваяКолонка( "Улица" , "Строка" , 20 , 0 ) ;
таб. НоваяКолонка( "Дом" , "Строка" , 5 , 0 ) ;
таб. НоваяКолонка( "Корпус" , "Строка" , 5 , 0 ) ;
таб. НоваяКолонка( "Квартира" , "Строка" , 5 , 0 ) ;
Документ= xmlParser. СоздатьДокумент( ) ;
Документ. Загрузить( стрИмяФайла) ;
Данные= Документ. ПолучитьПодчиненныйПоНомеру( 2 ) ;
Для Сч= 1 По Данные. КоличествоПодчиненных( ) Цикл
таб. НоваяСтрока( ) ;
Элем= Данные. ПолучитьПодчиненныйПоНомеру( Сч) ;
УзелПолучДох= Элем. ВыбратьУзлы( "ПолучДох" ) ;
Для Сч3 = 0 По УзелПолучДох. КоличествоУзлов- 1 Цикл
ФИО= УзелПолучДох. ПолучитьУзел( Сч3 ) . ПолучитьПодчиненныйПоНомеру( 1 ) ;
таб. Ф= ФИО. ПолучитьПодчиненныйПоНомеру( 1 ) . Текст;
таб. И = ФИО. ПолучитьПодчиненныйПоНомеру( 2 ) . Текст;
таб. О= ФИО. ПолучитьПодчиненныйПоНомеру( 3 ) . Текст;
таб. ДатаР= УзелПолучДох. ПолучитьУзел( Сч3 ) . ПолучитьПодчиненныйПоНомеру( 3 ) . Значение;
адр= УзелПолучДох. ПолучитьУзел( Сч3 ) . ПолучитьПодчиненныйПоНомеру( 6 ) ;
Для Сч4 = 1 По адр. КоличествоПодчиненных( ) Цикл
Если адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Индекс" Тогда
таб. Индекс= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "КодРегион" Тогда
таб. Регион= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Город" Тогда
таб. Город= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Улица" Тогда
таб. Улица= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Дом" Тогда
таб. Дом= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Корпус" Тогда
таб. Корпус= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Кварт" Тогда
таб. Квартира= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
Иначе
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
УзелСвДохСтав= Элем. ВыбратьУзлы( "СвДохСтав" ) ;
Для Сч3 = 0 По УзелСвДохСтав. КоличествоУзлов- 1 Цикл
УзелДохВыч= УзелСвДохСтав. ПолучитьУзел( Сч3 ) . ВыбратьУзлы( "ДохВыч" ) ;
Для Сч4 = 0 По УзелДохВыч. КоличествоУзлов- 1 Цикл
МесДоход= УзелДохВыч. ПолучитьУзел( Сч4 ) ;
ИмяМес= "" ;
СумМес= 0 ;
Если МесДоход. ПолучитьПодчиненныйПоНомеру( 1 ) . Наименование= "НомМес" Тогда
ИмяМес= МесДоход. ПолучитьПодчиненныйПоНомеру( 1 ) . Текст;
КонецЕсли ;
Если МесДоход. ПолучитьПодчиненныйПоНомеру( 3 ) . Наименование= "СумДоход" Тогда
СумМес= МесДоход. ПолучитьПодчиненныйПоНомеру( 3 ) . Значение;
КонецЕсли ;
Если ПустоеЗначение( ИмяМес) = 0 Тогда
Если ИмяМес= "01" Тогда
таб. _01= СумМес;
ИначеЕсли ИмяМес= "02" Тогда
таб. _02= СумМес;
ИначеЕсли ИмяМес= "03" Тогда
таб. _03= СумМес;
ИначеЕсли ИмяМес= "04" Тогда
таб. _04= СумМес;
ИначеЕсли ИмяМес= "05" Тогда
таб. _05= СумМес;
ИначеЕсли ИмяМес= "06" Тогда
таб. _06= СумМес;
ИначеЕсли ИмяМес= "07" Тогда
таб. _07= СумМес;
ИначеЕсли ИмяМес= "08" Тогда
таб. _08= СумМес;
ИначеЕсли ИмяМес= "09" Тогда
таб. _09= СумМес;
ИначеЕсли ИмяМес= "10" Тогда
таб. _10= СумМес;
ИначеЕсли ИмяМес= "11" Тогда
таб. _11= СумМес;
ИначеЕсли ИмяМес= "12" Тогда
таб. _12= СумМес;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
УзелНалПер= УзелСвДохСтав. ПолучитьУзел( Сч3 ) . ВыбратьУзлы( "СГДНалПер" ) ;
НалПер= УзелНалПер. ПолучитьУзел( 0 ) ;
Если НалПер. Наименование= "СГДНалПер" Тогда
таб. СумГод= НалПер. ПолучитьПодчиненныйПоНомеру( 1 ) . Значение;
таб. ОблГод= НалПер. ПолучитьПодчиненныйПоНомеру( 2 ) . Значение;
таб. УдерГод= НалПер. ПолучитьПодчиненныйПоНомеру( 3 ) . Значение;
КонецЕсли ;
КонецЦикла ;
Состояние( Сч) ;
КонецЦикла ;
Т= СоздатьОбъект( "Таблица" ) ;
Т. ИсходнаяТаблица( "Таблица" ) ;
таб. выбратьСтроки( ) ;
Т. ВывестиСекцию( "Шапка" ) ;
нпп= 1 ;
Пока таб. ПолучитьСтроку( ) = 1 Цикл
Т. ВывестиСекцию( "Текст" ) ;
нпп= нпп+ 1 ;
КонецЦикла ;
Т. ТолькоПросмотр( 1 ) ;
Т. Опции( 0 , 0 , 1 , 0 ) ;
Т. ПараметрыСтраницы( 2 , , , 5 , 5 , 5 , 5 , , , 1 ) ;
Т. Показать( "Прочитали из XML" ) ;
КонецПроцедуры
Процедура Выбрать()
ФС. ВыбратьФайл( 0 , ИмяФайла, ИмяПути, "Выберите файл" , "xml файлы (*.xml) |*.xml|Все файлы (*.*) |*.*" , "xml" , ) ;
Если ПустоеЗначение( ИмяФайла) = 0 Тогда
PathSbitn= ИмяПути+ ИмяФайла;
КонецЕсли ;
КонецПроцедуры
Процедура ПриОткрытии()
ИмяФайла = "" ;
ИмяПути = "P:" ;
res= УстановитьКомпоненту( ) ;
КонецПроцедуры
Пример файла XML :
Код
<?xml version="1.0" encoding="windows-1251"?>
<НДФЛ2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ВерсФорм="4.00001" ВерсПрог="НП 10.31" ИдФайл="ДОХОД_2НДФЛ">
<Справка>
<ОбщСвИЧ>
<ГодДох>2006</ГодДох>
<НомСпр>1</НомСпр>
<ДатаСпр>26.03.2007</ДатаСпр>
<ИФНСНА>7777</ИФНСНА>
</ОбщСвИЧ>
<ИстДох>
<СвНАЮЛ>
<ИННЮЛ>1234567890</ИННЮЛ>
<КПП>12345678</КПП>
<НаимОрг>ООО Рога и Копыта</НаимОрг>
<ОКАТО>12345678901</ОКАТО>
</СвНАЮЛ>
</ИстДох>
<ПолучДох>
<ФИО>
<Фамилия>Иванов</Фамилия>
<Имя>Иван</Имя>
<Отчество>Иванович</Отчество>
</ФИО>
<Статус>1</Статус>
<ДатаРожд>24.01.1973</ДатаРожд>
<Гражданство>643</Гражданство>
<УдЛичн>
<КодУдЛичн>21</КодУдЛичн>
<СерНомДок>12 01 012345</СерНомДок>
</УдЛичн>
<АдрМЖРФ>
<Индекс>123456</Индекс>
<КодРегион>77</КодРегион>
<Город>Энн г</Город>
<Улица>Ленина ул</Улица>
<Дом>99</Дом>
<Корпус>5</Корпус>
<Кварт>12</Кварт>
</АдрМЖРФ>
</ПолучДох>
<СвДохСтав>
<Ставка>35</Ставка>
<ДохВыч>
<НомМес>02</НомМес>
<КодДоход>2610</КодДоход>
<СумДоход>252.15</СумДоход>
</ДохВыч>
<ДохВыч>
<НомМес>07</НомМес>
<КодДоход>2760</КодДоход>
<СумДоход>100.00</СумДоход>
<КодВычет>503</КодВычет>
<СумВычет>100.00</СумВычет>
</ДохВыч>
<ДохВыч>
<НомМес>10</НомМес>
<КодДоход>2760</КодДоход>
<СумДоход>100.00</СумДоход>
<КодВычет>503</КодВычет>
<СумВычет>100.00</СумВычет>
</ДохВыч>
<СГДНалПер>
<СГДСумм>252.15</СГДСумм>
<ОблСумм>252.15</ОблСумм>
<НИОблСумм>88</НИОблСумм>
<НУОблСумм>88</НУОблСумм>
<ВозврСуммПЛ>0</ВозврСуммПЛ>
<ЗачСуммПЛ>0</ЗачСуммПЛ>
<УдСуммПЛ>0</УдСуммПЛ>
<ДолгНП>0</ДолгНП>
<ДолгНА>0</ДолгНА>
<ВзыскИФНС>0</ВзыскИФНС>
</СГДНалПер>
</СвДохСтав>
</Справка>
</НДФЛ2>
Категория:
JSON, XML, TXT, CSV, DBF Сообщение «Ошибка загрузки внешней компоненты для склонения ФИО! Функции склонения будут недоступны! Сообщение «Ошибка загрузки внешней компоненты для склонения ФИО! Функции склонения будут недоступны!» при запуске конфигурации «1С:Предприятие Зарплата и Управление Персоналом 2.5 появляется в случае отсутствия компоненты NameDecl.dll или если данная компонента не зарегистрирована в системе (обычно это бывает после установки платформы 1cv8 не под правами администратора операционной системы).
В случае отсутствия компоненты, ее можно найти на диске ИТС и переписать в каталог /bin/ установленной платформы «1С:Предприятие 8.
Если после этого ошибка все равно остается (такое возможно, например, при работе под управлением ОС «Windows Vista» или «Windows 7) – необходимо зарегистрировать компоненту «вручную».
Для этого в командной строке ОС можно набрать команду regsvr32 «[Путь к DLL]\NameDecl.dll» и выполнить ее под правами администратора.
Здесь [Путь к DLL], скорее всего, для платформы 1cv81 – «С:\Program Files\1Cv81\bin\», а для платформы 1cv82 – «С:\Program Files\1cv82\8.2.9.356\bin\». При наборе пути к файлу необходимо заключить его в двойные кавычки.
Если при регистрации таким способом возникла ошибка – «Модуль «[Путь к DLL]\NameDecl.dll» загружен, но не удалось выполнить вызов DllRegisterServer, код ошибки 0х80070005, то можно попробовать выйти из положения следующим образом:
1. На компьютере находим файл NameDecl.dll (скорее всего, для платформы 1cv81 он находится в «С:\Program Files\1Cv81\bin\», а для платформы 1cv82 в «С:\Program Files\1cv82\8.2.9.356\bin\»). Для найденного файла создаем ярлык и выносим его на рабочий стол.
2. На рабочем столе правой кнопкой мыши вызываем свойства этого ярлыка.
3. В свойствах на закладке «Ярлык» в окне «Объект» перед путем к файлу вставляем команду regsvr32 (помним, что путь должен быть в двойных кавычках).
4. На этой же закладке свойств ярлыка жмем на кнопку «Дополнительно». В открывшемся диалоге устанавливаем флажок «Запуск от имени администратора» и сохраняем внесенные изменения.
5. Запускаем ярлык для регистрации компоненты NameDecl.dll (обычно запуск регистрации через ярлык достаточно произвести один раз).
6. После регистрации компоненты ярлык можно удалить.
Категория:
1С Зарплата и Управление Персоналом 2.5 Получить запросом контактную информацию одной строкой по Физ. лицу Для тех, кто мучается с получением сведений из регистра сведений КонтактнаяИнформация в стандартных конфигурациях.
Код 1C v 8.х
Запрос= Новый Запрос;
Запрос. Текст= "
|ВЫБРАТЬ
| ВЗАдрес.Ссылка КАК ФизЛицо,
| ВЗАдрес.Адрес,
| ВЗТелефон.Телефон
|ИЗ
| (ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка,
| КонтактнаяИнформация.Представление КАК Адрес
| ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО ФизическиеЛица.Ссылка = КонтактнаяИнформация.Объект
| ГДЕ
| КонтактнаяИнформация.Вид = &АдрПоПрописке
| И КонтактнаяИнформация.Тип = &Адрес) КАК ВЗАдрес
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка,
| КонтактнаяИнформация.Представление КАК Телефон
| ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО ФизическиеЛица.Ссылка = КонтактнаяИнформация.Объект
| ГДЕ
| КонтактнаяИнформация.Вид = &ВидТелеф
| И КонтактнаяИнформация.Тип = &Телефон) КАК ВЗТелефон
| ПО ВЗАдрес.Ссылка = ВЗТелефон.Ссылка
|
|УПОРЯДОЧИТЬ ПО
| ФизЛицо
|АВТОУПОРЯДОЧИВАНИЕ
|" ;
Запрос. УстановитьПараметр( "Адрес" , Перечисления. ТипыКонтактнойИнформации. Адрес) ;
Запрос. УстановитьПараметр( "АдрПоПрописке" , Справочники. ВидыКонтактнойИнформации. ЮрАдресФизЛица) ;
Запрос. УстановитьПараметр( "ВидТелеф" , Справочники. ВидыКонтактнойИнформации. ТелефонФизЛица) ;
Запрос. УстановитьПараметр( "Телефон" , Перечисления. ТипыКонтактнойИнформации. Телефон) ;
Результат = Запрос. Выполнить( ) ;
Результат = Результат. Выбрать( ) ;
Пока Результат. Следующий( ) Цикл
КонецЦикла ;
Категория:
Запросы Маркировка ключей защиты 1С:Предприятия Для 1С 8 в настоящий момент используется 4 типа ключей:
-
Однопользовательский . Это HASP HL Basic. Ключ синего цвета, не имеет внутренней памяти и персонального номера.
-
Сетевой. HASP HL Net . Ключ красного цвета, имеет персональный номер и внутреннюю память в которой записано количество лицензий.
-
Ключ на 32х битный сервер 1С:Предприятие . HASP HL Pro.У ключа есть маркировка
ENSR8 Ключ
фио летового цвета, с внутренней памятью (фактически не используется) и уникальным идентификатором.
-
Ключ на 64х битный сервер 1С:Предприятие . HASP HL Max. Ключ зеленого цвета. У ключа есть маркировка
EN8SA , при этом данный ключи поддерживает 32-битный сервер (если у клиента есть лицензия на 64-битный сервер, он может, не меняя ключа, использовать также и 32-битную версию). C внутренней памятью (фактически не используется) и уникальным идентификатором.
Разобрались с цветами, попытаемся понять буковки:
В первой строчке ключа его тип и максимальное количество лицензий.
Hasp4 или
Н4 - тип ключа.
М1 - локальный с памятью 112 байт
NetXX - сетевой, где ХХ - количество лицензий.
Других 1С пока не использует.
Во второй строчке первые пять знаков - код разработчика (заказчика) ключа.
В приложении к 1С - это назначение ключа.
ORGL8 - пользовательский от восьмерки.
ENSR8 - сервер предприятия восьмерки 32x.
EN8SA - сервер предприятия восьмерки 64x.
Остальные знаки никакого интереса не представляют.
Подробнее:
Серверные ключи:
1С:Предприятие 8.0 (8.1, 8.2) Лицензия на сервер (х32) маркируется "H4 M1 Pro ENSR8" (
фио летовый цвет ключа)
1С:Предприятие 8.0 (8.1, 8.2) Лицензия на сервер (x64) маркируется "H4 M1 Max EN8SA" (зеленый цвет ключа)
Однопользовательские ключи: (синий цвет ключа)
Ключи для всех версий программ маркируются "H4 M1 ORGL8"
Сетевые (многопользовательские) ключи: (красный цвет ключа)
Ключи маркируются в зависимости от числа клиентских лицензий:
Программы группы "1С:Бухгалтерия 8" маркируются "H4 NET5 ORGL8"
Ключи на 5 пользователей маркируются "H4 NET5 ORGL8"
Ключи на 10 пользователей маркируются "H4 NET10 ORGL8"
Ключи на 20 пользователей маркируются "H4 NET20 ORGL8"
Ключи на 50 пользователей маркируются "H4 NET50 ORGL8"
Ключи на 100 пользователей маркируются "H4 NET100 ORGL8"
Ключи на 300 пользователей маркируются "NET250+ ORG8A"
Ключи на 500 пользователей маркируются "NET250+ ORG8B"
Комплекты ключей:
Комплект из 2 ключей "1С:Предприятие 8 Управление производственным предприятием" на 10 пользователй + сервер, а так же комплект из 2 ключей "1С:Предприятие 8 Комплексная автоматизация" на 10 пользователей + сервер, ключи маркируются "H4 NET10 ORGL8" и "H4 M1 ENSR8"
Комплект из 2 ключей "1С:Предприятие 8 Учебный комлект" на 20 пользователей + сервер, ключи маркируются "H4 NET20 ORGL8" и "H4 M1 ENSR8"
Данная система маркировки была введена для удобства идентификации ключа разработчиками и пользователями программного обеспечения.
Для установки однопользовательского и серверного ключей достаточно установить драйвер ключа защиты и вставить ключ защиты в порт.
Для установки многопользовательского ключа защиты требуется определить, какая из машин в сети будет являться сервером. Далее нужно установить на этот компьютер драйвер ключа защиты (HASP4_driver_setup.zip) и службу ключа защиты (HASP_LM_setup.zip), после чего вставить ключ защиты в порт.
Для 1С 7
Сетевые ключи - Красные
Локальные - Серые
+ на ключе шла расшифровка ACC- Бухгалтерия, TRD- Торговля, SAL - Зарплата
Программы однопользовательской группы:
Программы группы "1С:Бухгалтерия 7.7" маркируются "H4 M1 ACCNT"
Программы группы "1С:Зарплата и кадры 7.7" маркируются "H4 M1 QXDXD"
Программы группы "1С:Торговля и склад 7.7" маркируются "H4 M1 WRBQB"
Программы группы "1С:Предприятие 7.7 Комплексная" маркируются "H4 M1 WRBQB"
Программы сетевой (многопользовательской) группы:
Программы группы "1С:Предприятие 7.7 Бухгалтерский учет" маркируются "H4 Net5 ACCNT"
Программы группы "1С:Предприятие 7.7 Зарплата + Кадры" маркируются "H4 Net5 QXDXD"
Программы группы "1С:Предприятие 7.7 Торговля + Склад" маркируются "H4 Net5 WRBQB"
Программы группы "1С:Предприятие 7.7 Комплексная поставка" маркируются "H4 Net5 WRBQB"
Программы группы "1С:Предприятие 7.7 Налогоплательщик" маркируются "H4 Net5 TAXPR"
Программы группы "1С:Предприятие 7.7 Небольшая фирма" маркируются "ACCNT" / "WRBQB" / "QXDXD"
Программы группы "1С:Предприятие 7.7 Управление распределенными информационными базами" маркируются "H4 Net5 DISTR"
Программы группы "1С:Предприятие 7.7 Web-расширение" маркируются "H4 Net5 W31CK"
Категория:
Администрирование Ошибка 80040Е57 В 1С:Предприятии 8.1.13 при формировании отчета Расчетная ведомость Т-51 система выдавала ошибку:
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Siring or binary data would be truncated. HRESULT=80040E57, HRESULT=80040E57, SQLSrvr: Error state=1, Severity, native=8153, line=l SQLSrvr: Error state=D, Severity 0, native=8152, line=l
Решением данной ошибки было заменить в запросе формирования отчета:
| МАКСИМУМ(ФИОФизЛиц.Фамилия + "" "" + (ВЫРАЗИТЬ(ФИОФизЛиц.Имя КАК СТРОКА(1))) + "". "" + (ВЫРАЗИТЬ(ФИОФизЛиц.Отчество КАК СТРОКА(1))) + ""."") КАК ФИО,
на
| МАКСИМУМ(ФИОФизЛиц.Фамилия + "" "" + ФИОФизЛиц.Имя + "" "" + ФИОФизЛиц.Отчество + "" "") КАК ФИО,
Категория:
Системные Ошибки Как разобрать "наименование" сотрудника Ф.И.О. на Фамилию и инициалы сотрудника? Код 1C v 7.x
Функция глРазложить(Знач Стр, Разделитель = "," ) Экспорт
СЗ = СоздатьОбъект( "СписокЗначений" ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
СЗ. ДобавитьЗначение( Стр) ;
Возврат СЗ;
КонецЕсли ;
СЗ. ДобавитьЗначение( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
СЗ. ДобавитьЗначение( Стр) ;
Возврат СЗ;
КонецЕсли ;
СЗ. ДобавитьЗначение( Лев( Стр, Поз- 1 ) ) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Функция ФамилияИмяОтчество(Объект,Фамилия="" ,Имя="" ,Отчество="" ) Экспорт
Если ТипЗначения( Объект) = 2 Тогда
ФИО = глРазделить( СокрЛП( Объект) , "," ) ;
Иначе
ФИО = глРазделить( СокрЛП( Объект. Наименование) , "," ) ;
КонецЕсли ;
ФИО = глРазложить( ФИО, " " ) ;
Фамилия = "" ; Имя = "" ; Отчество = "" ;
Если ФИО. РазмерСписка( ) > 0 Тогда
Фамилия = ФИО. ПолучитьЗначение( 1 ) ;
Если ФИО. РазмерСписка( ) > 1 Тогда
Имя = ФИО. ПолучитьЗначение( 2 ) ;
Если ФИО. РазмерСписка( ) > 2 Тогда
Для Сч = 3 По ФИО. РазмерСписка( ) Цикл
Отчество = Отчество + ФИО. ПолучитьЗначение( Сч) + " " ;
КонецЦикла ;
Если ПустоеЗНачение( Отчество) = 0 Тогда
Отчество = Лев( Отчество, СтрДлина( Отчество) - 1 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Возврат Фамилия+ ? ( ПустоеЗначение( Имя) = 0 , " " + Лев( Имя, 1 ) + "." + ? ( ПустоеЗначение( Отчество) = 0 , Лев( Отчество, 1 ) + "." , "" ) , "" )
КонецФункции
Код 1C v 8.х
Функция глРазложить(Знач Стр, Разделитель = "," ) Экспорт
СЗ = Новый СписокЗначений;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
СЗ. Добавить( Стр) ;
Возврат СЗ;
КонецЕсли ;
СЗ. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
СЗ. Добавить( Стр) ;
Возврат СЗ;
КонецЕсли ;
СЗ. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Функция РазборФИО(Сотрудник)
ФИО = глРазложить( Сотрудник, " " ) ;
Фамилия = "" ; Имя = "" ; Отчество = "" ;
Если ФИО. Количество( ) > 0 Тогда
Фамилия = Строка( ФИО. Получить( 0 ) ) ;
Если ФИО. Количество( ) > 1 Тогда
Имя = Строка( ФИО. Получить( 1 ) ) ;
Если ФИО. Количество( ) > 2 Тогда
Для Сч = 2 По ФИО. Количество( ) - 1 Цикл
Отчество = Отчество + Строка( ФИО. Получить( Сч) ) + " " ;
КонецЦикла ;
Если ЗначениеЗаполнено( Отчество) Тогда
Отчество = Лев( Отчество, СтрДлина( Отчество) - 1 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Возврат Фамилия+ ? ( ЗначениеЗаполнено( Имя) , " " + Лев( Имя, 1 ) + "." + ? ( ЗначениеЗаполнено( Отчество) , Лев( Отчество, 1 ) + "." , "" ) , "" )
КонецФункции
Обязательно посмотрите более краткий вариант!
Категория:
Полезные, Универсальные Функции Cклонения по падежам Код 1C v 8.2 УП &НаКлиенте
Процедура Команда1(Команда)
ФИО = "Иванов Иван Иванович" ;
Падеж = 2 ;
Пол = 1 ;
Результат = СклонениеФИО( ФИО, Падеж, пол) ;
Сообщить( Результат) ;
КонецПроцедуры
&НаСервере
Функция СклонениеФИО(ФИО, Падеж, пол)
Результат = "" ;
ПутьКФайлу= "C:\NAMEDECL.DLL" ;
NameDecl = "Склонение" ;
Попытка
Если ПодключитьВнешнююКомпоненту( ПутьКФайлу, NameDecl) ТОгда
ФункцСкл = Новый ( "AddIn.Склонение.NameDeclension" ) ;
Результат = ФункцСкл. Просклонять( ФИО, Падеж, пол) ;
КонецЕсли ;
Исключение
Сообщить( "Не удалось загрузить внешнюю компаненту по причине: " + ОписаниеОшибки( ) ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Код для 8-й версии, но работает и в 7-й
Код 1C v 8.х
Функция ПадежС(z1,Знач z2=2,Знач z3="*" ,z4=0) Экспорт
z5= Найти( z1, "-" ) ;
z6= ? ( z5= 0 , "" , "-" + ПадежС( Сред( z1, z5+ 1 , СтрДлина( z1) - z5+ 1 ) , z2, z3, z4) ) ;
z1= НРег( ? ( z5= 0 , z1, Лев( z1, z5- 1 ) ) ) ;
z7= Прав( z1, 3 ) ; z8= Прав( z7, 2 ) ; z9= Прав( z8, 1 ) ;
z5= СтрДлина( z1) ;
za= Найти( "ая ия ел ок яц ий па да ца ша ба та га ка" , z8) ;
zb= Найти( "аеёийоуэюяжнгхкчшщ" , Лев( z7, 1 ) ) ;
zc= Макс( z2, - z2) ;
zd= ? ( za= 4 , 5 , Найти( "айяь" , z9) ) ;
zd= ? ( ( zc= 1 ) или ( z9= "." ) или ( ( z4= 2 ) и ( Найти( "оиеу" + ? ( z3= "ч" , "" , "бвгджзклмнпрстфхцчшщъ" ) , z9) > 0 ) ) или ( ( z4= 1 ) и ( Найти( "мия мяэ лия кия жая лея" , z7) > 0 ) ) , 9 , ? ( ( zd= 4 ) и ( z3= "ч" ) , 2 , ? ( z4= 1 , ? ( Найти( "оеиую" , z9) + Найти( "их ых аа еа ёа иа оа уа ыа эа юа яа" , z8) > 0 , 9 , ? ( z3< > "ч" , ? ( za= 1 , 7 , ? ( z9= "а" , ? ( za> 18 , 1 , 6 ) , 9 ) ) , ? ( ( ( Найти( "ой ый" , z8) > 0 ) и ( z5> 4 ) и ( Прав( z1, 4 ) < > "опой" ) ) или ( ( zb> 10 ) и ( za= 16 ) ) , 8 , zd) ) ) , zd) ) ) ;
ze= Найти( "лец вей бей дец пец мец нец рец вец аец иец ыец бер" , z7) ;
zf= ? ( ( zd= 8 ) и ( zc< > 5 ) , ? ( ( zb> 15 ) или ( Найти( "жий ний" , z7) > 0 ) , "е" , "о" ) , ? ( z1= "лев" , "ьв" , ? ( ( Найти( "аеёийоуэюя" , Сред( z1, z5- 3 , 1 ) ) = 0 ) и ( ( zb> 11 ) или ( zb= 0 ) ) и ( ze< > 45 ) , "" , ? ( za= 7 , "л" , ? ( za= 10 , "к" , ? ( za= 13 , "йц" , ? ( ze= 0 , "" , ? ( ze< 12 , "ь" + ? ( ze= 1 , "ц" , "" ) , ? ( ze< 37 , "ц" , ? ( ze< 49 , "йц" , "р" ) ) ) ) ) ) ) ) ) ) ;
zf= ? ( ( zd= 9 ) или ( ( z4= 3 ) и ( z3= "ы" ) ) , z1, Лев( z1, z5- ? ( ( zd> 6 ) или ( zf< > "" ) , 2 , ? ( zd> 0 , 1 , 0 ) ) ) + zf+ СокрП( Сред( "а у а " + Сред( "оыые" , Найти( "внч" , z9) + 1 , 1 ) + "ме " + ? ( Найти( "гжкхш" , Лев( z8, 1 ) ) > 0 , "и" , "ы" ) + " е у ойе я ю я ем" + ? ( za= 16 , "и" , "е" ) + " и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго" + ? ( ( zf= "е" ) или ( za= 16 ) или ( ( zb> 12 ) и ( zb< 16 ) ) , "и" , "ы" ) + "мм" , 10 * zd+ 2 * zc- 3 , 2 ) ) ) ;
Возврат ? ( "" = z1, "" , ? ( z4> 0 , ВРег( Лев( zf, 1 ) ) + ? ( ( z2< 0 ) и ( z4> 1 ) , "." , Сред( zf, 2 ) ) , zf) + z6) ;
КонецФункции
Функция Падежик(z1,z2=2,z3=3,Знач z4="123" ,z5=1) Экспорт
Возврат ? ( z5< 4 , Падежик( СокрЛП( СтрЗаменить( Сред( z1, Найти( z1+ " " , " " ) + 1 ) , "." , ". " ) ) , z2, z3, СтрЗаменить( z4, z5, ПадежС( Лев( z1, Найти( z1+ " " , " " ) - 1 ) , z2, Сред( "ча" + НРег( Прав( СокрП( z1) , 1 ) ) , z3, 1 ) , z5) + " " ) , z5+ 1 ) , z4) ;
КонецФункции
Функция Падеж(z1,z2=2,z3=3,Знач z4="123" ) Экспорт
z1= СокрП( z1) ;
z5= Прав( z1, 4 ) ;
z6= Найти( "оглы кызы" , z5) ;
Возврат Падежик( ? ( z6> 0 , Лев( z1, СтрДлина( z1) - 5 ) , z1) , z2, z3, z4) + ? ( z6> 0 , z5, "" ) ;
КонецФункции
Функция ПадежП(Знач z1,Знач z2,z3=0) Экспорт
z1= СокрЛП( z1) ; z4= Найти( z1+ " " , " " ) + 1 ; z5= Лев( z1, z4- 2 ) ; z6= Прав( z5, 2 ) ;
z7= ? ( ( Найти( "ая ий ый" , z6) > 0 ) и ( Найти( "ющий нный" , Сред( z1, z4- 5 , 4 ) ) = 0 ) и ( z3= 0 ) , "1" , "*" ) ;
Возврат НРег( ? ( ( z6= "ая" ) или ( Прав( z6, 1 ) = "а" ) , ПадежС( z5, z2, z7, 1 ) + " " + ПадежС( Сред( z1, z4) , z2) , ПадежС( z5, z2, "ч" , 1 ) + ? ( ( z6= "ий" ) и ( Найти( z1, " " ) = 0 ) , "" , " " + ? ( z7= "1" , ПадежП( Сред( z1, z4) , z2, Число( z7) ) , Сред( z1, z4) ) ) ) ) ;
КонецФункции
Пример использования в ЗиК 7.7:
Код 1C v 7.x ПодписантРодитПад= Падеж( Константа. Руководитель. Получить( ДатаДок) , - 2 ) ;
ПодпСтрока= "Заместителя Генерального Директора " + СокрЛП( ПодписантРодитПад) + ", действующего на основании доверенности " + сокрлп( Константа. Доверенность) ;
Категория:
Полезные, Универсальные Функции Как сравнить похожие строки (неполное совпадение строк)? Ниже привожу пример функции нечеткого сравнения строк. Возвращаемое значение - от 0 (вообще не совпадает) до 1 (совпадает полностью)
По опыту, результат сравнения можно считать достоверным при совпадении больше 0.8 (80%)
Код CREATE FUNCTION fn_FuzzyCompareString(
@Stri1 varchar(250),
@Stri2 varchar(250),
@MaxLen int)
RETURNS float
AS
BEGIN
DECLARE @Str1 varchar(250), @Str2 varchar(250), @SCountVar int,
@SCountEq int, @LenStr int, @Res float
DECLARE @NumSymbStr2 int
DECLARE @Cnt1 int, @Cnt2 int
DECLARE @SubStr varchar(250)
SELECT
@LenStr=1,
@SCountVar=0 ,
@SCountEq=0,
@res=0
Set @Str1 = replace(LTRIM(RTRIM(upper(@Stri1))),'.',' ')
Set @Str2 = replace(LTRIM(RTRIM(upper(@Stri2))),'.',' ')
if ((@MaxLen <= 0) or (Len(@Str1)=0) or (Len(@Str2)=0))
Begin
Set @Res=0
End
else
begin
While (@LenStr<=@MaxLen)
BEGIN
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str2))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str2,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str1)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str1))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str1,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str2)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @LenStr=@LEnStr+1
END
end
if @SCountVar=0
SET @Res=0
Else
BEGIN
SET @Res=Convert(Numeric (10,5),@SCountEq)/Convert(Numeric (10,5),@SCountVar)
END
RETURN @Res
END
Использование этой функции (на примере прямого запроса к справочнику ФизЛица для 1С:ТиС 7.7): в выборку попадут все физлица, у которых релевантность выше 0.8
Код DECLARE @FIO varchar(250)
Set @FIO = 'Иванов Петр'
SELECT
Спр.Code as [ФизЛицоКод],
Спр.ID as [ФизЛицо],
Спр.DESCR as [ФИО],
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3) As [Релевантность]
FROM
SC503 as Спр (nolock)
where
ISMARK = 0
and
ISFOLDER = 2
and
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3)>=0.8
GO
Категория:
Полезные, Универсальные Функции