#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
Функция ИдентификаторГруппыВсеПользователи()
Возврат "515b9805-054f-424e-816e-87afebdac3b6";
КонецФункции
Функция СтандартнаяГруппаПользователей(ИмяГруппы) Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Если ИмяГруппы = "ВсеВнешниеПользователи" Тогда
ИдентификаторГруппы = Справочники.ГруппыВнешнихПользователей.ИдентификаторГруппыВсеВнешниеПользователи();
ПолноеИмяСправочника = "Справочник.ГруппыВнешнихПользователей";
МенеджерСправочника = Справочники.ГруппыВнешнихПользователей;
НаименованиеГруппы = НСтр("ru = 'Все внешние пользователи'", ОбщегоНазначения.КодОсновногоЯзыка());
ИначеЕсли ИмяГруппы = "ВсеПользователи" Тогда
ИдентификаторГруппы = ИдентификаторГруппыВсеПользователи();
ПолноеИмяСправочника = "Справочник.ГруппыПользователей";
МенеджерСправочника = Справочники.ГруппыПользователей;
НаименованиеГруппы = НСтр("ru = 'Все пользователи'", ОбщегоНазначения.КодОсновногоЯзыка());
Иначе
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неизвестное имя стандартной группы ""%1"".'"), ИмяГруппы);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", ИмяГруппы);
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыПользователей.Ссылка КАК Ссылка
|ИЗ
| &Таблица КАК ГруппыПользователей
|ГДЕ
| ГруппыПользователей.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", ПолноеИмяСправочника);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 1 И Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыПользователей.Ссылка КАК Ссылка,
| ГруппыПользователей.Наименование КАК Наименование
|ИЗ
| &Таблица КАК ГруппыПользователей
|ГДЕ
| ГруппыПользователей.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", ПолноеИмяСправочника);
Блокировка = Новый БлокировкаДанных;
Блокировка.Добавить(ПолноеИмяСправочника);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
Выборка = Запрос.Выполнить().Выбрать();
СсылкаНового = МенеджерСправочника.ПолучитьСсылку(
Новый УникальныйИдентификатор(ИдентификаторГруппы));
Если Выборка.Количество() = 1 И Выборка.Следующий() Тогда
ГруппаОбъект = Выборка.Ссылка.ПолучитьОбъект();
ИначеЕсли Выборка.Количество() > 1 Тогда
ГруппаОбъект = ГруппаИзДублейПредопределенного(Выборка, НаименованиеГруппы, СсылкаНового);
Иначе
ГруппаОбъект = СсылкаНового.ПолучитьОбъект();
Если ГруппаОбъект = Неопределено Тогда
ГруппаПоНаименованию = ГруппаПоНаименованию(НаименованиеГруппы, ПолноеИмяСправочника);
Если ЗначениеЗаполнено(ГруппаПоНаименованию) Тогда
ГруппаОбъект = ГруппаПоНаименованию.ПолучитьОбъект();
КонецЕсли;
КонецЕсли;
Если ГруппаОбъект = Неопределено Тогда
ГруппаОбъект = МенеджерСправочника.СоздатьЭлемент();
ГруппаОбъект.УстановитьСсылкуНового(СсылкаНового);
КонецЕсли;
КонецЕсли;
Если ГруппаОбъект.ИмяПредопределенныхДанных <> ИмяГруппы Тогда
ГруппаОбъект.ИмяПредопределенныхДанных = ИмяГруппы;
КонецЕсли;
Если ГруппаОбъект.Наименование <> НаименованиеГруппы Тогда
ГруппаОбъект.Наименование = НаименованиеГруппы;
КонецЕсли;
Если ЗначениеЗаполнено(ГруппаОбъект.Состав) Тогда
ГруппаОбъект.Состав.Очистить();
КонецЕсли;
Если ЗначениеЗаполнено(ГруппаОбъект.Комментарий) Тогда
ГруппаОбъект.Комментарий = "";
КонецЕсли;
Если ГруппаОбъект.Модифицированность() Тогда
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаОбъект);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Возврат ГруппаОбъект.Ссылка;
КонецФункции
Функция ГруппаИзДублейПредопределенного(Выборка, НаименованиеГруппы, СсылкаНового)
ГруппаПоПорядку = Неопределено;
ГруппаПоСсылкеНового = Неопределено;
ГруппаПоНаименованию = Неопределено;
ОбъектыДляОтвязки = Новый Соответствие;
Пока Выборка.Следующий() Цикл
ОбъектыДляОтвязки.Вставить(Выборка.Ссылка, Истина);
Если ГруппаПоПорядку = Неопределено Тогда
ГруппаПоПорядку = Выборка.Ссылка;
КонецЕсли;
Если Выборка.Ссылка = СсылкаНового Тогда
ГруппаПоСсылкеНового = Выборка.Ссылка;
ИначеЕсли Выборка.Наименование = НаименованиеГруппы
И ГруппаПоНаименованию = Неопределено Тогда
ГруппаПоНаименованию = Выборка.Ссылка;
КонецЕсли;
КонецЦикла;
Если ГруппаПоСсылкеНового <> Неопределено Тогда
ГруппаОбъект = ГруппаПоСсылкеНового.ПолучитьОбъект();
ОбъектыДляОтвязки.Удалить(ГруппаПоСсылкеНового);
ИначеЕсли ГруппаПоНаименованию <> Неопределено Тогда
ГруппаОбъект = ГруппаПоНаименованию.ПолучитьОбъект();
ОбъектыДляОтвязки.Удалить(ГруппаПоНаименованию);
Иначе
ГруппаОбъект = ГруппаПоПорядку.ПолучитьОбъект();
ОбъектыДляОтвязки.Удалить(ГруппаПоПорядку);
КонецЕсли;
Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл
ТекущийОбъект = КлючИЗначение.Ключ.ПолучитьОбъект();
ТекущийОбъект.ИмяПредопределенныхДанных = "";
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийОбъект);
КонецЦикла;
Возврат ГруппаОбъект;
КонецФункции
Функция ГруппаПоНаименованию(Наименование, ПолноеИмяСправочника)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ГруппыПользователей.Ссылка КАК Ссылка
|ИЗ
| &Таблица КАК ГруппыПользователей
|ГДЕ
| ГруппыПользователей.Наименование = &Наименование
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", ПолноеИмяСправочника);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт
Настройки.ПриНачальномЗаполненииЭлемента = Ложь;
КонецПроцедуры
Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт
Элемент = Элементы.Добавить();
Элемент.ИмяПредопределенныхДанных = "ВсеПользователи";
Элемент.Наименование = НСтр("ru = 'Все пользователи'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецПроцедуры
#КонецОбласти
#КонецЕсли