Загрузка данных
#Область ПрограммныйИнтерфейс
#Область РЛС
// Процедура выполняет действие:
// Определить Доступность Хотябы Одного Элемента
//
// Параметры:
// ЭлементСписок - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ОпределитьДоступностьХотябыОдногоЭлемента( ЭлементСписок ) Экспорт
СтароеОтображение = ЭлементСписок.Отображение;
Если СтароеОтображение = ОтображениеТаблицы.Список Тогда
Возврат Ложь;
КонецЕсли;
ЭлементСписок.Отображение = ОтображениеТаблицы.Список;
Схема = ЭлементСписок.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Если ТЗ.Количество() Тогда
ЕстьДоступныеКлиенты = Истина;
Иначе
ЕстьДоступныеКлиенты = ЛОЖЬ;
КонецЕсли;
ЭлементСписок.Отображение = СтароеОтображение;
Возврат ЕстьДоступныеКлиенты;
КонецФункции
#КонецОбласти
// Процедура выполняет действие:
// Получить Текст Письма Из Макета
//
// Параметры:
// ЛицензияМП - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьТекстПисьмаИзМакета(ЛицензияМП) Экспорт
Шаблон = ПолучитьОбщийМакет("ИТ_ЗапросАктивацииМП").ПолучитьТекст();
Если НЕ ЛицензияМП Тогда
Шаблон = СтрЗаменить(Шаблон, " на мобильное приложение", "");
КонецЕсли;
Если ЛицензияМП Тогда
СерийныйНомерКлюча = ИТ_МобильноеПриложениеСервер.ПолучитьСерийныйНомерКлюча();
Иначе
СерийныйНомерКлюча = ИТ_ОбщийЗакрытыйСервер.ПолучитьИдентификаторКлючаСОграничением();
КонецЕсли;
Шаблон = СтрЗаменить(Шаблон, "%ID_ключа_защиты%", СерийныйНомерКлюча);
Возврат Шаблон;
КонецФункции
// Функция - Получить текст письма из макета для блоков функционала
//
// Возвращаемое значение:
// - Произвольный
//
Функция ПолучитьТекстПисьмаИзМакетаДляБлоковФункционала() Экспорт
Шаблон = ПолучитьОбщийМакет("ИТ_ЗапросАктивацииМП").ПолучитьТекст();
Шаблон = СтрЗаменить(Шаблон, " на блок обмена с мобильным приложением", " на используемые блоки функционала");
СерийныйНомерКлюча = ИТ_МобильноеПриложениеСервер.ПолучитьСерийныйНомерКлюча();
Шаблон = СтрЗаменить(Шаблон, "%ID_ключа_защиты%", СерийныйНомерКлюча);
Возврат Шаблон;
КонецФункции
// Процедура выполняет действие:
// Получить Структуру Данных Проведения S L A
//
// Параметры:
// Ссылка - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСтруктуруДанныхПроведенияSLA(Ссылка)Экспорт
Если Не ЗначениеЗаполнено(Ссылка) Тогда
Возврат Новый Структура("Статус, ТекстОшибки", "Не проведен", "Документ не записан");
Иначе
Запрос = Новый Запрос;
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ИТ_СтатусыПроведенияSLA.Проведен,
| ИТ_СтатусыПроведенияSLA.ОписаниеОшибок
| ИЗ
| РегистрСведений.ИТ_СтатусыПроведенияSLA КАК ИТ_СтатусыПроведенияSLA
| ГДЕ
| ИТ_СтатусыПроведенияSLA.ИспользуемыйДокумент = &Документ";
Запрос.УстановитьПараметр( "Документ" , Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Если Выборка.Следующий() Тогда
Если Выборка.Проведен Тогда
Возврат Новый Структура("Статус, ТекстОшибки", "Проведен", "");
Иначе
Если ПустаяСтрока(Выборка.ОписаниеОшибок) Тогда
Возврат Новый Структура("Статус, ТекстОшибки", "Ожидает проведения", Неопределено);
Иначе
Возврат Новый Структура("Статус, ТекстОшибки", "Ошибка проведения", Выборка.ОписаниеОшибок );
КонецЕсли;
КонецЕсли;
Иначе
Возврат Новый Структура("Статус, ТекстОшибки", "Не проведен", "Документ не записан");
КонецЕсли;
КонецЕсли;
КонецФункции
// Процедура выполняет действие:
// Получить Массив Контрагентов Клиента
//
// Параметры:
// Клиент - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьМассивКонтрагентовКлиента(Клиент)Экспорт
Запрос = новый Запрос;
Запрос.Текст =" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Клиенты.Ссылка КАК Клиент,
| Клиенты.Контрагент КАК Контрагент
| ИЗ
| Справочник.Клиенты КАК Клиенты
| ГДЕ
| ВЫБОР
| КОГДА НЕ &КлиентХолдинг
| И НЕ &КлиентЮрЛицо
| ТОГДА Клиенты.Ссылка = &Клиент
| КОГДА &КлиентХолдинг
| ИЛИ &КлиентЮрЛицо
| ТОГДА Клиенты.Ссылка В ИЕРАРХИИ (&Клиент)
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ
| И Клиенты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";
Запрос.УстановитьПараметр("Клиент",Клиент);
Запрос.УстановитьПараметр("КлиентХолдинг",Клиент.Холдинг);
Запрос.УстановитьПараметр("КлиентЮрЛицо",Клиент.ЮридическоеЛицо);
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Контрагент");
КонецФункции
// Процедура выполняет действие:
// Получить Массив Клиентов
//
// Параметры:
// ВыбранноеЗначение - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьМассивКлиентов(ВыбранноеЗначение)Экспорт
Запрос = новый Запрос;
Запрос.Текст =" ВЫБРАТЬ РАЗРЕШЕННЫЕ
|Клиенты.Ссылка КАК Клиент
| ИЗ
|Справочник.Клиенты КАК Клиенты
| ГДЕ
|( ВЫБОР КОГДА НЕ &КлиентХолдинг И НЕ &КлиентЮрЛицо ТОГДА Ссылка = &Клиент
| КОГДА &КлиентХолдинг ИЛИ &КлиентЮрЛицо ТОГДА Ссылка В ИЕРАРХИИ (&Клиент)
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ)
| И Клиенты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";
Запрос.УстановитьПараметр("Клиент",ВыбранноеЗначение);
Запрос.УстановитьПараметр("КлиентХолдинг",ВыбранноеЗначение.Холдинг);
Запрос.УстановитьПараметр("КлиентЮрЛицо",ВыбранноеЗначение.ЮридическоеЛицо);
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Клиент");
КонецФункции
// Процедура выполняет действие:
// Получить Список Документов Коллективного S L A Клиента
//
// Параметры:
// Клиент - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСписокДокументовКоллективногоSLAКлиента(Клиент) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ДоговорПодразделения.Клиент КАК Клиент,
| ДоговорПодразделения.Ссылка КАК Договор
| ПОМЕСТИТЬ ВТ
| ИЗ
| Документ.Договор.Подразделения КАК ДоговорПодразделения
| ГДЕ
| ДоговорПодразделения.Клиент.Холдинг
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ДоговорПодразделения.Клиент,
| ДоговорПодразделения.Ссылка
| ИЗ
| Документ.Договор.Подразделения КАК ДоговорПодразделения
| ГДЕ
| ДоговорПодразделения.Клиент.ЮридическоеЛицо
|
|ИНДЕКСИРОВАТЬ ПО
| Клиент
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| ВТ.Клиент КАК Клиент,
| ВТ.Договор КАК Ссылка
| ИЗ
| ВТ КАК ВТ
| ГДЕ
| ВТ.Клиент В(&КлиентСписок)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ДоговорПодразделения.Клиент,
| ДоговорПодразделения.Ссылка
| ИЗ
| Документ.Договор.Подразделения КАК ДоговорПодразделения
| ГДЕ
| НЕ ДоговорПодразделения.Клиент.ЮридическоеЛицо
| И НЕ ДоговорПодразделения.Клиент.Холдинг
| И ДоговорПодразделения.Клиент = &Клиент";
Запрос.УстановитьПараметр("КлиентСписок", ПолучитьИерархиюКлиента(Клиент));
Запрос.УстановитьПараметр("Клиент", Клиент);
РезультатЗапроса = Запрос.Выполнить();
СписокЗначений = Новый СписокЗначений;
СписокЗначений.ЗагрузитьЗначения( РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка") );
Возврат СписокЗначений;
КонецФункции
// Процедура выполняет действие:
// Записать Шаблоны Нарядов
//
// Параметры:
// Дата - Произвольный
// Клиент - Произвольный
// КомпонентаУслуги - Произвольный
// ЭтотОбъект - Произвольный
// Ссылка - Произвольный
// ТЗНарядыШаблон - Произвольный
// ТЗПоследовательности - Произвольный
// Отказ - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ЗаписатьШаблоныНарядов(Дата, Клиент, КомпонентаУслуги, ЭтотОбъект, Ссылка, ТЗНарядыШаблон, ТЗПоследовательности, Отказ) Экспорт
УстановитьПривилегированныйРежим(Истина);
Если ТЗНарядыШаблон = Неопределено Тогда
Возврат Отказ;
КонецЕсли;
Если ТЗНарядыШаблон.Количество() = 0 Тогда
Возврат Отказ;
КонецЕсли;
ТекДата = ЧасовыеПоясаСервер.ТекущееВремяИБ();
ДатаНачалаФормирования = ТекДата;
ПараметрыСервиса = ПолучениеЗначенийСервер.ПолучитьПараметрыУслуги(Дата, Клиент, КомпонентаУслуги);
// Перед записью документа создадим список нарядов, с которыми документ будет создаваться
// ТЗНарядыШаблон.Колонки.Добавить("ДатаОкончанияПлан");
ТЗНарядыШаблон.Колонки.Добавить("НарядСоздан");
ТЗНарядыШаблон.ЗаполнитьЗначения(Ложь,"НарядСоздан");
// Перед записью документа создадим список нарядов, с которыми документ будет создаваться
Для Каждого ШаблонНаряда Из ТЗНарядыШаблон Цикл
// Загрузку выполняем для не существующих нарядов
Если ТипЗнч(ШаблонНаряда.Наряд) = Тип("Строка") И ШаблонНаряда.Наряд <> ИТ_ОбщегоНазначенияСерверПовтИсп.ПолучитьСтрокуЗапланированоСозданиеНаряда() Тогда
НовНаряд = Документы.Наряд.СоздатьДокумент();
НовНаряд.Заполнить(ЭтотОбъект);
НовНаряд.ИнициаторНаряда = ШаблонНаряда.Инициатор;
НовНаряд.ШаблонНаряда = ШаблонНаряда.ШаблонНаряда;
// Заполнение поля «Описание» порожденного наряда
ОписаниеНовНаряда = ШаблонНаряда.ШаблонНаряда.ФорматированноеОписание.Получить();
ТекстовоеПредставлениеОписания = "";
Если ТипЗнч(Ссылка) = Тип("ДокументСсылка.Инцидент") Тогда
Если ОписаниеНовНаряда = Неопределено Тогда
ОписаниеНовНаряда = Новый ФорматированныйДокумент;
КОнецЕсли;
Если НЕ ОбщийМодульСервер.ФорматированныйДокументПустой(ШаблонНаряда.ШаблонНаряда.ФорматированноеОписание) Тогда
ТекстовоеПредставлениеОписания = Символы.ПС + СИмволы.ПС + "----------" + Символы.ПС;
ИначеЕсли СокрЛП(ШаблонНаряда.Описание) <> "" Тогда
ТекстовоеПредставлениеОписания = ШаблонНаряда.Описание + Символы.ПС + СИмволы.ПС + "----------" + Символы.ПС;
КонецЕсли;
Если СокрЛП(Ссылка.ТемаОбращения) <> "" Тогда
ТекстовоеПредставлениеОписания = ТекстовоеПредставлениеОписания + " Тема обращения: ";
ТекстовоеПредставлениеОписания = ТекстовоеПредставлениеОписания + СокрЛП(Ссылка.ТемаОбращения) + Символы.ПС;
КонецЕсли;
Если НЕ ОбщийМодульСервер.ФорматированныйДокументПустой(Ссылка.ФорматированноеОписание) Тогда
ТекстовоеПредставлениеОписания = ТекстовоеПредставлениеОписания + " Описание обращения: ";
ОбщиймодульСервер.ДобавитьФорматированныйДокументВКонецДругого(ТекстовоеПредставлениеОписания,Ссылка.ФорматированноеОписание.Получить());
ИначеЕсли СокрЛП(Ссылка.Описание)<>"" Тогда
ТекстовоеПредставлениеОписания = ТекстовоеПредставлениеОписания + " Описание обращения: ";
ТекстовоеПредставлениеОписания = ТекстовоеПредставлениеОписания + СокрЛП(Ссылка.Описание) + Символы.ПС;
КонецЕсли;
КонецЕсли;
ОбщиймодульСервер.ДобавитьФорматированныйДокументВКонецДругого(ОписаниеНовНаряда,ТекстовоеПредставлениеОписания);
НовНаряд.ФорматированноеОписание = Новый ХранилищеЗначения(ОписаниеНовНаряда);
РешениеНовНаряда = Неопределено;
Если ШаблонНаряда.ФорматированноеРешение <> Неопределено ТОгда
РешениеНовНаряда = ШаблонНаряда.ФорматированноеРешение.Получить();
КонецЕсли;
Если РешениеНовНаряда = Неопределено ИЛИ ОбщийМодульСервер.ФорматированныйДокументПустой(РешениеНовНаряда) Тогда
РешениеНовНаряда = Новый ФорматированныйДокумент;
РешениеНовНаряда.Добавить(ШаблонНаряда.Решение);
КонецЕсли;
НовНаряд.ФорматированноеРешение = Новый ХранилищеЗначения(РешениеНовНаряда);
НовНаряд.ОргПодразделение= ШаблонНаряда.ОргПодразделение;
НовНаряд.Ответственный = ШаблонНаряда.Ответственный;
НовНаряд.Состояние = ШаблонНаряда.Состояние;
Если Не ЗначениеЗаполнено(НовНаряд.Приоритет) Тогда
НовНаряд.Приоритет = ШаблонНаряда.Приоритет;
КонецЕсли;
НовНаряд.Категория = ШаблонНаряда.ШаблонНаряда.Категория;
// НовНаряд.ОбъектОбслуживания = ШаблонНаряда.ОбъектОбслуживания;
НовНаряд.ШаблонНаряда = ШаблонНаряда.ШаблонНаряда;
Если ШаблонНаряда.КонфигурационныеЕдиницы.Количество() Тогда
НовНаряд.КонфигурационныеЕдиницы.Очистить();
Для каждого ТекСтрока из ШаблонНаряда.КонфигурационныеЕдиницы Цикл
Нс = НовНаряд.КонфигурационныеЕдиницы.Добавить();
Нс.КЕ = ТекСтрока.Значение;
КонецЦикла;
КонецЕсли;
НовНаряд.Дата = ?(НЕ ЗначениеЗаполнено(Дата), ДатаНачалаФормирования, Дата);
Если ЗначениеЗаполнено(ШаблонНаряда.Услуга) Тогда
НовНаряд.Услуга = ШаблонНаряда.Услуга;
НовНаряд.КомпонентаУслуги = ШаблонНаряда.СоставУслуги;
КонецЕсли;
Если ЗначениеЗаполнено(ШаблонНаряда.Инициатор) Тогда
НовНаряд.ИнициаторНаряда = ШаблонНаряда.Инициатор;
Иначе
НовНаряд.ИнициаторНаряда = ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийСотрудник").ФизЛицо;
КонецЕсли;
// Выполняем расчет времени выполнения нарядов
ИТ_РасчетТрудозатратПоНарядам.РасчетТрудозатратПоНаряду(НовНаряд,
Перечисления.ИТ_АлгоритмыРасчетаПлановыхПоказателейНаряда.СозданиеНарядаПоШаблонуПоследовательностиРабот,
Новый Структура("ШаблонНаряда, UUIDПоследовательности, МестоВПоследовательности",
ШаблонНаряда.ШаблонНаряда,
ШаблонНаряда.UUIDПоследовательности,
ШаблонНаряда.МестоВПоследовательности));
НовНаряд.Тип = ШаблонНаряда.ШаблонНаряда.ТипНаряда;
ИТ_ПравилаПереходаСервер.ПолучитьИзменениеСценарийИУстановитьСценарийВПараметр(НовНаряд.КомпонентаУслуги,НовНаряд.Клиент,НовНаряд.Дата,НовНаряд.СценарийОбработки, Ложь, "Наряд");
НовНаряд.Записать();
Если ШаблонНаряда.ШаблонНаряда.ОповещаемыеЛица.Количество() Тогда
НаборЗаписей = РегистрыСведений.ПолучателиСообщений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИспользуемыйДокумент.Установить(НовНаряд.Ссылка);
НаборЗаписей.Очистить();
Для Каждого СтрокаТЗ Из ШаблонНаряда.ШаблонНаряда.ОповещаемыеЛица Цикл
Строка = НаборЗаписей.Добавить();
Строка.ИспользуемыйДокумент = НовНаряд.Ссылка;
Строка.КонтактноеЛицо = СтрокаТЗ.ОповещаемоеЛицо;
КонецЦикла;
НаборЗаписей.Записать();
Иначе
НаборЗаписей = РегистрыСведений.ПолучателиСообщений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИспользуемыйДокумент.Установить(Ссылка);
НаборЗаписей.Прочитать();
НаборЗаписейНовый = РегистрыСведений.ПолучателиСообщений.СоздатьНаборЗаписей();
НаборЗаписейНовый.Отбор.ИспользуемыйДокумент.Установить(НовНаряд.Ссылка);
НаборЗаписейНовый.Очистить();
Для Каждого СтрокаТЗ Из НаборЗаписей.Выгрузить() Цикл
Строка = НаборЗаписейНовый.Добавить();
Строка.ИспользуемыйДокумент = НовНаряд.Ссылка;
Строка.КонтактноеЛицо = СтрокаТЗ.КонтактноеЛицо;
КонецЦикла;
НаборЗаписейНовый.Записать();
КонецЕсли;
// В итоге выполняем присваивание
ШаблонНаряда.Наряд = НовНаряд.Ссылка;
Если ЗначениеЗаполнено(ШаблонНаряда.Последовательность) Тогда
Запись = РегистрыСведений.ИТ_ПоследовательностиНарядов.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись,ШаблонНаряда);
Запись.Родитель = Ссылка;
Запись.ПоследовательностьСозданаПолностью = ИТ_ПоследовательностиРаботСервер.НеобходимоСозданиеВсехНарядовПоследовательности(ШаблонНаряда.Последовательность);
Запись.Записать();
Если ТЗПоследовательности <> Неопределено и ТЗПоследовательности.Найти(ШаблонНаряда.UUIDПоследовательности, "UUIDПоследовательности") = Неопределено Тогда
НС = ТЗПоследовательности.Добавить();
ЗаполнитьЗначенияСвойств(НС, ШаблонНаряда);
КонецЕсли;
КонецЕсли;
ИТ_ОбщиеФункцииФормДокументовСервер.ПереносДопПолейИзШаблона(ШаблонНаряда.ШаблонНаряда, НовНаряд.Ссылка);
КонецЕсли; // Если ТипЗнч(ШаблонНаряда.Наряд) = Тип("Строка") Тогда ...
КонецЦикла; // Для Каждого ШаблонНаряда Из ТЗНаряды Цикл ...
УстановитьПривилегированныйРежим(Ложь);
Возврат Отказ;
КонецФункции
// Процедура выполняет действие:
// Скопировать Структуру
//
// Параметры:
// Структура - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция СкопироватьСтруктуру(Структура)Экспорт
СтрВозврата = Новый Структура;
Для каждого КлючИЗначение Из Структура Цикл
СтрВозврата.Вставить(КлючИЗначение.Ключ, СкопироватьЗначение(КлючИЗначение.Значение) );
КонецЦикла;
Возврат СтрВозврата;
КонецФункции // ()
// Процедура выполняет действие:
// Получить Текст Будет Создан При Записи
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьТекстБудетСозданПриЗаписи()Экспорт
Возврат НСтр("ru = '<будет создан при записи>'");
КонецФункции // ()
// Процедура выполняет действие:
// Получить Контактное Лицо По Физ Лицу
//
// Параметры:
// ФизЛицо - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьКонтактноеЛицоПоФизЛицу(ФизЛицо) Экспорт
Если ЗначениеЗаполнено(ФизЛицо) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ИТ_КонтактныеЛица.Ссылка
| ИЗ
| Справочник.ИТ_КонтактныеЛица КАК ИТ_КонтактныеЛица
| ГДЕ
| ИТ_КонтактныеЛица.ФизЛицо = &ФизЛицо";
Запрос.УстановитьПараметр( "ФизЛицо" , ФизЛицо );
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
Возврат Выборка.ссылка;
КонецЦикла;
КонецЕсли;
Возврат Справочники.ИТ_КонтактныеЛица.ПустаяСсылка();
КонецФункции // ПолучитьКонтактноеЛицоПоФизЛицу(ФизЛицо)
// Процедура выполняет действие:
// Получить Строку Без Спец Символов Для Наименования
//
// Параметры:
// Строка - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСтрокуБезСпецСимволовДляНаименования(Строка) Экспорт
Строка = СтрЗаменить(Строка," ","_");
Строка = СтрЗаменить(Строка,"(","_");
Строка = СтрЗаменить(Строка,")","_");
Строка = СтрЗаменить(Строка,"!","_");
Строка = СтрЗаменить(Строка,"?","_");
Строка = СтрЗаменить(Строка,"-","_");
Строка = СтрЗаменить(Строка,"""","_"); // Кавычки
Строка = СтрЗаменить(Строка,"'","_");
Строка = СтрЗаменить(Строка,"/","_");
Строка = СтрЗаменить(Строка,"\","_");
Строка = СтрЗаменить(Строка,"+","_");
Строка = СтрЗаменить(Строка,"=","_");
Строка = СтрЗаменить(Строка,"%","_");
Строка = СтрЗаменить(Строка,"$","_");
Строка = СтрЗаменить(Строка,"#","_");
Строка = СтрЗаменить(Строка,"@","_");
Строка = СтрЗаменить(Строка,"&","_");
Строка = СтрЗаменить(Строка,"*","_");
Строка = СтрЗаменить(Строка,"|","_");
Строка = СтрЗаменить(Строка,".","_");
Строка = СтрЗаменить(Строка,",","_");
Строка = СтрЗаменить(Строка,";","_");
Строка = СтрЗаменить(Строка,"`","_");
Строка = СтрЗаменить(Строка,"~","_");
Строка = СтрЗаменить(Строка,"[","_");
Строка = СтрЗаменить(Строка,"]","_");
Строка = СтрЗаменить(Строка,"«","_");
Строка = СтрЗаменить(Строка,"»","_");
Строка = СтрЗаменить(Строка,":","_");
Строка = СтрЗаменить(Строка,">","_");
Строка = СтрЗаменить(Строка,"<","_");
Возврат Строка
КонецФункции // ПолучитьСтрокуБезСпецСимволов
// Процедура выполняет действие: УстановитьКодЗакрытия(Состояние, КодЗакрытия)
//
// Параметры:
// Состояние - Произвольный
// СсылкаНаОбъект - Произвольный
// КодЗакрытия - Произвольный
Процедура УстановитьКодЗакрытияИзФормы( Состояние, СсылкаНаОбъект ,КодЗакрытия ) Экспорт
Если Состояние <> СсылкаНаОбъект.Состояние и
Состояние.ТребоватьЗаполнениеКодаЗакрытия и
Не ЗначениеЗаполнено(КодЗакрытия) Тогда
КодЗакрытия = Состояние.КодЗакрытия;
КонецЕсли;
КонецПроцедуры // УстановитьКодЗакрытия(Состояние)
// ////////////////////////////////////////////////////////////////////////////
// //// Оповещения текущего сотрудника (начало)////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьОповещенияТекущегоСотрудника() Экспорт
ТекущийСотрудник = ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийСотрудник");
Запрос = Новый Запрос;
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ИТ_ОповещаемыеПоНовымДокументам.Сотрудник,
| ИТ_ОповещаемыеПоНовымДокументам.ИД,
| ИТ_ОповещаемыеПоНовымДокументам.ИспользуемыйДокумент КАК Документ,
| ИТ_ОповещаемыеПоНовымДокументам.Текст
| ИЗ
| РегистрСведений.ИТ_ОповещаемыеПоНовымДокументам КАК ИТ_ОповещаемыеПоНовымДокументам
| ГДЕ
| ИТ_ОповещаемыеПоНовымДокументам.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник", ТекущийСотрудник );
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Массив = Новый Массив();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Структура = Новый Структура("Сотрудник,ИД, Документ, Текст,СсылкаНав");
ЗаполнитьЗначенияСвойств(Структура, ВыборкаДетальныеЗаписи);
Структура.СсылкаНав = ПолучитьНавигационнуюСсылку(ВыборкаДетальныеЗаписи.Документ);
Массив.Добавить(Структура);
КонецЦикла;
Возврат Массив;
КонецФункции
// Функция выполняет действие:
// Удалить Записи Оповещений Тек Сотрудника
//
// Параметры:
// Массив - Произвольный
Процедура УдалитьЗаписиОповещенийТекСотрудника(Массив) Экспорт
ТекущийСотрудник = ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийСотрудник");
РегистрыСведений.ИТ_ОповещаемыеПоНовымДокументам.УдалитьЗаписиПоСотрудникуСМассивом(ТекущийСотрудник, Массив );
КонецПроцедуры
// ////////////////////////////////////////////////////////////////////////////
// //// Оповещения текущего сотрудника (окончание)/////////////////////////////
// ////////////////////////////////////////////////////////////////////////////
//
// Параметры:
// Объект - Произвольный
// ИнтерактивноеРедактирование - Произвольный
Процедура УстановитьКодЗакрытияИзМодуля( Объект , ИнтерактивноеРедактирование ) Экспорт
Если Не ИнтерактивноеРедактирование и
Объект.Состояние.ТребоватьЗаполнениеКодаЗакрытия и
Не ЗначениеЗаполнено(Объект.КодЗакрытия) Тогда
Объект.КодЗакрытия = Объект.Состояние.КодЗакрытия;
КонецЕсли;
КонецПроцедуры // УстановитьКодЗакрытия(Состояние)
// Процедура выполняет действие:
// Выполнить Серверные Действия При Начале Работы Системы
//
// Возвращаемое значение:
// Произвольный
Функция ВыполнитьСерверныеДействияПриНачалеРаботыСистемы() Экспорт
Структура = Новый Структура("ЗавершитьРаботуСистемы, Текст, ЭтоИтилиум", Ложь, "", ЛОЖЬ );
Если Метаданные.Имя = "Итилиум" Тогда
Структура.ЭтоИтилиум = Истина;
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Имя = ТекущийПользователь.УникальныйИдентификатор;
Если ПустаяСтрока(Имя) Тогда
Структура.Текст = "Пользователь не авторизован!!!";
Структура.ЗавершитьРаботуСистемы = Истина;
Возврат Структура;
КонецЕсли;
КонецЕсли;
// Определение необходимости заполнения регистра сведений ГрафикОказанияУслуг на следующий год
Если РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда
Запрос = Новый Запрос;
Запрос.Текст = " ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗапросКСправочнику.Ссылка
| ИЗ
| (ВЫБРАТЬ
| ВремяОказанияУслуг.Ссылка КАК Ссылка
| ИЗ
| Справочник.ВремяОказанияУслуг КАК ВремяОказанияУслуг
| ГДЕ
| ВремяОказанияУслуг.ПометкаУдаления = ЛОЖЬ ) КАК ЗапросКСправочнику
| ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ГрафикОказанияУслуг.ВремяОказанияУслуг КАК ВремяОказанияУслуг,
| КОЛИЧЕСТВО(1) КАК КОЛИЧЕСТВО
| ИЗ
| РегистрСведений.ГрафикОказанияУслуг КАК ГрафикОказанияУслуг
| ГДЕ
| ГрафикОказанияУслуг.Дата >= &ДатаГода
|
| СГРУППИРОВАТЬ ПО
| ГрафикОказанияУслуг.ВремяОказанияУслуг) КАК ЗапросКРегистру
| ПО ЗапросКСправочнику.Ссылка = ЗапросКРегистру.ВремяОказанияУслуг
| ГДЕ
| ЗапросКРегистру.КОЛИЧЕСТВО ЕСТЬ NULL ";
НоваяДата = НачалоГода(ЧасовыеПоясаСервер.ТекущееВремяИБ());
Запрос.УстановитьПараметр("ДатаГода", НоваяДата);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ГрафикиРаботСервер.СформироватьРасписание(Выборка.Ссылка, НоваяДата);
КонецЦикла;
КонецЕсли;
// Определение необходимости заполнения регистра сведений ГрафикРабот на следующий год
СотрудникиЗапрос = Новый Запрос;
СотрудникиЗапрос.Текст = " ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Сотрудники.Ссылка КАК Сотрудник,
| МАКСИМУМ(ГрафикРаботы.ДатаОкончания) КАК ДатаОкончания
| ИЗ
| РегистрСведений.ГрафикРаботы КАК ГрафикРаботы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО ГрафикРаботы.Сотрудник = Сотрудники.Ссылка
| ГДЕ
| (НЕ Сотрудники.График ЕСТЬ NULL )
|
| СГРУППИРОВАТЬ ПО
| Сотрудники.Ссылка";
СотрудникиВыборка = СотрудникиЗапрос.Выполнить().Выбрать();
ТекущаяДатаПеременная = ЧасовыеПоясаСервер.ТекущееВремяИБ();
НачалоГодаПеременная = НачалоГода(ТекущаяДатаПеременная);
Если РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда
Пока СотрудникиВыборка.Следующий() Цикл
Если СотрудникиВыборка.ДатаОкончания < ТекущаяДатаПеременная Тогда
// График = ГрафикиРаботСервер.РасчитатьГрафикРаботНаГод(СотрудникиВыборка.Сотрудник.График, НачалоГодаПеременная, СотрудникиВыборка.Сотрудник.ДополненияГрафикаРаботы);
Попытка
ГрафикСотрудника = упрПолучениеЗначений.ПолучитьРеквизит(СотрудникиВыборка.Сотрудник, "График");
Если НЕ ЗначениеЗаполнено(ГрафикСотрудника) Тогда
ВызватьИсключение НСтр("ru = 'У сотрудника не заполнен график работы.'");
КонецЕсли;
ДополненияГрафикаРаботы = упрПолучениеЗначений.ПолучитьРеквизит(СотрудникиВыборка.Сотрудник, "ДополненияГрафикаРаботы");
График = ГрафикиРаботСервер.РасчитатьГрафикРаботНаГод(ГрафикСотрудника, НачалоГодаПеременная, ДополненияГрафикаРаботы);
Если ТипЗнч(График) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение НСтр("ru = 'Расчет графика работы сотрудника не вернул таблицу значений.'");
КонецЕсли;
Для Каждого Строка Из График Цикл
ЗаписьРегистра = РегистрыСведений.ГрафикРаботы.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Сотрудник = СотрудникиВыборка.Сотрудник;
ЗаписьРегистра.ДатаНачала = Строка.ДеньНедели + Секунда(Строка.НачалоРаботы) + Минута(Строка.НачалоРаботы)*60 + Час(Строка.НачалоРаботы)*3600 + (День(Строка.НачалоРаботы)-1)*86400;
ЗаписьРегистра.ДатаОкончания = Строка.ДеньНедели + Секунда(Строка.КонецРаботы) + Минута(Строка.КонецРаботы)*60 + Час(Строка.КонецРаботы)*3600 + (День(Строка.КонецРаботы)-1)*86400;
ЗаписьРегистра.Записать();
КонецЦикла;
Исключение
// ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка изменения графика работы сотрудника'"),
// УровеньЖурналаРегистрации.Ошибка,,,
// ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка изменения графика работы сотрудника'"),
УровеньЖурналаРегистрации.Ошибка,, СотрудникиВыборка.Сотрудник,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Структура;
КонецФункции
// Работа с допполями
//
// Параметры:
// СтрокаДействия - Произвольный
// СсылкаНаДокумент - Произвольный
// ОбъектДопПоля - Произвольный
// ДопПоля - Произвольный
// Клиент - Произвольный
// ОргПодразделение - Произвольный
Процедура ЗаполнитьТаблицуДопПоля(СтрокаДействия, СсылкаНаДокумент, ОбъектДопПоля, ДопПоля, Клиент = Неопределено, ОргПодразделение = Неопределено) Экспорт
Если НЕ ПолучитьФункциональнуюОпцию("Использовать_ДопПоля") Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Инцидент")
ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Наряд")
ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Изменение")
ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Релиз")
ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Проблема")
ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.ИТ_Событие")
Тогда
Если Клиент = Неопределено Тогда
Клиент = СсылкаНаДокумент.Клиент;
КонецЕсли;
Если ОргПодразделение = Неопределено Тогда
ОргПодразделение = СсылкаНаДокумент.ОргПодразделение;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(СсылкаНаДокумент) = Тип("СправочникСсылка.Клиенты") Тогда
Клиент = СсылкаНаДокумент;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ИмяРеквизита = ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент);
Если ИмяРеквизита = "ИТ_Событие" Тогда
ИмяРеквизита = "Событие";
ИначеЕсли ИмяРеквизита = "ИТ_ШаблоныНарядов" Тогда
ИмяРеквизита = "ШаблоныНарядов";
КонецЕсли;
Если РольДоступна(Метаданные.Роли.ПотребительУслуг) или
РольДоступна(Метаданные.Роли.ПотребительУслугКуратор) Тогда
ТекстПараметра = " ДопПоля.ВидимостьДляПользователя ";
УчитыватьВидимостьДляПользователя = Истина;
Иначе
ТекстПараметра = " ИСТИНА ";
УчитыватьВидимостьДляПользователя = Ложь;
КонецЕсли;
ДопПоляНаименованиеПоля = ПолучитьНаименованиеТЧДопПолейПоСсылкеДокумента(СсылкаНаДокумент);
Если ПолучитьФункциональнуюОпцию("ИТ_ИспользоватьНаборыДопПолей") И ДопПоляНаименованиеПоля <> "" Тогда
Если ИмяРеквизита = "ШаблоныИнцидентов" Тогда
ИмяРеквизита = "Инцидент";
ИначеЕсли ИмяРеквизита = "ИТ_ШаблоныНарядов" ИЛИ ИмяРеквизита = "ШаблоныНарядов" Тогда
ИмяРеквизита = "Наряд";
ИначеЕсли ИмяРеквизита = "ШаблоныСобытий" Тогда
ИмяРеквизита = "Событие";
КонецЕсли;
Если Клиент <> Неопределено Тогда
СписокКлиентовПоИерархии = ПолучениеЗначенийСервер.ПолучитьСписокКлиентовИерархически(Клиент);
Иначе
СписокКлиентовПоИерархии = Новый СписокЗначений;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СвойстваДокументов.ИспользуемыйДокумент КАК Документ,
| СвойстваДокументов.Свойство,
| СвойстваДокументов.Значение
| ПОМЕСТИТЬ ТабСвойстваДокументов
| ИЗ
| РегистрСведений.СвойстваДокументов КАК СвойстваДокументов
| ГДЕ
| СвойстваДокументов.ИспользуемыйДокумент = &Документ
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| ДополнительныеПоля.Ссылка,
| ДополнительныеПоля.ВидимостьДляПользователя
| ПОМЕСТИТЬ ДопПоля
| ИЗ
| ПланВидовХарактеристик.ДополнительныеПоля КАК ДополнительныеПоля
| ГДЕ "
+ ?(УчитыватьВидимостьДляПользователя, " ДополнительныеПоля.ВидимостьДляПользователя = ИСТИНА И ","") + "
| ДополнительныеПоля.ПометкаУдаления = ЛОЖЬ
| И ДополнительныеПоля." + ИмяРеквизита + " = ИСТИНА
|;
|////////////////////////////////////////////////////////////////////////////////
|
| ВЫБРАТЬ
| Клиенты.Ссылка КАК Клиент
| ПОМЕСТИТЬ ВТ
| ИЗ
| Справочник.Клиенты КАК Клиенты
| ГДЕ
| Клиенты.Ссылка В (&СписокКлиентовПоИерархии)
| ;
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| НаборыДопПолей.ИспользоватьИерархию КАК ИспользоватьИерархию,
| НаборыДопПолей.Клиент КАК Клиент,
| НаборыДопПолей.ОргПодразделение КАК ОргПодразделение
| ПОМЕСТИТЬ ПоляНаборов
| ИЗ
| Справочник.НаборыДопПолей КАК НаборыДопПолей
| ;
| ////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| НаборыДопПолей.ДополнительноеПоле КАК ДополнительноеПоле
| ПОМЕСТИТЬ ДопПоляИзНаборов
| ИЗ
| Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
| ГДЕ
| НаборыДопПолей.Ссылка.Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
| И НаборыДопПолей.Ссылка.ОргПодразделение = ЗНАЧЕНИЕ(Справочник.ОрганизационныеПодразделения.ПустаяСсылка)
| И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| НаборыДопПолей.ДополнительноеПоле
| ИЗ
| Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
| ГДЕ
| НаборыДопПолей.Ссылка.ОргПодразделение = ЗНАЧЕНИЕ(Справочник.ОрганизационныеПодразделения.ПустаяСсылка)
| И НаборыДопПолей.Ссылка.Клиент = &Клиент
| И НаборыДопПолей.Ссылка.ИспользоватьИерархию = ЛОЖЬ
| И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| НаборыДопПолей.ДополнительноеПоле
| ИЗ
| Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
| ПО НаборыДопПолей.Ссылка.Клиент = ВТ.Клиент
| И (НаборыДопПолей.Ссылка.ИспользоватьИерархию)
| ГДЕ
| НаборыДопПолей.Ссылка.ОргПодразделение = ЗНАЧЕНИЕ(Справочник.ОрганизационныеПодразделения.ПустаяСсылка)
| И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| НаборыДопПолей.ДополнительноеПоле
| ИЗ
| Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
| ГДЕ
| НаборыДопПолей.Ссылка.ОргПодразделение = &ОргПодразделение
| И НаборыДопПолей.Ссылка.Клиент = &Клиент
| И НаборыДопПолей.Ссылка.ИспользоватьИерархию = ЛОЖЬ
| И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| НаборыДопПолей.ДополнительноеПоле
| ИЗ
| Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
| ПО НаборыДопПолей.Ссылка.Клиент = ВТ.Клиент
| И (НаборыДопПолей.Ссылка.ИспользоватьИерархию)
| ГДЕ
| НаборыДопПолей.Ссылка.ОргПодразделение = &ОргПодразделение
| И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| НаборыДопПолей.ДополнительноеПоле
| ИЗ
| Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
| ГДЕ
| НаборыДопПолей.Ссылка.ОргПодразделение = &ОргПодразделение
| И НаборыДопПолей.Ссылка.Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
| И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
| ;
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| ДопПоля.Ссылка КАК Ссылка,
| ДопПоля.ВидимостьДляПользователя КАК ВидимостьДляПользователя
| ПОМЕСТИТЬ ДопПоляПослеОбработки
| ИЗ
| ДопПоляИзНаборов КАК ДопПоляИзНаборов
| ЛЕВОЕ СОЕДИНЕНИЕ ДопПоля КАК ДопПоля
| ПО ДопПоля.Ссылка = ДопПоляИзНаборов.ДополнительноеПоле
| ;
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| ТабСвойстваДокументов.Документ,
| ЕСТЬNULL(ТабСвойстваДокументов.Свойство, ДопПоля.Ссылка) КАК Свойство,
| ТабСвойстваДокументов.Значение,
| " + ТекстПараметра + " КАК Видимость
| ПОМЕСТИТЬ Предитог
| ИЗ
| ТабСвойстваДокументов КАК ТабСвойстваДокументов
| ПОЛНОЕ СОЕДИНЕНИЕ ДопПоляПослеОбработки КАК ДопПоля
| ПО ТабСвойстваДокументов.Свойство = ДопПоля.Ссылка "
+ ?(УчитыватьВидимостьДляПользователя, " ГДЕ ДопПоля.ВидимостьДляПользователя = ИСТИНА ", "")
+ ";
| ВЫБРАТЬ
| Предитог.Документ,
| Предитог.Свойство,
| Предитог.Значение,
| ЕСТЬNULL(СортировкаДопПолейВОбъектах.ПорядковыйНомерСтроки, 1000) КАК НомерСтроки,
| Предитог.Видимость
| ИЗ
| ПредИтог КАК Предитог
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СортировкаДопПолейВОбъектах КАК СортировкаДопПолейВОбъектах
| ПО Предитог.Свойство = СортировкаДопПолейВОбъектах.ДопПоле
| И (СортировкаДопПолейВОбъектах.Объект = &Объект)
| И (СортировкаДопПолейВОбъектах.Пользователь = &ТекПользователь)";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "%ДопПоляНаименованиеПоля%", ДопПоляНаименованиеПоля);
Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
Запрос.УстановитьПараметр("Объект", Строка(ТипЗнч(СсылкаНаДокумент)));
Запрос.УстановитьПараметр("ТекПользователь", ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийПользователь"));
Запрос.УстановитьПараметр("Клиент", Клиент);
Запрос.УстановитьПараметр("ОргПодразделение", ОргПодразделение);
Запрос.УстановитьПараметр("СписокКлиентовПоИерархии", СписокКлиентовПоИерархии);
Иначе
Запрос = Новый Запрос;
Запрос.Текст =" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СвойстваДокументов.ИспользуемыйДокумент КАК Документ,
| СвойстваДокументов.Свойство,
| СвойстваДокументов.Значение
| ПОМЕСТИТЬ ТабСвойстваДокументов
| ИЗ
| РегистрСведений.СвойстваДокументов КАК СвойстваДокументов
| ГДЕ
| СвойстваДокументов.ИспользуемыйДокумент = &Документ
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| ДополнительныеПоля.Ссылка,
| ДополнительныеПоля.ВидимостьДляПользователя
| ПОМЕСТИТЬ ДопПоля
| ИЗ
| ПланВидовХарактеристик.ДополнительныеПоля КАК ДополнительныеПоля
| ГДЕ "
+ ?(УчитыватьВидимостьДляПользователя, " ДополнительныеПоля.ВидимостьДляПользователя = ИСТИНА И ","") + "
| ДополнительныеПоля.ПометкаУдаления = ЛОЖЬ
| И ДополнительныеПоля." + ИмяРеквизита + " = ИСТИНА
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| ТабСвойстваДокументов.Документ,
| ЕСТЬNULL(ТабСвойстваДокументов.Свойство, ДопПоля.Ссылка) КАК Свойство,
| ТабСвойстваДокументов.Значение,
| " + ТекстПараметра + " КАК Видимость
| ПОМЕСТИТЬ Предитог
| ИЗ
| ТабСвойстваДокументов КАК ТабСвойстваДокументов
| ПОЛНОЕ СОЕДИНЕНИЕ ДопПоля КАК ДопПоля
| ПО ТабСвойстваДокументов.Свойство = ДопПоля.Ссылка "
+ ?(УчитыватьВидимостьДляПользователя, " ГДЕ ДопПоля.ВидимостьДляПользователя = ИСТИНА ", "")
+ "; ВЫБРАТЬ
| Предитог.Документ,
| Предитог.Свойство,
| Предитог.Значение,
| ЕСТЬNULL(СортировкаДопПолейВОбъектах.ПорядковыйНомерСтроки, 1000) КАК НомерСтроки,
| Предитог.Видимость
| ИЗ
| ПредИтог КАК Предитог
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СортировкаДопПолейВОбъектах КАК СортировкаДопПолейВОбъектах
| ПО Предитог.Свойство = СортировкаДопПолейВОбъектах.ДопПоле
| И (СортировкаДопПолейВОбъектах.Объект = &Объект)
| И (СортировкаДопПолейВОбъектах.Пользователь = &ТекПользователь)";
Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
Запрос.УстановитьПараметр("Объект", Строка(ТипЗнч(СсылкаНаДокумент)));
Запрос.УстановитьПараметр("ТекПользователь", ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийПользователь"));
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если СтрокаДействия = "ОбновитьСписок" Тогда
// ОбъектДопПоля = РеквизитФормыВЗначение("ДопПоля");
Для Каждого СтрокаРезультата ИЗ РезультатЗапроса Цикл
НайденнаяСтрока = ОбъектДопПоля.Найти(СтрокаРезультата.Свойство, "Свойство");
Если НайденнаяСтрока <> Неопределено Тогда
СтрокаРезультата.Значение = НайденнаяСтрока.Значение;
Иначе
СтрокаРезультата.Значение = "";
КонецЕсли;
КонецЦикла;
Для каждого Стр Из ОбъектДопПоля Цикл
НайденнаяСтрока = РезультатЗапроса.Найти(Стр.Свойство, "Свойство");
Если НайденнаяСтрока = Неопределено Тогда
Если ИТ_ОбщегоНазначения.ПолучитьЗначениеКонстанты("ИТ_ИспользоватьНаборыДопПолей") И НЕ ЗначениеЗаполнено(Стр.Значение) Тогда
Продолжить;
КонецЕсли;
НС = РезультатЗапроса.Добавить();
ЗаполнитьЗначенияСвойств(НС, Стр);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ТипЗнч(ДопПоля) = Тип("ТаблицаЗначений") Тогда
ДопПоля = РезультатЗапроса.Скопировать();
Иначе
ДопПоля.Загрузить(РезультатЗапроса);
КонецЕсли;
ДопПоля.Сортировать("НомерСтроки, Свойство Возр");
КонецПроцедуры
// Функция выполняет действие: ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент)
//
// Параметры:
// СсылкаНаДокумент - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент) Экспорт
Возврат Метаданные.НайтиПоТипу(ТипЗнч(СсылкаНаДокумент)).Имя;
КонецФункции // ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент)
// Процедура выполняет действие:
// Получить Массив Предопределенных Доп Полей
//
// Параметры:
// ТипДокументаИлиСсылка - Произвольный
//
// Возвращаемое значение:
// Произвольный
функция ПолучитьМассивПредопределенныхДопПолей(ТипДокументаИлиСсылка)Экспорт
УстановитьПривилегированныйРежим(Истина);
Если ТипЗнч(ТипДокументаИлиСсылка) = Тип("Строка") Тогда
ТипДОкумента = ТипДокументаИлиСсылка;
Иначе
ТипДОкумента = Метаданные.НайтиПоТипу(ТипЗнч(ТипДокументаИлиСсылка)).Имя;
КонецЕсли;
Запрос = Новый Запрос();
Запрос.Текст = " ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДопПоля.Ссылка
| ИЗ
| ПланВидовХарактеристик.ДополнительныеПоля КАК ДопПоля
| ГДЕ
| ДопПоля.%1 = ИСТИНА ";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "%1", ТипДОкумента);
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
// Работа с Документом инцидент
// процедура выполняет действие: ПересчептКрайнегоСрокаПриПрограммномИзмененииСостоянияДокумента
//
// Параметры:
// ДокументОбъект - Произвольный
Процедура ПересчетКрайнегоСрокаПриПрограммномИзмененииСостоянияДокумента(ДокументОбъект) Экспорт
Объект = ДокументОбъект;
СсылкаНаДокумент = Объект.Ссылка;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", ЧасовыеПоясаСервер.ТекущееВремяИБ());
Запрос.УстановитьПараметр("Документ",СсылкаНаДокумент );
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| КрайнийСрокСрезПоследних.ИспользуемыйДокумент КАК Документ,
| КрайнийСрокСрезПоследних.КрайнийСрок,
| КрайнийСрокСрезПоследних.ВведенПользователем,
| КрайнийСрокСрезПоследних.ПересчитыватьУстановленныйВручную
| ПОМЕСТИТЬ ТаблКрСроки
| ИЗ
| РегистрСведений.ИТ_КрайнийСрок.СрезПоследних(&Дата, ИспользуемыйДокумент = &Документ) КАК КрайнийСрокСрезПоследних
|
| УПОРЯДОЧИТЬ ПО
| КрайнийСрокСрезПоследних.Период УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| Инцидент.НормативнаяДатаЗакрытия,
| КрайнийСрокСрезПоследних.КрайнийСрок,
| КрайнийСрокСрезПоследних.ВведенПользователем,
| КрайнийСрокСрезПоследних.ПересчитыватьУстановленныйВручную
| ИЗ
| Документ.Инцидент КАК Инцидент
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблКрСроки КАК КрайнийСрокСрезПоследних
| ПО Инцидент.Ссылка = КрайнийСрокСрезПоследних.Документ
| ГДЕ
| Инцидент.Ссылка = &Документ";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПредыдущийКрСрок = ?(Выборка.КрайнийСрок = Null, Неопределено,Выборка.КрайнийСрок);
ВведенПользователем = ?(Выборка.ВведенПользователем = Null, Ложь, Выборка.ВведенПользователем);
Иначе
ПредыдущийКрСрок = Неопределено;
ВведенПользователем = Ложь;
КонецЕсли;
ПредыдущееСостояние = упрПолучениеЗначений.ПолучитьРеквизит(СсылкаНаДокумент,"Состояние");
НеОбновлятьЗначения = ПредыдущееСостояние <> Неопределено И Объект.Состояние.НеУчитыватьПриРасчетеВремениВыполнения =
ПредыдущееСостояние.НеУчитыватьПриРасчетеВремениВыполнения;
Объект.НормативнаяДатаВведенаПользователем = ВведенПользователем;
Если ПредыдущийКрСрок <> Неопределено И ПредыдущееСостояние <> Неопределено
И Объект.НормативнаяДатаЗакрытия <> ПредыдущийКрСрок
И Объект.Состояние.НеУчитыватьПриРасчетеВремениВыполнения = ЛОЖЬ
И ПредыдущееСостояние.НеУчитыватьПриРасчетеВремениВыполнения = ИСТИНА
И ВведенПользователем Тогда
Если Выборка.ПересчитыватьУстановленныйВручную = Истина Тогда
ПараметрыУслуги = ПолучениеЗначенийСервер.ПолучитьПараметрыУслуги(Объект.Дата, Объект.Клиент, Объект.КомпонентаУслуги);
Если Не ЗначениеЗаполнено(ПараметрыУслуги.КодОшибки) Тогда
Объект.НормативнаяДатаЗакрытия = ИТ_ОбщиеФункцииФормДокументовСервер.ПолучитьНовыйКрайнийСрокПоВремениПростоя(Объект.Ссылка, ПредыдущийКрСрок, ПараметрыУслуги);
Иначе
Объект.НормативнаяДатаЗакрытия = ПредыдущийКрСрок;
КонецЕсли;
Иначе
Объект.НормативнаяДатаЗакрытия = ПредыдущийКрСрок;
КонецЕсли;
// Объект.НормативнаяДатаЗакрытия = ПредыдущийКрСрок;
Иначе
НеОбновлять = ПредыдущееСостояние <> Неопределено И ПредыдущееСостояние <> Справочники.СостоянияИнцидентов.ПустаяСсылка() И Объект.Состояние.НеУчитыватьПриРасчетеВремениВыполнения = ПредыдущееСостояние.НеУчитыватьПриРасчетеВремениВыполнения;
Если не Объект.КомпонентаУслуги.Пустая() Тогда
ВыбранноеЗначение = Объект.КомпонентаУслуги;
ПараметрыУслуги = ПолучениеЗначенийСервер.ПолучитьПараметрыУслуги(Объект.Дата, Объект.Клиент, ВыбранноеЗначение);
Если ПустаяСтрока(ПараметрыУслуги.КодОшибки) ТОгда
СтруктураДополнительныхПараметров = Неопределено;
Если Не Объект.Состояние = Объект.Ссылка.Состояние Тогда
СтруктураДополнительныхПараметров = Новый Структура("Состояние", Объект.Состояние);
КонецЕсли;
ЧасовойПоясИБ = ИТ_ГлобальныйМодульСервер.ИТ_глЗначениеПеременной("глЧасовойПоясБазы");
ДатаНачалаОказанияУслуг = Объект.Дата + ЧасовыеПоясаСервер.РассчитатьСмещениеМеждуЧасовымиПоясами(ПараметрыУслуги.ЧасовойПояс,ЧасовойПоясИБ);
// ДатаНачалаОказанияУслуг время в часовом поясе услуги
РезультатНормативнаяДатаЗакрытия = ИТ_ОбщийЗакрытый.оз_ФункцияРасчетаПараметров10( ДатаНачалаОказанияУслуг,
ПараметрыУслуги.ВремяОказанияУслуги,
ПараметрыУслуги.УровеньСервиса,
Объект.Ссылка,
,
Объект.Приоритет,
СтруктураДополнительныхПараметров );
Если НЕ ПустаяСтрока(РезультатНормативнаяДатаЗакрытия.КодОшибки) Тогда
Объект.НормативнаяДатаЗакрытия = '00010101';
Иначе
Если Не НеОбновлять Тогда
Если ЗначениеЗаполнено(РезультатНормативнаяДатаЗакрытия.НормативнаяДатаЗакрытия) Тогда
Объект.НормативнаяДатаЗакрытия = РезультатНормативнаяДатаЗакрытия.НормативнаяДатаЗакрытия +
ЧасовыеПоясаСервер.РассчитатьСмещениеМеждуЧасовымиПоясами(ЧасовойПоясИБ,ПараметрыУслуги.ЧасовойПояс);
Иначе
Объект.НормативнаяДатаЗакрытия = '00010101';
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Объект.НормативнаяДатаЗакрытия = '00010101';
КонецЕсли;
Иначе
Объект.НормативнаяДатаЗакрытия = '00010101';
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПересчептКрайнегоСрокаПриПрограммномИзмененииСостоянияДокумента
// Функция выполняет действие:
//
// Параметры:
// СписокСотрудников - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСостоянияСотрудников(СписокСотрудников) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Сотрудники.Ссылка,
| ВЫБОР
| КОГДА Сотрудники.ЭтоГруппа
| ТОГДА """"
| КОГДА ЕСТЬNULL(ОтсутствияСотрудников.ПричинаОтсутствия, """") = """"
| ТОГДА ВЫБОР
| КОГДА Сотрудники.График = ЗНАЧЕНИЕ(Справочник.ГрафикРабот.ПустаяСсылка)
| ТОГДА """"
| ИНАЧЕ ВЫБОР
| КОГДА ЕСТЬNULL(ГрафикРаботы.Сотрудник, """") = """"
| ТОГДА ""Отсутствует ПО графику""
| ИНАЧЕ ""Присутствует""
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ОтсутствияСотрудников.ПричинаОтсутствия
| КОНЕЦ КАК ТекущееСостояние
| ИЗ
| Справочник.Сотрудники КАК Сотрудники
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО Сотрудники.ФизЛицо = Пользователи.ФизЛицо
| И (Сотрудники.ФизЛицо <> ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка))
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
| ПО (НастройкиПользователей.Пользователь = Пользователи.Ссылка)
| И (НастройкиПользователей.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.ИТ_ЧасовойПояс))
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИТ_ЧасовыеПояса КАК ТабЧасовыеПояса
| ПО (НастройкиПользователей.Значение = ТабЧасовыеПояса.Ссылка)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтсутствияСотрудников КАК ОтсутствияСотрудников
| ПО (ОтсутствияСотрудников.Сотрудник = Сотрудники.Ссылка)
// | И (ДОБАВИТЬКДАТЕ(ОтсутствияСотрудников.ДатаНачала, ЧАС, ЕСТЬNULL(ТабЧасовыеПояса.Смещение, 0)) <= &ТекущаяДа
// та)
// | И (ДОБАВИТЬКДАТЕ(ОтсутствияСотрудников.ДатаОкончания, ЧАС, ЕСТЬNULL(ТабЧасовыеПояса.Смещение, 0)) >= &Текуща
// яДата)
| И ОтсутствияСотрудников.ДатаНачала <= &ТекущаяДата
| И ОтсутствияСотрудников.ДатаОкончания >= &ТекущаяДата
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботы КАК ГрафикРаботы
| ПО (ГрафикРаботы.Сотрудник = Сотрудники.Ссылка)
// | И ГрафикРаботы.ДатаНачала <= &ТекущаяДата
// | И ГрафикРаботы.ДатаОкончания >= &ТекущаяДата
| И (ДОБАВИТЬКДАТЕ(ГрафикРаботы.ДатаНачала, ЧАС, &СмещениеИБ - ЕСТЬNULL(ТабЧасовыеПояса.Смещение, &СмещениеИБ)) <= &ТекущаяДата)
| И (ДОБАВИТЬКДАТЕ(ГрафикРаботы.ДатаОкончания, ЧАС, &СмещениеИБ - ЕСТЬNULL(ТабЧасовыеПояса.Смещение, &СмещениеИБ)) >= &ТекущаяДата)
| ГДЕ
| Сотрудники.Ссылка В(&Список)";
Запрос.УстановитьПараметр( "Список" , СписокСотрудников);
Запрос.УстановитьПараметр( "ТекущаяДата" , ЧасовыеПоясаСервер.ТекущееВремяИБ());
СмещениеИБ = упрПолучениеЗначений.ПолучитьРеквизит(ИТ_ГлобальныйМодульСервер.ИТ_глЗначениеПеременной("глЧасовойПоясБазы"),"Смещение");
Запрос.УстановитьПараметр( "СмещениеИБ",?(СмещениеИБ = Неопределено, 0, СмещениеИБ));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Соот = Новый Соответствие;
Пока Выборка.Следующий() Цикл
Соот.Вставить(Выборка.Ссылка, Выборка.ТекущееСостояние);
КонецЦикла;
Возврат Соот;
КонецФункции //
// Процедура обработчик события: УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников()
//
// Параметры:
// ЭтаФорма - Произвольный
Процедура УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников(ЭтаФорма) Экспорт
Если ЭтаФорма.ИмяФормы = "Документ.Инцидент.Форма.ФормаДокументаГоризонт43"
ИЛИ ЭтаФорма.ИмяФормы = "Документ.Инцидент.Форма.ФормаДокументаРед43"
ИЛИ ЭтаФорма.ИмяФормы = "Документ.Инцидент.Форма.ФормаСвязанныхДокументов"
ИЛИ ЭтаФорма.ИмяФормы = "Документ.Наряд.Форма.ФормаУправляемая43" Тогда
СписокЭлементов = Новый СписокЗначений;
СтруктураСписков = Новый Структура();
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "ДеревоДокументов", "Документ",СписокЭлементов, СтруктураСписков );
ТаблицаЦветовСотрудников = ФормированиеВыводаСервер.ПолучитьТаблицуСотрудниковСЦветамиПоСостоянию(СписокЭлементов);
СостоянияСотрудников = ПолучитьСостоянияСотрудников(СписокЭлементов);
// ЗаполнитьСостояние(ЭтаФОрма.ДеревоДокументов,"Документ" ,СостоянияСотрудников);
ЗаполнитьСостояние(ЭтаФОрма.ДеревоДокументов, "Документ", СостоянияСотрудников, СтруктураСписков["ДеревоДокументов"]);
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицаЦветовСотрудников, СтруктураСписков[ "ДеревоДокументов" ], ЭтаФОрма, "ДеревоДокументов.Документ", "ДеревоДокументовОтветственный","ДеревоДокументовОтветственный" );
Возврат;
КонецЕсли;
СписокЭлементов = Новый СписокЗначений;
СтруктураСписков = Новый Структура();
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзНаряды", "Наряд",СписокЭлементов, СтруктураСписков );
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзИзменения", "Изменение", СписокЭлементов, СтруктураСписков );
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзСобытия", "Событие",СписокЭлементов, СтруктураСписков );
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзПроблемы", "Проблема",СписокЭлементов, СтруктураСписков );
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзИнциденты", "Инцидент", СписокЭлементов, СтруктураСписков );
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзРелизы", "Релиз",СписокЭлементов, СтруктураСписков );
Если ЭтаФОрма.Элементы.Найти("тзИнцидентыОсновные") <> Неопределено Тогда
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзИнцидентыОсновные", "Инцидент", СписокЭлементов, СтруктураСписков, "тзИнциденты" );
КонецЕсли;
Если ЭтаФОрма.Элементы.Найти("тзИзмененияОсновные") <> Неопределено Тогда
ДополнитьСписокЭлементамиИзТаблицы(ЭтаФорма, "тзИзмененияОсновные", "Изменение", СписокЭлементов, СтруктураСписков, "тзИзменения" );
КонецЕсли;
ТаблицацветовСотрудников = ФормированиеВыводаСервер.ПолучитьТаблицуСотрудниковСЦветамиПоСостоянию(СписокЭлементов);
СостоянияСотрудников = ПолучитьСостоянияСотрудников(СписокЭлементов);
// ЗаполнитьСостояние(ЭтаФОрма.ТзНаряды,"Наряд" ,СостоянияСотрудников);
// ЗаполнитьСостояние(ЭтаФОрма.тзИзменения, "Изменение", СостоянияСотрудников);
// ЗаполнитьСостояние(ЭтаФОрма.тзСобытия, "Событие", СостоянияСотрудников);
// ЗаполнитьСостояние(ЭтаФОрма.тзПроблемы, "Проблема", СостоянияСотрудников);
// ЗаполнитьСостояние(ЭтаФОрма.тзИнциденты, "Инцидент", СостоянияСотрудников);
// ЗаполнитьСостояние(ЭтаФОрма.тзРелизы, "Релиз", СостоянияСотрудников);
ЗаполнитьСостояние(ЭтаФОрма.ТзНаряды, "Наряд", СостоянияСотрудников, СтруктураСписков["тзНаряды"]);
ЗаполнитьСостояние(ЭтаФОрма.тзИзменения, "Изменение", СостоянияСотрудников, СтруктураСписков["тзИзменения"]);
ЗаполнитьСостояние(ЭтаФОрма.тзСобытия, "Событие", СостоянияСотрудников, СтруктураСписков["тзСобытия"]);
ЗаполнитьСостояние(ЭтаФОрма.тзПроблемы, "Проблема", СостоянияСотрудников, СтруктураСписков["тзПроблемы"]);
ЗаполнитьСостояние(ЭтаФОрма.тзИнциденты, "Инцидент", СостоянияСотрудников, СтруктураСписков["тзИнциденты"]);
ЗаполнитьСостояние(ЭтаФОрма.тзРелизы, "Релиз", СостоянияСотрудников, СтруктураСписков["тзРелизы"]);
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "ТзНаряды" ], ЭтаФОрма, "ТзНаряды.Наряд", "ТЗНарядыНарядОтветственный","ТЗНарядыОтветственный" );
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзИзменения" ], ЭтаФОрма, "тзИзменения.Изменение", "тзИзмененияИзменениеОтветственный","тзИзмененияОтветственный");
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзСобытия" ], ЭтаФОрма, "тзСобытия.Событие", "тзСобытияСобытиеОтветственный", "тзСобытияОтветственный");
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзПроблемы" ], ЭтаФОрма, "тзПроблемы.Проблема", "тзПроблемыПроблемаОтветственный","тзПроблемыОтветственный");
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзИнциденты" ], ЭтаФОрма, "тзИнциденты.Инцидент", "тзИнцидентыИнцидентОтветственный", "тзИнцидентыОтветственный");
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзРелизы" ], ЭтаФОрма, "тзРелизы.Релиз", "тзРелизыРелизОтветственный", "тзРелизыОтветственный");
Если ЭтаФОрма.Элементы.Найти("тзИнцидентыОсновные") <> Неопределено Тогда
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзИнцидентыОсновные" ], ЭтаФОрма, "тзИнциденты.Инцидент", "ТзИнцидентыОсновныеИнцидентОтветственный", "ТзИнцидентыОсновныеИнцидентОтветственный");
КонецЕсли;
Если ЭтаФОрма.Элементы.Найти("тзИзмененияОсновные") <> Неопределено Тогда
ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицацветовСотрудников, СтруктураСписков[ "тзИзмененияОсновные" ], ЭтаФОрма, "тзИзменения.Изменение", "ТЗИзмененияОсновныеИзменениеОтветственный","ТЗИзмененияОсновныеИзменениеОтветственный");
КонецЕсли;
КонецПроцедуры // УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников()
// Функция выполняет действие:
// Установить Условное Оформление Таблиц Документа Дерево
//
// Параметры:
// ЭтаФорма - Произвольный
// Объект - Произвольный
Процедура УстановитьУсловноеОформлениеТаблицДокументаДерево(ЭтаФорма, Объект) Экспорт
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "ДеревоДокументов.Документ", "ДеревоДокументов", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИТ_ОбщегоНазначенияСерверПовтИсп.ПолучитьСтрокуЗапланированоСозданиеНаряда(), "ДеревоДокументов.Документ", "ДеревоДокументов", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "ДеревоДокументов.ПометкаУдаления", "ДеревоДокументов", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("ДеревоДокументов.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("ДеревоДокументов.Документ", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФОрма, "ДеревоДокументов", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
КонецПроцедуры
// Процедура выполняет действие: УстановитьУсловноеОформлениеТаблицДокумента(ЭтаФорма, Объект)
//
// Параметры:
// ЭтаФорма - Произвольный
// Объект - Произвольный
Процедура УстановитьУсловноеОформлениеТаблицДокумента(ЭтаФорма, Объект) Экспорт
УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников(ЭтаФОрма);
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "ТзНаряды.Наряд", "тзНаряды", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "тзИзменения.Изменение", "тзИзменения", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "тзСобытия.Событие", "тзСобытия", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "тзПроблемы.Проблема", "тзПроблемы", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "тзИнциденты.Инцидент", "тзИнциденты", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "тзРелизы.Релиз", "тзРелизы", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА , ЛОЖЬ, ЛОЖЬ, ЛОЖЬ ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "ТзНаряды.ПометкаУдаления", "тзНаряды", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "тзИзменения.ПометкаУдаления", "тзИзменения", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "тзСобытия.ПометкаУдаления", "тзСобытия", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "тзПроблемы.ПометкаУдаления", "тзПроблемы", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "тзИнциденты.ПометкаУдаления", "тзИнциденты", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "тзРелизы.ПометкаУдаления", "тзРелизы", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("ТзНаряды.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("ТзНаряды.Наряд", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, "тзНаряды", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("тзИзменения.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("тзИзменения.Изменение", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, "тзИзменения", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("тзСобытия.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("тзСобытия.Событие", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, "тзСобытия", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("тзПроблемы.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("тзПроблемы.Проблема", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, "тзПроблемы", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("тзИнциденты.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("тзИнциденты.Инцидент", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, "тзИнциденты", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
СоответствиеДляОтборов = Новый Соответствие;
СоответствиеДляОтборов.Вставить("тзРелизы.ПометкаУдаления", ИСТИНА );
СоответствиеДляОтборов.Вставить("тзРелизы.Релиз", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, "тзРелизы", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ, ЛОЖЬ , ИСТИНА ));
// Если Объект.Свойство("ДокОснование") Тогда
//
// ДобавитьЭлементУсловногоОформления(ЭтаФОрма, "Объект.ДокОснование", "ТзНаряды.Наряд", "тзНаряды", ИСТИНА );
// ДобавитьЭлементУсловногоОформления(ЭтаФОрма, "Объект.ДокОснование", "тзИзменения.Изменение", "тзИзменения", ИСТИНА
// );
// ДобавитьЭлементУсловногоОформления(ЭтаФОрма, "Объект.ДокОснование", "тзСобытия.Событие", "тзСобытия", ИСТИНА );
// ДобавитьЭлементУсловногоОформления(ЭтаФОрма, "Объект.ДокОснование", "тзПроблемы.Проблема", "тзПроблемы", ИСТИНА );
// ДобавитьЭлементУсловногоОформления(ЭтаФОрма, "Объект.ДокОснование", "тзИнциденты.Инцидент", "тзИнциденты", ИСТИНА )
// ;
// ДобавитьЭлементУсловногоОформления(ЭтаФОрма, "Объект.ДокОснование", "тзРелизы.Релиз", "тзРелизы", ИСТИНА );
//
// КонецЕсли;
КонецПроцедуры // УстановитьУсловноеОформлениеТаблицДокумента(ЭтаФорма, Объект)
// Функция выполняет действие:
//
// Возвращаемое значение:
// Произвольный
Функция ЭтоПотребительУслуг() Экспорт
Если РольДоступна(Метаданные.РОли.ПотребительУслуг) или
РольДоступна(Метаданные.роли.ПотребительУслугКуратор)Тогда
Возврат ИСтина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции //
// Процедура выполняет действие:
// Это Демо Версия
//
// Возвращаемое значение:
// Произвольный
Функция ЭтоДемоВерсия() Экспорт
СпособЗащиты = ИТ_ОбщегоНазначения.ПолучитьЗначениеКонстанты("ИТ_СпособЗащитыКонфигурации");
Возврат ?(СпособЗащиты = Перечисления.ИТ_СпособыЗащитыКонфигурации.ДемоВерсия, Истина, Ложь);
КонецФункции
// Процедура выполняет действие:
// Получить Текст Для Отображения Адресованных Сообщений
//
// Параметры:
// Стр - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьТекстДляОтображенияАдресованныхСообщений(Стр) Экспорт
Если ИТ_ОбщегоНазначенияСерверПовтИсп.ПользовательПотребительУслугИлиКуратор() Тогда
Возврат "";
КонецЕсли;
ТекстHTML = "<FONT color=#536ac2 size=1>(Видимость: %1)</FONT>";
Текст = "";
Если Стр.ОтправитьИнициаторуИОповещаемым Тогда
Текст = "Инициатор, Оповещаемые лица";
КонецЕсли;
Если Стр.ОтправитьОператору Тогда
Текст = Текст + ?(ПустаяСтрока(Текст) = Истина,"",", ") + "Оператор";
КонецЕсли;
Если Стр.ОтправитьОтветственному Тогда
Текст = Текст + ?(ПустаяСтрока(Текст) = Истина,"",", ") + "Ответственный";
КонецЕсли;
Если ЗначениеЗаполнено(Стр.ОтправитьФизЛицу) Тогда
//
// // тут надо подумать
//
КонецЕсли;
ТекстHTML = СтрЗаменить(ТекстHTML,"%1", Текст);
Возврат ТекстHTML;
КонецФункции // ()
// Процедура выполняет действие:
// Сформировать Штрих Код
//
// Параметры:
// Код - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция СформироватьШтрихКод(Код) Экспорт
НеНашлиУникальный = Истина;
ТекКод = Код;
Сч = 0;
Пока НеНашлиУникальный Цикл
ТекКод = Формат(Число(ТекКод) + Сч, "ЧГ=");
Пока СтрДлина(ТекКод) < 10 Цикл
ТекКод = "0" + ТекКод;
КонецЦикла;
Штрихкод = "21" + ТекКод;
Штрихкод = Штрихкод + КонтрольныйСимволEAN(ШтрихКод, 13);
НеНашлиУникальный = Не ПроверитьУникальностьШтрихКода(ШтрихКод, Код);
Сч = Сч+1;
КонецЦикла;
Возврат Штрихкод;
КонецФункции
// Процедура выполняет действие:
// Контрольный Символ E A N
//
// Параметры:
// ШтрихКод - Произвольный
// Тип - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция КонтрольныйСимволEAN(ШтрихКод, Тип) Экспорт
Четн = 0;
Нечетн = 0;
КоличествоИтераций = ?(Тип = 13 ИЛИ Тип = 14, 6, 4);
Для Индекс = 1 По КоличествоИтераций Цикл
Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда
Иначе
Четн = Четн + Сред(ШтрихКод, 2 * Индекс, 1);
КонецЕсли;
Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1);
КонецЦикла;
Если Тип = 14 Тогда
Нечетн = Нечетн + Сред(ШтрихКод, 13, 1);
Нечетн = Нечетн * 3;
ИначеЕсли Тип = 13 Тогда
Четн = Четн * 3;
Иначе
Нечетн = Нечетн * 3;
КонецЕсли;
КонтЦифра = 10 - (Четн + Нечетн) % 10;
Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
КонецФункции // КонтрольныйСимволEAN()
// Процедура выполняет действие:
// Проверить Уникальность Штрих Кода
//
// Параметры:
// ШтрихКод - Произвольный
// Код - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПроверитьУникальностьШтрихКода(ШтрихКод, Код) Экспорт
Если Не ЗначениеЗаполнено(ШтрихКод) Тогда
Результат = Истина;
Иначе
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ШтрихКод", ШтрихКод);
Запрос.УстановитьПараметр("Код" , Код);
Запрос.Текст = "
| ВЫБРАТЬ ПЕРВЫЕ 1
| 1 КАК Результат
| ИЗ
| РегистрСведений.ИТ_Штрихкоды КАК Штрихкоды
| ГДЕ
| Штрихкоды.Код <> &Код
| И Штрихкоды.ШтрихКод = &ШтрихКод
|";
Результат = Запрос.Выполнить().Пустой();
КонецЕсли;
Возврат Результат;
КонецФункции // ПроверитьУникальностьШтрихКода()
// Функция проверяет назначенные пользователю роли
// если все роли вспомогательные - возвращает истину,
// если хотя бы одна роль самостоятельная - ложь
//
// Параметры:
// ТаблицаСписокРолей - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция НазначеныТолькоВспомогательныеРоли(ТаблицаСписокРолей) Экспорт
СписокСамостоятельныхРолей = ПолучитьСпискоСамостоятельныхРолей();
для Каждого СтрРоль Из ТаблицаСписокРолей Цикл
Если СписокСамостоятельныхРолей.НайтиПоЗначению(СтрРоль.Имя) <> Неопределено Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат истина;
КонецФункции
// Процедура выполняет действие:
// Получить Списко Самостоятельных Ролей
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСпискоСамостоятельныхРолей() Экспорт
СписокСамостоятельных = РазделитьСписокРолейНаСамостоятельныеИНесамостоятельные().СписокСамостоятельныхРолей;
СписокСамостоятельныхролей = новый СписокЗначений;
Для Каждого Роль Из СписокСамостоятельных Цикл
СписокСамостоятельныхролей.Добавить(Роль.Значение.Имя);
КонецЦикла;
Возврат СписокСамостоятельныхролей;
КонецФункции
// Процедура выполняет действие:
// Получить Списко Самостоятельных Ролей По Синонимам
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСпискоСамостоятельныхРолейПоСинонимам() Экспорт
СписокСамостоятельных = РазделитьСписокРолейНаСамостоятельныеИНесамостоятельные().СписокСамостоятельныхРолей;
СписокСамостоятельныхролей = новый СписокЗначений;
Для Каждого Роль Из СписокСамостоятельных Цикл
СписокСамостоятельныхролей.Добавить(Роль.Значение.Синоним);
КонецЦикла;
Возврат СписокСамостоятельныхролей;
КонецФункции
// Процедура выполняет действие:
// Разделить Список Ролей На Самостоятельные И Несамостоятельные
//
// Возвращаемое значение:
// Произвольный
Функция РазделитьСписокРолейНаСамостоятельныеИНесамостоятельные() Экспорт
СписокСамостоятельныхРолей = Новый СписокЗначений;
СписокНеСамостоятельныхРолей = Новый СписокЗначений;
ОсновныеРоли = ПолучитьСписокОсновныхРолей();
УстановитьПривилегированныйРежим(Истина);
Для Каждого Роль Из Метаданные.Роли Цикл
Если ОсновныеРоли.Найти(Роль)<> Неопределено Тогда
СписокСамостоятельныхРолей.Добавить(Роль);
Иначе
СписокНеСамостоятельныхРолей.Добавить(Роль);
Конецесли;
КонецЦикла;
Возврат Новый Структура ("СписокСамостоятельныхРолей,СписокНеСамостоятельныхРолей",СписокСамостоятельныхРолей,СписокНеСамостоятельныхРолей);
КонецФункции
Функция ПолучитьСписокОсновныхРолей()
ОсновныеРоли = Новый Массив;
ОсновныеРоли.Добавить(Метаданные.Роли.АналитикПроблем);
ОсновныеРоли.Добавить(Метаданные.Роли.ИнженерСервисДеск);
ОсновныеРоли.Добавить(Метаданные.Роли.ИнженерСервисДескОграничениемВидимости);
ОсновныеРоли.Добавить(Метаданные.Роли.ИТДиректор);
ОсновныеРоли.Добавить(Метаданные.Роли.ПолныеПрава);
ОсновныеРоли.Добавить(Метаданные.Роли.ПотребительУслуг);
ОсновныеРоли.Добавить(Метаданные.Роли.ПотребительУслугКуратор);
ОсновныеРоли.Добавить(Метаданные.Роли.СервисМенеджер);
ОсновныеРоли.Добавить(Метаданные.Роли.СотрудникСервисДеск);
ОсновныеРоли.Добавить(Метаданные.Роли.СотрудникСервисДескОграничениеВидимости);
ОсновныеРоли.Добавить(Метаданные.Роли.СпециалистПоАктивам);
ОсновныеРоли.Добавить(Метаданные.Роли.СпециалистПоУчетуКЕ);
Возврат ОсновныеРоли;
КонецФункции
// Функции для отчета Динамика обращений
//
// Параметры:
// ПериодДетализации - Произвольный
// Дата1 - Произвольный
// Дата2 - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьЧислоПериодовДетализацииВПериодеОтчета(ПериодДетализации, Дата1, Дата2) Экспорт
Если ПериодДетализации = "Год" Тогда
Возврат ПериодВГодах(Дата1, Дата2);
ИначеЕсли ПериодДетализации = "Квартал" Тогда
Возврат ПериодВКварталах(Дата1, Дата2);
ИначеЕсли ПериодДетализации = "Месяц" Тогда
Возврат ПериодВМесяцах(Дата1, Дата2);
ИначеЕсли ПериодДетализации = "Неделя" Тогда
Возврат ПериодВНеделях(Дата1, Дата2);
ИначеЕсли ПериодДетализации = "День" Тогда
Возврат ПериодВДнях(Дата1, Дата2);
КонецЕсли;
КонецФункции
// Процедура выполняет действие:
// Получить Список Контактных Лиц Авто Подбор
//
// Параметры:
// Текст - Произвольный
// Клиент - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьСписокКонтактныхЛицАвтоПодбор(Текст, Клиент) Экспорт
СписокКонтактныхЛиц = Новый СписокЗначений;
Запрос = Новый Запрос;
Запрос.Текст = " ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 50
| СправочникИТ_КонтактныеЛица.Ссылка КАК Ссылка,
| СправочникИТ_КонтактныеЛица.Ссылка.Наименование КАК СсылкаПредставление,
| СправочникИТ_КонтактныеЛица.Владелец.Наименование КАК ВладелецПредставление,
| СправочникИТ_КонтактныеЛица.Владелец КАК Владелец
| ИЗ
| Справочник.ИТ_КонтактныеЛица КАК СправочникИТ_КонтактныеЛица
| ГДЕ
| СправочникИТ_КонтактныеЛица.ПометкаУдаления = ЛОЖЬ
| И ЕСТЬNULL(СправочникИТ_КонтактныеЛица.Состояние.Используется, ИСТИНА) = ИСТИНА
| И СправочникИТ_КонтактныеЛица.Ссылка <> ЗНАЧЕНИЕ(Справочник.ИТ_ТипыИнцидентов.ПустаяСсылка)
| И СправочникИТ_КонтактныеЛица.Наименование ПОДОБНО ""%"" + &Наименование + ""%""
| И СправочникИТ_КонтактныеЛица.ЭтоГруппа = ЛОЖЬ";
Если ЗначениеЗаполнено(Клиент) тогда
Запрос.Текст = Запрос.Текст + " И СправочникИТ_КонтактныеЛица.Владелец = &Клиент ";
Запрос.УстановитьПараметр("Клиент",Клиент);
КонецЕсли;
Запрос.Текст = Запрос.Текст + " УПОРЯДОЧИТЬ ПО СсылкаПредставление";
Запрос.УстановитьПараметр("Наименование", Текст);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаПредставления = Выборка.СсылкаПредставление + " (" + Выборка.ВладелецПредставление + ")";
СписокКонтактныхЛиц.Добавить(Выборка.Ссылка,СтрокаПредставления);
КонецЦикла;
Возврат СписокКонтактныхЛиц;
КонецФункции
// Процедура выполняет действие:
// Доступна Роль
//
// Параметры:
// Наименование - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ДоступнаРоль(Наименование) Экспорт
Попытка
Возврат РольДоступна(Наименование);
Исключение
Возврат Ложь;
КонецПопытки
КонецФункции
// Процедура выполняет действие:
// Дата Находится В Графике Оказания Услуги
//
// Параметры:
// Дата - Произвольный
// КомпонентаУслуги - Произвольный
// Клиент - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ДатаНаходитсяВГрафикеОказанияУслуги(Дата, КомпонентаУслуги, Клиент) ЭКспорт
ПараметрыУслуги = ПолучениеЗначенийСервер.ПолучитьПараметрыУслуги(Дата, Клиент, КомпонентаУслуги);
Если ПараметрыУслуги.Свойство("КодОшибки") Тогда
Возврат Новый Структура("ВходитВГрафик", ЛОЖЬ );
КонецЕсли;
Если ПолучениеЗначенийСервер.ПолучитьКонецДняПоГрафику(ПараметрыУслуги.ВремяОказанияУслуги, Дата) < Дата Тогда
Возврат Новый Структура("ВходитВГрафик, НачалоСледующегоДня", ЛОЖЬ ,ПолучениеЗначенийСервер.ПолучитьНачалоДняПоГрафику(ПараметрыУслуги.ВремяОказанияУслуги, КонецДня(Дата) + 1 ));
Иначе
Возврат Новый Структура("ВходитВГрафик", ИСТИНА );
КонецЕсли;
КонецФункции
// Процедура выполняет действие:
// Получить Функциональную Опцию На Сервере
//
// Параметры:
// НазваниеОпции - Произвольный
//
// Возвращаемое значение:
// Произвольный
Функция ПолучитьФункциональнуюОпциюНаСервере(НазваниеОпции) Экспорт
Возврат ПолучитьФункциональнуюОпцию(НазваниеОпции);
КонецФункции
// Функция - Получить структуру функциональных опций на сервере
//
// Параметры:
// МассивОпций - Массив
//
// Возвращаемое значение:
// Структура
//
Функция ПолучитьСтруктуруФункциональныхОпцийНаСервере(МассивОпций) Экспорт
СтруктураОпций = Новый Структура;
Для Каждого Опция Из МассивОпций Цикл
СтруктураОпций.Вставить(Опция, ПолучитьФункциональнуюОпцию(Опция));
КонецЦикла;
Возврат СтруктураОпций;
КонецФункции
// Функция - Получить структуру функциональных опций с параметрами на сервере
//
// Параметры:
// МассивОпций - Массив
//
// Возвращаемое значение:
// Структура
//
Функция ПолучитьСтруктуруФункциональныхОпцийСПараметрамиНаСервере(МассивОпций) Экспорт
СтруктураОпций = Новый Структура;
Для Каждого Опция Из МассивОпций Цикл
ПараметрыОпции = Новый Структура;
Для Каждого Параметр Из Опция.Параметры Цикл
ПараметрыОпции.Вставить(Параметр.Ключ, ПолучитьФункциональнуюОпцию(Параметр.Значение));
КонецЦикла;
ЗначениеОпции = ПолучитьФункциональнуюОпцию(Опция.Название, ПараметрыОпции);
СтруктураОпций.Вставить(Опция.Название, ЗначениеОпции);
КонецЦикла;
Возврат СтруктураОпций;
КонецФункции
// Процедура - Записать параметры функциональных опций
//
Процедура ЗаписатьПараметрыФункциональныхОпций() Экспорт
ИспользоватьСистемуАктивов_2_0 = Константы.ИТ_ИспользоватьСистемуАктивов_2_0.Получить();
ИспользоватьПодсистемуУправлениеКонфигурациями = Константы.ИспользоватьПодсистему_УправлениеКонфигурациями.Получить();
МЗ = РегистрыСведений.ИспользованиеДокументовКЕ.СоздатьМенеджерЗаписи();
МЗ.ИспользоватьАктивы_2_0 = ИспользоватьСистемуАктивов_2_0;
МЗ.ИспользоватьКЕ = ИспользоватьПодсистемуУправлениеКонфигурациями;
МЗ.ИспользоватьДокументыКЕ = ИспользоватьСистемуАктивов_2_0 И ИспользоватьПодсистемуУправлениеКонфигурациями;
МЗ.Записать();
Использовать_Отчетность = Константы.ИспользоватьПодсистему_Отчетность.Получить();
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеЗнаниями", "ИспользоватьПодсистему_УправлениеЗнаниями"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеИзменениями", "ИспользоватьПодсистему_УправлениеИзменениями"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеИнцидентами", "ИспользоватьПодсистему_УправлениеИнцидентами"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеКонфигурациями", "ИспользоватьПодсистему_УправлениеКонфигурациями"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеПерсоналом", "ИспользоватьПодсистему_УправлениеПерсоналом"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеПроблемами", "ИспользоватьПодсистему_УправлениеПроблемами"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеРаботами", "ИспользоватьПодсистему_УправлениеРаботами"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеРелизами", "ИспользоватьПодсистему_УправлениеРелизами"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеСобытиями", "ИспользоватьПодсистему_УправлениеСобытиями"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УправлениеУслугами", "ИспользоватьПодсистему_УправлениеУслугами"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"МобильноеПриложение", "ИспользоватьПодсистему_МобильноеПриложение"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УпрощеннаяСистемаАктивов", "ИТ_ИспользоватьУпрощеннуюСхемуАктивов"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"БухгалтерскаяСистемаАктивов", "ИТ_ИспользоватьБухгалтерскуюСхемуАктивов"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УчетАктивов_2_0", "ИТ_ИспользоватьСистемуАктивов_2_0"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"КЕ", "ИспользоватьПодсистему_УправлениеКонфигурациями"));
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УчетАктивов_2_0", "ИТ_ИспользоватьСистемуАктивов_2_0"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"КЕ", "ИспользоватьПодсистему_УправлениеКонфигурациями"));
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"УпрощеннаяСистемаАктивов", "ИТ_ИспользоватьУпрощеннуюСхемуАктивов"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"КЕ", "ИспользоватьПодсистему_УправлениеКонфигурациями"));
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"БухгалтерскаяСистемаАктивов", "ИТ_ИспользоватьБухгалтерскуюСхемуАктивов"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"Метрики", "Использовать_Метрики"));
МассивПодсистем = Новый Массив;
МассивПодсистем.Добавить(Новый Структура("НазваниеПодсистемы, ИмяКонстанты",
"ВнешниеДоговоры", "Использовать_ВнешниеДоговоры"));
ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем);
КонецПроцедуры
Процедура ЗаписатьПараметрыФункциональнойОпцииВРегистр(Использовать_Отчетность, МассивПодсистем)
НазваниеПодсистемы = "";
Для Каждого Элемент Из МассивПодсистем Цикл
НазваниеПодсистемы = НазваниеПодсистемы + "_" + Элемент.НазваниеПодсистемы;
КонецЦикла;
МЗ = РегистрыСведений["ИспользоватьОтчеты" + НазваниеПодсистемы].СоздатьМенеджерЗаписи();
МЗ.Использовать_Отчетность = Использовать_Отчетность;
ИспользоватьВсеПодсистемы = Истина;
Для Каждого Элемент Из МассивПодсистем Цикл
ИспользоватьПодсистему = Константы[Элемент.ИмяКонстанты].Получить();
МЗ["Использовать_" + Элемент.НазваниеПодсистемы] = ИспользоватьПодсистему;
ИспользоватьВсеПодсистемы = ИспользоватьВсеПодсистемы И ИспользоватьПодсистему;
КонецЦикла;
МЗ["ИспользоватьОтчеты"] = Использовать_Отчетность И ИспользоватьВсеПодсистемы;
МЗ.Записать();
КонецПроцедуры
// Функция - Установить доступность функциональных опций
//
// Параметры:
// СделатьВсеОпцииНедоступными - Произвольный
// СделатьВсеРазрешенныеОпцииДоступными - Произвольный
// СтрокаАктивации - Произвольный
//
// Возвращаемое значение:
// Булево
//
Функция УстановитьДоступностьФункциональныхОпций(СделатьВсеОпцииНедоступными, СделатьВсеРазрешенныеОпцииДоступными, СтрокаАктивации = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
СписокЗапрещенныхОпций = Новый СписокЗначений;
Если СтрокаАктивации = Неопределено Тогда
Если НачалоДня(Константы.ИТ_ПериодАктивацииБлоковФункционала.Получить()) >= НачалоДня(ЧасовыеПоясаСервер.ТекущееВремяИБ()) Тогда
ИспользоватьДополнительныйКлюч = Истина;
СтрокаАктивации = Константы.ИТ_СтрокаАктивацииБлоковФункционалаДополнительная.Получить();
Иначе
ИспользоватьДополнительныйКлюч = Ложь;
СтрокаАктивации = Константы.ИТ_СтрокаАктивацииБлоковФункционалаОсновная.Получить();
КонецЕсли;
СтруктураОпций = ИТ_МобильноеПриложениеСервер.ВосстановитьСпискиФункциональныхОпцийИзХэша(СтрокаАктивации, ИспользоватьДополнительныйКлюч);
Иначе
Если СделатьВсеОпцииНедоступными = Истина ИЛИ СтрокаАктивации = "" Тогда
СписокЗапрещенныхОпций = ИТ_ОбщийЗакрытый.ПолучитьСпискиВключенныхИВыключенныхФункциональныхОпций().СписокВсехОпций;
СделатьВсеРазрешенныеОпцииДоступными = Ложь;
Иначе
ИспользоватьДополнительныйКлюч = Истина;
ДатаКлюча = ИТ_МобильноеПриложениеСервер.ВосстановитьДатуАктивацииБлоковФункционалаИзХэша(СтрокаАктивации);
Если ЗначениеЗаполнено(ДатаКлюча) Тогда
СтруктураОпций = ИТ_МобильноеПриложениеСервер.ВосстановитьСпискиФункциональныхОпцийИзХэша(СтрокаАктивации, ИспользоватьДополнительныйКлюч);
Константы.ИТ_СтрокаАктивацииБлоковФункционалаДополнительная.Установить(СтрокаАктивации);
Константы.ИТ_ПериодАктивацииБлоковФункционала.Установить(ДатаКлюча);
Иначе
ИспользоватьДополнительныйКлюч = Ложь;
СтруктураОпций = ИТ_МобильноеПриложениеСервер.ВосстановитьСпискиФункциональныхОпцийИзХэша(СтрокаАктивации, ИспользоватьДополнительныйКлюч);
Если СтруктураОпций.СписокРазрешенныхОпций.Количество() <> 0 Тогда
Константы.ИТ_СтрокаАктивацииБлоковФункционалаОсновная.Установить(СтрокаАктивации);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(СписокЗапрещенныхОпций) Тогда
СписокЗапрещенныхОпций = СтруктураОпций.СписокЗапрещенныхОпций;
КонецЕсли;
НеобходимоОбновитьИнтерфейс = Ложь;
Для Каждого Опция Из СписокЗапрещенныхОпций Цикл
ИмяКонстанты = Метаданные.ФункциональныеОпции.Найти(Опция).Хранение.Имя;
Если Константы[ИмяКонстанты].Получить() = Истина Тогда
НеобходимоОбновитьИнтерфейс = Истина;
Константы[ИмяКонстанты].Установить(Ложь);
Если ИмяКонстанты = "УчетАктивов" Тогда
Константы.ИТ_ИспользоватьСистемуАктивов_2_0.Установить(Ложь);
Константы.ИТ_ИспользоватьСистемуАктивов_1_0.Установить(Ложь);
Константы.ИТ_ИспользоватьУпрощеннуюСхемуАктивов.Установить(Ложь);
Константы.ИТ_ИспользоватьБухгалтерскуюСхемуАктивов.Установить(Ложь);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если СделатьВсеРазрешенныеОпцииДоступными = Истина Тогда
СписокРазрешенныхОпций = СтруктураОпций.СписокРазрешенныхОпций;
Для Каждого Опция Из СписокРазрешенныхОпций Цикл
ИмяКонстанты = Метаданные.ФункциональныеОпции.Найти(Опция).Хранение.Имя;
Если Константы[ИмяКонстанты].Получить() = Ложь Тогда
НеобходимоОбновитьИнтерфейс = Истина;
Константы[ИмяКонстанты].Установить(Истина);
Если ИмяКонстанты = "УчетАктивов" Тогда
Константы.ИТ_ИспользоватьСистемуАктивов_2_0.Установить(Истина);
Константы.ИТ_ИспользоватьСистемуАктивов_1_0.Установить(Ложь);
Константы.ИТ_ИспользоватьУпрощеннуюСхемуАктивов.Установить(Ложь);
Константы.ИТ_ИспользоватьБухгалтерскуюСхемуАктивов.Установить(Ложь);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Возврат НеобходимоОбновитьИнтерфейс;
КонецФункции
// Функция - Получить наименование ТЧ Доп полей по ссылке документа
//
// Параметры:
// Ссылка - Произвольный
//
// Возвращаемое значение:
// Строка
//
Функция ПолучитьНаименованиеТЧДопПолейПоСсылкеДокумента(Ссылка) Экспорт
Если ТипЗнч(Ссылка) = Тип("ДокументСсылка.Инцидент") ИЛИ ТипЗнч(Ссылка) = Тип("СправочникСсылка.ШаблоныИнцидентов") Тогда
Возврат "ДопПоляОбращений";
ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.Наряд") ИЛИ ТипЗнч(Ссылка) = Тип("СправочникСсылка.ИТ_ШаблоныНарядов") Тогда
Возврат "ДопПоляНарядов";
ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.Изменение") Тогда
Возврат "ДопПоляИзменений";
ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.Проблема") Тогда
Возврат "ДопПоляПроблем";
ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.ИТ_Событие") ИЛИ ТипЗнч(Ссылка) = Тип("СправочникСсылка.ШаблоныСобытий") Тогда
Возврат "ДопПоляСобытий";
ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.Релиз") Тогда
Возврат "ДопПоляРелизов";
КонецЕсли;
Возврат "";
КонецФункции
Процедура ЗаписатьОшибкуВЖурналРегистрации(ИмяСобытия) Экспорт
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПроцедуры
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ДобавитьКлиентаВДоговор(знач Клиент, знач Пользователь, знач Договор, знач МассивСтруктурДоговоров, ОтложитьПроведение) Экспорт
Попытка
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.Договор");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Договор);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ИТ_СтатусыПроведенияSLA");
ЭлементБлокировки.УстановитьЗначение("ИспользуемыйДокумент", Договор);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый Запрос;
Запрос.Текст =
" ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ИТ_СтатусыПроведенияSLA.Проведен,
| ИТ_СтатусыПроведенияSLA.ОписаниеОшибок
| ИЗ
| РегистрСведений.ИТ_СтатусыПроведенияSLA КАК ИТ_СтатусыПроведенияSLA
| ГДЕ
| ИТ_СтатусыПроведенияSLA.ИспользуемыйДокумент = &Документ";
Запрос.УстановитьПараметр( "Документ" , Договор);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ЛОЖЬ , "Не записаны данные в результат");
Если Выборка.Следующий() Тогда
Если Выборка.Проведен Тогда
// Добавить запись движений в регистры
// Проверить, есть ли дубли, если есть - то отказ
// Если нет дублей - то в режиме добавить в SLA
Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
Если ПустаяСтрока(Статус) Тогда
ЗаписатьСтатусНеобходимоПровести(Договор);
ЗафиксироватьТранзакцию();
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ИСТИНА , "");
Иначе
// Не смогли добавить в табличную часть
Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию();КонецЕсли;
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
КонецЕсли;
Иначе
Если ПустаяСтрока(Выборка.ОписаниеОшибок) Тогда
// Проверить, есть ли в табличной части
// Если есть - отказ
// Если нет - записать в табличную часть
Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
Если ПустаяСтрока(Статус) Тогда
ЗафиксироватьТранзакцию();
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ИСТИНА , " На данный момент выбранный договор ожидает проведения. ");
Иначе
Если ТранзакцияАктивна()Тогда ОтменитьТранзакцию();КонецЕсли;
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
КонецЕсли;
// Возврат Новый Структура("Статус, ТекстОшибки", "Ожидает проведения", );;
Иначе
// Проверить, есть ли в табличной части
// Если есть - отказ
// Если нет - записать в табличную часть
Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
Если ПустаяСтрока(Статус) Тогда
ЗафиксироватьТранзакцию();
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ИСТИНА , " На данный момент выбранный договор в состоянии ""Ошибка проведения"". ");
Иначе
Если ТранзакцияАктивна()Тогда ОтменитьТранзакцию();КонецЕсли;
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
КонецЕсли;
// Возврат Новый Структура("Статус, ТекстОшибки", "Ошибка проведения", Выборка.ОписаниеОшибок );
КонецЕсли;
КонецЕсли;
Иначе
// Такого быть не должно никак.
// Проверить, есть ли в табличной части
// Если есть - отказ
// Если нет - записать в табличную часть
Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
Если ПустаяСтрока(Статус) Тогда
ЗафиксироватьТранзакцию();
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ИСТИНА , " На данный момент выбранный договор не проведен. ");
Иначе
Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию();КонецЕсли;
СтруктураРезультата = Новый Структура("Статус, ТекстОшибки", ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
КонецЕсли;
// Возврат Новый Структура("Статус, ТекстОшибки", "Не проведен", "Документ не записан");
КонецЕсли;
Если ОтложитьПроведение Тогда
Если НЕ СтруктураРезультата.Статус Тогда
Возврат СтруктураРезультата;
Иначе
СтруктураРезультата.ТекстОшибки = СтруктураРезультата.ТекстОшибки + " Документ будет проведен фоновым заданием.";
Возврат СтруктураРезультата;
КонецЕсли;
Иначе
Если НЕ СтруктураРезультата.Статус Тогда
Возврат СтруктураРезультата;
Иначе
Массив = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Новый Структура("Метаданные", "ИТ_ОтложенноеПроведениеSLA"));
ТЗ = РегламентныеЗаданияСервер.ПолучитьТаблицуСвойствФоновыхЗаданий();
Если ТЗ = 0 Тогда // Нет фоновых заданий вообще, возможно стоит блокировка фоновых заданий, проводить надо принудительно онлайн
ИТ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю( "Проверьте, разрешен ли запуск регламентных заданий..." );
ОбработкаСобытий.ИТ_ФоновоеПроведениеSLA();
СтруктураРезультата.ТекстОшибки = СтруктураРезультата.ТекстОшибки + "Запущена процедура фонового проведения SLA";
Иначе
ИД = Массив[ 0 ].УникальныйИдентификатор;
ПроцедураУжевыполняется = Ложь;
ИДФонового = "";
Запуск = РегламентныеЗаданияСервер.ВыполнитьРегламентноеЗаданиеВручную(ИД, Неопределено, ИДФонового, Неопределено, Неопределено, Неопределено, Неопределено, ПроцедураУжевыполняется);
СтруктураРезультата.ТекстОшибки = СтруктураРезультата.ТекстОшибки + "Запущена процедура фонового проведения SLA";
КонецЕсли;
Возврат СтруктураРезультата;
КонецЕсли;
КонецЕсли;
Исключение
Ошибка = ОписаниеОшибки();
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
Возврат Новый Структура("Статус,ТекстОшибки", ЛОЖЬ , "Не удалось добавить клиента в SLA по причине: " + Ошибка );
КонецПопытки
КонецФункции
Процедура ЗаписатьСтатусНеобходимоПровести(Договор)
НаборСтатусыДляДоговоров = РегистрыСведений.ИТ_СтатусыПроведенияSLA.СоздатьНаборЗаписей();
НаборСтатусыДляДоговоров.Отбор.Регистратор.Установить(Договор);
НаборСтатусыДляДоговоров.Прочитать();
Если НаборСтатусыДляДоговоров.Количество() Тогда
НаборСтатусыДляДоговоров[0].Проведен = ЛОЖЬ;
НаборСтатусыДляДоговоров[0].ОписаниеОшибок = "";
НаборСтатусыДляДоговоров.Записать(Истина);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(знач Клиент, знач Пользователь, знач Договор, знач МассивСтруктурДоговоров)
Попытка
ОбъектБД = Договор.ПолучитьОбъект();
НоваяСтрока = ОбъектБД.Подразделения.Добавить();
НоваяСтрока.Клиент = Клиент;
НоваяСтрока.Пользователь = Пользователь;
ОбъектБД.мЗагрузкаДаных = Истина;
ОбъектБД.Записать();
ЕстьДоговоры = МассивСтруктурДоговоров.Количество();
Если ЕстьДоговоры Тогда
НаборСтатусыДляДоговоров = РегистрыСведений.ИТ_СтатусыПроведенияSLA.СоздатьНаборЗаписей();
НаборСтатусыДляДоговоров.Отбор.Регистратор.Установить(Договор);
НаборСтатусыДляДоговоров.Прочитать();
Если НаборСтатусыДляДоговоров.Количество() Тогда
СтрокаДоговоров = НаборСтатусыДляДоговоров.Получить(0).СлужебныеДанные;
Если ПустаяСтрока(СтрокаДоговоров) Тогда
ТаблицаДоговоров = ПолучитьТаблицуДоговоров();
Иначе
ТаблицаДоговоров = ЗначениеИзСтрокиВнутр(СтрокаДоговоров);
КонецЕсли;
Для каждого Структура Из МассивСтруктурДоговоров Цикл
Клиент = Структура.Клиент;
Договор = Структура.Договор;
Если ТаблицаДоговоров.НайтиСтроки(Новый Структура("Клиент, ДоговорКонтрагента",Клиент, Договор)).Количество() = 0 Тогда
НоваяСтрока = ТаблицаДоговоров.Добавить();
НоваяСтрока.Клиент = Клиент;
НоваяСтрока.ДоговорКонтрагента = Договор;
КонецЕсли;
КонецЦикла;
СтрокаДоговоров = ЗначениеВСтрокуВнутр(ТаблицаДоговоров);
НаборСтатусыДляДоговоров.Получить(0).СлужебныеДанные = СтрокаДоговоров;
НаборСтатусыДляДоговоров.Записать(Истина);
Иначе
// Ничего не делать. Такого быть не должно. При записи SLA сюда всегда добавляется запись.
КонецЕсли;
КонецЕсли;
Возврат "";
Исключение
Ошибка = ОписаниеОшибки();
Возврат Ошибка;
КонецПопытки;
КонецФункции
Функция ПолучитьТаблицуДоговоров()
ТаблицаДоговоров = Новый ТаблицаЗначений;
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Клиенты"));
ТаблицаДоговоров.Колонки.Добавить("Клиент",Новый ОписаниеТипов(МассивТипов));
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ДоговорыКонтрагентов"));
ТаблицаДоговоров.Колонки.Добавить("ДоговорКонтрагента",Новый ОписаниеТипов(МассивТипов));
Возврат ТаблицаДоговоров;
КонецФункции
Функция ПолучитьИерархиюКлиента(Клиент)
ТекПараметр = Клиент;
Массив = Новый Массив();
Пока ТипЗнч(ТекПараметр) = Тип("СправочникСсылка.Клиенты") И
НЕ ТекПараметр.Пустая() Цикл
Массив.Добавить(ТекПараметр);
ТекПараметр = ТекПараметр.Родитель;
КонецЦикла;
Возврат Массив;
КонецФункции
Функция СкопироватьМассив(Массив)
МассивРезультат = Новый Массив;
Для каждого ЭлементМассива Из Массив Цикл
МассивРезультат.Добавить(ЭлементМассива);
КонецЦикла;
Возврат МассивРезультат;
КонецФункции // ()
Функция СкопироватьЗначение(Значение)
Если ТипЗнч(Значение ) = Тип("Массив") Тогда
Возврат СкопироватьМассив(Значение);
ИначеЕсли ТипЗнч(Значение ) = Тип("СписокЗначений") ИЛИ
ТипЗнч(Значение ) = Тип("ТаблицаЗначений") ИЛИ
ТипЗнч(Значение ) = Тип("ДеревоЗначений") Тогда
Возврат Значение.Скопировать();
Иначе
Параметр = Значение;
Возврат Параметр;
КонецЕсли;
КонецФункции // ()
// Процедура обработчик события:
Процедура ДополнитьСписокЭлементамиИзТаблицы( ЭтаФорма, ИмяЭлементФормы, ИмяРеквизита, СписокЭлементов, СтруктураСписков, ИмяРеквизитаФормы = Неопределено)
Если ИмяРеквизитаФормы = Неопределено Тогда
ИмяРеквизитаФормы = ИмяЭлементФормы ;
КонецЕсли;
СтруктураСписков.Вставить(ИмяЭлементФормы, Новый Соответствие);
НайдТаблица = ЭтаФорма.Элементы.Найти(ИмяЭлементФормы) ;
Если НайдТаблица <> Неопределено Тогда
Коллекция = ЭтаФорма[ ИмяРеквизитаФормы ];
Если ТипЗнч(Коллекция) = Тип("ДанныеФормыДерево") Тогда
МассивСтрок = Новый Массив;
Для Каждого элемент из Коллекция.ПолучитьЭлементы() Цикл
Для Каждого элементДет из Элемент.ПолучитьЭлементы() Цикл
МассивСтрок.Добавить(элементДет);
КонецЦикла;
КонецЦикла;
Коллекция = МассивСтрок;
КонецЕсли;
Для Каждого ЭлементФормы из Коллекция Цикл // Не всегда но почти всегда так
Документ = ЭлементФормы[ ИмяРеквизита ];
Если ТипЗнч(Документ) = Тип("Неопределено") Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Документ) = Тип("Строка") ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Звонок") Тогда // Наряды последовательности
ДокументОтветственный = ЭлементФормы.Ответственный;
ИначеЕсли ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ВнутреннийЗаказ")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ВнешнийЗаказ")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ПоступлениеАктивов")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ПотреблениеАктивов")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ОприходованиеНаСклад")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ОприходованиеВЭксплуатацию")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_Комплектация")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ПеремещениеПоСкладам")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ПеремещениеПоСкладам")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ПеремещениеВЭксплуатации")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ПеремещениеНаСклад")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_СписаниеСоСклада")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_СписаниеИзЭксплуатации")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ИнвентаризацияСкладская")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ИТ_Активы_ИнвентаризацияВЭксплуатации") Тогда
ДокументОтветственный = ЭлементФормы.Ответственный;
ИначеЕсли ТипЗнч(Документ) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
Продолжить;
Иначе
// ///
УстановитьПривилегированныйРежим(Истина);
ДокументОтветственный = Документ.Ответственный;
УстановитьПривилегированныйРежим(Ложь);
// ///
КонецЕсли;
Если СписокЭлементов.НайтиПоЗначению(ДокументОтветственный) = Неопределено Тогда
СписокЭлементов.Добавить(ДокументОтветственный);
КонецЕсли;
Если СтруктураСписков[ ИмяЭлементФормы ].Получить(Документ) = Неопределено Тогда
СтруктураСписков[ ИмяЭлементФормы ].Вставить(Документ , ДокументОтветственный);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры // ДополнитьСписокЭлементамиИзТаблицы()
// Процедура обработчик события: ЗаполнитьСостояние
//
// Параметры:
// Таблица - ДанныеФормыКоллекция | ДанныеФормыДерево - Строки формы.
// ИмяРеквизита - Строка - Имя поля документа в строке формы.
// Соответствие - Соответствие - Состояния сотрудников.
// СоответствиеДокументовИОтветственных - Соответствие - Ответственные по документам.
// Процедура ЗаполнитьСостояние(Таблица, ИмяРеквизита, Соответствие)
Процедура ЗаполнитьСостояние(Таблица, ИмяРеквизита, Соответствие, СоответствиеДокументовИОтветственных)
Коллекция = Таблица;
Если ТипЗнч(Коллекция) = Тип("ДанныеФормыДерево") Тогда
МассивСтрок = Новый Массив;
Для Каждого элемент из Коллекция.ПолучитьЭлементы() Цикл
Для Каждого элементДет из Элемент.ПолучитьЭлементы() Цикл
МассивСтрок.Добавить(элементДет);
КонецЦикла;
КонецЦикла;
Коллекция = МассивСтрок;
КонецЕсли;
Для Каждого Элемент из Коллекция Цикл
Попытка
Если ТипЗнч(Элемент[ ИмяРеквизита ]) = Тип("Строка") Тогда // Последовательности нарядов
Элемент.СостояниеОтветственного = Соответствие.Получить(Элемент.Ответственный);
Иначе
// Элемент.СостояниеОтветственного = Соответствие.Получить(Элемент[ ИмяРеквизита ].Ответственный);
Ответственный = СоответствиеДокументовИОтветственных.Получить(Элемент[ИмяРеквизита]);
Элемент.СостояниеОтветственного = Соответствие.Получить(Ответственный);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка изменения состояния ответственного'"),
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецПроцедуры // ЗаполнитьСостояние()
// Процедура обработчик события: ДобавитьУсловноеОформление
Процедура ДобавитьУсловноеОформлениеПоОтветственнымПоСотояниям(ТаблицаЦветов, СтруктураЭлементов, ЭтаФорма, ПутьКДаннымОтбора, ПутьКОформляемымСтрокам, ПутьКОформляемымСтрокамЗапасной)
Для Каждого ОтветственныйКлючИЗначение из СтруктураЭлементов Цикл
Ответственный = ОтветственныйКлючИЗначение.Значение;
МассивСтрокСЦцетами = ТаблицаЦветов.НайтиСтроки(Новый Структура("Сотрудник", Ответственный));
Если МассивСтрокСЦцетами.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ЦветФона = МассивСтрокСЦцетами[ 0 ].ЦветФона;
ЦветФона = СтрЗаменить(ЦветФона, ",", Символы.ПС);
ЦветФона = Новый Цвет(СтрПолучитьСтроку(ЦветФона,1),СтрПолучитьСтроку(ЦветФона,2),СтрПолучитьСтроку(ЦветФона,3));
ЦветТекста = МассивСтрокСЦцетами[ 0 ].ЦветТекста;
ЦветТекста = СтрЗаменить(ЦветТекста, ",", Символы.ПС);
ЦветТекста = Новый Цвет(СтрПолучитьСтроку(ЦветТекста,1),СтрПолучитьСтроку(ЦветТекста,2),СтрПолучитьСтроку(ЦветТекста,3));
НовыйЭлементУсловногоОформления = Неопределено;
Для Каждого ЭлементУсловного из ЭтаФорма.УсловноеОформление.Элементы Цикл
Попытка
Если ЭлементУсловного.Отбор.Элементы.Количество() = 1 и
ЭлементУсловного.Отбор.Элементы[ 0 ].ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДаннымОтбора) и
ЭлементУсловного.Отбор.Элементы[ 0 ].ПравоеЗначение = ОтветственныйКлючИЗначение.Ключ и
ЭлементУсловного.Поля.Элементы.Количество() = 1 и
(ЭлементУсловного.Поля.Элементы[ 0 ].Поле = Новый ПолеКомпоновкиДанных(ПутьКОформляемымСтрокам) или
ЭлементУсловного.Поля.Элементы[ 0 ].Поле = Новый ПолеКомпоновкиДанных(ПутьКОформляемымСтрокамЗапасной))
Тогда
НовыйЭлементУсловногоОформления = ЭлементУсловного ;
Прервать;
КонецЕсли;
Исключение
// ЛевоЗначение и ПравоеЗначение могут не существовать
Ошибка = ОписаниеОшибки();
КонецПопытки;
КонецЦикла;
Если НовыйЭлементУсловногоОформления = Неопределено Тогда
НовыйЭлементУсловногоОформления = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
НовыйОтбор = НовыйЭлементУсловногоОформления.Отбор.Элементы.Добавить( Тип("ЭлементОтбораКомпоновкиДанных") );
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.Использование = Истина;
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДаннымОтбора);
НовыйОтбор.ПравоеЗначение = ОтветственныйКлючИЗначение.Ключ ;
НовоеПолеОформления = НовыйЭлементУсловногоОформления.Поля.Элементы.Добавить();
НовоеПолеОформления.Использование = Истина;
Если ЭтаФорма.Элементы.Найти(ПутьКОформляемымСтрокам) = Неопределено Тогда
НовоеПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПутьКОформляемымСтрокамЗапасной);
Иначе
НовоеПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПутьКОформляемымСтрокам);
КонецЕсли;
КонецЕсли;
НовыйЭлементУсловногоОформления.Использование = Истина;
Для каждого ЭлементОформления Из НовыйЭлементУсловногоОформления.Оформление.Элементы Цикл
Если ЦветФона <> ЦветТекста и ЭлементОформления.Параметр = Новый ПараметрКомпоновкиДанных("ЦветФона") Тогда
ЭлементОформления.Значение = ЦветФона;
ЭлементОформления.Использование = Истина;
КонецЕсли;
Если ЦветФона <> ЦветТекста и ЭлементОформления.Параметр = Новый ПараметрКомпоновкиДанных("ЦветТекста") Тогда
ЭлементОформления.Значение = ЦветТекста;
ЭлементОформления.Использование = Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры // ДобавитьУсловноеОформление()
// Процедура выполняет действие: ДобавитьЭлементУсловногоОформления
Процедура ДобавитьЭлементУсловногоОформления(ЭтаФорма, ПравоеЗначениеОтбора, ПутьКДаннымОтбора, ПутьКОформляемымСтрокам, ПараметрыШрифта, ДобавитьЦветВОформление = Ложь)
НовыйЭлементУсловногоОформления = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
НовыйЭлементУсловногоОформления.Использование = Истина;
Для каждого ЭлементОформления Из НовыйЭлементУсловногоОформления.Оформление.Элементы Цикл
Если ЭлементОформления.Параметр = Новый ПараметрКомпоновкиДанных("Шрифт") Тогда
ЭлементОформления.Значение = Новый Шрифт(ЭлементОформления.Значение,,, ПараметрыШрифта.Жирный, ПараметрыШрифта.Наклонный, ПараметрыШрифта.Подчеркнутый, ПараметрыШрифта.Зачеркнутый);
ЭлементОформления.Использование = Истина;
КонецЕсли;
Если ДобавитьЦветВОформление Тогда
Если ЭлементОформления.Параметр = Новый ПараметрКомпоновкиДанных("ЦветТекста") Тогда
ЭлементОформления.Значение = Новый Цвет(0,0,128);
ЭлементОформления.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НовыйОтбор = НовыйЭлементУсловногоОформления.Отбор.Элементы.Добавить( Тип("ЭлементОтбораКомпоновкиДанных") );
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.Использование = Истина;
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДаннымОтбора);
НовыйОтбор.ПравоеЗначение = ПравоеЗначениеОтбора;
НовоеПолеОформления = НовыйЭлементУсловногоОформления.Поля.Элементы.Добавить();
НовоеПолеОформления.Использование = Истина;
НовоеПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПутьКОформляемымСтрокам);
КонецПроцедуры // ДобавитьЭлементУсловногоОформления
// Процедура выполняет действие: ДобавитьЭлементУсловногоОформления
Процедура ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФорма, ПутьКОформляемымСтрокам, соотвОтборы, ПараметрыШрифта)
НовыйЭлементУсловногоОформления = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
НовыйЭлементУсловногоОформления.Использование = Истина;
Для каждого ЭлементОформления Из НовыйЭлементУсловногоОформления.Оформление.Элементы Цикл
Если ЭлементОформления.Параметр = Новый ПараметрКомпоновкиДанных("Шрифт") Тогда
ЭлементОформления.Значение = Новый Шрифт(ЭлементОформления.Значение,,, ПараметрыШрифта.Жирный, ПараметрыШрифта.Наклонный, ПараметрыШрифта.Подчеркнутый, ПараметрыШрифта.Зачеркнутый);
ЭлементОформления.Использование = Истина;
КонецЕсли;
КонецЦикла;
Для каждого ЭлементОтбора из соотвОтборы Цикл
НовыйОтбор = НовыйЭлементУсловногоОформления.Отбор.Элементы.Добавить( Тип("ЭлементОтбораКомпоновкиДанных") );
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.Использование = Истина;
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЭлементОтбора.Ключ);
НовыйОтбор.ПравоеЗначение = ЭлементОтбора.Значение;
КонецЦикла;
НовоеПолеОформления = НовыйЭлементУсловногоОформления.Поля.Элементы.Добавить();
НовоеПолеОформления.Использование = Истина;
НовоеПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПутьКОформляемымСтрокам);
КонецПроцедуры // ДобавитьЭлементУсловногоОформления
Функция ПериодВГодах(Дата1, Дата2)
Возврат Год(Дата2) - Год(Дата1) + 1;
КонецФункции
Функция ПериодВКварталах(Дата1, Дата2)
Квартал1 = Квартал(Дата1);
Квартал2 = Квартал(Дата2);
Если Год(Дата2) <> Год(Дата1) Тогда
ПолныхЛетМеждуДатами = Год(Дата2) - Год(Дата1) - 1;
КварталовПолныхЛет = ?(ПолныхЛетМеждуДатами > 0, ПолныхЛетМеждуДатами*4, 0);
Возврат (4-Квартал1+1) + (КварталовПолныхЛет) + Квартал2; // Кварталов в первом году + кварталов полных лет + кварталов в последнем году
Иначе
Возврат Квартал2 - Квартал1 + 1;
КонецЕсли;
КонецФункции
Функция ПериодВМесяцах(Дата1, Дата2)
Месяц1 = Месяц(Дата1);
Месяц2 = Месяц(Дата2);
Если Год(Дата2) <> Год(Дата1) Тогда
ПолныхЛетМеждуДатами = Год(Дата2) - Год(Дата1) - 1;
МесяцевПолныхЛет = ?(ПолныхЛетМеждуДатами > 0, ПолныхЛетМеждуДатами*12, 0);
Возврат (12-Месяц1+1) + (МесяцевПолныхЛет) + Месяц2; // Месяцев в первом году + Месяцев полных лет + Месяцев в последнем году
Иначе
Возврат Месяц2 - Месяц1 + 1;
КонецЕсли;
КонецФункции
Функция ПериодВДнях(Дата1, Дата2)
День1 = ДеньГода(Дата1);
День2 = ДеньГода(Дата2);
Год1 = Год(Дата1);
Год2 = Год(Дата2);
Если Год2 <> Год1 Тогда
ДнейПолныхЛет = ЧислоДнейПолныхЛет(Год1, Год2);
Возврат (ЧислоДнейВГоду(Год1)-День1+1) + (ДнейПолныхЛет) + День2; // Дней в первом году + Дней полных лет + Дней в последнем году
Иначе
Возврат День2 - День1 + 1;
КонецЕсли;
КонецФункции
Функция ПериодВНеделях(Дата1, Дата2)
ЧислоНедель = 0;
ЧастьНеделиУчтена = ЛОЖЬ;
Неделя1 = НеделяГода(Дата1);
Неделя2 = НеделяГода(Дата2);
Год1 = Год(Дата1);
Год2 = Год(Дата2);
Если Год2 <> Год1 Тогда
Для год = Год1 по Год2 Цикл
Если год = Год1 Тогда
ЧислоНедельВТекущемГоду = ЧислоНедельВГоду(год) - Неделя1 + 1;
ИначеЕсли год = Год2 Тогда
ЧислоНедельВТекущемГоду = Неделя2;
Иначе
ЧислоНедельВТекущемГоду = ЧислоНедельВГоду(год);
КонецЕсли;
ЧислоНедель = ЧислоНедель + ЧислоНедельВТекущемГоду + ?(ЧастьНеделиУчтена, -1, 0);
ЧастьНеделиУчтена = (ПоследнийДеньНеделиВГоду(год) <> 7);
КонецЦикла;
Возврат ЧислоНедель;
Иначе
Возврат Неделя2 - Неделя1 + 1;
КонецЕсли;
КонецФункции
Функция ЧислоДнейВГоду(Год)
Возврат ?(ГодВисокосный(Год), 366, 365);
КонецФункции
// Включая неполные
Функция ЧислоНедельВГоду(Год)
ПоследнийДень = Дата(СтрЗаменить(Строка(Год), " ", "")+"1231");
Возврат НеделяГода(ПоследнийДень);
КонецФункции
// Включая неполные
Функция ПоследнийДеньНеделиВГоду(Год)
ПоследнийДень = Дата(СтрЗаменить(Строка(Год), " ", "")+"1231");
Возврат ДеньНедели(ПоследнийДень);
КонецФункции
Функция ГодВисокосный(Год)
Возврат Остаток(Год, 400) = 0 ИЛИ (Остаток(Год, 4) = 0 И Остаток(Год, 100) <> 0);
КонецФункции
Функция Остаток(Делимое, Делитель)
Возврат Делимое - Цел(Делимое/Делитель)*Делитель;
КонецФункции
Функция ЧислоДнейПолныхЛет(Год1, Год2)
СуммаДней = 0;
Для год = Год1+1 по Год2-1 Цикл
СуммаДней = СуммаДней + ЧислоДнейВГоду(год);
КонецЦикла;
Возврат СуммаДней;
КонецФункции
Функция Квартал(Дата)
Возврат Месяц(КонецКвартала(Дата))/3;
КонецФункции
// Процедура выполняет действие:
// Проверить Версия Платформы Выше 8 3 1 3
//
// Возвращаемое значение:
// Произвольный
Функция ПроверитьВерсияПлатформыВыше8313() Экспорт
Информация = Новый СистемнаяИнформация;
Попытка
ВерсияПлатформы = Число(Сред(Информация.ВерсияПриложения, 3, 1));
Исключение
ВерсияПлатформы = 3;
КонецПопытки;
Попытка
РелизПлатформы = Число(Сред(Информация.ВерсияПриложения, 5, 2));
Исключение
РелизПлатформы = 9;
КонецПопытки;
Если ВерсияПлатформы > 3 ИЛИ (ВерсияПлатформы = 3 И РелизПлатформы > 13) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
#КонецОбласти