Как программно создать нового пользователя или скопировать настройки существующего? Часто встречаю вопросы касаемые программного создания и настройки прав пользователей.
В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.
В приложении к статье обработки, код которых приведен ниже: Скачать обработки
Обработки были написаны под УТ, но, при необходимости, вы можете их легко доработать под другие конфигурации.
Управляемое приложение: В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.
! В типовых конфигурациях для работы с пользователями активно используется БСП !
В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ , ПрочитатьПользователяИБ , ЗаписатьПользователяИБ иУдалитьПользователяИБ .
Код создания нового пользователя с использованием БСП:
Код 1C v 8.3 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)
Пользователь = Обработки. НастройкиПользователей. ИмяПользователяИБ( ПользовательСсылка) ;
Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей. Колонки. Добавить( "Пользователь" ) ;
ТаблицаПользователей = Обработки. НастройкиПользователей. ПользователиДляКопирования( ПользовательСсылка, ТаблицаПользователей,
ТипЗнч( ПользовательСсылка) = Тип( "СправочникСсылка.ВнешниеПользователи" ) ) ;
Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники. Добавить( ПользовательПриемник) ;
КонецЦикла ;
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки. Добавить( "НастройкиОтчетов" ) ;
КопируемыеНастройки. Добавить( "НастройкиВнешнегоВида" ) ;
КопируемыеНастройки. Добавить( "ПерсональныеНастройки" ) ;
КопируемыеНастройки. Добавить( "Избранное" ) ;
КопируемыеНастройки. Добавить( "НастройкиПечати" ) ;
КопируемыеНастройки. Добавить( "ПрочиеПользовательскиеНастройки" ) ;
НастройкиСкопированы = Обработки. НастройкиПользователей.
КопированиеНастроекПользователей( ПользовательСсылка, Приемники, КопируемыеНастройки) ;
Возврат НастройкиСкопированы;
КонецФункции
Функция СоздатьНовыйУровеньДоступа(ФИО)
Рез = Справочники. CRM_УровниДоступа. НайтиПоНаименованию( ФИО) ;
Если Рез = Неопределено ИЛИ Рез = Справочники. CRM_УровниДоступа. ПустаяСсылка( ) Тогда
НовыйОбъект = Справочники. CRM_УровниДоступа. СоздатьЭлемент( ) ;
НовыйОбъект. Наименование = ФИО;
НовыйОбъект. Записать( ) ;
возврат НовыйОбъект. Ссылка;
КонецЕсли ;
КонецФункции
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( Объект. ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Наименование) ) ;
ОписаниеПользователяИБ = Пользователи. НовоеОписаниеПользователяИБ( ) ;
ПользовательИБСуществует = Ложь ;
ДоступКИнформационнойБазеРазрешен = Ложь ;
Если ОбщегоНазначенияПовтИсп. РазделениеВключено( ) Тогда
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора = Ложь ;
Иначе
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора =
НЕ Константы. ИспользоватьВнешнихПользователей. Получить( ) ;
КонецЕсли ;
ОписаниеПользователяИБ. АутентификацияСтандартная = Истина ;
ОписаниеПользователяИБ. Роли = Новый Массив;
ПрочитанныеСвойства = Неопределено ;
Если Пользователи. ПрочитатьПользователяИБ(
ПользовательНастроек. ИдентификаторПользователяИБ, ПрочитанныеСвойства
) Тогда
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли" ) ;
КонецЕсли ;
ОписаниеПользователяИБ. Вставить( "Действие" , "Записать" ) ;
ОписаниеПользователяИБ. Вставить( "Имя" , Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Наименование = Объект. ФИОСоздаваемогоПользователя;
НовыйПользователь. ТекущееПодразделение = ПользовательНастроек. ТекущееПодразделение;
НовыйПользователь. CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа( Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь. Недействителен = ложь ;
НовыйПользователь. ДополнительныеСвойства. Вставить(
"ОписаниеПользователяИБ" , ОписаниеПользователяИБ) ;
НовыйПользователь. Записать( ) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Состав. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Пользователи. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
КопированиеВсехНастроек( ПользовательНастроек, НовыйПользователь. Ссылка) ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура СоздатьПользователяНаСервере()
Если НЕ ЗначениеЗаполнено( Объект. ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( Объект. ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
тИзменяемыйПользователь = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ИзменяемыйПользователь. Наименование) ) ;
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ШаблонПользователяДляКопирования. Наименование) ) ;
тИзменяемыйПользователь. Роли. Очистить( ) ;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
тИзменяемыйПользователь. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
тИзменяемыйПользователь. Записать( ) ;
КопированиеВсехНастроек( ШаблонПользователяДляКопирования, ИзменяемыйПользователь) ;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере( Объект. ИзменяемыйПользователь, Объект. ШаблонПользователяДляКопирования) ;
КонецПроцедуры
Обычное приложение: В обычном все проще:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено( ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Код) ) ;
ПользовательИБ = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
ПользовательИБ. Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ. АутентификацияСтандартная = Истина ;
ПользовательИБ. Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ. ПолноеИмя = ФИОСоздаваемогоПользователя;
ПользовательИБ. ПоказыватьВСпискеВыбора = Истина ;
ПользовательИБ. ОсновнойИнтерфейс = Пользователь_Шаблон. ОсновнойИнтерфейс;
ПользовательИБ. Язык = Пользователь_Шаблон. Язык;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
ПользовательИБ. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
ПользовательИБ. Записать( ) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Код = ФИОСоздаваемогоПользователя;
НовыйПользователь. Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь. Родитель = ПользовательНастроек. Родитель;
НовыйПользователь. Подразделение = ПользовательНастроек. Подразделение;
НовыйПользователь. Категория = ПользовательНастроек. Категория;
НовыйПользователь. Руководитель = ПользовательНастроек. Руководитель;
НовыйПользователь. Действует = ПользовательНастроек. Действует;
НовыйПользователь. Записать( ) ;
НаборПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборПользователя. Отбор. Пользователь. Установить( ПользовательНастроек) ;
НаборПользователя. Прочитать( ) ;
НаборНовогоПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборНовогоПользователя. Отбор. Пользователь. Установить( НовыйПользователь. Ссылка) ;
Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя. Добавить( ) ;
ЗаполнитьЗначенияСвойств( НоваяСтрокаНастроек, СтрокаНастроек) ;
НоваяСтрокаНастроек. Пользователь = НовыйПользователь. Ссылка;
Если Найти( СтрокаНастроек. Настройка. Наименование, "Основной ответственный" ) Тогда
НоваяСтрокаНастроек. Значение = НовыйПользователь. Ссылка;
КонецЕсли ;
КонецЦикла ;
Если НаборНовогоПользователя. Количество( ) > 0 Тогда
НаборНовогоПользователя. Записать( ) ;
КонецЕсли ;
сообщить( "Создан пользователь " + ФИОСоздаваемогоПользователя) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. ПользователиГруппы. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
еще пример:
Код 1C v 8.х Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
// Попробуем найти сотрудника
Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
// Теперь попробум найти сотрудника по пользователю ос
Если Пользователь = Неопределено Тогда
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ТекущийПользователь.ПользовательОС = ДоменноеИмя Тогда
Пользователь = ТекущийПользователь;
Прервать;
Конецесли;
КонецЦикла;
КонецЕсли;
//
// Если мы не нашли сотрудника, то создадим его
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
//
// Записываем свойства
Пользователь.АутентификацияОС = АутентификацияОС;
Пользователь.АутентификацияСтандартная = Авторизация1СПредприятия;
Пользователь.ЗапрещеноИзменятьПароль = Истина;
Пользователь.Имя = ИмяПользователя;
Пользователь.ПолноеИмя = ИмяПользователя;
Пользователь.ПоказыватьВСпискеВыбора = Ложь;
Пользователь.ПользовательОС = ДоменноеИмя;
// Сначала очистим все текущие роли
Пользователь.Роли.Очистить();
// Теперь найдем переданный массив ролей в справочнике профилей
// и добавим все роли указанные в профиле. Все очень сложно, да
МассивИменРолей = Новый Массив();
Для Каждого Роль Из МассивРолей.Role Цикл
МассивИменРолей.Добавить(Роль);
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|ГДЕ
| ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("МассивИменРолей", МассивИменРолей);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Роль Из Результат Цикл
НайденнаяРоль = Метаданные.Роли.Найти(Роль.Имя);
Если НайденнаяРоль <> Неопределено Тогда
Пользователь.Роли.Добавить(НайденнаяРоль);
КонецЕсли;
КонецЦикла;
// Записываем!
Пользователь.Записать();
// Теперь посмотрим нужно ли деактивировать пользователя
Если Не ПользовательАктивен Тогда
ДективироватьПользователя(Пользователь);
КонецЕсли;
// Запишем еще и справочник пользователя
ЗаполнитьСправочникПользователя(Пользователь);
Возврат Истина;
КонецФункции
// Процедура заполняет помимо прочего справочник пользователя
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ИСТИНА КАК ЕстьПользователь,
| Пользователи.Ссылка КАК Пользователь
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЛОЖЬ,
| NULL";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
Результат = Запрос.Выполнить().Выгрузить()[0];
ОписаниеПользователя = Пользователи.НовоеОписаниеПользователяИБ();
Если Результат.ЕстьПользователь Тогда
ПользовательОбъект = Результат.Пользователь.ПолучитьОбъект();
Иначе
ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
ПользовательОбъект.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
ПользовательОбъект.Наименование = ПользовательИБ.Имя;
ОписаниеПользователя.Вставить("Действие", "Записать");
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователя);
КонецЕсли;
ЗаполнитьЗначенияСвойств(ОписаниеПользователя, ПользовательИБ);
Для Каждого Элемент Из ОписаниеПользователя Цикл
ПользовательОбъект.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
ПользовательОбъект.ДополнительныеСвойства.Удалить("Роли");
ПользовательОбъект.Записать();
КонецПроцедуры
Категория:
Пользователь, роль доступа, интерфейс Работа с MS Word через OLE В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( ПутьКФайлу) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
Doc = Объект. Application. Documents( 1 ) ;
Doc. Activate( ) ;
Text = Word. S_election;
Text. WholeStory( ) ;
Text. Delete( 1 , 1 ) ;
Text. TypeText( Символы. ВК) ;
Text. TypeText( Символы. ВК) ;
Text. TypeParagraph( ) ;
Text. TypeText( "Обычный текст, набранный первую очередь" ) ;
Text. HomeKey( , 1 ) ;
Text. Font. Bold = 9999998 ;
Text. Font. Size = 14 ;
Text. Font. Name = "Verdana" ;
Text. MoveUp( , 2 ) ;
Text. HomeKey( , 1 ) ;
Text. TypeText( "Обычный текст, набранный во вторую очередь" ) ;
Text. MoveDown( , 1 ) ;
Text. EndKey( ) ;
Text. TypeParagraph( ) ;
Text. ClearFormatting( ) ;
Position = Text. Range( ) ;
Table = Doc. Tables. Add( Position, 1 , 6 , 1 , 2 ) ;
Table. Columns( 1 ) . PreferredWidth= 10 ;
Table. Columns( 2 ) . PreferredWidth= 50 ;
Table. Columns( 3 ) . PreferredWidth= 10 ;
Table. Columns( 4 ) . PreferredWidth= 10 ;
Table. Columns( 5 ) . PreferredWidth= 10 ;
Table. Columns( 6 ) . PreferredWidth= 10 ;
Row1= Table. Rows( 1 ) ;
Row1. Cells( 1 ) . Range. Text= "№ п/п" ;
Row1. Cells( 2 ) . Range. Text= "Наименование" ;
Row1. Cells( 4 ) . Range. Text= "Кол-во" ;
Row1. Cells( 3 ) . Range. Text= "Ед. изм." ;
Row1. Cells( 5 ) . Range. Text= "Цена,руб." ;
Row1. Cells( 6 ) . Range. Text= "Сумма,руб." ;
НомерСтроки = 1 ;
Для каждого СтрокаТовары Из Ссылка. Товары Цикл
Row= Table. Rows. Add( ) ;
Row. Cells( 1 ) . Range. Text= НомерСтроки;
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 2 ) . Range. Text= СтрокаТовары. Номенклатура. Наименование
+ ? ( ЗначениеЗаполнено( СтрокаТовары. ХарактеристикаНоменклатуры) ,
" (" + СтрокаТовары. ХарактеристикаНоменклатуры+ ")" , "" ) ;
Row. Cells( 4 ) . Range. Text= Строка( СтрокаТовары. Количество) ;
Row. Cells( 4 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 3 ) . Range. Text= ? ( ЗначениеЗаполнено( СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения)
, СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения. Наименование, "-" ) ;
Row. Cells( 3 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 5 ) . Range. Text= Формат( СтрокаТовары. Цена, "ЧДЦ=2" ) ;
Row. Cells( 5 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 6 ) . Range. Text= Формат( СтрокаТовары. Сумма, "ЧДЦ=2" ) ;
Row. Cells( 6 ) . Range. ParagraphFormat. Alignment = 1 ;
НомерСтроки= НомерСтроки+ 1 ;
КонецЦикла ;
Row1. Range. Font. Bold = 9999998 ;
Row1. Range. Font. Size = 14 ;
Row1. Range. Font. Name = "Verdana" ;
Row1. Range. ParagraphFormat. Alignment = 1 ;
Row = Table. Rows. Add( ) ;
Row. Range. Font. Bold = 9999998 ;
Row. Cells( 1 ) . Range. Text= "Итого:" ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
Попытка
Table. cell( НомерСтроки+ 1 , 1 ) . Merge( Table. cell( НомерСтроки+ 1 , 5 ) ) ;
Исключение
КонецПопытки ;
Попытка
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 3 ;
Row. Cells( 2 ) . Range. Text= Формат( Ссылка. Товары. Итог( "Сумма" ) , "ЧДЦ=2" ) ;
Row. Cells( 2 ) . Range. ParagraphFormat. Alignment = 1 ;
Doc. Save( ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( "C:\Users\NKrylov\Desktop\Тест.docx" ) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
ThisDocument = Word. Documents( 1 ) ;
ThisDocument. Activate( ) ;
ThisDocument. GrammarChecked= 0 ;
ThisDocument. ShowGrammaticalErrors= 0 ;
S_election = Word. S_election;
S_election. WholeStory( ) ;
S_election. Delete( 1 , 1 ) ;
S_election. ParagraphFormat. LineSpacingRule = 0 ;
S_election. ParagraphFormat. SpaceAfter = 0 ;
ThisDocument. Bookmarks. Add( "Закладка1" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "34r3 " ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка3" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка4" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
ThisDocument. Bookmarks( "Закладка3" ) . Range. S_elect( ) ;
S_election = Word. S_election;
Bookmark = ThisDocument. Bookmarks( "Закладка3" ) ;
Table = ThisDocument. Tables. Add( Bookmark. Range( ) , 1 , 5 , 1 , 2 ) ;
Table. Rows( 1 ) . Cells( 1 ) . Range. Text = 1 ;
Table. Rows( 1 ) . Cells( 2 ) . Range. Text = 2 ;
Table. Rows( 1 ) . Cells( 3 ) . Range. Text = 3 ;
Table. Rows( 1 ) . Cells( 4 ) . Range. Text = 4 ;
Table. Rows( 1 ) . Cells( 5 ) . Range. Text = 5 ;
S_election. MoveDown( , 1 ) ;
S_election. Delete( 1 , 1 ) ;
ThisDocument. Bookmarks( "Закладка2" ) . Range. S_elect( ) ;
S_election = Word. S_election;
Text = S_election. Range. Text;
S_election. TypeText( Text + " sdcsdcs" ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
ThisDocument. Bookmarks( "Закладка4" ) . Range. S_elect( ) ;
S_election = Word. S_election;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. MoveUp( , 4 , 1 ) ;
ListTemplate = Word. ListGalleries( 2 ) . ListTemplates( 1 ) . ListLevels( 1 ) ;
ListTemplate. NumberFormat = "%1." ;
ListTemplate. NumberStyle = 0 ;
S_election. Range. ListFormat. ApplyListTemplateWithLevel( Word. ListGalleries( 2 ) . ListTemplates( 1 ) ) ;
S_election. EndKey( 6 ) ;
Picture = S_election. InlineShapes. AddPicture( "C:\Users\NKrylov\Desktop\Новый.bmp" , Ложь , Истина ) ;
Picture. Height = 100 ;
Picture. Width = 150 ;
Shape = Picture. ConvertToShape( ) ;
Shape. WrapFormat. Type = 0 ;
ThisDocument. Save( ) ;
Объект = Неопределено ;
Исключение
ThisDocument. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Автор:
Крылов Николай Категория:
Работа с Microsoft Office и OpenOffice Пример построения в Word нумерованного списка, закладок, вставки картинки, настройки ее параметров. Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудьте указать свои пути.
Тестировалось на Office 2007.
Некоторые переменные переименованы по стандарту Office: Text --> S_election. Doc --> ThisDocument.
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( "C:\Users\NKrylov\Desktop\Тест.docx" ) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
ThisDocument = Word. Documents( 1 ) ;
ThisDocument. Activate( ) ;
ThisDocument. GrammarChecked= 0 ;
ThisDocument. ShowGrammaticalErrors= 0 ;
S_election = Word. S_election;
S_election. WholeStory( ) ;
S_election. Delete( 1 , 1 ) ;
S_election. ParagraphFormat. LineSpacingRule = 0 ;
S_election. ParagraphFormat. SpaceAfter = 0 ;
ThisDocument. Bookmarks. Add( "Закладка1" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "34r3 " ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка3" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка4" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
ThisDocument. Bookmarks( "Закладка3" ) . Range. S_elect( ) ;
S_election = Word. S_election;
Bookmark = ThisDocument. Bookmarks( "Закладка3" ) ;
Table = ThisDocument. Tables. Add( Bookmark. Range( ) , 1 , 5 , 1 , 2 ) ;
Table. Rows( 1 ) . Cells( 1 ) . Range. Text = 1 ;
Table. Rows( 1 ) . Cells( 2 ) . Range. Text = 2 ;
Table. Rows( 1 ) . Cells( 3 ) . Range. Text = 3 ;
Table. Rows( 1 ) . Cells( 4 ) . Range. Text = 4 ;
Table. Rows( 1 ) . Cells( 5 ) . Range. Text = 5 ;
S_election. MoveDown( , 1 ) ;
S_election. Delete( 1 , 1 ) ;
ThisDocument. Bookmarks( "Закладка2" ) . Range. S_elect( ) ;
S_election = Word. S_election;
Text = S_election. Range. Text;
S_election. TypeText( Text + " sdcsdcs" ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
ThisDocument. Bookmarks( "Закладка4" ) . Range. S_elect( ) ;
S_election = Word. S_election;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. MoveUp( , 4 , 1 ) ;
ListTemplate = Word. ListGalleries( 2 ) . ListTemplates( 1 ) . ListLevels( 1 ) ;
ListTemplate. NumberFormat = "%1." ;
ListTemplate. NumberStyle = 0 ;
S_election. Range. ListFormat. ApplyListTemplateWithLevel( Word. ListGalleries( 2 ) . ListTemplates( 1 ) ) ;
S_election. EndKey( 6 ) ;
Picture = S_election. InlineShapes. AddPicture( "C:\Users\NKrylov\Desktop\Новый.bmp" , Ложь , Истина ) ;
Picture. Height = 100 ;
Picture. Width = 150 ;
Shape = Picture. ConvertToShape( ) ;
Shape. WrapFormat. Type = 0 ;
ThisDocument. Save( ) ;
Объект = Неопределено ;
Исключение
ThisDocument. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/68072/ Категория:
Работа с Microsoft Office и OpenOffice Создание документа Word без использования макетов и пример создания таблицы и её оформление. Кроме прочего в статье присутствует пример создания таблицы с любым количеством колонок и столбцов. Несколько строк с форматированием текста и таблицы. Создание "объединенных" ячеек.
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Исп. переменные: "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
"Ссылка" - ДокументСсылка (в моем случае - счет).
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( ПутьКФайлу) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
Doc = Объект. Application. Documents( 1 ) ;
Doc. Activate( ) ;
Text = Word. S_election;
Text. WholeStory( ) ;
Text. Delete( 1 , 1 ) ;
Text. TypeText( Символы. ВК) ;
Text. TypeText( Символы. ВК) ;
Text. TypeParagraph( ) ;
Text. TypeText( "Обычный текст, набранный первую очередь" ) ;
Text. HomeKey( , 1 ) ;
Text. Font. Bold = 9999998 ;
Text. Font. Size = 14 ;
Text. Font. Name = "Verdana" ;
Text. MoveUp( , 2 ) ;
Text. HomeKey( , 1 ) ;
Text. TypeText( "Обычный текст, набранный во вторую очередь" ) ;
Text. MoveDown( , 1 ) ;
Text. EndKey( ) ;
Text. TypeParagraph( ) ;
Text. ClearFormatting( ) ;
Position = Text. Range( ) ;
Table = Doc. Tables. Add( Position, 1 , 6 , 1 , 2 ) ;
Table. Columns( 1 ) . PreferredWidth= 10 ;
Table. Columns( 2 ) . PreferredWidth= 50 ;
Table. Columns( 3 ) . PreferredWidth= 10 ;
Table. Columns( 4 ) . PreferredWidth= 10 ;
Table. Columns( 5 ) . PreferredWidth= 10 ;
Table. Columns( 6 ) . PreferredWidth= 10 ;
Row1= Table. Rows( 1 ) ;
Row1. Cells( 1 ) . Range. Text= "№ п/п" ;
Row1. Cells( 2 ) . Range. Text= "Наименование" ;
Row1. Cells( 4 ) . Range. Text= "Кол-во" ;
Row1. Cells( 3 ) . Range. Text= "Ед. изм." ;
Row1. Cells( 5 ) . Range. Text= "Цена,руб." ;
Row1. Cells( 6 ) . Range. Text= "Сумма,руб." ;
НомерСтроки = 1 ;
Для каждого СтрокаТовары Из Ссылка. Товары Цикл
Row= Table. Rows. Add( ) ;
Row. Cells( 1 ) . Range. Text= НомерСтроки;
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 2 ) . Range. Text= СтрокаТовары. Номенклатура. Наименование
+ ? ( ЗначениеЗаполнено( СтрокаТовары. ХарактеристикаНоменклатуры) ,
" (" + СтрокаТовары. ХарактеристикаНоменклатуры+ ")" , "" ) ;
Row. Cells( 4 ) . Range. Text= Строка( СтрокаТовары. Количество) ;
Row. Cells( 4 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 3 ) . Range. Text= ? ( ЗначениеЗаполнено( СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения)
, СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения. Наименование, "-" ) ;
Row. Cells( 3 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 5 ) . Range. Text= Формат( СтрокаТовары. Цена, "ЧДЦ=2" ) ;
Row. Cells( 5 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 6 ) . Range. Text= Формат( СтрокаТовары. Сумма, "ЧДЦ=2" ) ;
Row. Cells( 6 ) . Range. ParagraphFormat. Alignment = 1 ;
НомерСтроки= НомерСтроки+ 1 ;
КонецЦикла ;
Row1. Range. Font. Bold = 9999998 ;
Row1. Range. Font. Size = 14 ;
Row1. Range. Font. Name = "Verdana" ;
Row1. Range. ParagraphFormat. Alignment = 1 ;
Row = Table. Rows. Add( ) ;
Row. Range. Font. Bold = 9999998 ;
Row. Cells( 1 ) . Range. Text= "Итого:" ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
Попытка
Table. cell( НомерСтроки+ 1 , 1 ) . Merge( Table. cell( НомерСтроки+ 1 , 5 ) ) ;
Исключение
КонецПопытки ;
Попытка
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 3 ;
Row. Cells( 2 ) . Range. Text= Формат( Ссылка. Товары. Итог( "Сумма" ) , "ЧДЦ=2" ) ;
Row. Cells( 2 ) . Range. ParagraphFormat. Alignment = 1 ;
Doc. Save( ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/67727/ Категория:
Работа с Microsoft Office и OpenOffice Удаление строк из табличной части документа, все или по условию. Удалить все строки табличного поля документа.
Код 1C v 8.х ОтражениеВУчете. Очистить( ) ;
Как в табличной части документа удалить строки только с нулевым значением реквизита "Количество"?
Код 1C v 8.х
ОбъектДок = СсылкаДок. ПолучитьОбъект( ) ;
СтруктураДляПоиска = Новый Структура( "Количество" , 0 ) ;
ТабличнаяЧастьДок = ОбъектДок. Товары;
МассивПустыхСтрок = ТабличнаяЧастьДок. НайтиСтроки( СтруктураДляПоиска) ;
Для каждого Строка Из МассивПустыхСтрок Цикл
ТабличнаяЧастьДок. Удалить( Строка) ;
КонецЦикла ;
ОбъектДок. Записать( ) ;
Как удалить все строки, кроме тех которые соответсвуют заданному отбору?
Код 1C v 8.х
ПараметрыОтбора = Новый Структура( "СубконтоКт1" , Справочники. РасходыБудущихПериодов. РБПНаПФР) ;
ТЗисходн= ОтражениеВУчете. Выгрузить( ) ;
ТЗнов = ТЗисходн. Скопировать( ПараметрыОтбора) ;
ОтражениеВУчете. Очистить( ) ;
ОтражениеВУчете. Загрузить( ТЗнов) ;
В режиме управляемого приложения конструкция:
Код 1C v 8.2 УП Для каждого Запись из ТабличнойЧасти Цикл
Если Запись. НадоУдалить Тогда
ТабличнойЧасти. Удалить( Запись) ;
КонецЕсли ;
КонецЦикла ;
Работает некорректно, так как переписывает табличную часть и меняет индексы, сразу после удаления и Цикл полностью не обходит.
Решение пришло такое:
Код 1C v 8.2 УП КолВо = Объект. ТабличнойЧасти. Количество( ) - 1 ;
ИндексСтроки = КолВо;
Для счетчик = 0 по КолВо Цикл
Запись = Объект. ТабличнойЧасти. Получить( ИндексСтроки) ;
если Запись. НадоУдалить тогда
Объект. ТабличнойЧасти. Удалить( Запись) ;
КонецЕсли ;
ИндексСтроки = ИндексСтроки - 1 ;
КонецЦикла ;
Категория:
Документы Вывод информации о программе, Пользователе, Интерфейсе, Правах и т.д Код 1C v 7.x
ОчиститьОкноСообщений( ) ;
Состояние( "Вывожу информацию!" ) ;
Сообщить( "ИНФОРМАЦИЯ О ПРОГРАММЕ И ПОЛЬЗОВАТЕЛЕ!" , "I" ) ;
Сообщить( "Имя Компьтера - " + ИмяКомпьютера( ) ) ;
Сообщить( "Имя пользователя - " + ИмяПользователя( ) ) ;
Сообщить( "Полное имя пользователя - " + ПолноеИмяПользователя( ) ) ;
Сообщить( "Права пользователя - " + НазваниеНабораПрав( ) ) ;
Сообщить( "Название интерфейса - " + НазваниеИнтерфейса( ) ) ;
если Монопольныйрежим( ) = 1 тогда моноп= "Монопольный режим"
иначе моноп= "НЕ монопольный режим"
Конецесли ;
сообщить( моноп) ;
Сообщить( "Каталог пользователя - " + КаталогПользователя( ) ) ;
Сообщить( "Каталог ИБ - " + КаталогИБ( ) ) ;
Сообщить( "Каталог Программы - " + КаталогПрограммы( ) ) ;
Сообщить( "Каталог Временных Файлов" + КаталогВременныхФайлов( ) ) ;
Категория:
Пользователь, роль доступа, интерфейс