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