802 lines
49 KiB
Plaintext
802 lines
49 KiB
Plaintext
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
|
||
|
||
#Область ПрограммныйИнтерфейс
|
||
|
||
// Включает на данную дату как исключение из правила повторения.
|
||
//
|
||
Процедура ДобавитьИсключениеПовторения(ДатаИсключения, ЗаписьИсключения = Неопределено) Экспорт
|
||
|
||
// + АРТСАТЕРРА, Семейкин Д.С. Начало 19.01.2026
|
||
А = 1;
|
||
// - АРТСАТЕРРА, Семейкин Д.С. Конец
|
||
|
||
Если ТипЗаписи <> Перечисления.ТипЗаписиКалендаря.ПовторяющеесяСобытие Тогда
|
||
ВызватьИсключение НСтр("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 = 'Недопустимый вызов объекта на клиенте.'");
|
||
#КонецЕсли |