2_4_4_151

This commit is contained in:
Компания 1С committed 2018-02-09 12:57:00 +03:00
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 минут для кэша
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
УстановитьПривилегированныйРежим(Истина);
Результат = ОбщегоНазначения.ТаблицаЗначенийВМассив(Запрос.Выполнить().Выгрузить());
Возврат Результат;
КонецФункции
#КонецОбласти