diff --git a/src/cf/Catalogs/узЗадачи.xml b/src/cf/Catalogs/узЗадачи.xml
index f63fbbf63..b2306f9e1 100644
--- a/src/cf/Catalogs/узЗадачи.xml
+++ b/src/cf/Catalogs/узЗадачи.xml
@@ -2085,6 +2085,96 @@
Use
+
+
+ КоличествоЗадачЧекЛиста
+
+
+ ru
+ Количество задач чек-листа
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Nonnegative
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
+
+
+ КоличествоВыполненныхЗадачЧекЛиста
+
+
+ ru
+ Количество выполененных задач чек-листа
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Nonnegative
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
diff --git a/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl b/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl
index 8b77187dc..7676776d8 100644
--- a/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl
+++ b/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl
@@ -1,5 +1,14 @@
Процедура ПередЗаписью(Отказ)
+
+ //+ УрянскийД 2020-06-22 (начало)
+ Если ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
+ //- УрянскийД 2020-06-22 (окончание)
+
Если Отказ Тогда
Возврат;
Конецесли;
@@ -102,6 +111,11 @@
ДополнительныеСвойства.Вставить("СобытияВИстории",СобытияВИстории);
+ //+ УрянскийД 2020-06-22 (начало)
+ КоличествоЗадачЧекЛиста = ЭтотОбъект.Комментарии.Количество();
+ КоличествоВыполненныхЗадачЧекЛиста = ЭтотОбъект.Комментарии.Итог("Выполнено");
+ //- УрянскийД 2020-06-22 (окончание)
+
КонецПроцедуры
Процедура ЗаполнитьСтатусЗадачиЕслиОнНеЗаполнен(Отказ)
@@ -1141,6 +1155,13 @@
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
+
+ //***АиБ*** УрянскийД 2020-06-22 (начало)
+ Если ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+ //***АиБ*** УрянскийД 2020-06-22 (окончание)
+
Если ДополнительныеСвойства.Свойство("узЭтоОбработка") Тогда
Возврат;
Конецесли;
@@ -1157,6 +1178,7 @@
//- ##122 Дзеса Ігор (capitoshko) 21.01.2019
ДополнительныеСвойства.Удалить("СобытияВИстории");
+
КонецПроцедуры
Процедура СформироватьЗаписиВРССвязанныеЗадачи(Отказ) Экспорт
diff --git a/src/cf/Catalogs/узЗадачи/Forms/ФормаЭлемента/Ext/Form/Module.bsl b/src/cf/Catalogs/узЗадачи/Forms/ФормаЭлемента/Ext/Form/Module.bsl
index bbbc42574..c353637e4 100644
--- a/src/cf/Catalogs/узЗадачи/Forms/ФормаЭлемента/Ext/Form/Module.bsl
+++ b/src/cf/Catalogs/узЗадачи/Forms/ФормаЭлемента/Ext/Form/Module.bsl
@@ -8,6 +8,11 @@
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+
+ //+ УрянскийД 2020-06-22 (начало)
+ ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
+ //- УрянскийД 2020-06-22 (окончание)
+
// СтандартныеПодсистемы.ВерсионированиеОбъектов
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
diff --git a/src/cf/CommonModules/узОбновлениеИнформационнойБазы/Ext/Module.bsl b/src/cf/CommonModules/узОбновлениеИнформационнойБазы/Ext/Module.bsl
index 887f86a40..5ce1e0d0d 100644
--- a/src/cf/CommonModules/узОбновлениеИнформационнойБазы/Ext/Module.bsl
+++ b/src/cf/CommonModules/узОбновлениеИнформационнойБазы/Ext/Module.bsl
@@ -1,7 +1,13 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт
Описание.Имя = "УправлениеЗадачами";
- Описание.Версия = "1.0.5.002";
- // Требуется библиотека стандартных подсистем.
+ Описание.Версия = "1.0.5.003";
+
+ //+ УрянскийД 2020-06-22 (начало)
+ Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно";
+ Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "1.0.5.003";
+ //- УрянскийД 2020-06-22 (окончание)
+
+ // Требуется библиотека стандартных подсистем.
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");
КонецПроцедуры
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
@@ -239,7 +245,45 @@
Обработчик.НачальноеЗаполнение = Ложь;
Обработчик.Процедура = "узОбновлениеИнформационнойБазы.ОбновлениеНаВерсию_1_0_4_034";
Обработчик.ОбщиеДанные = Истина;
- Обработчик.Комментарий = "Обновление на версию 1.0.4.034";
+ Обработчик.Комментарий = "Обновление на версию 1.0.4.034";
+
+ //+ УрянскийД 2020-06-22 (начало)
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "1.0.5.003";
+ Обработчик.Процедура = "узОбновлениеИнформационнойБазы.ОбновлениеИтоговЧекЛистаОперативное";
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "1.0.5.003";
+ Обработчик.Процедура = "узОбновлениеИнформационнойБазы.ОбновлениеИтоговЧекЛистаВФоне";
+ Обработчик.Идентификатор = Новый УникальныйИдентификатор("0c980bcc-9483-4a76-b15b-80b6dac3dbf4");
+ Обработчик.Комментарий = НСтр("ru = 'Заполняет общее количество и количество выполненных подзадач чек-листа.'");
+ Обработчик.РежимВыполнения = "Отложенно";
+ Обработчик.ОчередьОтложеннойОбработки = 1;
+ Обработчик.ПроцедураЗаполненияДанныхОбновления = "узОбновлениеИнформационнойБазы.ЗарегистрироватьДанныеКОбновлениюИтоговЧекЛиста";
+ Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
+ Обработчик.ЧитаемыеОбъекты = "Справочник.узЗадачи";
+ Обработчик.ИзменяемыеОбъекты = "Справочник.узЗадачи";
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "1.0.5.003";
+ Обработчик.Процедура = "узОбновлениеИнформационнойБазы.ОбновлениеСостоянийВзаимодействияПоЗадачамОперативное";
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "1.0.5.003";
+ Обработчик.Процедура = "узОбновлениеИнформационнойБазы.ОбновлениеСостоянийВзаимодействияПоЗадачамВФоне";
+ Обработчик.Идентификатор = Новый УникальныйИдентификатор("454eb93c-3fc1-45bf-99c6-1045a4f18142");
+ Обработчик.Комментарий = НСтр("ru = 'Заполняет сводную информацию о почтовых взаимодействиях по задачам.'");
+ Обработчик.РежимВыполнения = "Отложенно";
+ Обработчик.ОчередьОтложеннойОбработки = 2;
+ Обработчик.ПроцедураЗаполненияДанныхОбновления = "узОбновлениеИнформационнойБазы.ЗарегистрироватьДанныеКОбновлениюВзаимодействийПоЗадачам";
+ Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
+ Обработчик.ИзменяемыеОбъекты = "РегистрСведений.узСостояниеВзаимодействийПоЗадачам";
+ Обработчик.ЧитаемыеОбъекты = "Справочник.узЗадачиПрисоединенныеФайлы,"
+ + "Документ.ЭлектронноеПисьмоВходящее,"
+ + "Документ.ЭлектронноеПисьмоИсходящее,"
+ + "Справочник.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы,"
+ + "Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы";;
+ //- УрянскийД 2020-06-22 (окончание)
КонецПроцедуры
Процедура ПередОбновлениемИнформационнойБазы() Экспорт
@@ -1217,6 +1261,377 @@
КонецПроцедуры
+// УрянскийД 2020-06-22
+Процедура ОбновлениеИтоговЧекЛистаОперативное() Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000
+ | ЧекЛист.Ссылка КАК Ссылка
+ |ИЗ
+ | Справочник.узЗадачи.Комментарии КАК ЧекЛист
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | ЧекЛист.Ссылка.ДатаСоздания УБЫВ";
+
+ ВыборкаЗадач = Запрос.Выполнить().Выбрать();
+
+ Пока ВыборкаЗадач.Следующий() Цикл
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ Блокировка = Новый БлокировкаДанных;
+ ЭлементБлокировки = Блокировка.Добавить("Справочник.узЗадачи");
+ ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаЗадач.Ссылка);
+ Блокировка.Заблокировать();
+
+ ЗадачаОбъект = ВыборкаЗадач.Ссылка.ПолучитьОбъект();
+
+ Если ЗадачаОбъект = Неопределено Тогда
+ ОтменитьТранзакцию();
+ Продолжить;
+ КонецЕсли;
+
+ КоличествоПодзадач = ЗадачаОбъект.Комментарии.Количество();
+ КоличествоВыполненных = ЗадачаОбъект.Комментарии.Итог("Выполнено");
+
+ Если ЗадачаОбъект.КоличествоЗадачЧекЛиста <> КоличествоПодзадач Тогда
+ ЗадачаОбъект.КоличествоЗадачЧекЛиста = КоличествоПодзадач;
+ КонецЕсли;
+ Если ЗадачаОбъект.КоличествоВыполненныхЗадачЧекЛиста <> КоличествоВыполненных Тогда
+ ЗадачаОбъект.КоличествоВыполненныхЗадачЧекЛиста = КоличествоВыполненных;
+ КонецЕсли;
+
+ Если ЗадачаОбъект.Модифицированность() Тогда
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(ЗадачаОбъект);
+ КонецЕсли;
+
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ ТекстСообщения = НСтр("ru = 'Процедуре %ИмяПроцедуры% не удалось обработать %ИмяОбъекта%: %Ссылка% по причине: %Причина%'");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ИмяПроцедуры%", "узОбновлениеИнформационнойБазы.ОбновлениеИтоговЧекЛистаОперативное");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ИмяОбъекта%", ВыборкаЗадач.Ссылка.Метаданные().ПолноеИмя());
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", ВыборкаЗадач.Ссылка);
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ВызватьИсключение ТекстСообщения;
+
+ КонецПопытки;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+// УрянскийД 2020-06-22
+Процедура ОбновлениеИтоговЧекЛистаВФоне(ПараметрыОбновления) Экспорт
+
+ ПолноеИмяОбъекта = "Справочник.узЗадачи";
+
+ ОбъектовОбработано = 0;
+ ПроблемныхОбъектов = 0;
+ ОбработкаЗавершена = Истина;
+
+ ВыборкаЗадач = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(ПараметрыОбновления.Очередь, ПолноеИмяОбъекта);
+
+ Пока ВыборкаЗадач.Следующий() Цикл
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ Блокировка = Новый БлокировкаДанных;
+ ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяОбъекта);
+ ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаЗадач.Ссылка);
+ Блокировка.Заблокировать();
+
+ ЗадачаОбъект = ВыборкаЗадач.Ссылка.ПолучитьОбъект();
+
+ Если ЗадачаОбъект = Неопределено Тогда
+ ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ВыборкаЗадач.Ссылка);
+ ЗафиксироватьТранзакцию();
+ Продолжить;
+ КонецЕсли;
+
+ КоличествоПодзадач = ЗадачаОбъект.Комментарии.Количество();
+ КоличествоВыполненных = ЗадачаОбъект.Комментарии.Итог("Выполнено");
+
+ Если ЗадачаОбъект.КоличествоЗадачЧекЛиста <> КоличествоПодзадач Тогда
+ ЗадачаОбъект.КоличествоЗадачЧекЛиста = КоличествоПодзадач;
+ КонецЕсли;
+ Если ЗадачаОбъект.КоличествоВыполненныхЗадачЧекЛиста <> КоличествоВыполненных Тогда
+ ЗадачаОбъект.КоличествоВыполненныхЗадачЧекЛиста = КоличествоВыполненных;
+ КонецЕсли;
+
+ Если ЗадачаОбъект.Модифицированность() Тогда
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(ЗадачаОбъект);
+ Иначе
+ ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ЗадачаОбъект);
+ КонецЕсли;
+
+ ЗафиксироватьТранзакцию();
+
+ ОбъектовОбработано = ОбъектовОбработано + 1;
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ ПроблемныхОбъектов = ПроблемныхОбъектов + 1;
+
+ ТекстСообщения = НСтр("ru = 'Не удалось обработать %ИмяОбъекта%: %Ссылка% по причине: %Причина%'");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ИмяОбъекта%", ПолноеИмяОбъекта);
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", ВыборкаЗадач.Ссылка);
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
+ УровеньЖурналаРегистрации.Предупреждение,
+ ВыборкаЗадач.Ссылка.Метаданные(),
+ ВыборкаЗадач.Ссылка,
+ ТекстСообщения);
+
+ КонецПопытки;
+
+ КонецЦикла;
+
+ Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(ПараметрыОбновления.Очередь, ПолноеИмяОбъекта) Тогда
+ ОбработкаЗавершена = Ложь;
+ КонецЕсли;
+
+ Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда
+ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Процедуре %1 не удалось обработать задачи (пропущены): %2'"),
+ "узОбновлениеИнформационнойБазы.ОбновлениеИтоговЧекЛистаВФоне",
+ ПроблемныхОбъектов);
+ ВызватьИсключение ТекстСообщения;
+ Иначе
+ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Процедура %1 обработала очередную порцию задач: %2'"),
+ "узОбновлениеИнформационнойБазы.ОбновлениеИтоговЧекЛистаВФоне",
+ ОбъектовОбработано);
+ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
+ УровеньЖурналаРегистрации.Информация,
+ , ,
+ ТекстСообщения);
+ КонецЕсли;
+
+ ПараметрыОбновления.ОбработкаЗавершена = ОбработкаЗавершена;
+
+КонецПроцедуры
+
+// УрянскийД 2020-06-22
+Процедура ЗарегистрироватьДанныеКОбновлениюИтоговЧекЛиста(ПараметрыОбновления) Экспорт
+
+ РазмерПорции = 1000;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ЧекЛист.Ссылка КАК Ссылка
+ |ИЗ
+ | Справочник.узЗадачи.Комментарии КАК ЧекЛист
+ |ГДЕ
+ | ЧекЛист.Ссылка > &Граница
+ | И ЧекЛист.НомерСтроки = 1
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | ЧекЛист.Ссылка";
+
+ Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + Формат(РазмерПорции, "ЧН=; ЧГ="));
+ Запрос.УстановитьПараметр("Граница", Справочники.узЗадачи.ПустаяСсылка());
+
+ ЕстьДанныеДляОбработки = Истина;
+
+ Пока ЕстьДанныеДляОбработки Цикл
+
+ МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0);
+
+ Если ЗначениеЗаполнено(МассивСсылок) Тогда
+
+ ОбновлениеИнформационнойБазы.ОтметитьКОбработке(ПараметрыОбновления, МассивСсылок);
+
+ Запрос.УстановитьПараметр("Граница", МассивСсылок[МассивСсылок.ВГраница()]);
+
+ КонецЕсли;
+
+ ЕстьДанныеДляОбработки = Не (МассивСсылок.Количество() < РазмерПорции);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+// УрянскийД 2020-06-22
+Процедура ОбновлениеСостоянийВзаимодействияПоЗадачамОперативное() Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ ПЕРВЫЕ 1000
+ | узЗадачи.Ссылка КАК Ссылка
+ |ИЗ
+ | Справочник.узЗадачи КАК узЗадачи
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | узЗадачи.ДатаСоздания УБЫВ";
+
+ Результат = Запрос.Выполнить();
+ МассивСсылок = Результат.Выгрузить().ВыгрузитьКолонку(0);
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ Блокировка = Новый БлокировкаДанных;
+ ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.узСостояниеВзаимодействийПоЗадачам");
+ ЭлементБлокировки.ИсточникДанных = Результат;
+ ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Задача", "Ссылка");
+ Блокировка.Заблокировать();
+
+ РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.ОтразитьСостояниеЗадачи(МассивСсылок, Ложь);
+
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ ТекстСообщения = НСтр("ru = 'Процедуре %ИмяПроцедуры% не удалось обработать задачи по причине: %Причина%'");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ИмяПроцедуры%", "узОбновлениеИнформационнойБазы.ОбновлениеСостоянийВзаимодействияПоЗадачамОперативное");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ВызватьИсключение ТекстСообщения;
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+// УрянскийД 2020-06-22
+Процедура ОбновлениеСостоянийВзаимодействияПоЗадачамВФоне(ПараметрыОбновления) Экспорт
+
+ ПолноеИмяОбъекта = "Справочник.узЗадачи";
+
+ ОбъектовОбработано = 0;
+ ПроблемныхОбъектов = 0;
+ ОбработкаЗавершена = Истина;
+
+ ДополнительныеПараметры = ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки();
+ ДополнительныеПараметры.МаксимумВыборки = 1000;
+
+ ВыборкаЗадач = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(ПараметрыОбновления.Очередь,
+ ПолноеИмяОбъекта,
+ ДополнительныеПараметры);
+
+ МассивСсылок = Новый Массив;
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ Пока ВыборкаЗадач.Следующий() Цикл
+ МассивСсылок.Добавить(ВыборкаЗадач.Ссылка);
+ КонецЦикла;
+
+ РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.ОтразитьСостояниеЗадачи(
+ МассивСсылок,
+ Ложь,
+ ПараметрыОбновления.Очередь);
+
+ ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(МассивСсылок);
+
+ ЗафиксироватьТранзакцию();
+
+ ОбъектовОбработано = ОбъектовОбработано + МассивСсылок.Количество();
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ ПроблемныхОбъектов = ПроблемныхОбъектов + МассивСсылок.Количество();
+
+ МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта);
+
+ ТекстСообщения = НСтр("ru = 'Не удалось обработать %ИмяОбъекта% по причине: %Причина%'");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ИмяОбъекта%", ПолноеИмяОбъекта);
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
+ УровеньЖурналаРегистрации.Предупреждение,
+ МетаданныеОбъекта,
+ ,
+ ТекстСообщения);
+
+ КонецПопытки;
+
+
+ Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(ПараметрыОбновления.Очередь, ПолноеИмяОбъекта) Тогда
+ ОбработкаЗавершена = Ложь;
+ КонецЕсли;
+
+ Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда
+ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Процедуре %1 не удалось обработать задачи (пропущены): %2'"),
+ "узОбновлениеИнформационнойБазы.ОбновлениеСостоянийВзаимодействияПоЗадачамВФоне",
+ ПроблемныхОбъектов);
+ ВызватьИсключение ТекстСообщения;
+ Иначе
+ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Процедура %1 обработала очередную порцию задач: %2'"),
+ "узОбновлениеИнформационнойБазы.ОбновлениеСостоянийВзаимодействияПоЗадачамВФоне",
+ ОбъектовОбработано);
+ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
+ УровеньЖурналаРегистрации.Информация,
+ , ,
+ ТекстСообщения);
+ КонецЕсли;
+
+ ПараметрыОбновления.ОбработкаЗавершена = ОбработкаЗавершена;
+
+КонецПроцедуры
+
+// УрянскийД 2020-06-22
+Процедура ЗарегистрироватьДанныеКОбновлениюВзаимодействийПоЗадачам(ПараметрыОбновления) Экспорт
+
+ РазмерПорции = 1000;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | Задачи.Ссылка КАК Ссылка
+ |ИЗ
+ | Справочник.узЗадачи КАК Задачи
+ |ГДЕ
+ | Задачи.Ссылка > &Граница
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | Задачи.Ссылка";
+
+ Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + Формат(РазмерПорции, "ЧН=; ЧГ="));
+ Запрос.УстановитьПараметр("Граница", Справочники.узЗадачи.ПустаяСсылка());
+
+ ЕстьДанныеДляОбработки = Истина;
+
+ Пока ЕстьДанныеДляОбработки Цикл
+
+ МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0);
+
+ Если ЗначениеЗаполнено(МассивСсылок) Тогда
+
+ ОбновлениеИнформационнойБазы.ОтметитьКОбработке(ПараметрыОбновления, МассивСсылок);
+
+ Запрос.УстановитьПараметр("Граница", МассивСсылок[МассивСсылок.ВГраница()]);
+
+ КонецЕсли;
+
+ ЕстьДанныеДляОбработки = Не (МассивСсылок.Количество() < РазмерПорции);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
//#Область ПрограммныйИнтерфейс
diff --git a/src/cf/CommonModules/узОбщийМодульСервер/Ext/Module.bsl b/src/cf/CommonModules/узОбщийМодульСервер/Ext/Module.bsl
index 64e2ef678..8887eb10a 100644
--- a/src/cf/CommonModules/узОбщийМодульСервер/Ext/Module.bsl
+++ b/src/cf/CommonModules/узОбщийМодульСервер/Ext/Module.bsl
@@ -1136,3 +1136,126 @@
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
КонецПроцедуры
+
+//+ #212 Урянский Д.В. 2020-03-08
+Процедура ОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла(Источник, Отказ) Экспорт
+
+ Если Источник.ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ТипЗнч(Источник.ВладелецФайла) = Тип("СправочникСсылка.узЗадачи") Тогда
+
+ РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.ОтразитьСостояниеЗадачи(Источник.ВладелецФайла, Отказ);
+
+ ИначеЕсли ВзаимодействияКлиентСервер.ЯвляетсяПрисоединеннымФайломВзаимодействий(Источник.Ссылка) Тогда
+
+ ПредметВзаимодействия = Взаимодействия.ПолучитьЗначениеПредмета(Источник.ВладелецФайла);
+
+ Если ТипЗнч(ПредметВзаимодействия) = Тип("СправочникСсылка.узЗадачи") Тогда
+
+ РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.ОтразитьСостояниеЗадачи(ПредметВзаимодействия, Отказ);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+//+ #212 Урянский Д.В. 2020-03-08
+Процедура ОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма(Источник, Отказ) Экспорт
+
+ Если Источник.ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Источник.ЭтоНовый() Тогда
+ Возврат; // предмет письма (задача) еще не записан
+ КонецЕсли;
+
+ Если ТипЗнч(Источник) = Тип("ДокументОбъект.ЭлектронноеПисьмоВходящее") Тогда
+ ДатаВзаимодействия = Источник.ДатаПолучения;
+ ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.ЭлектронноеПисьмоИсходящее") Тогда
+ ДатаВзаимодействия = Источник.ДатаОтправления;
+ Иначе
+ ДатаВзаимодействия = Неопределено;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ДатаВзаимодействия) Тогда
+ Возврат;
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Предмет = Взаимодействия.ПолучитьЗначениеПредмета(Источник.Ссылка);
+
+ Если ТипЗнч(Предмет) = Тип("СправочникСсылка.узЗадачи") Тогда
+ РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.ОтразитьСостояниеЗадачи(Предмет, Отказ);
+ КонецЕсли;
+
+КонецПроцедуры
+
+//+ #212 Урянский Д.В. 2020-03-08
+Процедура ОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета(Источник, Отказ, Замещение) Экспорт
+
+ Если Источник.ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Источник.Отбор.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Взаимодействие = Источник.Отбор.Взаимодействие.Значение;
+ Предмет = Взаимодействия.ПолучитьЗначениеПредмета(Взаимодействие);
+
+ Если ТипЗнч(Предмет) = Тип("СправочникСсылка.узЗадачи") Тогда
+ Источник.ДополнительныеСвойства.Вставить("ЗадачаДляОбновленияСостояния", Предмет);
+ КонецЕсли;
+
+КонецПроцедуры
+
+//+ #212 Урянский Д.В. 2020-03-08
+Процедура ОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета(Источник, Отказ, Замещение) Экспорт
+
+ Если Источник.ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Источник.Отбор.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ МассивЗадач = Новый Массив;
+
+ Для каждого Запись Из Источник Цикл
+ Если ТипЗнч(Запись.Предмет) = Тип("СправочникСсылка.узЗадачи") Тогда
+ МассивЗадач.Добавить(Запись.Предмет);
+ КонецЕсли;
+ КонецЦикла;
+
+ СтараяЗадача = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Источник.ДополнительныеСвойства, "ЗадачаДляОбновленияСостояния");
+
+ Если ЗначениеЗаполнено(СтараяЗадача) Тогда
+
+ ИндексЗадачи = МассивЗадач.Найти(СтараяЗадача);
+ Если ИндексЗадачи = Неопределено Тогда
+ // Изменили предмет взаимодействия: нужен расчет как для нового, так и для старого предмета.
+ МассивЗадач.Добавить(СтараяЗадача);
+ Иначе
+ // Предмет взаимодействия не менялся: расчет не нужен.
+ МассивЗадач.Удалить(ИндексЗадачи);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если МассивЗадач.Количество() <> 0 Тогда
+ УстановитьПривилегированныйРежим(Истина);
+ РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.ОтразитьСостояниеЗадачи(МассивЗадач, Отказ);
+ КонецЕсли;
+
+КонецПроцедуры
diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml
index 73e81a22c..a0cf1237c 100644
--- a/src/cf/Configuration.xml
+++ b/src/cf/Configuration.xml
@@ -49,7 +49,7 @@
Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок
Управление задачами
- 1.0.5.002
+ 1.0.5.003
false
true
@@ -1089,6 +1089,10 @@
СвойстваПередУдалениемСсылочногоОбъекта
СкопироватьРеквизитыВерсииФайловВФайл
СоздатьПредопределенныеПапкиЭлектронныхПисем
+ узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла
+ узОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета
+ узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма
+ узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета
узПереопределитьПолучаемуюФормуПрисоединенногоФайла
узПроверитьНаличиеЗаметокПоПредмету
узУстановитьПометкуУдаленияПрисоединенныхФайловДокументов
@@ -1773,6 +1777,7 @@
узПроксиСерверы
узСвязанныеЗадачи
узСловарь
+ узСостояниеВзаимодействийПоЗадачам
узСпринтыЗадач
узСтатусыЗадач
узФактПоЗадачам
diff --git a/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета.xml b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета.xml
new file mode 100644
index 000000000..d233dffcf
--- /dev/null
+++ b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ узОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета
+
+
+ ru
+ Обновить состояние взаимодействия по задаче перед записью предмета
+
+
+
+
+ cfg:InformationRegisterRecordSet.ПредметыПапкиВзаимодействий
+
+ BeforeWrite
+ CommonModule.узОбщийМодульСервер.ОбновитьСостояниеВзаимодействияПоЗадачеПередЗаписьюПредмета
+
+
+
\ No newline at end of file
diff --git a/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма.xml b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма.xml
new file mode 100644
index 000000000..5fe49f237
--- /dev/null
+++ b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма
+
+
+ ru
+ Обновить состояние взаимодействия по задаче при записи письма
+
+
+
+
+ cfg:DocumentObject.ЭлектронноеПисьмоВходящее
+ cfg:DocumentObject.ЭлектронноеПисьмоИсходящее
+
+ OnWrite
+ CommonModule.узОбщийМодульСервер.ОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПисьма
+
+
+
\ No newline at end of file
diff --git a/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета.xml b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета.xml
new file mode 100644
index 000000000..7bb8041c7
--- /dev/null
+++ b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета
+
+
+ ru
+ Обновить состояние взаимодействия по задаче при записи предмета
+
+
+
+
+ cfg:InformationRegisterRecordSet.ПредметыПапкиВзаимодействий
+
+ OnWrite
+ CommonModule.узОбщийМодульСервер.ОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиПредмета
+
+
+
\ No newline at end of file
diff --git a/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла.xml b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла.xml
new file mode 100644
index 000000000..5ce787547
--- /dev/null
+++ b/src/cf/EventSubscriptions/узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ узОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла
+
+
+ ru
+ Обновить состояние взаимодействия по задаче при записи файла
+
+
+
+
+ cfg:DefinedType.ПрисоединенныйФайлОбъект
+
+ OnWrite
+ CommonModule.узОбщийМодульСервер.ОбновитьСостояниеВзаимодействияПоЗадачеПриЗаписиФайла
+
+
+
\ No newline at end of file
diff --git a/src/cf/ExchangePlans/ОбновлениеИнформационнойБазы/Ext/Content.xml b/src/cf/ExchangePlans/ОбновлениеИнформационнойБазы/Ext/Content.xml
index 5e094f98d..f2bf81627 100644
--- a/src/cf/ExchangePlans/ОбновлениеИнформационнойБазы/Ext/Content.xml
+++ b/src/cf/ExchangePlans/ОбновлениеИнформационнойБазы/Ext/Content.xml
@@ -208,6 +208,10 @@
InformationRegister.НастройкиСинхронизацииФайлов
Deny
+ -
+ Catalog.узЗадачи
+ Deny
+
-
Catalog.ВидыПроверок
Deny
@@ -724,6 +728,10 @@
Catalog.ЗначенияСвойствОбъектов
Deny
+ -
+ InformationRegister.узСостояниеВзаимодействийПоЗадачам
+ Deny
+
-
InformationRegister.ДатыПоследнейЗагрузкиПочтовыхСообщений
Deny
diff --git a/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам.xml b/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам.xml
new file mode 100644
index 000000000..00e317129
--- /dev/null
+++ b/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам.xml
@@ -0,0 +1,391 @@
+
+
+
+
+
+ d179ab20-4a99-402b-b399-0998100401a7
+ 59f274c4-5ad6-4fa0-84c2-15e44535a696
+
+
+ f170d1b9-b6fe-44d9-9a91-ea9a70e77aac
+ a05b23e8-2e1d-4553-8a61-c74773c7fc9c
+
+
+ 44e16ca9-548b-47a8-9a69-04511a7454e0
+ 66aff692-2e20-4096-af85-d108e3f7831d
+
+
+ eec26afa-4dfc-4711-8a80-74dfac1186a1
+ 792c31e0-d61e-43dd-88b0-a5a16bc9f338
+
+
+ dc975ee1-90e5-43b7-b1f3-0113521d3be0
+ cbdbf75f-5eaf-469a-bba8-96708bea5bef
+
+
+ 4f23fcd6-5a93-4336-b436-89a5a5bd156b
+ 1e043485-3170-4281-81c0-e3639915691f
+
+
+ ef30312d-113a-4256-af60-625232954fa5
+ fe0bebdb-d767-4421-8299-0ad4ee7f296d
+
+
+
+ узСостояниеВзаимодействийПоЗадачам
+
+
+ ru
+ Состояние взаимодействий по задачам
+
+
+
+ false
+ InDialog
+
+
+
+
+ Nonperiodical
+ Independent
+ false
+ false
+ Managed
+ DontUse
+ false
+ false
+
+
+
+
+
+ DontUse
+ false
+ false
+
+
+
+
+ КоличествоПрисоединенныхФайлов
+
+
+ ru
+ Количество присоединенных файлов
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Nonnegative
+
+
+ false
+
+
+
+
+ ru
+ Количество файлов, присоединенных непосредственно к задаче
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+ КоличествоВходящихПисем
+
+
+ ru
+ Количество входящих писем
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Nonnegative
+
+
+ false
+
+
+
+
+ ru
+ Количество связанных с задачей входящих электронных писем
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+ КоличествоИсходящихПисем
+
+
+ ru
+ Количество исходящих писем
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Nonnegative
+
+
+ false
+
+
+
+
+ ru
+ Количество связанных с задачей исходящих электронных писем
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+ ДатаПоследнегоВходящегоПисьма
+
+
+ ru
+ Дата последнего входящего письма
+
+
+
+
+ xs:dateTime
+
+ DateTime
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+ ДатаПоследнегоИсходящегоПисьма
+
+
+ ru
+ Дата последнего исходящего письма
+
+
+
+
+ xs:dateTime
+
+ DateTime
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+ КоличествоВложенийПисем
+
+
+ ru
+ Количество вложений писем
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Nonnegative
+
+
+ false
+
+
+
+
+ ru
+ Количество файлов, прикрепленных к связанным с задачей электронным письмам
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+ Задача
+
+
+ ru
+ Задача
+
+
+
+
+ cfg:CatalogRef.узЗадачи
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ true
+
+ ShowError
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ true
+ true
+ true
+ DontIndex
+ Use
+ Use
+
+
+
+
+
\ No newline at end of file
diff --git a/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам/Ext/ManagerModule.bsl b/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам/Ext/ManagerModule.bsl
new file mode 100644
index 000000000..b6af91d14
--- /dev/null
+++ b/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам/Ext/ManagerModule.bsl
@@ -0,0 +1,266 @@
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
+#Область ПрограммныйИнтерфейс
+
+// Процедура по переданной ссылке на задачу расчитывает и записывает в регистр сведения о взаимодействиях по задаче.
+//
+// Параметры:
+// Задачи - СправочникСсылка.узЗадачи, Массив - задачи, в рамках которых рассчитываются показатели.
+// Отказ - Булево - признак прерывания обработки проведения
+//
+Процедура ОтразитьСостояниеЗадачи(Задачи, Отказ, Очередь = Неопределено) Экспорт
+
+ Если Отказ Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ТипЗнч(Задачи) = Тип("Массив") Тогда
+ МассивСсылок = Задачи;
+ ИначеЕсли ТипЗнч(Задачи) = Тип("СправочникСсылка.узЗадачи") Тогда
+ МассивСсылок = Новый Массив;
+ МассивСсылок.Добавить(Задачи);
+ Иначе
+ Возврат;
+ КонецЕсли;
+
+ СтруктураПоиска = СтруктураПоискаПредыдущихСостояний();
+
+ ТаблицаСостоянийЗадач = ТаблицаСостоянийЗадач(МассивСсылок);
+ ТаблицаПредыдущихСостоянийЗадач = ТаблицаПредыдущихСостоянийЗадач(МассивСсылок);
+
+ Для Каждого СтрокаТаблицы Из ТаблицаСостоянийЗадач Цикл
+
+ ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТаблицы);
+ МассивДействующихСостояний = ТаблицаПредыдущихСостоянийЗадач.НайтиСтроки(СтруктураПоиска);
+
+ СостояниеИзменено = НЕ Булево(МассивДействующихСостояний.Количество());
+
+ Если СостояниеИзменено Тогда
+
+ НаборЗаписей = РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.СоздатьНаборЗаписей();
+ НаборЗаписей.Отбор.Задача.Установить(СтрокаТаблицы.Задача);
+
+ Если Не ЭтоПустаяЗапись(СтрокаТаблицы) Тогда
+ СтрокаНабора = НаборЗаписей.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрокаНабора, СтрокаТаблицы);
+ КонецЕсли;
+
+ Попытка
+ Если Очередь <> Неопределено Тогда
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
+ Иначе
+ НаборЗаписей.Записать(Истина);
+ КонецЕсли;
+ Исключение
+ ТекстСообщения = НСтр("ru = 'Не удалось отразить состояние взаимодействий по задаче: %Ссылка% по причине: %Причина%'");
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", СтрокаТаблицы.Задача);
+ ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,
+ Метаданные.Справочники.узЗадачи, СтрокаТаблицы.Задача, ТекстСообщения);
+ КонецПопытки;
+
+ ИначеЕсли Очередь <> Неопределено Тогда
+
+ НаборЗаписей = РегистрыСведений.узСостояниеВзаимодействийПоЗадачам.СоздатьНаборЗаписей();
+ НаборЗаписей.Отбор.Задача.Установить(СтрокаТаблицы.Задача);
+
+ ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(НаборЗаписей);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ТаблицаСостоянийЗадач(МассивЗадач)
+
+ ПакетЗапросов = Новый Массив;
+ ПакетЗапросов.Добавить(ТекстЗапросаКоличестваФайловЗадачи());
+ ПакетЗапросов.Добавить(ТекстЗапросаИнформацииОПисьмах("Входящее"));
+ ПакетЗапросов.Добавить(ТекстЗапросаИнформацииОПисьмах("Исходящее"));
+ ПакетЗапросов.Добавить(ТекстЗапросаСостоянияЗадач());
+
+ ТекстЗапроса = СтрСоединить(ПакетЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов());
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = ТекстЗапроса;
+ Запрос.УстановитьПараметр("МассивЗадач", МассивЗадач);
+
+ ТаблицаСостояний = Запрос.Выполнить().Выгрузить();
+
+ Возврат ТаблицаСостояний;
+
+КонецФункции
+
+Функция ТаблицаПредыдущихСостоянийЗадач(МассивЗадач)
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("МассивЗадач", МассивЗадач);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | СостояниеВзаимодействий.Задача КАК Задача,
+ | СостояниеВзаимодействий.КоличествоПрисоединенныхФайлов КАК КоличествоПрисоединенныхФайлов,
+ | СостояниеВзаимодействий.КоличествоВходящихПисем КАК КоличествоВходящихПисем,
+ | СостояниеВзаимодействий.КоличествоИсходящихПисем КАК КоличествоИсходящихПисем,
+ | СостояниеВзаимодействий.ДатаПоследнегоВходящегоПисьма КАК ДатаПоследнегоВходящегоПисьма,
+ | СостояниеВзаимодействий.ДатаПоследнегоИсходящегоПисьма КАК ДатаПоследнегоИсходящегоПисьма,
+ | СостояниеВзаимодействий.КоличествоВложенийПисем КАК КоличествоВложенийПисем
+ |ИЗ
+ | РегистрСведений.узСостояниеВзаимодействийПоЗадачам КАК СостояниеВзаимодействий
+ |ГДЕ
+ | СостояниеВзаимодействий.Задача В(&МассивЗадач)";
+
+ Возврат Запрос.Выполнить().Выгрузить();
+
+КонецФункции
+
+Функция ТекстЗапросаКоличестваФайловЗадачи()
+
+ ТекстЗапроса =
+ "ВЫБРАТЬ
+ | ФайлыЗадач.ВладелецФайла КАК Задача,
+ | КОЛИЧЕСТВО(*) КАК Количество
+ |ПОМЕСТИТЬ ВтПрисоединенныеФайлы
+ |ИЗ
+ | ЗадачиПрисоединенныеФайлы КАК ФайлыЗадач
+ |ГДЕ
+ | ФайлыЗадач.ВладелецФайла В(&МассивЗадач)
+ | И &ЭтоГруппа = ЛОЖЬ
+ | И &ЭтоСлужебный = ЛОЖЬ
+ |
+ |СГРУППИРОВАТЬ ПО
+ | ФайлыЗадач.ВладелецФайла
+ |
+ |ИНДЕКСИРОВАТЬ ПО
+ | Задача";
+
+ ПустаяСсылка = Справочники.узЗадачи.ПустаяСсылка();
+ ИмяСправочникаФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов(ПустаяСсылка);
+ МетаданныеСправочникаФайлов = Метаданные.Справочники[ИмяСправочникаФайлов];
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ЗадачиПрисоединенныеФайлы",
+ МетаданныеСправочникаФайлов.ПолноеИмя());
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоГруппа",
+ ?(МетаданныеСправочникаФайлов.Иерархический, "ФайлыЗадач.ЭтоГруппа", "ЛОЖЬ"));
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоСлужебный",
+ ?(ОбщегоНазначения.ЕстьРеквизитОбъекта("Служебный", МетаданныеСправочникаФайлов), "ФайлыЗадач.Служебный", "ЛОЖЬ"));
+
+ Возврат ТекстЗапроса;
+
+КонецФункции
+
+Функция ТекстЗапросаИнформацииОПисьмах(НаправлениеПисьма)
+
+ ТекстЗапроса =
+ "ВЫБРАТЬ
+ | ВЫРАЗИТЬ(ПредметыВзаимодействий.Предмет КАК Справочник.узЗадачи) КАК Задача,
+ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЭлектронноеПисьмо.Ссылка) КАК КоличествоПисем,
+ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенияПисьма.Ссылка) КАК КоличествоВложений,
+ | МАКСИМУМ(ЭлектронноеПисьмо.Дата) КАК ДатаПоследнегоПисьма
+ |ПОМЕСТИТЬ ВтВзаимодействие
+ |ИЗ
+ | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий
+ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокументЭлектронноеПисьмо КАК ЭлектронноеПисьмо
+ | ПО ПредметыВзаимодействий.Взаимодействие = ЭлектронноеПисьмо.Ссылка
+ | ЛЕВОЕ СОЕДИНЕНИЕ ЭлектронноеПисьмоПрисоединенныеФайлы КАК ВложенияПисьма
+ | ПО ПредметыВзаимодействий.Взаимодействие = ВложенияПисьма.ВладелецФайла
+ | И &ЭтоГруппа = ЛОЖЬ
+ | И &ЭтоСлужебный = ЛОЖЬ
+ |ГДЕ
+ | ПредметыВзаимодействий.Предмет В(&МассивЗадач)
+ |
+ |СГРУППИРОВАТЬ ПО
+ | ПредметыВзаимодействий.Предмет
+ |
+ |ИНДЕКСИРОВАТЬ ПО
+ | Задача";
+
+ ИмяДокументаПисьма = "ЭлектронноеПисьмо" + НаправлениеПисьма;
+ ПустаяСсылка = Документы[ИмяДокументаПисьма].ПустаяСсылка();
+ ИмяСправочникаФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов(ПустаяСсылка);
+ МетаданныеСправочникаФайлов = Метаданные.Справочники[ИмяСправочникаФайлов];
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВтВзаимодействие",
+ "ВтВзаимодействие" + НаправлениеПисьма);
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДокументЭлектронноеПисьмо",
+ "Документ." + ИмяДокументаПисьма);
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ЭлектронноеПисьмо.Дата",
+ ?(НаправлениеПисьма = "Входящее", "ЭлектронноеПисьмо.ДатаПолучения", "ЭлектронноеПисьмо.ДатаОтправления"));
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ЭлектронноеПисьмоПрисоединенныеФайлы",
+ МетаданныеСправочникаФайлов.ПолноеИмя());
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоГруппа",
+ ?(МетаданныеСправочникаФайлов.Иерархический, "ВложенияПисьма.ЭтоГруппа", "ЛОЖЬ"));
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоСлужебный",
+ ?(ОбщегоНазначения.ЕстьРеквизитОбъекта("Служебный", МетаданныеСправочникаФайлов), "ВложенияПисьма.Служебный", "ЛОЖЬ"));
+
+ Возврат ТекстЗапроса;
+
+КонецФункции
+
+Функция ТекстЗапросаСостоянияЗадач()
+
+ ТекстЗапроса =
+ "ВЫБРАТЬ
+ | СправочникЗадач.Ссылка КАК Задача,
+ | ЕСТЬNULL(ВтПрисоединенныеФайлы.Количество, 0) КАК КоличествоПрисоединенныхФайлов,
+ | ЕСТЬNULL(ВтВзаимодействиеВходящее.КоличествоПисем, 0) КАК КоличествоВходящихПисем,
+ | ЕСТЬNULL(ВтВзаимодействиеИсходящее.КоличествоПисем, 0) КАК КоличествоИсходящихПисем,
+ | ЕСТЬNULL(ВтВзаимодействиеВходящее.ДатаПоследнегоПисьма, ДАТАВРЕМЯ(1,1,1)) КАК ДатаПоследнегоВходящегоПисьма,
+ | ЕСТЬNULL(ВтВзаимодействиеИсходящее.ДатаПоследнегоПисьма, ДАТАВРЕМЯ(1,1,1)) КАК ДатаПоследнегоИсходящегоПисьма,
+ | ЕСТЬNULL(ВтВзаимодействиеВходящее.КоличествоВложений, 0) + ЕСТЬNULL(ВтВзаимодействиеИсходящее.КоличествоВложений, 0) КАК КоличествоВложенийПисем
+ |ИЗ
+ | Справочник.узЗадачи КАК СправочникЗадач
+ | ЛЕВОЕ СОЕДИНЕНИЕ ВтПрисоединенныеФайлы КАК ВтПрисоединенныеФайлы
+ | ПО СправочникЗадач.Ссылка = ВтПрисоединенныеФайлы.Задача
+ | ЛЕВОЕ СОЕДИНЕНИЕ ВтВзаимодействиеВходящее КАК ВтВзаимодействиеВходящее
+ | ПО СправочникЗадач.Ссылка = ВтВзаимодействиеВходящее.Задача
+ | ЛЕВОЕ СОЕДИНЕНИЕ ВтВзаимодействиеИсходящее КАК ВтВзаимодействиеИсходящее
+ | ПО СправочникЗадач.Ссылка = ВтВзаимодействиеИсходящее.Задача
+ |ГДЕ
+ | СправочникЗадач.Ссылка В(&МассивЗадач)";
+
+ Возврат ТекстЗапроса;
+
+КонецФункции
+
+Функция СтруктураПоискаПредыдущихСостояний()
+
+ СтруктураПоиска = Новый Структура;
+
+ МетаданныеРегистра = Метаданные.РегистрыСведений.узСостояниеВзаимодействийПоЗадачам;
+
+ Для каждого Поле Из МетаданныеРегистра.Измерения Цикл
+ СтруктураПоиска.Вставить(Поле.Имя);
+ КонецЦикла;
+
+ Для каждого Поле Из МетаданныеРегистра.Ресурсы Цикл
+ СтруктураПоиска.Вставить(Поле.Имя);
+ КонецЦикла;
+
+ Возврат СтруктураПоиска;
+
+КонецФункции
+
+Функция ЭтоПустаяЗапись(ЗаписьНабора)
+
+ Возврат ЗаписьНабора.КоличествоПрисоединенныхФайлов = 0
+ И ЗаписьНабора.КоличествоВходящихПисем = 0
+ И ЗаписьНабора.КоличествоИсходящихПисем = 0;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецЕсли
diff --git a/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам/Ext/RecordSetModule.bsl b/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам/Ext/RecordSetModule.bsl
new file mode 100644
index 000000000..bc5fed613
--- /dev/null
+++ b/src/cf/InformationRegisters/узСостояниеВзаимодействийПоЗадачам/Ext/RecordSetModule.bsl
@@ -0,0 +1,17 @@
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
+#Область ОбработчикиСобытий
+
+Процедура ПередЗаписью(Отказ, Замещение)
+
+ Если ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецЕсли
diff --git a/src/cf/Roles/узПолныеПрава/Ext/Rights.xml b/src/cf/Roles/узПолныеПрава/Ext/Rights.xml
index 17e96a0b3..3445f2011 100644
--- a/src/cf/Roles/узПолныеПрава/Ext/Rights.xml
+++ b/src/cf/Roles/узПолныеПрава/Ext/Rights.xml
@@ -6507,6 +6507,65 @@
true
+
+
+
+