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