2_4_4_151
This commit is contained in:
1 parent
f275a43ce3
commit
3b3fa5fade
634 files changed
+30691
-15543
No files matched your search
@@ -3,7 +3,7 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Обработчики событий подсистем конфигурации.
|
||||
|
||||
// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске.
|
||||
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске.
|
||||
Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт
|
||||
|
||||
Параметры.Вставить("НастройкиНапоминаний",
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// См. ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента.
|
||||
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента.
|
||||
Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт
|
||||
|
||||
Параметры.Вставить("НастройкиНапоминаний",
|
||||
@@ -111,7 +111,7 @@
|
||||
// Возвращаемое значение:
|
||||
// Дата - дата и время следующего события по расписанию.
|
||||
//
|
||||
Функция ПолучитьБлижайшуюДатуСобытияПоРасписанию(Расписание, ПредыдущаяДата = '000101010000') Экспорт
|
||||
Функция ПолучитьБлижайшуюДатуСобытияПоРасписанию(Расписание, ПредыдущаяДата = '000101010000', ИскатьТолькоБудущиеДаты = Истина) Экспорт
|
||||
|
||||
Результат = Неопределено;
|
||||
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
|
||||
@@ -120,7 +120,9 @@
|
||||
Если Не ЗначениеЗаполнено(ДатаОтсчета) Тогда
|
||||
ДатаОтсчета = ТекущаяДатаСеанса;
|
||||
КонецЕсли;
|
||||
ДатаОтсчета = Макс(ДатаОтсчета, ТекущаяДатаСеанса);
|
||||
Если ИскатьТолькоБудущиеДаты Тогда
|
||||
ДатаОтсчета = Макс(ДатаОтсчета, ТекущаяДатаСеанса);
|
||||
КонецЕсли;
|
||||
|
||||
Календарь = ПолучитьКалендарьНаБудущее(365*4+1, ДатаОтсчета, Расписание.ДатаНачала, Расписание.ПериодПовтораДней, Расписание.ПериодНедель);
|
||||
|
||||
@@ -329,6 +331,126 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ГрафикСобытия(Расписание, НачалоПериода, КонецПериода)
|
||||
|
||||
Результат = Неопределено;
|
||||
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
|
||||
|
||||
ДатаОтсчета = НачалоПериода;
|
||||
|
||||
Календарь = ПолучитьКалендарьНаБудущее((НачалоДня(КонецПериода) - НачалоДня(НачалоПериода)) / (60*60*24) + 1,
|
||||
ДатаОтсчета, Расписание.ДатаНачала, Расписание.ПериодПовтораДней, Расписание.ПериодНедель);
|
||||
|
||||
ДниНедели = Расписание.ДниНедели;
|
||||
Если ДниНедели.Количество() = 0 Тогда
|
||||
ДниНедели = Новый Массив;
|
||||
Для День = 1 По 7 Цикл
|
||||
ДниНедели.Добавить(День);
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
Месяцы = Расписание.Месяцы;
|
||||
Если Месяцы.Количество() = 0 Тогда
|
||||
Месяцы = Новый Массив;
|
||||
Для Месяц = 1 По 12 Цикл
|
||||
Месяцы.Добавить(Месяц);
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
Запрос = Новый Запрос;
|
||||
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
|
||||
|
||||
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ Календарь ИЗ &Календарь КАК Календарь";
|
||||
Запрос.УстановитьПараметр("Календарь", Календарь);
|
||||
Запрос.Выполнить();
|
||||
|
||||
Запрос.УстановитьПараметр("ДатаНачала", Расписание.ДатаНачала);
|
||||
Запрос.УстановитьПараметр("ДатаКонца", Расписание.ДатаКонца);
|
||||
Запрос.УстановитьПараметр("ДниНедели", ДниНедели);
|
||||
Запрос.УстановитьПараметр("Месяцы", Месяцы);
|
||||
Запрос.УстановитьПараметр("ДеньВМесяце", Расписание.ДеньВМесяце);
|
||||
Запрос.УстановитьПараметр("ДеньНеделиВМесяце", Расписание.ДеньНеделиВМесяце);
|
||||
Запрос.УстановитьПараметр("ПериодПовтораДней", ?(Расписание.ПериодПовтораДней = 0,1,Расписание.ПериодПовтораДней));
|
||||
Запрос.УстановитьПараметр("ПериодНедель", ?(Расписание.ПериодНедель = 0,1,Расписание.ПериодНедель));
|
||||
|
||||
Запрос.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Календарь.Дата,
|
||||
| Календарь.НомерМесяца,
|
||||
| Календарь.НомерДняНеделиВМесяце,
|
||||
| Календарь.НомерДняНеделиСКонцаМесяца,
|
||||
| Календарь.НомерДняВМесяце,
|
||||
| Календарь.НомерДняВМесяцеСКонцаМесяца,
|
||||
| Календарь.НомерДняВНеделе,
|
||||
| Календарь.НомерДняВПериоде,
|
||||
| Календарь.НомерНеделиВПериоде
|
||||
|ИЗ
|
||||
| Календарь КАК Календарь
|
||||
|ГДЕ
|
||||
| ВЫБОР
|
||||
| КОГДА &ДатаНачала = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|
||||
| ТОГДА ИСТИНА
|
||||
| ИНАЧЕ Календарь.Дата >= &ДатаНачала
|
||||
| КОНЕЦ
|
||||
| И ВЫБОР
|
||||
| КОГДА &ДатаКонца = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|
||||
| ТОГДА ИСТИНА
|
||||
| ИНАЧЕ Календарь.Дата <= &ДатаКонца
|
||||
| КОНЕЦ
|
||||
| И Календарь.НомерДняВНеделе В(&ДниНедели)
|
||||
| И Календарь.НомерМесяца В(&Месяцы)
|
||||
| И ВЫБОР
|
||||
| КОГДА &ДеньВМесяце = 0
|
||||
| ТОГДА ИСТИНА
|
||||
| ИНАЧЕ ВЫБОР
|
||||
| КОГДА &ДеньВМесяце > 0
|
||||
| ТОГДА Календарь.НомерДняВМесяце = &ДеньВМесяце
|
||||
| ИНАЧЕ Календарь.НомерДняВМесяцеСКонцаМесяца = -&ДеньВМесяце
|
||||
| КОНЕЦ
|
||||
| КОНЕЦ
|
||||
| И ВЫБОР
|
||||
| КОГДА &ДеньНеделиВМесяце = 0
|
||||
| ТОГДА ИСТИНА
|
||||
| ИНАЧЕ ВЫБОР
|
||||
| КОГДА &ДеньНеделиВМесяце > 0
|
||||
| ТОГДА Календарь.НомерДняНеделиВМесяце = &ДеньНеделиВМесяце
|
||||
| ИНАЧЕ Календарь.НомерДняНеделиСКонцаМесяца = -&ДеньНеделиВМесяце
|
||||
| КОНЕЦ
|
||||
| КОНЕЦ
|
||||
| И Календарь.НомерДняВПериоде = &ПериодПовтораДней
|
||||
| И Календарь.НомерНеделиВПериоде = &ПериодНедель";
|
||||
|
||||
Выборка = Запрос.Выполнить().Выбрать();
|
||||
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
БлижайшаяДата = Выборка.Дата;
|
||||
ВремяОтсчета = '00010101';
|
||||
Если НачалоДня(БлижайшаяДата) = НачалоДня(ДатаОтсчета) Тогда
|
||||
ВремяОтсчета = ВремяОтсчета + (ДатаОтсчета-НачалоДня(ДатаОтсчета));
|
||||
КонецЕсли;
|
||||
|
||||
ДатаИВремя = Неопределено;
|
||||
БлижайшееВремя = ПолучитьБлижайшееВремяИзРасписания(Расписание, ВремяОтсчета);
|
||||
Если БлижайшееВремя <> Неопределено Тогда
|
||||
ДатаИВремя = БлижайшаяДата + (БлижайшееВремя - '00010101');
|
||||
Иначе
|
||||
Если Выборка.Следующий() Тогда
|
||||
Время = ПолучитьБлижайшееВремяИзРасписания(Расписание);
|
||||
ДатаИВремя = Выборка.Дата + (Время - '00010101');
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(ДатаИВремя) И ДатаИВремя <= КонецПериода Тогда
|
||||
Результат.Добавить(ДатаИВремя);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Возвращает интервал времени в минутах, через который необходимо повторять проверку текущих напоминаний.
|
||||
Функция ПолучитьИнтервалПроверкиНапоминаний(Пользователь = Неопределено)
|
||||
Интервал = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
|
||||
@@ -340,25 +462,6 @@
|
||||
Возврат Макс(Интервал, 1);
|
||||
КонецФункции
|
||||
|
||||
// Конвертирует таблицу в массив структур.
|
||||
//
|
||||
// Параметры:
|
||||
// ТаблицаЗначений - произвольная таблица значений, у которой есть имена колонок.
|
||||
//
|
||||
// Возвращаемое значение
|
||||
// Массив - массив структур, содержащих значения строк таблицы.
|
||||
Функция ПолучитьМассивСтруктурИзТаблицы(ТаблицаЗначений) Экспорт
|
||||
Результат = Новый Массив;
|
||||
Для Каждого Строка Из ТаблицаЗначений Цикл
|
||||
СтруктураСтроки = Новый Структура;
|
||||
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
|
||||
СтруктураСтроки.Вставить(Колонка.Имя, Строка[Колонка.Имя]);
|
||||
КонецЦикла;
|
||||
Результат.Добавить(СтруктураСтроки);
|
||||
КонецЦикла;
|
||||
Возврат Результат;
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьИмяПользователяИБ(Пользователь)
|
||||
Если Не ЗначениеЗаполнено(Пользователь) Тогда
|
||||
Возврат Неопределено;
|
||||
@@ -472,7 +575,7 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// Создает напоминание пользователя. Если по объекту уже есть напоминание, то перезаписывает его.
|
||||
// Создает напоминание пользователя. Если по объекту уже есть напоминание, то сдвигает время напоминания на секунды вперед.
|
||||
Процедура ПодключитьНапоминание(ПараметрыНапоминания, ОбновитьСрокНапоминания = Ложь) Экспорт
|
||||
|
||||
НаборЗаписей = РегистрыСведений.НапоминанияПользователя.СоздатьНаборЗаписей();
|
||||
@@ -512,15 +615,16 @@
|
||||
|
||||
ТекстЗапроса =
|
||||
"ВЫБРАТЬ
|
||||
| НапоминанияПользователя.Пользователь,
|
||||
| НапоминанияПользователя.ВремяСобытия,
|
||||
| НапоминанияПользователя.Источник,
|
||||
| НапоминанияПользователя.СрокНапоминания,
|
||||
| НапоминанияПользователя.Описание,
|
||||
| НапоминанияПользователя.СпособУстановкиВремениНапоминания,
|
||||
| НапоминанияПользователя.Расписание,
|
||||
| НапоминанияПользователя.ИнтервалВремениНапоминания,
|
||||
| НапоминанияПользователя.ИмяРеквизитаИсточника
|
||||
| НапоминанияПользователя.Пользователь КАК Пользователь,
|
||||
| НапоминанияПользователя.ВремяСобытия КАК ВремяСобытия,
|
||||
| НапоминанияПользователя.Источник КАК Источник,
|
||||
| НапоминанияПользователя.СрокНапоминания КАК СрокНапоминания,
|
||||
| НапоминанияПользователя.Описание КАК Описание,
|
||||
| НапоминанияПользователя.СпособУстановкиВремениНапоминания КАК СпособУстановкиВремениНапоминания,
|
||||
| НапоминанияПользователя.Расписание КАК Расписание,
|
||||
| НапоминанияПользователя.ИнтервалВремениНапоминания КАК ИнтервалВремениНапоминания,
|
||||
| НапоминанияПользователя.ИмяРеквизитаИсточника КАК ИмяРеквизитаИсточника,
|
||||
| НапоминанияПользователя.Идентификатор КАК Идентификатор
|
||||
|ИЗ
|
||||
| РегистрСведений.НапоминанияПользователя КАК НапоминанияПользователя
|
||||
|ГДЕ
|
||||
@@ -570,7 +674,7 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПодключитьПроизвольноеНапоминание(Текст, ВремяСобытия = Неопределено, ИнтервалДоСобытия = 0, Предмет = Неопределено) Экспорт
|
||||
Функция ПодключитьПроизвольноеНапоминание(Текст, ВремяСобытия, ИнтервалДоСобытия = 0, Предмет = Неопределено, Идентификатор = Неопределено) Экспорт
|
||||
ПараметрыНапоминания = Новый Структура;
|
||||
ПараметрыНапоминания.Вставить("Описание", Текст);
|
||||
Если ТипЗнч(ВремяСобытия) = Тип("РасписаниеРегламентногоЗадания") Тогда
|
||||
@@ -580,6 +684,7 @@
|
||||
КонецЕсли;
|
||||
ПараметрыНапоминания.Вставить("ИнтервалВремениНапоминания", ИнтервалДоСобытия);
|
||||
ПараметрыНапоминания.Вставить("Источник", Предмет);
|
||||
ПараметрыНапоминания.Вставить("Идентификатор", Идентификатор);
|
||||
|
||||
Напоминание = СоздатьНапоминание(ПараметрыНапоминания);
|
||||
ПодключитьНапоминание(Напоминание);
|
||||
@@ -601,21 +706,6 @@
|
||||
Возврат Напоминание;
|
||||
КонецФункции
|
||||
|
||||
Функция ЕжегодноеРасписание(ДатаСобытия)
|
||||
Месяцы = Новый Массив;
|
||||
Месяцы.Добавить(Месяц(ДатаСобытия));
|
||||
ДеньВМесяце = День(ДатаСобытия);
|
||||
|
||||
Расписание = Новый РасписаниеРегламентногоЗадания;
|
||||
Расписание.ПериодПовтораДней = 1;
|
||||
Расписание.ПериодНедель = 1;
|
||||
Расписание.Месяцы = Месяцы;
|
||||
Расписание.ДеньВМесяце = ДеньВМесяце;
|
||||
Расписание.ВремяНачала = '000101010000' + (ДатаСобытия - НачалоДня(ДатаСобытия));
|
||||
|
||||
Возврат Расписание;
|
||||
КонецФункции
|
||||
|
||||
// Возвращает структуру нового напоминания для последующего подключения.
|
||||
Функция СоздатьНапоминание(ПараметрыНапоминания)
|
||||
|
||||
@@ -653,7 +743,7 @@
|
||||
|
||||
Если Напоминание.ПовторятьЕжегодно Тогда
|
||||
Если ЗначениеЗаполнено(Напоминание.ВремяСобытия) Тогда
|
||||
Напоминание.Расписание = ЕжегодноеРасписание(Напоминание.ВремяСобытия);
|
||||
Напоминание.Расписание = НапоминанияПользователяКлиентСервер.ЕжегодноеРасписание(Напоминание.ВремяСобытия);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
@@ -668,4 +758,102 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Прекращает просроченные периодические напоминания.
|
||||
Процедура АктуализироватьСписокНапоминаний()
|
||||
|
||||
ТекстЗапроса =
|
||||
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|
||||
| Напоминания.Пользователь КАК Пользователь,
|
||||
| Напоминания.ВремяСобытия КАК ВремяСобытия,
|
||||
| Напоминания.Источник КАК Источник,
|
||||
| Напоминания.СрокНапоминания КАК СрокНапоминания,
|
||||
| Напоминания.Описание КАК Описание,
|
||||
| Напоминания.СпособУстановкиВремениНапоминания КАК СпособУстановкиВремениНапоминания,
|
||||
| Напоминания.ИнтервалВремениНапоминания КАК ИнтервалВремениНапоминания,
|
||||
| Напоминания.ИмяРеквизитаИсточника КАК ИмяРеквизитаИсточника,
|
||||
| Напоминания.Расписание КАК Расписание,
|
||||
| Напоминания.ПредставлениеИсточника КАК ПредставлениеИсточника,
|
||||
| Напоминания.Идентификатор КАК Идентификатор
|
||||
|ИЗ
|
||||
| РегистрСведений.НапоминанияПользователя КАК Напоминания
|
||||
|ГДЕ
|
||||
| Напоминания.ВремяСобытия <= &ТекущаяДата
|
||||
| И Напоминания.Пользователь = &Пользователь";
|
||||
|
||||
Запрос = Новый Запрос(ТекстЗапроса);
|
||||
|
||||
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
|
||||
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
|
||||
|
||||
УстановитьПривилегированныйРежим(Истина);
|
||||
СписокНапоминаний = Запрос.Выполнить().Выгрузить();
|
||||
УстановитьПривилегированныйРежим(Ложь);
|
||||
|
||||
Для Каждого Напоминание Из СписокНапоминаний Цикл
|
||||
Расписание = Напоминание.Расписание.Получить();
|
||||
Если Расписание = Неопределено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
ГрафикСобытияНаГод = ГрафикСобытия(Расписание, Напоминание.ВремяСобытия, ДобавитьМесяц(Напоминание.ВремяСобытия, 12) - 1);
|
||||
ПодошедшееВремяСобытия = ГрафикСобытия(Расписание, Напоминание.ВремяСобытия + 1, ТекущаяДатаСеанса());
|
||||
|
||||
// - подошло следующее время события по расписанию;
|
||||
Если ПодошедшееВремяСобытия.Количество() > 0
|
||||
// - указано "Время завершения" в расписании регламентного задания и оно просрочено;
|
||||
Или ЗначениеЗаполнено(Расписание.ВремяЗавершения) И ТекущаяДатаСеанса() > (Напоминание.ВремяСобытия + (Расписание.ВремяЗавершения - Расписание.ВремяНачала))
|
||||
// - напоминание ежегодное, но уже прошел месяц со времени события;
|
||||
Или ГрафикСобытияНаГод.Количество() = 1 И ТекущаяДатаСеанса() > ДобавитьМесяц(Напоминание.ВремяСобытия, 1)
|
||||
// - напоминание ежемесячное, но уже прошла неделя со времени события.
|
||||
Или ГрафикСобытияНаГод.Количество() = 12 И ТекущаяДатаСеанса() > Напоминание.ВремяСобытия + 60*60*24*7 Тогда
|
||||
ВремяБлижайшегоСобытия = Неопределено;
|
||||
Если ПодошедшееВремяСобытия.Количество() > 0 Тогда
|
||||
ОтключитьНапоминание(Напоминание, Ложь);
|
||||
|
||||
ПараметрыНапоминания = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Напоминание);
|
||||
ПараметрыНапоминания.Расписание = Напоминание.Расписание.Получить();
|
||||
Напоминание = СоздатьНапоминание(ПараметрыНапоминания);
|
||||
Напоминание.ВремяСобытия = ПодошедшееВремяСобытия[ПодошедшееВремяСобытия.ВГраница()];
|
||||
Напоминание.СрокНапоминания = Напоминание.ВремяСобытия - Напоминание.ИнтервалВремениНапоминания;
|
||||
|
||||
ПодключитьНапоминание(Напоминание);
|
||||
КонецЕсли;
|
||||
ОтключитьНапоминание(Напоминание, Истина);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция СписокТекущихНапоминанийПользователя() Экспорт
|
||||
|
||||
АктуализироватьСписокНапоминаний();
|
||||
|
||||
Запрос = Новый Запрос;
|
||||
Запрос.Текст =
|
||||
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|
||||
| Напоминания.Пользователь КАК Пользователь,
|
||||
| Напоминания.ВремяСобытия КАК ВремяСобытия,
|
||||
| Напоминания.Источник КАК Источник,
|
||||
| Напоминания.СрокНапоминания КАК СрокНапоминания,
|
||||
| Напоминания.Описание КАК Описание,
|
||||
| 2 КАК ИндексКартинки
|
||||
|ИЗ
|
||||
| РегистрСведений.НапоминанияПользователя КАК Напоминания
|
||||
|ГДЕ
|
||||
| Напоминания.СрокНапоминания <= &ТекущаяДата
|
||||
| И Напоминания.Пользователь = &Пользователь
|
||||
|
|
||||
|УПОРЯДОЧИТЬ ПО
|
||||
| ВремяСобытия";
|
||||
|
||||
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса() + 30*60);// +30 минут для кэша
|
||||
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
|
||||
|
||||
УстановитьПривилегированныйРежим(Истина);
|
||||
Результат = ОбщегоНазначения.ТаблицаЗначенийВМассив(Запрос.Выполнить().Выгрузить());
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
Reference in new issue
Block a user