This commit is contained in:
Компания 1С committed 2022-04-29 12:36:00 +03:00
1 parent 84cf7f3c95
commit 05491df6f5
164 files changed
+8402 -2769

No files matched your search

@@ -182,6 +182,23 @@
КонецПроцедуры КонецПроцедуры
// Возвращаемое значение:
// ФиксированнаяСтруктура
//
Функция УстановленныеРасширенияПриЗапуске() Экспорт
Результат = Новый Структура;
Результат.Вставить("Основные", "");
Результат.Вставить("Исправления", "");
Результат.Вставить("ОсновныеСостояние", "");
Результат.Вставить("ИсправленияСостояние", "");
ЗаполнитьЗначенияСвойств(Результат, ПараметрыСеанса.УстановленныеРасширения);
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// Возвращает признак изменения состава расширений после запуска сеанса. // Возвращает признак изменения состава расширений после запуска сеанса.
// //
// Возвращаемое значение: // Возвращаемое значение:
@@ -193,9 +210,11 @@
УстановленныеРасширения = УстановленныеРасширения(); УстановленныеРасширения = УстановленныеРасширения();
БезИзменений = ПараметрыСеанса.УстановленныеРасширения.Свойство("РасширенияНедоступны") УстановленныеРасширенияПриЗапуске = УстановленныеРасширенияПриЗапуске();
Или ПараметрыСеанса.УстановленныеРасширения.ОсновныеСостояние = УстановленныеРасширения.ОсновныеСостояние
И ПараметрыСеанса.УстановленныеРасширения.ИсправленияСостояние = УстановленныеРасширения.ИсправленияСостояние; БезИзменений = УстановленныеРасширенияПриЗапуске.Свойство("РасширенияНедоступны")
Или УстановленныеРасширенияПриЗапуске.ОсновныеСостояние = УстановленныеРасширения.ОсновныеСостояние
И УстановленныеРасширенияПриЗапуске.ИсправленияСостояние = УстановленныеРасширения.ИсправленияСостояние;
ЗарегистрироватьИзменениеУстановленныхРасширений(УстановленныеРасширения, БезИзменений); ЗарегистрироватьИзменениеУстановленныхРасширений(УстановленныеРасширения, БезИзменений);
@@ -205,6 +224,10 @@
// Возвращает информацию по измененным расширениям и исправлениям. // Возвращает информацию по измененным расширениям и исправлениям.
// //
// Параметры:
// УстановленныеРасширенияПриЗапуске - см. УстановленныеРасширенияПриЗапуске
// - Неопределено - получить для текущего сеанса.
//
// Возвращаемое значение: // Возвращаемое значение:
// Структура: // Структура:
// * Расширения - Структура: // * Расширения - Структура:
@@ -214,7 +237,7 @@
// * Добавлено - Число // * Добавлено - Число
// * Удалено - Число // * Удалено - Число
// //
Функция ДинамическиИзмененныеРасширения() Экспорт Функция ДинамическиИзмененныеРасширения(УстановленныеРасширенияПриЗапуске = Неопределено) Экспорт
Результат = Новый Структура; Результат = Новый Структура;
Результат.Вставить("Расширения", Неопределено); Результат.Вставить("Расширения", Неопределено);
@@ -224,23 +247,32 @@
УстановленныеРасширения = УстановленныеРасширения(); УстановленныеРасширения = УстановленныеРасширения();
БезИзменений = ПараметрыСеанса.УстановленныеРасширения.Свойство("РасширенияНедоступны") Если УстановленныеРасширенияПриЗапуске = Неопределено Тогда
Или ПараметрыСеанса.УстановленныеРасширения.ОсновныеСостояние = УстановленныеРасширения.ОсновныеСостояние ПроверкаВТекущемСеансе = Истина;
И ПараметрыСеанса.УстановленныеРасширения.ИсправленияСостояние = УстановленныеРасширения.ИсправленияСостояние; УстановленныеРасширенияПриЗапуске = УстановленныеРасширенияПриЗапуске();
Иначе
ПроверкаВТекущемСеансе = Ложь;
КонецЕсли;
ЗарегистрироватьИзменениеУстановленныхРасширений(УстановленныеРасширения, БезИзменений); БезИзменений = УстановленныеРасширенияПриЗапуске.Свойство("РасширенияНедоступны")
Или УстановленныеРасширенияПриЗапуске.ОсновныеСостояние = УстановленныеРасширения.ОсновныеСостояние
И УстановленныеРасширенияПриЗапуске.ИсправленияСостояние = УстановленныеРасширения.ИсправленияСостояние;
Если ПроверкаВТекущемСеансе Тогда
ЗарегистрироватьИзменениеУстановленныхРасширений(УстановленныеРасширения, БезИзменений);
КонецЕсли;
Если БезИзменений Тогда Если БезИзменений Тогда
Возврат Результат; Возврат Результат;
КонецЕсли; КонецЕсли;
Если ПараметрыСеанса.УстановленныеРасширения.ИсправленияСостояние <> УстановленныеРасширения.ИсправленияСостояние Тогда Если УстановленныеРасширенияПриЗапуске.ИсправленияСостояние <> УстановленныеРасширения.ИсправленияСостояние Тогда
Изменения = ИзмененияВСоставеРасширений(ПараметрыСеанса.УстановленныеРасширения.Исправления, УстановленныеРасширения.Исправления); Изменения = ИзмененияВСоставеРасширений(УстановленныеРасширенияПриЗапуске.Исправления, УстановленныеРасширения.Исправления);
Результат.Исправления = Изменения; Результат.Исправления = Изменения;
КонецЕсли; КонецЕсли;
Если ПараметрыСеанса.УстановленныеРасширения.ОсновныеСостояние <> УстановленныеРасширения.ОсновныеСостояние Тогда Если УстановленныеРасширенияПриЗапуске.ОсновныеСостояние <> УстановленныеРасширения.ОсновныеСостояние Тогда
Изменения = ИзмененияВСоставеРасширений(ПараметрыСеанса.УстановленныеРасширения.ОсновныеСостояние, УстановленныеРасширения.ОсновныеСостояние); Изменения = ИзмененияВСоставеРасширений(УстановленныеРасширенияПриЗапуске.ОсновныеСостояние, УстановленныеРасширения.ОсновныеСостояние);
Результат.Расширения = Изменения; Результат.Расширения = Изменения;
КонецЕсли; КонецЕсли;
@@ -112,8 +112,6 @@
Ссылка, СтарыйОбъектАвторизации, ОбъектАвторизации); Ссылка, СтарыйОбъектАвторизации, ОбъектАвторизации);
КонецЕсли; КонецЕсли;
ПользователиСлужебный.ВключитьЗаданиеКонтрольАктивностиПользователейПриНеобходимости(Ссылка);
ИнтеграцияПодсистемБСП.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый); ИнтеграцияПодсистемБСП.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый);
КонецПроцедуры КонецПроцедуры
@@ -123,8 +123,6 @@
ПользователиСлужебный.ПослеОбновленияСоставовГруппПользователей( ПользователиСлужебный.ПослеОбновленияСоставовГруппПользователей(
УчастникиИзменений, ИзмененныеГруппы); УчастникиИзменений, ИзмененныеГруппы);
ПользователиСлужебный.ВключитьЗаданиеКонтрольАктивностиПользователейПриНеобходимости(Ссылка);
ИнтеграцияПодсистемБСП.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый); ИнтеграцияПодсистемБСП.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый);
КонецПроцедуры КонецПроцедуры
@@ -281,7 +281,7 @@
</extInfo> </extInfo>
</items> </items>
<items xsi:type="form:FormGroup"> <items xsi:type="form:FormGroup">
<name>ГруппаАдресацииЗадач</name> <name>ГруппаАдресации</name>
<id>23</id> <id>23</id>
<items xsi:type="form:FormField"> <items xsi:type="form:FormField">
<name>ИспользуетсяБезКонтекстаДругихИзмеренийАдресации</name> <name>ИспользуетсяБезКонтекстаДругихИзмеренийАдресации</name>
@@ -566,7 +566,7 @@
<value>Адресация задач исполнителям</value> <value>Адресация задач исполнителям</value>
</title> </title>
<extendedTooltip> <extendedTooltip>
<name>ГруппаАдресацииЗадачРасширеннаяПодсказка</name> <name>ГруппаАдресацииExtendedTooltip</name>
<id>47</id> <id>47</id>
<type>Label</type> <type>Label</type>
<autoMaxWidth>true</autoMaxWidth> <autoMaxWidth>true</autoMaxWidth>
@@ -11,7 +11,7 @@
&НаСервере &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ГруппаАдресацииЗадач.Доступность = НЕ Объект.Предопределенный; Элементы.ГруппаАдресации.Доступность = НЕ Объект.Предопределенный;
Если НЕ Объект.Предопределенный Тогда Если НЕ Объект.Предопределенный Тогда
Элементы.ГруппаТипыОбъектовАдресации.Доступность = Объект.ИспользуетсяСОбъектамиАдресации; Элементы.ГруппаТипыОбъектовАдресации.Доступность = Объект.ИспользуетсяСОбъектамиАдресации;
КонецЕсли; КонецЕсли;
@@ -313,7 +313,7 @@
</userVisible> </userVisible>
<title> <title>
<key>ru</key> <key>ru</key>
<value>Группа отозван</value> <value>Отозван</value>
</title> </title>
<extendedTooltip> <extendedTooltip>
<name>ГруппаОтозванРасширеннаяПодсказка</name> <name>ГруппаОтозванРасширеннаяПодсказка</name>
@@ -3,43 +3,27 @@
<p>Список можно открыть соответствующей командой в разделе <strong>Администрирование - Органайзер</strong>. </p> <p>Список можно открыть соответствующей командой в разделе <strong>Администрирование - Органайзер</strong>. </p>
<p>В списке выводится:</p> <p>В списке выводится:</p>
<ul><li><strong>Наименование</strong> учетной записи; <ul><li><strong>Наименование</strong> учетной записи;
</li> </li><li><strong>Имя пользователя</strong> - указывается имя отправителя писем, оно может отличаться от имени <a href="Catalog.Пользователи.Form.ФормаЭлемента/Help">пользователя</a> в программе;
<li><strong>Имя пользователя</strong> - указывается имя отправителя писем, оно может отличаться от имени <a href="Catalog.Пользователи.Form.ФормаЭлемента/Help">пользователя</a> в программе; </li><li><strong>Адрес электронной почты </strong>учетной записи в формате <a href="mailto:name@server.net">name@server.net</a>. </li></ul><p>Для учетных записей, получение и отправка с которых выполняется автоматически без участия пользователя, должен быть обязательно введен пароль. Также для корректной работы программы обязательно должна быть настроена системная учетная запись электронной почты.</p>
</li>
<li><strong>Адрес электронной почты </strong>учетной записи в формате <a href="mailto:name@server.net">name@server.net</a>. </li></ul><p>Для учетных записей, получение и отправка с которых выполняется автоматически без участия пользователя, должен быть обязательно введен пароль. Также для корректной работы программы обязательно должна быть настроена системная учетная запись электронной почты.</p>
<h3>Системная учетная запись электронной почты</h3> <h3>Системная учетная запись электронной почты</h3>
<ul><li>Программа поставляется с предопределенной учетной записью - системной учетной записью электронной почты. Она используется по умолчанию для рассылки различных уведомлений из программы, например, для автоматической отправки сообщений администратору по завершению обновления программы. Перед использованием этих возможностей необходимо <a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">настроить</a> системную учетную запись. <ul><li>Программа поставляется с предопределенной учетной записью - системной учетной записью электронной почты. Она используется по умолчанию для рассылки различных уведомлений из программы, например, для автоматической отправки сообщений администратору по завершению обновления программы. Перед использованием этих возможностей необходимо <a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">настроить</a> системную учетную запись.
</li> </li><li>Настройка системной учетной записи производится по соответствующей команде в разделе <strong>Администрирование - Органайзер</strong>. Также можно <img src="StdPicture.Change"></img><strong>Изменить</strong> ее в списке.</li></ul><h3>Ввод учетной записи электронной почты</h3>
<li>Настройка системной учетной записи производится по соответствующей команде в разделе <strong>Администрирование - Органайзер</strong>. Также можно <img src="StdPicture.Change"></img><strong>Изменить</strong> ее в списке.</li></ul><h3>Ввод учетной записи электронной почты</h3>
<ul><li>При попытке сохранения программа проверяет введенные учетные записи электронной почты (пытается отослать пробное сообщение). Учетные записи, не прошедшие проверку, не сохраняются. <ul><li>При попытке сохранения программа проверяет введенные учетные записи электронной почты (пытается отослать пробное сообщение). Учетные записи, не прошедшие проверку, не сохраняются.
</li> </li><li>Нажмите <strong>Создать</strong>, введите необходимые поля:
<li>Нажмите <strong>Создать</strong>, введите необходимые поля:
<ul><li>Укажите <strong>Адрес почты</strong> учетной записи в формате <a href="mailto:name@server.net">name@server.net</a>; <ul><li>Укажите <strong>Адрес почты</strong> учетной записи в формате <a href="mailto:name@server.net">name@server.net</a>;
</li> </li><li>Введите <strong>Пароль</strong> учетной записи;
<li>С помощью переключателя выберите способ авторизации:</li> </li><li>Установите с помощью флажков, как <strong>Использовать учетную запись</strong>:
<ul><li><b>Ввести пароль</b>, в этом случае укажите в поле справа <strong>Пароль</strong> учетной записи; <ul><li><strong>Для отправки почты</strong>;
</li> </li><li><strong>Для получения почты</strong>;</li></ul></li><li>Укажите, <strong>Для кого учетная запись</strong>:
<li><b>Авторизоваться на почтовом сервисе</b>, в этом случае программа выводит инструкцию авторизации, которая зависит от почтового сервиса. Следуйте инструкции программы.</li> <ul><li><strong>Для всех</strong>;
<ul><li>На почтовом сервисе потребуется указать данные о приложении, например, <b>callback URL</b>, который программа формирует автоматически.</li> </li><li><strong>Только для меня</strong>.</li></ul></li><li>Укажите <strong>Имя отправителя</strong> (Ваше имя или название организации);
<li>Воспользовавшись указаниями почтового сервиса, зарегистрируйте приложение, получите данные для авторизации и заполните нужные поля, например: </li> </li><li>С помощью переключателя определите способ создания учетной записи:
<ul><ul><ul><li><b>ID приложения</b>;</li> <ul><li><strong>Определить параметры подключения автоматически</strong> (рекомендуется);
<li><b>пароль приложения (client secret)</b>.</li></ul></ul></ul></ul></ul><li>Установите с помощью флажков, как <strong>Почта будет использоваться</strong>: <ul><li>Нажмите <strong>Создать</strong>. Программа предпримет попытку автоматической настройки и проверки учетной записи. Следуйте указаниям программы. При этом если при автоматической настройке произошел сбой, можно попытаться настроить параметры вручную. </li></ul></li><li><strong>Настроить параметры подключения вручную</strong>;</li></ul></li><li>
<ul><li><strong>Для отправки писем</strong>; <p>Нажмите <strong>Далее</strong> для заполнения остальных параметров, при этом программа проставляет рекомендуемые параметры для большинства почтовых серверов. Их требуется только проверить и попытаться сохранить учетную запись заново.</p></li></ul></li></ul><h3>Настройка учетной записи электронной почты</h3>
</li>
<li><strong>Для получения писем</strong>;</li></ul></li>
<li>Укажите с помощью переключателя, кем будет использоваться почта:
<ul><li><strong>Всеми пользователями (общая почта)</strong></li>
<li><strong>Только мной</strong>.</li></ul></li>
<li>Укажите <strong>Имя отправителя</strong> (Ваше имя или название организации);
</li></ul></li>
<li>Нажмите <strong>Создать</strong>. Программа предпримет попытку автоматической настройки и проверки учетной записи. Следуйте указаниям программы. При этом если при автоматической настройке произошел сбой, можно попытаться настроить параметры вручную. </li>
<li>Если автоматически настроить почту не удалось, нажмите <b>На</b><strong>строить вручную</strong>.</li>
<ul><li>
<p>Нажмите <strong>Далее</strong> для заполнения остальных параметров, при этом программа проставляет рекомендуемые параметры для большинства почтовых серверов. Их требуется только проверить и попытаться сохранить учетную запись заново.</p></li></ul></ul><h3>Настройка учетной записи электронной почты</h3>
<ul><li>Нажмите <img src="StdPicture.Change" width="16" height="16"></img> <strong>Изменить</strong>, с помощью программы произведите необходимые <a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">настройки</a>.</li></ul><h3>Проверка учетной записи электронной почты</h3> <ul><li>Нажмите <img src="StdPicture.Change" width="16" height="16"></img> <strong>Изменить</strong>, с помощью программы произведите необходимые <a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">настройки</a>.</li></ul><h3>Проверка учетной записи электронной почты</h3>
<ul><li> <ul><li>
<div>Выделите учетную запись в списке, нажмите <strong>Еще - Проверить учетную запись</strong> для проверки введенных параметров учетной записи. При этом отправляется стандартное почтовое отправление и проверяется возможность соединения с сервером входящих почтовых сообщений (если учетная запись используется для получения почты).</div> <div>Выделите учетную запись в списке, нажмите <strong>Еще - Проверить учетную запись</strong> для проверки введенных параметров учетной записи. При этом отправляется стандартное почтовое отправление и проверяется возможность соединения с сервером входящих почтовых сообщений (если учетная запись используется для получения почты).</div>
</li> </li><li>
<li>
<div>Если в учетной записи не прописан пароль, программа его запрашивает. При необходимости введите пароль.</div></li></ul><h3>См. также: </h3> <div>Если в учетной записи не прописан пароль, программа его запрашивает. При необходимости введите пароль.</div></li></ul><h3>См. также: </h3>
<ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> <ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html>
@@ -56,6 +56,10 @@
<metadata>InformationRegister.СостоянияУспешныхОбменовДаннымиОбластейДанных</metadata> <metadata>InformationRegister.СостоянияУспешныхОбменовДаннымиОбластейДанных</metadata>
<use>Use</use> <use>Use</use>
</content> </content>
<content>
<metadata>InformationRegister.ПериодическиеСерверныеОповещения</metadata>
<use>Use</use>
</content>
<content> <content>
<metadata>InformationRegister.СообщенияОбменаДаннымиОбластейДанных</metadata> <metadata>InformationRegister.СообщенияОбменаДаннымиОбластейДанных</metadata>
<use>Use</use> <use>Use</use>
@@ -64,6 +68,10 @@
<metadata>InformationRegister.ОчередьИнсталляцииПоставляемыхДополнительныхОтчетовИОбработокВОбластиДанных</metadata> <metadata>InformationRegister.ОчередьИнсталляцииПоставляемыхДополнительныхОтчетовИОбработокВОбластиДанных</metadata>
<use>Use</use> <use>Use</use>
</content> </content>
<content>
<metadata>InformationRegister.ОтправленныеСерверныеОповещения</metadata>
<use>Use</use>
</content>
<content> <content>
<metadata>Constant.СведенияОбОбновленииИБ</metadata> <metadata>Constant.СведенияОбОбновленииИБ</metadata>
<use>Use</use> <use>Use</use>
@@ -295,11 +295,11 @@
<use>DontUse</use> <use>DontUse</use>
</content> </content>
<content> <content>
<metadata>ScheduledJob.ОтложенноеОбновлениеИБ</metadata> <metadata>ScheduledJob.ОтправкаСерверныхОповещенийКлиентам</metadata>
<use>DontUse</use> <use>DontUse</use>
</content> </content>
<content> <content>
<metadata>ScheduledJob.КонтрольАктивностиПользователей</metadata> <metadata>ScheduledJob.ОтложенноеОбновлениеИБ</metadata>
<use>DontUse</use> <use>DontUse</use>
</content> </content>
<content> <content>
@@ -558,6 +558,10 @@
<metadata>Constant.СписокЗапрещенныхРасширений</metadata> <metadata>Constant.СписокЗапрещенныхРасширений</metadata>
<use>DontUse</use> <use>DontUse</use>
</content> </content>
<content>
<metadata>InformationRegister.ПериодическиеСерверныеОповещения</metadata>
<use>DontUse</use>
</content>
<content> <content>
<metadata>InformationRegister.СвязиАдресныхОбъектов</metadata> <metadata>InformationRegister.СвязиАдресныхОбъектов</metadata>
<use>DontUse</use> <use>DontUse</use>
@@ -590,6 +594,10 @@
<metadata>InformationRegister.БуферОперацийСтатистики</metadata> <metadata>InformationRegister.БуферОперацийСтатистики</metadata>
<use>DontUse</use> <use>DontUse</use>
</content> </content>
<content>
<metadata>InformationRegister.ОтправленныеСерверныеОповещения</metadata>
<use>DontUse</use>
</content>
<content> <content>
<metadata>Constant.ПараметрыЦентраМониторинга</metadata> <metadata>Constant.ПараметрыЦентраМониторинга</metadata>
<use>DontUse</use> <use>DontUse</use>
@@ -8,8 +8,6 @@
#Область ОписаниеПеременных #Область ОписаниеПеременных
&НаКлиенте
Перем ИнтервалОжидания;
&НаКлиенте &НаКлиенте
Перем ФормаЗакрывается; Перем ФормаЗакрывается;
@@ -47,8 +45,23 @@
Процедура ПриОткрытии(Отказ) Процедура ПриОткрытии(Отказ)
Если Параметры.ВыводитьОкноОжидания Тогда Если Параметры.ВыводитьОкноОжидания Тогда
ИнтервалОжидания = ?(Параметры.Интервал <> 0, Параметры.Интервал, 1); ФормаЗакрывается = Ложь;
ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", ИнтервалОжидания, Истина); Статус = "Выполняется";
ДлительнаяОперация = Новый Структура;
ДлительнаяОперация.Вставить("Статус", Статус);
ДлительнаяОперация.Вставить("ИдентификаторЗадания", Параметры.ИдентификаторЗадания);
ДлительнаяОперация.Вставить("Сообщения", Новый ФиксированныйМассив(Новый Массив));
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПриЗавершенииДлительнойОперации", ЭтотОбъект);
ОповещениеОПрогрессе = Новый ОписаниеОповещения("ПриПолученииПрогрессаДлительнойОперации", ЭтотОбъект);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ПараметрыОжидания.Интервал = Параметры.Интервал;
ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессе;
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -56,8 +69,6 @@
&НаКлиенте &НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
Если Статус <> "Выполняется" Тогда Если Статус <> "Выполняется" Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
@@ -74,6 +85,9 @@
&НаКлиенте &НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы) Процедура ПриЗакрытии(ЗавершениеРаботы)
ФормаЗакрывается = Истина;
ОтключитьОбработчикОжидания("Подключаемый_ОтменитьЗадание");
Если ЗавершениеРаботы Тогда Если ЗавершениеРаботы Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
@@ -82,7 +96,7 @@
Возврат; Возврат;
КонецЕсли; КонецЕсли;
ОтменитьВыполнениеЗадания(); ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
КонецПроцедуры КонецПроцедуры
@@ -91,63 +105,91 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
&НаКлиенте &НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания() Процедура ПриПолученииПрогрессаДлительнойОперации(ДлительнаяОперация, ДополнительныеПараметры) Экспорт
Задание = ПроверитьЗаданиеВыполнено(ФормаЗакрывается); Если ФормаЗакрывается Или Не Открыта() Тогда
Статус = Задание.Статус; Возврат;
КонецЕсли;
Если Задание.Прогресс <> Неопределено Тогда Если Параметры.ВыводитьПрогрессВыполнения
И ДлительнаяОперация.Прогресс <> Неопределено Тогда
Процент = 0; Процент = 0;
Если Задание.Прогресс.Свойство("Процент", Процент) Тогда Если ДлительнаяОперация.Прогресс.Свойство("Процент", Процент) Тогда
Элементы.ДекорацияПроцент.Видимость = Истина; Элементы.ДекорацияПроцент.Видимость = Истина;
Элементы.ДекорацияПроцент.Заголовок = Строка(Процент) + "%"; Элементы.ДекорацияПроцент.Заголовок = Строка(Процент) + "%";
КонецЕсли; КонецЕсли;
Текст = ""; Текст = "";
Если Задание.Прогресс.Свойство("Текст", Текст) Тогда Если ДлительнаяОперация.Прогресс.Свойство("Текст", Текст) Тогда
Элементы.ДекорацияПоясняющийТекстДлительнойОперации.Заголовок = СокрЛП(Текст); Элементы.ДекорацияПоясняющийТекстДлительнойОперации.Заголовок = СокрЛП(Текст);
КонецЕсли; КонецЕсли;
КонецЕсли; КонецЕсли;
Если Задание.Сообщения <> Неопределено И ВладелецФормы <> Неопределено Тогда Если Параметры.ВыводитьСообщения
И ДлительнаяОперация.Сообщения <> Неопределено
И ВладелецФормы <> Неопределено Тогда
ИдентификаторНазначения = ВладелецФормы.УникальныйИдентификатор; ИдентификаторНазначения = ВладелецФормы.УникальныйИдентификатор;
Для каждого СообщениеПользователю Из Задание.Сообщения Цикл Для Каждого СообщениеПользователю Из ДлительнаяОперация.Сообщения Цикл
СообщениеПользователю.ИдентификаторНазначения = ИдентификаторНазначения; СообщениеПользователю.ИдентификаторНазначения = ИдентификаторНазначения;
СообщениеПользователю.Сообщить(); СообщениеПользователю.Сообщить();
КонецЦикла; КонецЦикла;
Задание.Сообщения = Новый ФиксированныйМассив(Новый Массив); КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗавершенииДлительнойОперации(ДлительнаяОперация, ДополнительныеПараметры) Экспорт
Если ФормаЗакрывается Или Не Открыта() Тогда
Возврат;
КонецЕсли;
ЗавершитьДлительнуюОперациюИЗакрытьФорму(ДлительнаяОперация);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьДлительнуюОперациюИЗакрытьФорму(ДлительнаяОперация)
Если ДлительнаяОперация = Неопределено Тогда
Статус = "Отменено";
Иначе
Статус = ДлительнаяОперация.Статус;
КонецЕсли;
Если Статус = "Отменено" Тогда
Закрыть(Неопределено);
Возврат;
КонецЕсли;
Если Параметры.ПолучатьРезультат Тогда
Если Статус = "Выполнено" Тогда
ДлительнаяОперация.Вставить("Результат", ПолучитьИзВременногоХранилища(Параметры.АдресРезультата));
Иначе
ДлительнаяОперация.Вставить("Результат", Неопределено);
КонецЕсли;
КонецЕсли; КонецЕсли;
Если Статус = "Выполнено" Тогда Если Статус = "Выполнено" Тогда
ПоказатьОповещение(); ПоказатьОповещение();
Если ВозвращатьРезультатВОбработкуВыбора() Тогда Если ВозвращатьРезультатВОбработкуВыбора() Тогда
ОповеститьОВыборе(Задание.Результат); ОповеститьОВыборе(ДлительнаяОперация.Результат);
Возврат; Возврат;
КонецЕсли; КонецЕсли;
Закрыть(РезультатВыполнения(Задание)); Результат = РезультатВыполнения(ДлительнаяОперация);
Возврат; Закрыть(Результат);
ИначеЕсли Статус = "Ошибка" Тогда ИначеЕсли Статус = "Ошибка" Тогда
Закрыть(РезультатВыполнения(Задание)); Результат = РезультатВыполнения(ДлительнаяОперация);
Закрыть(Результат);
Если ВозвращатьРезультатВОбработкуВыбора() Тогда Если ВозвращатьРезультатВОбработкуВыбора() Тогда
ВызватьИсключение Задание.КраткоеПредставлениеОшибки; ВызватьИсключение ДлительнаяОперация.КраткоеПредставлениеОшибки;
КонецЕсли; КонецЕсли;
Возврат;
КонецЕсли;
Если Параметры.ВыводитьОкноОжидания Тогда
Если Параметры.Интервал = 0 Тогда
ИнтервалОжидания = ИнтервалОжидания * 1.4;
Если ИнтервалОжидания > 15 Тогда
ИнтервалОжидания = 15;
КонецЕсли;
КонецЕсли;
ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", ИнтервалОжидания, Истина);
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -156,84 +198,57 @@
Процедура Подключаемый_ОтменитьЗадание() Процедура Подключаемый_ОтменитьЗадание()
ФормаЗакрывается = Истина; ФормаЗакрывается = Истина;
Подключаемый_ПроверитьВыполнениеЗадания(); // а вдруг задание уже выполнилось.
Если Статус = "Отменено" Тогда ДлительнаяОперация = ПроверитьИОтменитьЕслиВыполняется(ИдентификаторЗадания);
Статус = Неопределено; ЗавершитьДлительнуюОперациюИЗакрытьФорму(ДлительнаяОперация);
Если Открыта() Тогда
Закрыть(РезультатВыполнения(Неопределено));
КонецЕсли;
КонецЕсли;
КонецПроцедуры КонецПроцедуры
&НаКлиенте &НаКлиенте
Процедура ПоказатьОповещение() Процедура ПоказатьОповещение()
Если Параметры.ОповещениеПользователя = Неопределено Или Не Параметры.ОповещениеПользователя.Показать Тогда Если Параметры.ОповещениеПользователя = Неопределено Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
Оповещение = Параметры.ОповещениеПользователя; ДлительныеОперацииКлиент.ПоказатьОповещение(Параметры.ОповещениеПользователя, ВладелецФормы);
НавигационнаяСсылкаОповещения = Оповещение.НавигационнаяСсылка;
Если НавигационнаяСсылкаОповещения = Неопределено И ВладелецФормы <> Неопределено И ВладелецФормы.Окно <> Неопределено Тогда
НавигационнаяСсылкаОповещения = ВладелецФормы.Окно.ПолучитьНавигационнуюСсылку();
КонецЕсли;
ПояснениеОповещения = Оповещение.Пояснение;
Если ПояснениеОповещения = Неопределено И ВладелецФормы <> Неопределено И ВладелецФормы.Окно <> Неопределено Тогда
ПояснениеОповещения = ВладелецФормы.Окно.Заголовок;
КонецЕсли;
СтатусОповещения = Неопределено;
Если ТипЗнч(Оповещение.Важное) = Тип("Булево") Тогда
СтатусОповещения = ?(Оповещение.Важное, СтатусОповещенияПользователя.Важное, СтатусОповещенияПользователя.Информация);
КонецЕсли;
ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")),
НавигационнаяСсылкаОповещения, ПояснениеОповещения, Оповещение.Картинка, СтатусОповещения);
КонецПроцедуры КонецПроцедуры
&НаСервере &НаСервереБезКонтекста
Функция ПроверитьЗаданиеВыполнено(ФормаЗакрывается) Функция ПроверитьИОтменитьЕслиВыполняется(ИдентификаторЗадания)
Задание = ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания, Ложь, Параметры.ВыводитьПрогрессВыполнения, ДлительнаяОперация = ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания);
Параметры.ВыводитьСообщения);
Если Параметры.ПолучатьРезультат Тогда Если ДлительнаяОперация.Статус = "Выполняется" Тогда
Если Задание.Статус = "Выполнено" Тогда ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
Задание.Вставить("Результат", ПолучитьИзВременногоХранилища(Параметры.АдресРезультата)); ДлительнаяОперация.Статус = "Отменено";
Иначе
Задание.Вставить("Результат", Неопределено);
КонецЕсли;
КонецЕсли; КонецЕсли;
Если ФормаЗакрывается = Истина Тогда Возврат ДлительнаяОперация;
ОтменитьВыполнениеЗадания();
Задание.Статус = "Отменено";
КонецЕсли;
Возврат Задание;
КонецФункции КонецФункции
&НаКлиенте &НаСервереБезКонтекста
Функция РезультатВыполнения(Задание) Процедура ОтменитьВыполнениеЗадания(ИдентификаторЗадания)
Если Задание = Неопределено Тогда ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
Возврат Неопределено;
КонецЕсли; КонецПроцедуры
&НаКлиенте
Функция РезультатВыполнения(ДлительнаяОперация)
Результат = Новый Структура; Результат = Новый Структура;
Результат.Вставить("Статус", Задание.Статус); Результат.Вставить("Статус", ДлительнаяОперация.Статус);
Результат.Вставить("АдресРезультата", Параметры.АдресРезультата); Результат.Вставить("АдресРезультата", Параметры.АдресРезультата);
Результат.Вставить("АдресДополнительногоРезультата", Параметры.АдресДополнительногоРезультата); Результат.Вставить("АдресДополнительногоРезультата", Параметры.АдресДополнительногоРезультата);
Результат.Вставить("КраткоеПредставлениеОшибки", Задание.КраткоеПредставлениеОшибки); Результат.Вставить("КраткоеПредставлениеОшибки", ДлительнаяОперация.КраткоеПредставлениеОшибки);
Результат.Вставить("ПодробноеПредставлениеОшибки", Задание.ПодробноеПредставлениеОшибки); Результат.Вставить("ПодробноеПредставлениеОшибки", ДлительнаяОперация.ПодробноеПредставлениеОшибки);
Результат.Вставить("Сообщения", Задание.Сообщения); Результат.Вставить("Сообщения", Новый ФиксированныйМассив(Новый Массив));
Если Параметры.ПолучатьРезультат Тогда Если Параметры.ПолучатьРезультат Тогда
Результат.Вставить("Результат", Задание.Результат); Результат.Вставить("Результат", ДлительнаяОперация.Результат);
КонецЕсли; КонецЕсли;
Возврат Результат; Возврат Результат;
@@ -247,11 +262,4 @@
И ТипЗнч(ВладелецФормы) = Тип("ФормаКлиентскогоПриложения"); И ТипЗнч(ВладелецФормы) = Тип("ФормаКлиентскогоПриложения");
КонецФункции КонецФункции
&НаСервере
Процедура ОтменитьВыполнениеЗадания()
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
КонецПроцедуры
#КонецОбласти #КонецОбласти
@@ -14,8 +14,6 @@
ПараметрыПроверки = Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения(); ПараметрыПроверки = Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения();
ПараметрыПроверки.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", КонфигурацияБазыДанныхИзмененаДинамически()); ПараметрыПроверки.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", КонфигурацияБазыДанныхИзмененаДинамически());
Сообщение = СтандартныеПодсистемыСервер.ТекстСообщенияПриДинамическомОбновлении(ПараметрыПроверки);
Если ПараметрыПроверки.Исправления <> Неопределено И ПараметрыПроверки.Исправления.СписокНовых.Количество() > 0 Тогда Если ПараметрыПроверки.Исправления <> Неопределено И ПараметрыПроверки.Исправления.СписокНовых.Количество() > 0 Тогда
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
ПараметрыМетода = Новый Массив; ПараметрыМетода = Новый Массив;
@@ -27,9 +25,14 @@
ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Неопределено); ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Неопределено);
ОписаниеНовыхПатчей = ПолучитьИзВременногоХранилища(АдресХранилища); ОписаниеНовыхПатчей = ПолучитьИзВременногоХранилища(АдресХранилища);
Сообщение = СтрЗаменить(Сообщение, "Ссылка", " " + НСтр("ru = '<a href = ""%1"">Подробно</a>'")); УточняющаяСсылка = " " + НСтр("ru = '<a href = ""%1"">Подробно</a>'");
Иначе
УточняющаяСсылка = "Ссылка";
КонецЕсли; КонецЕсли;
Сообщение = СтандартныеПодсистемыСервер.ТекстСообщенияПриДинамическомОбновлении(ПараметрыПроверки,
УточняющаяСсылка);
Элементы.Текст.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(Сообщение, "ПереходПоСсылке"); Элементы.Текст.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(Сообщение, "ПереходПоСсылке");
СРасписанием = Истина; СРасписанием = Истина;
@@ -63,9 +66,6 @@
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Не ЗавершениеРаботы Тогда Если Не ЗавершениеРаботы Тогда
СохранитьРасписание(); СохранитьРасписание();
Если Не НажатиеНаКнопку Тогда
НапомнитьЗавтра();
КонецЕсли;
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -101,21 +101,18 @@
&НаКлиенте &НаКлиенте
Процедура Перезапустить(Команда) Процедура Перезапустить(Команда)
СохранитьРасписание(); СохранитьРасписание();
НажатиеНаКнопку = Истина;
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Истина, Истина); ЗавершитьРаботуСистемы(Истина, Истина);
КонецПроцедуры КонецПроцедуры
&НаКлиенте &НаКлиенте
Процедура НапомнитьПозже(Команда) Процедура НапомнитьПозже(Команда)
НажатиеНаКнопку = Истина;
НапомнитьЗавтра(); НапомнитьЗавтра();
Закрыть(); Закрыть();
КонецПроцедуры КонецПроцедуры
&НаКлиенте &НаКлиенте
Процедура БольшеНеНапоминать(Команда) Процедура БольшеНеНапоминать(Команда)
НажатиеНаКнопку = Истина;
БольшеНеНапоминатьНаСервере(); БольшеНеНапоминатьНаСервере();
Закрыть(); Закрыть();
КонецПроцедуры КонецПроцедуры
@@ -133,8 +130,15 @@
&НаКлиенте &НаКлиенте
Процедура НапомнитьЗавтра() Процедура НапомнитьЗавтра()
ИмяПараметра = "СтандартныеПодсистемы.ПриВыполненииСтандартныхПериодическихПроверок"; НапомнитьЗавтраНаСервере();
ПараметрыПриложения.Вставить(ИмяПараметра, ОбщегоНазначенияКлиент.ДатаСеанса()); КонецПроцедуры
&НаСервереБезКонтекста
Процедура НапомнитьЗавтраНаСервере()
ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить("КонтрольДинамическогоОбновления",
"ДатаНапомнитьЗавтра", НачалоДня(ТекущаяДатаСеанса()) + 60*60*24);
КонецПроцедуры КонецПроцедуры
&НаКлиенте &НаКлиенте
@@ -190,7 +194,7 @@
ТекущееРасписание.Вставить("Представление"); ТекущееРасписание.Вставить("Представление");
ТекущееРасписание.Вставить("Расписание"); ТекущееРасписание.Вставить("Расписание");
ТекущееРасписание.Вставить("ПоследнееОповещение"); ТекущееРасписание.Вставить("ПоследнееОповещение");
ПредставлениеРасписания = НСтр("ru = 'по умолчанию'"); ПредставлениеРасписания = НСтр("ru = 'по умолчанию (каждые 20 минут)'");
Иначе Иначе
ПредставлениеРасписания = ТекущееРасписание.Представление; ПредставлениеРасписания = ТекущееРасписание.Представление;
КонецЕсли; КонецЕсли;
@@ -0,0 +1,225 @@
<?xml version="1.0" encoding="UTF-8"?>
<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form">
<title>
<key>ru</key>
<value>Права доступа обновлены</value>
</title>
<items xsi:type="form:FormGroup">
<name>КартинкаИНадпись</name>
<id>1</id>
<items xsi:type="form:Decoration">
<name>Картинка</name>
<id>3</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>КартинкаРасширеннаяПодсказка</name>
<id>5</id>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>КартинкаКонтекстноеМеню</name>
<id>4</id>
<autoFill>true</autoFill>
</contextMenu>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:PictureDecorationExtInfo">
<picture xsi:type="core:PictureRef">
<picture>CommonPicture.Информация32</picture>
</picture>
<fileDragMode>AsFileRef</fileDragMode>
</extInfo>
</items>
<items xsi:type="form:Decoration">
<name>Надпись</name>
<id>6</id>
<title>
<key>ru</key>
<value>Администратор изменил права доступа.
Перезапустите программу, чтобы они вступили в силу.</value>
</title>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<toolTipRepresentation>Button</toolTipRepresentation>
<extendedTooltip>
<name>НадписьРасширеннаяПодсказка</name>
<id>8</id>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>НадписьКонтекстноеМеню</name>
<id>7</id>
<autoFill>true</autoFill>
</contextMenu>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</items>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<title>
<key>ru</key>
<value>Картинка и надпись</value>
</title>
<extendedTooltip>
<name>КартинкаИНадписьРасширеннаяПодсказка</name>
<id>2</id>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<type>UsualGroup</type>
<extInfo xsi:type="form:UsualGroupExtInfo">
<group>AlwaysHorizontal</group>
<verticalAlign>Center</verticalAlign>
<behavior>Auto</behavior>
<representation>NormalSeparation</representation>
<showLeftMargin>true</showLeftMargin>
<united>true</united>
<throughAlign>Auto</throughAlign>
<currentRowUse>Auto</currentRowUse>
</extInfo>
</items>
<commandBarLocation>Bottom</commandBarLocation>
<showCommandBar>true</showCommandBar>
<autoCommandBar>
<name>ФормаКоманднаяПанель</name>
<id>-1</id>
<items xsi:type="form:Button">
<name>ФормаПерезапустить</name>
<id>9</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ФормаПерезапуститьРасширеннаяПодсказка</name>
<id>10</id>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.Перезапустить</commandName>
<representation>Auto</representation>
<defaultButton>true</defaultButton>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<items xsi:type="form:Button">
<name>ФормаНапомнитьЗавтра</name>
<id>11</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ФормаНапомнитьЗавтраРасширеннаяПодсказка</name>
<id>12</id>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.НапомнитьЗавтра</commandName>
<buttonImportance>Normal</buttonImportance>
<representation>Auto</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<horizontalAlign>Right</horizontalAlign>
</autoCommandBar>
<windowOpeningMode>LockOwner</windowOpeningMode>
<saveWindowSettings>true</saveWindowSettings>
<autoUrl>true</autoUrl>
<group>Vertical</group>
<autoFillCheck>true</autoFillCheck>
<allowFormCustomize>true</allowFormCustomize>
<enabled>true</enabled>
<showTitle>auto</showTitle>
<showCloseButton>true</showCloseButton>
<formCommands>
<name>Перезапустить</name>
<title>
<key>ru</key>
<value>Перезапустить</value>
</title>
<id>1</id>
<toolTip>
<key>ru</key>
<value>Перезапустить</value>
</toolTip>
<use>
<common>true</common>
</use>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>Перезапустить</name>
</handler>
</action>
<currentRowUse>Auto</currentRowUse>
<selectedRowsUse>Auto</selectedRowsUse>
</formCommands>
<formCommands>
<name>НапомнитьЗавтра</name>
<title>
<key>ru</key>
<value>Напомнить завтра</value>
</title>
<id>2</id>
<toolTip>
<key>ru</key>
<value>Напомнить завтра</value>
</toolTip>
<use>
<common>true</common>
</use>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>НапомнитьЗавтра</name>
</handler>
</action>
<currentRowUse>Auto</currentRowUse>
<selectedRowsUse>Auto</selectedRowsUse>
</formCommands>
<commandInterface>
<navigationPanel/>
<commandBar/>
</commandInterface>
</form:Form>
@@ -0,0 +1,39 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Перезапустить(Команда)
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Истина, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НапомнитьЗавтра(Команда)
НапомнитьЗавтраНаСервере();
Закрыть();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервереБезКонтекста
Процедура НапомнитьЗавтраНаСервере()
ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить("КонтрольИзмененияРолейПользователяИБ",
"ДатаНапомнитьЗавтра", НачалоДня(ТекущаяДатаСеанса()) + 60*60*24);
КонецПроцедуры
#КонецОбласти
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonForm xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="85b591b4-a93d-4fcb-bdc7-e6d44436e511">
<name>КонтрольИзмененияРолейПользователяИБ</name>
<synonym>
<key>ru</key>
<value>Контроль изменения ролей пользователя ИБ</value>
</synonym>
<usePurposes>PersonalComputer</usePurposes>
<usePurposes>MobileDevice</usePurposes>
</mdclass:CommonForm>
@@ -1,48 +1,35 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html;charset=utf-8" http-equiv="content-type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.10570.1001"></meta></head><body> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html;charset=utf-8" http-equiv="content-type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.10570.1001"></meta></head><body>
<p>Настройка параметров для использования средств электронной подписи и шифрования (криптографии). </p> <p>Настройка параметров для использования средств электронной подписи и шифрования (криптографии). </p>
<p>Открывается по команде <strong>Программы и сертификаты электронной подписи и шифрования</strong> раздела <strong>Администрирование - Общие настройки</strong>.</p> <p>Открывается по команде <strong>Настройки электронной подписи и шифрования</strong> раздела <strong>Администрирование - Общие настройки</strong>.</p>
<p>Для электронной подписи и шифрования требуется установить специальную стороннюю программу (криптопровайдер).</p> <p>Для электронной подписи и шифрования требуется установить специальную стороннюю программу (криптопровайдер).</p>
<p>Для того чтобы подписывать данные, нужно включить флажок <strong>Электронная подпись</strong>, а для шифрования нужно включить флажок <strong>Шифрование</strong> в разделе <strong>Администрирование - Общие настройки</strong>. После этого становятся доступными соответствующие команды в программе.</p> <p>Для того чтобы подписывать данные, нужно включить флажок <strong>Электронная подпись</strong>, а для шифрования нужно включить флажок <strong>Шифрование</strong> в разделе <strong>Администрирование - Общие настройки</strong>. После этого становятся доступными соответствующие команды в программе.</p>
<p>Электронная подпись - реквизит электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Для установки подписи необходимо иметь сертификат ключа электронной подписи. Сертификат можно получить в удостоверяющем центре. Например, в удостоверяющем центре фирмы 1С <a href="http://ca.1c.ru/">http://ca.1c.ru/</a>. Только удостоверяющий центр может выдать юридически значимый (квалифицированный сертификат).</p> <p>Электронная подпись - реквизит электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Для установки подписи необходимо иметь сертификат ключа электронной подписи. Сертификат можно получить в удостоверяющем центре. Например, в удостоверяющем центре фирмы 1С <a href="http://ca.1c.ru/">http://ca.1c.ru/</a>. Только удостоверяющий центр может выдать юридически значимый (квалифицированный сертификат).</p>
<p>В случае использования распределенной информационной базы большую часть настроек можно изменить только в главном узле.</p> <p>В случае использования распределенной информационной базы большую часть настроек можно изменить только в главном узле.</p>
<h3>Сертификаты</h3> <h3>Сертификаты</h3>
<ul><li>Показывает все сертификаты, которые используются для подписания и шифрования данных, а также заявления на выпуск нового сертификата. <ul><li>Показывает все сертификаты, которые используются для подписания и шифрования данных, а также заявления на выпуск нового сертификата.
</li> </li><li>Можно установить отбор только своих сертификатов в поле <strong>Показать</strong>. По умолчанию показываются все сертификаты.
<li>Можно установить отбор только своих сертификатов в поле <strong>Показать</strong>. По умолчанию показываются все сертификаты. </li><li>Предусмотрен отбор по полю <strong>Состояние заявления</strong> ("Любое", "Не подготовлено", "Подготовлено", "Отправлено", "Отклонено", "Исполнено, сертификат не установлен", "Исполнено").
</li> </li><li><a href="Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования.Form.ФормаЭлемента/Help">Сертификат</a> можно <strong>Добавить</strong> из числа <strong>установленных на компьютере</strong>. Также это можно сделать в процессе подписания или шифрования данных.
<li>Предусмотрен отбор по полю <strong>Состояние заявления</strong> ("Любое", "Не подготовлено", "Подготовлено", "Отправлено", "Отклонено", "Исполнено, сертификат не установлен", "Исполнено"). </li><li>Также с помощью кнопки <strong>Добавить</strong> можно подготовить <a href="DataProcessor.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Form.Форма/Help">Заявление на выпуск нового сертификата</a>.
</li> </li><li>Просмотреть сертификат или заявление на выпуск нового сертификата можно, дважды щелкнув по нему мышью. Также можно это сделать с помощью команды <strong>Изменить</strong> контекстного меню по правой кнопке мыши или меню <strong>Еще</strong>.</li></ul><h3>Программы</h3>
<li><a href="Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования.Form.ФормаЭлемента/Help">Сертификат</a> можно <strong>Добавить</strong> из числа <strong>установленных на компьютере</strong>. Также это можно сделать в процессе подписания или шифрования данных.
</li>
<li>Также с помощью кнопки <strong>Добавить</strong> можно подготовить <a href="DataProcessor.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Form.Форма/Help">Заявление на выпуск нового сертификата</a>.
</li>
<li>Просмотреть сертификат или заявление на выпуск нового сертификата можно, дважды щелкнув по нему мышью. Также можно это сделать с помощью команды <strong>Изменить</strong> контекстного меню по правой кнопке мыши или меню <strong>Еще</strong>.</li></ul><h3>Программы</h3>
<ul><li>Содержит список программ, которые будут использованы в информационной базе (в том числе во всех узлах распределенной ИБ). <ul><li>Содержит список программ, которые будут использованы в информационной базе (в том числе во всех узлах распределенной ИБ).
</li> </li><li>Эти программы не обязательно должны быть установлены на всех компьютерах. Более того, установка более одной программы на одном компьютере может вызвать конфликты между ними.
<li>Эти программы не обязательно должны быть установлены на всех компьютерах. Более того, установка более одной программы на одном компьютере может вызвать конфликты между ними. </li><li>После запуска в списке уже присутствуют две записи о программах, наиболее распространенных в России - ViPNet CSP и КриптоПро CSP.
</li> </li><li>Можно добавить записи о других программах (поставляются готовые настройки для Microsoft Enhanced CSP, ViPNet CSP, КриптоПро CSP, ЛИССИ CSP, Сигнал-КОМ CSP).
<li>После запуска в списке уже присутствуют две записи о программах, наиболее распространенных в России - ViPNet CSP и КриптоПро CSP. </li><li>Если требуется использовать программу отличную от известных, тогда нужно указать ее имя, тип и алгоритмы, как указано в инструкции, поставляемой ее производителем.
</li> </li><li>В колонке <strong>Результат проверки</strong> отражаются сведения, по которым можно понять установлена ли программа на компьютере или нет или же установлена, но некорректно.<span lang="RU">
<li>Можно добавить записи о других программах (поставляются готовые настройки для Microsoft Enhanced CSP, ViPNet CSP, КриптоПро CSP, ЛИССИ CSP, Сигнал-КОМ CSP). </span></li><li>Linux: <strong>Путь к программе (&lt;Имя программы, соответствующей выделенной строке в списке&gt;)</strong> - поле, которое требуется обязательно заполнять на компьютерах под управлением ОС Linux.</li>
</li> <li>В нижней части списка расположена ссылка <a href="http://its.1c.ru/db/metod81#content:5784:1">Инструкция по работе с программами электронной подписи и шифрования</a>. Перейдите по этой ссылке в соответствующий раздел 1С:ИТС, если имеются вопросы.
<li>Если требуется использовать программу отличную от известных, тогда нужно указать ее имя, тип и алгоритмы, как указано в инструкции, поставляемой ее производителем. </li><li><strong>Проверять подписи и сертификаты на сервере</strong> - этот флажок виден только для серверных баз. Если его установить, тогда проверка электронной подписи и сертификата будет происходить на сервере, что позволяет не устанавливать программу на каждом компьютере, гдетребуется только такие операции.
</li> <ul><li>В записи о программе можно перейти к списку <strong>Пути к программе на серверах Linux</strong> - в котором нужно указать пути для тех компьютеров, на которых сервер 1С:Предприятия работает под управлением ОС Linux.</li></ul></li></ul><h3>Дополнительно</h3>
<li>В колонке <strong>Результат проверки</strong> отражаются сведения, по которым можно понять установлена ли программа на компьютере или нет или же установлена, но некорректно.<span lang="RU">
</span></li>
<li>Linux: <strong>Путь к программе (&lt;Имя программы, соответствующей выделенной строке в списке&gt;)</strong> - поле, которое требуется обязательно заполнять на компьютерах под управлением ОС Linux.</li>
<ul><li>В записи о программе можно перейти к списку <strong>Пути к программе на серверах Linux</strong> - в котором нужно указать пути для тех компьютеров, на которых сервер 1С:Предприятия работает под управлением ОС Linux.</li></ul><li>В нижней части списка расположена ссылка <a href="http://its.1c.ru/db/metod81#content:5784:1">Инструкция по работе с программами электронной подписи и шифрования</a>. Перейдите по этой ссылке в соответствующий раздел 1С:ИТС, если имеются вопросы.</li></ul><h3>Дополнительно</h3>
<ul><li>Задайте <strong>Расширение для зашифрованных файлов</strong> при отправке по почте, при выполнении команды <strong>Сохранить как</strong> и при экспорте папки (по умолчанию <strong>.p7m</strong>). <ul><li>Задайте <strong>Расширение для зашифрованных файлов</strong> при отправке по почте, при выполнении команды <strong>Сохранить как</strong> и при экспорте папки (по умолчанию <strong>.p7m</strong>).
</li> </li><li>
<li>
<div>Напишите <strong>Расширение для файлов подписи</strong> (по умолчанию <strong>.p7s</strong>).</div> <div>Напишите <strong>Расширение для файлов подписи</strong> (по умолчанию <strong>.p7s</strong>).</div>
</li> </li><li>
<li>
<div>С помощью переключателя <strong>При сохранении данных в файл вместе с электронной подписью</strong> задайте поведение программы при выполнении команды <strong>Сохранить вместе с электронной подписью</strong>: </div> <div>С помощью переключателя <strong>При сохранении данных в файл вместе с электронной подписью</strong> задайте поведение программы при выполнении команды <strong>Сохранить вместе с электронной подписью</strong>: </div>
<ul><li> <ul><li>
<div><strong>Сохранять все подписи</strong> - все подписи сохраняются; </div> <div><strong>Сохранять все подписи</strong> - все подписи сохраняются; </div>
</li> </li><li>
<li> <div><strong>Спрашивать</strong> - выбор сохраняемых подписей осуществляется из <a href="CommonForm.СохранениеВместеСЭлектроннойПодписью/Help">списка</a>.</div></li></ul></li><li>
<div><strong>Спрашивать</strong> - выбор сохраняемых подписей осуществляется из <a href="CommonForm.СохранениеВместеСЭлектроннойПодписью/Help">списка</a>.</div></li></ul></li>
<li>
<div>Включите флажок <strong>Сохранять сертификат</strong> для сохранения на компьютер сертификата вместе с файлом и электронной подписью.</div></li></ul><h3>См. также:</h3> <div>Включите флажок <strong>Сохранять сертификат</strong> для сохранения на компьютер сертификата вместе с файлом и электронной подписью.</div></li></ul><h3>См. также:</h3>
<ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> <ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html>
@@ -157,8 +157,19 @@
Возврат; Возврат;
КонецЕсли; КонецЕсли;
Обработчик = Новый ОписаниеОповещения("ОбработатьДействияСообщения", ВариантыОтчетовКлиент); Обработчик = Новый ОписаниеОповещения("ОбработатьДействияСообщения", ВариантыОтчетовКлиент,,
СистемаВзаимодействия.ПодключитьОбработчикДействияСообщения(Обработчик); "ПриОшибкеОбработкиДействияСообщения", ВариантыОтчетовКлиент);
Попытка
СистемаВзаимодействия.ПодключитьОбработчикДействияСообщения(Обработчик);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Варианты отчетов.Ошибка подключения обработчика действия сообщения'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПопытки;
КонецПроцедуры КонецПроцедуры
@@ -196,6 +207,18 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Процедура ПриОшибкеОбработкиДействияСообщения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
СтандартнаяОбработка = Ложь;
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Варианты отчетов.Ошибка обработки действия сообщения'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Процедура ОбработатьДействияСообщения(Сообщение, Действие, ДополнительныеПараметры) Экспорт Процедура ОбработатьДействияСообщения(Сообщение, Действие, ДополнительныеПараметры) Экспорт
Если Действие = ВариантыОтчетовКлиентСервер.ИмяДействияПрименитьПереданныеНастройки() Тогда Если Действие = ВариантыОтчетовКлиентСервер.ИмяДействияПрименитьПереданныеНастройки() Тогда
@@ -243,7 +243,7 @@
ПараметрыМногопоточнойОперации.Вставить("ПрерватьВыполнениеЕслиОшибка", ПараметрыВыполнения.ПрерватьВыполнениеЕслиОшибка); ПараметрыМногопоточнойОперации.Вставить("ПрерватьВыполнениеЕслиОшибка", ПараметрыВыполнения.ПрерватьВыполнениеЕслиОшибка);
ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", АдресРезультатов); ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", АдресРезультатов);
Возврат ВыполнитьФункцию(ПараметрыВыполненияДочернихПотоков, "ДлительныеОперации.ВыполнитьМногопоточныйПроцесс", ПараметрыМногопоточнойОперации); Возврат ВыполнитьФункцию(ПараметрыВыполненияДочернихПотоков, ИмяМетодаМногопоточногоПроцесса(), ПараметрыМногопоточнойОперации);
КонецФункции КонецФункции
@@ -310,7 +310,7 @@
ПараметрыМногопоточнойОперации.Вставить("ПрерватьВыполнениеЕслиОшибка", ПараметрыВыполнения.ПрерватьВыполнениеЕслиОшибка); ПараметрыМногопоточнойОперации.Вставить("ПрерватьВыполнениеЕслиОшибка", ПараметрыВыполнения.ПрерватьВыполнениеЕслиОшибка);
ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", АдресРезультатов); ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", АдресРезультатов);
Результат = ВыполнитьФункцию(ПараметрыВыполненияДочернихПотоков, "ДлительныеОперации.ВыполнитьМногопоточныйПроцесс", ПараметрыМногопоточнойОперации); Результат = ВыполнитьФункцию(ПараметрыВыполненияДочернихПотоков, ИмяМетодаМногопоточногоПроцесса(), ПараметрыМногопоточнойОперации);
Возврат Результат; Возврат Результат;
@@ -452,7 +452,7 @@
// * КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка". // * КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка".
// * ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка". // * ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка".
// * Сообщения - ФиксированныйМассив - если Статус <> "Выполняется", то массив объектов СообщениеПользователю, // * Сообщения - ФиксированныйМассив - если Статус <> "Выполняется", то массив объектов СообщениеПользователю,
// которые были сформированы в фоновом задании. // которые были сформированы в фоновом задании, иначе пустой массив.
// //
// Пример: // Пример:
// В общем виде процесс запуска и обработки результата длительной операции выглядит следующим образом: // В общем виде процесс запуска и обработки результата длительной операции выглядит следующим образом:
@@ -612,7 +612,8 @@
УстановитьОтключениеБезопасногоРежима(Истина); УстановитьОтключениеБезопасногоРежима(Истина);
Попытка Попытка
Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры,
ПараметрыВыполнения, ПараметрыЭкспортнойПроцедуры, БезопасныйРежим); ПараметрыВыполнения, ПараметрыЭкспортнойПроцедуры, БезопасныйРежим,
ПараметрыВыполнения.ОжидатьЗавершение <> Неопределено);
Исключение Исключение
Результат.Статус = "Ошибка"; Результат.Статус = "Ошибка";
Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда
@@ -644,8 +645,12 @@
КонецЕсли; КонецЕсли;
Если ЗаданиеВыполнено Тогда Если ЗаданиеВыполнено Тогда
ПрогрессИСообщения = ПрочитатьПрогрессИСообщения(Задание.УникальныйИдентификатор, "ПрогрессИСообщения"); Если ПараметрыВыполнения.ОжидатьЗавершение <> Неопределено Тогда
Результат.Сообщения = ПрогрессИСообщения.Сообщения; Сообщения = ПолучитьИзОповещений(Истина, Задание.УникальныйИдентификатор, "Сообщения");
Иначе
Сообщения = Задание.ПолучитьСообщенияПользователю(Истина);
КонецЕсли;
Результат.Сообщения = Сообщения;
КонецЕсли; КонецЕсли;
ЗаполнитьЗначенияСвойств(Результат, ОперацияВыполнена(Задание.УникальныйИдентификатор), , "Сообщения"); ЗаполнитьЗначенияСвойств(Результат, ОперацияВыполнена(Задание.УникальныйИдентификатор), , "Сообщения");
@@ -716,7 +721,6 @@
// //
// Для того чтобы выводить ход выполнения длительной операции для пользователя, следует установить // Для того чтобы выводить ход выполнения длительной операции для пользователя, следует установить
// свойство ВыводитьПрогрессВыполнения в Истина (см. ДлительныеОперацииКлиент.ПараметрыОжидания). // свойство ВыводитьПрогрессВыполнения в Истина (см. ДлительныеОперацииКлиент.ПараметрыОжидания).
// Его также можно получать отдельно при помощи функции ДлительныеОперации.ПрочитатьПрогресс.
// //
// Параметры: // Параметры:
// Процент - Число - процент выполнения. // Процент - Число - процент выполнения.
@@ -726,10 +730,10 @@
// //
Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт
Если Не СтандартныеПодсистемыПовтИсп.ЭтоФоновоеЗадание() Тогда Если Не СтандартныеПодсистемыПовтИсп.ЭтоСеансДлительнойОперации() Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
ПередаваемоеЗначение = Новый Структура; ПередаваемоеЗначение = Новый Структура;
Если Процент <> Неопределено Тогда Если Процент <> Неопределено Тогда
ПередаваемоеЗначение.Вставить("Процент", Процент); ПередаваемоеЗначение.Вставить("Процент", Процент);
@@ -741,16 +745,16 @@
ПередаваемоеЗначение.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); ПередаваемоеЗначение.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонецЕсли; КонецЕсли;
ПередаваемыйТекст = ОбщегоНазначения.ЗначениеВСтрокуXML(ПередаваемоеЗначение); ОтправитьОповещениеКлиенту("Прогресс", ПередаваемоеЗначение);
Текст = "{" + СообщениеПрогресса() + "}" + ПередаваемыйТекст;
ОбщегоНазначения.СообщитьПользователю(Текст);
КонецПроцедуры КонецПроцедуры
// Считывает информацию о ходе выполнения длительной операции, // Считывает информацию о ходе выполнения длительной операции,
// записанную процедурой ДлительныеОперации.СообщитьПрогресс. // записанную процедурой ДлительныеОперации.СообщитьПрогресс.
// //
// Рекомендуется получать прогресс через обработчик оповещения,
// который подключается с помощью ДлительныеОперацииКлиент.ОжидатьЗавершение.
//
// Параметры: // Параметры:
// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. // ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания.
// //
@@ -762,7 +766,7 @@
// //
Функция ПрочитатьПрогресс(Знач ИдентификаторЗадания) Экспорт Функция ПрочитатьПрогресс(Знач ИдентификаторЗадания) Экспорт
Возврат ПрочитатьПрогрессИСообщения(ИдентификаторЗадания, "Прогресс").Прогресс; Возврат ПолучитьИзОповещений(Истина, ИдентификаторЗадания, "Прогресс");
КонецФункции КонецФункции
@@ -784,10 +788,12 @@
КонецЕсли; КонецЕсли;
УстановитьПривилегированныйРежим(Истина); УстановитьПривилегированныйРежим(Истина);
Если ПараметрыСеанса.ОтмененныеДлительныеОперации.Найти(ИдентификаторЗадания) = Неопределено Тогда Если ПараметрыСеанса.ДлительныеОперации.Отмененные.Найти(ИдентификаторЗадания) = Неопределено Тогда
ОтмененныеДлительныеОперации = Новый Массив(ПараметрыСеанса.ОтмененныеДлительныеОперации); Свойства = Новый Структура(ПараметрыСеанса.ДлительныеОперации);
ОтмененныеДлительныеОперации.Добавить(ИдентификаторЗадания); Отмененные = Новый Массив(Свойства.Отмененные);
ПараметрыСеанса.ОтмененныеДлительныеОперации = Новый ФиксированныйМассив(ОтмененныеДлительныеОперации); Отмененные.Добавить(ИдентификаторЗадания);
Свойства.Отмененные = Новый ФиксированныйМассив(Отмененные);
ПараметрыСеанса.ДлительныеОперации = Новый ФиксированнаяСтруктура(Свойства);
КонецЕсли; КонецЕсли;
УстановитьПривилегированныйРежим(Ложь); УстановитьПривилегированныйРежим(Ложь);
@@ -818,45 +824,51 @@
// //
Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт
Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); Задание = Неопределено;
Результат = ОперацияВыполнена(ИдентификаторЗадания, Задание);
Если Задание <> Неопределено Если Результат.Статус = "Выполняется" Тогда
И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Возврат Ложь; Возврат Ложь;
ИначеЕсли Результат.Статус = "Выполнено" Тогда
Возврат Истина;
КонецЕсли; КонецЕсли;
ТекстОшибки = НСтр("ru = 'Не удалось выполнить данную операцию. Если Результат.Статус = "Отменено" Тогда
|Технические подробности см. в журнале регистрации.'"); ТекстОшибки = Результат.КраткоеПредставлениеОшибки;
Если Задание = Неопределено Тогда
ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Фоновое задание не найдено'", ОбщегоНазначения.КодОсновногоЯзыка()), ИначеЕсли Задание = Неопределено Тогда
УровеньЖурналаРегистрации.Ошибка, , , Строка(ИдентификаторЗадания)); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда НСтр("ru = '%1
ОшибкаЗадания = Задание.ИнформацияОбОшибке; |
Если ОшибкаЗадания <> Неопределено Тогда |Технические подробности:
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( |%2
НСтр("ru = '%1 |
| |См. также журнал регистрации.'"),
|Технические подробности: Результат.КраткоеПредставлениеОшибки,
|Ошибка выполнения фонового задания %2 с идентификатором %3 по причине Результат.ПодробноеПредставлениеОшибки);
|%4
|
|См. также журнал регистрации.'"),
КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке), Задание.ИмяМетода,
Строка(ИдентификаторЗадания), ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке));
КонецЕсли;
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда
ЗаписьЖурналаРегистрации(
НСтр("ru = 'Длительные операции.Фоновое задание отменено администратором'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , , НСтр("ru = 'Задание завершилось с неизвестной ошибкой.'"));
Иначе Иначе
Возврат Истина; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1
|
|Технические подробности:
|Ошибка выполнения фонового задания %2 с идентификатором %3 по причине
|%4
|
|См. также журнал регистрации.'"),
Результат.КраткоеПредставлениеОшибки,
Задание.ИмяМетода,
Строка(ИдентификаторЗадания),
Результат.ПодробноеПредставлениеОшибки);
КонецЕсли; КонецЕсли;
ВызватьИсключение ТекстОшибки; ВызватьИсключение ТекстОшибки;
КонецФункции КонецФункции
// Получает сообщения пользователю, отфильтровывает служебные сообщения о состоянии длительной операции. // Получает сообщения пользователю из фонового задания длительной операции.
//
// Рекомендуется получать сообщения через обработчик оповещения,
// который подключается с помощью ДлительныеОперацииКлиент.ОжидатьЗавершение.
// //
// Параметры: // Параметры:
// УдалятьПолученные - Булево - признак необходимости удаления полученных сообщений. // УдалятьПолученные - Булево - признак необходимости удаления полученных сообщений.
@@ -876,27 +888,10 @@
Функция СообщенияПользователю(УдалятьПолученные = Ложь, ИдентификаторЗадания = Неопределено) Экспорт Функция СообщенияПользователю(УдалятьПолученные = Ложь, ИдентификаторЗадания = Неопределено) Экспорт
Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); Возврат ПолучитьИзОповещений(УдалятьПолученные, ИдентификаторЗадания, "Сообщения");
Если ФоновоеЗадание <> Неопределено Тогда
ВсеСообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(УдалятьПолученные);
КонецЕсли;
Иначе
ВсеСообщения = ПолучитьСообщенияПользователю(УдалятьПолученные);
КонецЕсли; КонецЕсли;
Результат = Новый Массив; Возврат ПолучитьСообщенияПользователю(УдалятьПолученные);
Для Каждого Сообщение Из ВсеСообщения Цикл
Если СтрНачинаетсяС(Сообщение.Текст, "{" + СообщениеПрогресса() + "}") Тогда
Если УдалятьПолученные Тогда
Сообщение.Сообщить();
КонецЕсли;
Иначе
Результат.Добавить(Сообщение);
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированныйМассив(Результат);
КонецФункции КонецФункции
@@ -996,39 +991,37 @@
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
Функция ОперацияВыполнена(Знач ИдентификаторЗадания, Знач ИсключениеПриОшибке = Ложь, Знач ВыводитьПрогрессВыполнения = Ложь, // Параметры:
Знач ВыводитьСообщения = Ложь) Экспорт // ИдентификаторЗадания - УникальныйИдентификатор
// Задание - ФоновоеЗадание - возвращаемое значение - найденное фоновое задание.
// - Неопределено - если фоновое задание не найдено.
//
// Возвращаемое значение:
// см. НовыйРезультатВыполненияОперации
//
Функция ОперацияВыполнена(Знач ИдентификаторЗадания, Задание = Неопределено) Экспорт
Результат = Новый Структура; Результат = НовыйРезультатВыполненияОперации();
Результат.Вставить("Статус", "Выполняется");
Результат.Вставить("КраткоеПредставлениеОшибки", Неопределено);
Результат.Вставить("ПодробноеПредставлениеОшибки", Неопределено);
Результат.Вставить("Прогресс", Неопределено);
Результат.Вставить("Сообщения", Неопределено);
Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания);
Если Задание = Неопределено Тогда Если Задание = Неопределено Тогда
Пояснение = НСтр("ru = 'Операция не выполнена из-за аварийного завершения фонового задания. РезультатИзОповещения = ПолучитьИзОповещений(Ложь,
|Фоновое задание не существует'") + ": " + Строка(ИдентификаторЗадания); ИдентификаторЗадания, "ДлительнаяОперацияЗавершена");
ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), Если РезультатИзОповещения <> Неопределено Тогда
УровеньЖурналаРегистрации.Ошибка, , , Пояснение); ЗаполнитьЗначенияСвойств(Результат, РезультатИзОповещения);
Если ИсключениеПриОшибке Тогда Возврат Результат;
ВызватьИсключение(НСтр("ru = 'Не удалось выполнить данную операцию.'"));
КонецЕсли; КонецЕсли;
Результат.КраткоеПредставлениеОшибки =
НСтр("ru = 'Операция не выполнена из-за аварийного завершения фонового задания.'");
Результат.ПодробноеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки + Символы.ПС
+ НСтр("ru = 'Фоновое задание не существует'") + ": " + Строка(ИдентификаторЗадания);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Фоновое задание не найдено'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки);
Результат.Статус = "Ошибка"; Результат.Статус = "Ошибка";
Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Операция не выполнена из-за аварийного завершения фонового задания.'");
Возврат Результат; Возврат Результат;
КонецЕсли; КонецЕсли;
Если ВыводитьПрогрессВыполнения Тогда ЗаписатьОстаткиСообщенийПользователю(Задание.УникальныйИдентификатор);
ПрогрессИСообщения = ПрочитатьПрогрессИСообщения(ИдентификаторЗадания, ?(ВыводитьСообщения, "ПрогрессИСообщения", "Прогресс"));
Результат.Прогресс = ПрогрессИСообщения.Прогресс;
Если ВыводитьСообщения Тогда
Результат.Сообщения = ПрогрессИСообщения.Сообщения;
КонецЕсли;
ИначеЕсли ВыводитьСообщения Тогда
Результат.Сообщения = Задание.ПолучитьСообщенияПользователю(Истина);
КонецЕсли;
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Возврат Результат; Возврат Результат;
@@ -1036,20 +1029,12 @@
Если Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда Если Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда
УстановитьПривилегированныйРежим(Истина); УстановитьПривилегированныйРежим(Истина);
Если ПараметрыСеанса.ОтмененныеДлительныеОперации.Найти(ИдентификаторЗадания) = Неопределено Тогда Если ПараметрыСеанса.ДлительныеОперации.Отмененные.Найти(ИдентификаторЗадания) = Неопределено Тогда
Результат.Статус = "Ошибка"; Результат.Статус = "Ошибка";
Если Задание.ИнформацияОбОшибке <> Неопределено Тогда Если Задание.ИнформацияОбОшибке <> Неопределено Тогда
Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Операция отменена администратором.'"); Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Операция отменена администратором.'");
Результат.ПодробноеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки; Результат.ПодробноеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки;
КонецЕсли; КонецЕсли;
Если ИсключениеПриОшибке Тогда
Если Не ПустаяСтрока(Результат.КраткоеПредставлениеОшибки) Тогда
ТекстСообщения = Результат.КраткоеПредставлениеОшибки;
Иначе
ТекстСообщения = НСтр("ru = 'Не удалось выполнить данную операцию.'");
КонецЕсли;
ВызватьИсключение ТекстСообщения;
КонецЕсли;
Иначе Иначе
Результат.Статус = "Отменено"; Результат.Статус = "Отменено";
КонецЕсли; КонецЕсли;
@@ -1065,14 +1050,6 @@
Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
КонецЕсли; КонецЕсли;
Если ИсключениеПриОшибке Тогда
Если Не ПустаяСтрока(Результат.КраткоеПредставлениеОшибки) Тогда
ТекстСообщения = Результат.КраткоеПредставлениеОшибки;
Иначе
ТекстСообщения = НСтр("ru = 'Не удалось выполнить данную операцию.'");
КонецЕсли;
ВызватьИсключение ТекстСообщения;
КонецЕсли;
Возврат Результат; Возврат Результат;
КонецЕсли; КонецЕсли;
@@ -1081,10 +1058,6 @@
КонецФункции КонецФункции
Функция СообщениеПрогресса() Экспорт
Возврат "СтандартныеПодсистемы.ДлительныеОперации";
КонецФункции
Процедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт Процедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт
Если БезопасныйРежим() <> Ложь Тогда Если БезопасныйРежим() <> Ложь Тогда
@@ -1146,36 +1119,94 @@
КонецПроцедуры КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
// Параметры: // Параметры:
// ИмяПараметра - Строка // ИмяПараметра - Строка
// УстановленныеПараметры - Массив из Строка // УстановленныеПараметры - Массив из Строка
// //
Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт
Если ИмяПараметра = "ОтмененныеДлительныеОперации" Тогда Если ИмяПараметра = "ДлительныеОперации" Тогда
ПараметрыСеанса.ОтмененныеДлительныеОперации = Новый ФиксированныйМассив(Новый Массив); Свойства = Новый Структура;
УстановленныеПараметры.Добавить("ОтмененныеДлительныеОперации"); Свойства.Вставить("Отмененные", Новый ФиксированныйМассив(Новый Массив));
Свойства.Вставить("ПолученныеОповещения", Новый ФиксированноеСоответствие(Новый Соответствие));
ПараметрыСеанса.ДлительныеОперации = Новый ФиксированнаяСтруктура(Свойства);
УстановленныеПараметры.Добавить("ДлительныеОперации");
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений
Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(ИмяОповещения());
Оповещение.ИмяМодуляОтправки = "";
Оповещение.ИмяМодуляПолучения = "ДлительныеОперацииКлиент";
Оповещения.Вставить(Оповещение.Имя, Оповещение);
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Функция ОперацииВыполнены(Знач Задания) Экспорт Функция НовыйРезультатВыполненияОперации() Экспорт
Результат = Новый Структура;
Результат.Вставить("Статус", "Выполняется");
Результат.Вставить("КраткоеПредставлениеОшибки", Неопределено);
Результат.Вставить("ПодробноеПредставлениеОшибки", Неопределено);
Результат.Вставить("Прогресс", Неопределено);
Результат.Вставить("Сообщения", Неопределено);
Возврат Результат;
КонецФункции
// См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере
Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт
ПараметрыПроверки = Параметры.Получить( // см. ДлительныеОперацииКлиент.ПараметрыПроверкиДлительныхОпераций
"СтандартныеПодсистемы.БазоваяФункциональность.ПараметрыПроверкиДлительныхОпераций");
Если ПараметрыПроверки = Неопределено Тогда
Возврат;
КонецЕсли;
Результаты.Вставить("СтандартныеПодсистемы.БазоваяФункциональность.РезультатПроверкиДлительныхОпераций",
РезультатПроверкиДлительныхОпераций(ПараметрыПроверки));
КонецПроцедуры
// Параметры:
// Параметры - см. ДлительныеОперацииКлиент.ПараметрыПроверкиДлительныхОпераций
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - УникальныйИдентификатор - идентификатор задания
// * Значение - см. ОперацияВыполнена
//
Функция РезультатПроверкиДлительныхОпераций(Параметры) Экспорт
Результат = Новый Соответствие; Результат = Новый Соответствие;
Для каждого Задание Из Задания Цикл Для Каждого ИдентификаторЗадания Из Параметры.ЗаданияДляПроверки Цикл
Результат.Вставить(Задание.ИдентификаторЗадания, Результат.Вставить(ИдентификаторЗадания, ОперацияВыполнена(ИдентификаторЗадания));
ОперацияВыполнена(Задание.ИдентификаторЗадания, Ложь, Задание.ВыводитьПрогрессВыполнения, Задание.ВыводитьСообщения));
КонецЦикла; КонецЦикла;
Для Каждого ИдентификаторЗадания Из Параметры.ЗаданияДляОтмены Цикл
ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
Результат.Вставить(ИдентификаторЗадания, Новый Структура("Статус", "Отменено"));
КонецЦикла;
Возврат Результат; Возврат Результат;
КонецФункции КонецФункции
Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры,
ПараметрыВыполнения, ПараметрыПроцедуры = Неопределено, БезопасныйРежим = Ложь) Экспорт ПараметрыВыполнения, ПараметрыПроцедуры = Неопределено, БезопасныйРежим = Ложь, ОтправлятьОповещения = Ложь) Экспорт
КлючФоновогоЗадания = ПараметрыВыполнения.КлючФоновогоЗадания; КлючФоновогоЗадания = ПараметрыВыполнения.КлючФоновогоЗадания;
НаименованиеФоновогоЗадания = ?(ПустаяСтрока(ПараметрыВыполнения.НаименованиеФоновогоЗадания), НаименованиеФоновогоЗадания = ?(ПустаяСтрока(ПараметрыВыполнения.НаименованиеФоновогоЗадания),
@@ -1184,6 +1215,11 @@
УстановитьПривилегированныйРежим(Истина); УстановитьПривилегированныйРежим(Истина);
ПараметрыКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере; ПараметрыКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере;
УстановитьПривилегированныйРежим(Ложь); УстановитьПривилегированныйРежим(Ложь);
Если ОтправлятьОповещения И Не ЗначениеЗаполнено(ПараметрыКлиента.Получить("КлючСеансаРодителя")) Тогда
ПараметрыКлиента = Новый Соответствие(ПараметрыКлиента);
ПараметрыКлиента.Вставить("КлючСеансаРодителя", СерверныеОповещения.КлючСеанса());
ПараметрыКлиента = Новый ФиксированноеСоответствие(ПараметрыКлиента);
КонецЕсли;
ВсеПараметры = Новый Структура; ВсеПараметры = Новый Структура;
ВсеПараметры.Вставить("ИмяПроцедуры", ИмяПроцедуры); ВсеПараметры.Вставить("ИмяПроцедуры", ИмяПроцедуры);
@@ -1219,12 +1255,7 @@
Возврат Ложь; Возврат Ложь;
КонецЕсли; КонецЕсли;
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы(); ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ТекущийСеанс.ИмяПриложения <> "BackgroundJob" Тогда
Возврат Ложь;
КонецЕсли;
ФоновоеЗадание = ТекущийСеанс.ПолучитьФоновоеЗадание();
Если ФоновоеЗадание = Неопределено Если ФоновоеЗадание = Неопределено
Или ФоновоеЗадание.ИмяМетода <> ИмяПроцедурыФоновогоЗаданияБезВызоваПередЗапускомПрограммы() Тогда Или ФоновоеЗадание.ИмяМетода <> ИмяПроцедурыФоновогоЗаданияБезВызоваПередЗапускомПрограммы() Тогда
@@ -1252,8 +1283,22 @@
// Продолжение процедуры ЗапуститьФоновоеЗаданиеСКонтекстомКлиента. // Продолжение процедуры ЗапуститьФоновоеЗаданиеСКонтекстомКлиента.
Процедура ВыполнитьСКонтекстомКлиента(ВсеПараметры) Экспорт Процедура ВыполнитьСКонтекстомКлиента(ВсеПараметры) Экспорт
ПараметрыКлиента = ВсеПараметры.ПараметрыКлиентаНаСервере;
Если ЗначениеЗаполнено(ПараметрыКлиента.Получить("КлючСеансаРодителя"))
И Не ЗначениеЗаполнено(ПараметрыКлиента.Получить("ИдентификаторЗаданияМногопоточногоПроцесса")) Тогда
ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ФоновоеЗадание <> Неопределено
И ВсеПараметры.ИмяПроцедуры = ИмяМетодаМногопоточногоПроцесса() Тогда
ПараметрыКлиента = Новый Соответствие(ПараметрыКлиента);
ПараметрыКлиента.Вставить("ИдентификаторЗаданияМногопоточногоПроцесса",
ФоновоеЗадание.УникальныйИдентификатор);
ПараметрыКлиента = Новый ФиксированноеСоответствие(ПараметрыКлиента);
КонецЕсли;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина); УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.ПараметрыКлиентаНаСервере = ВсеПараметры.ПараметрыКлиентаНаСервере; ПараметрыСеанса.ПараметрыКлиентаНаСервере = ПараметрыКлиента;
Справочники.ВерсииРасширений.ВосстановитьЗарегистрированныйСоставУстановленныхРасширений(ВсеПараметры); Справочники.ВерсииРасширений.ВосстановитьЗарегистрированныйСоставУстановленныхРасширений(ВсеПараметры);
Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений(); Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений();
УстановитьПривилегированныйРежим(Ложь); УстановитьПривилегированныйРежим(Ложь);
@@ -1268,11 +1313,24 @@
КонецЕсли; КонецЕсли;
КонецЕсли; КонецЕсли;
Если ВсеПараметры.ПараметрыВыполнения.Свойство("ЭтоФункция") И ВсеПараметры.ПараметрыВыполнения.ЭтоФункция Тогда Результат = НовыйРезультатВыполненияОперации();
ВызватьФункцию(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры, ВсеПараметры.ПараметрыВыполнения.АдресРезультата); Попытка
Иначе Если ВсеПараметры.ПараметрыВыполнения.Свойство("ЭтоФункция") И ВсеПараметры.ПараметрыВыполнения.ЭтоФункция Тогда
ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры); ВызватьФункцию(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры, ВсеПараметры.ПараметрыВыполнения.АдресРезультата);
КонецЕсли; Иначе
ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
КонецЕсли;
Результат.Статус = "Выполнено";
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Результат.Статус = "Ошибка";
Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
ОтправитьОповещениеКлиенту("ДлительнаяОперацияЗавершена", Результат);
ВызватьИсключение;
КонецПопытки;
ОтправитьОповещениеКлиенту("ДлительнаяОперацияЗавершена", Результат);
КонецПроцедуры КонецПроцедуры
@@ -1356,70 +1414,207 @@
КонецФункции КонецФункции
// Считывает информацию о ходе выполнения фонового задания и сообщения, которые в нем были сформированы. Функция ПолучитьИзОповещений(ПропускатьПолученные, ИдентификаторЗадания, ВидОповещений)
//
// Параметры:
// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания.
// Режим - Строка - "ПрогрессИСообщения", "Прогресс" или "Сообщения".
//
// Возвращаемое значение:
// Структура:
// * Прогресс - Неопределено
// - Структура - информация о ходе выполнения фонового задания, записанная процедурой СообщитьПрогресс:
// ** Процент - Число - необязательный. Процент выполнения.
// ** Текст - Строка - необязательный. Информация о текущей операции.
// ** ДополнительныеПараметры - Произвольный - необязательный. Любая дополнительная информация.
// * Сообщения - ФиксированныйМассив - массив объектов СообщениеПользователю, которые были сформированы в фоновом задании.
//
Функция ПрочитатьПрогрессИСообщения(Знач ИдентификаторЗадания, Знач Режим = "ПрогрессИСообщения")
Сообщения = Новый ФиксированныйМассив(Новый Массив); ЗаписатьОстаткиСообщенийПользователю(ИдентификаторЗадания);
Результат = Новый Структура("Сообщения, Прогресс", Сообщения, Неопределено);
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); УстановитьОтключениеБезопасногоРежима(Истина);
Если Задание = Неопределено Тогда УстановитьПривилегированныйРежим(Истина);
Возврат Результат;
КонецЕсли;
МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина); ПоследнееОповещение = Неопределено;
Если МассивСообщений = Неопределено Тогда Если ПропускатьПолученные Тогда
Возврат Результат; ПоследниеОповещения = ПараметрыСеанса.ДлительныеОперации.ПолученныеОповещения.Получить(ИдентификаторЗадания);
КонецЕсли; Если ПоследниеОповещения <> Неопределено Тогда
ПоследнееОповещение = ПоследниеОповещения[ВидОповещений];
Количество = МассивСообщений.Количество();
Сообщения = Новый Массив;
ЧитатьСообщения = (Режим = "ПрогрессИСообщения" Или Режим = "Сообщения");
ЧитатьПрогресс = (Режим = "ПрогрессИСообщения" Или Режим = "Прогресс");
Если ЧитатьСообщения И Не ЧитатьПрогресс Тогда
Результат.Сообщения = Новый ФиксированныйМассив(МассивСообщений);
Возврат Результат;
КонецЕсли;
Для Номер = 0 По Количество - 1 Цикл
Сообщение = МассивСообщений[Номер];
Если ЧитатьПрогресс И СтрНачинаетсяС(Сообщение.Текст, "{") Тогда
Позиция = СтрНайти(Сообщение.Текст, "}");
Если Позиция > 2 Тогда
ИдентификаторМеханизма = Сред(Сообщение.Текст, 2, Позиция - 2);
Если ИдентификаторМеханизма = СообщениеПрогресса() Тогда
ПолученныйТекст = Сред(Сообщение.Текст, Позиция + 1);
Результат.Прогресс = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПолученныйТекст);
Продолжить;
КонецЕсли;
КонецЕсли;
КонецЕсли; КонецЕсли;
Если ЧитатьСообщения Тогда КонецЕсли;
Сообщения.Добавить(Сообщение); Оповещения = СерверныеОповещения.СерверныеОповещенияДляКлиента(ИдентификаторЗадания, ПоследнееОповещение);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
СообщенияОповещений = Новый Массив;
Если ВидОповещений = "Сообщения" Тогда
Результат = Новый ФиксированныйМассив(СообщенияОповещений);
Иначе
Результат = Неопределено;
КонецЕсли;
Для Каждого Оповещение Из Оповещения Цикл
Параметры = Оповещение.Содержимое.Результат;
Если ТипЗнч(Параметры) <> Тип("Структура")
Или Не Параметры.Свойство("Результат")
Или ТипЗнч(Параметры.Результат) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Если ВидОповещений = "ДлительнаяОперацияЗавершена"
И Параметры.Свойство("ВидОповещения")
И Параметры.ВидОповещения = ВидОповещений Тогда
Возврат Параметры.Результат;
КонецЕсли;
Если Не Параметры.Результат.Свойство(ВидОповещений)
Или ВидОповещений = "Сообщения"
И ТипЗнч(Параметры.Результат[ВидОповещений]) <> Тип("ФиксированныйМассив")
Или ВидОповещений = "Прогресс"
И ТипЗнч(Параметры.Результат[ВидОповещений]) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Если ВидОповещений = "Сообщения" Тогда
Для Каждого Сообщение Из Параметры.Результат.Сообщения Цикл
СообщенияОповещений.Добавить(Сообщение)
КонецЦикла;
Результат = Новый ФиксированныйМассив(СообщенияОповещений);
Иначе
Результат = Параметры.Результат.Прогресс;
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
Результат.Сообщения = Новый ФиксированныйМассив(Сообщения); Если ПропускатьПолученные И ЗначениеЗаполнено(Оповещение) Тогда
Оповещение.Удалить("Содержимое");
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Свойства = Новый Структура(ПараметрыСеанса.ДлительныеОперации);
ПолученныеОповещения = Новый Соответствие(Свойства.ПолученныеОповещения);
ПоследниеОповещения = ПолученныеОповещения.Получить(ИдентификаторЗадания);
Если ПоследниеОповещения = Неопределено Тогда
ПоследниеОповещения = Новый Структура("Сообщения, Прогресс");
Иначе
ПоследниеОповещения = Новый Структура(ПоследниеОповещения);
КонецЕсли;
ПоследниеОповещения[ВидОповещений] = Новый ФиксированнаяСтруктура(Оповещение);
ПолученныеОповещения.Вставить(ИдентификаторЗадания, Новый ФиксированнаяСтруктура(ПоследниеОповещения));
КлючиУстаревших = Новый Массив;
Для Каждого КлючИЗначение Из ПолученныеОповещения Цикл
ПолученноеОповещение = ?(КлючИЗначение.Значение.Сообщения = Неопределено,
КлючИЗначение.Значение.Прогресс, КлючИЗначение.Значение.Сообщения);
Если ПолученноеОповещение.ДатаДобавления + 60*60 < ТекущаяДатаСеанса() Тогда
КлючиУстаревших.Добавить(КлючИЗначение.Ключ);
КонецЕсли;
КонецЦикла;
Для Каждого Ключ Из КлючиУстаревших Цикл
ПолученныеОповещения.Удалить(Ключ);
КонецЦикла;
Свойства.ПолученныеОповещения = Новый ФиксированноеСоответствие(ПолученныеОповещения);
ПараметрыСеанса.ДлительныеОперации = Новый ФиксированнаяСтруктура(Свойства);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецЕсли;
Возврат Результат; Возврат Результат;
КонецФункции КонецФункции
Функция ИмяОповещения()
Возврат "СтандартныеПодсистемы.БазоваяФункциональность.ДлительныеОперации";
КонецФункции
// Параметры:
// Данные - см. СерверныеОповещения.НовыеДанныеСообщения
//
// Возвращаемое значение:
// Булево
//
Функция ПропуститьОповещение(Данные) Экспорт
// Когда система взаимодействия не подключена
// оповещение о завершении нужно пропускать,
// так как оно требует дополнительного серверного
// вызова ДлительныеОперацииВызовСервера.ФоновоеЗаданиеЗавершено.
// При отсутствии системы взаимодействия этот контроль не нужен,
// так как используется функция ОперацияВыполнена
// в рамках дополнительного контроля завершения активных операций
// через функцию РезультатПроверкиДлительныхОпераций.
Возврат Данные.ИмяОповещения = ИмяОповещения()
И Данные.Результат.ВидОповещения = "ДлительнаяОперацияЗавершена"
И Не СерверныеОповещения.СистемаВзаимодействийПодключена();
КонецФункции
Процедура ОтправитьОповещениеКлиенту(ВидОповещения, ПередаваемоеЗначение, ФоновоеЗадание = Неопределено) Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
ЗаписатьСообщенияПользователю = ФоновоеЗадание <> Неопределено И ВидОповещения = "СообщениеПользователю";
Если ЗаписатьСообщенияПользователю Тогда
КлючСеансаРодителя = СерверныеОповещения.КлючСеанса();
ИдентификаторОсновногоЗадания = ФоновоеЗадание.УникальныйИдентификатор;
Иначе
КлючСеансаРодителя = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("КлючСеансаРодителя");
Если Не ЗначениеЗаполнено(КлючСеансаРодителя) Тогда
Возврат;
КонецЕсли;
ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ФоновоеЗадание = Неопределено Тогда
Возврат;
КонецЕсли;
ИдентификаторЗаданияМногопоточногоПроцесса =
ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ИдентификаторЗаданияМногопоточногоПроцесса");
ИдентификаторОсновногоЗадания = ?(ЗначениеЗаполнено(ИдентификаторЗаданияМногопоточногоПроцесса),
ИдентификаторЗаданияМногопоточногоПроцесса, ФоновоеЗадание.УникальныйИдентификатор);
КонецЕсли;
Если ВидОповещения = "ДлительнаяОперацияЗавершена" Тогда
Если ЗначениеЗаполнено(ИдентификаторЗаданияМногопоточногоПроцесса) Тогда
Возврат;
КонецЕсли;
Результат = ПередаваемоеЗначение;
Иначе
Результат = НовыйРезультатВыполненияОперации();
КонецЕсли;
Если ВидОповещения = "СообщениеПользователю" Тогда
Результат.Сообщения = Новый ФиксированныйМассив(
ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПередаваемоеЗначение));
ИначеЕсли ВидОповещения = "Прогресс" Тогда
Сообщения = ПолучитьСообщенияПользователю(Истина);
Для Каждого Сообщение Из Сообщения Цикл
ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение);
КонецЦикла;
Результат.Сообщения = Новый ФиксированныйМассив(Новый Массив);
Результат.Прогресс = ПередаваемоеЗначение;
ИначеЕсли ВидОповещения = "ДлительнаяОперацияЗавершена" Тогда
Сообщения = ПолучитьСообщенияПользователю(Истина);
Для Каждого Сообщение Из Сообщения Цикл
ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение);
КонецЦикла;
КонецЕсли;
ПараметрыОповещения = Новый Структура("ВидОповещения, ИдентификаторЗадания, Результат",
ВидОповещения, ИдентификаторОсновногоЗадания, Результат);
КлючиСеансов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(КлючСеансаРодителя);
Адресаты = Новый Соответствие;
Адресаты.Вставить(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор, КлючиСеансов);
СерверныеОповещения.ОтправитьСерверноеОповещениеСИдентификаторомГруппы(ИмяОповещения(),
ПараметрыОповещения, Адресаты, Не ЗаписатьСообщенияПользователю, ИдентификаторОсновногоЗадания);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецПроцедуры
// Запись в очередь еще не записанных сообщений, которые были отправлены
// без использования процедуры ОбщегоНазначения.СообщитьПользователю.
//
// Параметры:
// ИдентификаторЗадания - УникальныйИдентификатор
//
Процедура ЗаписатьОстаткиСообщенийПользователю(ИдентификаторЗадания)
ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если ФоновоеЗадание <> Неопределено Тогда
Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина);
Для Каждого Сообщение Из Сообщения Цикл
ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение, ФоновоеЗадание);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ЕстьФоновыеЗаданияВФайловойИБ() Функция ЕстьФоновыеЗаданияВФайловойИБ()
ЗапущеноЗаданийВФайловойИБ = 0; ЗапущеноЗаданийВФайловойИБ = 0;
@@ -1543,6 +1738,10 @@
// Многопоточные операции // Многопоточные операции
Функция ИмяМетодаМногопоточногоПроцесса()
Возврат "ДлительныеОперации.ВыполнитьМногопоточныйПроцесс";
КонецФункции
Функция ВыполнитьМногопоточныйПроцесс(ПараметрыОперации) Экспорт Функция ВыполнитьМногопоточныйПроцесс(ПараметрыОперации) Экспорт
УдалитьНесуществующиеПотоки(); УдалитьНесуществующиеПотоки();
@@ -1586,7 +1785,7 @@
КонецЕсли; КонецЕсли;
ПроброситьПрогрессВУправляющийПоток(Поток.ИдентификаторЗадания); ОтправитьСообщенияПотока(Поток.ИдентификаторЗадания);
СтатусОжидания = ОжидатьСвободныйПоток(ИдентификаторФормы, Результаты, Поток.ИдентификаторЗадания, ПараметрыОперации.ПрерватьВыполнениеЕслиОшибка); СтатусОжидания = ОжидатьСвободныйПоток(ИдентификаторФормы, Результаты, Поток.ИдентификаторЗадания, ПараметрыОперации.ПрерватьВыполнениеЕслиОшибка);
@@ -1746,7 +1945,7 @@
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
ПроброситьПрогрессВУправляющийПоток(ИдентификаторЗадания); ОтправитьСообщенияПотока(ИдентификаторЗадания);
ОжидатьЗавершениеПотока(Потоки[0]); ОжидатьЗавершениеПотока(Потоки[0]);
@@ -1758,14 +1957,23 @@
КонецФункции КонецФункции
Процедура ПроброситьПрогрессВУправляющийПоток(Знач ИдентификаторЗадания) // Отправляет сообщения потока, которые были выведены
// без использования процедуры ОбщегоНазначения.СообщитьПользователю.
//
// Параметры:
// ИдентификаторЗадания - УникальныйИдентификатор
//
Процедура ОтправитьСообщенияПотока(Знач ИдентификаторЗадания)
ПрочитанныйПрогресс = ПрочитатьПрогрессИСообщения(ИдентификаторЗадания); ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если ФоновоеЗадание = Неопределено Тогда
Если ПрочитанныйПрогресс.Прогресс <> Неопределено Тогда Возврат;
СообщитьПрогресс(ПрочитанныйПрогресс.Прогресс.Процент,
ПрочитанныйПрогресс.Прогресс.Текст);
КонецЕсли; КонецЕсли;
Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина);
Для Каждого Сообщение Из Сообщения Цикл
ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение);
КонецЦикла;
КонецПроцедуры КонецПроцедуры
@@ -1807,7 +2015,7 @@
Если ЗначениеЗаполнено(Поток.ИдентификаторЗадания) Тогда Если ЗначениеЗаполнено(Поток.ИдентификаторЗадания) Тогда
ПроброситьПрогрессВУправляющийПоток(Поток.ИдентификаторЗадания); ОтправитьСообщенияПотока(Поток.ИдентификаторЗадания);
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Поток.ИдентификаторЗадания); Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Поток.ИдентификаторЗадания);
@@ -8,14 +8,20 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Функция ОперацииВыполнены(Знач ЗаданияДляПроверки, ЗаданияДляОтмены) Экспорт Функция ФоновоеЗаданиеЗавершено(ИдентификаторЗадания) Экспорт
Результат = ДлительныеОперации.ОперацииВыполнены(ЗаданияДляПроверки); ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Для каждого ИдентификаторЗадания Из ЗаданияДляОтмены Цикл Если ФоновоеЗадание = Неопределено Тогда
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания); Возврат Истина;
Результат.Вставить(ИдентификаторЗадания, Новый Структура("Статус", "Отменено")); КонецЕсли;
КонецЦикла;
Возврат Результат; Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
Возврат Истина;
КонецЕсли;
ФоновоеЗадание = ФоновоеЗадание.ОжидатьЗавершенияВыполнения(3);
Возврат ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно;
КонецФункции КонецФункции
@@ -1,162 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Процедура КонтрольДлительныхОпераций() Экспорт
АктивныеДлительныеОперации = ДлительныеОперацииКлиент.АктивныеДлительныеОперации();
Если АктивныеДлительныеОперации.Обработка Тогда
Возврат;
КонецЕсли;
АктивныеДлительныеОперации.Обработка = Истина;
Попытка
ПроконтролироватьДлительныеОперации(АктивныеДлительныеОперации.Список);
АктивныеДлительныеОперации.Обработка = Ложь;
Исключение
АктивныеДлительныеОперации.Обработка = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроконтролироватьДлительныеОперации(АктивныеДлительныеОперации)
ТекущаяДата = ТекущаяДата(); // АПК:143 Дата сеанса не используется для проверки интервалов
КонтролируемыеОперации = Новый Соответствие;
ЗаданияДляПроверки = Новый Массив;
ЗаданияДляОтмены = Новый Массив;
Для каждого ДлительнаяОперация Из АктивныеДлительныеОперации Цикл
ДлительнаяОперация = ДлительнаяОперация.Значение;
ОперацияОтменена = Ложь;
Если ДлительнаяОперация.ФормаВладелец <> Неопределено И Не ДлительнаяОперация.ФормаВладелец.Открыта() Тогда
ОперацияОтменена = Истина;
КонецЕсли;
Если ОперацияОтменена Тогда
КонтролируемыеОперации.Вставить(ДлительнаяОперация.ИдентификаторЗадания, ДлительнаяОперация);
ЗаданияДляОтмены.Добавить(ДлительнаяОперация.ИдентификаторЗадания);
ИначеЕсли ДлительнаяОперация.Контроль <= ТекущаяДата Тогда
КонтролируемыеОперации.Вставить(ДлительнаяОперация.ИдентификаторЗадания, ДлительнаяОперация);
ЗаданиеДляПроверки = Новый Структура("ИдентификаторЗадания,ВыводитьПрогрессВыполнения,ВыводитьСообщения");
ЗаполнитьЗначенияСвойств(ЗаданиеДляПроверки, ДлительнаяОперация);
ЗаданияДляПроверки.Добавить(ЗаданиеДляПроверки);
КонецЕсли;
КонецЦикла;
Статусы = Новый Соответствие;
Статусы = ДлительныеОперацииВызовСервера.ОперацииВыполнены(ЗаданияДляПроверки, ЗаданияДляОтмены);
Для каждого СтатусОперации Из Статусы Цикл
Операция = КонтролируемыеОперации[СтатусОперации.Ключ];
Статус = СтатусОперации.Значение;
Попытка
Если ПроконтролироватьДлительнуюОперацию(Операция, Статус) Тогда
АктивныеДлительныеОперации.Удалить(СтатусОперации.Ключ);
КонецЕсли;
Исключение
// далее не отслеживаем
АктивныеДлительныеОперации.Удалить(СтатусОперации.Ключ);
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
Если АктивныеДлительныеОперации.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ТекущаяДата = ТекущаяДата(); // АПК:143 Дата сеанса не используется для проверки интервалов
Интервал = 120;
Для каждого Операция Из АктивныеДлительныеОперации Цикл
Интервал = Макс(Мин(Интервал, Операция.Значение.Контроль - ТекущаяДата), 1);
КонецЦикла;
ПодключитьОбработчикОжидания("КонтрольДлительныхОпераций", Интервал, Истина);
КонецПроцедуры
Функция ПроконтролироватьДлительнуюОперацию(ДлительнаяОперация, Статус)
Если Статус.Статус <> "Отменено" И ДлительнаяОперация.ОповещениеОПрогрессеВыполнения <> Неопределено Тогда
Прогресс = Новый Структура;
Прогресс.Вставить("Статус", Статус.Статус);
Прогресс.Вставить("ИдентификаторЗадания", ДлительнаяОперация.ИдентификаторЗадания);
Прогресс.Вставить("Прогресс", Статус.Прогресс);
Прогресс.Вставить("Сообщения", Статус.Сообщения);
ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОПрогрессеВыполнения, Прогресс);
КонецЕсли;
Если Статус.Статус = "Выполнено" Тогда
ДлительныеОперацииКлиент.ПоказатьОповещение(ДлительнаяОперация.ОповещениеПользователя);
ВыполнитьОповещение(ДлительнаяОперация, Статус);
Возврат Истина;
ИначеЕсли Статус.Статус = "Ошибка" Тогда
ВыполнитьОповещение(ДлительнаяОперация, Статус);
Возврат Истина;
ИначеЕсли Статус.Статус = "Отменено" Тогда
ВыполнитьОповещение(ДлительнаяОперация, Статус);
Возврат Истина;
КонецЕсли;
ИнтервалОжидания = ДлительнаяОперация.ТекущийИнтервал;
Если ДлительнаяОперация.Интервал = 0 Тогда
ИнтервалОжидания = ИнтервалОжидания * 1.4;
Если ИнтервалОжидания > 15 Тогда
ИнтервалОжидания = 15;
КонецЕсли;
ДлительнаяОперация.ТекущийИнтервал = ИнтервалОжидания;
КонецЕсли;
ДлительнаяОперация.Контроль = ТекущаяДата() + ИнтервалОжидания; // АПК:143 Дата сеанса не используется для проверки интервалов
Возврат Ложь;
КонецФункции
Процедура ВыполнитьОповещение(Знач ДлительнаяОперация, Знач Статус)
Если ДлительнаяОперация.ОповещениеОЗавершении = Неопределено Тогда
Возврат;
КонецЕсли;
Если Статус.Статус = "Отменено" Тогда
Результат = Неопределено;
Иначе
Результат = Новый Структура;
Результат.Вставить("Статус", Статус.Статус);
Если ДлительнаяОперация.Свойство("АдресРезультата") Тогда
Результат.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресДополнительногоРезультата") Тогда
Результат.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата);
КонецЕсли;
Результат.Вставить("КраткоеПредставлениеОшибки", Статус.КраткоеПредставлениеОшибки);
Результат.Вставить("ПодробноеПредставлениеОшибки", Статус.ПодробноеПредставлениеОшибки);
Результат.Вставить("Сообщения", Статус.Сообщения);
КонецЕсли;
ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОЗавершении, Результат);
КонецПроцедуры
#КонецОбласти
@@ -8,9 +8,11 @@
#Область ПрограммныйИнтерфейс #Область ПрограммныйИнтерфейс
// Ожидать завершения выполнения процедуры в фоновом задании и открыть форму ожидания длительной операции. // Открыть стандартную форму ожидания завершения длительной операции или использовать собственную форму
// Применяется совместно с функцией ДлительныеОперации.ВыполнитьВФоне для повышения отзывчивости пользовательского // и подключить обработчик оповещения о завершении и прогрессе выполнения процедуры длительной операции.
// интерфейса, заменяя длительный серверный вызов на запуск фонового задания. //
// Применяется совместно с функцией ДлительныеОперации.ВыполнитьВФоне для повышения отзывчивости
// пользовательского интерфейса, заменяя длительный серверный вызов на запуск фонового задания.
// //
// Параметры: // Параметры:
// ДлительнаяОперация - см. ДлительныеОперации.ВыполнитьВФоне // ДлительнаяОперация - см. ДлительныеОперации.ВыполнитьВФоне
@@ -27,9 +29,11 @@
// в которое будет помещен (или уже помещен) результат работы процедуры. // в которое будет помещен (или уже помещен) результат работы процедуры.
// ** КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка". // ** КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка".
// ** ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка". // ** ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка".
// ** Сообщения - ФиксированныйМассив // ** Сообщения - ФиксированныйМассив - массив объектов СообщениеПользователю,
// - Неопределено - массив объектов СообщениеПользователю,
// сформированных в процедуре-обработчике длительной операции. // сформированных в процедуре-обработчике длительной операции.
// Массив будет пустым, когда в параметре ПараметрыОжидания
// свойство ВыводитьОкноОжидания = Истина или
// заполнено свойство ОповещениеОПрогрессеВыполнения.
// * ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения. // * ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения.
// ПараметрыОжидания - см. ДлительныеОперацииКлиент.ПараметрыОжидания // ПараметрыОжидания - см. ДлительныеОперацииКлиент.ПараметрыОжидания
// //
@@ -38,60 +42,40 @@
ПроверитьПараметрыОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); ПроверитьПараметрыОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
РасширенныеПараметры = ПараметрыОжидания(Неопределено);
Если ПараметрыОжидания <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(РасширенныеПараметры, ПараметрыОжидания);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресРезультата") Тогда
РасширенныеПараметры.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресДополнительногоРезультата") Тогда
РасширенныеПараметры.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата);
КонецЕсли;
РасширенныеПараметры.Вставить("ИдентификаторЗадания", ДлительнаяОперация.ИдентификаторЗадания);
Если ДлительнаяОперация.Статус <> "Выполняется" Тогда Если ДлительнаяОперация.Статус <> "Выполняется" Тогда
Если ОповещениеОЗавершении <> Неопределено Тогда РасширенныеПараметры.Вставить("НакопленныеСообщения", Новый Массив(ДлительнаяОперация.Сообщения));
Если ДлительнаяОперация.Статус <> "Отменено" Тогда РасширенныеПараметры.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении);
Результат = Новый Структура; ЗавершитьДлительнуюОперацию(РасширенныеПараметры, ДлительнаяОперация);
Результат.Вставить("Статус", ДлительнаяОперация.Статус);
Если ДлительнаяОперация.Свойство("АдресРезультата") Тогда
Результат.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресДополнительногоРезультата") Тогда
Результат.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата);
КонецЕсли;
Результат.Вставить("КраткоеПредставлениеОшибки", ДлительнаяОперация.КраткоеПредставлениеОшибки);
Результат.Вставить("ПодробноеПредставлениеОшибки", ДлительнаяОперация.ПодробноеПредставлениеОшибки);
Результат.Вставить("Сообщения", ?(ПараметрыОжидания <> Неопределено И ПараметрыОжидания.ВыводитьСообщения,
ДлительнаяОперация.Сообщения, Неопределено));
Иначе
Результат = Неопределено;
КонецЕсли;
Если ДлительнаяОперация.Статус = "Выполнено" И ПараметрыОжидания <> Неопределено Тогда
ПоказатьОповещение(ПараметрыОжидания.ОповещениеПользователя);
КонецЕсли;
ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Результат);
КонецЕсли;
Возврат; Возврат;
КонецЕсли; КонецЕсли;
ПараметрыФормы = ПараметрыОжидания(Неопределено); Если РасширенныеПараметры.ВыводитьОкноОжидания Тогда
Если ПараметрыОжидания <> Неопределено Тогда РасширенныеПараметры.Удалить("ФормаВладелец");
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ПараметрыОжидания);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресРезультата") Тогда
ПараметрыФормы.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресДополнительногоРезультата") Тогда
ПараметрыФормы.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата);
КонецЕсли;
ПараметрыФормы.Вставить("ИдентификаторЗадания", ДлительнаяОперация.ИдентификаторЗадания);
Если ПараметрыФормы.ВыводитьОкноОжидания Тогда
ПараметрыФормы.Удалить("ФормаВладелец");
ОткрытьФорму("ОбщаяФорма.ДлительнаяОперация", ПараметрыФормы, ОткрытьФорму("ОбщаяФорма.ДлительнаяОперация", РасширенныеПараметры,
?(ПараметрыОжидания <> Неопределено, ПараметрыОжидания.ФормаВладелец, Неопределено), ?(ПараметрыОжидания <> Неопределено, ПараметрыОжидания.ФормаВладелец, Неопределено),
,,,ОповещениеОЗавершении); ,,,ОповещениеОЗавершении);
Иначе Иначе
ПараметрыФормы.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); РасширенныеПараметры.Вставить("НакопленныеСообщения", Новый Массив);
ПараметрыФормы.Вставить("ТекущийИнтервал", ?(ПараметрыФормы.Интервал <> 0, ПараметрыФормы.Интервал, 1)); РасширенныеПараметры.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении);
ПараметрыФормы.Вставить("Контроль", ТекущаяДата() + ПараметрыФормы.ТекущийИнтервал); // АПК:143 Дата сеанса не используется для проверки интервалов РасширенныеПараметры.Вставить("ТекущийИнтервал", ?(РасширенныеПараметры.Интервал <> 0, РасширенныеПараметры.Интервал, 1));
РасширенныеПараметры.Вставить("Контроль", ТекущаяДата() + РасширенныеПараметры.ТекущийИнтервал); // АПК:143 Дата сеанса не используется для проверки интервалов
Операции = АктивныеДлительныеОперации(); Операции = АктивныеДлительныеОперации();
Операции.Список.Вставить(ПараметрыФормы.ИдентификаторЗадания, ПараметрыФормы); Операции.Список.Вставить(РасширенныеПараметры.ИдентификаторЗадания, РасширенныеПараметры);
СерверныеОповещенияКлиент.ПодключитьОбработчикПроверкиПолученияСерверныхОповещений();
ПодключитьОбработчикОжидания("КонтрольДлительныхОпераций", ПараметрыФормы.ТекущийИнтервал, Истина);
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -115,20 +99,20 @@
// Процедура-обработчик длительной операции может сообщить о ходе своего выполнения // Процедура-обработчик длительной операции может сообщить о ходе своего выполнения
// с помощью вызова процедуры ДлительныеОперации.СообщитьПрогресс. // с помощью вызова процедуры ДлительныеОперации.СообщитьПрогресс.
// * ОповещениеОПрогрессеВыполнения - ОписаниеОповещения - оповещение, которое периодически вызывается при // * ОповещениеОПрогрессеВыполнения - ОписаниеОповещения - оповещение, которое периодически вызывается при
// проверке готовности фонового задания. Параметры процедуры-обработчика оповещения: // проверке готовности фонового задания, если ВыводитьОкноОжидания = Ложь.
// # Прогресс - Структура, Неопределено - структура со свойствами или Неопределено, если задание было отменено. Свойства: // Параметры процедуры-обработчика оповещения:
// ## Статус - Строка - "Выполняется", если задание еще не завершилось; // # ДлительнаяОперация - Структура, Неопределено - структура со свойствами или Неопределено, если задание было
// отменено. Свойства: ## Статус - Строка - "Выполняется", если задание еще не завершилось;
// "Выполнено", если задание было успешно выполнено; // "Выполнено", если задание было успешно выполнено;
// "Ошибка", если задание завершено с ошибкой; // "Ошибка", если задание завершено с ошибкой;
// "Отменено", если задание отменено пользователем или администратором. // "Отменено", если задание отменено пользователем или администратором.
// ## ИдентификаторЗадания - УникальныйИдентификатор - идентификатор запущенного фонового задания. // ## ИдентификаторЗадания - УникальныйИдентификатор - идентификатор запущенного фонового задания.
// ## Прогресс - Структура, Неопределено - результат функции ДлительныеОперации.ПрочитатьПрогресс, // ## Прогресс - Структура, Неопределено - результат функции ДлительныеОперации.ПрочитатьПрогресс.
// если ВыводитьПрогрессВыполнения = Истина. // ## Сообщения - ФиксированныйМассив, Неопределено - массив объектов СообщениеПользователю,
// ## Сообщения - ФиксированныйМассив, Неопределено - если ВыводитьСообщения = Истина, массив объектов СообщениеПользователю,
// очередная порция сообщений, сформированных в процедуре-обработчике длительной операции. // очередная порция сообщений, сформированных в процедуре-обработчике длительной операции.
// # ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения. // # ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения.
// //
// * ВыводитьСообщения - Булево - выводить в оповещения о завершении и прогресс сообщения, // * ВыводитьСообщения - Булево - выводить на форме ожидания сообщения,
// сформированные в процедуре-обработчике длительной операции. // сформированные в процедуре-обработчике длительной операции.
// * Интервал - Число - интервал в секундах между проверками готовности длительной операции. // * Интервал - Число - интервал в секундах между проверками готовности длительной операции.
// По умолчанию 0 - после каждой проверки интервал увеличивается с 1 до 15 секунд // По умолчанию 0 - после каждой проверки интервал увеличивается с 1 до 15 секунд
@@ -247,18 +231,315 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
// Возвращаемое значение: ////////////////////////////////////////////////////////////////////////////////
// Структура: // Обработчики событий подсистем конфигурации.
// * Обработка - Булево
// * Список - Соответствие // Параметры:
// Параметры - см. ОбщегоНазначенияПереопределяемый.ПередПериодическойОтправкойДанныхКлиентаНаСервер.Параметры
// ОбсужденияАктивны - Булево - для доставки сообщений используется подсистема взаимодействия.
// Интервал - Число - уточняемое значение - число секунд до следующей проверки.
// //
Функция АктивныеДлительныеОперации() Экспорт Процедура ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры, ОбсужденияАктивны, Интервал) Экспорт
Результат = ПараметрыПроверкиДлительныхОпераций(ОбсужденияАктивны, Интервал);
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Параметры.Вставить("СтандартныеПодсистемы.БазоваяФункциональность.ПараметрыПроверкиДлительныхОпераций", Результат)
КонецПроцедуры
// Параметры:
// Результаты - см. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере.Результаты
// ОбсужденияАктивны - Булево - для доставки сообщений используется подсистема взаимодействия.
// Интервал - Число - уточняемое значение - число секунд до следующей проверки.
//
Процедура ПослеПериодическогоПолученияДанныхКлиентаНаСервере(Результаты, ОбсужденияАктивны, Интервал) Экспорт
РезультатыОпераций = Результаты.Получить( // см. ДлительныеОперации.РезультатПроверкиДлительныхОпераций
"СтандартныеПодсистемы.БазоваяФункциональность.РезультатПроверкиДлительныхОпераций");
Если РезультатыОпераций = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДлительныеОперации = АктивныеДлительныеОперации();
АктивныеДлительныеОперации = ТекущиеДлительныеОперации.Список;
КонтролируемыеОперации = ТекущиеДлительныеОперации.КонтролируемыеОперации;
Для Каждого РезультатОперации Из РезультатыОпераций Цикл
Операция = КонтролируемыеОперации[РезультатОперации.Ключ];
Результат = РезультатОперации.Значение; // Структура
Результат.Вставить("ФоновоеЗаданиеЗавершено");
ОбработатьРезультатОперации(АктивныеДлительныеОперации, Операция, Результат);
КонецЦикла;
Если АктивныеДлительныеОперации.Количество() = 0 Тогда
Возврат;
КонецЕсли;
УточнитьИнтервалОбработчикаОжидания(Интервал, АктивныеДлительныеОперации, ОбсужденияАктивны);
КонецПроцедуры
// Параметры:
// ОбсужденияАктивны - Булево - для доставки сообщений используется подсистема взаимодействия.
// Интервал - Число - уточняемое значение - число секунд до следующей проверки.
//
// Возвращаемое значение:
// Неопределено - проверка не требуется.
// Структура:
// * ЗаданияДляПроверки - Массив из УникальныйИдентификатор
// * ЗаданияДляОтмены - Массив из УникальныйИдентификатор
//
Функция ПараметрыПроверкиДлительныхОпераций(ОбсужденияАктивны, Интервал)
ТекущаяДата = ТекущаяДата(); // АПК:143 Дата сеанса не используется для проверки интервалов времени
КонтролируемыеОперации = Новый Соответствие;
ЗаданияДляПроверки = Новый Массив;
ЗаданияДляОтмены = Новый Массив;
ТекущиеДлительныеОперации = АктивныеДлительныеОперации();
АктивныеДлительныеОперации = ТекущиеДлительныеОперации.Список;
ТекущиеДлительныеОперации.КонтролируемыеОперации = КонтролируемыеОперации;
Если Не ЗначениеЗаполнено(АктивныеДлительныеОперации) Тогда
Возврат Неопределено;
КонецЕсли;
Для Каждого ДлительнаяОперация Из АктивныеДлительныеОперации Цикл
ДлительнаяОперация = ДлительнаяОперация.Значение;
Если ДлительнаяОперацияОтменена(ДлительнаяОперация) Тогда
КонтролируемыеОперации.Вставить(ДлительнаяОперация.ИдентификаторЗадания, ДлительнаяОперация);
ЗаданияДляОтмены.Добавить(ДлительнаяОперация.ИдентификаторЗадания);
Иначе
ИнтервалКонтроляОбсуждений = ИнтервалКонтроляОбсуждений();
ДатаКонтроля = ДлительнаяОперация.Контроль
+ ?(Не ОбсужденияАктивны Или ДлительнаяОперация.ТекущийИнтервал > ИнтервалКонтроляОбсуждений,
0, ИнтервалКонтроляОбсуждений - ДлительнаяОперация.ТекущийИнтервал);
Если ДатаКонтроля <= ТекущаяДата Тогда
КонтролируемыеОперации.Вставить(ДлительнаяОперация.ИдентификаторЗадания, ДлительнаяОперация);
ЗаданияДляПроверки.Добавить(ДлительнаяОперация.ИдентификаторЗадания);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(ЗаданияДляПроверки)
И Не ЗначениеЗаполнено(ЗаданияДляОтмены) Тогда
УточнитьИнтервалОбработчикаОжидания(Интервал, АктивныеДлительныеОперации, ОбсужденияАктивны);
Возврат Неопределено;
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("ЗаданияДляПроверки", ЗаданияДляПроверки);
Результат.Вставить("ЗаданияДляОтмены", ЗаданияДляОтмены);
Возврат Результат;
КонецФункции
Функция ДлительнаяОперацияОтменена(ДлительнаяОперация)
Возврат ДлительнаяОперация.ФормаВладелец <> Неопределено
И Не ДлительнаяОперация.ФормаВладелец.Открыта();
КонецФункции
Процедура ОбработатьРезультатОперации(АктивныеДлительныеОперации, Операция, Результат)
Если АктивныеДлительныеОперации.Получить(Операция.ИдентификаторЗадания) = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ОбработатьРезультатАктивнойОперации(Операция, Результат) Тогда
АктивныеДлительныеОперации.Удалить(Операция.ИдентификаторЗадания);
КонецЕсли;
Исключение
// далее не отслеживаем
АктивныеДлительныеОперации.Удалить(Операция.ИдентификаторЗадания);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура УточнитьИнтервалОбработчикаОжидания(Интервал, АктивныеДлительныеОперации, ОбсужденияАктивны)
ТекущаяДата = ТекущаяДата(); // АПК:143 Дата сеанса не используется для проверки интервалов времени
НовыйИнтервал = 120;
Для каждого Операция Из АктивныеДлительныеОперации Цикл
НовыйИнтервал = Макс(Мин(НовыйИнтервал, Операция.Значение.Контроль - ТекущаяДата), 1);
КонецЦикла;
ИнтервалКонтроляОбсуждений = ИнтервалКонтроляОбсуждений();
Если ОбсужденияАктивны И НовыйИнтервал < ИнтервалКонтроляОбсуждений Тогда
НовыйИнтервал = ИнтервалКонтроляОбсуждений;
КонецЕсли;
Если Интервал > НовыйИнтервал Тогда
Интервал = НовыйИнтервал;
КонецЕсли;
КонецПроцедуры
// Возвращаемое значение:
// Число - число секунд контроля длительной операции
// через общий серверный вызов, когда обсуждения
// активны, но сообщений не поступило, например,
// при операции дольше указанного числа секунд
// или когда произошло аварийное завершение фонового задания и
// сообщение через систему взаимодействия не было отправлено.
//
Функция ИнтервалКонтроляОбсуждений()
Возврат 60;
КонецФункции
// См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения
Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт
АктивныеДлительныеОперации = АктивныеДлительныеОперации().Список;
Операция = АктивныеДлительныеОперации.Получить(Результат.ИдентификаторЗадания);
Если Операция = Неопределено
Или ДлительнаяОперацияОтменена(Операция) Тогда
Возврат;
КонецЕсли;
ОбработатьРезультатОперации(АктивныеДлительныеОперации, Операция, Результат.Результат);
КонецПроцедуры
// Параметры:
// ДлительнаяОперация - Структура:
// * ФормаВладелец - ФормаКлиентскогоПриложения
// - Неопределено
// * Заголовок - Строка
// * ТекстСообщения - Строка
// * ВыводитьОкноОжидания - Булево
// * ВыводитьПрогрессВыполнения - Булево
// * ОповещениеОПрогрессеВыполнения - ОписаниеОповещения
// - Неопределено
// * ВыводитьСообщения - Булево
// * Интервал - Число
// * ОповещениеПользователя - Структура:
// ** Показать - Булево
// ** Текст - Строка
// ** НавигационнаяСсылка - Строка
// ** Пояснение - Строка
// ** Картинка - Картинка
// ** Важное - Булево
// * ПолучатьРезультат
//
// * ИдентификаторЗадания - УникальныйИдентификатор
// * НакопленныеСообщения - Массив
// * ОповещениеОЗавершении - ОписаниеОповещения
// - Неопределено
// * ТекущийИнтервал - Число
// * Контроль - Дата
//
// Результат - см. ДлительныеОперации.НовыйРезультатВыполненияОперации
//
Функция ОбработатьРезультатАктивнойОперации(ДлительнаяОперация, Результат)
Если Результат.Статус <> "Отменено" Тогда
Если ДлительнаяОперация.ОповещениеОПрогрессеВыполнения <> Неопределено Тогда
Прогресс = Новый Структура;
Прогресс.Вставить("Статус", Результат.Статус);
Прогресс.Вставить("ИдентификаторЗадания", ДлительнаяОперация.ИдентификаторЗадания);
Прогресс.Вставить("Прогресс", Результат.Прогресс);
Прогресс.Вставить("Сообщения", Результат.Сообщения);
ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОПрогрессеВыполнения, Прогресс);
ИначеЕсли Результат.Сообщения <> Неопределено Тогда
Для Каждого Сообщение Из Результат.Сообщения Цикл
ДлительнаяОперация.НакопленныеСообщения.Добавить(Сообщение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если Результат.Статус <> "Выполняется" Тогда
Если Результат.Статус <> "Выполнено"
Или Результат.Свойство("ФоновоеЗаданиеЗавершено")
Или Не ( ДлительнаяОперация.Свойство("АдресРезультата")
И ЗначениеЗаполнено(ДлительнаяОперация.АдресРезультата)
Или ДлительнаяОперация.Свойство("АдресДополнительногоРезультата")
И ЗначениеЗаполнено(ДлительнаяОперация.АдресДополнительногоРезультата))
// Требуется проверка, так как оповещение отправляется в конце фонового задания
// до его завершения и данные результата еще недоступны по адресу временного хранилища.
Или ДлительныеОперацииВызовСервера.ФоновоеЗаданиеЗавершено(ДлительнаяОперация.ИдентификаторЗадания) Тогда
ЗавершитьДлительнуюОперацию(ДлительнаяОперация, Результат);
Возврат Истина;
КонецЕсли;
КонецЕсли;
ИнтервалОжидания = ДлительнаяОперация.ТекущийИнтервал;
Если ДлительнаяОперация.Интервал = 0 Тогда
ИнтервалОжидания = ИнтервалОжидания * 1.4;
Если ИнтервалОжидания > 15 Тогда
ИнтервалОжидания = 15;
КонецЕсли;
ДлительнаяОперация.ТекущийИнтервал = ИнтервалОжидания;
КонецЕсли;
ДлительнаяОперация.Контроль = ТекущаяДата() + ИнтервалОжидания; // АПК:143 Дата сеанса не используется для проверки интервалов
Возврат Ложь;
КонецФункции
Процедура ЗавершитьДлительнуюОперацию(Знач ДлительнаяОперация, Знач Статус)
Если Статус.Статус = "Выполнено" Тогда
ПоказатьОповещение(ДлительнаяОперация.ОповещениеПользователя);
КонецЕсли;
Если ДлительнаяОперация.ОповещениеОЗавершении = Неопределено Тогда
Возврат;
КонецЕсли;
Если Статус.Статус = "Отменено" Тогда
Результат = Неопределено;
Иначе
Результат = Новый Структура;
Результат.Вставить("Статус", Статус.Статус);
Если ДлительнаяОперация.Свойство("АдресРезультата") Тогда
Результат.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата);
КонецЕсли;
Если ДлительнаяОперация.Свойство("АдресДополнительногоРезультата") Тогда
Результат.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата);
КонецЕсли;
Результат.Вставить("КраткоеПредставлениеОшибки", Статус.КраткоеПредставлениеОшибки);
Результат.Вставить("ПодробноеПредставлениеОшибки", Статус.ПодробноеПредставлениеОшибки);
Результат.Вставить("Сообщения", Новый ФиксированныйМассив(ДлительнаяОперация.НакопленныеСообщения));
КонецЕсли;
ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОЗавершении, Результат);
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * Список - Соответствие из КлючИЗначение:
// ** Ключ - УникальныйИдентификатор - идентификатор фонового задания.
// ** Значение - см. ОбработатьРезультатАктивнойОперации.ДлительнаяОперация
// * КонтролируемыеОперации - Соответствие из КлючИЗначение:
// ** Ключ - УникальныйИдентификатор - идентификатор фонового задания.
// ** Значение - см. ОбработатьРезультатАктивнойОперации.ДлительнаяОперация
//
Функция АктивныеДлительныеОперации()
ИмяПараметра = "СтандартныеПодсистемы.АктивныеДлительныеОперации"; ИмяПараметра = "СтандартныеПодсистемы.АктивныеДлительныеОперации";
Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
Операции = Новый Структура("Обработка,Список", Ложь, Новый Соответствие); Операции = Новый Структура;
Операции.Вставить("Список", Новый Соответствие);
Операции.Вставить("КонтролируемыеОперации", Новый Соответствие);
ПараметрыПриложения.Вставить(ИмяПараметра, Операции); ПараметрыПриложения.Вставить(ИмяПараметра, Операции);
КонецЕсли; КонецЕсли;
Возврат ПараметрыПриложения[ИмяПараметра]; Возврат ПараметрыПриложения[ИмяПараметра];
КонецФункции КонецФункции
@@ -310,20 +591,32 @@
КонецПроцедуры КонецПроцедуры
Процедура ПоказатьОповещение(ОповещениеПользователя) Экспорт Процедура ПоказатьОповещение(ОповещениеПользователя, ВладелецФормы = Неопределено) Экспорт
Оповещение = ОповещениеПользователя; Оповещение = ОповещениеПользователя;
Если Не Оповещение.Показать Тогда Если Не Оповещение.Показать Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
НавигационнаяСсылкаОповещения = Оповещение.НавигационнаяСсылка;
ПояснениеОповещения = Оповещение.Пояснение;
Если ВладелецФормы <> Неопределено И ВладелецФормы.Окно <> Неопределено Тогда
Если НавигационнаяСсылкаОповещения = Неопределено Тогда
НавигационнаяСсылкаОповещения = ВладелецФормы.Окно.ПолучитьНавигационнуюСсылку();
КонецЕсли;
Если ПояснениеОповещения = Неопределено Тогда
ПояснениеОповещения = ВладелецФормы.Окно.Заголовок;
КонецЕсли;
КонецЕсли;
СтатусОповещения = Неопределено; СтатусОповещения = Неопределено;
Если ТипЗнч(Оповещение.Важное) = Тип("Булево") Тогда Если ТипЗнч(Оповещение.Важное) = Тип("Булево") Тогда
СтатусОповещения = ?(Оповещение.Важное, СтатусОповещенияПользователя.Важное, СтатусОповещенияПользователя.Информация); СтатусОповещения = ?(Оповещение.Важное, СтатусОповещенияПользователя.Важное, СтатусОповещенияПользователя.Информация);
КонецЕсли; КонецЕсли;
ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")), ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")),
Оповещение.НавигационнаяСсылка, Оповещение.Пояснение, Оповещение.Картинка, СтатусОповещения); НавигационнаяСсылкаОповещения, ПояснениеОповещения, Оповещение.Картинка, СтатусОповещения);
КонецПроцедуры КонецПроцедуры
@@ -190,6 +190,13 @@
КонецПроцедуры КонецПроцедуры
#Область УстаревшиеПроцедурыИФункции
// Устарела. Следует использовать обработчик оповещения
// (смотри параметр Обработчик в процедуре ВыполнитьКомандуВФоне)
// вместо использования события ОбработкаВыбора формы владельца совместно с анализом источника:
// ИсточникВыбора.ИмяФормы = ДополнительныеОтчетыИОбработкиКлиент.ИмяФормыДлительнойОперации().
//
// Возвращает имя формы для идентификации результата выполнения длительной операции. // Возвращает имя формы для идентификации результата выполнения длительной операции.
// //
// Возвращаемое значение: // Возвращаемое значение:
@@ -203,6 +210,8 @@
#КонецОбласти #КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
// Открывает форму подбора дополнительных отчетов. // Открывает форму подбора дополнительных отчетов.
@@ -36,6 +36,8 @@
События.Вставить("ПриДобавленииПараметровРаботыКлиентаПриЗапуске", Ложь); События.Вставить("ПриДобавленииПараметровРаботыКлиентаПриЗапуске", Ложь);
События.Вставить("ПриДобавленииПараметровРаботыКлиента", Ложь); События.Вставить("ПриДобавленииПараметровРаботыКлиента", Ложь);
События.Вставить("ПередЗапускомПрограммы", Ложь); События.Вставить("ПередЗапускомПрограммы", Ложь);
События.Вставить("ПриДобавленииСерверныхОповещений", Ложь);
События.Вставить("ПриПериодическомПолученииДанныхКлиентаНаСервере", Ложь);
// ВариантыОтчетов // ВариантыОтчетов
События.Вставить("ПриОпределенииНастроекВариантовОтчетов", Ложь); События.Вставить("ПриОпределенииНастроекВариантовОтчетов", Ложь);
@@ -140,8 +142,6 @@
События.Вставить("ПриОтключенииТекущихДел", Ложь); События.Вставить("ПриОтключенииТекущихДел", Ложь);
События.Вставить("ПриОпределенииНастроекТекущихДел", Ложь); События.Вставить("ПриОпределенииНастроекТекущихДел", Ложь);
События.Вставить("ПриУстановкеОбщихПараметровЗапросов", Ложь); События.Вставить("ПриУстановкеОбщихПараметровЗапросов", Ложь);
События.Вставить("ПриСозданииНаСервереТекущиеДела", Ложь);
События.Вставить("ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела", Ложь);
// УправлениеДоступом // УправлениеДоступом
События.Вставить("ПриЗаполненииВидовДоступа", Ложь); События.Вставить("ПриЗаполненииВидовДоступа", Ложь);
@@ -277,7 +277,8 @@
Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт
СтандартныеПодсистемыСервер.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); СтандартныеПодсистемыСервер.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы);
СерверныеОповещения.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");
МодульВариантыОтчетов.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); МодульВариантыОтчетов.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы);
@@ -603,8 +604,6 @@
ОбновлениеИнформационнойБазыСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); ОбновлениеИнформационнойБазыСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий);
ПользователиСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий);
СтандартныеПодсистемыСервер.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); СтандартныеПодсистемыСервер.ПриПолученииСпискаШаблонов(ШаблоныЗаданий);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда
@@ -652,7 +651,9 @@
// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. // См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков.
Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт
СерверныеОповещения.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда
МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер");
МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам);
@@ -1864,6 +1865,39 @@
КонецПроцедуры КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений
Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
СтандартныеПодсистемыСервер.ПриДобавленииСерверныхОповещений(Оповещения);
ПользователиСлужебный.ПриДобавленииСерверныхОповещений(Оповещения);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда
МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ");
МодульСоединенияИБ.ПриДобавленииСерверныхОповещений(Оповещения);
КонецЕсли;
Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииСерверныхОповещений Тогда
МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС");
МодульИнтеграцияПодсистемБТС.ПриДобавленииСерверныхОповещений(Оповещения);
КонецЕсли;
Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииСерверныхОповещений Тогда
МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП");
МодульИнтеграцияПодсистемБИП.ПриДобавленииСерверныхОповещений(Оповещения);
КонецЕсли;
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере
Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный");
МодульЦентрМониторингаСлужебный.ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты);
КонецЕсли;
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область ВариантыОтчетов #Область ВариантыОтчетов
@@ -4706,36 +4740,6 @@
КонецПроцедуры КонецПроцедуры
// См. ТекущиеДелаПереопределяемый.ПриСозданииНаСервере.
Процедура ПриСозданииНаСервереТекущиеДела(Форма, Список) Экспорт
Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриСозданииНаСервереТекущиеДела Тогда
МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС");
МодульИнтеграцияПодсистемБТС.ПриСозданииНаСервереТекущиеДела(Форма, Список);
КонецЕсли;
Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриСозданииНаСервереТекущиеДела Тогда
МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП");
МодульИнтеграцияПодсистемБИП.ПриСозданииНаСервереТекущиеДела(Форма, Список);
КонецЕсли;
КонецПроцедуры
// См. ТекущиеДелаПереопределяемый.ПередЗагрузкойДанныхИзНастроекНаСервере.
Процедура ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела(Форма, Настройки) Экспорт
Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела Тогда
МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС");
МодульИнтеграцияПодсистемБТС.ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела(Форма, Настройки);
КонецЕсли;
Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела Тогда
МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП");
МодульИнтеграцияПодсистемБИП.ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела(Форма, Настройки);
КонецЕсли;
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область УправлениеДоступом #Область УправлениеДоступом
@@ -105,6 +105,8 @@
// Проверка статуса обработчиков отложенного обновления. // Проверка статуса обработчиков отложенного обновления.
Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 2)); Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 2));
Параметры.Модули.Добавить(СерверныеОповещенияКлиент);
// Загрузка/обновление параметров работы программы. // Загрузка/обновление параметров работы программы.
Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 3)); Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 3));
@@ -208,6 +210,7 @@
Процедура ПослеНачалаРаботыСистемы() Экспорт Процедура ПослеНачалаРаботыСистемы() Экспорт
СтандартныеПодсистемыКлиент.ПослеНачалаРаботыСистемы(); СтандартныеПодсистемыКлиент.ПослеНачалаРаботыСистемы();
СерверныеОповещенияКлиент.ПослеНачалаРаботыСистемы();
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда
МодульРаботаСБанкамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСБанкамиКлиент"); МодульРаботаСБанкамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСБанкамиКлиент");
@@ -324,6 +327,26 @@
КонецПроцедуры КонецПроцедуры
// См. ОбщегоНазначенияКлиентПереопределяемый.ПередПериодическойОтправкойДанныхКлиентаНаСервер
Процедура ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры) Экспорт
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
МодульЦентрМониторингаКлиентСлужебный = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиентСлужебный");
МодульЦентрМониторингаКлиентСлужебный.ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры);
КонецЕсли;
КонецПроцедуры
// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеПериодическогоПолученияДанныхКлиентаНаСервере
Процедура ПослеПериодическогоПолученияДанныхКлиентаНаСервере(Результаты) Экспорт
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
МодульЦентрМониторингаКлиентСлужебный = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиентСлужебный");
МодульЦентрМониторингаКлиентСлужебный.ПослеПериодическогоПолученияДанныхКлиентаНаСервере(Результаты);
КонецЕсли;
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область ВариантыОтчетов #Область ВариантыОтчетов
@@ -692,6 +715,8 @@
События.Вставить("ПослеНачалаРаботыСистемы", Ложь); События.Вставить("ПослеНачалаРаботыСистемы", Ложь);
События.Вставить("ПриОбработкеПараметровЗапуска", Ложь); События.Вставить("ПриОбработкеПараметровЗапуска", Ложь);
События.Вставить("ПередЗавершениемРаботыСистемы", Ложь); События.Вставить("ПередЗавершениемРаботыСистемы", Ложь);
События.Вставить("ПередПериодическойОтправкойДанныхКлиентаНаСервер", Ложь);
События.Вставить("ПослеПериодическогоПолученияДанныхКлиентаНаСервере", Ложь);
// ВариантыОтчетов // ВариантыОтчетов
События.Вставить("ПослеФормирования", Ложь); События.Вставить("ПослеФормирования", Ложь);
@@ -9868,9 +9868,6 @@
СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); СообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
ТекстСообщения = ТекстИсключения; ТекстСообщения = ТекстИсключения;
Для Каждого Сообщение Из СообщенияПользователю Цикл Для Каждого Сообщение Из СообщенияПользователю Цикл
Если СтрНайти(Сообщение.Текст, ДлительныеОперации.СообщениеПрогресса()) > 0 Тогда
Продолжить;
КонецЕсли;
ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст;
КонецЦикла; КонецЦикла;
ТекстСообщения = СокрЛП(ТекстСообщения); ТекстСообщения = СокрЛП(ТекстСообщения);
@@ -9939,9 +9936,6 @@
СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); СообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
ТекстСообщения = ТекстИсключения; ТекстСообщения = ТекстИсключения;
Для Каждого Сообщение Из СообщенияПользователю Цикл Для Каждого Сообщение Из СообщенияПользователю Цикл
Если СтрНайти(Сообщение.Текст, ДлительныеОперации.СообщениеПрогресса()) > 0 Тогда
Продолжить;
КонецЕсли;
ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст;
КонецЦикла; КонецЦикла;
@@ -37,7 +37,7 @@
// версии конфигурации включительно или "Параллельно" - отложенный обработчик после // версии конфигурации включительно или "Параллельно" - отложенный обработчик после
// обработки первой порции данных передает управление следующему обработчику, а после // обработки первой порции данных передает управление следующему обработчику, а после
// выполнения последнего обработчика цикл повторяется заново. // выполнения последнего обработчика цикл повторяется заново.
// * ЗаполнятьДанныеНовыхПодсистемПриПереходеСДругойПрограммы - Булево - Если установить Истина, то при переходе с // * ЗаполнятьДанныеНовыхПодсистемПриПереходеСДругойПрограммы - Булево - если установить Истина, то при переходе с
// другой программы будут автоматически выполнены обработчики начального заполнения // другой программы будут автоматически выполнены обработчики начального заполнения
// новых подсистем. При описании обработчика обновления можно при необходимости // новых подсистем. При описании обработчика обновления можно при необходимости
// отключить его выполнение, указав свойство НеВыполнятьПриПереходеСДругойПрограммы. // отключить его выполнение, указав свойство НеВыполнятьПриПереходеСДругойПрограммы.
@@ -45,7 +45,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт Процедура ПриДобавленииПодсистемы(Описание) Экспорт
Описание.Имя = "СтандартныеПодсистемы"; Описание.Имя = "СтандартныеПодсистемы";
Описание.Версия = "3.1.6.209"; Описание.Версия = "3.1.7.34";
Описание.ИдентификаторИнтернетПоддержки = "SSL"; Описание.ИдентификаторИнтернетПоддержки = "SSL";
Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно"; Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно";
Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0"; Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0";
@@ -1468,7 +1468,7 @@
Обработчики.Вставить("ВыполняетсяОбновлениеИБ", "ОбновлениеИнформационнойБазыСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ВыполняетсяОбновлениеИБ", "ОбновлениеИнформационнойБазыСлужебный.УстановкаПараметровСеанса");
Обработчики.Вставить("ПараметрыОбработчикаОбновления", "ОбновлениеИнформационнойБазыСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ПараметрыОбработчикаОбновления", "ОбновлениеИнформационнойБазыСлужебный.УстановкаПараметровСеанса");
Обработчики.Вставить("ОтмененныеДлительныеОперации", "ДлительныеОперации.УстановкаПараметровСеанса"); Обработчики.Вставить("ДлительныеОперации", "ДлительныеОперации.УстановкаПараметровСеанса");
КонецПроцедуры КонецПроцедуры
@@ -2717,10 +2717,6 @@
// Запускает обновление информационной базы в длительной операции. // Запускает обновление информационной базы в длительной операции.
Процедура ВыполнитьОбновлениеИнформационнойБазыВФоне(ПараметрыОбновленияИБ, АдресХранилища) Экспорт Процедура ВыполнитьОбновлениеИнформационнойБазыВФоне(ПараметрыОбновленияИБ, АдресХранилища) Экспорт
Если ПараметрыОбновленияИБ.ВФоне Тогда
ПараметрыСеанса.ПараметрыКлиентаНаСервере = ПараметрыОбновленияИБ.ПараметрыКлиентаНаСервере;
КонецЕсли;
ИнформацияОбОшибке = Неопределено; ИнформацияОбОшибке = Неопределено;
Попытка Попытка
ПараметрыОбновления = ПараметрыОбновления(); ПараметрыОбновления = ПараметрыОбновления();
@@ -2750,7 +2746,6 @@
РезультатОбновления = Результат; РезультатОбновления = Результат;
Иначе Иначе
РезультатОбновления = Новый Структура; РезультатОбновления = Новый Структура;
РезультатОбновления.Вставить("ПараметрыКлиентаНаСервере", ПараметрыСеанса.ПараметрыКлиентаНаСервере);
РезультатОбновления.Вставить("Результат", Результат); РезультатОбновления.Вставить("Результат", Результат);
КонецЕсли; КонецЕсли;
ПоместитьВоВременноеХранилище(РезультатОбновления, АдресХранилища); ПоместитьВоВременноеХранилище(РезультатОбновления, АдресХранилища);
@@ -570,10 +570,19 @@
Макет = ПолучитьОбщийМакет(Исправление); Макет = ПолучитьОбщийМакет(Исправление);
Для НомерСтроки = 1 По Макет.КоличествоСтрок() Цикл Для НомерСтроки = 1 По Макет.КоличествоСтрок() Цикл
Строка = Макет.ПолучитьСтроку(НомерСтроки); Строка = Макет.ПолучитьСтроку(НомерСтроки);
Если Не СтрНачинаетсяС(СокрЛП(Строка), "<Description>") Тогда Если Не СтрНачинаетсяС(СокрЛ(Строка), "<Description>") Тогда
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
ОписаниеПатча = СтрЗаменить(СтрЗаменить(СокрЛП(Строка), "<Description>", ""), "</Description>", ""); ОписаниеПатча = СтрЗаменить(СокрЛ(Строка), "<Description>", "");
Пока НомерСтроки < Макет.КоличествоСтрок() Цикл
Если СтрЗаканчиваетсяНа(СокрП(ОписаниеПатча), "</Description>") Тогда
ОписаниеПатча = СтрЗаменить(СокрП(ОписаниеПатча), "</Description>", "");
Прервать;
КонецЕсли;
НомерСтроки = НомерСтроки + 1;
Строка = Макет.ПолучитьСтроку(НомерСтроки);
ОписаниеПатча = ОписаниеПатча + Символы.ПС + Строка;
КонецЦикла;
Описания.Добавить(Исправление + ": " + ОписаниеПатча); Описания.Добавить(Исправление + ": " + ОписаниеПатча);
Прервать; Прервать;
КонецЦикла; КонецЦикла;
@@ -178,22 +178,26 @@
КонецПроцедуры КонецПроцедуры
// Возвращает Истина, если база зарегистрирована в системе Взаимодействия. // Возвращает Истина, если метод ИнформационнаяБазаЗарегистрирована
// объекта СистемаВзаимодействия возвращает Истина и
// использование не заблокировано администратором.
// //
// Возвращаемое значение: // Возвращаемое значение:
// Булево // Булево
// //
Функция СистемаВзаимодействийПодключена() Экспорт Функция СистемаВзаимодействийПодключена() Экспорт
Если ОбсужденияСлужебный.Заблокированы() Тогда
Возврат Ложь; // Выполняется быстро без обращения к серверу взаимодействия.
КонецЕсли; Зарегистрирована = СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована();
Возврат СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована(); Возврат Зарегистрирована И Не ОбсужденияСлужебный.Заблокированы();
КонецФункции КонецФункции
// Возвращает Истина, если база зарегистрирована в системе Взаимодействия, // Возвращает Истина, если метод ИспользованиеДоступно
// есть хотя бы один зарегистрированный пользователь. // объекта СистемаВзаимодействия возвращает Истина и
// // использование не заблокировано администратором.
//
// Возвращаемое значение: // Возвращаемое значение:
// Булево // Булево
// //
@@ -310,7 +314,7 @@
Если Ошибки.Количество() > 0 Тогда Если Ошибки.Количество() > 0 Тогда
ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации( ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(
НСтр("ru='ПользователиСистемыВзаимодействия'", ОбщегоНазначения.КодОсновногоЯзыка())), НСтр("ru='Пользователи системы взаимодействия'", ОбщегоНазначения.КодОсновногоЯзыка())),
УровеньЖурналаРегистрации.Ошибка,,, УровеньЖурналаРегистрации.Ошибка,,,
СтрСоединить(Ошибки, Символы.ПС)); СтрСоединить(Ошибки, Символы.ПС));
@@ -344,22 +348,29 @@
УстановитьПривилегированныйРежим(Ложь); УстановитьПривилегированныйРежим(Ложь);
Если Не ЗначениеЗаполнено(ИдентификаторПользователяИнформационнойБазы) Тогда Если Не ЗначениеЗаполнено(ИдентификаторПользователяИнформационнойБазы) Тогда
ШаблонОшибки = НСтр("ru='Не удалось получить идентификатор пользователя (%1)'"); Если Пользователь = Пользователи.СсылкаНеуказанногоПользователя() Тогда
ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ИдентификаторПользователяИнформационнойБазы = ПользователиИнформационнойБазы.НайтиПоИмени("").УникальныйИдентификатор;
ШаблонОшибки, Иначе
Строка(Пользователь)); ШаблонОшибки = НСтр("ru='Не удалось получить идентификатор пользователя (%1)'");
ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ВызватьИсключение ОписаниеОшибки; ШаблонОшибки,
Строка(Пользователь));
ВызватьИсключение ОписаниеОшибки;
КонецЕсли;
КонецЕсли; КонецЕсли;
ОшибкаПолучениеИдентификатораСВ = ""; ОшибкаПолучениеИдентификатораСВ = "";
Попытка Попытка
ИдентификаторПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя( ИдентификаторПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(
ИдентификаторПользователяИнформационнойБазы); ИдентификаторПользователяИнформационнойБазы);
Результат = СистемаВзаимодействия.ПолучитьПользователя(ИдентификаторПользователяСВ); Результат = СистемаВзаимодействия.ПолучитьПользователя(ИдентификаторПользователяСВ);
Исключение Исключение
ОшибкаПолучениеИдентификатораСВ = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ИнформацияОбОшибке = ИнформацияОбОшибке();
Если ЭтоОшибкаУстановкиСоединенияССерверомВзаимодействия(ИнформацияОбОшибке) Тогда
ВызватьИсключение;
КонецЕсли;
ОшибкаПолучениеИдентификатораСВ = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки; КонецПопытки;
Если Результат = Неопределено Тогда Если Результат = Неопределено Тогда
@@ -483,6 +494,49 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Функция ЭтоОшибкаУстановкиСоединенияССерверомВзаимодействия(ИнформацияОбОшибке)
// Только для повышения производительности не влияет на функциональность.
// АПК:1297-выкл - не локализуется, строки на других языках уже строго определены.
// АПК:1405-выкл - не локализуется, строки на других языках уже строго определены.
// АПК:1036-выкл - не локализуется, строки на других языках уже строго определены.
СтрокаНаРазныхЯзыках =
"az = 'Qarşılıqlı fəaliyyət sistmei qeydə alınmayıb';
|en = 'The collaboration system is not registered';
|hy = 'Փոխազդեցության համակարգը գրանցված չէ';
|bg = 'Системата за взаимодействия не е регистрирана';
|hu = 'Az interaktív rendszer nincs regisztrálva';
|vi = 'Chưa ghi nhận hệ thống tương tác';
|el = 'Το σύστημα αλληλεπίδρασης δεν έχει καταχωρηθεί';
|ka = 'კომუნიკაციის სისტემა არ არის დარეგისტრირებული';
|el = 'Το σύστημα αλληλεπίδρασης δεν έχει καταχωρηθεί';
|it = 'Il sistema di interoperabilità non è registrato';
|kk = 'Өзара әрекет ету жүйесі тіркелмеген';
|zh = '交互系统没有启动';
|lv = 'Mijiedarbības sistēma nav reģistrēta';
|lt = 'Sąveikos sistema neužregistruota';
|de = 'Interaktionssystem nicht registriert';
|pl = 'System współpracy nie został zarejestrowany';
|ro = 'Sistemul de interacţiune nu este înregistrat';
|ru = 'Система взаимодействия не зарегистрирована';
|tr = 'Etkileşim sistemine kayıtlı değil';
|uk = 'Система взаємодії не зареєстрована';
|fr = 'Le système d’interaction n’est pas enregistré'"; // @Non-NLS
// АПК:1036-вкл
// АПК:1405-вкл
// АПК:1297-вкл
//@skip-check bsl-nstr-string-literal-format
СтрокаПоиска = НСтр(СтрокаНаРазныхЯзыках);
Если Не ЗначениеЗаполнено(СтрокаПоиска) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрНачинаетсяС(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), СтрокаПоиска);
КонецФункции
Процедура ОбновитьОписаниеПользователяВСистемеВзаимодействия(ПользовательСВ, ОписаниеПользователя) Процедура ОбновитьОписаниеПользователяВСистемеВзаимодействия(ПользовательСВ, ОписаниеПользователя)
Фотография = ОписаниеПользователя.Фотография; Фотография = ОписаниеПользователя.Фотография;
@@ -10,14 +10,14 @@
Функция Подключены() Экспорт Функция Подключены() Экспорт
Если Заблокированы() Тогда
Возврат Ложь;
КонецЕсли;
// Вызов на сервере гарантирует получение корректного состояния в случае, // Вызов на сервере гарантирует получение корректного состояния в случае,
// когда данные регистрации информационной базы были изменены методом // когда данные регистрации информационной базы были изменены методом
// СистемаВзаимодействия.УстановитьДанныеРегистрацииИнформационнойБазы. // СистемаВзаимодействия.УстановитьДанныеРегистрацииИнформационнойБазы.
Возврат СистемаВзаимодействия.ИспользованиеДоступно(); //
// Выполняется быстро без обращения к серверу взаимодействия.
ИспользованиеДоступно = СистемаВзаимодействия.ИспользованиеДоступно();
Возврат ИспользованиеДоступно И Не Заблокированы();
КонецФункции КонецФункции
@@ -135,7 +135,12 @@
Оповещение = Новый ОписаниеОповещения("ПослеУспешногоОтключения", ЭтотОбъект,, Оповещение = Новый ОписаниеОповещения("ПослеУспешногоОтключения", ЭтотОбъект,,
"ПриОбработкеОшибкиОтключения", ЭтотОбъект); "ПриОбработкеОшибкиОтключения", ЭтотОбъект);
СистемаВзаимодействия.НачатьОтменуРегистрацииИнформационнойБазы(Оповещение);
Попытка
СистемаВзаимодействия.НачатьОтменуРегистрацииИнформационнойБазы(Оповещение);
Исключение
ПриОбработкеОшибкиОтключения(ИнформацияОбОшибке(), Ложь, Неопределено);
КонецПопытки;
КонецПроцедуры КонецПроцедуры
@@ -148,6 +153,13 @@
Процедура ПриОбработкеОшибкиОтключения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт Процедура ПриОбработкеОшибкиОтключения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
СтандартнаяОбработка = Ложь; СтандартнаяОбработка = Ложь;
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Обсуждения.Ошибка отмены регистрации информационной базы'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),, Истина);
ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке);
КонецПроцедуры КонецПроцедуры
@@ -14,6 +14,8 @@
// с устаревшей процедурой ОбщегоНазначенияКлиентСервер.СообщитьПользователю. // с устаревшей процедурой ОбщегоНазначенияКлиентСервер.СообщитьПользователю.
// Формирует и выводит сообщение, которое может быть связано с элементом управления формы. // Формирует и выводит сообщение, которое может быть связано с элементом управления формы.
// В фоновом задании длительной операции отправляет сообщение сразу на клиент,
// если подключена система взаимодействия.
// //
// Параметры: // Параметры:
// ТекстСообщенияПользователю - Строка - текст сообщения. // ТекстСообщенияПользователю - Строка - текст сообщения.
@@ -65,8 +67,14 @@
ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0; ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
КонецЕсли; КонецЕсли;
ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(ТекстСообщенияПользователю,
ПутьКДанным, Отказ, ЭтоОбъект); КлючДанных, Поле, ПутьКДанным, Отказ, ЭтоОбъект);
Если СтандартныеПодсистемыПовтИсп.ЭтоСеансДлительнойОперации() Тогда
ДлительныеОперации.ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение);
Иначе
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -6352,7 +6360,7 @@
УстановитьПривилегированныйРежим(Истина); УстановитьПривилегированныйРежим(Истина);
Данные = МестоИспользования.Данные; Данные = МестоИспользования.Данные;
Мета = МестоИспользования.Метаданные; МетаданныеКонстанты = МестоИспользования.Метаданные;
ПредставлениеДанных = Строка(Данные); ПредставлениеДанных = Строка(Данные);
@@ -6370,7 +6378,7 @@
Попытка Попытка
Блокировка = Новый БлокировкаДанных; Блокировка = Новый БлокировкаДанных;
Блокировка.Добавить(Мета.ПолноеИмя()); Блокировка.Добавить(МетаданныеКонстанты.ПолноеИмя());
Попытка Попытка
Блокировка.Заблокировать(); Блокировка.Заблокировать();
Исключение Исключение
@@ -6380,13 +6388,13 @@
ВызватьИсключение; ВызватьИсключение;
КонецПопытки; КонецПопытки;
Менеджер = Константы[Мета.Имя].СоздатьМенеджерЗначения(); МенеджерКонстанты = Константы[МетаданныеКонстанты.Имя].СоздатьМенеджерЗначения();
Менеджер.Прочитать(); МенеджерКонстанты.Прочитать();
ЗаменаПроизведена = Ложь; ЗаменаПроизведена = Ложь;
Для Каждого Строка Из ОбрабатываемыеСтроки Цикл Для Каждого Строка Из ОбрабатываемыеСтроки Цикл
Если Менеджер.Значение = Строка.Ссылка Тогда Если МенеджерКонстанты.Значение = Строка.Ссылка Тогда
Менеджер.Значение = Строка.ЦелеваяСсылка; МенеджерКонстанты.Значение = Строка.ЦелеваяСсылка;
ЗаменаПроизведена = Истина; ЗаменаПроизведена = Истина;
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
@@ -6402,7 +6410,7 @@
КонецЕсли; КонецЕсли;
Попытка Попытка
ЗаписатьОбъект(Менеджер, ПараметрыЗаписи); ЗаписатьОбъект(МенеджерКонстанты, ПараметрыЗаписи);
Исключение Исключение
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"),
@@ -6419,7 +6427,7 @@
Исключение Исключение
ОтменитьТранзакцию(); ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка, ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка,
Мета,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); МетаданныеКонстанты,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Если СостояниеОперации = "ОшибкаЗаписи" Тогда Если СостояниеОперации = "ОшибкаЗаписи" Тогда
Для Каждого Строка Из ОбрабатываемыеСтроки Цикл Для Каждого Строка Из ОбрабатываемыеСтроки Цикл
ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка,
@@ -6972,19 +6980,23 @@
КонецПроцедуры КонецПроцедуры
Процедура ЗарегистрироватьФактЗамены(Объект, СсылкаДубля, СсылкаОригинала, ВидРеквизита, ИмяРеквизита, Индекс = Неопределено, ИмяКолонки = Неопределено) Процедура ЗарегистрироватьФактЗамены(Объект, СсылкаДубля, СсылкаОригинала, ВидРеквизита, ИмяРеквизита,
Структура = Новый Структура("ДополнительныеСвойства"); Индекс = Неопределено, ИмяКолонки = Неопределено)
ЗаполнитьЗначенияСвойств(Структура, Объект);
Если ТипЗнч(Структура.ДополнительныеСвойства) <> Тип("Структура") Тогда ЕстьДополнительныеСвойства = Новый Структура("ДополнительныеСвойства");
ЗаполнитьЗначенияСвойств(ЕстьДополнительныеСвойства, Объект);
Если ТипЗнч(ЕстьДополнительныеСвойства.ДополнительныеСвойства) <> Тип("Структура") Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
ДопСвойства = Объект.ДополнительныеСвойства;
ДопСвойства.Вставить("ЗаменаСсылок", Истина); ДополнительныеСвойства = Объект.ДополнительныеСвойства;
ВыполненныеЗамены = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДопСвойства, "ВыполненныеЗамены"); ДополнительныеСвойства.Вставить("ЗаменаСсылок", Истина);
ВыполненныеЗамены = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ВыполненныеЗамены");
Если ВыполненныеЗамены = Неопределено Тогда Если ВыполненныеЗамены = Неопределено Тогда
ВыполненныеЗамены = Новый Массив; ВыполненныеЗамены = Новый Массив;
ДопСвойства.Вставить("ВыполненныеЗамены", ВыполненныеЗамены); ДополнительныеСвойства.Вставить("ВыполненныеЗамены", ВыполненныеЗамены);
КонецЕсли; КонецЕсли;
ОписаниеЗамены = Новый Структура; ОписаниеЗамены = Новый Структура;
ОписаниеЗамены.Вставить("СсылкаДубля", СсылкаДубля); ОписаниеЗамены.Вставить("СсылкаДубля", СсылкаДубля);
ОписаниеЗамены.Вставить("СсылкаОригинала", СсылкаОригинала); ОписаниеЗамены.Вставить("СсылкаОригинала", СсылкаОригинала);
@@ -6993,6 +7005,7 @@
ОписаниеЗамены.Вставить("Индекс", Индекс); ОписаниеЗамены.Вставить("Индекс", Индекс);
ОписаниеЗамены.Вставить("ИмяКолонки", ИмяКолонки); ОписаниеЗамены.Вставить("ИмяКолонки", ИмяКолонки);
ВыполненныеЗамены.Добавить(ОписаниеЗамены); ВыполненныеЗамены.Добавить(ОписаниеЗамены);
КонецПроцедуры КонецПроцедуры
Процедура УстановитьПометкуУдаленияДляОбъектов(Результат, Знач УдаляемыеСсылки, Знач ПараметрыВыполнения) Процедура УстановитьПометкуУдаленияДляОбъектов(Результат, Знач УдаляемыеСсылки, Знач ПараметрыВыполнения)
@@ -7494,37 +7507,38 @@
Процедура ЗаменитьВКоллекцииСтрок(ВидКоллекции, ИмяКоллекции, Объект, Коллекция, Знач СписокПолей, Знач ПарыЗамен) Процедура ЗаменитьВКоллекцииСтрок(ВидКоллекции, ИмяКоллекции, Объект, Коллекция, Знач СписокПолей, Знач ПарыЗамен)
ЭтоРегистрБухгалтерии = ВидКоллекции = "Движения" И ЭтоРегистрБухгалтерии(Коллекция.Метаданные());
РабочаяКоллекция = Коллекция.Выгрузить(); ИзмененнаяКоллекция = Коллекция.Выгрузить();
Модифицировано = Ложь; Модифицировано = Ложь;
ИменаИзмененныхРеквизитов = Новый Массив;
ИзмененныеПоля = Новый Массив; Для Каждого Строка Из ИзмененнаяКоллекция Цикл
Для Каждого Строка Из РабочаяКоллекция Цикл
Для Каждого КлючЗначение Из СписокПолей Цикл Для Каждого КлючЗначение Из СписокПолей Цикл
Имя = КлючЗначение.Ключ; ИмяРеквизита = КлючЗначение.Ключ;
ЦелеваяСсылка = ПарыЗамен[ Строка[Имя] ]; ЦелеваяСсылка = ПарыЗамен[ Строка[ИмяРеквизита] ];
Если ЦелеваяСсылка <> Неопределено Тогда Если ЦелеваяСсылка <> Неопределено Тогда
ЗарегистрироватьФактЗамены(Объект, Строка[Имя], ЦелеваяСсылка, ВидКоллекции, ИмяКоллекции, РабочаяКоллекция.Индекс(Строка), Имя); ЗарегистрироватьФактЗамены(Объект, Строка[ИмяРеквизита], ЦелеваяСсылка, ВидКоллекции, ИмяКоллекции,
Строка[Имя] = ЦелеваяСсылка; ИзмененнаяКоллекция.Индекс(Строка), ИмяРеквизита);
Строка[ИмяРеквизита] = ЦелеваяСсылка;
Модифицировано = Истина; Модифицировано = Истина;
ИзмененныеПоля.Добавить(Имя); ИменаИзмененныхРеквизитов.Добавить(ИмяРеквизита);
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
КонецЦикла; КонецЦикла;
Если Модифицировано Тогда Если Модифицировано Тогда
ЭтоРегистрБухгалтерии = ВидКоллекции = "Движения" И ЭтоРегистрБухгалтерии(Коллекция.Метаданные());
Если ЭтоРегистрБухгалтерии Тогда Если ЭтоРегистрБухгалтерии Тогда
ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(Коллекция, РабочаяКоллекция, ИзмененныеПоля); ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(Коллекция, ИзмененнаяКоллекция, ИменаИзмененныхРеквизитов);
Иначе Иначе
Коллекция.Загрузить(РабочаяКоллекция); Коллекция.Загрузить(ИзмененнаяКоллекция);
КонецЕсли; КонецЕсли;
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
Процедура ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(НаборЗаписей, ИзмененнаяКоллекция, ИзмененныеПоля) Процедура ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(НаборЗаписей, ИзмененнаяКоллекция, ИменаИзмененныхРеквизитов)
НеизмененныеИзмерения = Новый Соответствие; НеизмененныеИзмерения = Новый Соответствие;
ИзмененныеИзмерения = Новый Соответствие; ИзмененныеИзмерения = Новый Соответствие;
@@ -7539,7 +7553,7 @@
КонецЕсли; КонецЕсли;
Для каждого ИмяИзмерения Из ИменаИзмерений Цикл Для каждого ИмяИзмерения Из ИменаИзмерений Цикл
Если ИзмененныеПоля.Найти(ИмяИзмерения) = Неопределено Тогда Если ИменаИзмененныхРеквизитов.Найти(ИмяИзмерения) = Неопределено Тогда
НеизмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения)); НеизмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения));
Иначе Иначе
ИзмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения)); ИзмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения));
@@ -8516,31 +8530,27 @@
Процедура ПроверкаФиксированностиДанных(Данные, ДанныеВЗначенииФиксированныхТипов = Ложь) Процедура ПроверкаФиксированностиДанных(Данные, ДанныеВЗначенииФиксированныхТипов = Ложь)
ТипДанных = ТипЗнч(Данные); ТипДанных = ТипЗнч(Данные);
СоставТипов = Новый ОписаниеТипов(
"ХранилищеЗначения,
|ФиксированныйМассив,
|ФиксированнаяСтруктура,
|ФиксированноеСоответствие");
Если ТипДанных = Тип("ХранилищеЗначения") Если СоставТипов.СодержитТип(ТипДанных) Тогда
ИЛИ ТипДанных = Тип("ФиксированныйМассив")
ИЛИ ТипДанных = Тип("ФиксированнаяСтруктура")
ИЛИ ТипДанных = Тип("ФиксированноеСоответствие") Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
Если ДанныеВЗначенииФиксированныхТипов Тогда Если ДанныеВЗначенииФиксированныхТипов Тогда
Если ТипДанных = Тип("Булево") СоставТипов = Новый ОписаниеТипов(
ИЛИ ТипДанных = Тип("Строка") "Булево,Строка,Число,Дата,
ИЛИ ТипДанных = Тип("Число") |Неопределено,УникальныйИдентификатор,Null,Тип,
ИЛИ ТипДанных = Тип("Дата") |ХранилищеЗначения,ОбщийМодуль,ОбъектМетаданных,
ИЛИ ТипДанных = Тип("Неопределено") |ТипЗначенияXDTO,ТипОбъектаXDTO,
ИЛИ ТипДанных = Тип("УникальныйИдентификатор") |ИдентификаторОбсужденияСистемыВзаимодействия");
ИЛИ ТипДанных = Тип("Null")
ИЛИ ТипДанных = Тип("Тип") Если СоставТипов.СодержитТип(ТипДанных)
ИЛИ ТипДанных = Тип("ХранилищеЗначения") Или ЭтоСсылка(ТипДанных) Тогда
ИЛИ ТипДанных = Тип("ОбщийМодуль")
ИЛИ ТипДанных = Тип("ОбъектМетаданных")
ИЛИ ТипДанных = Тип("ТипЗначенияXDTO")
ИЛИ ТипДанных = Тип("ТипОбъектаXDTO")
ИЛИ ЭтоСсылка(ТипДанных) Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
@@ -58,8 +58,10 @@
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено,
Знач Поле = "", Знач ПутьКДанным = "", Отказ = Ложь) Экспорт Знач Поле = "", Знач ПутьКДанным = "", Отказ = Ложь) Экспорт
ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(ТекстСообщенияПользователю,
Поле, ПутьКДанным, Отказ); КлючДанных, Поле, ПутьКДанным, Отказ);
Сообщение.Сообщить()
КонецПроцедуры КонецПроцедуры
@@ -159,6 +159,47 @@
КонецПроцедуры
// Вызывается из глобального обработчика ожидания каждые 60 сек
// для возможности централизованно передать данные с клиента на сервер.
// Например, для передачи статистики о количестве открытых окон.
// Не рекомендуется делать собственные глобальные обработчики ожидания,
// чтобы минимизировать общее количество серверных вызовов.
//
// Не рекомендуется передавать данные каждые 60 сек, а делать это реже
// в зависимости от реальной необходимости (ориентироваться на один раз в 20 минут).
// Не рекомендуется передавать избыточно большой объем данных,
// так как это уменьшает отзывчивость клиентского приложения.
//
// Для отправки данных с клиента на сервер заполните параметр Параметры,
// который затем будет передан в процедуру
// ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере.
//
// Параметры:
// Параметры - Соответствие из КлючИЗначение:
// * Ключ - Строка - имя параметра, передаваемого на сервер.
// * Значение - Произвольный - значение параметра, передаваемого на сервер.
//
Процедура ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры) Экспорт
КонецПроцедуры
// Вызывается из глобального обработчика ожидания каждые 60 сек после возврата с сервера.
// Требуется, когда сервер возвращает результат для обработки на клиенте.
// Например, признак дальнейшей передачи статистики с клиента на сервер.
//
// Для получения результатов сервера на клиенте они должны быть заполнены
// в параметре Результаты в процедуре
// ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере.
//
// Параметры:
// Результаты - Соответствие из КлючИЗначение:
// * Ключ - Строка - имя параметра, возвращенного с сервера.
// * Значение - Произвольный - значение параметра, возвращенного с сервера.
//
Процедура ПослеПериодическогоПолученияДанныхКлиентаНаСервере(Результаты) Экспорт
КонецПроцедуры КонецПроцедуры
#КонецОбласти #КонецОбласти
@@ -88,6 +88,7 @@
// Выводит накопленные методом ДобавитьОшибкуПользователю ошибки, при этом использует нужные шаблоны текстов ошибок // Выводит накопленные методом ДобавитьОшибкуПользователю ошибки, при этом использует нужные шаблоны текстов ошибок
// в зависимости от количества однотипных ошибок. // в зависимости от количества однотипных ошибок.
// Не подходит для отправки сообщений из фонового заданий длительной операции.
// //
// Параметры: // Параметры:
// Ошибки - см. ДобавитьОшибкуПользователю.Ошибки // Ошибки - см. ДобавитьОшибкуПользователю.Ошибки
@@ -109,16 +110,17 @@
КонецЕсли; КонецЕсли;
Если Ошибки.ГруппыОшибок[Ошибка.ГруппаОшибок] <> Истина Тогда Если Ошибки.ГруппыОшибок[Ошибка.ГруппаОшибок] <> Истина Тогда
ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю( Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(
Ошибка.ТекстДляОднойОшибки, Ошибка.ТекстДляОднойОшибки,
Неопределено, Неопределено,
СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(ИндексСтроки, "ЧН=0; ЧГ="))); СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(ИндексСтроки, "ЧН=0; ЧГ=")));
Иначе Иначе
ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю( Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(
СтрЗаменить(Ошибка.ТекстДляНесколькихОшибок, "%1", Формат(Ошибка.НомерСтроки + 1, "ЧН=0; ЧГ=")), СтрЗаменить(Ошибка.ТекстДляНесколькихОшибок, "%1", Формат(Ошибка.НомерСтроки + 1, "ЧН=0; ЧГ=")),
Неопределено, Неопределено,
СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(ИндексСтроки, "ЧН=0; ЧГ="))); СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(ИндексСтроки, "ЧН=0; ЧГ=")));
КонецЕсли; КонецЕсли;
Сообщение.Сообщить();
КонецЦикла; КонецЦикла;
@@ -320,6 +320,54 @@
КонецПроцедуры КонецПроцедуры
// Вызывается при запуске сеанса для получения списка оповещений
// которые необходимо отправить с сервера на клиент (из регламентного задания).
// Смотри СтандартныеПодсистемыСервер.ПриОтправкеСерверногоОповещения
// и СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения.
//
// Параметры:
// Оповещения - Соответствие из КлючИЗначение:
// * Ключ - Строка - смотри СерверныеОповещения.НовоеСерверноеОповещение.Имя
// * Значение - см. СерверныеОповещения.НовоеСерверноеОповещение
//
// Пример:
// Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
// "СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов");
// Оповещение.ИмяМодуляОтправки = "СоединенияИБ";
// Оповещение.ИмяМодуляПолучения = "СоединенияИБКлиент";
// Оповещение.ПериодПроверки = 60;
//
// Оповещения.Вставить(Оповещение.Имя, Оповещение);
//
Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
КонецПроцедуры
// Вызывается из глобального обработчика ожидания по необходимости, но не чаще раза в 60 сек,
// для получения данных с клиента, а также возврате результата на клиент, если нужно.
// Например, для передачи статистики о количестве открытых окон и
// возврате признака дальнейшей передачи статистики с клиента на сервер.
//
// Для получения данных клиента на сервере они должны быть заполнены в параметре Параметры процедуры
// ОбщегоНазначенияКлиентПереопределяемый.ПередПериодическойОтправкойДанныхКлиентаНаСервер.
//
// Для возврата данных с сервера на клиент заполните параметр Результаты,
// который затем будет передан в процедуру
// ОбщегоНазначенияКлиентПереопределяемый.ПослеПериодическогоПолученияДанныхКлиентаНаСервере.
//
// Параметры:
// Параметры - Соответствие из КлючИЗначение:
// * Ключ - Строка - имя параметра, полученного с клиента.
// * Значение - Произвольный - значение параметра, полученного с клиента.
// Результаты - Соответствие из КлючИЗначение:
// * Ключ - Строка - имя параметра, возвращаемого на клиент.
// * Значение - Произвольный - значение параметра, возвращаемого на клиент.
//
Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт
КонецПроцедуры
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Обработчики отправки и получения данных для обмена в распределенной информационной базе. // Обработчики отправки и получения данных для обмена в распределенной информационной базе.
@@ -220,7 +220,7 @@
#Область ОповещениеПользователя #Область ОповещениеПользователя
Процедура СообщитьПользователю( Функция СообщениеПользователю(
Знач ТекстСообщенияПользователю, Знач ТекстСообщенияПользователю,
Знач КлючДанных, Знач КлючДанных,
Знач Поле, Знач Поле,
@@ -242,11 +242,11 @@
Сообщение.ПутьКДанным = ПутьКДанным; Сообщение.ПутьКДанным = ПутьКДанным;
КонецЕсли; КонецЕсли;
Сообщение.Сообщить();
Отказ = Истина; Отказ = Истина;
КонецПроцедуры Возврат Сообщение;
КонецФункции
#КонецОбласти #КонецОбласти
@@ -1959,13 +1959,6 @@
Константы.УдалитьНастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(Неопределено)); Константы.УдалитьНастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(Неопределено));
КонецЕсли; КонецЕсли;
Если ЗначениеЗаполнено(Настройки.Пользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода)
Или ЗначениеЗаполнено(Настройки.ВнешниеПользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда
ПользователиСлужебный.ИзменитьЗаданиеКонтрольАктивностиПользователей(Истина);
КонецЕсли;
КонецЕсли; КонецЕсли;
УстановитьПривилегированныйРежим(Ложь); УстановитьПривилегированныйРежим(Ложь);
@@ -516,6 +516,36 @@
КонецФункции КонецФункции
// Возвращает недоступные роли для разделенных пользователей или внешних пользователей
// с учетом прав текущего пользователя и режима работы (локальный или модель сервиса).
//
// Параметры:
// ДляВнешнихПользователей - Булево - если истина, значит для внешних пользователей.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Строка - имя роли.
// * Значение - Булево - Истина.
//
Функция НедоступныеРолиПоТипуПользователя(ДляВнешнихПользователей) Экспорт
Если ДляВнешнихПользователей Тогда
НазначениеРолейПользователя = "ДляВнешнихПользователей";
ИначеЕсли Не ОбщегоНазначения.РазделениеВключено()
И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда
// Пользователь с ролью АдминистраторСистемы в локальном режиме работы
// может выдавать административные права.
НазначениеРолейПользователя = "ДляАдминистраторов";
Иначе
НазначениеРолейПользователя = "ДляПользователей";
КонецЕсли;
Возврат ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеРолейПользователя);
КонецФункции
// Возвращает свойства пользователя для пользователя ИБ с пустым именем. // Возвращает свойства пользователя для пользователя ИБ с пустым именем.
// //
// Возвращаемое значение: // Возвращаемое значение:
@@ -980,6 +1010,14 @@
КонецЦикла; КонецЦикла;
КонецЕсли; КонецЕсли;
Если Не ЗначениеЗаполнено(Результат.ИдентификаторПользователяИБ) Тогда
ПользовательСсылка = ?(ТипЗнч(Пользователь) = Тип("СправочникОбъект.Пользователи"),
Пользователь.Ссылка, Пользователь);
Если ПользовательСсылка = Пользователи.СсылкаНеуказанногоПользователя() Тогда
Результат.ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.НайтиПоИмени("").УникальныйИдентификатор;
КонецЕсли;
КонецЕсли;
Возврат Результат; Возврат Результат;
КонецФункции КонецФункции
@@ -1094,46 +1132,68 @@
КонецПроцедуры КонецПроцедуры
// См. СтандартныеПодсистемыВызовСервера.ПриВыполненииСтандартныхПериодическихПроверокНаСервере. // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений
Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
Параметры.Вставить("ВходВПрограммуЗапрещен", Ложь); Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат; МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
Если МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей() Тогда
Возврат;
КонецЕсли;
КонецЕсли; КонецЕсли;
// Проверка, что срок действия учетной записи истек и нужно завершить работу. Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
"СтандартныеПодсистемы.Пользователи.ИзменениеРолейПользователяИлиБлокировка");
УстановитьПривилегированныйРежим(Истина); Оповещение.ИмяМодуляОтправки = "ПользователиСлужебный";
Оповещение.ИмяМодуляПолучения = "ПользователиСлужебныйКлиент";
Оповещение.Параметры = ХешСуммаРолейПользователяИБ(
ПользователиИнформационнойБазы.ТекущийПользователь());
ОтключитьНеактивныхИПросроченныхПользователей(Истина); Оповещения.Вставить(Оповещение.Имя, Оповещение);
ТребуетсяСменитьПароль(); // Обновление даты последней активности. КонецПроцедуры
// См. СтандартныеПодсистемыСервер.ПриОтправкеСерверногоОповещения
Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( ОбновитьДатуПоследнейАктивностиПользователей(ВариантыПараметров);
ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор); ОтключитьНеактивныхИПросроченныхПользователей();
Если ПользовательИБ = Неопределено Тогда АдресатыБлокировки = Новый Соответствие;
АдресатыИзмененияРолей = Новый Соответствие;
Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Для Каждого ВариантПараметров Из ВариантыПараметров Цикл
СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); Для Каждого Адресат Из ВариантПараметров.Адресаты Цикл
Иначе ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Адресат.Ключ);
СеансЗапущенБезРазделителей = Истина; Если ПользовательИБ = Неопределено
КонецЕсли; Или ПользовательИБ.АутентификацияСтандартная = Ложь
И ПользовательИБ.АутентификацияОС = Ложь
Если Не ОбщегоНазначения.РазделениеВключено() И ПользовательИБ.АутентификацияOpenID = Ложь Тогда
Или Не СеансЗапущенБезРазделителей Тогда
Параметры.ВходВПрограммуЗапрещен = Истина; АдресатыБлокировки.Вставить(Адресат.Ключ, Адресат.Значение);
КонецЕсли; Продолжить;
КонецЕсли;
ИначеЕсли ПользовательИБ.АутентификацияСтандартная = Ложь НоваяХешСумма = ХешСуммаРолейПользователяИБ(ПользовательИБ);
И ПользовательИБ.АутентификацияОС = Ложь Если ВариантПараметров.Параметры <> НоваяХешСумма Тогда
И ПользовательИБ.АутентификацияOpenID = Ложь Тогда ДатаНапомнитьЗавтра = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(
"КонтрольИзмененияРолейПользователяИБ", "ДатаНапомнитьЗавтра",,, ПользовательИБ.Имя);
Если ТипЗнч(ДатаНапомнитьЗавтра) = Тип("Дата")
И ТекущаяДатаСеанса() < ДатаНапомнитьЗавтра Тогда
Продолжить;
КонецЕсли;
АдресатыИзмененияРолей.Вставить(Адресат.Ключ, Адресат.Значение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Параметры.ВходВПрограммуЗапрещен = Истина; Если ЗначениеЗаполнено(АдресатыБлокировки) Тогда
СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения, "ВходВПрограммуЗапрещен", АдресатыБлокировки);
КонецЕсли;
Если ЗначениеЗаполнено(АдресатыИзмененияРолей) Тогда
СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения, "РолиИзменены", АдресатыИзмененияРолей);
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -1532,15 +1592,6 @@
МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СведенияОПользователях); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СведенияОПользователях);
КонецПроцедуры КонецПроцедуры
// Обработчики событий подсистемы ТехнологияСервиса.ОчередьЗаданий.
// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов
Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт
ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.КонтрольАктивностиПользователей.Имя);
КонецПроцедуры
// Обработчики событий подсистемы СтандартныеПодсистемы.ПодключаемыеКоманды. // Обработчики событий подсистемы СтандартныеПодсистемы.ПодключаемыеКоманды.
// См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. // См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.
@@ -1633,67 +1684,6 @@
КонецПроцедуры КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Использование регламентных заданий.
// Обработчик регламентного задания КонтрольАктивностиПользователей.
Процедура КонтрольАктивностиПользователей() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.КонтрольАктивностиПользователей);
ОтключитьНеактивныхИПросроченныхПользователей();
КонецПроцедуры
// Изменяет использование регламентного задания КонтрольАктивностиПользователей.
//
// Параметры:
// Использование - Булево - Истина, если задание нужно включить, иначе Ложь.
//
Процедура ИзменитьЗаданиеКонтрольАктивностиПользователей(Использование) Экспорт
Если ОбщегоНазначения.РазделениеВключено() Тогда
Возврат;
КонецЕсли;
РегламентныеЗаданияСервер.УстановитьИспользованиеПредопределенногоРегламентногоЗадания(
Метаданные.РегламентныеЗадания.КонтрольАктивностиПользователей, Использование);
КонецПроцедуры
// Вызывается при записи пользователя или внешнего пользователя, проверят срок действия.
Процедура ВключитьЗаданиеКонтрольАктивностиПользователейПриНеобходимости(Пользователь) Экспорт
Если ОбщегоНазначения.РазделениеВключено() Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Если Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Запрос.УстановитьПараметр("ПустаяДата", '00010101');
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЗначениеИстина
|ИЗ
| РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
|ГДЕ
| СведенияОПользователях.Пользователь В(&Пользователь)
| И СведенияОПользователях.СрокДействия <> &ПустаяДата
| И СведенияОПользователях.ДатаАвтоматическогоЗапрещенияВхода = &ПустаяДата";
Если Не Запрос.Выполнить().Пустой() Тогда
ИзменитьЗаданиеКонтрольАктивностиПользователей(Истина);
КонецЕсли;
КонецПроцедуры
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции работы с настройками входа пользователей. // Процедуры и функции работы с настройками входа пользователей.
@@ -4994,6 +4984,21 @@
КонецФункции КонецФункции
// Параметры:
// ПользовательИБ - ПользовательИнформационнойБазы
//
// Возвращаемое значение:
// Строка
//
Функция ХешСуммаРолейПользователяИБ(ПользовательИБ)
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(ЗначениеВСтрокуВнутр(ПользовательИБ.Роли));
Возврат Base64Строка(Хеширование.ХешСумма);
КонецФункции
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Универсальные процедуры и функции. // Универсальные процедуры и функции.
@@ -6434,7 +6439,7 @@
КонецЕсли; КонецЕсли;
НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРолиПоТипуПользователя(ЭтоВнешнийПользователь); НедоступныеРоли = НедоступныеРолиПоТипуПользователя(ЭтоВнешнийПользователь);
РолиДляПроверки = Новый ТаблицаЗначений; РолиДляПроверки = Новый ТаблицаЗначений;
РолиДляПроверки.Колонки.Добавить("Роль", Новый ОписаниеТипов("ОбъектМетаданных")); РолиДляПроверки.Колонки.Добавить("Роль", Новый ОписаниеТипов("ОбъектМетаданных"));
@@ -6968,11 +6973,11 @@
КонецПроцедуры КонецПроцедуры
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Для процедур: // Процедуры обработки настроек входа.
// - ПриДобавленииПараметровРаботыКлиентаПриЗапуске,
// - ПриВыполненииСтандартныхПериодическихПроверокНаСервере.
// Для функции АвторизоватьТекущегоПользователяПриВходе.
// Обновляет дату последней активности и проверяет необходимость смены пароля. // Обновляет дату последней активности и проверяет необходимость смены пароля.
//
Функция ТребуетсяСменитьПароль(ОписаниеОшибки = "", ПриЗапуске = Ложь, РегистрироватьВЖурнале = Истина) Функция ТребуетсяСменитьПароль(ОписаниеОшибки = "", ПриЗапуске = Ложь, РегистрироватьВЖурнале = Истина)
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
@@ -7110,6 +7115,79 @@
КонецФункции КонецФункции
// Для процедуры ПриОтправкеСерверногоОповещения.
Процедура ОбновитьДатуПоследнейАктивностиПользователей(Параметры)
ИдентификаторыПользователейИБ = Новый Массив;
Для Каждого ПараметрПроверки Из Параметры Цикл
Для Каждого Адресат Из ПараметрПроверки.Адресаты Цикл
ИдентификаторыПользователейИБ.Добавить(Адресат.Ключ);
КонецЦикла;
КонецЦикла;
НачалоДняТекущейДатыСеанса = НачалоДня(ТекущаяДатаСеанса());
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("НачалоДняТекущейДатыСеанса", НачалоДняТекущейДатыСеанса);
Запрос.УстановитьПараметр("ИдентификаторыПользователейИБ", ИдентификаторыПользователейИБ);
Запрос.Текст =
"ВЫБРАТЬ
| СведенияОПользователях.Пользователь КАК Пользователь
|ИЗ
| РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
|ГДЕ
| СведенияОПользователях.ДатаПоследнейАктивности < &НачалоДняТекущейДатыСеанса
| И СведенияОПользователях.Пользователь.ИдентификаторПользователяИБ В(&ИдентификаторыПользователейИБ)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекущийПользователь = Выборка.Пользователь;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях");
ЭлементБлокировки.УстановитьЗначение("Пользователь", ТекущийПользователь);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 1 Тогда
СведенияОПользователе = НаборЗаписей[0];
Если СведенияОПользователе.ДатаПоследнейАктивности < НачалоДняТекущейДатыСеанса Тогда
СведенияОПользователе.ДатаПоследнейАктивности = НачалоДняТекущейДатыСеанса;
Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ПользователиСервиса") Тогда
МодульПользователиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСервиса");
МодульПользователиСервиса.ОбновитьАктивностьПользователяСервиса(
ТекущийПользователь,
НачалоДняТекущейДатыСеанса);
КонецЕсли;
НаборЗаписей.Записать();
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ИнформацияОбОшибке = ИнформацияОбОшибке();
ШаблонТекстаОшибки = ШаблонТекстаОшибкиЗаписиСведенийОТекущемПользователе();
ЗаписьЖурналаРегистрации(
НСтр("ru = 'Пользователи.Ошибка обновления даты последней активности'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.НайтиПоТипу(ТипЗнч(ТекущийПользователь)),
ТекущийПользователь,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)));
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Для функции ОбработатьНовыйПароль. // Для функции ОбработатьНовыйПароль.
// //
// Параметры: // Параметры:
@@ -7677,9 +7755,6 @@
КонецПроцедуры КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Для процедуры КонтрольАктивностиПользователей.
Процедура ОтключитьНеактивныхИПросроченныхПользователей(ТолькоДляАвторизованногоПользователя = Ложь, Процедура ОтключитьНеактивныхИПросроченныхПользователей(ТолькоДляАвторизованногоПользователя = Ложь,
ОписаниеОшибки = "", РегистрироватьВЖурнале = Истина) ОписаниеОшибки = "", РегистрироватьВЖурнале = Истина)
@@ -7690,10 +7765,9 @@
УстановитьПривилегированныйРежим(Истина); УстановитьПривилегированныйРежим(Истина);
Настройки = ПользователиСлужебныйПовтИсп.Настройки(); Настройки = ПользователиСлужебныйПовтИсп.Настройки();
Если Не Настройки.ОбщиеНастройкиВхода Тогда Если Не Настройки.ОбщиеНастройкиВхода
Если Не ТолькоДляАвторизованногоПользователя Тогда Или Не ЗначениеЗаполнено(Настройки.Пользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода)
ИзменитьЗаданиеКонтрольАктивностиПользователей(Ложь); И Не ЗначениеЗаполнено(Настройки.ВнешниеПользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда
КонецЕсли;
Возврат; Возврат;
КонецЕсли; КонецЕсли;
@@ -7889,32 +7963,6 @@
КонецПопытки; КонецПопытки;
КонецЦикла; КонецЦикла;
Если ТолькоДляАвторизованногоПользователя Тогда
Возврат;
КонецЕсли;
Если ИнформацияОбОшибке <> Неопределено
Или ЗначениеЗаполнено(Настройки.Пользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода)
Или ЗначениеЗаполнено(Настройки.ВнешниеПользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда
// Для проверки просрочки работы в программе, задание выключить нельзя.
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ПустаяДата", '00010101');
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЗначениеИстина
|ИЗ
| РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
|ГДЕ
| СведенияОПользователях.СрокДействия <> &ПустаяДата
| И СведенияОПользователях.ДатаАвтоматическогоЗапрещенияВхода = &ПустаяДата";
Если Запрос.Выполнить().Пустой() Тогда
ИзменитьЗаданиеКонтрольАктивностиПользователей(Ложь);
КонецЕсли;
КонецПроцедуры КонецПроцедуры
Процедура ПроверитьВходВПрограммуРазрешен(ОшибкаАвторизации) Процедура ПроверитьВходВПрограммуРазрешен(ОшибкаАвторизации)
@@ -165,17 +165,22 @@
КонецПроцедуры КонецПроцедуры
// См. СтандартныеПодсистемыКлиент.ПриВыполненииСтандартныхПериодическихПроверок. // См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения.
Процедура ПриВыполненииСтандартныхПериодическихПроверок(Параметры, ОбработкаПродолжения) Экспорт Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт
// Проверяет, что срок действия учетной записи истек и нужно завершить работу. Если Результат = "ВходВПрограммуЗапрещен" Тогда
Если Не Параметры.ВходВПрограммуЗапрещен Тогда ОткрытьФорму("ОбщаяФорма.ВходВПрограммуЗапрещен");
ВыполнитьОбработкуОповещения(ОбработкаПродолжения);
Возврат; ИначеЕсли Результат = "РолиИзменены" Тогда
ПоказатьОповещениеПользователя(
НСтр("ru = 'Права доступа обновлены'"),
"e1cib/app/ОбщаяФорма.КонтрольИзмененияРолейПользователяИБ",
НСтр("ru = 'Перезапустите программу, чтобы они вступили в силу.'"),
БиблиотекаКартинок.Предупреждение32,
СтатусОповещенияПользователя.Важное,
"КонтрольИзмененияРолейПользователяИБ");
КонецЕсли; КонецЕсли;
ОткрытьФорму("ОбщаяФорма.ВходВПрограммуЗапрещен");
КонецПроцедуры КонецПроцедуры
#КонецОбласти #КонецОбласти
@@ -87,36 +87,6 @@
КонецФункции КонецФункции
// Возвращает недоступные роли для разделенных пользователей или внешних пользователей
// с учетом прав текущего пользователя и режима работы (локальный или модель сервиса).
//
// Параметры:
// ДляВнешнихПользователей - Булево - если истина, значит для внешних пользователей.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Строка - имя роли.
// * Значение - Булево - Истина.
//
Функция НедоступныеРолиПоТипуПользователя(ДляВнешнихПользователей) Экспорт
Если ДляВнешнихПользователей Тогда
НазначениеРолейПользователя = "ДляВнешнихПользователей";
ИначеЕсли Не ОбщегоНазначения.РазделениеВключено()
И Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь) Тогда
// Пользователь с ролью АдминистраторСистемы в локальном режиме работы
// может выдавать административные права.
НазначениеРолейПользователя = "ДляАдминистраторов";
Иначе
НазначениеРолейПользователя = "ДляПользователей";
КонецЕсли;
Возврат ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеРолейПользователя);
КонецФункции
// Проверяет доступность восстановления пароля пользователя. // Проверяет доступность восстановления пароля пользователя.
// //
// Возвращаемое значение: // Возвращаемое значение:
@@ -826,7 +826,7 @@
КонецПроцедуры КонецПроцедуры
Процедура ОчиститьУдаленныеФайлы() Экспорт Процедура ОчиститьУдаленныеФайлы() Экспорт
Если НЕ (ХранитьФайлыВТомахНаДиске()) Тогда Если НЕ ХранитьФайлыВТомахНаДиске() Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;
@@ -5994,8 +5994,7 @@
Функция ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение) Функция ТекстЗапросаДляСинхронизацииФайлов(ВладелецФайла, НастройкаСинхронизации, МассивИсключений, ЭлементИсключение)
ТипОбъекта = ВладелецФайла; ПредставлениеТипаВладельца = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки));
ПредставлениеТипаВладельца = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки));
ПолноеИмяСправочникаФайлов = НастройкаСинхронизации.ТипВладельцаФайла.ПолноеИмя; ПолноеИмяСправочникаФайлов = НастройкаСинхронизации.ТипВладельцаФайла.ПолноеИмя;
МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов); МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов);
ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайлов); ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайлов);
@@ -6025,12 +6024,12 @@
КонецЕсли; КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ
| СправочникПапок.Ссылка,";// @query-part | СправочникПапок.Ссылка,"; // @query-part
ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ВладелецФайла);
ТекстЗапроса = ТекстЗапроса + " ТекстЗапроса = ТекстЗапроса + "
| СправочникФайлов.Ссылка КАК ФайлСсылка,"; | СправочникФайлов.Ссылка КАК ФайлСсылка,"; // @query-part
Если ВозможностьСоздаватьГруппы Тогда Если ВозможностьСоздаватьГруппы Тогда
@@ -6042,10 +6041,10 @@
| КОНЕЦ КАК Наименование, | КОНЕЦ КАК Наименование,
| СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления, | СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления,
| СправочникФайлов.ВладелецФайла КАК Родитель, | СправочникФайлов.ВладелецФайла КАК Родитель,
| ЛОЖЬ КАК ЭтоПапка,"; | ЛОЖЬ КАК ЭтоПапка,"; // @query-part
ОтборПоПапкам = "(СправочникФайлов.ЭтоГруппа ОтборПоПапкам = "(СправочникФайлов.ЭтоГруппа
| ИЛИ (НЕ СправочникФайлов.ЭтоГруппа И СправочникФайлов.ПодписанЭП = ЛОЖЬ И СправочникФайлов.Зашифрован = ЛОЖЬ)) "; | ИЛИ (НЕ СправочникФайлов.ЭтоГруппа И СправочникФайлов.ПодписанЭП = ЛОЖЬ И СправочникФайлов.Зашифрован = ЛОЖЬ)) "; // @query-part
Иначе Иначе
@@ -6053,9 +6052,9 @@
| СправочникФайлов.Наименование + ""."" + СправочникФайлов.Расширение КАК Наименование, | СправочникФайлов.Наименование + ""."" + СправочникФайлов.Расширение КАК Наименование,
| СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления, | СправочникФайлов.ПометкаУдаления КАК ПометкаУдаления,
| СправочникФайлов.ВладелецФайла КАК Родитель, | СправочникФайлов.ВладелецФайла КАК Родитель,
| ЛОЖЬ КАК ЭтоПапка,"; | ЛОЖЬ КАК ЭтоПапка,"; // @query-part
ОтборПоПапкам = " СправочникФайлов.ПодписанЭП = ЛОЖЬ И СправочникФайлов.Зашифрован = ЛОЖЬ "; ОтборПоПапкам = " СправочникФайлов.ПодписанЭП = ЛОЖЬ И СправочникФайлов.Зашифрован = ЛОЖЬ "; // @query-part
КонецЕсли; КонецЕсли;
@@ -6087,21 +6086,21 @@
Если МассивИсключений.Количество() > 0 Тогда Если МассивИсключений.Количество() > 0 Тогда
ТекстЗапроса = ТекстЗапроса + " ТекстЗапроса = ТекстЗапроса + "
| И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; | И НЕ СправочникПапок.Ссылка В ИЕРАРХИИ (&МассивИсключений)"; // @query-part
КонецЕсли; КонецЕсли;
Если ЭлементИсключение <> Неопределено Тогда Если ЭлементИсключение <> Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + " ТекстЗапроса = ТекстЗапроса + "
| И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; | И СправочникПапок.Ссылка В ИЕРАРХИИ (&ЭлементИсключение)"; // @query-part
КонецЕсли; КонецЕсли;
ТекстЗапроса = ТекстЗапроса + " ТекстЗапроса = ТекстЗапроса + "
|ОБЪЕДИНИТЬ ВСЕ |ОБЪЕДИНИТЬ ВСЕ
| |
|ВЫБРАТЬ |ВЫБРАТЬ
| СправочникПапок.Ссылка,";// @query-part | СправочникПапок.Ссылка,"; // @query-part
ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ВладелецФайла);
ТекстЗапроса = ТекстЗапроса + " ТекстЗапроса = ТекстЗапроса + "
| СправочникПапок.Ссылка, | СправочникПапок.Ссылка,
@@ -6169,25 +6168,31 @@
КонецФункции КонецФункции
// Параметры: // Параметры:
// ТипОбъекта - ОбъектМетаданныхСправочник // ВладелецФайла - ОпределяемыйТип.ВладелецПрисоединенныхФайлов
// //
Процедура ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта) Процедура ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ВладелецФайла)
ВсеСправочники = Справочники.ТипВсеСсылки(); ВсеСправочники = Справочники.ТипВсеСсылки();
ВсеДокументы = Документы.ТипВсеСсылки(); ВсеДокументы = Документы.ТипВсеСсылки();
Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда Если ВсеСправочники.СодержитТип(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)) Тогда
Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; Справочник = Метаданные.Справочники[ВладелецФайла.Имя];
ШаблонЗапроса = "СправочникПапок.%1 КАК %1,"; // @query-part
Для Каждого Реквизит Из Справочник.Реквизиты Цикл Для Каждого Реквизит Из Справочник.Реквизиты Цикл
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникПапок." + Реквизит.Имя + " КАК " + Реквизит.Имя +","; ТекстЗапроса = ТекстЗапроса + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонЗапроса, Реквизит.Имя);
КонецЦикла; КонецЦикла;
ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)) Тогда
Документ = Метаданные.Документы[ТипОбъекта.Имя]; Документ = Метаданные.Документы[ВладелецФайла.Имя];
ШаблонЗапроса = "СправочникПапок.%1,"; // @query-part
ШаблонЗапросаДата = "РАЗНОСТЬДАТ(СправочникПапок.%1, &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт%1,"; // @query-part
Для Каждого Реквизит Из Документ.Реквизиты Цикл Для Каждого Реквизит Из Документ.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(Тип("Дата")) Тогда Если Реквизит.Тип.СодержитТип(Тип("Дата")) Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; ТекстЗапроса = ТекстЗапроса + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонЗапросаДата, Реквизит.Имя);
КонецЕсли; КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникПапок." + Реквизит.Имя + ","; ТекстЗапроса = ТекстЗапроса + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонЗапроса, Реквизит.Имя);
КонецЦикла; КонецЦикла;
КонецЕсли; КонецЕсли;
@@ -1118,11 +1118,12 @@
// Рассылка - СправочникСсылка.РассылкиОтчетов // Рассылка - СправочникСсылка.РассылкиОтчетов
// - Структура - элемент справочника, для которого необходимо сформировать // - Структура - элемент справочника, для которого необходимо сформировать
// список получателей. // список получателей.
// ПараметрыЖурнала - см. ПараметрыЖурнала
// //
// Возвращаемое значение: // Возвращаемое значение:
// Структура - результат получения списка получателей рассылки: // Соответствие из КлючИЗначение:
// * Получатели - см. РассылкаОтчетов.ВыполнитьРассылку // * Ключ - СправочникСсылка
// * Ошибки - Строка - ошибки, которые возникли в процессе. // * Значение - Строка - почтовые адреса с разделителями ";", например: "email@server.com; email2@server2.com".
// //
Функция СформироватьСписокПолучателейРассылки(Рассылка, ПараметрыЖурнала = Неопределено) Экспорт Функция СформироватьСписокПолучателейРассылки(Рассылка, ПараметрыЖурнала = Неопределено) Экспорт
@@ -80,15 +80,25 @@
КонецПроцедуры КонецПроцедуры
// Позволяет определить свой обработчик формирования списка получателей. // Позволяет переопределить список получателей рассылки отчетов.
// Если параметр СтандартнаяОбработка оставить в Истина, то список получателей формируется по правилам:
// - если рассылка личная, то в список получателей включается только автор рассылки;
// - если получатели рассылки - это иерархический справочник, и указан родительский элемент,
// то включаются все его дочерние элементы (кроме групп);
// - исключаются получатели, которые отмечены в списке как исключаемые, а также помеченные на удаление;
// - если получателями рассылки отчетов являются пользователи, то исключаются служебные и недействительные пользователи;
// - для получателей рассылки отчетов заполняются их почтовые адреса, соответствующие виду контактной информации
// ВидПочтовогоАдресаПолучателей параметра ПараметрыПолучателей.
// //
// Параметры: // Параметры:
// ПараметрыПолучателей - Структура - параметры формирования получателей рассылки. // ПараметрыПолучателей - СправочникСсылка.РассылкиОтчетов
// Запрос - Запрос - запрос, который будет использован, если значение параметра СтандартнаяОбработка останется Истина. // - Структура - параметры формирования получателей рассылки.
// СтандартнаяОбработка - Булево - признак использования стандартных механизмов. // Запрос - Запрос - запрос, который будет выполнен, если значение параметра СтандартнаяОбработка оставить в Истина.
// Результат - Соответствие из КлючИЗначение - получатели с их E-mail адресами: // СтандартнаяОбработка - Булево - указать Ложь, если Результат требуется заполнить в этом обработчике.
// * Ключ - СправочникСсылка - получатель. // Результат - Соответствие из КлючИЗначение - возвращаемое значение. Если СтандартнаяОбработка установлена в Истина,
// * Значение - Строка - набор E-mail адресов в строке с разделителями. // то заполнить список получателей с их адресами:
// * Ключ - СправочникСсылка - получатель рассылки отчетов. Например, пользователь или контрагент.
// * Значение - Строка - почтовые адреса с разделителями ";", например: "email@server.com; email2@server2.com".
// //
Процедура ПередФормированиемСпискаПолучателейРассылки(ПараметрыПолучателей, Запрос, СтандартнаяОбработка, Результат) Экспорт Процедура ПередФормированиемСпискаПолучателейРассылки(ПараметрыПолучателей, Запрос, СтандартнаяОбработка, Результат) Экспорт
@@ -859,12 +859,19 @@
// //
// Параметры: // Параметры:
// Идентификатор - УникальныйИдентификатор - идентификатор регламентного задания. // Идентификатор - УникальныйИдентификатор - идентификатор регламентного задания.
// - ОбъектМетаданныхРегламентноеЗадание - перед добавления нового без дублей.
// //
Процедура ЗаблокироватьРегламентноеЗадание(Идентификатор) Экспорт Процедура ЗаблокироватьРегламентноеЗадание(Идентификатор) Экспорт
Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда
ИдентификаторБлокировки = Идентификатор.Имя;
Иначе
ИдентификаторБлокировки = Строка(Идентификатор);
КонецЕсли;
Блокировка = Новый БлокировкаДанных; Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов"); ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов");
ЭлементБлокировки.УстановитьЗначение("Идентификатор", Строка(Идентификатор)); ЭлементБлокировки.УстановитьЗначение("Идентификатор", ИдентификаторБлокировки);
Блокировка.Заблокировать(); Блокировка.Заблокировать();
КонецПроцедуры КонецПроцедуры
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9c472614-595a-4456-aadd-f629455a754e">
<name>СерверныеОповещения</name>
<synonym>
<key>ru</key>
<value>Серверные оповещения</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>
@@ -0,0 +1,29 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Процедура ОбработчикПроверкиПолученияСерверныхОповещений() Экспорт
СостояниеПолучения = СерверныеОповещенияКлиент.СостояниеПолучения();
Если СостояниеПолучения.ПроверкаВыполняется Тогда
Возврат;
КонецЕсли;
СостояниеПолучения.ПроверкаВыполняется = Истина;
Попытка
СерверныеОповещенияКлиент.ПроверитьПолучитьСерверныеОповещения();
СостояниеПолучения.ПроверкаВыполняется = Ложь;
Исключение
СостояниеПолучения.ПроверкаВыполняется = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
#КонецОбласти
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="77adf47b-6015-46fc-9e29-f1c025ea0d81"> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c205ddad-54ed-476f-85cd-e133313fe3a5">
<name>ДлительныеОперацииГлобальный</name> <name>СерверныеОповещенияГлобальный</name>
<synonym> <synonym>
<key>ru</key> <key>ru</key>
<value>Длительные операции глобальный</value> <value>Серверные оповещения глобальный</value>
</synonym> </synonym>
<global>true</global> <global>true</global>
<clientManagedApplication>true</clientManagedApplication> <clientManagedApplication>true</clientManagedApplication>
@@ -0,0 +1,488 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Параметры:
// Интервал - Число
//
Процедура ПодключитьОбработчикПроверкиПолученияСерверныхОповещений(Интервал = 1) Экспорт
Если Интервал < 1 Тогда
Интервал = 1;
ИначеЕсли Интервал > 60 Тогда
Интервал = 60;
КонецЕсли;
ПодключитьОбработчикОжидания("ОбработчикПроверкиПолученияСерверныхОповещений", Интервал, Истина);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.
Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт
ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
Если Не ПараметрыКлиента.Свойство("СерверныеОповещения") Тогда
Возврат;
КонецЕсли;
ПараметрыСерверныхОповещений = ПараметрыКлиента.СерверныеОповещения; // см. СерверныеОповещения.ПараметрыСерверныхОповещенийЭтогоСеанса
СостояниеПолучения = СостояниеПолучения();
ЗаполнитьЗначенияСвойств(СостояниеПолучения, ПараметрыСерверныхОповещений);
Параметры.ПолученныеПараметрыКлиента.Вставить("СерверныеОповещения");
ДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
СостояниеПолучения.ДатаОбновленияСостояния = ДатаСеанса;
СостояниеПолучения.ДатаПоследнегоПолученияСообщения = ДатаСеанса;
СостояниеПолучения.ДатаПоследнейПериодическойОтправкиДанных = ДатаСеанса;
СостояниеПолучения.ПроверкаРазрешена = Истина;
ПодключитьОбработчикПроверкиПолученияСерверныхОповещений();
КонецПроцедуры
// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы.
Процедура ПослеНачалаРаботыСистемы() Экспорт
СостояниеПолучения = СостояниеПолучения();
Если СостояниеПолучения.СеансАдминистратораСервиса Тогда
Возврат;
КонецЕсли;
СостояниеПолучения.ПериодическаяОтправкаДанныхРазрешена = Истина;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ПроверитьПолучитьСерверныеОповещения() Экспорт
СостояниеПолучения = СостояниеПолучения();
Если Не СостояниеПолучения.ПроверкаРазрешена Тогда
Возврат;
КонецЕсли;
Интервал = СостояниеПолучения.МинимальныйПериод;
ОбсужденияАктивны = СостояниеПолучения.ОбработчикНовыхЛичныхСообщенийПодключен
И СостояниеПолучения.ДатаПоследнегоПолученияСообщения + 60 > ОбщегоНазначенияКлиент.ДатаСеанса();
ДополнительныеПараметры = Новый Соответствие;
ИмяКлючаПараметровОбсуждений = "СтандартныеПодсистемы.БазоваяФункциональность.ИдентификаторыОбсуждений";
ДлительныеОперацииКлиент.ПередПериодическойОтправкойДанныхКлиентаНаСервер(ДополнительныеПараметры,
ОбсужденияАктивны, Интервал);
ТекущаяДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
ПериодическаяОтправкаДанных = Ложь;
Если СостояниеПолучения.ДатаПоследнейПериодическойОтправкиДанных + 60 < ТекущаяДатаСеанса Тогда
Если СостояниеПолучения.ПериодическаяОтправкаДанныхРазрешена Тогда
ИнтеграцияПодсистемБСПКлиент.ПередПериодическойОтправкойДанныхКлиентаНаСервер(ДополнительныеПараметры);
ОбщегоНазначенияКлиентПереопределяемый.ПередПериодическойОтправкойДанныхКлиентаНаСервер(ДополнительныеПараметры);
ПериодическаяОтправкаДанных = Истина;
КонецЕсли;
СостояниеПолучения.ДатаПоследнейПериодическойОтправкиДанных = ТекущаяДатаСеанса;
СообщенияДляЖурналаРегистрации = ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"];
Если СостояниеПолучения.ИдентификаторЛичногоОбсуждения = Неопределено
И СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована() Тогда
ДополнительныеПараметры.Вставить(ИмяКлючаПараметровОбсуждений, Ложь);
КонецЕсли;
КонецЕсли;
Если ОповещенияПолучены(СостояниеПолучения)
И Не ЗначениеЗаполнено(ДополнительныеПараметры)
И Не ЗначениеЗаполнено(СообщенияДляЖурналаРегистрации) Тогда
ПодключитьОбработчикПроверкиПолученияСерверныхОповещений(Интервал);
Возврат;
КонецЕсли;
ПараметрыОбщегоВызова = НовыеПараметрыОбщегоСерверногоВызова();
ПараметрыОбщегоВызова.ДатаПоследнегоОповещения = СостояниеПолучения.ДатаПоследнегоОповещения;
ПараметрыОбщегоВызова.МинимальныйПериодПроверки = СостояниеПолучения.МинимальныйПериод;
ПараметрыОбщегоВызова.ДополнительныеПараметры = ДополнительныеПараметры;
ПараметрыОбщегоВызова.ПериодическаяОтправкаДанных = ПериодическаяОтправкаДанных;
ПараметрыОбщегоВызова.СообщенияДляЖурналаРегистрации =
ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"];
РезультатОбщегоВызова = СерверныеОповещенияСлужебныйВызовСервера.НедоставленныеСерверныеОповещенияСеанса(
ПараметрыОбщегоВызова);
Если ПараметрыОбщегоВызова.СообщенияДляЖурналаРегистрации <> Неопределено Тогда
ПараметрыОбщегоВызова.СообщенияДляЖурналаРегистрации.Очистить();
КонецЕсли;
ДополнительныеРезультаты = РезультатОбщегоВызова.ДополнительныеРезультаты;
ИдентификаторыОбсуждений = ДополнительныеРезультаты.Получить(ИмяКлючаПараметровОбсуждений);
Если ИдентификаторыОбсуждений <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СостояниеПолучения, ИдентификаторыОбсуждений);
ПодключитьОбработчикНовыхСообщений(СостояниеПолучения);
КонецЕсли;
Для Каждого СерверноеОповещение Из РезультатОбщегоВызова.СерверныеОповещения Цикл
ОбработатьСерверноеОповещениеНаКлиенте(СостояниеПолучения, СерверноеОповещение);
КонецЦикла;
ДлительныеОперацииКлиент.ПослеПериодическогоПолученияДанныхКлиентаНаСервере(
ДополнительныеРезультаты, ОбсужденияАктивны, Интервал);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда
МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент");
МодульСоединенияИБКлиент.ПослеПериодическогоПолученияДанныхКлиентаНаСервере(
ДополнительныеРезультаты);
КонецЕсли;
Если ПериодическаяОтправкаДанных Тогда
ИнтеграцияПодсистемБСПКлиент.ПослеПериодическогоПолученияДанныхКлиентаНаСервере(
ДополнительныеРезультаты);
ОбщегоНазначенияКлиентПереопределяемый.ПослеПериодическогоПолученияДанныхКлиентаНаСервере(
ДополнительныеРезультаты);
КонецЕсли;
СостояниеПолучения.ДатаПоследнегоОповещения = РезультатОбщегоВызова.ДатаПоследнегоОповещения;
СостояниеПолучения.МинимальныйПериод = РезультатОбщегоВызова.МинимальныйПериодПроверки;
СостояниеПолучения.ДатаОбновленияСостояния = ОбщегоНазначенияКлиент.ДатаСеанса();
Если Интервал > СостояниеПолучения.МинимальныйПериод Тогда
Интервал = СостояниеПолучения.МинимальныйПериод;
КонецЕсли;
ПодключитьОбработчикПроверкиПолученияСерверныхОповещений(Интервал);
КонецПроцедуры
Процедура ОбработатьСерверноеОповещениеНаКлиенте(СостояниеПолучения, СерверноеОповещение)
Если ОповещениеУжеПолучено(СостояниеПолучения, СерверноеОповещение) Тогда
Возврат;
КонецЕсли;
ИмяОповещения = СерверноеОповещение.ИмяОповещения;
Результат = СерверноеОповещение.Результат;
Оповещение = СостояниеПолучения.Оповещения.Получить(ИмяОповещения);
Если Оповещение = Неопределено Тогда
Возврат;
КонецЕсли;
МодульОбработки = ОбщегоНазначенияКлиент.ОбщийМодуль(Оповещение.ИмяМодуляПолучения);
Попытка
МодульОбработки.ПриПолученииСерверногоОповещения(ИмяОповещения, Результат);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При вызове процедуры ""%1"" возникла ошибка:
|%2'"),
Оповещение.ИмяМодуляПолучения + ".ПриПолученииСерверногоОповещения",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Серверные оповещения.Ошибка обработки полученного оповещения'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Функция ОповещенияПолучены(СостояниеПолучения)
ПодключитьОбработчикНовыхСообщений(СостояниеПолучения);
Граница = СостояниеПолучения.ДатаОбновленияСостояния + СостояниеПолучения.МинимальныйПериод;
Запас = Граница - ОбщегоНазначенияКлиент.ДатаСеанса();
Если Запас > 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
// См. НовоеСостояниеПолучения
Функция СостояниеПолучения() Экспорт
ИмяПараметраПриложения = "СтандартныеПодсистемы.БазоваяФункциональность.СерверныеОповещения";
СостояниеПолучения = ПараметрыПриложения.Получить(ИмяПараметраПриложения);
Если СостояниеПолучения = Неопределено Тогда
СостояниеПолучения = НовоеСостояниеПолучения();
ПараметрыПриложения.Вставить(ИмяПараметраПриложения, СостояниеПолучения);
КонецЕсли;
Возврат СостояниеПолучения;
КонецФункции
// Возвращаемое значение:
// Структура:
// * ДатаПоследнегоОповещения - Дата
// * МинимальныйПериодПроверки - Число
// * ДополнительныеПараметры - Соответствие
// * СообщенияДляЖурналаРегистрации - Неопределено, СписокЗначений
// * ПериодическаяОтправкаДанных - Булево
//
Функция НовыеПараметрыОбщегоСерверногоВызова() Экспорт
Результат = Новый Структура;
Результат.Вставить("ДатаПоследнегоОповещения", '00010101');
Результат.Вставить("МинимальныйПериодПроверки", 60);
Результат.Вставить("ДополнительныеПараметры", Новый Соответствие);
Результат.Вставить("СообщенияДляЖурналаРегистрации", Неопределено);
Результат.Вставить("ПериодическаяОтправкаДанных", Ложь);
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// Структура:
// * ПроверкаРазрешена - Булево - устанавливается Истина в процедуре ПередНачаломРаботыСистемы.
// * СеансАдминистратораСервиса - Булево
// * ПериодическаяОтправкаДанныхРазрешена - Булево - устанавливается Истина в процедуре ПослеНачалаРаботыСистемы.
// * ПроверкаВыполняется - Булево
// * КлючСеанса - см. СерверныеОповещения.КлючСеанса
// * ИдентификаторПользователяИБ - УникальныйИдентификатор
// * ДатаОбновленияСостояния - Дата
// * ДатаПоследнегоПолученияСообщения - Дата
// * МинимальныйПериод - Число - число секунд.
// * ДатаПоследнегоОповещения - Дата
// * Оповещения - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений.Оповещения
// * ПолученныеОповещения - Массив из Строка - строки уникальных идентификаторов полученных сообщений.
// * ИдентификаторЛичногоОбсуждения - Неопределено - обсуждение недоступно.
// - ИдентификаторОбсужденияСистемыВзаимодействия - идентификатор
// обсуждения "СерверныеОповещения <Идентификатор пользователя ИБ>".
//
// * ИдентификаторОбщегоОбсуждения - Неопределено - обсуждение недоступно.
// - ИдентификаторОбсужденияСистемыВзаимодействия - идентификатор
// обсуждения "СерверныеОповещения".
// * ИдентификаторЛичногоОбсуждения - Строка - строка уникального идентификатора
// обсуждения "СерверныеОповещения <Идентификатор пользователя ИБ>".
// * ИдентификаторОбщегоОбсуждения - Строка - строка уникального идентификатора
// обсуждения "СерверныеОповещения".
// * ОбработчикНовыхЛичныхСообщенийПодключен - Булево
// * ОбработчикНовыхОбщихСообщенийПодключен - Булево
// * НачатоПодключениеОбработчикаНовыхЛичныхСообщений - Булево
// * НачатоПодключениеОбработчикаНовыхОбщихСообщений - Булево
// * ДатаПоследнейПериодическойОтправкиДанных - Дата
//
Функция НовоеСостояниеПолучения()
Состояние = Новый Структура;
Состояние.Вставить("ПроверкаРазрешена", Ложь);
Состояние.Вставить("СеансАдминистратораСервиса", Ложь);
Состояние.Вставить("ПериодическаяОтправкаДанныхРазрешена", Ложь);
Состояние.Вставить("ПроверкаВыполняется", Ложь);
Состояние.Вставить("КлючСеанса", "");
Состояние.Вставить("ИдентификаторПользователяИБ",
ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
Состояние.Вставить("ДатаОбновленияСостояния", '00010101');
Состояние.Вставить("ДатаПоследнегоПолученияСообщения", '00010101');
Состояние.Вставить("МинимальныйПериод", 60);
Состояние.Вставить("ДатаПоследнегоОповещения", '00010101');
Состояние.Вставить("Оповещения", Новый Соответствие);
Состояние.Вставить("ПолученныеОповещения", Новый Массив);
Состояние.Вставить("ИдентификаторЛичногоОбсуждения", Неопределено);
Состояние.Вставить("ИдентификаторОбщегоОбсуждения", Неопределено);
Состояние.Вставить("ОбработчикНовыхЛичныхСообщенийПодключен", Ложь);
Состояние.Вставить("ОбработчикНовыхОбщихСообщенийПодключен", Ложь);
Состояние.Вставить("НачатоПодключениеОбработчикаНовыхЛичныхСообщений", Ложь);
Состояние.Вставить("НачатоПодключениеОбработчикаНовыхОбщихСообщений", Ложь);
Состояние.Вставить("ДатаПоследнейПериодическойОтправкиДанных", '00010101');
Возврат Состояние;
КонецФункции
Процедура ПодключитьОбработчикНовыхСообщений(СостояниеПолучения)
Если СостояниеПолучения.ИдентификаторЛичногоОбсуждения <> Неопределено
И Не СостояниеПолучения.ОбработчикНовыхЛичныхСообщенийПодключен
И Не СостояниеПолучения.НачатоПодключениеОбработчикаНовыхЛичныхСообщений Тогда
Контекст = Новый Структура("СостояниеПолучения", СостояниеПолучения);
Попытка
СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(
Новый ОписаниеОповещения("ПослеПодключенияОбработчикаНовыхЛичныхСообщений", ЭтотОбъект, Контекст,
"ПослеОшибкиПодключенияОбработчикаНовыхЛичныхСообщений", ЭтотОбъект),
Новый ИдентификаторОбсужденияСистемыВзаимодействия(СостояниеПолучения.ИдентификаторЛичногоОбсуждения),
Новый ОписаниеОповещения("ПриПолученииНовогоЛичногоСообщенияСистемыВзаимодействия", ЭтотОбъект, Контекст,
"ПриОшибкеПолученияНовогоЛичногоСообщенияСистемыВзаимодействия", ЭтотОбъект),
Неопределено);
Исключение
ПослеОшибкиПодключенияОбработчикаНовыхЛичныхСообщений(ИнформацияОбОшибке(), Ложь, Контекст);
КонецПопытки;
КонецЕсли;
Если СостояниеПолучения.ИдентификаторОбщегоОбсуждения <> Неопределено
И Не СостояниеПолучения.ОбработчикНовыхОбщихСообщенийПодключен
И Не СостояниеПолучения.НачатоПодключениеОбработчикаНовыхОбщихСообщений Тогда
Контекст = Новый Структура("СостояниеПолучения", СостояниеПолучения);
Попытка
СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(
Новый ОписаниеОповещения("ПослеПодключенияОбработчикаНовыхОбщихСообщений", ЭтотОбъект, Контекст,
"ПослеОшибкиПодключенияОбработчикаНовыхОбщихСообщений", ЭтотОбъект),
Новый ИдентификаторОбсужденияСистемыВзаимодействия(СостояниеПолучения.ИдентификаторОбщегоОбсуждения),
Новый ОписаниеОповещения("ПриПолученииНовогоОбщегоСообщенияСистемыВзаимодействия", ЭтотОбъект, Контекст,
"ПриОшибкеПолученияНовогоОбщегоСообщенияСистемыВзаимодействия", ЭтотОбъект),
Неопределено);
Исключение
ПослеОшибкиПодключенияОбработчикаНовыхОбщихСообщений(ИнформацияОбОшибке(), Ложь, Контекст);
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура ПослеПодключенияОбработчикаНовыхЛичныхСообщений(Контекст) Экспорт
Контекст.СостояниеПолучения.НачатоПодключениеОбработчикаНовыхЛичныхСообщений = Ложь;
Контекст.СостояниеПолучения.ОбработчикНовыхЛичныхСообщенийПодключен = Истина;
КонецПроцедуры
Процедура ПослеОшибкиПодключенияОбработчикаНовыхЛичныхСообщений(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
Контекст.СостояниеПолучения.НачатоПодключениеОбработчикаНовыхЛичныхСообщений = Ложь;
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Серверные оповещения.Ошибка подключения обработчика новых личных сообщений'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Процедура ПриПолученииНовогоЛичногоСообщенияСистемыВзаимодействия(Сообщение, Контекст) Экспорт
ПриПолученииНовогоСообщенияСистемыВзаимодействия(Сообщение, Контекст);
КонецПроцедуры
Процедура ПриОшибкеПолученияНовогоЛичногоСообщенияСистемыВзаимодействия(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Серверные оповещения.Ошибка получения нового личного сообщения'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Процедура ПослеПодключенияОбработчикаНовыхОбщихСообщений(Контекст) Экспорт
Контекст.СостояниеПолучения.НачатоПодключениеОбработчикаНовыхОбщихСообщений = Ложь;
Контекст.СостояниеПолучения.ОбработчикНовыхОбщихСообщенийПодключен = Истина;
КонецПроцедуры
Процедура ПослеОшибкиПодключенияОбработчикаНовыхОбщихСообщений(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
Контекст.СостояниеПолучения.НачатоПодключениеОбработчикаНовыхОбщихСообщений = Ложь;
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Серверные оповещения.Ошибка подключения обработчика новых общих сообщений'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Процедура ПриПолученииНовогоОбщегоСообщенияСистемыВзаимодействия(Сообщение, Контекст) Экспорт
ПриПолученииНовогоСообщенияСистемыВзаимодействия(Сообщение, Контекст);
КонецПроцедуры
Процедура ПриОшибкеПолученияНовогоОбщегоСообщенияСистемыВзаимодействия(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Серверные оповещения.Ошибка получения нового общего сообщения'",
ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
"Ошибка",
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Процедура ПриПолученииНовогоСообщенияСистемыВзаимодействия(Сообщение, Контекст)
СостояниеПолучения = Контекст.СостояниеПолучения;
Если Не СостояниеПолучения.ПроверкаРазрешена
Или ПараметрыПриложения = Неопределено Тогда
Возврат;
КонецЕсли;
СостояниеПолучения.ДатаПоследнегоПолученияСообщения = ОбщегоНазначенияКлиент.ДатаСеанса();
Если ТипЗнч(Сообщение.Данные) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Данные = Сообщение.Данные; // См. СерверныеОповещения.НовыеДанныеСообщения
Если Не Данные.Свойство("ИмяОповещения") Тогда
Возврат;
КонецЕсли;
Если Данные.ИмяОповещения <> "НетСерверныхОповещений" Тогда
Если Данные.Адресаты <> Неопределено Тогда
КлючиСеансов = Данные.Адресаты.Получить(СостояниеПолучения.ИдентификаторПользователяИБ);
Если КлючиСеансов <> Неопределено
И КлючиСеансов.Найти(СостояниеПолучения.КлючСеанса) = Неопределено Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ОбработатьСерверноеОповещениеНаКлиенте(СостояниеПолучения, Данные);
Если Не Данные.ОтправленоИзОчереди Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ДатаПоследнегоОповещения = Данные.Ошибки.Получить(СостояниеПолучения.ИдентификаторПользователяИБ);
Если ДатаПоследнегоОповещения = Неопределено Тогда
ДатаПоследнегоОповещения = Данные.Ошибки.Получить("ВсеПользователи");
Если ДатаПоследнегоОповещения = Неопределено Тогда
ДатаПоследнегоОповещения = Данные.ДатаДобавления;
СостояниеПолучения.ДатаОбновленияСостояния = ОбщегоНазначенияКлиент.ДатаСеанса();
КонецЕсли;
КонецЕсли;
Если СостояниеПолучения.ДатаПоследнегоОповещения < ДатаПоследнегоОповещения Тогда
СостояниеПолучения.ДатаПоследнегоОповещения = ДатаПоследнегоОповещения;
КонецЕсли;
КонецПроцедуры
Функция ОповещениеУжеПолучено(СостояниеПолучения, СерверноеОповещение)
Если СерверноеОповещение.ДатаДобавления < СостояниеПолучения.ДатаПоследнегоОповещения Тогда
Возврат Истина;
КонецЕсли;
ПолученныеОповещения = СостояниеПолучения.ПолученныеОповещения;
Если ПолученныеОповещения.Найти(СерверноеОповещение.ИдентификаторОповещения) <> Неопределено Тогда
Возврат Истина;
КонецЕсли;
ПолученныеОповещения.Добавить(СерверноеОповещение.ИдентификаторОповещения);
Если ПолученныеОповещения.Количество() > 100 Тогда
ПолученныеОповещения.Удалить(0);
КонецЕсли;
Возврат Ложь;
КонецФункции
#КонецОбласти
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f2dc9319-ba60-421a-8340-be3e3a291393"> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="98edbda8-2511-4743-b643-28934af0ed74">
<name>СоединенияИБГлобальный</name> <name>СерверныеОповещенияКлиент</name>
<synonym> <synonym>
<key>ru</key> <key>ru</key>
<value>Соединения ИБ глобальный</value> <value>Серверные оповещения клиент</value>
</synonym> </synonym>
<global>true</global>
<clientManagedApplication>true</clientManagedApplication> <clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule> </mdclass:CommonModule>
@@ -0,0 +1,18 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// См. СерверныеОповещения.НедоставленныеСерверныеОповещенияСеанса
Функция НедоставленныеСерверныеОповещенияСеанса(Параметры) Экспорт
Возврат СерверныеОповещения.НедоставленныеСерверныеОповещенияСеанса(Параметры);
КонецФункции
#КонецОбласти
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="db1f2fdc-6862-43c0-aefa-499f8c2b585c">
<name>СерверныеОповещенияСлужебныйВызовСервера</name>
<synonym>
<key>ru</key>
<value>Серверные оповещения служебный вызов сервера</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>
@@ -0,0 +1,31 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// Возвращаемое значение:
// Булево
//
Функция ЭтоСеансОтправкиСерверныхОповещенийКлиентам() Экспорт
Если ТекущийРежимЗапуска() <> Неопределено Тогда
Возврат Ложь;
КонецЕсли;
ТекущееФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ТекущееФоновоеЗадание = Неопределено
Или ТекущееФоновоеЗадание.ИмяМетода
<> Метаданные.РегламентныеЗадания.ОтправкаСерверныхОповещенийКлиентам.ИмяМетода Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
#КонецОбласти
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c9a0afb1-65fa-45ea-aabb-5ec080d9406e">
<name>СерверныеОповещенияСлужебныйПовтИсп</name>
<synonym>
<key>ru</key>
<value>Серверные оповещения служебный повт исп</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<returnValuesReuse>DuringSession</returnValuesReuse>
</mdclass:CommonModule>
@@ -1476,7 +1476,7 @@
Если ПриоритетныйСертификат <> Неопределено И ВходящийКонтекст.Сертификат = Неопределено Тогда Если ПриоритетныйСертификат <> Неопределено И ВходящийКонтекст.Сертификат = Неопределено Тогда
ВходящийКонтекст.Сертификат = Новый Структура("Отпечаток", ПриоритетныйСертификат.Отпечаток); ВходящийКонтекст.Сертификат = Новый Структура("Отпечаток", ПриоритетныйСертификат.Отпечаток);
КонецЕсли; КонецЕсли;
Если ПриоритетныйСертификат = Неопределено Тогда Если ПриоритетныйСертификат = Неопределено Тогда
ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь);
ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены"); ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены");
@@ -7558,7 +7558,7 @@
// Только для внутреннего использования. // Только для внутреннего использования.
Процедура ПослеЗакрытияФормы(РезультатВыбора, ПараметрыЦикла) Экспорт Процедура ПослеЗакрытияФормы(РезультатВыбора, ПараметрыЦикла) Экспорт
Если РезультатВыбора = Неопределено ИЛИ ТипЗнч(РезультатВыбора) <> Тип("Структура") Тогда Если РезультатВыбора = Неопределено Тогда
ЗавершениеРаботы = СвойствоСтруктуры(ПараметрыЦикла, "ЗавершениеРаботы", Ложь); ЗавершениеРаботы = СвойствоСтруктуры(ПараметрыЦикла, "ЗавершениеРаботы", Ложь);
Если ЗавершениеРаботы Тогда Если ЗавершениеРаботы Тогда
РезультатВыбора = ОтветСервисаПоУмолчанию(Ложь, "ЗавершениеРаботы"); РезультатВыбора = ОтветСервисаПоУмолчанию(Ложь, "ЗавершениеРаботы");
@@ -315,7 +315,6 @@
ВызватьИсключение; ВызватьИсключение;
КонецПопытки; КонецПопытки;
КонецПроцедуры КонецПроцедуры
// Получить информацию о блокировке сеансов области данных. // Получить информацию о блокировке сеансов области данных.
@@ -368,6 +367,13 @@
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
Функция ПодсистемаИспользуется() Экспорт
// См. также функцию СоединенияИБКлиент.ПодсистемаИспользуется
Возврат Не ОбщегоНазначения.РазделениеВключено();
КонецФункции
// Возвращает текстовую строку со списком активных соединений ИБ. // Возвращает текстовую строку со списком активных соединений ИБ.
// Названия соединений разделены символом переноса строки. // Названия соединений разделены символом переноса строки.
// //
@@ -474,6 +480,10 @@
// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. // См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ.
Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "СообщениеБлокировкиПриОбновленииКонфигурации"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "СообщениеБлокировкиПриОбновленииКонфигурации");
@@ -484,6 +494,10 @@
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске. // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске.
Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
ПараметрыБлокировки = ТекущиеПараметрыБлокировкиСоединений(); ПараметрыБлокировки = ТекущиеПараметрыБлокировкиСоединений();
Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансовРасширенные(Ложь, ПараметрыБлокировки))); Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансовРасширенные(Ложь, ПараметрыБлокировки)));
@@ -543,6 +557,10 @@
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента. // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента.
Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансов())); Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(ПараметрыБлокировкиСеансов()));
КонецПроцедуры КонецПроцедуры
@@ -559,6 +577,10 @@
// //
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер");
Если Не ПравоДоступа("АдминистрированиеДанных", Метаданные) Если Не ПравоДоступа("АдминистрированиеДанных", Метаданные)
Или МодульТекущиеДелаСервер.ДелоОтключено("БлокировкаСеансов") Тогда Или МодульТекущиеДелаСервер.ДелоОтключено("БлокировкаСеансов") Тогда
@@ -622,6 +644,46 @@
КонецПроцедуры КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений
Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
"СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов");
Оповещение.ИмяМодуляОтправки = "СоединенияИБ";
Оповещение.ИмяМодуляПолучения = "СоединенияИБКлиент";
Оповещение.ПериодПроверки = 60;
Оповещения.Вставить(Оповещение.Имя, Оповещение);
КонецПроцедуры
// См. СтандартныеПодсистемыСервер.ПриОтправкеСерверногоОповещения
Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт
ПараметрыБлокировкиСеансов = ПараметрыБлокировкиСеансов(Истина);
Если ПараметрыБлокировкиСеансов.Установлена Тогда
СерверныеОповещения.ОтправитьСерверноеОповещение(
"СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов",
ПараметрыБлокировкиСеансов, Неопределено);
КонецЕсли;
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере
Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт
ПараметрыБлокировкиСеансов = ПараметрыБлокировкиСеансов(Истина);
Если ПараметрыБлокировкиСеансов.Установлена Тогда
Результаты.Вставить("СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов",
ПараметрыБлокировкиСеансов);
КонецЕсли;
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
@@ -1,146 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// Выполнить завершение текущего сеанса, если установлена блокировка соединений
// с информационной базой.
//
Процедура КонтрольРежимаЗавершенияРаботыПользователей() Экспорт
// Получим текущее значение параметров блокировки.
ТекущийРежим = СоединенияИБВызовСервера.ПараметрыБлокировкиСеансов();
БлокировкаУстановлена = ТекущийРежим.Установлена;
Если Не БлокировкаУстановлена Тогда
Возврат;
КонецЕсли;
ВремяНачалаБлокировки = ТекущийРежим.Начало;
ВремяОкончанияБлокировки = ТекущийРежим.Конец;
// ИнтервалЗакрытьСЗапросом и ИнтервалПрекратить имеют отрицательное значение,
// поэтому, когда идет сравнение этих параметров с разницей (ВремяНачалаБлокировки - ТекущийМомент),
// то используется "<=", так как данная разница постоянно уменьшается.
ИнтервалПредупреждения = ТекущийРежим.ИнтервалОжиданияЗавершенияРаботыПользователей;
ИнтервалЗакрытьСЗапросом = ИнтервалПредупреждения / 3;
ИнтервалПрекратитьВМоделиСервиса = 60; // За минуту до начала блокировки.
ИнтервалПрекратить = 0; // В момент установки блокировки.
ТекущийМомент = ТекущийРежим.ТекущаяДатаСеанса;
Если ВремяОкончанияБлокировки <> '00010101' И ТекущийМомент > ВремяОкончанияБлокировки Тогда
Возврат;
КонецЕсли;
ДатаВремениНачалаБлокировки = Формат(ВремяНачалаБлокировки, "ДЛФ=DD");
ВремяВремениНачалаБлокировки = Формат(ВремяНачалаБлокировки, "ДЛФ=T");
ТекстСообщения = СоединенияИБКлиентСервер.ИзвлечьСообщениеБлокировки(ТекущийРежим.Сообщение);
Шаблон = НСтр("ru = 'Рекомендуется завершить текущую работу и сохранить все свои данные. Работа программы будет завершена %1 в %2.
|%3'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, ДатаВремениНачалаБлокировки, ВремяВремениНачалаБлокировки, ТекстСообщения);
РазделениеВключено = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено;
Если Не РазделениеВключено
И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратить) Тогда
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Ложь, ТекущийРежим.ПерезапуститьПриЗавершении);
ИначеЕсли РазделениеВключено
И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратитьВМоделиСервиса) Тогда
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Ложь, Ложь);
ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалЗакрытьСЗапросом Тогда
СоединенияИБКлиент.ЗадатьВопросПриЗавершенииРаботы(ТекстСообщения);
ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалПредупреждения Тогда
СоединенияИБКлиент.ПоказатьПредупреждениеПриЗавершенииРаботы(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
// Выполнить завершение активных сеансов, если превышено время ожидания, а затем
// завершить текущий сеанс.
//
Процедура ЗавершитьРаботуПользователей() Экспорт
// Получим текущее значение параметров блокировки.
ТекущийРежим = СоединенияИБВызовСервера.ПараметрыБлокировкиСеансов(Истина);
ВремяНачалаБлокировки = ТекущийРежим.Начало;
ТекущийМомент = ТекущийРежим.ТекущаяДатаСеанса;
Если ТекущийМомент < ВремяНачалаБлокировки Тогда
ТекстСообщения = НСтр("ru = 'Блокировка работы пользователей запланирована на %1.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ВремяНачалаБлокировки);
ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
"e1cib/app/Обработка.БлокировкаРаботыПользователей",
ТекстСообщения, БиблиотекаКартинок.Информация32);
Возврат;
КонецЕсли;
КоличествоСеансов = ТекущийРежим.КоличествоСеансов;
Если КоличествоСеансов <= 1 Тогда
// Отключены все пользователи, кроме текущего сеанса.
// В последнюю очередь предлагаем завершить сеанс, запущенный с параметром "ЗавершитьРаботуПользователей".
// Такой порядок отключений необходим для обновления конфигурации с помощью пакетного файла.
СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь);
Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус, КоличествоСеансов", "Готово", КоличествоСеансов));
СоединенияИБКлиент.ЗавершитьРаботуЭтогоСеанса();
Возврат;
КонецЕсли;
БлокировкаУстановлена = ТекущийРежим.Установлена;
Если Не БлокировкаУстановлена Тогда
Возврат;
КонецЕсли;
// Если информационная база файловая, то часть соединений не может быть завершена принудительно.
Если СтандартныеПодсистемыКлиент.ПараметрКлиента("ИнформационнаяБазаФайловая") Тогда
Возврат;
КонецЕсли;
// После начала блокировки сеансы всех пользователей должны быть отключены
// если этого не произошло пробуем принудительно прервать соединения.
ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей");
Попытка
ПараметрыАдминистрирования = СоединенияИБКлиент.СохраненныеПараметрыАдминистрирования();
Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Тогда
СоединенияИБВызовСервера.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования);
Иначе
СоединенияИБКлиентСервер.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования);
КонецЕсли;
СоединенияИБКлиент.СохранитьПараметрыАдминистрирования(Неопределено);
Исключение
СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь);
ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
"e1cib/app/Обработка.БлокировкаРаботыПользователей",
НСтр("ru = 'Завершение сеансов не выполнено. Подробности см. в Журнале регистрации.'"), БиблиотекаКартинок.Предупреждение32);
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СоединенияИБКлиент.СобытиеЖурналаРегистрации(),
"Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина);
Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус,КоличествоСеансов", "Ошибка", КоличествоСеансов));
Возврат;
КонецПопытки;
СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь);
ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
"e1cib/app/Обработка.БлокировкаРаботыПользователей",
НСтр("ru = 'Завершение сеансов выполнено успешно'"), БиблиотекаКартинок.Информация32);
Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус,КоличествоСеансов", "Готово", КоличествоСеансов));
СоединенияИБКлиент.ЗавершитьРаботуЭтогоСеанса();
КонецПроцедуры
#КонецОбласти
@@ -48,19 +48,11 @@
Процедура УстановитьРежимЗавершенияРаботыПользователей(Знач ЗавершитьРаботу) Экспорт Процедура УстановитьРежимЗавершенияРаботыПользователей(Знач ЗавершитьРаботу) Экспорт
УстановитьПризнакРаботаПользователейЗавершается(ЗавершитьРаботу); УстановитьПризнакРаботаПользователейЗавершается(ЗавершитьРаботу);
УстановитьКонтрольЗавершенияРаботыПользователей(Не ЗавершитьРаботу);
Если ЗавершитьРаботу Тогда Если ЗавершитьРаботу Тогда
// Поскольку блокировка еще не установлена, то при входе в систему ТекущийРежим = СоединенияИБВызовСервера.ПараметрыБлокировкиСеансов(Истина);
// для данного пользователя был подключен обработчик ожидания завершения работы. ЗавершитьРаботуПользователей(ТекущийРежим);
// Отключаем его. Так как для этого пользователя подключается специализированный обработчик ожидания
// "ЗавершитьРаботуПользователей", который ориентирован на то, что данный пользователь
// должен быть отключен последним.
ОтключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей");
ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60);
ЗавершитьРаботуПользователей();
Иначе
ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей");
ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60);
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -86,29 +78,6 @@
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
// Завершает работу (последнего) сеанса администратора, который инициировал завершение работы пользователей.
//
Процедура ЗавершитьРаботуЭтогоСеанса(ВыводитьВопрос = Истина) Экспорт
УстановитьПризнакРаботаПользователейЗавершается(Ложь);
ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей");
Если ЗавершитьВсеСеансыКромеТекущего() Тогда
Возврат;
КонецЕсли;
Если Не ВыводитьВопрос Тогда
ЗавершитьРаботуСистемы(Ложь);
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ЗавершитьРаботуЭтогоСеансаЗавершение", ЭтотОбъект);
ТекстСообщения = НСтр("ru = 'Работа пользователей с программой запрещена. Завершить работу этого сеанса?'");
Заголовок = НСтр("ru = 'Завершение работы текущего сеанса'");
ПоказатьВопрос(Оповещение, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да, Заголовок, КодВозвратаДиалога.Да);
КонецПроцедуры
// Устанавливает значение переменной РаботаПользователейЗавершается в значение Значение. // Устанавливает значение переменной РаботаПользователейЗавершается в значение Значение.
// //
// Параметры: // Параметры:
@@ -138,6 +107,10 @@
// //
Процедура ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ) Экспорт Процедура ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ) Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
Отказ = Отказ Или ОбработатьПараметрыЗапуска(ПараметрыЗапуска); Отказ = Отказ Или ОбработатьПараметрыЗапуска(ПараметрыЗапуска);
КонецПроцедуры КонецПроцедуры
@@ -159,6 +132,10 @@
// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. // См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы.
Процедура ПослеНачалаРаботыСистемы() Экспорт Процедура ПослеНачалаРаботыСистемы() Экспорт
Если Не ПодсистемаИспользуется() Тогда
Возврат;
КонецЕсли;
ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда
Возврат; Возврат;
@@ -182,7 +159,7 @@
Возврат; Возврат;
КонецЕсли; КонецЕсли;
ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); УстановитьКонтрольЗавершенияРаботыПользователей(Истина);
КонецПроцедуры КонецПроцедуры
@@ -241,10 +218,248 @@
КонецПроцедуры КонецПроцедуры
// См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения
Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт
Если РаботаПользователейЗавершается() Тогда
Если Не ПроцедураЗавершитьРаботуПользователейУжеВыполняется() Тогда
ЗавершитьРаботуПользователей(Результат);
КонецЕсли;
ИначеЕсли ВключенКонтрольЗавершенияРаботыПользователей() Тогда
КонтрольРежимаЗавершенияРаботыПользователей(Результат);
КонецЕсли;
КонецПроцедуры
// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеПериодическогоПолученияДанныхКлиентаНаСервере
Процедура ПослеПериодическогоПолученияДанныхКлиентаНаСервере(Результаты) Экспорт
ИмяПараметра = "СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов";
Результат = Результаты.Получить(ИмяПараметра);
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ПриПолученииСерверногоОповещения(ИмяПараметра, Результат);
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Функция ПодсистемаИспользуется()
// См. также функцию СоединенияИБ.ПодсистемаИспользуется
Возврат Не СтандартныеПодсистемыКлиент.ПараметрКлиента("РазделениеВключено");
КонецФункции
Процедура УстановитьКонтрольЗавершенияРаботыПользователей(Значение = Истина)
ИмяПараметра = "СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей";
Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура);
КонецЕсли;
ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"].Вставить("ВыполнятьКонтрольЗавершенияРаботыПользователей", Значение);
КонецПроцедуры
Функция ВключенКонтрольЗавершенияРаботыПользователей()
ПараметрыЗавершенияРаботыПользователей = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"];
Возврат ТипЗнч(ПараметрыЗавершенияРаботыПользователей) = Тип("Структура")
И ПараметрыЗавершенияРаботыПользователей.Свойство("ВыполнятьКонтрольЗавершенияРаботыПользователей")
И ПараметрыЗавершенияРаботыПользователей.ВыполнятьКонтрольЗавершенияРаботыПользователей;
КонецФункции
Процедура УстановитьПроцедураЗавершитьРаботуПользователейУжеВыполняется(Значение = Истина)
ИмяПараметра = "СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей";
Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура);
КонецЕсли;
ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"].Вставить("ПроцедураЗавершитьРаботуПользователейУжеВыполняется", Значение);
КонецПроцедуры
Функция ПроцедураЗавершитьРаботуПользователейУжеВыполняется()
ПараметрыЗавершенияРаботыПользователей = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"];
Возврат ТипЗнч(ПараметрыЗавершенияРаботыПользователей) = Тип("Структура")
И ПараметрыЗавершенияРаботыПользователей.Свойство("ПроцедураЗавершитьРаботуПользователейУжеВыполняется")
И ПараметрыЗавершенияРаботыПользователей.ПроцедураЗавершитьРаботуПользователейУжеВыполняется;
КонецФункции
// Выполнить завершение текущего сеанса, если установлена блокировка соединений
// с информационной базой.
//
Процедура КонтрольРежимаЗавершенияРаботыПользователей(ТекущийРежим)
БлокировкаУстановлена = ТекущийРежим.Установлена;
Если Не БлокировкаУстановлена Тогда
Возврат;
КонецЕсли;
ВремяНачалаБлокировки = ТекущийРежим.Начало;
ВремяОкончанияБлокировки = ТекущийРежим.Конец;
// ИнтервалЗакрытьСЗапросом и ИнтервалПрекратить имеют отрицательное значение,
// поэтому, когда идет сравнение этих параметров с разницей (ВремяНачалаБлокировки - ТекущийМомент),
// то используется "<=", так как данная разница постоянно уменьшается.
ИнтервалПредупреждения = ТекущийРежим.ИнтервалОжиданияЗавершенияРаботыПользователей;
ИнтервалЗакрытьСЗапросом = ИнтервалПредупреждения / 3;
ИнтервалПрекратитьВМоделиСервиса = 60; // За минуту до начала блокировки.
ИнтервалПрекратить = 0; // В момент установки блокировки.
ТекущийМомент = ТекущийРежим.ТекущаяДатаСеанса;
Если ВремяОкончанияБлокировки <> '00010101' И ТекущийМомент > ВремяОкончанияБлокировки Тогда
Возврат;
КонецЕсли;
ДатаВремениНачалаБлокировки = Формат(ВремяНачалаБлокировки, "ДЛФ=DD");
ВремяВремениНачалаБлокировки = Формат(ВремяНачалаБлокировки, "ДЛФ=T");
ТекстСообщения = СоединенияИБКлиентСервер.ИзвлечьСообщениеБлокировки(ТекущийРежим.Сообщение);
Шаблон = НСтр("ru = 'Рекомендуется завершить текущую работу и сохранить все свои данные. Работа программы будет завершена %1 в %2.
|%3'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, ДатаВремениНачалаБлокировки, ВремяВремениНачалаБлокировки, ТекстСообщения);
РазделениеВключено = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено;
Если Не РазделениеВключено
И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратить) Тогда
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Ложь, ТекущийРежим.ПерезапуститьПриЗавершении);
ИначеЕсли РазделениеВключено
И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратитьВМоделиСервиса) Тогда
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Ложь, Ложь);
ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалЗакрытьСЗапросом Тогда
ЗадатьВопросПриЗавершенииРаботы(ТекстСообщения, ВремяНачалаБлокировки);
ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалПредупреждения Тогда
ПоказатьПредупреждениеПриЗавершенииРаботы(ТекстСообщения, ВремяНачалаБлокировки);
КонецЕсли;
КонецПроцедуры
// Выполнить завершение активных сеансов, если превышено время ожидания, а затем
// завершить текущий сеанс.
//
Процедура ЗавершитьРаботуПользователей(ТекущийРежим)
ВремяНачалаБлокировки = ТекущийРежим.Начало;
ТекущийМомент = ТекущийРежим.ТекущаяДатаСеанса;
КоличествоСеансов = ТекущийРежим.КоличествоСеансов;
Если ТекущийМомент < ВремяНачалаБлокировки Тогда
ТекстСообщения = НСтр("ru = 'Блокировка работы пользователей запланирована на %1.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ВремяНачалаБлокировки);
ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
"e1cib/app/Обработка.БлокировкаРаботыПользователей",
ТекстСообщения, БиблиотекаКартинок.Информация32);
Оповестить("ЗавершениеРаботыПользователей",
Новый Структура("Статус, КоличествоСеансов", "Обновление", КоличествоСеансов));
Возврат;
КонецЕсли;
Если КоличествоСеансов <= 1 Тогда
// Отключены все пользователи, кроме текущего сеанса.
// В последнюю очередь предлагаем завершить сеанс, запущенный с параметром "ЗавершитьРаботуПользователей".
// Такой порядок отключений необходим для обновления конфигурации с помощью пакетного файла.
УстановитьПризнакРаботаПользователейЗавершается(Ложь);
Оповестить("ЗавершениеРаботыПользователей",
Новый Структура("Статус, КоличествоСеансов", "Готово", КоличествоСеансов));
ЗавершитьРаботуЭтогоСеанса();
Возврат;
КонецЕсли;
БлокировкаУстановлена = ТекущийРежим.Установлена;
Если Не БлокировкаУстановлена Тогда
Возврат;
КонецЕсли;
// Если информационная база файловая, то часть соединений не может быть завершена принудительно.
Если СтандартныеПодсистемыКлиент.ПараметрКлиента("ИнформационнаяБазаФайловая") Тогда
Оповестить("ЗавершениеРаботыПользователей",
Новый Структура("Статус, КоличествоСеансов", "Обновление", КоличествоСеансов));
Возврат;
КонецЕсли;
// После начала блокировки сеансы всех пользователей должны быть отключены
// если этого не произошло пробуем принудительно прервать соединения.
Попытка
ПараметрыАдминистрирования = СохраненныеПараметрыАдминистрирования();
Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Тогда
СоединенияИБВызовСервера.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования);
Иначе
СоединенияИБКлиентСервер.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования);
КонецЕсли;
СохранитьПараметрыАдминистрирования(Неопределено);
Исключение
УстановитьПризнакРаботаПользователейЗавершается(Ложь);
ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
"e1cib/app/Обработка.БлокировкаРаботыПользователей",
НСтр("ru = 'Завершение сеансов не выполнено. Подробности см. в Журнале регистрации.'"),
БиблиотекаКартинок.Предупреждение32);
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),
"Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина);
Оповестить("ЗавершениеРаботыПользователей",
Новый Структура("Статус,КоличествоСеансов", "Ошибка", КоличествоСеансов));
Возврат;
КонецПопытки;
УстановитьПризнакРаботаПользователейЗавершается(Ложь);
ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
"e1cib/app/Обработка.БлокировкаРаботыПользователей",
НСтр("ru = 'Завершение сеансов выполнено успешно'"),
БиблиотекаКартинок.Информация32);
Оповестить("ЗавершениеРаботыПользователей",
Новый Структура("Статус,КоличествоСеансов", "Готово", КоличествоСеансов));
ЗавершитьРаботуЭтогоСеанса();
КонецПроцедуры
// Завершает работу (последнего) сеанса администратора, который инициировал завершение работы пользователей.
//
Процедура ЗавершитьРаботуЭтогоСеанса(ВыводитьВопрос = Истина)
УстановитьПризнакРаботаПользователейЗавершается(Ложь);
Если ЗавершитьВсеСеансыКромеТекущего() Тогда
Возврат;
КонецЕсли;
Если Не ВыводитьВопрос Тогда
ЗавершитьРаботуСистемы(Ложь);
Возврат;
КонецЕсли;
УстановитьПроцедураЗавершитьРаботуПользователейУжеВыполняется(Истина);
Оповещение = Новый ОписаниеОповещения("ЗавершитьРаботуЭтогоСеансаЗавершение", ЭтотОбъект);
ТекстСообщения = НСтр("ru = 'Работа пользователей с программой запрещена. Завершить работу этого сеанса?'");
Заголовок = НСтр("ru = 'Завершение работы текущего сеанса'");
ПоказатьВопрос(Оповещение, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да, Заголовок, КодВозвратаДиалога.Да);
КонецПроцедуры
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистемы БазоваяФункциональность. // Обработчики событий подсистемы БазоваяФункциональность.
@@ -268,7 +483,7 @@
КонецФункции КонецФункции
Функция СохраненныеПараметрыАдминистрирования() Экспорт Функция СохраненныеПараметрыАдминистрирования()
ПараметрыЗавершенияРаботыПользователей = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"]; ПараметрыЗавершенияРаботыПользователей = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"];
ПараметрыАдминистрирования = Неопределено; ПараметрыАдминистрирования = Неопределено;
@@ -362,26 +577,66 @@
КонецПроцедуры КонецПроцедуры
Процедура ПоказатьПредупреждениеПриЗавершенииРаботы(ТекстСообщения) Экспорт Процедура ПоказатьПредупреждениеПриЗавершенииРаботы(ТекстСообщения, ВремяНачалаБлокировки)
ИмяПараметра = "СтандартныеПодсистемы.ПоказаноПредупреждениеПередЗавершениемРаботы"; ПараметрыИнформирования = ПараметрыИнформирования(ВремяНачалаБлокировки);
Если ПараметрыПриложения[ИмяПараметра] <> Истина Тогда Если Не ПараметрыИнформирования.ОповещениеПоказано Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Работа программы будет завершена'"),, ТекстСообщения,, ПоказатьОповещениеПользователя(НСтр("ru = 'Работа программы будет завершена'"),, ТекстСообщения,,
СтатусОповещенияПользователя.Важное); СтатусОповещенияПользователя.Важное);
ПараметрыПриложения.Вставить(ИмяПараметра, Истина); КонецЕсли;
КонецЕсли;
Если Не ПараметрыИнформирования.ПоказатьПредупреждениеИлиВопрос Тогда
Возврат;
КонецЕсли;
ПоказатьПредупреждение(, ТекстСообщения, 30); ПоказатьПредупреждение(, ТекстСообщения, 30);
КонецПроцедуры КонецПроцедуры
Процедура ЗадатьВопросПриЗавершенииРаботы(ТекстСообщения) Экспорт // Возвращаемое значение:
// Структура:
// * ОповещениеПоказано - Булево
// * ПоказатьПредупреждениеИлиВопрос - Булево
//
Функция ПараметрыИнформирования(ВремяНачалаБлокировки)
ИмяПараметра = "СтандартныеПодсистемы.ПоказаноПредупреждениеПередЗавершениемРаботы"; ИмяПараметра = "СтандартныеПодсистемы.ПоказаноПредупреждениеПередЗавершениемРаботы";
Если ПараметрыПриложения[ИмяПараметра] <> Истина Тогда Свойства = ПараметрыПриложения[ИмяПараметра];
ПоказатьОповещениеПользователя(НСтр("ru = 'Работа программы будет завершена'"),, ТекстСообщения,, СтатусОповещенияПользователя.Важное); Если Свойства = Неопределено Или Свойства.ВремяНачалаБлокировки <> ВремяНачалаБлокировки Тогда
ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПоказаноПредупреждениеПередЗавершениемРаботы", Истина); Свойства = Новый Структура;
КонецЕсли; Свойства.Вставить("ОповещениеПоказано", Ложь);
Свойства.Вставить("ПоказатьПредупреждениеИлиВопрос", Ложь);
Свойства.Вставить("ДатаПоследнегоПредупрежденияИлиВопроса", '00010101');
Свойства.Вставить("ВремяНачалаБлокировки", ВремяНачалаБлокировки);
ПараметрыПриложения.Вставить(ИмяПараметра, Свойства);
Иначе
Свойства.ОповещениеПоказано = Истина;
КонецЕсли;
ДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
Если Свойства.ДатаПоследнегоПредупрежденияИлиВопроса + 50 < ДатаСеанса Тогда
Свойства.ДатаПоследнегоПредупрежденияИлиВопроса = ДатаСеанса;
Свойства.ПоказатьПредупреждениеИлиВопрос = Истина;
Иначе
Свойства.ПоказатьПредупреждениеИлиВопрос = Ложь;
КонецЕсли;
Возврат Свойства;
КонецФункции
Процедура ЗадатьВопросПриЗавершенииРаботы(ТекстСообщения, ВремяНачалаБлокировки)
ПараметрыИнформирования = ПараметрыИнформирования(ВремяНачалаБлокировки);
Если Не ПараметрыИнформирования.ОповещениеПоказано Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Работа программы будет завершена'"),, ТекстСообщения,,
СтатусОповещенияПользователя.Важное);
КонецЕсли;
Если Не ПараметрыИнформирования.ПоказатьПредупреждениеИлиВопрос Тогда
Возврат;
КонецЕсли;
ТекстВопроса = НСтр("ru = '%1 ТекстВопроса = НСтр("ru = '%1
|Завершить работу?'"); |Завершить работу?'");
ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ТекстСообщения); ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ТекстСообщения);
@@ -406,6 +661,8 @@
ЗавершитьРаботуСистемы(Ложь); ЗавершитьРаботуСистемы(Ложь);
КонецЕсли; КонецЕсли;
УстановитьПроцедураЗавершитьРаботуПользователейУжеВыполняется(Ложь);
КонецПроцедуры КонецПроцедуры
// Обработать параметры запуска, связанные с завершением и разрешением соединений ИБ. // Обработать параметры запуска, связанные с завершением и разрешением соединений ИБ.
@@ -470,8 +727,8 @@
ПараметрыЗапускаУточненные = ПараметрыЗапускаУточненные(ПараметрыЗапуска, ДополнительныеПараметры); ПараметрыЗапускаУточненные = ПараметрыЗапускаУточненные(ПараметрыЗапуска, ДополнительныеПараметры);
ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапускаУточненные); ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапускаУточненные);
ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); ТекущийРежим = СоединенияИБВызовСервера.ПараметрыБлокировкиСеансов(Истина);
ЗавершитьРаботуПользователей(); ЗавершитьРаботуПользователей(ТекущийРежим);
Возврат Ложь; Возврат Ложь;
КонецЕсли; КонецЕсли;
@@ -220,57 +220,6 @@
КонецПроцедуры КонецПроцедуры
// Вызывается из обработчика ожидания каждые 20 минут, например, для контроля
// динамического обновления и окончания срока действия учетной записи пользователя.
//
// Параметры:
// Параметры - Структура - в структуру следует вставить свойства для дальнейшего анализа на клиенте.
//
Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт
КонфигурацияБазыДанныхИзмененаДинамически = КонфигурацияБазыДанныхИзмененаДинамически();
Параметры.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", КонфигурацияБазыДанныхИзмененаДинамически
Или Справочники.ВерсииРасширений.РасширенияИзмененыДинамически());
ДинамическиеИзменения = Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения();
МожноОповещать = Истина;
Если ДинамическиеИзменения.Исправления <> Неопределено
И ДинамическиеИзменения.Расширения = Неопределено
И Не КонфигурацияБазыДанныхИзмененаДинамически Тогда
// Изменился только состав исправлений, необходимо проверить возможность отображения оповещения.
Если ДинамическиеИзменения.Исправления.Добавлено <> 0
И ДинамическиеИзменения.Исправления.Удалено = 0 Тогда
РасписаниеОповещения = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить("КонтрольДинамическогоОбновления", "РасписаниеПроверкиПатчей");
Если ТипЗнч(РасписаниеОповещения) = Тип("Структура")
И РасписаниеОповещения.Свойство("Расписание")
И ТипЗнч(РасписаниеОповещения.Расписание) = Тип("РасписаниеРегламентногоЗадания") Тогда
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
МожноОповещать = РасписаниеОповещения.Расписание.ТребуетсяВыполнение(ТекущаяДатаСеанса, РасписаниеОповещения.ПоследнееОповещение);
Если МожноОповещать Тогда
РасписаниеОповещения.ПоследнееОповещение = ТекущаяДатаСеанса;
ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить("КонтрольДинамическогоОбновления", "РасписаниеПроверкиПатчей", РасписаниеОповещения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ДинамическиеИзменения.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", КонфигурацияБазыДанныхИзмененаДинамически);
СообщениеПользователю = СтандартныеПодсистемыСервер.ТекстСообщенияПриДинамическомОбновлении(ДинамическиеИзменения);
ОповещатьПользователя = СтандартныеПодсистемыСервер.ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы();
ДинамическиеИзменения.Вставить("СообщениеПользователю", СообщениеПользователю);
ДинамическиеИзменения.Вставить("ОповещатьПользователя", ОповещатьПользователя И МожноОповещать);
Параметры.Вставить("ДинамическиеИзмененияКонфигурации", ДинамическиеИзменения);
ПользователиСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный");
МодульЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры.ЦентрМониторинга);
КонецЕсли;
КонецПроцедуры
// Возвращает полное имя объекта метаданных по его типу. // Возвращает полное имя объекта метаданных по его типу.
Функция ПолноеИмяОбъектаМетаданных(Тип) Экспорт Функция ПолноеИмяОбъектаМетаданных(Тип) Экспорт
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
@@ -8,15 +8,6 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
// Вызывается каждые 20 минут, например, для контроля динамического обновления и
// окончания срока действия учетной записи пользователя.
//
Процедура ОбработчикОжиданияСтандартныхПериодическихПроверок() Экспорт
СтандартныеПодсистемыКлиент.ПриВыполненииСтандартныхПериодическихПроверок();
КонецПроцедуры
// Продолжает запуск в режиме интерактивного взаимодействия с пользователем. // Продолжает запуск в режиме интерактивного взаимодействия с пользователем.
Процедура ОбработчикОжиданияНачатьИнтерактивнуюОбработкуПередНачаломРаботыСистемы() Экспорт Процедура ОбработчикОжиданияНачатьИнтерактивнуюОбработкуПередНачаломРаботыСистемы() Экспорт
@@ -529,6 +529,41 @@
КонецФункции КонецФункции
#Область ДляВызоваИзДругихПодсистем
// Вызывается при получении оповещений от сервера.
// Оповещения отправляются на сервере в процедурах ПриОтправкеСерверногоОповещения.
// Список оповещений смотри в ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений.
//
// Параметры:
// ИмяОповещения - см. СерверныеОповещения.ОтправитьСерверноеОповещение.ИмяОповещения
// Результат - см. СерверныеОповещения.ОтправитьСерверноеОповещение.Результат
//
// Пример:
// Если ИмяОповещения <> "СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов" Тогда
// Возврат;
// КонецЕсли;
// Если РаботаПользователейЗавершается() Тогда
// ЗавершитьРаботуПользователей(Результат);
// ИначеЕсли ВключенКонтрольЗавершенияРаботыПользователей() Тогда
// КонтрольРежимаЗавершенияРаботыПользователей(Результат);
// КонецЕсли;
//
Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт
Если ИмяОповещения = "СтандартныеПодсистемы.БазоваяФункциональность.ИзмененаКонфигурацияИлиРасширения" Тогда
ПоказатьОповещениеПользователя(
НСтр("ru = 'Установлено обновление программы'"),
"e1cib/app/ОбщаяФорма.КонтрольДинамическогоОбновления",
Результат, БиблиотекаКартинок.Предупреждение32,
СтатусОповещенияПользователя.Важное,
"УстановленоОбновлениеПрограммы");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти #КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
@@ -1867,8 +1902,6 @@
ПодключитьОбработчикОжидания("ПоказатьРекомендациюПоОбъемуОперативнойПамяти", 10, Истина); ПодключитьОбработчикОжидания("ПоказатьРекомендациюПоОбъемуОперативнойПамяти", 10, Истина);
КонецЕсли; КонецЕсли;
ПодключитьОбработчикОжиданияСтандартныхПериодическихПроверок();
Если ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Ложь) Тогда Если ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Ложь) Тогда
// Предварительная компиляция клиентских модулей для избежания неявных серверных вызовов // Предварительная компиляция клиентских модулей для избежания неявных серверных вызовов
// в обработчике ПередЗавершениемРаботыСистемы. // в обработчике ПередЗавершениемРаботыСистемы.
@@ -1877,78 +1910,6 @@
КонецПроцедуры КонецПроцедуры
// Вызывается из обработчика ожидания каждые 20 минут, например, для контроля
// динамического обновления и окончания срока действия учетной записи пользователя.
//
Процедура ПриВыполненииСтандартныхПериодическихПроверок() Экспорт
Параметры = Новый Структура;
ПодсистемаЦентрМониторингаСуществует = Ложь;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
ПодсистемаЦентрМониторингаСуществует = Истина;
МодульЦентрМониторингаКлиентСлужебный = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиентСлужебный");
МодульЦентрМониторингаКлиентСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаКлиенте(Параметры);
КонецЕсли;
СтандартныеПодсистемыВызовСервера.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры);
Если ПодсистемаЦентрМониторингаСуществует Тогда
МодульЦентрМониторингаКлиентСлужебный.ПослеВыполненияСтандартныхПериодическихПроверокНаКлиенте(Параметры);
КонецЕсли;
Контекст = Новый Структура("Параметры", Параметры);
ОбработкаПродолжения = Новый ОписаниеОповещения(
"ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователи", ЭтотОбъект, Контекст);
Если Не Параметры.ДинамическиеИзмененияКонфигурации.ОповещатьПользователя
Или Не Параметры.КонфигурацияБазыДанныхИзмененаДинамически Тогда
ВыполнитьОбработкуОповещения(ОбработкаПродолжения);
Возврат;
КонецЕсли;
ИмяПараметра = "СтандартныеПодсистемы.ПриВыполненииСтандартныхПериодическихПроверок";
Если ПараметрыПриложения[ИмяПараметра] <> Неопределено Тогда
ДатаСохраненная = ПараметрыПриложения[ИмяПараметра];
ДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
Если ТипЗнч(ДатаСохраненная) = Тип("Дата") И ДеньГода(ДатаСохраненная) = ДеньГода(ДатаСеанса) Тогда
Возврат;
КонецЕсли;
КонецЕсли;
СообщениеПользователю = СтрЗаменить(Параметры.ДинамическиеИзмененияКонфигурации.СообщениеПользователю, "Ссылка", "");
ПоказатьОповещениеПользователя(НСтр("ru = 'Установлено обновление программы'"), "e1cib/app/ОбщаяФорма.КонтрольДинамическогоОбновления",
СообщениеПользователю, БиблиотекаКартинок.Предупреждение32, СтатусОповещенияПользователя.Важное,
"УстановленоОбновлениеПрограммы");
ВыполнитьОбработкуОповещения(ОбработкаПродолжения);
КонецПроцедуры
// Продолжение процедуры ПриВыполненииСтандартныхПериодическихПроверок.
//
// Параметры:
// Результат - Произвольный
// Контекст - Структура
//
Процедура ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователи(Результат, Контекст) Экспорт
ОбработкаПродолжения = Новый ОписаниеОповещения(
"ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователиЗавершение", ЭтотОбъект, Контекст);
ПользователиСлужебныйКлиент.ПриВыполненииСтандартныхПериодическихПроверок(
Контекст.Параметры, ОбработкаПродолжения);
КонецПроцедуры
// Продолжение процедуры ПриВыполненииСтандартныхПериодическихПроверок.
Процедура ПриВыполненииСтандартныхПериодическихПроверокПодсистемаПользователиЗавершение(Результат, Контекст) Экспорт
ПодключитьОбработчикОжиданияСтандартныхПериодическихПроверок();
КонецПроцедуры
Функция ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Отказ) Функция ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Отказ)
Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда
@@ -2247,13 +2208,6 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции. // Вспомогательные процедуры и функции.
Процедура ПодключитьОбработчикОжиданияСтандартныхПериодическихПроверок()
// Вызов стандартных периодических проверок 1 раз в 20 минут.
ПодключитьОбработчикОжидания("ОбработчикОжиданияСтандартныхПериодическихПроверок", 20 * 60, Истина);
КонецПроцедуры
Процедура ВойтиВОбластьДанных() Процедура ВойтиВОбластьДанных()
Если ПустаяСтрока(ПараметрЗапуска) Тогда Если ПустаяСтрока(ПараметрЗапуска) Тогда
@@ -593,8 +593,14 @@
КонецФункции КонецФункции
Функция ЭтоФоновоеЗадание() Экспорт Функция ЭтоСеансДлительнойОперации() Экспорт
Возврат ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание() <> Неопределено;
УстановитьПривилегированныйРежим(Истина);
КлючСеансаРодителя = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("КлючСеансаРодителя");
УстановитьПривилегированныйРежим(Ложь);
Возврат ЗначениеЗаполнено(КлючСеансаРодителя);
КонецФункции КонецФункции
Функция РазделениеВключено() Экспорт Функция РазделениеВключено() Экспорт
@@ -503,18 +503,46 @@
// //
Функция ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы() Экспорт Функция ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы() Экспорт
Результат = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( Возврат ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммыДляПользователя();
"ОбщиеНастройкиПользователя",
"ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы");
Если Результат = Неопределено Тогда
Результат = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции КонецФункции
#Область ДляВызоваИзДругихПодсистем
// Вызывается из регламентного задания для отправки серверного оповещения клиентским сеансам.
// Смотри также СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения.
//
// Вызов выполняется с учетом истечения периода, указанного для оповещения.
// Смотри ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений.
//
// Параметры:
// ИмяОповещения - Строка - смотри СерверныеОповещения.НовоеСерверноеОповещение.Имя
// ВариантыПараметров - Массив из Структура:
// * Параметры - Произвольный - смотри СерверныеОповещения.НовоеСерверноеОповещение.Параметры
// * Адресаты - Соответствие из КлючИЗначение:
// ** Ключ - УникальныйИдентификатор - идентификатор пользователя ИБ
// ** Значение - Массив из см. СерверныеОповещения.КлючСеанса
//
// Пример:
// Если ИмяОповещения <> "СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов" Тогда
// Возврат;
// КонецЕсли;
// ПараметрыБлокировкиСеансов = ПараметрыБлокировкиСеансов(Истина);
// Если ПараметрыБлокировкиСеансов.Установлена Тогда
// СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения,
// ПараметрыБлокировкиСеансов, Неопределено);
// КонецЕсли;
//
Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт
Если ИмяОповещения = "СтандартныеПодсистемы.БазоваяФункциональность.ИзмененаКонфигурацияИлиРасширения" Тогда
ПриОтправкеСерверногоОповещенияИзмененаКонфигурацияИлиРасширения(ИмяОповещения, ВариантыПараметров);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти #КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
@@ -1786,6 +1814,20 @@
КонецПроцедуры КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений
Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
"СтандартныеПодсистемы.БазоваяФункциональность.ИзмененаКонфигурацияИлиРасширения");
Оповещение.ИмяМодуляОтправки = "СтандартныеПодсистемыСервер";
Оповещение.ИмяМодуляПолучения = "СтандартныеПодсистемыКлиент";
Оповещение.Параметры = ПараметрыПроверкиОповещенияИзмененаКонфигурацияИлиРасширения();
Оповещения.Вставить(Оповещение.Имя, Оповещение);
КонецПроцедуры
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке.
Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт
@@ -1962,13 +2004,17 @@
// Формирует текст для вывода пользователю при необходимости динамического обновления. // Формирует текст для вывода пользователю при необходимости динамического обновления.
// //
// Параметры:
// ДинамическиеИзмененияКонфигурации - см. Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения
// УточняющаяСсылка - Строка
//
// Возвращаемое значение: // Возвращаемое значение:
// Строка // Строка
// //
Функция ТекстСообщенияПриДинамическомОбновлении(ДинамическиеИзмененияКонфигурации) Экспорт Функция ТекстСообщенияПриДинамическомОбновлении(ДинамическиеИзмененияКонфигурации, УточняющаяСсылка = "") Экспорт
Сообщения = Новый Массив; Сообщения = Новый Массив;
ДинамическиеИзмененияКонфигурации = ДинамическиеИзмененияКонфигурации;
Если ДинамическиеИзмененияКонфигурации.КонфигурацияБазыДанныхИзмененаДинамически Тогда Если ДинамическиеИзмененияКонфигурации.КонфигурацияБазыДанныхИзмененаДинамически Тогда
ТекстСообщенияКонфигурация = НСтр("ru = 'Версия программы обновлена (внесены изменения в конфигурацию информационной базы).'"); ТекстСообщенияКонфигурация = НСтр("ru = 'Версия программы обновлена (внесены изменения в конфигурацию информационной базы).'");
Сообщения.Добавить(ТекстСообщенияКонфигурация); Сообщения.Добавить(ТекстСообщенияКонфигурация);
@@ -1977,11 +2023,11 @@
Если ДинамическиеИзмененияКонфигурации.Исправления <> Неопределено Тогда Если ДинамическиеИзмененияКонфигурации.Исправления <> Неопределено Тогда
Если ДинамическиеИзмененияКонфигурации.Исправления.Добавлено > 0 Если ДинамическиеИзмененияКонфигурации.Исправления.Добавлено > 0
И ДинамическиеИзмененияКонфигурации.Исправления.Удалено > 0 Тогда И ДинамическиеИзмененияКонфигурации.Исправления.Удалено > 0 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Установлены новые исправления (патчи): %1, удалены: %2.'") + "Ссылка"; ТекстСообщенияПатчи = НСтр("ru = 'Установлены новые исправления (патчи): %1, удалены: %2.'") + УточняющаяСсылка;
ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Добавлено = 1 Тогда ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Добавлено = 1 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Установлено новое исправление (патч).'") + "Ссылка"; ТекстСообщенияПатчи = НСтр("ru = 'Установлено новое исправление (патч).'") + УточняющаяСсылка;
ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Добавлено > 0 Тогда ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Добавлено > 0 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Установлены новые исправления (патчи): %1.'") + "Ссылка"; ТекстСообщенияПатчи = НСтр("ru = 'Установлены новые исправления (патчи): %1.'") + УточняющаяСсылка;
ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Удалено > 0 Тогда ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Удалено > 0 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Удалены исправления (патчи): %2.'"); ТекстСообщенияПатчи = НСтр("ru = 'Удалены исправления (патчи): %2.'");
КонецЕсли; КонецЕсли;
@@ -2310,6 +2356,12 @@
КонецЕсли; КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("СерверныеОповещения") Тогда
СерверныеОповещения.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры);
КонецЕсли;
Если Не Параметры.РазделениеВключено Если Не Параметры.РазделениеВключено
И ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() И ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы()
И ОбновлениеИнформационнойБазыСлужебный.СтатусНевыполненныхОбработчиков(Истина) = "СтатусНеВыполнено" Тогда И ОбновлениеИнформационнойБазыСлужебный.СтатусНевыполненныхОбработчиков(Истина) = "СтатусНеВыполнено" Тогда
@@ -2536,6 +2588,27 @@
// АПК:487-вкл // АПК:487-вкл
КонецПроцедуры КонецПроцедуры
// Параметры:
// ИмяПользователя - Строка
//
// Возвращаемое значение:
// Булево
//
Функция ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммыДляПользователя(ИмяПользователя = Неопределено)
Результат = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"ОбщиеНастройкиПользователя",
"ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы",,,
ИмяПользователя);
Если Результат = Неопределено Тогда
Результат = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы. // Обновление информационной базы.
@@ -3091,9 +3164,6 @@
КонецПроцедуры КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Процедура ПередЗапускомПрограммы() Процедура ПередЗапускомПрограммы()
// Привилегированный режим (установлен платформой). // Привилегированный режим (установлен платформой).
@@ -3815,6 +3885,90 @@
КонецПроцедуры КонецПроцедуры
// Проверка и отправка серверных оповещений клиенту.
// Возвращаемое значение:
// Структура:
// * ВерсияКонфигурации - Строка
// * УстановленныеРасширенияПриЗапуске - см. Справочники.ВерсииРасширений.УстановленныеРасширенияПриЗапуске
//
Функция ПараметрыПроверкиОповещенияИзмененаКонфигурацияИлиРасширения()
Результат = Новый Структура;
Результат.Вставить("ВерсияКонфигурации", Метаданные.Версия);
Результат.Вставить("УстановленныеРасширенияПриЗапуске",
Справочники.ВерсииРасширений.УстановленныеРасширенияПриЗапуске());
Возврат Результат;
КонецФункции
// См. ПриОтправкеСерверногоОповещения
Процедура ПриОтправкеСерверногоОповещенияИзмененаКонфигурацияИлиРасширения(ИмяОповещения, ВариантыПараметров)
Для Каждого ВариантПараметров Из ВариантыПараметров Цикл
ВариантПараметров = ВариантПараметров; // Структура
КонфигурацияБазыДанныхИзмененаДинамически = ВариантПараметров.Параметры.ВерсияКонфигурации <> Метаданные.Версия;
ДинамическиеИзменения = Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения(
ВариантПараметров.Параметры.УстановленныеРасширенияПриЗапуске);
Если Не КонфигурацияБазыДанныхИзмененаДинамически
И Не ЗначениеЗаполнено(ДинамическиеИзменения.Расширения)
И Не ЗначениеЗаполнено(ДинамическиеИзменения.Исправления) Тогда
Продолжить;
КонецЕсли;
Адресаты = Новый Соответствие;
Для Каждого Адресат Из ВариантПараметров.Адресаты Цикл
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Адресат.Ключ);
Если ПользовательИБ = Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяПользователя = ПользовательИБ.Имя;
МожноОповещать = ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммыДляПользователя(ИмяПользователя);
Если Не МожноОповещать Тогда
Продолжить;
КонецЕсли;
ДатаНапомнитьЗавтра = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(
"КонтрольДинамическогоОбновления", "ДатаНапомнитьЗавтра",,, ИмяПользователя);
Если ТипЗнч(ДатаНапомнитьЗавтра) = Тип("Дата")
И ТекущаяДатаСеанса() < ДатаНапомнитьЗавтра Тогда
Продолжить;
КонецЕсли;
Если ДинамическиеИзменения.Исправления <> Неопределено
И ДинамическиеИзменения.Расширения = Неопределено
И Не КонфигурацияБазыДанныхИзмененаДинамически
// Изменился только состав исправлений, необходимо проверить возможность отображения оповещения.
И ДинамическиеИзменения.Исправления.Добавлено <> 0
И ДинамическиеИзменения.Исправления.Удалено = 0 Тогда
РасписаниеОповещения = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(
"КонтрольДинамическогоОбновления", "РасписаниеПроверкиПатчей",,, ИмяПользователя);
Если ТипЗнч(РасписаниеОповещения) = Тип("Структура")
И РасписаниеОповещения.Свойство("Расписание")
И ТипЗнч(РасписаниеОповещения.Расписание) = Тип("РасписаниеРегламентногоЗадания") Тогда
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
МожноОповещать = РасписаниеОповещения.Расписание.ТребуетсяВыполнение(ТекущаяДатаСеанса, РасписаниеОповещения.ПоследнееОповещение);
Если МожноОповещать Тогда
РасписаниеОповещения.ПоследнееОповещение = ТекущаяДатаСеанса;
ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить("КонтрольДинамическогоОбновления",
"РасписаниеПроверкиПатчей", РасписаниеОповещения,, ИмяПользователя);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не МожноОповещать Тогда
Продолжить;
КонецЕсли;
Адресаты.Вставить(Адресат.Ключ, Адресат.Значение);
КонецЦикла;
Если Не ЗначениеЗаполнено(Адресаты) Тогда
Продолжить;
КонецЕсли;
ДинамическиеИзменения.Вставить("КонфигурацияБазыДанныхИзмененаДинамически", КонфигурацияБазыДанныхИзмененаДинамически);
СообщениеПользователю = ТекстСообщенияПриДинамическомОбновлении(ДинамическиеИзменения);
СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения, СообщениеПользователю, Адресаты);
КонецЦикла;
КонецПроцедуры
// Многоязычные конфигурации // Многоязычные конфигурации
Функция ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Экспорт Функция ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Экспорт
@@ -89,28 +89,4 @@
КонецПроцедуры КонецПроцедуры
// Процедура-обработчик, которую можно вызывать в формах расшифровки текущих дел
// для переопределения параметров открытия формы и установки необходимых отборов списках формы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма, из которой был осуществлен вызов метода.
// Список - ДинамическийСписок - список, параметры которого можно переопределить.
//
Процедура ПриСозданииНаСервере(Форма, Список) Экспорт
КонецПроцедуры
// Процедура-обработчик, которую можно вызывать в соответствующем обработчике форм
// расшифровки текущих дел для замены сохраненных значений реквизитов формы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма, из которой был осуществлен вызов метода.
// Настройки - Соответствие из КлючЗначение - настройки формы, в которых находятся значения реквизитов:
// * Ключ - Строка
// * Значение - Произвольный
//
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Форма, Настройки) Экспорт
КонецПроцедуры
#КонецОбласти #КонецОбласти
@@ -614,7 +614,7 @@
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРолиПоТипуПользователя( НедоступныеРоли = ПользователиСлужебный.НедоступныеРолиПоТипуПользователя(
ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи")); ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи"));
// Проверка новых ролей. // Проверка новых ролей.
@@ -851,10 +851,27 @@
КонецЦикла; КонецЦикла;
// Получим нужные сообщения Попытка
Сообщения = Почта.Выбрать(Ложь, // Получим нужные сообщения
МассивИдентификаторовПорцииДляЗагрузки, Сообщения = Почта.Выбрать(Ложь,
?(ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP",Ложь, Истина)); // Массив из ИнтернетПочтовоеСообщение МассивИдентификаторовПорцииДляЗагрузки,
?(ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP",Ложь, Истина)); // Массив из ИнтернетПочтовоеСообщение
Исключение
ТекстОшибкиДляЖурналаРегистрации = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки(
ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка());
ТекстОшибкиДляЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Во время подключения к учетной записи %1 произошла ошибка
|%2'", ОбщегоНазначения.КодОсновногоЯзыка()),
ДанныеУчетнойЗаписи.Ссылка,
ТекстОшибкиДляЖурналаРегистрации);
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(),
УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибкиДляЖурналаРегистрации);
ТекстОшибки = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки(ИнформацияОбОшибке(), , Ложь);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
КоличествоНеАктуальныхСообщений = КоличествоНеАктуальныхСообщений + (КоличествоВПорции - Сообщения.Количество()); КоличествоНеАктуальныхСообщений = КоличествоНеАктуальныхСообщений + (КоличествоВПорции - Сообщения.Количество());
@@ -11,8 +11,8 @@
#Область ПрограммныйИнтерфейсБизнесСтатистики #Область ПрограммныйИнтерфейсБизнесСтатистики
// Записывает операцию бизнес статистики в кэш на клиенте. // Записывает операцию бизнес статистики в кэш на клиенте.
// Запись в информационную базу происходит по обработчику ОбработчикОжиданияСтандартныхПериодическихПроверок // Запись в информационную базу происходит в обработчике ПриПериодическомПолученииДанныхКлиентаНаСервере
// глобального модуля СтандартныеПодсистемыГлобальный. // общего модуля ОбщегоНазначенияПереопределяемый.
// При закрытии приложения данные не записываются. // При закрытии приложения данные не записываются.
// //
// Параметры: // Параметры:
@@ -34,8 +34,8 @@
// Записывает уникальную операцию бизнес статистики в разрезе часа в кэш на клиенте. // Записывает уникальную операцию бизнес статистики в разрезе часа в кэш на клиенте.
// При записи проверяет уникальность. // При записи проверяет уникальность.
// Запись в информационную базу происходит по обработчику ОбработчикОжиданияСтандартныхПериодическихПроверок // Запись в информационную базу происходит в обработчике ПриПериодическомПолученииДанныхКлиентаНаСервере
// глобального модуля СтандартныеПодсистемыГлобальный. // общего модуля ОбщегоНазначенияПереопределяемый.
// При закрытии приложения данные не записываются. // При закрытии приложения данные не записываются.
// //
// Параметры: // Параметры:
@@ -66,8 +66,8 @@
// Записывает уникальную операцию бизнес статистики в разрезе суток в кэш на клиенте. // Записывает уникальную операцию бизнес статистики в разрезе суток в кэш на клиенте.
// При записи проверяет уникальность. // При записи проверяет уникальность.
// Запись в информационную базу происходит по обработчику ОбработчикОжиданияСтандартныхПериодическихПроверок // Запись в информационную базу происходит в обработчике ПриПериодическомПолученииДанныхКлиентаНаСервере
// глобального модуля СтандартныеПодсистемыГлобальный. // общего модуля ОбщегоНазначенияПереопределяемый.
// При закрытии приложения данные не записываются. // При закрытии приложения данные не записываются.
// //
// Параметры: // Параметры:
@@ -8,53 +8,69 @@
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
Процедура ПриВыполненииСтандартныхПериодическихПроверокНаКлиенте(Параметры) Экспорт // См. ОбщегоНазначенияКлиентПереопределяемый.ПередПериодическойОтправкойДанныхКлиентаНаСервер
Процедура ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры) Экспорт
Окна = ПолучитьОкна();
АктивныхОкон = 0; ТекущаяДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
ПараметрыПриложенияЦентрМониторинга = ПолучитьПараметрыПриложения();
Если ПараметрыПриложенияЦентрМониторинга["ДатаПоследнегоВызова"] + 20*60 > ТекущаяДатаСеанса Тогда
Возврат;
КонецЕсли;
ПараметрыПриложенияЦентрМониторинга["ДатаПоследнегоВызова"] = ТекущаяДатаСеанса;
Окна = ПолучитьОкна();
АктивныхОкон = 0;
Если Окна <> Неопределено Тогда Если Окна <> Неопределено Тогда
Для Каждого ТекОкно Из Окна Цикл Для Каждого ТекОкно Из Окна Цикл
Если Не ТекОкно.Основное Тогда Если Не ТекОкно.Основное Тогда
АктивныхОкон = АктивныхОкон + 1; АктивныхОкон = АктивныхОкон + 1;
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
КонецЕсли; КонецЕсли;
ПараметрыПриложенияЦентрМониторинга = ПолучитьПараметрыПриложения(); ПараметрыПриложенияЦентрМониторинга["ИнформацияКлиента"].Вставить("АктивныхОкон", АктивныхОкон);
ПараметрыПриложенияЦентрМониторинга["ИнформацияКлиента"].Вставить("АктивныхОкон", АктивныхОкон);
Параметры.Вставить("СтандартныеПодсистемы.ЦентрМониторинга",
Параметры.Вставить("ЦентрМониторинга", Новый ФиксированноеСоответствие(ПараметрыПриложенияЦентрМониторинга)); Новый ФиксированноеСоответствие(ПараметрыПриложенияЦентрМониторинга));
Замеры = Новый Соответствие; Замеры = Новый Соответствие;
Замеры.Вставить(0, Новый Массив); Замеры.Вставить(0, Новый Массив);
Замеры.Вставить(1, Новый Соответствие); Замеры.Вставить(1, Новый Соответствие);
Замеры.Вставить(2, Новый Соответствие); Замеры.Вставить(2, Новый Соответствие);
ПараметрыПриложенияЦентрМониторинга.Вставить("Замеры", Замеры); ПараметрыПриложенияЦентрМониторинга.Вставить("Замеры", Замеры);
КонецПроцедуры КонецПроцедуры
Процедура ПослеВыполненияСтандартныхПериодическихПроверокНаКлиенте(Параметры) Экспорт // См. ОбщегоНазначенияКлиентПереопределяемый.ПослеПериодическогоПолученияДанныхКлиентаНаСервере
Процедура ПослеПериодическогоПолученияДанныхКлиентаНаСервере(Результаты) Экспорт
ПараметрыПриложенияЦентрМониторинга = ПолучитьПараметрыПриложения();
ПараметрыПриложенияЦентрМониторинга.Вставить("РегистрироватьБизнесСтатистику", Параметры.ЦентрМониторинга["РегистрироватьБизнесСтатистику"]);
Если Параметры.ЦентрМониторинга.Получить("ЗапросНаПолучениеДампов") = Истина Тогда Результат = Результаты.Получить("СтандартныеПодсистемы.ЦентрМониторинга");
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыПриложенияЦентрМониторинга = ПолучитьПараметрыПриложения();
ПараметрыПриложенияЦентрМониторинга.Вставить("РегистрироватьБизнесСтатистику",
Результат["РегистрироватьБизнесСтатистику"]);
Если Результат.Получить("ЗапросНаПолучениеДампов") = Истина Тогда
ОповеститьЗапросНаПолучениеДампов(); ОповеститьЗапросНаПолучениеДампов();
УстановитьПараметрыПриложенияЦентрМониторинга("ЗапросПолныхДамповВыведен", Истина); УстановитьПараметрыПриложенияЦентрМониторинга("ЗапросПолныхДамповВыведен", Истина);
КонецЕсли; КонецЕсли;
Если Параметры.ЦентрМониторинга.Получить("ЗапросНаПолучениеКонтактов") = Истина Тогда Если Результат.Получить("ЗапросНаПолучениеКонтактов") = Истина Тогда
ОповеститьЗапросКонтактнойИнформации(); ОповеститьЗапросКонтактнойИнформации();
УстановитьПараметрыПриложенияЦентрМониторинга("ЗапросНаПолучениеКонтактовВыведен", Истина); УстановитьПараметрыПриложенияЦентрМониторинга("ЗапросНаПолучениеКонтактовВыведен", Истина);
КонецЕсли; КонецЕсли;
Если Параметры.ЦентрМониторинга.Получить("ЗапросНаОтправкуДампов") = Истина Тогда Если Результат.Получить("ЗапросНаОтправкуДампов") = Истина Тогда
ИнформацияОДампах = Параметры.ЦентрМониторинга.Получить("ИнформацияОДампах"); ИнформацияОДампах = Результат.Получить("ИнформацияОДампах");
// Проверяем, было ли сообщение выведено ранее. // Проверяем, было ли сообщение выведено ранее.
Если ИнформацияОДампах <> ПараметрыПриложенияЦентрМониторинга["ИнформацияОДампах"] Тогда Если ИнформацияОДампах <> ПараметрыПриложенияЦентрМониторинга["ИнформацияОДампах"] Тогда
ОповеститьЗапросНаОтправкуДампов(); ОповеститьЗапросНаОтправкуДампов();
УстановитьПараметрыПриложенияЦентрМониторинга("ИнформацияОДампах", ИнформацияОДампах); УстановитьПараметрыПриложенияЦентрМониторинга("ИнформацияОДампах", ИнформацияОДампах);
КонецЕсли; КонецЕсли;
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
#КонецОбласти #КонецОбласти
@@ -104,6 +120,7 @@
ЦентрМониторингаПараметрыПриложения.Вставить("РегистрироватьБизнесСтатистику", ПараметрыКлиента["РегистрироватьБизнесСтатистику"]); ЦентрМониторингаПараметрыПриложения.Вставить("РегистрироватьБизнесСтатистику", ПараметрыКлиента["РегистрироватьБизнесСтатистику"]);
ЦентрМониторингаПараметрыПриложения.Вставить("ЗапросПолныхДамповВыведен", ПараметрыКлиента["ЗапросПолныхДамповВыведен"]); ЦентрМониторингаПараметрыПриложения.Вставить("ЗапросПолныхДамповВыведен", ПараметрыКлиента["ЗапросПолныхДамповВыведен"]);
ЦентрМониторингаПараметрыПриложения.Вставить("ИнформацияОДампах", ПараметрыКлиента["ИнформацияОДампах"]); ЦентрМониторингаПараметрыПриложения.Вставить("ИнформацияОДампах", ПараметрыКлиента["ИнформацияОДампах"]);
ЦентрМониторингаПараметрыПриложения.Вставить("ДатаПоследнегоВызова", ОбщегоНазначенияКлиент.ДатаСеанса());
Замеры = Новый Соответствие; Замеры = Новый Соответствие;
Замеры.Вставить(0, Новый Массив); Замеры.Вставить(0, Новый Массив);
@@ -166,16 +166,25 @@
КонецПроцедуры КонецПроцедуры
Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт // См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере
Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт
Если Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["РегистрироватьБизнесСтатистику"] Тогда СобранныеПараметры = Параметры.Получить("СтандартныеПодсистемы.ЦентрМониторинга");
Если СобранныеПараметры = Неопределено Тогда
Возврат;
КонецЕсли;
Результат = Новый Соответствие;
Результаты.Вставить("СтандартныеПодсистемы.ЦентрМониторинга", Результат);
Если СобранныеПараметры["ИнформацияКлиента"]["ПараметрыКлиента"]["РегистрироватьБизнесСтатистику"] Тогда
РегистрироватьБизнесСтатистику = ПолучитьПараметрыЦентраМониторинга("РегистрироватьБизнесСтатистику"); РегистрироватьБизнесСтатистику = ПолучитьПараметрыЦентраМониторинга("РегистрироватьБизнесСтатистику");
ПараметрыНовые = Новый Соответствие(Параметры);
ПараметрыНовые.Вставить("РегистрироватьБизнесСтатистику", РегистрироватьБизнесСтатистику);
КлючФоновогоЗадания = "ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне" + Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ХешПользователя"]; Результат.Вставить("РегистрироватьБизнесСтатистику", РегистрироватьБизнесСтатистику);
КлючФоновогоЗадания = "ПриПериодическомПолученииДанныхКлиентаНаСервереВФоне"
+ СобранныеПараметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ХешПользователя"];
Отбор = Новый Структура; Отбор = Новый Структура;
Отбор.Вставить("Ключ", КлючФоновогоЗадания); Отбор.Вставить("Ключ", КлючФоновогоЗадания);
@@ -185,32 +194,28 @@
Если АктивныеФоновыеЗадания.Количество() = 0 Тогда Если АктивныеФоновыеЗадания.Количество() = 0 Тогда
ПараметрыФоновогоЗадания = Новый Массив; ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(Параметры); ПараметрыФоновогоЗадания.Добавить(СобранныеПараметры);
ФоновыеЗадания.Выполнить("ЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне", ФоновыеЗадания.Выполнить("ЦентрМониторингаСлужебный.ПриПериодическомПолученииДанныхКлиентаНаСервереВФоне",
ПараметрыФоновогоЗадания, ПараметрыФоновогоЗадания,
КлючФоновогоЗадания, КлючФоновогоЗадания,
"ЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере"); "ЦентрМониторингаСлужебный.ПриПериодическомПолученииДанныхКлиентаНаСервере");
КонецЕсли; КонецЕсли;
Параметры = Новый ФиксированноеСоответствие(ПараметрыНовые);
КонецЕсли; КонецЕсли;
Если Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ВыводитьЗапросПолныхДампов"] Тогда Если СобранныеПараметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ВыводитьЗапросПолныхДампов"] Тогда
ПараметрыОповещенияОДампах = ПараметрыОповещенияОДампах(); ПараметрыОповещенияОДампах = ПараметрыОповещенияОДампах();
ЗапросНаПолучениеДампов = ПараметрыОповещенияОДампах.ЗапросНаПолучениеДампов ЗапросНаПолучениеДампов = ПараметрыОповещенияОДампах.ЗапросНаПолучениеДампов
И НЕ Параметры.Получить("ЗапросПолныхДамповВыведен") = Истина; И НЕ СобранныеПараметры.Получить("ЗапросПолныхДамповВыведен") = Истина;
ЗапросНаПолучениеКонтактов = ПолучитьПараметрыЦентраМониторинга("ЗапросКонтактнойИнформации") = 3 ЗапросНаПолучениеКонтактов = ПолучитьПараметрыЦентраМониторинга("ЗапросКонтактнойИнформации") = 3
И НЕ Параметры.Получить("ЗапросНаПолучениеКонтактовВыведен") = Истина; И НЕ СобранныеПараметры.Получить("ЗапросНаПолучениеКонтактовВыведен") = Истина;
ПараметрыНовые = Новый Соответствие(Параметры); Результат.Вставить("ЗапросНаПолучениеДампов", ЗапросНаПолучениеДампов);
ПараметрыНовые.Вставить("ЗапросНаПолучениеДампов", ЗапросНаПолучениеДампов); Результат.Вставить("ЗапросНаОтправкуДампов", ПараметрыОповещенияОДампах.ЗапросНаОтправку);
ПараметрыНовые.Вставить("ЗапросНаОтправкуДампов", ПараметрыОповещенияОДампах.ЗапросНаОтправку); Результат.Вставить("ИнформацияОДампах", ПараметрыОповещенияОДампах.ИнформацияОДампах);
ПараметрыНовые.Вставить("ИнформацияОДампах", ПараметрыОповещенияОДампах.ИнформацияОДампах); Результат.Вставить("ЗапросНаПолучениеКонтактов", ЗапросНаПолучениеКонтактов);
ПараметрыНовые.Вставить("ЗапросНаПолучениеКонтактов", ЗапросНаПолучениеКонтактов);
Параметры = Новый ФиксированноеСоответствие(ПараметрыНовые);
КонецЕсли; КонецЕсли;
@@ -252,7 +257,7 @@
И ТекущаяУниверсальнаяДата() < ПараметрыЦентраМониторинга.ОкончаниеСбораДампов; И ТекущаяУниверсальнаяДата() < ПараметрыЦентраМониторинга.ОкончаниеСбораДампов;
Если НачатьСборИОтправкуОтчетовОбОшибках Тогда Если НачатьСборИОтправкуОтчетовОбОшибках Тогда
Идентификатор = Параметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ХешПользователя"]; Идентификатор = СобранныеПараметры["ИнформацияКлиента"]["ПараметрыКлиента"]["ХешПользователя"];
КлючФоновогоЗадания = "СборИОтправкаОтчетовОбОшибкахНаСервереВФоне" + Идентификатор; КлючФоновогоЗадания = "СборИОтправкаОтчетовОбОшибкахНаСервереВФоне" + Идентификатор;
Отбор = Новый Структура; Отбор = Новый Структура;
@@ -278,7 +283,7 @@
КонецПроцедуры КонецПроцедуры
Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервереВФоне(Параметры) Экспорт Процедура ПриПериодическомПолученииДанныхКлиентаНаСервереВФоне(Параметры) Экспорт
ЗаписатьСтатистикуЭкрановКлиента(Параметры); ЗаписатьСтатистикуЭкрановКлиента(Параметры);
ЗаписатьИнформациюОСистеме(Параметры); ЗаписатьИнформациюОСистеме(Параметры);
@@ -570,7 +575,7 @@
КонецЕсли; КонецЕсли;
Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
// Для файловой базы сбор и отправка происходят в ПриВыполненииСтандартныхПериодическихПроверокНаСервере. // Для файловой базы сбор и отправка происходят в ПриПериодическомПолученииДанныхКлиентаНаСервере.
Иначе Иначе
// Проверим, существует ли регламентное задание. // Проверим, существует ли регламентное задание.
РегЗадание = ПолучитьРегламентноеЗадание("СборИОтправкаОтчетовОбОшибках", Ложь); РегЗадание = ПолучитьРегламентноеЗадание("СборИОтправкаОтчетовОбОшибках", Ложь);
@@ -1499,6 +1504,7 @@
Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации Тогда Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации Тогда
РегистрыСведений.СтатистикаКонфигурации.ЗаписатьНастройкиКонфигурации(); РегистрыСведений.СтатистикаКонфигурации.ЗаписатьНастройкиКонфигурации();
ПолучитьСтатистикуИспользованияППД();
НеобходимаЗаписьОценкиПроизводительности = Истина; НеобходимаЗаписьОценкиПроизводительности = Истина;
КонецЕсли; КонецЕсли;
@@ -4029,5 +4035,22 @@
#КонецОбласти #КонецОбласти
#Область ДанныеИспользованияППД
Процедура ПолучитьСтатистикуИспользованияППД()
Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Запретить Тогда
Возврат;
КонецЕсли;
ЧасовАктуальностиИндекса = Окр((ТекущаяДатаСеанса() - ПолнотекстовыйПоиск.ДатаАктуальности())/3600);
МинимальнаяВерсияПлатформы = "8.3.22.1000";
СистемнаяИнформация = Новый СистемнаяИнформация;
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, МинимальнаяВерсияПлатформы) > 0 Тогда
УстановленнаяВерсияПолнотекстовогоПоиска = ОбщегоНазначения.ВычислитьВБезопасномРежиме("?(ПолнотекстовыйПоиск.ПолучитьВерсиюПолнотекстовогоПоиска() = ВерсияПолнотекстовогоПоиска.Версия1,1,2)");
ЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("ПолнотекстовыйПоиск.Версия", УстановленнаяВерсияПолнотекстовогоПоиска);
КонецЕсли;
ЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("ПолнотекстовыйПоиск.ЧасовАктуальностиИндекса", ЧасовАктуальностиИндекса);
КонецПроцедуры
#КонецОбласти
#КонецОбласти #КонецОбласти
@@ -389,7 +389,7 @@
// Параметры: // Параметры:
// СертификатКриптографии // СертификатКриптографии
// НаДату - Неопределено, Дата // НаДату - Неопределено, Дата
// ЭтоПроверкаПодписи - Булево - Это проверка подписи, предупреждение (не ошибка) не будет показано. // ЭтоПроверкаПодписи - Булево - это проверка подписи, предупреждение (не ошибка) не будет показано.
// //
// Возвращаемое значение: // Возвращаемое значение:
// см. ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПроверкиУдостоверяющегоЦентраПоУмолчанию // см. ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПроверкиУдостоверяющегоЦентраПоУмолчанию
@@ -37,9 +37,9 @@
// Конструктор результата проверки по списку удостоверяющих центров. // Конструктор результата проверки по списку удостоверяющих центров.
// //
// Возвращаемое значение: // Возвращаемое значение:
// Структура - Результат проверки удостоверяющего центра по умолчанию: // Структура - результат проверки удостоверяющего центра по умолчанию:
// * Действует - Булево - Аккредитованный УЦ действует на дату проверки. // * Действует - Булево - аккредитованный УЦ действует на дату проверки.
// * НайденВСпискеУдостоверяющихЦентров - Булево - Сертификат, выданный УЦ является квалифицированным // * НайденВСпискеУдостоверяющихЦентров - Булево - сертификат, выданный УЦ является квалифицированным
// * Государственный - Булево - относится к определенному списку УЦ, выдающих сертификаты, по которым не нужно // * Государственный - Булево - относится к определенному списку УЦ, выдающих сертификаты, по которым не нужно
// выполнять некоторые проверки. // выполнять некоторые проверки.
// например, в России: УЦ ФНС России, Казначейства России, и Банка России. // например, в России: УЦ ФНС России, Казначейства России, и Банка России.
@@ -58,11 +58,11 @@
КонецФункции КонецФункции
// Возвращаемое значение: // Возвращаемое значение:
// Структура - Сообщение об ошибке/предупреждение для проверяемого сертификата: // Структура - сообщение об ошибке/предупреждение для проверяемого сертификата:
// * ТекстОшибки - Строка - // * ТекстОшибки - Строка
// * ВозможенПеревыпуск - Булево - можно подать заявление на новый сертификат из программы. // * ВозможенПеревыпуск - Булево - можно подать заявление на новый сертификат из программы.
// * Причина - Строка - Причина ошибки для отображения в расширенной форме ошибки. // * Причина - Строка - причина ошибки для отображения в расширенной форме ошибки.
// * Решение - Строка - Рекомендация для отображения в расширенной форме ошибки. // * Решение - Строка - рекомендация для отображения в расширенной форме ошибки.
// //
Функция ПредупреждениеПриПроверкеУдостоверяющегоЦентраСертификата() Экспорт Функция ПредупреждениеПриПроверкеУдостоверяющегоЦентраСертификата() Экспорт
@@ -71,11 +71,12 @@
Предупреждение.Вставить("ВозможенПеревыпуск", Ложь); Предупреждение.Вставить("ВозможенПеревыпуск", Ложь);
Предупреждение.Вставить("Причина", ""); Предупреждение.Вставить("Причина", "");
Предупреждение.Вставить("Решение", ""); Предупреждение.Вставить("Решение", "");
Возврат Предупреждение; Возврат Предупреждение;
КонецФункции КонецФункции
#КонецОбласти #КонецОбласти
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
@@ -85,10 +85,7 @@
Если ИмяФайлаПериодыДействия <> Неопределено Тогда Если ИмяФайлаПериодыДействия <> Неопределено Тогда
ЧтениеJSON = Новый ЧтениеJSON; СписокУЦ = ПрочитатьФайлПериодовДействияУЦ(КаталогОбновлений + ИмяФайлаПериодыДействия);
ЧтениеJSON.ОткрытьФайл(КаталогОбновлений + ИмяФайлаПериодыДействия);
СписокУЦ = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Подготовка соответствия для быстрого поиска. // Подготовка соответствия для быстрого поиска.
Соответствие = Новый Соответствие; Соответствие = Новый Соответствие;
@@ -235,6 +232,31 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
// Прочитать файл периодов действия УЦ.
//
// Параметры:
// ИмяФайла - Строка - имя файла
//
// Возвращаемое значение:
// Массив из Структура:
// * ОГРН - Строка
// * Наименование - Строка
// * КраткоеНаименование - Строка
// * ПериодыДействия - Массив из Структура:
// ** ДатаС - Строка
// ** ДатаПо - Строка
//
Функция ПрочитатьФайлПериодовДействияУЦ(ИмяФайла)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ИмяФайла);
СписокУЦ = ПрочитатьJSON(ЧтениеJSON); // Структура
ЧтениеJSON.Закрыть();
Возврат СписокУЦ;
КонецФункции
Функция ДатаПоследнегоИзмененияФайла(РезультатЗагрузки) Функция ДатаПоследнегоИзмененияФайла(РезультатЗагрузки)
Заголовки = Неопределено; Заголовки = Неопределено;
+20 -13
View File
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="26dad4b8-2d02-4d31-8c31-94c0295bd56a"> <mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="04e6dcc4-e931-4993-9fa2-63c16d53dadf">
<name>БиблиотекаСтандартныхПодсистем</name> <name>БиблиотекаСтандартныхПодсистем</name>
<synonym> <synonym>
<key>ru</key> <key>ru</key>
<value>Библиотека стандартных подсистем, редакция 3.1</value> <value>Библиотека стандартных подсистем, редакция 3.1</value>
</synonym> </synonym>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="7a04ed61-ad6e-431c-8c38-7aabc9100ba6"/> <containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="e0684ff5-8b8b-4c4c-b732-cc223a36898f"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="5229106b-41b8-4733-9270-dc53ff5d8cfa"/> <containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="c1d357b3-b1d8-4e35-9bef-d04649204724"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="20ed20f5-46ba-455e-8c15-08c9708b084a"/> <containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="34f44a6f-e3b4-410b-a8aa-1cfdeb4e14b5"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="f1324ef0-ae56-4f0b-9d32-7df8979376a5"/> <containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="db747947-d3c4-4a68-8a82-6fe98b2afbdd"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="3a7f144b-749e-4085-bad6-8dd6ed495b70"/> <containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="88661bbd-ac65-40eb-8fb0-e7c9677b744d"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="484ce06d-c2d6-48da-a522-2e887bf45617"/> <containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="5d385f81-74af-428b-a642-3bc9e2152e92"/>
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="d8ce7477-eb96-451d-9d86-b5bc4af22148"/> <containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="a64857dd-da1d-40cd-ad96-cba4eda6d5c2"/>
<defaultRunMode>ManagedApplication</defaultRunMode> <defaultRunMode>ManagedApplication</defaultRunMode>
<usePurposes>PersonalComputer</usePurposes> <usePurposes>PersonalComputer</usePurposes>
<scriptVariant>Russian</scriptVariant> <scriptVariant>Russian</scriptVariant>
@@ -19,7 +19,7 @@
<defaultRoles>Role.АдминистраторСистемы</defaultRoles> <defaultRoles>Role.АдминистраторСистемы</defaultRoles>
<defaultRoles>Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</defaultRoles> <defaultRoles>Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</defaultRoles>
<vendor>Фирма &quot;1С&quot;</vendor> <vendor>Фирма &quot;1С&quot;</vendor>
<version>3.1.6.209</version> <version>3.1.7.34</version>
<updateCatalogAddress>http://downloads.v8.1c.ru/tmplts/</updateCatalogAddress> <updateCatalogAddress>http://downloads.v8.1c.ru/tmplts/</updateCatalogAddress>
<includeHelpInContents>true</includeHelpInContents> <includeHelpInContents>true</includeHelpInContents>
<usedMobileApplicationFunctionalities> <usedMobileApplicationFunctionalities>
@@ -646,6 +646,7 @@
<sessionParameters>SessionParameter.ВыполняетсяУдалениеОбъектов</sessionParameters> <sessionParameters>SessionParameter.ВыполняетсяУдалениеОбъектов</sessionParameters>
<sessionParameters>SessionParameter.ДатаОбновленияПовторноИспользуемыхЗначенийМРО</sessionParameters> <sessionParameters>SessionParameter.ДатаОбновленияПовторноИспользуемыхЗначенийМРО</sessionParameters>
<sessionParameters>SessionParameter.ДействующиеДатыЗапретаИзменения</sessionParameters> <sessionParameters>SessionParameter.ДействующиеДатыЗапретаИзменения</sessionParameters>
<sessionParameters>SessionParameter.ДлительныеОперации</sessionParameters>
<sessionParameters>SessionParameter.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав</sessionParameters> <sessionParameters>SessionParameter.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав</sessionParameters>
<sessionParameters>SessionParameter.ИнтерактивнаяПроверкаЗаполненияКонтактнойИнформации</sessionParameters> <sessionParameters>SessionParameter.ИнтерактивнаяПроверкаЗаполненияКонтактнойИнформации</sessionParameters>
<sessionParameters>SessionParameter.ИнтерактивнаяПроверкаЗаполненияСвойств</sessionParameters> <sessionParameters>SessionParameter.ИнтерактивнаяПроверкаЗаполненияСвойств</sessionParameters>
@@ -659,7 +660,6 @@
<sessionParameters>SessionParameter.ОграничениеДоступаНаУровнеЗаписейУниверсально</sessionParameters> <sessionParameters>SessionParameter.ОграничениеДоступаНаУровнеЗаписейУниверсально</sessionParameters>
<sessionParameters>SessionParameter.ОсновнойЯзык</sessionParameters> <sessionParameters>SessionParameter.ОсновнойЯзык</sessionParameters>
<sessionParameters>SessionParameter.ОтключениеОбновленияКлючейДоступа</sessionParameters> <sessionParameters>SessionParameter.ОтключениеОбновленияКлючейДоступа</sessionParameters>
<sessionParameters>SessionParameter.ОтмененныеДлительныеОперации</sessionParameters>
<sessionParameters>SessionParameter.ОшибкаРасхожденияВерсийПриПолученииДанных</sessionParameters> <sessionParameters>SessionParameter.ОшибкаРасхожденияВерсийПриПолученииДанных</sessionParameters>
<sessionParameters>SessionParameter.ПараметрыКлиентаНаСервере</sessionParameters> <sessionParameters>SessionParameter.ПараметрыКлиентаНаСервере</sessionParameters>
<sessionParameters>SessionParameter.ПараметрыОбработчикаОбновления</sessionParameters> <sessionParameters>SessionParameter.ПараметрыОбработчикаОбновления</sessionParameters>
@@ -874,7 +874,6 @@
<commonModules>CommonModule.ДатыЗапретаИзмененияСлужебныйПовтИсп</commonModules> <commonModules>CommonModule.ДатыЗапретаИзмененияСлужебныйПовтИсп</commonModules>
<commonModules>CommonModule.ДлительныеОперации</commonModules> <commonModules>CommonModule.ДлительныеОперации</commonModules>
<commonModules>CommonModule.ДлительныеОперацииВызовСервера</commonModules> <commonModules>CommonModule.ДлительныеОперацииВызовСервера</commonModules>
<commonModules>CommonModule.ДлительныеОперацииГлобальный</commonModules>
<commonModules>CommonModule.ДлительныеОперацииКлиент</commonModules> <commonModules>CommonModule.ДлительныеОперацииКлиент</commonModules>
<commonModules>CommonModule.ДополнительныеОтчетыИОбработки</commonModules> <commonModules>CommonModule.ДополнительныеОтчетыИОбработки</commonModules>
<commonModules>CommonModule.ДополнительныеОтчетыИОбработкиВАвтономномРежиме</commonModules> <commonModules>CommonModule.ДополнительныеОтчетыИОбработкиВАвтономномРежиме</commonModules>
@@ -1129,6 +1128,11 @@
<commonModules>CommonModule.РезервноеКопированиеИБКлиент</commonModules> <commonModules>CommonModule.РезервноеКопированиеИБКлиент</commonModules>
<commonModules>CommonModule.РезервноеКопированиеИБКлиентПереопределяемый</commonModules> <commonModules>CommonModule.РезервноеКопированиеИБКлиентПереопределяемый</commonModules>
<commonModules>CommonModule.РезервноеКопированиеИБСервер</commonModules> <commonModules>CommonModule.РезервноеКопированиеИБСервер</commonModules>
<commonModules>CommonModule.СерверныеОповещения</commonModules>
<commonModules>CommonModule.СерверныеОповещенияГлобальный</commonModules>
<commonModules>CommonModule.СерверныеОповещенияКлиент</commonModules>
<commonModules>CommonModule.СерверныеОповещенияСлужебныйВызовСервера</commonModules>
<commonModules>CommonModule.СерверныеОповещенияСлужебныйПовтИсп</commonModules>
<commonModules>CommonModule.СервисКриптографииDSS</commonModules> <commonModules>CommonModule.СервисКриптографииDSS</commonModules>
<commonModules>CommonModule.СервисКриптографииDSSASNКлиентСервер</commonModules> <commonModules>CommonModule.СервисКриптографииDSSASNКлиентСервер</commonModules>
<commonModules>CommonModule.СервисКриптографииDSSКлиент</commonModules> <commonModules>CommonModule.СервисКриптографииDSSКлиент</commonModules>
@@ -1145,7 +1149,6 @@
<commonModules>CommonModule.СклонениеПредставленийОбъектовКлиентСервер</commonModules> <commonModules>CommonModule.СклонениеПредставленийОбъектовКлиентСервер</commonModules>
<commonModules>CommonModule.СоединенияИБ</commonModules> <commonModules>CommonModule.СоединенияИБ</commonModules>
<commonModules>CommonModule.СоединенияИБВызовСервера</commonModules> <commonModules>CommonModule.СоединенияИБВызовСервера</commonModules>
<commonModules>CommonModule.СоединенияИБГлобальный</commonModules>
<commonModules>CommonModule.СоединенияИБКлиент</commonModules> <commonModules>CommonModule.СоединенияИБКлиент</commonModules>
<commonModules>CommonModule.СоединенияИБКлиентСервер</commonModules> <commonModules>CommonModule.СоединенияИБКлиентСервер</commonModules>
<commonModules>CommonModule.СоединенияИБПереопределяемый</commonModules> <commonModules>CommonModule.СоединенияИБПереопределяемый</commonModules>
@@ -1420,7 +1423,6 @@
<scheduledJobs>ScheduledJob.ЗапускДополнительныхОбработок</scheduledJobs> <scheduledJobs>ScheduledJob.ЗапускДополнительныхОбработок</scheduledJobs>
<scheduledJobs>ScheduledJob.ИзвлечениеТекста</scheduledJobs> <scheduledJobs>ScheduledJob.ИзвлечениеТекста</scheduledJobs>
<scheduledJobs>ScheduledJob.ИсправлениеУстаревшихАдресов</scheduledJobs> <scheduledJobs>ScheduledJob.ИсправлениеУстаревшихАдресов</scheduledJobs>
<scheduledJobs>ScheduledJob.КонтрольАктивностиПользователей</scheduledJobs>
<scheduledJobs>ScheduledJob.КонтрольУдаленияПомеченныхОбъектов</scheduledJobs> <scheduledJobs>ScheduledJob.КонтрольУдаленияПомеченныхОбъектов</scheduledJobs>
<scheduledJobs>ScheduledJob.МониторингЗадач</scheduledJobs> <scheduledJobs>ScheduledJob.МониторингЗадач</scheduledJobs>
<scheduledJobs>ScheduledJob.ОбновлениеАгрегатов</scheduledJobs> <scheduledJobs>ScheduledJob.ОбновлениеАгрегатов</scheduledJobs>
@@ -1432,6 +1434,7 @@
<scheduledJobs>ScheduledJob.ОбработкаСервисовИнтеграции</scheduledJobs> <scheduledJobs>ScheduledJob.ОбработкаСервисовИнтеграции</scheduledJobs>
<scheduledJobs>ScheduledJob.ОтложенноеОбновлениеИБ</scheduledJobs> <scheduledJobs>ScheduledJob.ОтложенноеОбновлениеИБ</scheduledJobs>
<scheduledJobs>ScheduledJob.ОтправкаSMS</scheduledJobs> <scheduledJobs>ScheduledJob.ОтправкаSMS</scheduledJobs>
<scheduledJobs>ScheduledJob.ОтправкаСерверныхОповещенийКлиентам</scheduledJobs>
<scheduledJobs>ScheduledJob.ОчисткаЗамеровВремени</scheduledJobs> <scheduledJobs>ScheduledJob.ОчисткаЗамеровВремени</scheduledJobs>
<scheduledJobs>ScheduledJob.ОчисткаНенужныхФайлов</scheduledJobs> <scheduledJobs>ScheduledJob.ОчисткаНенужныхФайлов</scheduledJobs>
<scheduledJobs>ScheduledJob.ОчисткаУстаревшихВерсийОбъектов</scheduledJobs> <scheduledJobs>ScheduledJob.ОчисткаУстаревшихВерсийОбъектов</scheduledJobs>
@@ -1789,6 +1792,7 @@
<constants>Constant.СоздаватьПодкаталогиСИменамиВладельцев</constants> <constants>Constant.СоздаватьПодкаталогиСИменамиВладельцев</constants>
<constants>Constant.СоздаватьЭлектронныеПодписиНаСервере</constants> <constants>Constant.СоздаватьЭлектронныеПодписиНаСервере</constants>
<constants>Constant.СообщениеОбменаДаннымиИзГлавногоУзла</constants> <constants>Constant.СообщениеОбменаДаннымиИзГлавногоУзла</constants>
<constants>Constant.СостояниеОтправкиСерверныхОповещений</constants>
<constants>Constant.СписокЗапрещенныхРасширений</constants> <constants>Constant.СписокЗапрещенныхРасширений</constants>
<constants>Constant.СписокЗапрещенныхРасширенийОбластиДанных</constants> <constants>Constant.СписокЗапрещенныхРасширенийОбластиДанных</constants>
<constants>Constant.СписокРасширенийТекстовыхФайлов</constants> <constants>Constant.СписокРасширенийТекстовыхФайлов</constants>
@@ -1839,6 +1843,7 @@
<commonForms>CommonForm.ДополнительныеПараметрыПроксиСервера</commonForms> <commonForms>CommonForm.ДополнительныеПараметрыПроксиСервера</commonForms>
<commonForms>CommonForm.ИнформацияНеразделенногоПользователя</commonForms> <commonForms>CommonForm.ИнформацияНеразделенногоПользователя</commonForms>
<commonForms>CommonForm.КонтрольДинамическогоОбновления</commonForms> <commonForms>CommonForm.КонтрольДинамическогоОбновления</commonForms>
<commonForms>CommonForm.КонтрольИзмененияРолейПользователяИБ</commonForms>
<commonForms>CommonForm.МастерАнкетыПоРазделам</commonForms> <commonForms>CommonForm.МастерАнкетыПоРазделам</commonForms>
<commonForms>CommonForm.МониторСинхронизацииДанныхВМоделиСервиса</commonForms> <commonForms>CommonForm.МониторСинхронизацииДанныхВМоделиСервиса</commonForms>
<commonForms>CommonForm.НапоминаниеПриРедактировании</commonForms> <commonForms>CommonForm.НапоминаниеПриРедактировании</commonForms>
@@ -2251,6 +2256,7 @@
<informationRegisters>InformationRegister.ОповещенияПользователейСертификатов</informationRegisters> <informationRegisters>InformationRegister.ОповещенияПользователейСертификатов</informationRegisters>
<informationRegisters>InformationRegister.ОриентирыАдресныхОбъектов</informationRegisters> <informationRegisters>InformationRegister.ОриентирыАдресныхОбъектов</informationRegisters>
<informationRegisters>InformationRegister.ОтветыНаВопросыАнкет</informationRegisters> <informationRegisters>InformationRegister.ОтветыНаВопросыАнкет</informationRegisters>
<informationRegisters>InformationRegister.ОтправленныеСерверныеОповещения</informationRegisters>
<informationRegisters>InformationRegister.ОчередьИзвлеченияТекста</informationRegisters> <informationRegisters>InformationRegister.ОчередьИзвлеченияТекста</informationRegisters>
<informationRegisters>InformationRegister.ОчередьИнсталляцииПоставляемыхДополнительныхОтчетовИОбработокВОбластиДанных</informationRegisters> <informationRegisters>InformationRegister.ОчередьИнсталляцииПоставляемыхДополнительныхОтчетовИОбработокВОбластиДанных</informationRegisters>
<informationRegisters>InformationRegister.ПакетыДляОтправки</informationRegisters> <informationRegisters>InformationRegister.ПакетыДляОтправки</informationRegisters>
@@ -2258,6 +2264,7 @@
<informationRegisters>InformationRegister.ПараметрыОграниченияДоступа</informationRegisters> <informationRegisters>InformationRegister.ПараметрыОграниченияДоступа</informationRegisters>
<informationRegisters>InformationRegister.ПараметрыРаботыВерсийРасширений</informationRegisters> <informationRegisters>InformationRegister.ПараметрыРаботыВерсийРасширений</informationRegisters>
<informationRegisters>InformationRegister.ПараметрыРаботыПрограммы</informationRegisters> <informationRegisters>InformationRegister.ПараметрыРаботыПрограммы</informationRegisters>
<informationRegisters>InformationRegister.ПериодическиеСерверныеОповещения</informationRegisters>
<informationRegisters>InformationRegister.ПериодыНерабочихДнейКалендаря</informationRegisters> <informationRegisters>InformationRegister.ПериодыНерабочихДнейКалендаря</informationRegisters>
<informationRegisters>InformationRegister.ПользовательскиеМакетыПечати</informationRegisters> <informationRegisters>InformationRegister.ПользовательскиеМакетыПечати</informationRegisters>
<informationRegisters>InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам</informationRegisters> <informationRegisters>InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам</informationRegisters>
@@ -1 +1 @@
{6,1,1,28e1e811-98d4-4281-aaa4-d7c33b942822,1,29c00a8f-4c35-4ce0-8e5d-afbbe0f7f7af,"3.1.6.209","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",6731,1,0,26dad4b8-2d02-4d31-8c31-94c0295bd56a,26dad4b8-2d02-4d31-8c31-94c0295bd56a,1,0,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,1,0,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,1,0,7795348b-2f52-47f7-bf00-e11e5e795a43,7795348b-2f52-47f7-bf00-e11e5e795a43,1,0,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,1,0,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,1,0,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,1,0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,1,0,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,1,0,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,1,0,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,1,0,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,1,0,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,1,0,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,1,0,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,1,0,5b68d479-7880-44de-84e3-7f578b43f0dc,5b68d479-7880-44de-84e3-7f578b43f0dc,1,0,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,1,0,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,1,0,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,1,0,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,1,0,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,1,0,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,1,0,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1,0,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,1,0,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,1,0,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,1,0,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,1,0,1983fe34-c984-4659-ba41-0e94504f8989,1983fe34-c984-4659-ba41-0e94504f8989,1,0,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,1,0,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,1,0,153e11ac-f898-46a5-98c6-734adb933ca2,153e11ac-f898-46a5-98c6-734adb933ca2,1,0,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,1,0,08a413ff-bebd-42e5-8ff3-2115746a0844,08a413ff-bebd-42e5-8ff3-2115746a0844,1,0,f24de2ea-fcda-4052-b90f-e9d84314c4f2,f24de2ea-fcda-4052-b90f-e9d84314c4f2,1,0,ff8ae395-c740-4a30-a048-0d57eef6267f,ff8ae395-c740-4a30-a048-0d57eef6267f,1,0,51d06532-f61a-4ed5-afaa-cc4563633e0c,51d06532-f61a-4ed5-afaa-cc4563633e0c,1,0,0e49d980-581b-459f-a4b0-024e8c97e4c0,0e49d980-581b-459f-a4b0-024e8c97e4c0,1,0,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,1,0,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,1,0,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,1,0,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,1,0,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,1,0,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,1,0,839e29b1-a0d2-40fa-9f3e-46e66b943358,839e29b1-a0d2-40fa-9f3e-46e66b943358,1,0,c56d2cc7-630a-441b-b23f-ba78c34849bd,c56d2cc7-630a-441b-b23f-ba78c34849bd,1,0,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,1,0,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,1,0,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,1,0,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,1,0,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,1,0,3cffb795-2a28-4beb-92f4-5813f5994022,3cffb795-2a28-4beb-92f4-5813f5994022,1,0,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,1,0,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,1,0,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,1,0,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,1,0,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,1,0,a379287d-1ce8-460d-a503-910e728e28f1,a379287d-1ce8-460d-a503-910e728e28f1,1,0,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,1,0,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,1,0,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,1,0,4009cb3a-6754-481f-911b-907558cea38a,4009cb3a-6754-481f-911b-907558cea38a,1,0,653a7fd8-91c7-49aa-aa63-45da087e0d0a,653a7fd8-91c7Line truncated {6,1,1,00283a82-1e70-4ed0-9c2a-2c767ee98ccb,1,f2871eb4-339c-4e0c-be29-b62666e84f74,"3.1.7.34","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",6752,1,0,04e6dcc4-e931-4993-9fa2-63c16d53dadf,04e6dcc4-e931-4993-9fa2-63c16d53dadf,1,0,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,1,0,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,1,0,7795348b-2f52-47f7-bf00-e11e5e795a43,7795348b-2f52-47f7-bf00-e11e5e795a43,1,0,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,1,0,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,1,0,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,1,0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,1,0,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,1,0,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,1,0,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,1,0,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,1,0,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,1,0,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,1,0,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,1,0,5b68d479-7880-44de-84e3-7f578b43f0dc,5b68d479-7880-44de-84e3-7f578b43f0dc,1,0,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,1,0,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,1,0,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,1,0,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,1,0,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,1,0,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,1,0,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1,0,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,1,0,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,1,0,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,1,0,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,1,0,1983fe34-c984-4659-ba41-0e94504f8989,1983fe34-c984-4659-ba41-0e94504f8989,1,0,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,1,0,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,1,0,153e11ac-f898-46a5-98c6-734adb933ca2,153e11ac-f898-46a5-98c6-734adb933ca2,1,0,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,1,0,08a413ff-bebd-42e5-8ff3-2115746a0844,08a413ff-bebd-42e5-8ff3-2115746a0844,1,0,f24de2ea-fcda-4052-b90f-e9d84314c4f2,f24de2ea-fcda-4052-b90f-e9d84314c4f2,1,0,ff8ae395-c740-4a30-a048-0d57eef6267f,ff8ae395-c740-4a30-a048-0d57eef6267f,1,0,51d06532-f61a-4ed5-afaa-cc4563633e0c,51d06532-f61a-4ed5-afaa-cc4563633e0c,1,0,0e49d980-581b-459f-a4b0-024e8c97e4c0,0e49d980-581b-459f-a4b0-024e8c97e4c0,1,0,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,1,0,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,1,0,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,1,0,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,1,0,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,1,0,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,1,0,839e29b1-a0d2-40fa-9f3e-46e66b943358,839e29b1-a0d2-40fa-9f3e-46e66b943358,1,0,c56d2cc7-630a-441b-b23f-ba78c34849bd,c56d2cc7-630a-441b-b23f-ba78c34849bd,1,0,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,1,0,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,1,0,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,1,0,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,1,0,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,1,0,3cffb795-2a28-4beb-92f4-5813f5994022,3cffb795-2a28-4beb-92f4-5813f5994022,1,0,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,1,0,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,1,0,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,1,0,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,1,0,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,1,0,a379287d-1ce8-460d-a503-910e728e28f1,a379287d-1ce8-460d-a503-910e728e28f1,1,0,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,1,0,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,1,0,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,1,0,4009cb3a-6754-481f-911b-907558cea38a,4009cb3a-6754-481f-911b-907558cea38a,1,0,653a7fd8-91c7-49aa-aa63-45da087e0d0a,653a7fd8-91c7-Line truncated
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="db445527-7bd2-448b-bf87-5ac0c10d742d">
<producedTypes>
<managerType typeId="a62f5506-f105-4290-9e4a-95a934290db2" valueTypeId="dc95f16e-dd84-4448-b1b6-e300a085ee5f"/>
<valueManagerType typeId="41cf0909-c9fd-41ad-bd94-557ebda09361" valueTypeId="2ff87c6c-142e-4b63-af4e-8e8caca2dd05"/>
<valueKeyType typeId="f47fcf2d-c3fd-4a08-a9bf-23bc46a72201" valueTypeId="ca2b59b4-4bdf-438c-9828-827a75c17491"/>
</producedTypes>
<name>СостояниеОтправкиСерверныхОповещений</name>
<synonym>
<key>ru</key>
<value>Состояние отправки серверных оповещений</value>
</synonym>
<type>
<types>ValueStorage</types>
</type>
<useStandardCommands>true</useStandardCommands>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<dataLockControlMode>Managed</dataLockControlMode>
</mdclass:Constant>
@@ -41,6 +41,10 @@
УстановитьНачальныйСтатусЗапретаРаботыПользователей(); УстановитьНачальныйСтатусЗапретаРаботыПользователей();
ОбновитьСтраницуНастройки(); ОбновитьСтраницуНастройки();
Если Не СоединенияИБ.ПодсистемаИспользуется() Тогда
Доступность = Ложь;
КонецЕсли;
КонецПроцедуры КонецПроцедуры
&НаКлиенте &НаКлиенте
@@ -1908,6 +1908,8 @@
МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта]; МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта];
ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда
МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта]; МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта];
ИначеЕсли МассивОбъекта.ТипОбъекта = "Обработка" Тогда
МенеджерОбъекта = Обработки[МассивОбъекта.НазваниеОбъекта];
Иначе Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления);
КонецЕсли; КонецЕсли;
@@ -57,7 +57,7 @@
Функция ВерсияОбновленияДанныхПроизводственныхКалендарей() Экспорт Функция ВерсияОбновленияДанныхПроизводственныхКалендарей() Экспорт
Возврат "3.1.6.187"; Возврат "3.1.7.12";
КонецФункции КонецФункции
@@ -114,7 +114,7 @@
Процедура ПриОткрытии(Отказ) Процедура ПриОткрытии(Отказ)
Если ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено") Тогда Если ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено") Тогда
ПодключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм", 0.1, Истина); ПодключитьОбработчикОжидания("ПриИзмененииСоставаИлиНастроекПрограмм", 0.1, Истина);
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -127,7 +127,7 @@
И (ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования") И (ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования")
Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux")) Тогда Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux")) Тогда
ПодключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм", 0.1, Истина); ПодключитьОбработчикОжидания("ПриИзмененииСоставаИлиНастроекПрограмм", 0.1, Истина);
КонецЕсли; КонецЕсли;
Если ВРег(ИмяСобытия) = ВРег("ИнтернетПоддержкаПодключена") Тогда Если ВРег(ИмяСобытия) = ВРег("ИнтернетПоддержкаПодключена") Тогда
@@ -181,7 +181,7 @@
КонецЕсли; КонецЕсли;
ОтключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм"); ОтключитьОбработчикОжидания("ПриИзмененииСоставаИлиНастроекПрограмм");
КонецПроцедуры КонецПроцедуры
@@ -4111,7 +4111,7 @@
#Область ПрограммыРаботыЭП #Область ПрограммыРаботыЭП
&НаКлиенте &НаКлиенте
Процедура ПриИзмененияСоставаИлиНастроекПрограмм() Процедура ПриИзмененииСоставаИлиНастроекПрограмм()
Если Не ЗаполнитьСписокПрограмм() Тогда Если Не ЗаполнитьСписокПрограмм() Тогда
Возврат; Возврат;
@@ -0,0 +1,65 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html;charset=utf-8" http-equiv="content-type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16421"></meta><style>H1 {
TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; COLOR: #003366; FONT-SIZE: 18pt; FONT-WEIGHT: bold
}
.Programtext {
FONT-FAMILY: Courier; COLOR: #000080; FONT-SIZE: 10pt
}
H3 {
TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 11pt; FONT-WEIGHT: bold
}
H4 {
TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 10pt; FONT-WEIGHT: bold
}
BODY {
FONT-FAMILY: Verdana; FONT-SIZE: 8pt
}
</style></head><body>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1;"><b><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 24pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-font-kerning: 18.0pt; mso-fareast-language: RU;">Порядок обновления на новую
версию 1С:Предприятия 8.3</span></b></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3;"><b><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 13.5pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">1. Скачать дистрибутив 1С:Предприятия 8.3</span></b></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Скачайте
дистрибутив последней версии <a href="https://users.v8.1c.ru/distribution/project/Platform83"><span style="color: blue;">платформы 1С:Предприятия 8.3</span></a> в сервисе <b>1С:Обновление
программ</b>. При необходимости укажите логин и пароль.</span></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Далее
следует выбрать актуальную (последнюю официально опубликованную) версию <b>Технологической
платформы 8.3.</b></span></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Для
скачивания файла нажмите на гиперссылку, которая соответствует вашей
операционной системе:</span></p>
<ul type="disc"><li style="margin: 0cm 0cm 8pt; color: rgb(0, 0, 0); line-height: normal; font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; font-style: normal; font-weight: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Технологическая платформа
1С:Предприятия для Windows</span></li>
<li style="margin: 0cm 0cm 8pt; color: rgb(0, 0, 0); line-height: normal; font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; font-style: normal; font-weight: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Технологическая платформа
1С:Предприятия для Linux</span></li>
<li style="margin: 0cm 0cm 8pt; color: rgb(0, 0, 0); line-height: normal; font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; font-style: normal; font-weight: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Клиент 1С:Предприятия для macOS</span></li>
</ul><p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Далее по
ссылке <b>Скачать дистрибутив</b> откроется диалог сохранения файла на
компьютер. Запомните папку, в которую его сохранили.</span></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3;"><b><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 13.5pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">2. Установить новую версию 1С:Предприятия 8.3</span></b></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Если у вас
операционная система Microsoft Windows, то обратите внимание: для
установки программы пользователь Windows должен обладать правами
администратора. Распакуйте загруженный файл с архивом. В папке, в которую
распаковали архив, запустите файл <b>Setup.exe</b> и  следуйте инструкциям
программы-установщика.</span></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3;"><b><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 13.5pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">3. Создать резервную копию информационной базы</span></b></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">Запустите
1С: Предприятие<b>.</b> В открывшемся окне <b>Запуск 1С: Предприятия</b> определите
и откройте папку, в которой находится нужная информационная база. Затем
скопируйте файл 1Cv8.1CD в безопасное место.</span></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3;"><b><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 13.5pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">4. Начало работы с новой версией платформы</span></b></p>
<p style="margin: 0cm 0cm 8pt; line-height: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: &quot;Times New Roman&quot;,serif; font-size: 12pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: RU;">По кнопке <b>1С:Предприятие</b>
можно начать работы с выбранной информационной базой на новой версии платформы.</span></p><p style="margin: 0cm 0cm 8pt;"><br></p>
</body></html>
@@ -1,40 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html;charset=utf-8" http-equiv="content-type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16421"></meta><style>H1 {
TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; COLOR: #003366; FONT-SIZE: 18pt; FONT-WEIGHT: bold
}
.Programtext {
FONT-FAMILY: Courier; COLOR: #000080; FONT-SIZE: 10pt
}
H3 {
TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 11pt; FONT-WEIGHT: bold
}
H4 {
TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 10pt; FONT-WEIGHT: bold
}
BODY {
FONT-FAMILY: Verdana; FONT-SIZE: 8pt
}
</style></head><body>
<h1>Порядок обновления на новую версию 1С:Предприятия 8.3</h1>
<h3>1. Скачать дистрибутив 1С:Предприятия 8.3</h3>
<p>Скачайте дистрибутив последней версии <a href="https://users.v8.1c.ru/distribution/project/Platform83">платформы 1С:Предприятия 8.3</a> в сервисе "1С:Обновление программ" на портале 1С:ИТС (<a href="https://portal.1c.ru/">portal.1c.ru</a>). При необходимости </p>
<p>укажите логин и пароль.</p>
<p><img src="_files/pic02.jpg"></img></p>
<p>Далее следует выбрать актуальную (последнюю официально опубликованную) версию технологической платформы</p>
<p><img src="_files/pic03.jpg"></img></p>
<p>Для скачивания файла перейдите в раздел «Технологическая платформа 1С:Предприятия для Windows»:</p>
<p><img src="_files/pic04.jpg"></img></p>
<p>Далее, по ссылке "Скачать дистрибутив" откроется диалог сохранения файла на диск. Запомните папку, в которую его сохранили:</p>
<p><img src="_files/pic05_2.jpg"></img></p>
<p></p>
<h3>2. Установить новую версию 1С:Предприятия 8.3</h3>
<p>Обратите внимание: для установки программы пользователь Windows должен обладать правами администратора! Распакуйте загруженный файл с архивом. В папке, в которую распаковали архив, найдите и запустите файл Setup.exe:</p>
<p><img src="_files/pic06.jpg"></img></p>
<p>Далее следуйте инструкциям программы-установщика:</p>
<p><img src="_files/pic07.jpg"></img></p>
<p></p>
<h3>3. Создать резервную копию информационной базы</h3>
<p>Определите и откройте каталог, в котором находится нужная база данных:</p>
<p><img src="_files/pic08_2.jpg"></img></p>
<p><img src="_files/pic09.jpg"></img></p>
<h3>4. Начало работы с новой версией платформы</h3>
<p>По кнопке "1С:Предприятие" можно начать работы с выбранной информационной базой на новой версии платформы.</p></body></html>
@@ -29,10 +29,10 @@
<usePurposes>MobileDevice</usePurposes> <usePurposes>MobileDevice</usePurposes>
</forms> </forms>
<templates uuid="5c4ecf15-b92d-4610-b2bb-f2331c5c7528"> <templates uuid="5c4ecf15-b92d-4610-b2bb-f2331c5c7528">
<name>ПорядокОбновленияДляФайловойБазы_ru</name> <name>ПорядокОбновленияДляФайловойБазы</name>
<synonym> <synonym>
<key>ru</key> <key>ru</key>
<value>Порядок обновления для файловой базы ru</value> <value>Порядок обновления для файловой базы</value>
</synonym> </synonym>
<templateType>HTMLDocument</templateType> <templateType>HTMLDocument</templateType>
</templates> </templates>
@@ -57,6 +57,13 @@
Элементы.ГруппаОбработкаГрупповоеИзменениеОбъектов.Видимость = Ложь; Элементы.ГруппаОбработкаГрупповоеИзменениеОбъектов.Видимость = Ложь;
КонецЕсли; КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда
МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ");
Элементы.ОбработкаБлокировкаСоединенийСИнформационнойБазойОткрыть.Видимость = МодульСоединенияИБ.ПодсистемаИспользуется();
Иначе
Элементы.ОбработкаБлокировкаСоединенийСИнформационнойБазойОткрыть.Видимость = Ложь;
КонецЕсли;
Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда
Элементы.ГруппаПоискИУдалениеДублей.Видимость = Ложь; Элементы.ГруппаПоискИУдалениеДублей.Видимость = Ложь;
КонецЕсли; КонецЕсли;
@@ -50,9 +50,7 @@ TD {
</li> </li>
<li><strong>Шифрование</strong> - включите флажок, для того чтобы разрешить шифрование файлов. <li><strong>Шифрование</strong> - включите флажок, для того чтобы разрешить шифрование файлов.
</li> </li>
<li><a href="CommonForm.НастройкиЭлектроннойПодписиИШифрования/Help">Сертификаты и программы электронной подписи и шифрования</a> - переход к настройке параметров подключения средств криптографии: электронной подписи и шифрования. </li> <li><a href="CommonForm.НастройкиЭлектроннойПодписиИШифрования/Help">Настройки электронной подписи и шифрования</a> - переход к настройке параметров подключения средств криптографии: электронной подписи и шифрования. </li>
<li><strong>Проверять подписи и сертификаты на сервере</strong> - В этом случае проверка электронной подписи и сертификата будет происходить на сервере или веб-сервере, что позволяет не устанавливать программу на каждом компьютере, где требуются только такие операции.</li>
<li><b>Подписывать и шифровать на сервере</b> - позволяет не устанавливать программу криптографии на компьютер пользователя для подписания, шифрования и расшифровки. В этом случае необходимо установить программу криптографии и сертификат с закрытым ключом на компьютере, где работает сервер 1С:Предприятия или веб-сервер.</li>
<a name="СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS"></a> <a name="СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS"></a>
<li><b>Использовать сервис DSS</b> - включите флажок, для того чтобы разрешить использовать электронную подпись сервиса DSS и для операций криптографии сервиса DSS. После этого в списке <b>Настройки электронной подписи и шифрования</b> можно добавить учетные записи DSS, а также становятся доступными команды:</li> <li><b>Использовать сервис DSS</b> - включите флажок, для того чтобы разрешить использовать электронную подпись сервиса DSS и для операций криптографии сервиса DSS. После этого в списке <b>Настройки электронной подписи и шифрования</b> можно добавить учетные записи DSS, а также становятся доступными команды:</li>
<li><a href="DataProcessor.УправлениеПодключениемDSS.Form.СписокЭкземпляровСервераDSS/Help">Серверы DSS</a> - переход к настройке серверов DSS.</li> <li><a href="DataProcessor.УправлениеПодключениемDSS.Form.СписокЭкземпляровСервераDSS/Help">Серверы DSS</a> - переход к настройке серверов DSS.</li>
@@ -124,7 +124,6 @@
ОтключитьОбработчикОжидания("ИстечениеВремениОжидания"); ОтключитьОбработчикОжидания("ИстечениеВремениОжидания");
ОтключитьОбработчикОжидания("ПроверкаНаЕдинственностьПодключения"); ОтключитьОбработчикОжидания("ПроверкаНаЕдинственностьПодключения");
ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей");
Если ВыполняетсяРезервноеКопирование = Истина Тогда Если ВыполняетсяРезервноеКопирование = Истина Тогда
Возврат; Возврат;
@@ -279,7 +278,7 @@
УстановитьЗаголовокКнопкиДалее(Истина); УстановитьЗаголовокКнопкиДалее(Истина);
СоединенияИБВызовСервера.УстановитьБлокировкуСоединений( СоединенияИБВызовСервера.УстановитьБлокировкуСоединений(
НСтр("ru = 'Выполняется восстановление информационной базы.'"), НСтр("ru = 'Выполняется резервное копирование информационной базы.'"),
"РезервноеКопирование"); "РезервноеКопирование");
Если КоличествоСеансовИнформационнойБазы = 1 Тогда Если КоличествоСеансовИнформационнойБазы = 1 Тогда
@@ -633,7 +632,7 @@
#КонецЕсли #КонецЕсли
&НаСервере &НаСервере
Функция СформироватьТекстСкриптов(Знач ПараметрыСкрипта, Знач СообщенияДляЖурналаРегистрации) Функция СформироватьТекстСкриптов(Знач ПараметрыСкрипта, СообщенияДляЖурналаРегистрации)
ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации);
@@ -444,20 +444,12 @@
ИначеЕсли Результат.Статус = "Выполнено" Тогда ИначеЕсли Результат.Статус = "Выполнено" Тогда
РезультатОбновления = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); УточнитьРезультатВыполнения(Результат.АдресРезультата,
Если ТипЗнч(РезультатОбновления) = Тип("Структура") Тогда Результат.КраткоеПредставлениеОшибки,
Если РезультатОбновления.Свойство("КраткоеПредставлениеОшибки") Результат.ПодробноеПредставлениеОшибки,
И РезультатОбновления.Свойство("ПодробноеПредставлениеОшибки") Тогда ПризнакВыполненияОбработчиков,
Результат.КраткоеПредставлениеОшибки = РезультатОбновления.КраткоеПредставлениеОшибки; ПрогрессВыполнения);
Результат.ПодробноеПредставлениеОшибки = РезультатОбновления.ПодробноеПредставлениеОшибки;
Иначе
ПризнакВыполненияОбработчиков = РезультатОбновления.Результат;
УстановитьПараметрыСеансаИзФоновогоЗадания(РезультатОбновления.ПараметрыКлиентаНаСервере);
ПрогрессВыполнения = 100;
КонецЕсли;
Иначе
ПризнакВыполненияОбработчиков = РезультатОбновления;
КонецЕсли;
ОбработатьОшибкуПравилРегистрации(Результат.Сообщения); ОбработатьОшибкуПравилРегистрации(Результат.Сообщения);
Иначе // ошибка Иначе // ошибка
@@ -848,9 +840,24 @@
КонецПроцедуры КонецПроцедуры
&НаСервереБезКонтекста &НаСервереБезКонтекста
Процедура УстановитьПараметрыСеансаИзФоновогоЗадания(ПараметрыКлиентаНаСервере) Процедура УточнитьРезультатВыполнения(АдресРезультата, КраткоеПредставлениеОшибки,
ПодробноеПредставлениеОшибки, ПризнакВыполненияОбработчиков, ПрогрессВыполнения)
РезультатОбновления = ПолучитьИзВременногоХранилища(АдресРезультата);
Если ТипЗнч(РезультатОбновления) = Тип("Структура") Тогда
Если РезультатОбновления.Свойство("КраткоеПредставлениеОшибки")
И РезультатОбновления.Свойство("ПодробноеПредставлениеОшибки") Тогда
КраткоеПредставлениеОшибки = РезультатОбновления.КраткоеПредставлениеОшибки;
ПодробноеПредставлениеОшибки = РезультатОбновления.ПодробноеПредставлениеОшибки;
Иначе
ПризнакВыполненияОбработчиков = РезультатОбновления.Результат;
ПрогрессВыполнения = 100;
КонецЕсли;
Иначе
ПризнакВыполненияОбработчиков = РезультатОбновления;
КонецЕсли;
ПараметрыСеанса.ПараметрыКлиентаНаСервере = ПараметрыКлиентаНаСервере; ОбновлениеИнформационнойБазыСлужебный.УстановитьЗапускОбновленияИнформационнойБазы(Ложь);
ПараметрыСеанса.ВыполняетсяОбновлениеИБ = Ложь; ПараметрыСеанса.ВыполняетсяОбновлениеИБ = Ложь;
КонецПроцедуры КонецПроцедуры
@@ -299,6 +299,7 @@
НельзяУдалятьОсновнойОбъект = Ложь; НельзяУдалятьОсновнойОбъект = Ложь;
НеудаленныеЭлементы = Новый Массив; НеудаленныеЭлементы = Новый Массив;
ТранзакцияОтменена = Ложь;
НачатьТранзакцию(); НачатьТранзакцию();
Попытка Попытка
@@ -312,6 +313,11 @@
МестаИспользования.Скопировать(Фильтр), МестаИспользования.Скопировать(Фильтр),
НеудаленныеЭлементы); НеудаленныеЭлементы);
Если РезультатУдаления.ИнформацияОбОшибке <> Неопределено Тогда
ОтменитьТранзакцию();
ТранзакцияОтменена = Истина;
КонецЕсли;
ОтразитьРезультатУдаленияЭлементаПакета( ОтразитьРезультатУдаленияЭлементаПакета(
ПараметрыУдаления, ПараметрыУдаления,
РезультатОбработкиПакета, РезультатОбработкиПакета,
@@ -343,14 +349,18 @@
КонецЦикла; КонецЦикла;
Если НЕ НельзяУдалятьОсновнойОбъект Тогда Если Не ТранзакцияОтменена Тогда
ЗафиксироватьТранзакцию(); Если НЕ НельзяУдалятьОсновнойОбъект Тогда
Иначе ЗафиксироватьТранзакцию();
Иначе
ОтменитьТранзакцию();
КонецЕсли;
КонецЕсли;
Исключение
Если Не ТранзакцияОтменена Тогда
ОтменитьТранзакцию(); ОтменитьТранзакцию();
КонецЕсли; КонецЕсли;
Исключение
ОтменитьТранзакцию();
ВызватьИсключение; ВызватьИсключение;
КонецПопытки; КонецПопытки;
@@ -897,6 +897,9 @@
<content> <content>
<mdObject>Constant.СписокЗапрещенныхРасширений</mdObject> <mdObject>Constant.СписокЗапрещенныхРасширений</mdObject>
</content> </content>
<content>
<mdObject>InformationRegister.ПериодическиеСерверныеОповещения</mdObject>
</content>
<content> <content>
<mdObject>InformationRegister.СвязиАдресныхОбъектов</mdObject> <mdObject>InformationRegister.СвязиАдресныхОбъектов</mdObject>
</content> </content>
@@ -957,6 +960,9 @@
<content> <content>
<mdObject>InformationRegister.БуферОперацийСтатистики</mdObject> <mdObject>InformationRegister.БуферОперацийСтатистики</mdObject>
</content> </content>
<content>
<mdObject>InformationRegister.ОтправленныеСерверныеОповещения</mdObject>
</content>
<content> <content>
<mdObject>Constant.ПараметрыЦентраМониторинга</mdObject> <mdObject>Constant.ПараметрыЦентраМониторинга</mdObject>
</content> </content>
@@ -842,18 +842,18 @@
&НаКлиенте &НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Статус = "Выполняется" Тогда Если Результат.Статус = "Выполняется"
И Результат.Прогресс <> Неопределено Тогда
Прогресс = ПрочитатьПрогресс(Результат.ИдентификаторЗадания); Прогресс = Результат.Прогресс; // См. ДлительныеОперации.ПрочитатьПрогресс
Если Прогресс <> Неопределено Тогда Если Прогресс.Свойство("Процент")
Если Прогресс.Свойство("Процент") И Прогресс.Свойство("ДополнительныеПараметры")
И Прогресс.Свойство("ДополнительныеПараметры") И СтрСравнить(Прогресс.ДополнительныеПараметры, "ПрогрессМногопоточногоПроцесса") = 0 Тогда
И СтрСравнить(Прогресс.ДополнительныеПараметры, "ПрогрессМногопоточногоПроцесса") = 0 Тогда
ПрогрессЗагрузки = Прогресс.Процент; ПрогрессЗагрузки = Прогресс.Процент;
Иначе Иначе
ТекстСостоянияЗагрузки = Прогресс.Текст; ТекстСостоянияЗагрузки = Прогресс.Текст;
КонецЕсли;
КонецЕсли; КонецЕсли;
КонецЕсли; КонецЕсли;
@@ -899,6 +899,7 @@
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка адресного классификатора с сайта'"); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка адресного классификатора с сайта'");
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыЗагрузки = АдресныйКлассификаторСлужебный.ПараметрыЗагрузкиКлассификатораАдресов(); ПараметрыЗагрузки = АдресныйКлассификаторСлужебный.ПараметрыЗагрузкиКлассификатораАдресов();
ПараметрыЗагрузки.ЗагружатьИсториюАдресов = ЗагружатьИсторию; ПараметрыЗагрузки.ЗагружатьИсториюАдресов = ЗагружатьИсторию;
@@ -965,6 +966,7 @@
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка адресного классификатора с сайта'"); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка адресного классификатора с сайта'");
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыЗагрузки = АдресныйКлассификаторСлужебный.ПараметрыЗагрузкиКлассификатораАдресов(); ПараметрыЗагрузки = АдресныйКлассификаторСлужебный.ПараметрыЗагрузкиКлассификатораАдресов();
ПараметрыЗагрузки.ЗагружатьИсториюАдресов = ЗагружатьИсториюИзмененийАдресныхОбъектов; ПараметрыЗагрузки.ЗагружатьИсториюАдресов = ЗагружатьИсториюИзмененийАдресныхОбъектов;
@@ -991,11 +993,6 @@
КонецФункции КонецФункции
&НаСервереБезКонтекста
Функция ПрочитатьПрогресс(ИдентификаторЗадания)
Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
КонецФункции
&НаСервереБезКонтекста &НаСервереБезКонтекста
Функция ДанныеАутентификацииСайтаСохранены() Функция ДанныеАутентификацииСайтаСохранены()
Loaded 100 of 164 files, more files were not shown because too many files have changed in this diff. Show more