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