Files
SSL/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl
T
2023-09-14 15:01:00 +03:00

4549 lines
315 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// Вызов этой процедуры необходимо разместить в модуле сеанса в процедуре УстановкаПараметровСеанса
// согласно документации.
//
// Параметры:
// ИменаПараметровСеанса - Массив
// - Неопределено - имена параметров сеанса для инициализации.
// Массив устанавливаемых идентификаторов параметров сеанса,
// которые нужно инициализировать, если обработчик вызывается
// перед использованием неинициализированных параметров сеанса.
// Неопределено, если обработчик события вызывается системой при начале сеанса.
//
// Возвращаемое значение:
// Массив - имена параметров сеанса, значения которых были успешно установлены.
//
Функция УстановкаПараметровСеанса(ИменаПараметровСеанса) Экспорт
// Параметры сеанса, инициализация которых требует обращения к одним и тем же данным
// следует инициализировать сразу группой. Для того, чтобы избежать их повторной инициализации,
// имена уже установленных параметров сеанса сохраняются в массиве УстановленныеПараметры.
УстановленныеПараметры = Новый Массив;
Если ИменаПараметровСеанса <> Неопределено
И ИменаПараметровСеанса.Найти("ПараметрыКлиентаНаСервере") <> Неопределено Тогда
ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(Новый Соответствие);
УстановленныеПараметры.Добавить("ПараметрыКлиентаНаСервере");
Если ИменаПараметровСеанса.Количество() = 1 Тогда
Возврат УстановленныеПараметры;
КонецЕсли;
КонецЕсли;
Если ИменаПараметровСеанса = Неопределено Тогда
Если ПараметрыСеанса.ПараметрыКлиентаНаСервере.Количество() = 0 Тогда
НезаполненныеПараметрыКлиента = Новый Соответствие;
НезаполненныеПараметрыКлиента.Вставить("ПервыйСерверныйВызовВыполнен",
?(ТекущийРежимЗапуска() = Неопределено, Неопределено, Ложь));
НезаполненныеПараметрыКлиента.Вставить("СостояниеДоВызоваАвторизоватьТекущегоПользователя", Истина);
ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(НезаполненныеПараметрыКлиента);
КонецЕсли;
Справочники.ВерсииРасширений.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
МодульМультиязычностьСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры);
КонецЕсли;
// При установке соединения с информационной базой до вызова всех остальных обработчиков.
ПередЗапускомПрограммы();
Возврат УстановленныеПараметры;
КонецЕсли;
Если Справочники.ИдентификаторыОбъектовМетаданных.ВсеПараметрыСеансаУстановлены(
ИменаПараметровСеанса, УстановленныеПараметры) Тогда
Возврат УстановленныеПараметры;
КонецЕсли;
Если ИменаПараметровСеанса.Найти("КлючДанныхПовторногоИспользования") <> Неопределено Тогда
ПараметрыСеанса.КлючДанныхПовторногоИспользования = Новый УникальныйИдентификатор;
УстановленныеПараметры.Добавить("КлючДанныхПовторногоИспользования");
КонецЕсли;
Справочники.ВерсииРасширений.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
МодульМультиязычностьСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры);
КонецЕсли;
Если ИменаПараметровСеанса.Найти("БуферОбмена") <> Неопределено Тогда
ПараметрыСеанса.БуферОбмена = Новый ФиксированнаяСтруктура(Новый Структура("Источник, Данные"));
УстановленныеПараметры.Добавить("БуферОбмена");
КонецЕсли;
Обработчики = Новый Соответствие;
ИнтеграцияПодсистемБСП.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики);
ОбработчикиСобственные = Новый Соответствие;
ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса(ОбработчикиСобственные);
Для Каждого Запись Из ОбработчикиСобственные Цикл
Обработчики.Вставить(Запись.Ключ, Запись.Значение);
КонецЦикла;
ВыполнитьОбработчикиУстановкиПараметровСеанса(ИменаПараметровСеанса, Обработчики, УстановленныеПараметры);
ИнтеграцияПодсистемБСП.ПриУстановкеПараметровСеанса(ИменаПараметровСеанса);
Возврат УстановленныеПараметры;
КонецФункции
// Возвращает признак того, является ли конфигурация базовой.
// Базовые версии конфигураций могут иметь программные ограничения, действие которых
// можно предусмотреть с помощью этой функции.
// Конфигурация считается базовой, если в ее имени есть термин "Базовая",
// например, "УправлениеТорговлейБазовая".
//
// Возвращаемое значение:
// Булево - Истина, если конфигурация - базовая.
//
Функция ЭтоБазоваяВерсияКонфигурации() Экспорт
ЭтоБазоваяВерсияКонфигурации = СтрНайти(ВРег(Метаданные.Имя), НСтр("ru = 'БАЗОВАЯ'")) > 0;
ОбщегоНазначенияПереопределяемый.ПриОпределенииПризнакаЭтоБазоваяВерсияКонфигурации(ЭтоБазоваяВерсияКонфигурации);
Возврат ЭтоБазоваяВерсияКонфигурации;
КонецФункции
// Обновляет кэши свойств метаданных, позволяющие ускорить
// открытие сеанса, а также обновление ИБ, особенно в модели сервиса.
// Их обновление происходит до обновления ИБ.
//
// Для использования в других библиотеках и конфигурациях.
//
Процедура ОбновитьВсеПараметрыРаботыПрограммы() Экспорт
РегистрыСведений.ПараметрыРаботыПрограммы.ОбновитьВсеПараметрыРаботыПрограммы();
КонецПроцедуры
// Возвращает номер версии "Библиотеки стандартных подсистем" (БСП),
// встроенной в конфигурацию.
//
// Возвращаемое значение:
// Строка - версия БСП, например "1.0.1.1".
//
Функция ВерсияБиблиотеки() Экспорт
Возврат СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам["СтандартныеПодсистемы"].Версия;
КонецФункции
// Получает уникальный идентификатор информационной базы,
// с помощью которого можно различать различные экземпляры информационных баз,
// например, при сборе статистики или в механизмах внешнего управления базами.
// Если идентификатор не заполнен, то его значение автоматически устанавливается и возвращается.
//
// Идентификатор хранится в константе ИдентификаторИнформационнойБазы.
// Константа ИдентификаторИнформационнойБазы не должна входить в составы планов обмена, чтобы иметь
// различные значения в каждой информационной базе (узле РИБ).
//
// Возвращаемое значение:
// Строка - идентификатор информационной базы.
//
Функция ИдентификаторИнформационнойБазы() Экспорт
ИдентификаторИнформационнойБазы = Константы.ИдентификаторИнформационнойБазы.Получить();
Если ПустаяСтрока(ИдентификаторИнформационнойБазы) Тогда
ИдентификаторИнформационнойБазы = Строка(Новый УникальныйИдентификатор());
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Константы.ИдентификаторИнформационнойБазы.Установить(ИдентификаторИнформационнойБазы);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецЕсли;
Возврат ИдентификаторИнформационнойБазы;
КонецФункции
// Возвращает сохраненные в информационной базы параметры администрирования.
// Предназначена для использования в механизмах, требующих для свой работы
// ввода параметров администрирования информационной базы и/или кластера серверов.
// Например, блокировка установки соединений с информационной базой.
// См. так же УстановитьПараметрыАдминистрирования.
//
// Возвращаемое значение:
// Структура - содержит свойства двух структур
// АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
// и АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера.
// При этом поля, содержащие пароли, возвращаются пустыми. Если параметры администрирования
// не были ранее сохранены при помощи функции УстановитьПараметрыАдминистрирования,
// то будут возвращены автоматически вычисленные параметры администрирования по умолчанию.
//
Функция ПараметрыАдминистрирования() Экспорт
Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции'");
КонецЕсли;
Иначе
Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда
ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции'");
КонецЕсли;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ПараметрыАдминистрированияИБ = Константы.ПараметрыАдминистрированияИБ.Получить().Получить();
ПараметрыАдминистрированияПоУмолчанию = ПараметрыАдминистрированияПоУмолчанию();
Если ТипЗнч(ПараметрыАдминистрированияИБ) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(ПараметрыАдминистрированияПоУмолчанию, ПараметрыАдминистрированияИБ);
КонецЕсли;
ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияПоУмолчанию;
Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
ПрочитатьПараметрыИзСтрокиСоединения(ПараметрыАдминистрированияИБ);
КонецЕсли;
Возврат ПараметрыАдминистрированияИБ;
КонецФункции
// Сохраняет параметры администрирования информационной базы и кластера серверов.
// При сохранении поля, содержащие пароли, будут очищены в целях безопасности.
//
// Параметры:
// ПараметрыАдминистрированияИБ - см. ПараметрыАдминистрирования
//
// Пример:
// ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования();
// // Вывод параметров администрирования администратору для подтверждения корректности и ввода паролей.
// // Далее выполнение действий, связанных с подключением к кластеру серверов.
// СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(ПараметрыАдминистрирования);
//
Процедура УстановитьПараметрыАдминистрирования(ПараметрыАдминистрированияИБ) Экспорт
ПараметрыАдминистрированияИБ.ПарольАдминистратораКластера = "";
ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы = "";
Константы.ПараметрыАдминистрированияИБ.Установить(Новый ХранилищеЗначения(ПараметрыАдминистрированияИБ));
КонецПроцедуры
// Устанавливает представление поля Дата в списках, содержащих реквизит с составом даты Дата и время.
// Подробнее см. стандарт "Поле "Дата" в списках".
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма со списком.
// ПолноеИмяРеквизита - Строка - полный путь к реквизиту типа "Дата" в формате "<ИмяСписка>.<ИмяПоля>".
// ИмяЭлемента - Строка - имя элемента формы, связанного с реквизитом списка типа "Дата".
//
// Пример:
//
// Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект);
//
Процедура УстановитьУсловноеОформлениеПоляДата(Форма,
ПолноеИмяРеквизита = "Список.Дата", ИмяЭлемента = "Дата") Экспорт
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
"СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата",
"ЭтотОбъект",
Форма,
Тип("ФормаКлиентскогоПриложения"));
ЧастиПолногоИмени = СтрРазделить(ПолноеИмяРеквизита, ".");
Если ЧастиПолногоИмени.Количество() <> 2 Тогда
// Недопустимое значение параметра ПолноеИмяРеквизита.
// Имя реквизита должно быть в формате ""<ИмяСписка>.<ИмяПоля>""'");
Возврат;
КонецЕсли;
ИмяСписка = ЧастиПолногоИмени[0];
РеквизитСписок = Форма[ИмяСписка];
Если ТипЗнч(РеквизитСписок) = Тип("ДинамическийСписок") Тогда
// ДинамическийСписок позволяет установить условное оформление с помощью собственного компоновщика.
// При этом параметр ИмяЭлемента игнорируется, потому что компоновщик динамического списка
// не знает как будут отображены реквизиты списка, потому путем к реквизиту и значения отбора и оформления
// является имя реквизита динамического списка.
УсловноеОформление = РеквизитСписок.УсловноеОформление;
ПутьКРеквизиту = ЧастиПолногоИмени[1];
ИмяОформляемогоПоля = ПутьКРеквизиту;
Иначе
// Остальные списки, например, ДанныеФормыДерево:
// не имеют собственного компоновщика, потому используют компоновщик самой формы.
УсловноеОформление = Форма.УсловноеОформление;
ПутьКРеквизиту = ПолноеИмяРеквизита;
ИмяОформляемогоПоля = ИмяЭлемента;
КонецЕсли;
Если Не ЗначениеЗаполнено(УсловноеОформление.ИдентификаторПользовательскойНастройки) Тогда
УсловноеОформление.ИдентификаторПользовательскойНастройки = "ОсновноеОформление";
КонецЕсли;
// Представление даты.
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", "ДЛФ=D");
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяОформляемогоПоля);
// Представление даты сегодня.
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", НСтр("ru = 'ДФ=ЧЧ:мм'"));
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяОформляемогоПоля);
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКРеквизиту);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоЭтогоДня);
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКРеквизиту);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоСледующегоДня);
КонецПроцедуры
// Получает настройку необходимости выводить подтверждение при завершении работы программы
// для текущего пользователя. Предназначена для использования в форме персональных настроек
// пользователя. Пример использования см. в общей форме _ДемоМоиНастройки.
//
// Возвращаемое значение:
// Булево - если Истина, то пользователю при закрытии программы будет показано
// окно с подтверждением завершения сеанса.
//
Функция ЗапрашиватьПодтверждениеПриЗавершенииПрограммы() Экспорт
Результат = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"ОбщиеНастройкиПользователя",
"ЗапрашиватьПодтверждениеПриЗавершенииПрограммы");
Если Результат = Неопределено Тогда
Результат = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности().ЗапрашиватьПодтверждениеПриЗавершенииПрограммы;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает описания форматов сохранения табличного документа.
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * ТипФайлаТабличногоДокумента - ТипФайлаТабличногоДокумента - значение, соответствующее формату;
// * Ссылка - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на метаданные, где хранится представление;
// * Представление - Строка - представление типа файла (заполняется из перечисления);
// * Расширение - Строка - тип файла для операционной системы;
// * Картинка - Картинка - картинка формата.
//
Функция НастройкиФорматовСохраненияТабличногоДокумента() Экспорт
ТаблицаФорматов = Новый ТаблицаЗначений;
ТаблицаФорматов.Колонки.Добавить("ТипФайлаТабличногоДокумента", Новый ОписаниеТипов("ТипФайлаТабличногоДокумента"));
ТаблицаФорматов.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("ПеречислениеСсылка.ФорматыСохраненияОтчетов"));
ТаблицаФорматов.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
ТаблицаФорматов.Колонки.Добавить("Расширение", Новый ОписаниеТипов("Строка"));
ТаблицаФорматов.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка"));
// Документ PDF (.pdf)
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокументаPDF();
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.PDF;
НовыйФормат.Расширение = "pdf";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматPDF;
НовыйФормат.Представление = ПредставлениеТипаФайлаТабличногоДокументаPDF();
// Табличный документ (.mxl)
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.MXL;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.MXL;
НовыйФормат.Расширение = "mxl";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматMXL;
// Лист Microsoft Excel 2007 (.xlsx)
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.XLSX;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.XLSX;
НовыйФормат.Расширение = "xlsx";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматExcel2007;
// Лист Microsoft Excel 97-2003 (.xls)
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.XLS;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.XLS;
НовыйФормат.Расширение = "xls";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматExcel;
// Электронная таблица OpenDocument (.ods).
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.ODS;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.ODS;
НовыйФормат.Расширение = "ods";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматOpenOfficeCalc;
// Документ Word 2007 (.docx)
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.DOCX;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.DOCX;
НовыйФормат.Расширение = "docx";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматWord2007;
// Веб-страница (.html)
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.HTML5;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.HTML;
НовыйФормат.Расширение = "html";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматHTML;
// Текстовый документ UTF-8 (.txt).
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.TXT;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.TXT;
НовыйФормат.Расширение = "txt";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматTXT;
// Текстовый документ ANSI (.txt).
НовыйФормат = ТаблицаФорматов.Добавить();
НовыйФормат.ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.ANSITXT;
НовыйФормат.Ссылка = Перечисления.ФорматыСохраненияОтчетов.ANSITXT;
НовыйФормат.Расширение = "txt";
НовыйФормат.Картинка = БиблиотекаКартинок.ФорматTXT;
Для Каждого ФорматСохранения Из ТаблицаФорматов Цикл
Если Не ЗначениеЗаполнено(ФорматСохранения.Представление) Тогда
ФорматСохранения.Представление = Строка(ФорматСохранения.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат ТаблицаФорматов;
КонецФункции
// Возвращает версию режима совместимости в формате нумерации редакций и версий, например, 8.3.15.0.
//
// Возвращаемое значение:
// Строка - версия режима совместимости в формате нумерации редакций и версий.
//
Функция ВерсияРежимаСовместимости() Экспорт
Если Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
Информация = Новый СистемнаяИнформация;
Возврат Информация.ВерсияПриложения;
КонецЕсли;
ОписаниеРежимаСовместимости = СтрРазделить(Метаданные.РежимСовместимости, "_");
Символов = СтрДлина(ОписаниеРежимаСовместимости[0]);
НомерРедакции = "";
Для НомерСимвола = 1 По Символов Цикл
ТекущийСимвол = Сред(ОписаниеРежимаСовместимости[0], НомерСимвола, 1);
Если СтрНайти("0123456789", ТекущийСимвол) > 0 Тогда
НомерРедакции = НомерРедакции + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
ОписаниеРежимаСовместимости.Установить(0, НомерРедакции);
Для Индекс = ОписаниеРежимаСовместимости.Количество() По 3 Цикл
ОписаниеРежимаСовместимости.Добавить("0");
КонецЦикла;
Возврат СтрСоединить(ОписаниеРежимаСовместимости, ".");
КонецФункции
#Область УстаревшиеПроцедурыИФункции
// Устарела. Веб-клиент более не поддерживает конфигурации, которые используют интерфейс версии 8.2.
// При работе в веб-клиенте отключена возможность переключения интерфейса
// между интерфейсом версии 8.2 и интерфейсом Такси.
//
// Устанавливает жирное оформление шрифта заголовков групп формы для их корректного отображения в интерфейсе 8.2.
// В интерфейсе "Такси" заголовки групп с обычным выделением и без выделения выводятся большим шрифтом.
// В интерфейсе 8.2 такие заголовки выводятся как обычные надписи и не ассоциируются с заголовками.
// Эта функция предназначена для визуального выделения (жирным шрифтом) заголовков групп в режиме интерфейса 8.2.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма для изменения шрифта заголовков групп;
// ИменаГрупп - Строка - список имен групп формы, разделенных запятыми. Если имена групп не указаны,
// то оформление будет применено ко всем группам на форме.
//
// Пример:
// Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект);
//
Процедура УстановитьОтображениеЗаголовковГрупп(Форма, ИменаГрупп = "") Экспорт
// Ничего не выполняется.
КонецПроцедуры
#КонецОбласти
// Возвращает признак необходимости показа всплывающего уведомления об установленных
// обновлениях программы - динамическом обновлении программы, новых патчей и расширений.
//
// Возвращаемое значение:
// Булево - если Истина, то всплывающие уведомления включены.
//
Функция ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы() Экспорт
Возврат ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммыДляПользователя();
КонецФункции
#Область ДляВызоваИзДругихПодсистем
// Вызывается из регламентного задания для отправки серверного оповещения клиентским сеансам.
// Смотри также СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения.
//
// Вызов выполняется в привилегированном режиме с учетом истечения периода, указанного для оповещения.
// Смотри ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений.
//
// Параметры:
// ИмяОповещения - Строка - смотри СерверныеОповещения.НовоеСерверноеОповещение.Имя
// ВариантыПараметров - Массив из Структура:
// * Параметры - Произвольный - смотри СерверныеОповещения.НовоеСерверноеОповещение.Параметры
// * Адресаты - Соответствие из КлючИЗначение:
// ** Ключ - УникальныйИдентификатор - идентификатор пользователя ИБ
// ** Значение - Массив из см. СерверныеОповещения.КлючСеанса
//
// Пример:
// Если ИмяОповещения <> "СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов" Тогда
// Возврат;
// КонецЕсли;
// ПараметрыБлокировкиСеансов = ПараметрыБлокировкиСеансов(Истина);
// Если ПараметрыБлокировкиСеансов.Установлена Тогда
// СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения,
// ПараметрыБлокировкиСеансов, Неопределено);
// КонецЕсли;
//
Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт
Если ИмяОповещения = "СтандартныеПодсистемы.БазоваяФункциональность.ФункциональныеОпцииИзменены" Тогда
ПриОтправкеСерверногоОповещенияФункциональныеОпцииИзменены(ИмяОповещения, ВариантыПараметров);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Отправляет оповещение всем сеансам об устаревании повторно используемых значений.
//
// Параметры:
// ОтправитьСразу - см. СерверныеОповещения.ОтправитьСерверноеОповещение.ОтправитьСразу
//
Процедура ОповеститьВсеСеансыОбУстареванииПовторноИспользуемыхЗначений(ОтправитьСразу = Ложь) Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
СерверныеОповещения.ОтправитьСерверноеОповещение(
"СтандартныеПодсистемы.БазоваяФункциональность.ПовторноИспользуемыеЗначенияУстарели",
"",
Неопределено,
ОтправитьСразу);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Дополнительная базовая функциональность для анализа параметров клиента на сервере.
// Параметры:
// ВызыватьИсключение - Булево - вызывать исключение, если параметры не инициализированы.
//
// Возвращает пустое фиксированное соответствие, если ТекущийРежимЗапуска() = Неопределено.
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Строка - "ПараметрЗапуска", "СтрокаСоединенияИнформационнойБазы"
// * Значение - Строка
//
Функция ПараметрыКлиентаНаСервере(ВызыватьИсключение = Истина) Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
ПараметрыКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере;
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
Если Не ВызыватьИсключение
Или ТекущийРежимЗапуска() = Неопределено
И ПараметрыКлиента.Получить("ПервыйСерверныйВызовВыполнен") = Неопределено
Или ПараметрыКлиента.Получить("ПервыйСерверныйВызовВыполнен") = Истина Тогда
Возврат ПараметрыКлиента;
КонецЕсли;
Если ТекущийРежимЗапуска() <> Неопределено Тогда
// Сброс клиентских кэшей для обращения к серверу при обращении к параметрам работы клиента,
// чтобы при этом перезаполнились параметры клиента на сервере.
ОбновитьПовторноИспользуемыеЗначения();
КонецЕсли;
ПриЗапуске = ПараметрыКлиента.Получить("ПервыйСерверныйВызовВыполнен") = Ложь;
Если ПриЗапуске Тогда
КомментарийДляЖурналаРегистрацииБезСтекаВызовов = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недопустимое обращение к неинициализированным параметрам клиента на сервере.
|Вероятно, вызов выполнен преждевременно до завершения инициализации в %1.'",
ОбщегоНазначения.КодОсновногоЯзыка()),
"СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы");
Иначе
КомментарийДляЖурналаРегистрацииБезСтекаВызовов = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недопустимое обращение к неинициализированным параметрам клиента на сервере.
|Вероятно, вызван выполнен после некорректной очистки параметров сеанса без использования %2.'",
ОбщегоНазначения.КодОсновногоЯзыка()),
"ОбщегоНазначения.ОчиститьПараметрыСеанса");
КонецЕсли;
Попытка
ВызватьИсключение КомментарийДляЖурналаРегистрацииБезСтекаВызовов;
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
КонецПопытки;
КомментарийСоСтекомВызовов = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
ИмяСобытия = НСтр("ru = 'Не заполнены параметры клиента на сервере'",
ОбщегоНазначения.КодОсновногоЯзыка());
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, КомментарийСоСтекомВызовов);
Если Не ПриЗапуске Тогда
ТекстОшибки =
НСтр("ru = 'Не инициализированы параметры клиента на сервере.
|Для их инициализации повторите действие или перезапустите сеанс.'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Возврат ПараметрыКлиента;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Процедуры для установки/обновления/получения параметров работы программы (кэшей).
// Проверяет, что в текущем сеансе доступна последняя версия программы,
// в противном случае, вызывает исключение с требованием перезапустить сеанс.
//
// В старых сеансах нельзя обновлять параметры работы программы, а также
// нельзя выполнять изменение некоторых данных, чтобы не перезаписать
// новую версию данных (полученную с помощью новой версии программы)
// старой версией данных (полученной с помощью старой версии программы).
//
Процедура ПроверитьДинамическоеОбновлениеВерсииПрограммы() Экспорт
Если ВерсияПрограммыОбновленаДинамически() Тогда
ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы();
КонецЕсли;
КонецПроцедуры
// Проверяет, что в текущем сеансе есть динамическое изменение конфигурации базы и
// при этом нет режима обновления информационной базы.
//
// Возвращаемое значение:
// Булево - Истина, если версия программы обновлена.
//
Функция ВерсияПрограммыОбновленаДинамически() Экспорт
Если Не КонфигурацияБазыДанныхИзмененаДинамически() Тогда
Возврат Ложь;
КонецЕсли;
// Если конфигурация базы данных изменена динамически после запуска
// обновления информационной базы, но до его завершения, тогда нужно
// продолжать обновление несмотря на изменение.
Если ОбщегоНазначения.РазделениеВключено() Тогда
// Параметры работы программы только неразделенные, поэтому для них обновление завершено,
// если завершено обновление неразделенных данных.
Возврат Не ОбновлениеИнформационнойБазыСлужебный.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы();
КонецЕсли;
Возврат Не ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы();
КонецФункции
// Вызывает исключение с требованием перезапустить сеанс из-за обновления версии программы.
Процедура ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы() Экспорт
ТекстОшибки = НСтр("ru = 'Версия программы обновлена, требуется перезапустить сеанс.'");
УстановитьТребуетсяПерезапускСеанса(ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПроцедуры
// Вызывает исключение с требованием перезапустить сеанс из-за обновления расширений программы.
Процедура ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияРасширенийПрограммы() Экспорт
Если ЭтоРазделенныйРежимСеансаБезРазделителей() Тогда
ТекстОшибки =
НСтр("ru = 'Для выполнения требуемых действий следует
|запустить сеанс с установленными разделителями.
|
|Расширения области данных не подключаются при входе
|в область данных в сеансе, запущенном без разделителей.'");
Иначе
ТекстОшибки = НСтр("ru = 'Расширения программы обновлены, требуется перезапустить сеанс.'");
КонецЕсли;
УстановитьТребуетсяПерезапускСеанса(ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПроцедуры
// Возвращаемое значение:
// Булево
//
Функция ЭтоРазделенныйРежимСеансаБезРазделителей() Экспорт
Если Не ОбщегоНазначения.РазделениеВключено()
Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()
Или Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
Возврат Ложь;
КонецЕсли;
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
Возврат МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей();
КонецФункции
// Устанавливает параметр сеанса необходимости перезапуска с текстом
// краткого представления ошибки для проверки в исключении попытки.
//
// Параметры:
// КраткоеПредставлениеОшибки - Строка - краткое представление текста ошибки при вызове
// процедуры ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы
// или ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияРасширенийПрограммы.
//
Процедура УстановитьТребуетсяПерезапускСеанса(КраткоеПредставлениеОшибки) Экспорт
Если ТекущийРежимЗапуска() <> Неопределено Тогда
Возврат;
КонецЕсли;
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
Если ТекущийСеанс.ИмяПриложения <> "BackgroundJob" Тогда
Возврат;
КонецЕсли;
Если ТребуетсяПерезапускСеанса() Тогда
Возврат;
КонецЕсли;
ТекущиеПараметры = Новый Структура(ПараметрыСеанса.УстановленныеРасширения);
ТекущиеПараметры.Вставить("ТребуетсяПерезапускСеанса", КраткоеПредставлениеОшибки);
ПараметрыСеанса.УстановленныеРасширения = Новый ФиксированнаяСтруктура(ТекущиеПараметры);
КонецПроцедуры
// Возвращает факт вызова процедуры УстановитьТребуетсяПерезапускСеанса и
// текст краткого представления ошибки установленный при вызове процедуры.
//
// Параметры:
// КраткоеПредставлениеОшибки - Строка - возвращаемое значение,
// установленное при вызове процедуры УстановитьТребуетсяПерезапускСеанса.
//
// Возвращаемое значение:
// Булево
//
Функция ТребуетсяПерезапускСеанса(КраткоеПредставлениеОшибки = "") Экспорт
Если Не ПараметрыСеанса.УстановленныеРасширения.Свойство("ТребуетсяПерезапускСеанса") Тогда
Возврат Ложь;
КонецЕсли;
КраткоеПредставлениеОшибки = ПараметрыСеанса.УстановленныеРасширения.ТребуетсяПерезапускСеанса;
Возврат Истина;
КонецФункции
// Проверяет, что пойманное исключение - это ошибка, краткое представление которой
// начинается с текста, указанного при вызове процедуры УстановитьТребуетсяПерезапускСеанса.
//
// Параметры:
// ИнформацияОбОшибке - ИнформацияОбОшибке
//
// Возвращаемое значение:
// Булево
//
Функция ЭтоОшибкаТребованияПерезапускаСеанса(ИнформацияОбОшибке) Экспорт
ТекстОшибки = "";
Если Не ТребуетсяПерезапускСеанса(ТекстОшибки) Тогда
Возврат Ложь;
КонецЕсли;
Возврат ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке")
И ЗначениеЗаполнено(ТекстОшибки)
И СтрНачинаетсяС(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстОшибки);
КонецФункции
// Возвращает значение параметра работы программы.
//
// В старом сеансе (когда версия программы обновлена динамически),
// если параметр не существует, вызывается исключение с требованием перезапуска,
// иначе возвращается значение без учета версии.
//
// В разделенном режиме модели сервиса, если параметр не существует или
// версия параметра не равна версии конфигурации вызывается исключение,
// так как обновление неразделенных данных невозможно.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// Возвращаемое значение:
// Произвольный - возвращается Неопределено, когда параметр не существует или
// когда в новом сеансе версия параметра не равна версии конфигурации.
//
Функция ПараметрРаботыПрограммы(ИмяПараметра) Экспорт
Возврат РегистрыСведений.ПараметрыРаботыПрограммы.ПараметрРаботыПрограммы(ИмяПараметра);
КонецФункции
// Устанавливает значение параметра работы программы.
// Перед вызовом требуется установить привилегированный режим.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// Значение - Произвольный - значение, которое можно поместить в хранилище значения.
//
Процедура УстановитьПараметрРаботыПрограммы(ИмяПараметра, Значение) Экспорт
РегистрыСведений.ПараметрыРаботыПрограммы.УстановитьПараметрРаботыПрограммы(ИмяПараметра, Значение);
КонецПроцедуры
// Обновляет значение параметра работы программы, если изменилось.
// Перед вызовом требуется установить привилегированный режим.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// Значение - Произвольный - значение, которое можно поместить в хранилище значения.
//
// ЕстьИзменения - Булево - возвращаемое значение. Устанавливается Истина,
// если старое и новое значения параметра не совпадают.
//
// СтароеЗначение - Произвольный - возвращаемое значение. До обновления.
//
Процедура ОбновитьПараметрРаботыПрограммы(ИмяПараметра, Значение, ЕстьИзменения = Ложь, СтароеЗначение = Неопределено) Экспорт
РегистрыСведений.ПараметрыРаботыПрограммы.ОбновитьПараметрРаботыПрограммы(ИмяПараметра,
Значение, ЕстьИзменения, СтароеЗначение);
КонецПроцедуры
// Возвращает изменения параметра работы программы с учетом текущей версии
// конфигурации и текущей версии ИБ.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// Возвращаемое значение:
// Неопределено - означает, что изменилось все. Возвращается
// при начальном заполнении ИБ или области данных.
// Массив - содержит значения изменений, если массив пустой, значит изменений нет.
// Может быть несколько изменений, например, когда область данных давно не обновлялась.
//
Функция ИзмененияПараметраРаботыПрограммы(ИмяПараметра) Экспорт
Возврат РегистрыСведений.ПараметрыРаботыПрограммы.ИзмененияПараметраРаботыПрограммы(ИмяПараметра);
КонецФункции
// Добавить изменения параметра работы программы при переходе на текущую версию метаданных конфигурации.
// В дальнейшем изменения используются для условного добавления обязательных обработчиков обновления.
// При начальном заполнении ИБ или неразделенных данных добавление изменений пропускается.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// Изменения - Произвольный - фиксированные данные, которые регистрируются в качестве изменений.
// Изменения не добавляются, если значение ИзменениеПараметра не заполнено.
//
Процедура ДобавитьИзмененияПараметраРаботыПрограммы(ИмяПараметра, Изменения) Экспорт
РегистрыСведений.ПараметрыРаботыПрограммы.ДобавитьИзмененияПараметраРаботыПрограммы(ИмяПараметра, Изменения);
КонецПроцедуры
// Только для внутреннего использования.
Процедура ЗарегистрироватьИзменениеПриоритетныхДанныхДляПодчиненныхУзловРИБ() Экспорт
Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ()
Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
Если Не СтандартныеПодсистемыПовтИсп.ОтключитьИдентификаторыОбъектовМетаданных() Тогда
Справочники.ИдентификаторыОбъектовМетаданных.ЗарегистрироватьПолноеИзменениеДляПодчиненныхУзловРИБ();
КонецЕсли;
УзлыПлановОбменаРИБ = Новый Соответствие;
Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
Если Не ПланОбмена.РаспределеннаяИнформационнаяБаза Тогда
Продолжить;
КонецЕсли;
УзлыРИБ = Новый Массив;
УзлыПлановОбменаРИБ.Вставить(ПланОбмена.Состав, УзлыРИБ);
ПланОбменаМенеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПланОбмена.ПолноеИмя());
Выборка = ПланОбменаМенеджер.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Ссылка <> ПланОбменаМенеджер.ЭтотУзел() Тогда
УзлыРИБ.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если УзлыПлановОбменаРИБ.Количество() > 0 Тогда
ЗарегистрироватьИзменениеПредопределенных(УзлыПлановОбменаРИБ, Метаданные.Справочники);
ЗарегистрироватьИзменениеПредопределенных(УзлыПлановОбменаРИБ, Метаданные.ПланыВидовХарактеристик);
ЗарегистрироватьИзменениеПредопределенных(УзлыПлановОбменаРИБ, Метаданные.ПланыСчетов);
ЗарегистрироватьИзменениеПредопределенных(УзлыПлановОбменаРИБ, Метаданные.ПланыВидовРасчета);
КонецЕсли;
КонецПроцедуры
// Создает во всех списках недостающие предопределенные элементы с новыми ссылками (уникальными идентификаторами).
// Для вызова после отключения подчиненного узла РИБ от главного, или для автоматического восстановления
// отсутствующих предопределенных элементов.
//
Процедура ВосстановитьПредопределенныеЭлементы() Экспорт
Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
ВызватьИсключение
НСтр("ru = 'Восстановление предопределенных элементов следует выполнять только в главном узле РИБ.
|Затем выполнить синхронизацию с подчиненными узлами.'");
КонецЕсли;
ОбъектыМетаданных = ОбъектыМетаданныхВсехПредопределенныхДанных();
Блокировка = Новый БлокировкаДанных;
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Блокировка.Добавить(ОбъектМетаданных.ПолноеИмя());
КонецЦикла;
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
УстановитьИнициализациюВсехПредопределенныхДанных(ОбъектыМетаданных);
СоздатьНедостающиеПредопределенныеДанные(ОбъектыМетаданных);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Функция РеквизитыПредопределенныхДанных() Экспорт
Результат = Новый Структура;
Результат.Вставить("ИмяПредопределенныхДанных", "");
Результат.Вставить("ИмяПредопределенногоНабора", "");
Результат.Вставить("ИмяПредопределенногоВида", "");
Результат.Вставить("ПредопределеннаяПапка", Ложь);
Возврат Результат;
КонецФункции
Функция ЭтоПредопределенныеДанные(Знач Элемент, ИмяРеквизита = "", ЗначениеРеквизита = "") Экспорт // АПК:581 Экспортная для автотестов.
// Для определения предопределенных элементов в подсистемах Свойства, КонтактнаяИнформация и Взаимодействия
// зачитываются реквизиты ИмяПредопределенногоНабора, ИмяПредопределенногоВида и ПредопределеннаяПапка.
ЗначенияРеквизитов = РеквизитыПредопределенныхДанных();
ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов, Элемент);
Если ЗначенияРеквизитов.ИмяПредопределенныхДанных = ""
И ЗначенияРеквизитов.ИмяПредопределенногоНабора = ""
И ЗначенияРеквизитов.ИмяПредопределенногоВида = ""
И Не ЗначенияРеквизитов.ПредопределеннаяПапка Тогда
Возврат Ложь;
КонецЕсли;
ИмяРеквизита = "";
Если ЗначенияРеквизитов.ИмяПредопределенногоНабора <> "" Тогда
ИмяРеквизита = "ИмяПредопределенногоНабора";
ИначеЕсли ЗначенияРеквизитов.ИмяПредопределенногоВида <> "" Тогда
ИмяРеквизита = "ИмяПредопределенногоВида";
ИначеЕсли ЗначенияРеквизитов.ПредопределеннаяПапка Тогда
ИмяРеквизита = "ПредопределеннаяПапка";
Иначе
ИмяРеквизита = "ИмяПредопределенныхДанных";
КонецЕсли;
ЗначениеРеквизита = ЗначенияРеквизитов[ИмяРеквизита];
Возврат Истина;
КонецФункции
// Параметры:
// Ссылки - Массив из ЛюбаяСсылка
// - ФиксированныйМассив из ЛюбаяСсылка - ссылки на объекты.
// Если массив пуст, то результатом будет пустое соответствие.
// Реквизиты - Массив из Строка
// - ФиксированныйМассив из Строка - имена реквизитов в формате требований к свойствам структуры.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение - список объектов и значений их реквизитов:
// * Ключ - ЛюбаяСсылка - ссылка на объект;
// * Значение - Структура:
// ** Ключ - Строка - имя реквизита;
// ** Значение - Произвольный - значение реквизита. Неопределено, если реквизит не существует у объекта.
//
Функция ЗначенияРеквизитовОбъектовЕслиСуществуют(Ссылки, Знач Реквизиты) Экспорт
ЗначенияРеквизитов = Новый Соответствие;
Если Ссылки.Количество() = 0 Тогда
Возврат ЗначенияРеквизитов;
КонецЕсли;
РеквизитыТипов = Новый Соответствие;
СсылкиПоТипам = Новый Соответствие;
Для Каждого Ссылка Из Ссылки Цикл
Тип = ТипЗнч(Ссылка);
Если Не ОбщегоНазначения.ЭтоСсылка(Тип) Тогда
Продолжить;
КонецЕсли;
Если СсылкиПоТипам[Тип] = Неопределено Тогда
СсылкиПоТипам[Тип] = Новый Массив;
КонецЕсли;
ЭлементПоТипу = СсылкиПоТипам[Тип]; // Массив
ЭлементПоТипу.Добавить(Ссылка);
Если РеквизитыТипов[Тип] = Неопределено Тогда
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); // ОбъектМетаданныхСправочник
Если ОбъектМетаданных = Неопределено Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неверный первый параметр %1 в функции %2:
|Значения массива должны быть ссылками.'"),
"Ссылки", "ОбщегоНазначения.ЗначенияРеквизитовОбъектовЕслиСуществуют");
КонецЕсли;
РеквизитыТипа = Новый Массив;
СтандартныеРеквизиты = Новый Соответствие;
Для каждого СтандартныйРеквизит Из ОбъектМетаданных.СтандартныеРеквизиты Цикл
СтандартныеРеквизиты[СтандартныйРеквизит.Имя] = Истина;
КонецЦикла;
Для каждого ИмяРеквизита Из Реквизиты Цикл
Если СтандартныеРеквизиты[ИмяРеквизита] <> Неопределено
Или ОбъектМетаданных.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
РеквизитыТипа.Добавить(ИмяРеквизита);
Иначе
РеквизитыТипа.Добавить("НЕОПРЕДЕЛЕНО КАК" + " " + ИмяРеквизита); // @query-part
КонецЕсли;
КонецЦикла;
РеквизитыТипов[Тип] = РеквизитыТипа;
КонецЕсли;
КонецЦикла;
Если СсылкиПоТипам.Количество() = 0 Тогда
Возврат ЗначенияРеквизитов;
КонецЕсли;
ТекстыЗапросов = Новый Массив;
Запрос = Новый Запрос;
Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл
Тип = СсылкиПоТипу.Ключ;
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя();
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Ссылка,
| &Реквизиты
|ИЗ
| &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы
|ГДЕ
| ПсевдонимЗаданнойТаблицы.Ссылка В (&Ссылки)";
Если ТекстыЗапросов.Количество() > 0 Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @query-part-1
КонецЕсли;
РеквизитыТекстЗапроса = СтрСоединить(РеквизитыТипов[Тип], ",");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты", РеквизитыТекстЗапроса);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных);
ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); // @query-part-1
Запрос.УстановитьПараметр(ИмяПараметра, СсылкиПоТипу.Значение);
ТекстыЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
ИменаРеквизитов = СтрСоединить(Реквизиты, ",");
ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); // @query-part
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Новый Структура(ИменаРеквизитов);
ЗаполнитьЗначенияСвойств(Результат, Выборка);
ЗначенияРеквизитов[Выборка.Ссылка] = Результат;
КонецЦикла;
Возврат ЗначенияРеквизитов;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Процедуры для установки/получения параметров работы расширений (кэшей).
// Возвращает значения параметра для текущей версии расширений.
// Если не заполнен, возвращает Неопределено.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// БезУчетаВерсииРасширений - Булево
//
// УжеИзменен - Булево - возвращаемое значение. Устанавливается Истина
// когда БезУчетаВерсииРасширений равно Истина,
// хранилище значения содержит значение отличное от Неопределено и
// значение было установлено более новым сеансом, чем текущий.
// - Неопределено - установка значения не требуется.
//
// Возвращаемое значение:
// Произвольный - возвращается Неопределено, если параметр не заполнен
// для текущей версии расширений.
//
Функция ПараметрРаботыРасширения(ИмяПараметра, БезУчетаВерсииРасширений = Ложь, УжеИзменен = Неопределено) Экспорт
Возврат РегистрыСведений.ПараметрыРаботыВерсийРасширений.ПараметрРаботыРасширения(ИмяПараметра,
БезУчетаВерсииРасширений, УжеИзменен);
КонецФункции
// Устанавливает хранилище значения параметра для текущей версии расширений.
// Используется для заполнения значений параметров.
// Перед вызовом требуется установить привилегированный режим.
//
// Параметры:
// ИмяПараметра - Строка - не более 128 символов. Например,
// "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками".
//
// Значение - Произвольный - значение параметра.
// БезУчетаВерсииРасширений - Булево
//
Процедура УстановитьПараметрРаботыРасширения(ИмяПараметра, Значение, БезУчетаВерсииРасширений = Ложь) Экспорт
РегистрыСведений.ПараметрыРаботыВерсийРасширений.УстановитьПараметрРаботыРасширения(ИмяПараметра, Значение, БезУчетаВерсииРасширений);
КонецПроцедуры
// Обработчик регламентного задания УдалениеУстаревшихПараметровРаботыВерсийРасширений.
Процедура УдалениеУстаревшихПараметровРаботыВерсийРасширенийОбработчикЗадания() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.УдалениеУстаревшихПараметровРаботыВерсийРасширений);
УстановитьПривилегированныйРежим(Истина);
Справочники.ВерсииРасширений.УдалитьУстаревшиеВерсииПараметров();
КонецПроцедуры
// Обработчик регламентного задания ЗаполнениеПараметровРаботыРасширений.
//
// Регламентное задание должно запускаться сразу, как только было включено.
// После успешного завершения задание отключает себя.
//
Процедура ЗаполнениеПараметровРаботыРасширений() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.ЗаполнениеПараметровРаботыРасширений);
УстановитьПривилегированныйРежим(Истина);
РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыПоследнейВерсииРасширений();
КонецПроцедуры
// Только для внутреннего использования.
Процедура ЗаполнитьВсеПараметрыРаботыРасширенийФоновоеЗадание(Параметры) Экспорт
РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширенийФоновоеЗадание(Параметры);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Дополнительная базовая функциональность для обмена данными.
// Выполняет регистрацию изменений объекта на всех узлах плана обмена.
// Для разделенных конфигураций должны выполняться условия:
// - план обмена должен быть разделенным,
// - регистрируемый объект должен быть неразделенным.
//
// Параметры:
// Объект - СправочникОбъект
// - ДокументОбъект
// - БизнесПроцессОбъект
// - ЗадачаОбъект
// - ПланВидовРасчетаОбъект
// - ПланВидовХарактеристикОбъект
// - ПланСчетовОбъект
// - ПланОбменаОбъект
//
// ИмяПланаОбмена - Строка - имя плана обмена, на всех узлах которого требуется выполнить регистрацию объекта.
// План обмена должен быть разделенным, иначе будет выдано исключение.
//
// ВключаяГлавныйУзел - Булево - если Ложь, тогда в подчиненном узле
// не будет выполнена регистрация для главного узла.
//
//
Процедура ЗарегистрироватьОбъектНаВсехУзлах(Знач Объект, Знач ИмяПланаОбмена, Знач ВключаяГлавныйУзел = Истина) Экспорт
Если Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(Объект.Метаданные()) = Неопределено Тогда
Возврат;
КонецЕсли;
Если ОбщегоНазначения.РазделениеВключено() Тогда
Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
ВызватьИсключение НСтр("ru = 'Регистрация изменений неразделенных данных в разделенном режиме.'");
КонецЕсли;
МодульРаботаВМоделиСервиса = Неопределено;
Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
КонецЕсли;
Если МодульРаботаВМоделиСервиса <> Неопределено Тогда
ЭтоРазделенныйПланОбмена = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(
"ПланОбмена." + ИмяПланаОбмена, МодульРаботаВМоделиСервиса.РазделительОсновныхДанных());
Иначе
ЭтоРазделенныйПланОбмена = Ложь;
КонецЕсли;
Если Не ЭтоРазделенныйПланОбмена Тогда
ВызватьИсключение НСтр("ru = 'Регистрация изменений для неразделенных планов обмена не поддерживается.'");
КонецЕсли;
Если МодульРаботаВМоделиСервиса <> Неопределено Тогда
ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(
Объект.Метаданные().ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительОсновныхДанных());
Иначе
ЭтоРазделенныйОбъектМетаданных = Ложь;
КонецЕсли;
Если ЭтоРазделенныйОбъектМетаданных Тогда
ВызватьИсключение НСтр("ru = 'Регистрация изменений для разделенных объектов не поддерживается.'");
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ПланОбмена.Ссылка КАК Получатель
|ИЗ
| #ТаблицаПланаОбмена КАК ПланОбмена
|ГДЕ
| ПланОбмена.РегистрироватьИзменения
| И НЕ ПланОбмена.ЭтотУзел
| И НЕ ПланОбмена.ПометкаУдаления";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаПланаОбмена", "ПланОбмена." + ИмяПланаОбмена);
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Получатели = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Получатель");
Для Каждого Получатель Из Получатели Цикл
Объект.ОбменДанными.Получатели.Добавить(Получатель);
КонецЦикла;
Иначе
ТекстЗапроса =
"ВЫБРАТЬ
| ПланОбмена.Ссылка КАК Получатель
|ИЗ
| #ТаблицаПланаОбмена КАК ПланОбмена
|ГДЕ
| НЕ ПланОбмена.ЭтотУзел
| И НЕ ПланОбмена.ПометкаУдаления";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаПланаОбмена", "ПланОбмена." + ИмяПланаОбмена);
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Получатели = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Получатель");
ГлавныйУзел = ПланыОбмена.ГлавныйУзел();
Для Каждого Получатель Из Получатели Цикл
Если Не ВключаяГлавныйУзел И Получатель = ГлавныйУзел Тогда
Продолжить;
КонецЕсли;
Объект.ОбменДанными.Получатели.Добавить(Получатель);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Сохраняет ссылку на главный узел в константе ГлавныйУзел для возможности восстановления.
Процедура СохранитьГлавныйУзел() Экспорт
ГлавныйУзелМенеджер = Константы.ГлавныйУзел.СоздатьМенеджерЗначения();
ГлавныйУзелМенеджер.Значение = ПланыОбмена.ГлавныйУзел();
ОбновлениеИнформационнойБазы.ЗаписатьДанные(ГлавныйУзелМенеджер);
КонецПроцедуры
// Возвращаемое значение:
// Булево - Истина, если выполнение происходит на учебной платформе,
// на которой, например, недоступно получение свойства ПользовательОС.
//
Функция ЭтоУчебнаяПлатформа() Экспорт
УстановитьПривилегированныйРежим(Истина);
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Попытка
ПользовательОС = ТекущийПользователь.ПользовательОС;
Исключение
ПользовательОС = Неопределено;
КонецПопытки;
Возврат ПользовательОС = Неопределено;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Обработчики отправки и получения данных для обмена в распределенной ИБ.
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание параметров в обработчике события ПриОтправкеДанныхПодчиненному в синтакс-помощнике.
//
// Параметры:
// ЭлементДанных - Произвольный
// ОтправкаЭлемента - ОтправкаЭлементаДанных
// СозданиеНачальногоОбраза - Булево
// Получатель - ПланОбменаОбъект
//
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза, Знач Получатель) Экспорт
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
// Отправка идентификаторов объектов метаданных выполняется в другой секции сообщения обмена.
ИгнорироватьОтправкуИдентификаторовОбъектовМетаданных(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза);
ИгнорироватьОтправкуДанныхОбработанныхВЦентральномУзлеРИБПриОбновленииИБ(ЭлементДанных, СозданиеНачальногоОбраза, Получатель);
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
ПодсистемаОбменДаннымиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными");
// Вставка кода от подсистемы обмена данными должна быть первой.
Если ПодсистемаОбменДаннымиСуществует Тогда
МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия");
МодульОбменДаннымиСобытия.ПриОтправкеДанныхКорреспонденту(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель, Ложь);
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ИнтеграцияПодсистемБСП.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель);
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
// Вставка кода от подсистемы обмена данными в модели сервиса должна быть последней, влияющей на логику отправки.
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда
МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса");
МодульОбменДаннымиВМоделиСервиса.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель);
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Если ПодсистемаОбменДаннымиСуществует Тогда
МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
МодульОбменДаннымиСервер.РассчитатьПроцентВыгрузкиРИБ(Получатель, СозданиеНачальногоОбраза);
КонецЕсли;
КонецПроцедуры
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание параметров в обработчике события ПриПолученииДанныхОтПодчиненного в синтакс-помощнике.
//
// Параметры:
// ЭлементДанных - Произвольный
// ПолучениеЭлемента - ПолучениеЭлементаДанных
// ОтправкаНазад - Булево
// Отправитель - ПланОбменаОбъект
//
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Знач Отправитель) Экспорт
// Идентификаторы объектов метаданных могут изменяться только в главном узле.
ИгнорироватьПолучениеИдентификаторовОбъектовМетаданных(ЭлементДанных, ПолучениеЭлемента);
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
ИнтеграцияПодсистемБСП.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель);
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель);
ПодсистемаОбменДаннымиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными");
// Вставка кода от подсистемы обмена данными должна быть последней, влияющей на логику получения.
Если ПодсистемаОбменДаннымиСуществует Тогда
МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия");
МодульОбменДаннымиСобытия.ПриПолученииДанныхОтПодчиненногоВКонце(ЭлементДанных, ПолучениеЭлемента, Отправитель);
КонецЕсли;
Если ПодсистемаОбменДаннымиСуществует Тогда
МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
МодульОбменДаннымиСервер.РассчитатьПроцентЗагрузкиРИБ(Отправитель);
КонецЕсли;
КонецПроцедуры
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание обработчика события ПриПолученииДанныхОтГлавного в синтакс-помощнике.
// Параметр Отправитель может быть не заполнен, например, при получении сообщения начального образа в АРМе.
//
// Параметры:
// ЭлементДанных - Произвольный
// ПолучениеЭлемента - ПолучениеЭлементаДанных
// ОтправкаНазад - Булево
// Отправитель - ПланОбменаОбъект
//
Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель = Неопределено) Экспорт
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
ПодсистемаОбменДаннымиСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными");
// Вставка кода от подсистемы обмена данными должна быть первой.
Если ПодсистемаОбменДаннымиСуществует Тогда
МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия");
МодульОбменДаннымиСобытия.ПриПолученииДанныхОтГлавногоВНачале(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель);
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ИнтеграцияПодсистемБСП.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель);
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтГлавного(Отправитель, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад);
// Вставка кода от подсистемы обмена данными должна быть последней, влияющей на логику получения.
Если ПодсистемаОбменДаннымиСуществует
И Не СозданиеНачальногоОбраза(ЭлементДанных) Тогда
МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия");
МодульОбменДаннымиСобытия.ПриПолученииДанныхОтГлавногоВКонце(ЭлементДанных, ПолучениеЭлемента, Отправитель);
КонецЕсли;
Если ПодсистемаОбменДаннымиСуществует Тогда
МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
МодульОбменДаннымиСервер.РассчитатьПроцентЗагрузкиРИБ(Отправитель);
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Дополнительные функции для работы с типами.
// Возвращает тип ссылки или ключа записи указанного объекта метаданных.
//
// Параметры:
// ОбъектМетаданных - ОбъектМетаданных - регистр или ссылочный объект.
//
// Возвращаемое значение:
// Тип
//
Функция ТипСсылкиИлиКлючаЗаписиОбъектаМетаданных(ОбъектМетаданных) Экспорт
Если ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных) Тогда
Если ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрСведений";
ИначеЕсли ОбщегоНазначения.ЭтоРегистрНакопления(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрНакопления";
ИначеЕсли ОбщегоНазначения.ЭтоРегистрБухгалтерии(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрБухгалтерии";
ИначеЕсли ОбщегоНазначения.ЭтоРегистрРасчета(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрРасчета";
КонецЕсли;
Тип = Тип(ВидРегистра + "КлючЗаписи." + ОбъектМетаданных.Имя);
Иначе
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
Тип = ТипЗнч(Менеджер.ПустаяСсылка());
КонецЕсли;
Возврат Тип;
КонецФункции
// Возвращает тип объекта или набора записей указанного объекта метаданных.
//
// Параметры:
// ОбъектМетаданных - ОбъектМетаданных - регистр или ссылочный объект.
//
// Возвращаемое значение:
// Тип
//
Функция ТипОбъектаИлиНабораЗаписейОбъектаМетаданных(ОбъектМетаданных) Экспорт
Если ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных) Тогда
Если ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрСведений";
ИначеЕсли ОбщегоНазначения.ЭтоРегистрНакопления(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрНакопления";
ИначеЕсли ОбщегоНазначения.ЭтоРегистрБухгалтерии(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрБухгалтерии";
ИначеЕсли ОбщегоНазначения.ЭтоРегистрРасчета(ОбъектМетаданных) Тогда
ВидРегистра = "РегистрРасчета";
КонецЕсли;
Тип = Тип(ВидРегистра + "НаборЗаписей." + ОбъектМетаданных.Имя);
Иначе
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
ВидОбъекта = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(Менеджер.ПустаяСсылка()));
Тип = Тип(ВидОбъекта + "Объект." + ОбъектМетаданных.Имя);
КонецЕсли;
Возврат Тип;
КонецФункции
// Выполняет проверку, что переданный объект имеет тип СправочникОбъект.ИдентификаторыОбъектовМетаданных.
//
// Параметры:
// Объект - Произвольный
//
// Возвращаемое значение:
// Булево
//
Функция ЭтоИдентификаторОбъектаМетаданных(Объект) Экспорт
Возврат ТипЗнч(Объект) = Тип("СправочникОбъект.ИдентификаторыОбъектовМетаданных");
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции работы с формами.
// Устанавливает ключ назначения формы (ключ назначения использования и
// ключ сохранения положения окна). При необходимости копирует текущие настройки формы,
// если для соответствующего нового ключа они еще не были записаны.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма ПриСозданииНаСервере, которой устанавливается ключ.
// Ключ - Строка - новый ключ назначения формы.
// КлючПоложения - Строка
// УстановитьНастройки - Булево - установить новому ключу настройки, сохраненные для текущего ключа.
//
Процедура УстановитьКлючНазначенияФормы(Форма, Ключ, КлючПоложения = "", УстановитьНастройки = Истина) Экспорт
УстановитьКлючНазначенияИспользованияФормы(Форма, Ключ, УстановитьНастройки);
УстановитьКлючСохраненияПоложенияОкнаФормы(Форма, ?(КлючПоложения = "", Ключ, КлючПоложения), УстановитьНастройки);
КонецПроцедуры
Процедура СброситьРазмерыИПоложениеОкна(Форма) Экспорт
Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
Возврат;
КонецЕсли;
ИмяФормы = Форма.ИмяФормы;
НовыйКлючСохраненияПоложенияОкна = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "_");
КлючОбъектаХранения = ИмяФормы + "/ВременныеКлючиСохраненияПоложенияОкна";
ИмяПользователя = ИмяПользователя();
НачалоДня = НачалоДня(ТекущаяУниверсальнаяДата());
ГраницаУстаревания = НачалоДня - 2*24*60*60;
Ключи = ХранилищеСистемныхНастроек.Загрузить(КлючОбъектаХранения);
Если ТипЗнч(Ключи) = Тип("Соответствие") Тогда
ИменаНастроек = Новый Массив;
ИменаНастроек.Добавить("/НастройкиОкнаТонкогоКлиента");
ИменаНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента");
ИменаНастроек.Добавить("/НастройкиОкнаВебКлиента");
ИменаНастроек.Добавить("/НастройкиОкнаМобильногоКлиента");
ИменаНастроек.Добавить("/Такси/НастройкиОкнаВебКлиента");
ИменаНастроек.Добавить("/Такси/НастройкиОкнаМобильногоКлиента");
ТекущиеКлючи = Новый Соответствие(Новый ФиксированноеСоответствие(Ключи));
Для Каждого КлючИЗначение Из ТекущиеКлючи Цикл
ТекущийДень = КлючИЗначение.Ключ;
Если ТипЗнч(ТекущийДень) <> Тип("Дата") Тогда
Ключи = Неопределено;
Прервать;
КонецЕсли;
Если ТекущийДень > ГраницаУстаревания Тогда
Продолжить;
КонецЕсли;
КлючиТекущегоДня = КлючИЗначение.Значение;
Если ТипЗнч(КлючиТекущегоДня) <> Тип("Массив") Тогда
Ключи = Неопределено;
Прервать;
КонецЕсли;
Для Каждого ТекущийКлюч Из КлючиТекущегоДня Цикл
НачалоКлючаОбъекта = ИмяФормы + "/" + ТекущийКлюч;
Для Каждого ИмяНастройки Из ИменаНастроек Цикл
ХранилищеСистемныхНастроек.Удалить(НачалоКлючаОбъекта + ИмяНастройки, "", ИмяПользователя);
КонецЦикла;
КонецЦикла;
Ключи.Удалить(ТекущийДень);
КонецЦикла;
КонецЕсли;
ОчиститьСтарыеКлючи = ТипЗнч(Ключи) <> Тип("Соответствие");
Если ОчиститьСтарыеКлючи Тогда
Ключи = Новый Соответствие;
КонецЕсли;
КлючиДня = Ключи.Получить(НачалоДня);
Если ТипЗнч(КлючиДня) <> Тип("Массив") Тогда
КлючиДня = Новый Массив;
Ключи.Вставить(НачалоДня, КлючиДня);
КонецЕсли;
КлючиДня.Добавить(НовыйКлючСохраненияПоложенияОкна);
ХранилищеСистемныхНастроек.Сохранить(КлючОбъектаХранения,, Ключи);
Форма.КлючСохраненияПоложенияОкна = НовыйКлючСохраненияПоложенияОкна;
Если Не ОчиститьСтарыеКлючи Тогда
Возврат;
КонецЕсли;
Отбор = Новый Структура("Пользователь", ИмяПользователя);
Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
КлючПоискаРусский = "НастройкиОкнаТонкогоКлиента"; // @Non-NLS
КлючПоискаАнглийский = "ThinClientWindowSettings";
Пока Истина Цикл
Попытка
ЕстьСледующей = Выборка.Следующий();
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации(
НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,,,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
Прервать;
КонецПопытки;
Если Не ЕстьСледующей Тогда
Прервать;
КонецЕсли;
Если Не СтрНачинаетсяС(Выборка.КлючОбъекта, ИмяФормы)
Или Выборка.КлючНастроек <> ""
Или Выборка.КлючОбъекта = КлючОбъектаХранения Тогда
Продолжить;
КонецЕсли;
ЧастиКлючаОбъекта = СтрРазделить(Выборка.КлючОбъекта, "/");
Если ЧастиКлючаОбъекта.Количество() < 2 Тогда
Продолжить;
КонецЕсли;
ПоследняяЧастьКлюча = ЧастиКлючаОбъекта[ЧастиКлючаОбъекта.ВГраница()];
Если СтрНайти(ПоследняяЧастьКлюча, КлючПоискаРусский) > 0
Или СтрНайти(ПоследняяЧастьКлюча, КлючПоискаАнглийский) > 0 Тогда
ХранилищеСистемныхНастроек.Удалить(Выборка.КлючОбъекта, "", ИмяПользователя);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Прочие процедуры и функции.
// Возвращает уточнения при возникновении проблем с параметрами работы программы.
//
// Возвращаемое значение:
// Строка
//
Функция УточнениеОшибкиПараметровРаботыПрограммыДляРазработчика() Экспорт
Возврат Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для разработчика: возможно требуется обновить вспомогательные данные,
|которые влияют на работу программы. Для выполнения обновления можно:
|- воспользоваться внешней обработкой
| ""Инструменты разработчика: Обновление вспомогательных данных"",
|- либо запустить программу с параметром командной строки 1С:Предприятия 8
| ""/С %1"",
|- либо увеличить номер версии конфигурации, чтобы при очередном запуске
| выполнились процедуры обновления данных информационной базы.'"),
"ЗапуститьОбновлениеИнформационнойБазы");
КонецФункции
// Возвращает текущего пользователя информационной базы.
//
// Возвращаемое значение:
// ПользовательИнформационнойБазы
//
Функция ТекущийПользователь() Экспорт
// Вычисляем актуальное имя пользователя, даже если оно было ранее изменено в текущем сеансе;
// Например, для подключения к текущей ИБ через внешнее соединение из этого сеанса;
// Во всех остальных случаях достаточно получить ПользователиИнформационнойБазы.ТекущийПользователь().
ТекущийПользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
Если ТекущийПользователь = Неопределено Тогда
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
КонецЕсли;
Возврат ТекущийПользователь;
КонецФункции
// Преобразует строку в допустимое наименование колонки таблицы значений, заменяя недопустимые
// символы на код символа ограниченного символом подчеркивания.
//
// Параметры:
// Строка - Строка - строка для преобразования.
//
// Возвращаемое значение:
// Строка - строка, содержащая только допустимые символы для наименования колонок таблицы значений.
//
Функция ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(Строка) Экспорт
НедопустимыеСимволы = ":;!@#$%^&-~`'.,?{}[]+=*/|\ ()_""";
Результат = "";
Для Индекс = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Индекс, 1);
Если СтрНайти(НедопустимыеСимволы, Символ) > 0 Или (КодСимвола(Символ) > 126 И КодСимвола(Символ) < 256) Тогда
Результат = Результат + "_" + КодСимвола(Символ) + "_";
Иначе
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Преобразовать адаптированное наименование колонки, в котором недопустимые
// символы заменены на код символа, ограниченного символом подчеркивания в обычную строку.
//
// Параметры:
// НаименованиеКолонки - Строка - адаптированное наименование колонки.
//
// Возвращаемое значение:
// Строка - преобразованная строка.
//
Функция ПреобразоватьАдаптированноеНаименованиеКолонкиВСтроку(НаименованиеКолонки) Экспорт
Результат = "";
Для Индекс = 1 По СтрДлина(НаименованиеКолонки) Цикл
Символ = Сред(НаименованиеКолонки, Индекс, 1);
Если Символ = "_" Тогда
ПозицияЗакрывающегоСимвола = СтрНайти(НаименованиеКолонки, "_", НаправлениеПоиска.СНачала, Индекс + 1);
КодСимвола = Сред(НаименованиеКолонки, Индекс + 1, ПозицияЗакрывающегоСимвола - Индекс - 1);
Результат = Результат + Символ(КодСимвола);
Индекс = ПозицияЗакрывающегоСимвола;
Иначе
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Формирует сведения, необходимые для оповещения на клиенте открытых форм и динамических списков
// о массовых изменениях объектов, которые произошли на сервере.
//
// Параметры:
// ИзмененныеОбъекты - ЛюбаяСсылка
// - Тип
// - Массив - содержит сведения об измененных объектах.
// Может быть передана ссылка или массив ссылок на измененные объекты,
// либо можно указать тип или массив типов измененных объектов.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Тип - например, ДокументСсылка.ЗаказПокупателя.
// * Значение - Структура:
// ** ИмяСобытия - Строка - например, "Запись_ЗаказПокупателя".
// ** ПустаяСсылка - ЛюбаяСсылка
//
Функция ПодготовитьОповещениеФормОбИзменении(ИзмененныеОбъекты) Экспорт
Результат = Новый Соответствие;
Если ИзмененныеОбъекты = Неопределено Тогда
Возврат Результат;
КонецЕсли;
МассивТипов = Новый Массив;
ТипСсылкиИлиТипаИлиМассива = ТипЗнч(ИзмененныеОбъекты);
Если ТипСсылкиИлиТипаИлиМассива = Тип("Массив") Тогда
Для Каждого Элемент Из ИзмененныеОбъекты Цикл
ТипЭлемента = ТипЗнч(Элемент);
Если ТипЭлемента = Тип("Тип") Тогда
ТипЭлемента = Элемент;
КонецЕсли;
Если МассивТипов.Найти(ТипЭлемента) = Неопределено Тогда
МассивТипов.Добавить(ТипЭлемента);
КонецЕсли;
КонецЦикла;
Иначе
МассивТипов.Добавить(ИзмененныеОбъекты);
КонецЕсли;
Для Каждого ТипЭлемента Из МассивТипов Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЭлемента);
Если ТипЗнч(ОбъектМетаданных) <> Тип("ОбъектМетаданных") Тогда
Продолжить;
КонецЕсли;
ИмяСобытия = "Запись_" + ОбъектМетаданных.Имя;
Попытка
ПустаяСсылка = ПредопределенноеЗначение(ОбъектМетаданных.ПолноеИмя() + ".ПустаяСсылка");
Исключение
ПустаяСсылка = Неопределено;
КонецПопытки;
Результат.Вставить(ТипЭлемента, Новый Структура("ИмяСобытия,ПустаяСсылка", ИмяСобытия, ПустаяСсылка));
КонецЦикла;
Возврат Результат;
КонецФункции
// Устанавливает общую форму ПустойРабочийСтол на рабочий стол с пустым составом форм.
//
// Для корректного отображения разделенного рабочего стола в веб-клиенте
// неразделенный рабочий стол должен иметь не пустой состав форм, и наоборот.
//
Процедура УстановитьПустуюФормуНаПустойРабочийСтол() Экспорт
КлючОбъекта = "Общее/НастройкиНачальнойСтраницы";
ТекущиеНастройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта);
Если ТекущиеНастройки = Неопределено Тогда
ТекущиеНастройки = Новый НастройкиНачальнойСтраницы;
КонецЕсли;
ТекущийСоставФорм = ТекущиеНастройки.ПолучитьСоставФорм();
Если ТекущийСоставФорм.ЛеваяКолонка.Количество() = 0
И ТекущийСоставФорм.ПраваяКолонка.Количество() = 0 Тогда
ТекущийСоставФорм.ЛеваяКолонка.Добавить("ОбщаяФорма.ПустойРабочийСтол");
ТекущиеНастройки.УстановитьСоставФорм(ТекущийСоставФорм);
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, "", ТекущиеНастройки);
КонецЕсли;
КонецПроцедуры
// Проверяет доступность проведения списка документов текущему пользователю.
//
// Параметры:
// СписокДокументов - Массив - документы для проверки.
//
// Возвращаемое значение:
// Булево - Истина, если есть право проведения хотя бы для одного документа.
//
Функция ДоступноПравоПроведения(СписокДокументов) Экспорт
ТипыДокументов = Новый Массив;
Для Каждого Документ Из СписокДокументов Цикл
ТипДокумента = ТипЗнч(Документ);
Если ТипыДокументов.Найти(ТипДокумента) <> Неопределено Тогда
Продолжить;
Иначе
ТипыДокументов.Добавить(ТипДокумента);
КонецЕсли;
Если ПравоДоступа("Проведение", Метаданные.НайтиПоТипу(ТипДокумента)) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
// Проверяет, что переданная таблица является регистром.
//
// Параметры:
// ИмяТаблицы - Строка - полное имя таблицы.
//
// Возвращаемое значение:
// Булево
//
Функция ЭтоТаблицаРегистра(ИмяТаблицы) Экспорт
ВРегИмяТаблицы = ВРег(ИмяТаблицы);
Если СтрНачинаетсяС(ВРегИмяТаблицы, ВРег("РегистрСведений"))
Или СтрНачинаетсяС(ВРегИмяТаблицы, ВРег("РегистрНакопления"))
Или СтрНачинаетсяС(ВРегИмяТаблицы, ВРег("РегистрБухгалтерии"))
Или СтрНачинаетсяС(ВРегИмяТаблицы, ВРег("РегистрРасчета")) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Возвращает представление начальной (главной) страницы.
//
// Возвращаемое значение:
// Строка
//
Функция ПредставлениеНачальнойСтраницы() Экспорт
Возврат НСтр("ru = 'Главное'");
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных.
Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт
// Загрузка в справочник ИдентификаторыОбъектовМетаданных запрещена.
СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "ПолноеИмя");
Если СтрокаТаблицы <> Неопределено Тогда
ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
КонецЕсли;
// Загрузка в справочник ИдентификаторыОбъектовРасширений запрещена.
СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ИдентификаторыОбъектовРасширений.ПолноеИмя(), "ПолноеИмя");
Если СтрокаТаблицы <> Неопределено Тогда
ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
КонецЕсли;
КонецПроцедуры
// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами.
Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.
Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт
ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.БезопасноеХранилищеДанных.Измерения.Владелец);
ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.Измерения.Владелец);
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента.
Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт
ДобавитьПараметрыРаботыКлиента(Параметры);
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений
Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт
// ФункциональныеОпцииИзменены
Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
"СтандартныеПодсистемы.БазоваяФункциональность.ФункциональныеОпцииИзменены");
Оповещение.ИмяМодуляОтправки = "СтандартныеПодсистемыСервер";
Оповещение.ИмяМодуляПолучения = "СтандартныеПодсистемыКлиент";
Оповещения.Вставить(Оповещение.Имя, Оповещение);
// ПовторноИспользуемыеЗначенияУстарели
Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
"СтандартныеПодсистемы.БазоваяФункциональность.ПовторноИспользуемыеЗначенияУстарели");
Оповещение.ИмяМодуляПолучения = "СтандартныеПодсистемыКлиент";
Оповещения.Вставить(Оповещение.Имя, Оповещение);
КонецПроцедуры
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке.
Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт
Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных);
КонецПроцедуры
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.
Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт
Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВИнтернете);
Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВЛокальнойСети);
Типы.Добавить(Метаданные.Константы.ИдентификаторИнформационнойБазы);
Типы.Добавить(Метаданные.Константы.ДоставлятьСерверныеОповещенияБезСистемыВзаимодействия);
Типы.Добавить(Метаданные.Константы.РегистрироватьПоказателиСерверныхОповещений);
МодульВыгрузкаЗагрузкаДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаДанных");
МодульВыгрузкаЗагрузкаДанных.ДополнитьТипомИсключаемымИзВыгрузкиЗагрузки(Типы,
Метаданные.Справочники.ВерсииРасширений,
МодульВыгрузкаЗагрузкаДанных.ДействиеСоСсылкамиНеИзменять());
МодульВыгрузкаЗагрузкаДанных.ДополнитьТипомИсключаемымИзВыгрузкиЗагрузки(Типы,
Метаданные.Справочники.ИдентификаторыОбъектовРасширений,
МодульВыгрузкаЗагрузкаДанных.ДействиеСоСсылкамиНеИзменять());
Типы.Добавить(Метаданные.РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных);
Типы.Добавить(Метаданные.РегистрыСведений.ИдентификаторыОбъектовВерсийРасширений);
Типы.Добавить(Метаданные.РегистрыСведений.ПараметрыРаботыВерсийРасширений);
КонецПроцедуры
// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.
Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт
МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
Разрешения = Новый Массив();
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина,
НСтр("ru = 'Для возможности работы программы.'")));
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима());
ЗапросыРазрешений.Добавить(
МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения));
ДобавитьЗапросРазрешенийНаИспользованиеРасширений(ЗапросыРазрешений);
КонецПроцедуры
// Параметры:
// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела.
//
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
Идентификатор = "КонтрольДинамическогоОбновленияПрограммы";
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = Идентификатор;
Дело.ЕстьДела = КонфигурацияБазыДанныхИзмененаДинамически()
Или Справочники.ВерсииРасширений.РасширенияИзмененыДинамически();
Дело.Важное = Ложь;
Дело.Представление = НСтр("ru = 'Установлено обновление программы'");
Дело.Форма = "ОбщаяФорма.КонтрольДинамическогоОбновления";
Дело.Владелец = НСтр("ru = 'Работа программы'");
МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер");
Если МодульТекущиеДелаСервер.ДелоОтключено("РекомендацияПоПовышениюСкоростиРаботы") Тогда
Возврат;
КонецЕсли;
Идентификатор = "РекомендацияПоПовышениюСкоростиРаботы";
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = Идентификатор;
Дело.ЕстьДела = ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти();
Дело.Важное = Истина;
Дело.Представление = НСтр("ru = 'Скорость работы снижена'");
Дело.Форма = "Обработка.РекомендацияПоПовышениюСкоростиРаботы.Форма";
Дело.Владелец = НСтр("ru = 'Работа программы'");
КонецПроцедуры
// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей
Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт
// ТолькоДляАдминистраторовСистемы.
НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить(
Метаданные.Роли.АдминистраторСистемы.Имя);
НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить(
Метаданные.Роли.Администрирование.Имя);
НазначениеРолей.ТолькоДляАдминистраторовСистемы.Добавить(
Метаданные.Роли.ОбновлениеКонфигурацииБазыДанных.Имя);
// ТолькоДляПользователейСистемы.
НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(
Метаданные.Роли.ЗапускТолстогоКлиента.Имя);
НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(
Метаданные.Роли.ЗапускВнешнегоСоединения.Имя);
НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(
Метаданные.Роли.ЗапускAutomation.Имя);
НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(
Метаданные.Роли.РежимТехническогоСпециалиста.Имя);
НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(
Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.Имя);
// ТолькоДляВнешнихПользователей.
НазначениеРолей.ТолькоДляВнешнихПользователей.Добавить(
Метаданные.Роли.БазовыеПраваВнешнихПользователейБСП.Имя);
// СовместноДляПользователейИВнешнихПользователей.
НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
Метаданные.Роли.ЗапускТонкогоКлиента.Имя);
НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
Метаданные.Роли.ЗапускВебКлиента.Имя);
НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
Метаданные.Роли.ЗапускМобильногоКлиента.Имя);
НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
Метаданные.Роли.ВыводНаПринтерФайлБуферОбмена.Имя);
НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
Метаданные.Роли.СохранениеДанныхПользователя.Имя);
КонецПроцедуры
// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.
Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт
ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.УдалениеУстаревшихПараметровРаботыВерсийРасширений.Имя);
ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ЗаполнениеПараметровРаботыРасширений.Имя);
КонецПроцедуры
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных.
Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт
// Фоновое обновление поставляемых профилей и параметров работы расширений.
РегистрыСведений.ПараметрыРаботыВерсийРасширений.ВключитьЗаполнениеПараметровРаботыРасширений(Ложь, Истина);
Если ОбщегоНазначения.РазделениеВключено() Тогда
РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗапуститьЗаполнениеПараметровРаботыРасширений(
НСтр("ru = 'Запуск с ожиданием после загрузки данных области'"),
Истина);
КонецЕсли;
КонецПроцедуры
// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "*";
Обработчик.Процедура = "СтандартныеПодсистемыСервер.УстановитьКонстантуНеИспользоватьРазделениеПоОбластямДанных";
Обработчик.Приоритет = 99;
Обработчик.ОбщиеДанные = Истина;
Обработчик.МонопольныйРежим = Истина;
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "*";
Обработчик.Процедура = "СтандартныеПодсистемыСервер.ПометитьЗаписиКэшаВерсийНеактуальными";
Обработчик.Приоритет = 99;
Обработчик.ОбщиеДанные = Истина;
Обработчик.РежимВыполнения = "Оперативно";
Обработчик = Обработчики.Добавить();
Обработчик.НачальноеЗаполнение = Истина;
Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.НачальноеЗаполнениеПредопределенныхДанных";
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "3.1.7.149";
Обработчик.Процедура = "СтандартныеПодсистемыСервер.ВключитьКонстантуДоставлятьСерверныеОповещенияБезСистемыВзаимодействия";
Обработчик.ОбщиеДанные = Истина;
Обработчик.НачальноеЗаполнение = Истина;
Обработчик.РежимВыполнения = "Оперативно";
КонецПроцедуры
// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий
Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт
Зависимость = Настройки.Добавить();
Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбработкаСервисовИнтеграции;
Зависимость.РаботаетСВнешнимиРесурсами = Истина;
КонецПроцедуры
// См. ИнтеграцияПодсистемБСП.ПриОпределенииОбъектовИсключаемыхИзПроверки
Процедура ПриОпределенииОбъектовИсключаемыхИзПроверки(Объекты) Экспорт
Объекты.Добавить(Метаданные.РегистрыСведений.ИдентификаторыОбъектовВерсийРасширений);
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере
Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт
ИмяПараметра = "СтандартныеПодсистемы.БазоваяФункциональность.КонтрольДинамическогоОбновления";
ПараметрыПроверки = Параметры.Получить(ИмяПараметра);
Если ПараметрыПроверки = Неопределено Тогда
Возврат;
КонецЕсли;
// ИзмененаКонфигурацияИлиРасширения
СообщениеПользователю = Неопределено;
ПриПериодическойПроверкеИзмененаКонфигурацияИлиРасширения(СообщениеПользователю);
Если СообщениеПользователю = Неопределено Тогда
Возврат;
КонецЕсли;
Результаты.Вставить(ИмяПараметра, СообщениеПользователю);
КонецПроцедуры
// См. ПользователиПереопределяемый.ПриПолученииПрочихНастроек.
Процедура ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт
ТекущееРасписание = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить("КонтрольДинамическогоОбновления",
"РасписаниеПроверкиПатчей",,,
СведенияОПользователе.ИмяПользователяИнформационнойБазы);
Если ТекущееРасписание <> Неопределено Тогда
СвойстваНастройки = Новый Структура;
СвойстваНастройки.Вставить("НазваниеНастройки", НСтр("ru = 'Расписание проверки новых патчей'"));
СвойстваНастройки.Вставить("КартинкаНастройки", БиблиотекаКартинок.Календарь);
СвойстваНастройки.Вставить("СписокНастроек", Новый СписокЗначений);
СвойстваНастройки.СписокНастроек.Добавить(ТекущееРасписание);
Настройки.Вставить("РасписаниеПроверкиПатчей", СвойстваНастройки);
КонецЕсли;
КонецПроцедуры
// См. ПользователиПереопределяемый.ПриСохраненииПрочихНастроек.
Процедура ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт
Если Настройки.ИдентификаторНастройки = "РасписаниеПроверкиПатчей" Тогда
Если Настройки.ЗначениеНастройки.Количество() = 1 Тогда
Расписание = Настройки.ЗначениеНастройки[0].Значение;
ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить("КонтрольДинамическогоОбновления", "РасписаниеПроверкиПатчей",
Расписание,,
СведенияОПользователе.ИмяПользователяИнформационнойБазы);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// См. ПользователиПереопределяемый.ПриУдаленииПрочихНастроек.
Процедура ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт
Если Настройки.ИдентификаторНастройки = "РасписаниеПроверкиПатчей" Тогда
ОбщегоНазначения.ХранилищеСистемныхНастроекУдалить("КонтрольДинамическогоОбновления",
"РасписаниеПроверкиПатчей",
СведенияОПользователе.ИмяПользователяИнформационнойБазы);
КонецЕсли;
КонецПроцедуры
// Формирует текст для вывода пользователю при необходимости динамического обновления.
//
// Параметры:
// ДинамическиеИзмененияКонфигурации - см. Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения
// УточняющаяСсылка - Строка
//
// Возвращаемое значение:
// Строка
//
Функция ТекстСообщенияПриДинамическомОбновлении(ДинамическиеИзмененияКонфигурации, УточняющаяСсылка = "") Экспорт
Сообщения = Новый Массив;
Если ДинамическиеИзмененияКонфигурации.КонфигурацияБазыДанныхИзмененаДинамически Тогда
ТекстСообщенияКонфигурация = НСтр("ru = 'Версия программы обновлена (внесены изменения в конфигурацию информационной базы).'");
Сообщения.Добавить(ТекстСообщенияКонфигурация);
КонецЕсли;
Если ДинамическиеИзмененияКонфигурации.Исправления <> Неопределено Тогда
Если ДинамическиеИзмененияКонфигурации.Исправления.Добавлено > 0
И ДинамическиеИзмененияКонфигурации.Исправления.Удалено > 0 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Установлены новые исправления (патчи): %1, удалены: %2.'") + УточняющаяСсылка;
ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Добавлено = 1 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Установлено новое исправление (патч).'") + УточняющаяСсылка;
ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Добавлено > 0 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Установлены новые исправления (патчи): %1.'") + УточняющаяСсылка;
ИначеЕсли ДинамическиеИзмененияКонфигурации.Исправления.Удалено > 0 Тогда
ТекстСообщенияПатчи = НСтр("ru = 'Удалены исправления (патчи): %2.'");
КонецЕсли;
ТекстСообщенияПатчи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияПатчи,
ДинамическиеИзмененияКонфигурации.Исправления.Добавлено,
ДинамическиеИзмененияКонфигурации.Исправления.Удалено);
Сообщения.Добавить(ТекстСообщенияПатчи);
КонецЕсли;
Если ДинамическиеИзмененияКонфигурации.Расширения <> Неопределено Тогда
Если ДинамическиеИзмененияКонфигурации.Расширения.Добавлено > 0 Тогда
ТекстСообщенияРасширения = НСтр("ru = 'Установлены новые расширения: %1.'");
ТекстСообщенияРасширения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияРасширения,
ДинамическиеИзмененияКонфигурации.Расширения.Добавлено);
Сообщения.Добавить(ТекстСообщенияРасширения);
КонецЕсли;
Если ДинамическиеИзмененияКонфигурации.Расширения.Удалено > 0 Тогда
ТекстСообщенияРасширения = НСтр("ru = 'Удалены расширения: %1.'");
ТекстСообщенияРасширения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияРасширения,
ДинамическиеИзмененияКонфигурации.Расширения.Удалено);
Сообщения.Добавить(ТекстСообщенияРасширения);
КонецЕсли;
Если ДинамическиеИзмененияКонфигурации.Расширения.Изменено > 0 Тогда
ТекстСообщенияРасширения = НСтр("ru = 'Изменены расширения: %1.'");
ТекстСообщенияРасширения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияРасширения,
ДинамическиеИзмененияКонфигурации.Расширения.Изменено);
Сообщения.Добавить(ТекстСообщенияРасширения);
КонецЕсли;
КонецЕсли;
Сообщения.Добавить(НСтр("ru = 'Для того чтобы применить, рекомендуется перезапустить программу и продолжить работу.'"));
Сообщения.Добавить(" ");
Возврат СтрСоединить(Сообщения, Символы.ПС);
КонецФункции
// Определяет формат сохранения в PDF в зависимости от используемой платформы.
//
// Возвращаемое значение:
// ТипФайлаТабличногоДокумента.
//
Функция ТипФайлаТабличногоДокументаPDF() Экспорт
Возврат ТипФайлаТабличногоДокумента["PDF_A_3"];
КонецФункции
// Определяет пользовательское представление формата сохранения в PDF в зависимости от используемой платформы.
//
// Возвращаемое значение:
// Строка.
//
Функция ПредставлениеТипаФайлаТабличногоДокументаPDF() Экспорт
Возврат НСтр("ru = 'Документ PDF/A (.pdf)'");
КонецФункции
Функция ЯзыкиКонфигурации() Экспорт
Языки = Новый Массив;
Для каждого Язык Из Метаданные.Языки Цикл
Языки.Добавить(Язык.КодЯзыка);
КонецЦикла;
Возврат Языки;
КонецФункции
// Параметры:
// Заголовки - Соответствие - см. в синтакс-помощнике описание параметра Заголовки объекта HTTPОтвет.
//
// Возвращаемое значение:
// Соответствие
//
Функция HTTPЗаголовкиВНижнийРегистр(Заголовки) Экспорт
Результат = Новый Соответствие;
Для каждого Заголовок Из Заголовки Цикл
Результат.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
// Параметры:
// Идентификатор - Строка - идентификатор компоненты.
// Местоположение - Строка - местоположение макета компоненты (без указания версии).
// ВнешняяКомпонента - Неопределено
// - Структура - данные внешней компоненты:
// * Идентификатор - Строка - идентификатор компоненты в справочнике.
// * Версия - Строка - версия.
// * Местоположение - Строка - местоположение.
// * Доступна - Булево - признак доступности.
//
// Возвращаемое значение:
// Структура:
// * Идентификатор - Строка - идентификатор компоненты в справочнике.
// * Местоположение - Строка - макет компоненты, адрес ссылки в справочнике.
// * Версия - Строка - версия.
//
Функция КомпонентаПоследнейВерсии(Идентификатор, Местоположение, ВнешняяКомпонента = Неопределено) Экспорт
КомпонентаПоследнейВерсии = Новый Структура;
КомпонентаПоследнейВерсии.Вставить("Идентификатор", Идентификатор);
КомпонентаПоследнейВерсии.Вставить("Местоположение", "");
КомпонентаПоследнейВерсии.Вставить("Версия", "");
// Информация о внешней компоненте.
Если ВнешняяКомпонента <> Неопределено И ВнешняяКомпонента.Доступна Тогда
ПоследняяВерсияВнешнейКомпоненты = Новый Структура("Версия, Местоположение",
ВнешняяКомпонента.Версия, ВнешняяКомпонента.Местоположение);
Иначе
ПоследняяВерсияВнешнейКомпоненты = Неопределено;
КонецЕсли;
// Информация о компоненте из макета.
Если ЗначениеЗаполнено(Местоположение) Тогда
ПоследняяВерсияКомпонентыИзМакета = СтандартныеПодсистемыПовтИсп.ПоследняяВерсияКомпонентыИзМакета(
Местоположение);
Иначе
ПоследняяВерсияКомпонентыИзМакета = Неопределено;
КонецЕсли;
Если ПоследняяВерсияВнешнейКомпоненты <> Неопределено И ПоследняяВерсияКомпонентыИзМакета <> Неопределено Тогда
ЧастиВерсии = СтрРазделить(ПоследняяВерсияВнешнейКомпоненты.Версия, ".");
Если ЧастиВерсии.Количество() = 4 Тогда
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПоследняяВерсияВнешнейКомпоненты.Версия,
ПоследняяВерсияКомпонентыИзМакета.Версия) > 0 Тогда
ЗаполнитьЗначенияСвойств(КомпонентаПоследнейВерсии, ПоследняяВерсияВнешнейКомпоненты);
Иначе
ЗаполнитьЗначенияСвойств(КомпонентаПоследнейВерсии, ПоследняяВерсияКомпонентыИзМакета);
КонецЕсли;
Иначе
// Если номер версии компоненты не соответствует шаблону, используется компонента из справочника.
ЗаполнитьЗначенияСвойств(КомпонентаПоследнейВерсии, ПоследняяВерсияВнешнейКомпоненты);
КонецЕсли;
Возврат КомпонентаПоследнейВерсии;
ИначеЕсли ПоследняяВерсияКомпонентыИзМакета <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(КомпонентаПоследнейВерсии, ПоследняяВерсияКомпонентыИзМакета);
Возврат КомпонентаПоследнейВерсии;
ИначеЕсли ПоследняяВерсияВнешнейКомпоненты <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(КомпонентаПоследнейВерсии, ПоследняяВерсияВнешнейКомпоненты);
Возврат КомпонентаПоследнейВерсии;
КонецЕсли;
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Не существует внешняя компонента с идентификатором %1'"), Идентификатор);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
//
// Параметры:
// см. описание обработчика события ПриОтправкеДанныхГлавному() в синтакс-помощнике.
//
Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Знач Получатель)
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
// Отправка идентификаторов объектов метаданных выполняется в другой секции сообщения обмена.
ИгнорироватьОтправкуИдентификаторовОбъектовМетаданных(ЭлементДанных, ОтправкаЭлемента);
Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
Возврат;
КонецЕсли;
ИнтеграцияПодсистемБСП.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель);
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда
МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
МодульОбменДаннымиСервер.РассчитатьПроцентВыгрузкиРИБ(Получатель, Ложь);
КонецЕсли;
КонецПроцедуры
// Заполняет структуру параметров, необходимых для работы клиентского кода
// данной подсистемы при запуске конфигурации, т.е. в обработчиках событий.
// - ПередНачаломРаботыСистемы,
// - ПриНачалеРаботыСистемы.
//
// Важно: при запуске недопустимо использовать команды сброса кэша
// повторно используемых модулей, иначе запуск может привести
// к непредсказуемым ошибкам и лишним серверным вызовам.
//
// Параметры:
// Параметры - Структура - структура параметров.
//
// Возвращаемое значение:
// Булево - Ложь, если дальнейшее заполнение параметров необходимо прервать.
//
Функция ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт
ЭтоВызовПередНачаломРаботыСистемы = Параметры.ПолученныеПараметрыКлиента <> Неопределено;
Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация();
Иначе
ЭтоРазделеннаяКонфигурация = Ложь;
КонецЕсли;
// Обязательные параметры для продолжения работы.
Параметры.Вставить("РазделениеВключено", ОбщегоНазначения.РазделениеВключено());
Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных",
ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных());
Параметры.Вставить("ЭтоРазделеннаяКонфигурация", ЭтоРазделеннаяКонфигурация);
Параметры.Вставить("ЕстьДоступДляОбновленияВерсииПлатформы", Пользователи.ЭтоПолноправныйПользователь(,Истина));
Параметры.Вставить("ИменаПодсистем", СтандартныеПодсистемыПовтИсп.ИменаПодсистем());
Параметры.Вставить("ЭтоБазоваяВерсияКонфигурации", ЭтоБазоваяВерсияКонфигурации());
Параметры.Вставить("ЭтоУчебнаяПлатформа", ЭтоУчебнаяПлатформа());
Параметры.Вставить("ИмяТекущегоПользователя", ТекущийПользователь().Имя);
Параметры.Вставить("ИмяCOMСоединителя", ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя());
Параметры.Вставить("КодОсновногоЯзыка", ОбщегоНазначения.КодОсновногоЯзыка());
Параметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", ЗапрашиватьПодтверждениеПриЗавершенииПрограммы());
ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности();
Параметры.Вставить("МинимальнаяВерсияПлатформы", ОбщиеПараметры.МинимальнаяВерсияПлатформы);
Параметры.Вставить("РекомендуемаяВерсияПлатформы", ОбщиеПараметры.РекомендуемаяВерсияПлатформы);
// Устарели. Для обратной совместимости.
Параметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы);
Параметры.Вставить("РаботаВПрограммеЗапрещена", ОбщиеПараметры.РаботаВПрограммеЗапрещена);
Параметры.Вставить("РекомендуемыйОбъемОперативнойПамяти", ОбщиеПараметры.РекомендуемыйОбъемОперативнойПамяти);
Параметры.Вставить("ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти", ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти()
И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела"));
Параметры.Вставить("ЭтоСеансВнешнегоПользователя", Пользователи.ЭтоСеансВнешнегоПользователя());
Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая());
Если ИспользуетсяНедопустимаяВерсияПлатформы() Тогда
Параметры.Вставить("ИспользуетсяНедопустимаяВерсияПлатформы");
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы Тогда
Параметры.Вставить("ЭлементыСтиля", НаборЭлементовСтиля());
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОпцииИнтерфейса") Тогда
Параметры.Вставить("ОпцииИнтерфейса", СтандартныеПодсистемыПовтИсп.ОпцииИнтерфейса());
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы Тогда
ОшибкаНедостаточноПравДляВходаВПрограмму = ПользователиСлужебный.ОшибкаНедостаточноПравДляВходаВПрограмму(
Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОшибкаНедостаточноПравДляВходаВПрограмму"));
Если ЗначениеЗаполнено(ОшибкаНедостаточноПравДляВходаВПрограмму) Тогда
Параметры.Вставить("ОшибкаНедостаточноПравДляВходаВПрограмму", ОшибкаНедостаточноПравДляВходаВПрограмму);
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда
МодульБлокировкаРаботыСВнешнимиРесурсами = ОбщегоНазначения.ОбщийМодуль("БлокировкаРаботыСВнешнимиРесурсами");
МодульБлокировкаРаботыСВнешнимиРесурсами.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(
Параметры, ЭтоВызовПередНачаломРаботыСистемы);
Если РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда
Параметры.Вставить("РаботаСВнешнимиРесурсамиЗаблокирована");
КонецЕсли;
КонецЕсли;
Если Не ОбновлениеИнформационнойБазыСлужебный.ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры)
И ЭтоВызовПередНачаломРаботыСистемы Тогда
Возврат Ложь;
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ПоказатьНерекомендуемуюВерсиюПлатформы")
И ПоказатьНерекомендуемуюВерсиюПлатформы(Параметры) Тогда
Параметры.Вставить("ПоказатьНерекомендуемуюВерсиюПлатформы");
СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы();
Возврат Ложь;
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ВосстановитьСвязьСГлавнымУзлом")
И Не ОбщегоНазначения.РазделениеВключено() Тогда
УстановитьПривилегированныйРежим(Истина);
ВосстановитьСвязьСГлавнымУзлом = ПланыОбмена.ГлавныйУзел() = Неопределено
И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить());
УстановитьПривилегированныйРежим(Ложь);
Если ВосстановитьСвязьСГлавнымУзлом Тогда
Параметры.Вставить("ВосстановитьСвязьСГлавнымУзлом", Пользователи.ЭтоПолноправныйПользователь(, Истина));
СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы();
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ВыбратьНачальныеРегиональныеНастройкиИБ")
И ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Тогда
Параметры.Вставить("ВыбратьНачальныеРегиональныеНастройкиИБ",
Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь));
СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы();
Возврат Ложь;
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса") Тогда
ОписаниеОшибки = "";
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
МодульРаботаВМоделиСервиса.ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(ОписаниеОшибки);
Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
Параметры.Вставить("ОбластьДанныхЗаблокирована", ОписаниеОшибки);
// Работа будет завершена.
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("СерверныеОповещения") Тогда
СерверныеОповещения.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры);
КонецЕсли;
Если ПараметрыСеанса.ВыполняетсяОбновлениеИБ <> Неопределено // Обязательная инициализация параметра сеанса.
И Не Параметры.РазделениеВключено
И ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы()
И ОбновлениеИнформационнойБазыСлужебный.СтатусНевыполненныхОбработчиков(Истина) = "СтатусНеВыполнено" Тогда
Параметры.Вставить("НеобходимоВыполнитьОбработчикиОтложенногоОбновления");
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
МодульРаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Истина);
КонецЕсли;
Если ЭтоВызовПередНачаломРаботыСистемы
И НЕ Параметры.ПолученныеПараметрыКлиента.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском")
И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ()
И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда
МодульОбменДаннымиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСлужебный");
Если МодульОбменДаннымиСлужебный.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Тогда
Параметры.Вставить("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском");
Возврат Ложь;
КонецЕсли;
КонецЕсли;
// Проверка необходимости предварительного обновления параметров работы программы.
Если ЭтоВызовПередНачаломРаботыСистемы
И Не Параметры.ПолученныеПараметрыКлиента.Свойство("НеобходимоОбновлениеПараметровРаботыПрограммы")
И Не Параметры.Свойство("УпрощеннаяФормаОбновленияИБ") Тогда
НастройкаПодчиненногоУзлаРИБ = Ложь;
Если РегистрыСведений.ПараметрыРаботыПрограммы.НеобходимоОбновление(НастройкаПодчиненногоУзлаРИБ) Тогда
// Будет выполнено предварительное обновление.
Параметры.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы");
Если НастройкаПодчиненногоУзлаРИБ
И ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
ШаблонОшибки =
НСтр("ru = 'Не удалось установить монопольный режим для настройки узла РИБ по причине:
|%1'");
УстановитьМонопольныйРежимПриЗапуске(Истина, ШаблонОшибки);
КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецЕсли;
// Обязательные параметры для всех режимов работы.
Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация);
Если ОбновлениеИнформационнойБазыСлужебный.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы() Тогда
Параметры.Вставить("НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы");
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
МодульРаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры);
КонецЕсли;
Если Не Параметры.ДоступноИспользованиеРазделенныхДанных Тогда
Возврат Истина;
КонецЕсли;
// Параметры для работы в локальном режиме или
// в сеансе с установленными значениями разделителей в модели сервиса.
Если ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда
Параметры.Вставить("НеобходимоОбновлениеИнформационнойБазы");
СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы();
КонецЕсли;
Если Не Параметры.РазделениеВключено
И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда
МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
Если МодульОбменДаннымиСервер.ЗагрузитьСообщениеОбменаДанными() Тогда
Параметры.Вставить("ЗагрузитьСообщениеОбменаДанными");
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда
МодульАвтономнаяРабота = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРабота");
Если МодульАвтономнаяРабота.ПродолжитьНастройкуАвтономногоРабочегоМеста(Параметры) Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Отказ = Ложь;
Если ЭтоВызовПередНачаломРаботыСистемы Тогда
ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Отказ, Истина);
КонецЕсли;
Если Отказ Тогда
Возврат Ложь;
КонецЕсли;
ДобавитьОбщиеПараметрыРаботыКлиента(Параметры);
Если ЭтоВызовПередНачаломРаботыСистемы
И (Параметры.Свойство("НеобходимоОбновлениеИнформационнойБазы")
Или ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()) Тогда
// Не следует добавлять остальные параметры до окончания обновления ИБ,
// так как они могут рассчитывать, что обновление ИБ уже выполнено.
Возврат Ложь;
КонецЕсли;
УстановитьМонопольныйРежимПриЗапуске(Ложь);
Возврат Истина;
КонецФункции
// Заполняет структуру параметров, необходимых для работы клиентского кода
// данной подсистемы.
//
// Параметры:
// Параметры - Структура
//
Процедура ДобавитьПараметрыРаботыКлиента(Параметры)
Параметры.Вставить("ИменаПодсистем", СтандартныеПодсистемыПовтИсп.ИменаПодсистем());
Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных",
ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных());
Параметры.Вставить("РазделениеВключено", ОбщегоНазначения.РазделениеВключено());
Параметры.Вставить("ЭтоБазоваяВерсияКонфигурации", ЭтоБазоваяВерсияКонфигурации());
Параметры.Вставить("ЭтоУчебнаяПлатформа", ЭтоУчебнаяПлатформа());
Параметры.Вставить("ИмяCOMСоединителя", ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя());
Параметры.Вставить("ЭлементыСтиля", НаборЭлементовСтиля());
ДобавитьОбщиеПараметрыРаботыКлиента(Параметры);
Параметры.Вставить("ИмяКонфигурации", Метаданные.Имя);
Параметры.Вставить("СинонимКонфигурации", Метаданные.Синоним);
Параметры.Вставить("ВерсияКонфигурации", Метаданные.Версия);
Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация);
Параметры.Вставить("КодОсновногоЯзыка", ОбщегоНазначения.КодОсновногоЯзыка());
Параметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы",
ЗапрашиватьПодтверждениеПриЗавершенииПрограммы());
Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая());
Если РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда
Параметры.Вставить("РаботаСВнешнимиРесурсамиЗаблокирована");
КонецЕсли;
Параметры.Вставить("ВерсияРежимаСовместимости", ВерсияРежимаСовместимости());
КонецПроцедуры
// Заполняет структуру параметров, необходимых для работы клиентского кода
// при запуске конфигурации и в дальнейшем во время работы с ней.
//
// Параметры:
// Параметры - Структура - структура параметров.
//
Процедура ДобавитьОбщиеПараметрыРаботыКлиента(Параметры)
Если Не Параметры.РазделениеВключено Или Параметры.ДоступноИспользованиеРазделенныхДанных Тогда
УстановитьПривилегированныйРежим(Истина);
Параметры.Вставить("АвторизованныйПользователь", Пользователи.АвторизованныйПользователь());
Параметры.Вставить("ЗаголовокПриложения", СокрЛП(Константы.ЗаголовокСистемы.Получить()));
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
Параметры.Вставить("ЭтоГлавныйУзел", НЕ ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ());
Параметры.Вставить("ТребуетсяОбновлениеКонфигурацииУзлаРИБ",
ОбщегоНазначения.ТребуетсяОбновлениеКонфигурацииПодчиненногоУзлаРИБ());
КонецПроцедуры
// Возвращает номера версий, поддерживаемых программным интерфейсом ИмяИнтерфейса.
// См. ОбщегоНазначения.ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение.
//
// Параметры:
// ИмяИнтерфейса - Строка - имя программного интерфейса.
//
// Возвращаемое значение:
// Массив - список версий типа Строка.
//
Функция ПоддерживаемыеВерсии(ИмяИнтерфейса) Экспорт
МассивВерсий = Неопределено;
СтруктураПоддерживаемыхВерсий = Новый Структура;
ИнтеграцияПодсистемБСП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий);
СтруктураПоддерживаемыхВерсий.Свойство(ИмяИнтерфейса, МассивВерсий);
Если МассивВерсий = Неопределено Тогда
Возврат ОбщегоНазначения.ЗначениеВСтрокуXML(Новый Массив);
Иначе
Возврат ОбщегоНазначения.ЗначениеВСтрокуXML(МассивВерсий);
КонецЕсли;
КонецФункции
// Устанавливает общую форму ПустойРабочийСтол на рабочий стол.
Процедура УстановитьПустуюФормуНаРабочийСтол() Экспорт
КлючОбъекта = "Общее/НастройкиНачальнойСтраницы";
ТекущиеНастройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта);
Если ТипЗнч(ТекущиеНастройки) = Тип("НастройкиНачальнойСтраницы") Тогда
ТекущийСоставФорм = ТекущиеНастройки.ПолучитьСоставФорм();
Если ТекущийСоставФорм.ПраваяКолонка.Количество() = 0
И ТекущийСоставФорм.ЛеваяКолонка.Количество() = 1
И ТекущийСоставФорм.ЛеваяКолонка[0] = "ОбщаяФорма.ПустойРабочийСтол" Тогда
Возврат;
КонецЕсли;
КонецЕсли;
СоставФорм = Новый СоставФормНачальнойСтраницы;
СоставФорм.ЛеваяКолонка.Добавить("ОбщаяФорма.ПустойРабочийСтол");
Настройки = Новый НастройкиНачальнойСтраницы;
Настройки.УстановитьСоставФорм(СоставФорм);
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, "", Настройки);
КонецПроцедуры
// Параметры:
// Установить - Булево
// ШаблонОшибки - Строка
//
Процедура УстановитьМонопольныйРежимПриЗапуске(Установить, ШаблонОшибки = "")
Если Установить И МонопольныйРежим() Тогда
Возврат;
КонецЕсли;
ИмяПараметра = "УстановленМонопольныйРежимПриЗапуске";
УстановитьПривилегированныйРежим(Истина);
Если Установить Тогда
Попытка
УстановитьМонопольныйРежим(Истина);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки,
ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
ВызватьИсключение ТекстОшибки;
КонецПопытки;
ТекущиеПараметры = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере);
ТекущиеПараметры.Вставить(ИмяПараметра, Истина);
ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ТекущиеПараметры);
ИначеЕсли ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить(ИмяПараметра) <> Неопределено Тогда
Если МонопольныйРежим() Тогда
УстановитьМонопольныйРежим(Ложь);
КонецЕсли;
ТекущиеПараметры = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере);
ТекущиеПараметры.Вставить(ИмяПараметра, Истина);
ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ТекущиеПараметры);
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
// Обработчик одноименного регламентного задания.
//
Процедура ОбработкаСервисовИнтеграции() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбработкаСервисовИнтеграции);
Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
СервисыИнтеграции.ВыполнитьОбработку();
КонецПроцедуры
// Параметры:
// ИмяПользователя - Строка
//
// Возвращаемое значение:
// Булево
//
Функция ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммыДляПользователя(ИмяПользователя = Неопределено)
Результат = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"ОбщиеНастройкиПользователя",
"ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы",,,
ИмяПользователя);
Если Результат = Неопределено Тогда
Результат = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.
// Устанавливает значение константам НеИспользоватьРазделениеПоОбластямДанных и
// СтандартныеПодсистемыВАвтономномРежиме на основании значения ИспользоватьРазделениеПоОбластямДанных.
//
Процедура УстановитьКонстантуНеИспользоватьРазделениеПоОбластямДанных(Параметры) Экспорт
НовыеЗначения = Новый Соответствие;
Если Константы.ИспользоватьРазделениеПоОбластямДанных.Получить() Тогда
НовыеЗначения.Вставить("НеИспользоватьРазделениеПоОбластямДанных", Ложь);
НовыеЗначения.Вставить("СтандартныеПодсистемыВАвтономномРежиме", Ложь);
ИначеЕсли ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
НовыеЗначения.Вставить("НеИспользоватьРазделениеПоОбластямДанных", Ложь);
НовыеЗначения.Вставить("СтандартныеПодсистемыВАвтономномРежиме", Истина);
Иначе
НовыеЗначения.Вставить("НеИспользоватьРазделениеПоОбластямДанных", Истина);
НовыеЗначения.Вставить("СтандартныеПодсистемыВАвтономномРежиме", Ложь);
КонецЕсли;
ЭтоОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса");
Для каждого НовоеЗначение Из НовыеЗначения Цикл
Если ЭтоОбменДаннымиВМоделиСервиса
И НовоеЗначение.Ключ = "СтандартныеПодсистемыВАвтономномРежиме" Тогда
ПредыдущееЗначение = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто();
// Всегда синхронизируем константу СтандартныеПодсистемыВАвтономномРежиме с ЭтоАвтономноеРабочееМесто
Константы[НовоеЗначение.Ключ].Установить(НовоеЗначение.Значение);
Иначе
ПредыдущееЗначение = Константы[НовоеЗначение.Ключ].Получить();
КонецЕсли;
Если ПредыдущееЗначение <> НовоеЗначение.Значение Тогда
Если НЕ Параметры.МонопольныйРежим Тогда
Параметры.МонопольныйРежим = Истина;
Возврат; // Требуется изменение значения, поэтому монопольный режим.
КонецЕсли;
Константы[НовоеЗначение.Ключ].Установить(НовоеЗначение.Значение);
Если ЭтоОбменДаннымиВМоделиСервиса
И НовоеЗначение.Ключ = "СтандартныеПодсистемыВАвтономномРежиме"
И ПредыдущееЗначение Тогда
МодульАвтономнаяРабота = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРабота");
МодульАвтономнаяРабота.ВыключитьСвойствоИБ();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Сбрасывает дату обновления всех записей кэша версий, таким
// образом все записи кэша начинают считаться неактуальными.
//
Процедура ПометитьЗаписиКэшаВерсийНеактуальными() Экспорт
НачатьТранзакцию();
Попытка
НаборЗаписей = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей();
Блокировка = Новый БлокировкаДанных;
Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов");
Блокировка.Заблокировать();
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.ДатаОбновления = Неопределено;
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ВключитьКонстантуДоставлятьСерверныеОповещенияБезСистемыВзаимодействия() Экспорт
Константы.ДоставлятьСерверныеОповещенияБезСистемыВзаимодействия.Установить(Истина);
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.
Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт
Библиотека = "СтандартныеПодсистемы";
СтароеИмя = "Роль.БазовыеПрава";
НовоеИмя = "Роль.БазовыеПраваБСП";
ОбщегоНазначения.ДобавитьПереименование(Итог, "3.0.1.19", СтароеИмя, НовоеИмя, Библиотека);
СтароеИмя = "Роль.БазовыеПраваВнешнегоПользователя";
НовоеИмя = "Роль.БазовыеПраваВнешнихПользователейБСП";
ОбщегоНазначения.ДобавитьПереименование(Итог, "3.0.1.19", СтароеИмя, НовоеИмя, Библиотека);
СтароеИмя = "Роль.РежимВсеФункции";
НовоеИмя = "Роль.РежимТехническогоСпециалиста";
ОбщегоНазначения.ДобавитьПереименование(Итог, "3.1.5.153", СтароеИмя, НовоеИмя, Библиотека);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики подписок на события.
// Обработчик события ПередЗаписью предопределенных элементов.
Процедура ЗапретитьПометкуУдаленияПредопределенныхЭлементовПередЗаписью(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Источник.ПометкаУдаления <> Истина Тогда
Возврат;
КонецЕсли;
ИмяРеквизита = "";
ЗначениеРеквизита = "";
Если Не ЭтоПредопределенныеДанные(Источник, ИмяРеквизита, ЗначениеРеквизита) Тогда
Возврат;
КонецЕсли;
Если Источник.ЭтоНовый() Тогда
ВызватьИсключение
НСтр("ru = 'Недопустимо создавать предопределенный элемент, помеченный на удаление.'");
КонецЕсли;
СтарыеСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Источник.Ссылка,
"ПометкаУдаления, ИмяПредопределенныхДанных"
+ ?(ИмяРеквизита <> "ИмяПредопределенныхДанных", ", " + ИмяРеквизита, ""));
Если (СтарыеСвойства.ИмяПредопределенныхДанных <> "" Или ИмяРеквизита <> "" И ЗначениеЗаполнено(СтарыеСвойства[ИмяРеквизита]))
И СтарыеСвойства.ПометкаУдаления <> Истина Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недопустимо помечать на удаление предопределенный элемент:
|""%1"".'"),
Строка(Источник.Ссылка));
ИначеЕсли (ЗначениеЗаполнено(ЗначениеРеквизита) И Не ЗначениеЗаполнено(СтарыеСвойства[ИмяРеквизита])
Или СтарыеСвойства.ИмяПредопределенныхДанных = "")
И СтарыеСвойства.ПометкаУдаления = Истина Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недопустимо связывать с именем предопределенного элемент, помеченный на удаление:
|""%1"".'"),
Строка(Источник.Ссылка));
КонецЕсли;
КонецПроцедуры
// Обработчик события ПередУдалением предопределенных элементов.
Процедура ЗапретитьУдалениеПредопределенныхЭлементовПередУдалением(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Не ЭтоПредопределенныеДанные(Источник) Тогда
Возврат;
КонецЕсли;
ЗначенияРеквизитов = Новый Структура("Владелец");
ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов, Источник);
Если ЗначениеЗаполнено(ЗначенияРеквизитов.Владелец) И ЗначенияРеквизитов.Владелец.ПолучитьОбъект() = Неопределено Тогда
Возврат;
КонецЕсли;
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недопустимо удалять предопределенный элемент
|""%1"".'"),
Строка(Источник.Ссылка));
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработка подписок на события планов обмена РИБ.
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание параметров в обработчике события ПриОтправкеДанныхПодчиненному в синтакс-помощнике.
//
// Параметры:
// Источник - ПланОбменаОбъект
// ЭлементДанных - Произвольный
// ОтправкаЭлемента - ОтправкаЭлементаДанных
// СозданиеНачальногоОбраза - Булево
//
Процедура ПриОтправкеДанныхПодчиненномуСобытие(Источник, ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза) Экспорт
ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Источник);
Если ОтправкаЭлемента <> ОтправкаЭлементаДанных.Игнорировать Тогда
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриОтправкеДанныхПодчиненному(Источник, ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза);
КонецЕсли;
КонецПроцедуры
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание параметров в обработчике события ПриОтправкеДанныхГлавному в синтакс-помощнике.
//
// Параметры:
// Источник - ПланОбменаОбъект
// ЭлементДанных - Произвольный
// ОтправкаЭлемента - ОтправкаЭлементаДанных
//
Процедура ПриОтправкеДанныхГлавномуСобытие(Источник, ЭлементДанных, ОтправкаЭлемента) Экспорт
ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Источник);
Если ОтправкаЭлемента <> ОтправкаЭлементаДанных.Игнорировать Тогда
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриОтправкеДанныхГлавному(Источник, ЭлементДанных, ОтправкаЭлемента);
КонецЕсли;
КонецПроцедуры
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание параметров в обработчике события ПриПолученииДанныхОтПодчиненного в синтакс-помощнике.
//
// Параметры:
// Источник - ПланОбменаОбъект
// ЭлементДанных - Произвольный
// ПолучениеЭлемента - ПолучениеЭлементаДанных
// ОтправкаНазад - Булево
//
Процедура ПриПолученииДанныхОтПодчиненногоСобытие(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Экспорт
ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Источник);
Если ПолучениеЭлемента <> ПолучениеЭлементаДанных.Игнорировать Тогда
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтПодчиненного(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад);
КонецЕсли;
КонецПроцедуры
// Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной
// информационной базе.
// См. описание обработчика события ПриПолученииДанныхОтГлавного в синтакс-помощнике.
//
// Параметры:
// Источник - ПланОбменаОбъект
// ЭлементДанных - Произвольный
// ПолучениеЭлемента - ПолучениеЭлементаДанных
// ОтправкаНазад - Булево
//
Процедура ПриПолученииДанныхОтГлавногоСобытие(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Экспорт
ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Источник);
Если ПолучениеЭлемента <> ПолучениеЭлементаДанных.Игнорировать Тогда
// Вызов переопределяемого обработчика для выполнения прикладной логики обмена РИБ.
ОбщегоНазначенияПереопределяемый.ПриПолученииДанныхОтГлавного(Источник, ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад);
КонецЕсли;
КонецПроцедуры
// Процедура-обработчик подписки на событие ПередЗаписью для ПланОбменаОбъект.
// Используется для вызова обработчика события ПослеПолученияДанных при обмене в распределенной ИБ.
//
// Параметры:
// Источник - ПланОбменаОбъект
// Отказ - Булево
//
Процедура ПослеПолученияДанных(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Не Источник.Метаданные().РаспределеннаяИнформационнаяБаза Тогда
Возврат;
КонецЕсли;
Если Источник.ЭтоНовый()
Или Источник.НомерПринятого = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "НомерПринятого") Тогда
Возврат;
КонецЕсли;
ПолучениеИзГлавногоУзла = (ПланыОбмена.ГлавныйУзел() = Источник.Ссылка);
ИнтеграцияПодсистемБСП.ПослеПолученияДанных(Источник, Отказ, ПолучениеИзГлавногоУзла);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
// Возвращаемое значение:
// Массив из ОбъектМетаданных
//
Функция ОбъектыМетаданныхВсехПредопределенныхДанных()
РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
ЭтоРазделенныйСеанс = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
КоллекцииМетаданных = Новый Массив;
КоллекцииМетаданных.Добавить(Метаданные.Справочники);
КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик);
КоллекцииМетаданных.Добавить(Метаданные.ПланыСчетов);
КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовРасчета);
ОбъектыМетаданных = Новый Массив;
Для Каждого Коллекция Из КоллекцииМетаданных Цикл
Для Каждого ОбъектМетаданных Из Коллекция Цикл
Если РазделениеВключено Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных);
Если ( ЭтоРазделенныйСеанс И Не ЭтоРазделенныйОбъектМетаданных)
Или (Не ЭтоРазделенныйСеанс И ЭтоРазделенныйОбъектМетаданных) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ОбъектыМетаданных.Добавить(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
Возврат ОбъектыМетаданных;
КонецФункции
Процедура УстановитьИнициализациюВсехПредопределенныхДанных(ОбъектыМетаданных)
РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
ЭтоРазделенныйСеанс = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Истина);
КонецЦикла;
Если Не РазделениеВключено Или Не ЭтоРазделенныйСеанс Тогда
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.Авто);
КонецЕсли;
КонецПроцедуры
Процедура СоздатьНедостающиеПредопределенныеДанные(ОбъектыМетаданных)
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка,
| ПсевдонимЗаданнойТаблицы.ВерсияДанных КАК ВерсияДанных,
| ЕСТЬNULL(ПсевдонимЗаданнойТаблицы.Родитель.ИмяПредопределенныхДанных, """") КАК ИмяРодителя,
| ПсевдонимЗаданнойТаблицы.ИмяПредопределенныхДанных КАК Имя
|ИЗ
| &ТекущаяТаблица КАК ПсевдонимЗаданнойТаблицы
|ГДЕ
| ПсевдонимЗаданнойТаблицы.Предопределенный";
ОписанияСохраненных = Новый Массив;
ТаблицыБезСохраненных = Новый Массив;
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если ОбъектМетаданных.ОбновлениеПредопределенныхДанных
= Метаданные.СвойстваОбъектов.ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически Тогда
Продолжить;
КонецЕсли;
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", ПолноеИмя);
Если Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)
Или Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)
Или Не ОбъектМетаданных.Иерархический Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"ЕСТЬNULL(ПсевдонимЗаданнойТаблицы.Родитель.ИмяПредопределенныхДанных, """")", """""");
КонецЕсли;
// АПК:1328-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка.
// @skip-check query-in-loop - Порционная обработка данных
ТаблицаИмен = Запрос.Выполнить().Выгрузить();
// АПК:1328-вкл.
ТаблицаИмен.Индексы.Добавить("Имя");
Имена = ОбъектМетаданных.ПолучитьИменаПредопределенных();
СохранитьСуществующиеПредопределенныеОбъектыПередСозданиемНедостающих(ОбъектМетаданных,
ПолноеИмя, ТаблицаИмен, Имена, Запрос, ОписанияСохраненных, ТаблицыБезСохраненных);
КонецЦикла;
// Восстановление предопределенных элементов, существовавших до инициализации.
Для Каждого ОписаниеСохраненных Из ОписанияСохраненных Цикл
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОписаниеСохраненных.ПолноеИмя);
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Ложь);
ИнициализироватьПредопределенныеДанные();
Запрос.Текст = ОписаниеСохраненных.ТекстЗапроса;
// АПК:1328-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка.
// @skip-check query-in-loop - Порционная обработка данных
ТаблицаИмен = Запрос.Выполнить().Выгрузить();
// АПК:1328-вкл.
ТаблицаИмен.Индексы.Добавить("Имя");
Для Каждого ОписаниеСохраненного Из ОписаниеСохраненных.ТаблицаИмен Цикл
Если Не ОписаниеСохраненного.ОбъектСуществует Тогда
Продолжить;
КонецЕсли;
Строка = ТаблицаИмен.Найти(ОписаниеСохраненного.Имя, "Имя");
Если Строка <> Неопределено Тогда
НовыйОбъект = Строка.Ссылка.ПолучитьОбъект();
Если ОписаниеСохраненных.ЭтоПланСчетов Тогда
Если ОписаниеСохраненного.Объект.ВерсияДанных <> Строка.ВерсияДанных Тогда
ОбновитьОбъектСчета(ОписаниеСохраненного.Объект);
КонецЕсли;
ДополнитьНовыеВидыСубконтоСчета(ОписаниеСохраненного.Объект, НовыйОбъект);
КонецЕсли;
// АПК:1327-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка.
ОбновлениеИнформационнойБазы.УдалитьДанные(НовыйОбъект);
// АПК:1327-вкл.
Строка.Имя = "";
КонецЕсли;
// АПК:1327-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка.
ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОписаниеСохраненного.Объект);
// АПК:1327-вкл.
КонецЦикла;
Для Каждого Строка Из ТаблицаИмен Цикл
Если Не ЗначениеЗаполнено(Строка.Имя)
Или Не ЗначениеЗаполнено(Строка.ИмяРодителя) Тогда
Продолжить;
КонецЕсли;
СтрокаРодителя = ОписаниеСохраненных.ТаблицаИмен.Найти(Строка.ИмяРодителя, "Имя"); // СправочникСсылка, ПланВидовХарактеристикСсылка, ПланСчетовСсылка, ПланВидовРасчетаСсылка
Если СтрокаРодителя <> Неопределено Тогда
НовыйОбъект = Строка.Ссылка.ПолучитьОбъект();
НовыйОбъект.Родитель = СтрокаРодителя.Ссылка;
// АПК:1327-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка.
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НовыйОбъект);
// АПК:1327-вкл.
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого ПолноеИмя Из ТаблицыБезСохраненных Цикл
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Ложь);
КонецЦикла;
ИнициализироватьПредопределенныеДанные();
КонецПроцедуры
// Параметры:
// СтарыйОбъект - ПланСчетовОбъект
//
Процедура ОбновитьОбъектСчета(СтарыйОбъект)
НовыйОбъект = СтарыйОбъект.Ссылка.ПолучитьОбъект();
НовыйОбъект.ИмяПредопределенныхДанных = СтарыйОбъект.ИмяПредопределенныхДанных;
Для Каждого СтрокаВидаСубконто Из СтарыйОбъект.ВидыСубконто Цикл
Если СтрокаВидаСубконто.Предопределенное Тогда
НоваяСтрокаВидаСубконто = НовыйОбъект.ВидыСубконто.Найти(
СтрокаВидаСубконто.ВидСубконто, "ВидСубконто");
Если НоваяСтрокаВидаСубконто <> Неопределено Тогда
НоваяСтрокаВидаСубконто.Предопределенное = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
СтарыйОбъект = НовыйОбъект;
КонецПроцедуры
// Параметры:
// Счет - ПланСчетовОбъект
// ОбразецСчета - ПланСчетовОбъект
//
Процедура ДополнитьНовыеВидыСубконтоСчета(Счет, ОбразецСчета)
Для Каждого Строка Из ОбразецСчета.ВидыСубконто Цикл
Индекс = ОбразецСчета.ВидыСубконто.Индекс(Строка);
Если Счет.ВидыСубконто.Количество() > Индекс Тогда
Если Счет.ВидыСубконто[Индекс].ВидСубконто <> Строка.ВидСубконто Тогда
ЗаписьЖурналаРегистрации(
НСтр("ru = 'Обмен данными.Отключение связи с главным узлом'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Счет.Метаданные(),
Счет,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'У счета ""%1"" субконто №%2 ""%3"" не совпадает с предопределенным субконто ""%4"".'"),
Строка(Счет),
Индекс + 1,
Строка(Счет.ВидыСубконто[Индекс].ВидСубконто),
Строка(Строка.ВидСубконто)),
РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
ИначеЕсли Не Счет.ВидыСубконто[Индекс].Предопределенное Тогда
Счет.ВидыСубконто[Индекс].Предопределенное = Истина;
КонецЕсли;
Иначе
ЗаполнитьЗначенияСвойств(Счет.ВидыСубконто.Добавить(), Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СохранитьСуществующиеПредопределенныеОбъектыПередСозданиемНедостающих(
ОбъектМетаданных, ПолноеИмя, ТаблицаИмен, Имена, Запрос, ОписанияСохраненных, ТаблицыБезСохраненных)
ТребуетсяИнициализация = Ложь;
ПредопределенныеСуществуют = Ложь;
ТаблицаИмен.Колонки.Добавить("ОбъектСуществует", Новый ОписаниеТипов("Булево"));
Для Каждого Имя Из Имена Цикл
Строки = ТаблицаИмен.НайтиСтроки(Новый Структура("Имя", Имя));
Если Строки.Количество() = 0 Тогда
ТребуетсяИнициализация = Истина;
Иначе
Для Каждого Строка Из Строки Цикл
Строка.ОбъектСуществует = Истина;
КонецЦикла;
ПредопределенныеСуществуют = Истина;
КонецЕсли;
КонецЦикла;
Если Не ТребуетсяИнициализация Тогда
Возврат;
КонецЕсли;
Если ПредопределенныеСуществуют Тогда
ЭтоПланСчетов = Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных);
ОписаниеСохраненных = Новый Структура;
ОписаниеСохраненных.Вставить("ПолноеИмя", ПолноеИмя);
ОписаниеСохраненных.Вставить("ТекстЗапроса", Запрос.Текст);
ОписаниеСохраненных.Вставить("ТаблицаИмен", ТаблицаИмен);
ОписаниеСохраненных.Вставить("ЭтоПланСчетов", ЭтоПланСчетов);
ОписанияСохраненных.Добавить(ОписаниеСохраненных);
ТаблицаИмен.Колонки.Добавить("Объект");
Для Каждого Строка Из ТаблицаИмен Цикл
Объект = Строка.Ссылка.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "";
Если ЭтоПланСчетов Тогда
СтрокиПредопределенныхВидовСубконто = Новый Массив;
Для Каждого СтрокаВидаСубконто Из Объект.ВидыСубконто Цикл
Если СтрокаВидаСубконто.Предопределенное Тогда
СтрокаВидаСубконто.Предопределенное = Ложь;
СтрокиПредопределенныхВидовСубконто.Добавить(СтрокаВидаСубконто);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// АПК:1327-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка.
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект);
// АПК:1327-вкл.
Если ЭтоПланСчетов Тогда
Для Каждого СтрокаВидаСубконто Из СтрокиПредопределенныхВидовСубконто Цикл
СтрокаВидаСубконто.Предопределенное = Истина;
КонецЦикла;
КонецЕсли;
Если Строка.ОбъектСуществует Тогда
Объект.ИмяПредопределенныхДанных = Строка.Имя;
КонецЕсли;
Строка.Объект = Объект;
КонецЦикла;
Иначе
ТаблицыБезСохраненных.Добавить(ПолноеИмя);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗапускомПрограммы()
// Привилегированный режим предустановлен платформой.
Если ДлительныеОперации.ПропуститьОбработчикПередЗапускомПрограммы() Тогда
Возврат;
КонецЕсли;
// Проверка основного языка программирования, установленного в конфигурации.
ТекущийЯзыкВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка["Русский"];
Если Метаданные.ВариантВстроенногоЯзыка <> ТекущийЯзыкВстроенногоЯзыка Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Вариант встроенного языка конфигурации ""%1"" не поддерживается.
|Используйте вариант языка ""%2"".'"),
Метаданные.ВариантВстроенногоЯзыка,
Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка["Русский"]);
КонецЕсли;
// Проверка настройки совместимости конфигурации с версией платформы.
СистемнаяИнформация = Новый СистемнаяИнформация;
ВерсияПлатформы = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);
МинимальнаяВерсияПлатформы = ?(ВерсияПлатформы = "8.3.21", "8.3.21.1622", "8.3.22.1704");
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, МинимальнаяВерсияПлатформы) < 0 Тогда
МинимальнаяВерсияПлатформы = "8.3.21.1622, 8.3.22.1704";
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для запуска необходима версия платформы 1С:Предприятие %1 или выше.'"), МинимальнаяВерсияПлатформы);
КонецЕсли;
Режимы = Метаданные.СвойстваОбъектов.РежимСовместимости;
ТекущийРежим = Метаданные.РежимСовместимости;
ПоддерживаемаяВерсияПлатформы = "8.3.21";
Если ТекущийРежим = Режимы.НеИспользовать Тогда
ПоддерживаемыеВерсииПлатформы = СтрРазделить("8.3.21", ", ", Ложь);
Если ПоддерживаемыеВерсииПлатформы.Найти(ВерсияПлатформы) <> Неопределено Тогда
НеПоддерживаемаяВерсияПлатформы = "";
Иначе
НеПоддерживаемаяВерсияПлатформы = ВерсияПлатформы;
КонецЕсли;
Иначе
ТекущийРежимСтрокой = Строка(ТекущийРежим);
Если СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_21") Тогда
НеПоддерживаемаяВерсияПлатформы = "";
Иначе
НеПоддерживаемаяВерсияПлатформы = ТекущийРежимСтрокой;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(НеПоддерживаемаяВерсияПлатформы) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Режим совместимости конфигурации с 1С:Предприятием версии %1 не поддерживается.
|Для запуска установите в конфигурации режим совместимости ""Не использовать"" при разработке на версии %2
|(или ""Версия %2"" при разработке на более старших версиях).'"),
НеПоддерживаемаяВерсияПлатформы, ПоддерживаемаяВерсияПлатформы);
КонецЕсли;
// Проверка заполнения версии конфигурации.
Если ПустаяСтрока(Метаданные.Версия) Тогда
ВызватьИсключение НСтр("ru = 'Не заполнено свойство конфигурации Версия.'");
Иначе
Попытка
НулеваяВерсия = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Метаданные.Версия, "0.0.0.0") = 0;
Исключение
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не правильно заполнено свойство конфигурации Версия: ""%1"".
|Правильный формат, например: ""1.2.3.45"".'"),
Метаданные.Версия);
КонецПопытки;
Если НулеваяВерсия Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не правильно заполнено свойство конфигурации Версия: ""%1"".
|Версия не может быть нулевой.'"),
Метаданные.Версия);
КонецЕсли;
КонецЕсли;
Если Не Метаданные.ОсновныеРоли.Содержит(Метаданные.Роли.АдминистраторСистемы)
Или Не Метаданные.ОсновныеРоли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В конфигурации в свойстве %1 не указаны стандартные роли %2 и %3.'"),
"ОсновныеРоли", Метаданные.Роли.АдминистраторСистемы.Имя, Метаданные.Роли.ПолныеПрава.Имя);
КонецЕсли;
// Проверка возможности выполнения обработчиков установки параметров сеанса для запуска программы.
ПроверитьВозможностьЗапуска();
Если Не ЗначениеЗаполнено(ПользователиИнформационнойБазы.ТекущийПользователь().Имя)
И (Не ОбщегоНазначения.РазделениеВключено()
Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных())
И ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ("СтандартныеПодсистемы",
ОбщегоНазначения.РазделениеВключено()) = "0.0.0.0" Тогда
ПользователиСлужебный.УстановитьНачальныеНастройки("");
КонецЕсли;
ИнтеграцияПодсистемБСП.ПередЗапускомПрограммы();
ОбщегоНазначенияПереопределяемый.ПередЗапускомПрограммы();
СкорректироватьНачальнуюСтраницуНеразделенногоПользователя();
ОбработатьОчередьСкопированныхНастроек();
КонецПроцедуры
// Для процедуры ПередЗапускомПрограммы.
Процедура СкорректироватьНачальнуюСтраницуНеразделенногоПользователя()
Если ТекущийРежимЗапуска() = Неопределено
Или Не ОбщегоНазначения.РазделениеВключено() Тогда
Возврат;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей();
Иначе
СеансЗапущенБезРазделителей = Ложь;
КонецЕсли;
Если Не СеансЗапущенБезРазделителей Тогда
Возврат;
КонецЕсли;
КлючОбъекта = "БазоваяФункциональность";
КлючНастроек = "СоставФормНачальнойСтраницыВМетаданных";
ПредыдущийСоставФормВМетаданных = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
Если ПредыдущийСоставФормВМетаданных = Неопределено Тогда
// Очистка начальной страницы при первом входе.
УстановитьПустуюФормуНаРабочийСтол();
Иначе
УстановитьПустуюФормуНаПустойРабочийСтол();
КонецЕсли;
// Компенсация изменения состава форм в метаданных начальной страницы.
НовыеНастройки = Новый НастройкиНачальнойСтраницы;
СоставФормВМетаданных = НовыеНастройки.ПолучитьСоставФорм();
Если ТипЗнч(ПредыдущийСоставФормВМетаданных) <> Тип("Структура")
Или Не ПредыдущийСоставФормВМетаданных.Свойство("ЛеваяКолонка")
Или ТипЗнч(ПредыдущийСоставФормВМетаданных.ЛеваяКолонка) <> Тип("Массив")
Или Не ПредыдущийСоставФормВМетаданных.Свойство("ПраваяКолонка")
Или ТипЗнч(ПредыдущийСоставФормВМетаданных.ПраваяКолонка) <> Тип("Массив") Тогда
ПредыдущийСоставФормВМетаданных = Новый СоставФормНачальнойСтраницы;
ИначеЕсли СоставФормСовпадает(ПредыдущийСоставФормВМетаданных.ЛеваяКолонка, СоставФормВМетаданных.ЛеваяКолонка)
И СоставФормСовпадает(ПредыдущийСоставФормВМетаданных.ПраваяКолонка, СоставФормВМетаданных.ПраваяКолонка) Тогда
// Состав форм в метаданных начальной страницы не изменился.
Возврат;
КонецЕсли;
КомпенсироватьИзмененияСоставаФормВМетаданныхНачальнойСтраницы(ПредыдущийСоставФормВМетаданных);
СохраняемыйСоставФормВМетаданных = Новый Структура("ЛеваяКолонка, ПраваяКолонка");
ЗаполнитьЗначенияСвойств(СохраняемыйСоставФормВМетаданных, СоставФормВМетаданных);
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, СохраняемыйСоставФормВМетаданных);
КонецПроцедуры
// Для процедуры СкорректироватьНачальнуюСтраницуНеразделенногоПользователя.
Функция СоставФормСовпадает(ПредыдущиеФормыВМетаданных, ФормыВМетаданных)
Если ПредыдущиеФормыВМетаданных.Количество() <> ФормыВМетаданных.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого ИмяФормы Из ФормыВМетаданных Цикл
Если ПредыдущиеФормыВМетаданных.Найти(ИмяФормы) = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Для процедуры СкорректироватьНачальнуюСтраницуНеразделенногоПользователя.
Процедура КомпенсироватьИзмененияСоставаФормВМетаданныхНачальнойСтраницы(ПредыдущийСоставФормВМетаданных)
// При компенсации учитывается, что настройки начальной страницы могут
// быть сохранены в рамках процедуры скрытия рабочего стола.
КлючОбъекта = "Общее/НастройкиНачальнойСтраницы";
КлючОбъектаХранения = "Общее/НастройкиНачальнойСтраницыПередОчисткой";
СохраненныеНастройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъектаХранения, "");
НастройкиСохранены = ТипЗнч(СохраненныеНастройки) = Тип("ХранилищеЗначения");
Если НастройкиСохранены Тогда
ТекущиеНастройки = СохраненныеНастройки.Получить();
Иначе
ТекущиеНастройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта);
КонецЕсли;
Если ТипЗнч(ТекущиеНастройки) = Тип("НастройкиНачальнойСтраницы") Тогда
СоставФорм = ТекущиеНастройки.ПолучитьСоставФорм();
Иначе
СоставФорм = Новый СоставФормНачальнойСтраницы;
КонецЕсли;
НовыеНастройки = Новый НастройкиНачальнойСтраницы;
СоставФормВМетаданных = НовыеНастройки.ПолучитьСоставФорм();
УдалитьНовыеФормыНачальнойСтраницы(СоставФорм.ЛеваяКолонка,
ПредыдущийСоставФормВМетаданных.ЛеваяКолонка, СоставФормВМетаданных.ЛеваяКолонка);
УдалитьНовыеФормыНачальнойСтраницы(СоставФорм.ПраваяКолонка,
ПредыдущийСоставФормВМетаданных.ПраваяКолонка, СоставФормВМетаданных.ПраваяКолонка);
ТекущиеНастройки = Новый НастройкиНачальнойСтраницы;
ТекущиеНастройки.УстановитьСоставФорм(СоставФорм);
Если НастройкиСохранены Тогда
СохраняемыеНастройки = Новый ХранилищеЗначения(ТекущиеНастройки);
ХранилищеСистемныхНастроек.Сохранить(КлючОбъектаХранения, "", СохраняемыеНастройки);
УстановитьПустуюФормуНаРабочийСтол();
Иначе
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, "", ТекущиеНастройки);
КонецЕсли;
КонецПроцедуры
// Для процедуры КомпенсироватьИзмененияСоставаФормВМетаданныхНачальнойСтраницы.
Процедура УдалитьНовыеФормыНачальнойСтраницы(ТекущиеФормы, ПредыдущиеФормыВМетаданных, ФормыВМетаданных)
Для Каждого ИмяФормы Из ФормыВМетаданных Цикл
Если ПредыдущиеФормыВМетаданных.Найти(ИмяФормы) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Индекс = ТекущиеФормы.Найти(ИмяФормы);
Если Индекс <> Неопределено Тогда
ТекущиеФормы.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбработатьОчередьСкопированныхНастроек()
Если ТекущийРежимЗапуска() = Неопределено Тогда
Возврат;
КонецЕсли;
ОчередьНастроек = ХранилищеОбщихНастроек.Загрузить("ОчередьНастроек", "НеПримененныеНастройки");
Если ТипЗнч(ОчередьНастроек) <> Тип("ХранилищеЗначения") Тогда
Возврат;
КонецЕсли;
ОчередьНастроек = ОчередьНастроек.Получить();
Если ТипЗнч(ОчередьНастроек) <> Тип("Соответствие") Тогда
Возврат;
КонецЕсли;
Для Каждого ЭлементОчереди Из ОчередьНастроек Цикл
Попытка
Настройка = ХранилищеСистемныхНастроек.Загрузить(ЭлементОчереди.Ключ, ЭлементОчереди.Значение);
Исключение
Продолжить;
КонецПопытки;
ХранилищеСистемныхНастроек.Сохранить(ЭлементОчереди.Ключ, ЭлементОчереди.Значение, Настройка);
КонецЦикла;
ХранилищеОбщихНастроек.Сохранить("ОчередьНастроек", "НеПримененныеНастройки", Неопределено);
КонецПроцедуры
Процедура ВыполнитьОбработчикиУстановкиПараметровСеанса(ИменаПараметровСеанса, Обработчики, УстановленныеПараметры)
// Массив с ключами параметров сеанса
// задаются начальным словом в имени параметра сеанса и символом "*".
ПараметрыСеансаКлючи = Новый Массив;
Для Каждого Запись Из Обработчики Цикл
Если СтрНайти(Запись.Ключ, "*") > 0 Тогда
КлючПараметра = СокрЛП(Запись.Ключ);
ПараметрыСеансаКлючи.Добавить(Лев(КлючПараметра, СтрДлина(КлючПараметра)-1));
КонецЕсли;
КонецЦикла;
Для каждого ИмяПараметра Из ИменаПараметровСеанса Цикл
Если УстановленныеПараметры.Найти(ИмяПараметра) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Обработчик = Обработчики.Получить(ИмяПараметра);
Если Обработчик <> Неопределено Тогда
ПараметрыОбработчика = Новый Массив();
ПараметрыОбработчика.Добавить(ИмяПараметра);
ПараметрыОбработчика.Добавить(УстановленныеПараметры);
ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыОбработчика);
Продолжить;
КонецЕсли;
Для Каждого ИмяКлючаПараметра Из ПараметрыСеансаКлючи Цикл
Если СтрНачинаетсяС(ИмяПараметра, ИмяКлючаПараметра) Тогда
Обработчик = Обработчики.Получить(ИмяКлючаПараметра + "*");
ПараметрыОбработчика = Новый Массив();
ПараметрыОбработчика.Добавить(ИмяПараметра);
ПараметрыОбработчика.Добавить(УстановленныеПараметры);
ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик, ПараметрыОбработчика);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ИгнорироватьОтправкуИдентификаторовОбъектовМетаданных(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза = Ложь)
Если Не СозданиеНачальногоОбраза
И ОбъектМетаданных(ЭлементДанных) = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
Процедура ИгнорироватьПолучениеИдентификаторовОбъектовМетаданных(ЭлементДанных, ПолучениеЭлемента)
Если ОбъектМетаданных(ЭлементДанных) = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
Функция ОбъектМетаданных(Знач ЭлементДанных)
Возврат ?(ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта"), ЭлементДанных.Ссылка.Метаданные(), ЭлементДанных.Метаданные());
КонецФункции
Функция СозданиеНачальногоОбраза(Знач ЭлементДанных)
Возврат ?(ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта"), Ложь, ЭлементДанных.ДополнительныеСвойства.Свойство("СозданиеНачальногоОбраза"));
КонецФункции
Функция ПоказатьНерекомендуемуюВерсиюПлатформы(Параметры)
Если Параметры.РазделениеВключено Тогда
Возврат Ложь;
КонецЕсли;
// Проверка, что пользователь не внешний.
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИдентификаторПользователяИБ",
ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЗначениеИстина
|ИЗ
| Справочник.ВнешниеПользователи КАК ВнешниеПользователи
|ГДЕ
| ВнешниеПользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ";
Если НЕ Запрос.Выполнить().Пустой() Тогда
Возврат Ложь;
КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация;
Текущая = СистемнаяИнформация.ВерсияПриложения;
Минимальная = Параметры.МинимальнаяВерсияПлатформы;
Рекомендуемая = Параметры.РекомендуемаяВерсияПлатформы;
Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Минимальная) < 0
Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Рекомендуемая) < 0;
КонецФункции
Функция ПараметрыАдминистрированияПоУмолчанию()
ПараметрыАдминистрированияКластера = АдминистрированиеКластера.ПараметрыАдминистрированияКластера();
ПараметрыАдминистрированияИБ = АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера();
// Объединяем структуры параметров.
СтруктураПараметровАдминистрирования = ПараметрыАдминистрированияКластера;
Для Каждого Элемент Из ПараметрыАдминистрированияИБ Цикл
СтруктураПараметровАдминистрирования.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
СтруктураПараметровАдминистрирования.Вставить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок", Ложь);
Возврат СтруктураПараметровАдминистрирования;
КонецФункции
Процедура ПрочитатьПараметрыИзСтрокиСоединения(СтруктураПараметровАдминистрирования)
ПодстрокиСтрокиСоединения = СтрРазделить(СтрокаСоединенияИнформационнойБазы(), ";");
СтрокаИмениСервера = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[0], 7));
СтруктураПараметровАдминистрирования.ИмяВКластере = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[1], 6));
СписокСерверовКластера = СтрРазделить(СтрокаИмениСервера, ",");
Если СписокСерверовКластера.Количество() = 1 Тогда
СписокСерверовКластера = СтрРазделить(СтрокаИмениСервера, ";");
КонецЕсли;
ИмяСервера = СписокСерверовКластера[0];
// Протокол может быть только tcp. Можно отбросить.
Если СтрНачинаетсяС(ВРег(ИмяСервера), "TCP://") Тогда
ИмяСервера = Сред(ИмяСервера, 7);
КонецЕсли;
// Если в качестве имени сервера передается адрес IPv6, то порт может быть только после закрывающей квадратной скобки.
НачальнаяПозиция = СтрНайти(ИмяСервера, "]");
Если НачальнаяПозиция <> 0 Тогда
РазделительПорта = СтрНайти(ИмяСервера, ":",, НачальнаяПозиция);
Иначе
РазделительПорта = СтрНайти(ИмяСервера, ":");
КонецЕсли;
Если РазделительПорта > 0 Тогда
АдресАгентаСервера = Сред(ИмяСервера, 1, РазделительПорта - 1);
ПортКластера = Число(Сред(ИмяСервера, РазделительПорта + 1));
Если СтруктураПараметровАдминистрирования.ПортКластера = 1541 Тогда
СтруктураПараметровАдминистрирования.ПортКластера = ПортКластера;
КонецЕсли;
Иначе
АдресАгентаСервера = ИмяСервера;
КонецЕсли;
СтруктураПараметровАдминистрирования.АдресАгентаСервера = АдресАгентаСервера;
КонецПроцедуры
// Проверяет возможность выполнения обработчиков установки параметров сеанса,
// обработчиков обновления и других базовых механизмов конфигурации,
// выполняющих код конфигурации по полному имени процедуры.
//
// В случае, если при текущих настройках профилей безопасности (в кластере серверов и в информационной базе)
// выполнение обработчиков невозможно - генерируется исключение,
// содержащее описание причины и перечень действий по ее устранению.
//
Процедура ПроверитьВозможностьЗапуска()
Если ОбщегоНазначения.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы()) Тогда
Возврат;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();
Иначе
ПрофильИнформационнойБазы = "";
КонецЕсли;
Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда
// Информационная база настроена на использование с профилем безопасности, в котором запрещен
// полный доступ к внешним модулям.
УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);
Если БезопасныйРежим() <> ПрофильИнформационнойБазы Тогда
// Профиль ИБ не доступен для выполнения обработчиков.
УстановитьБезопасныйРежим(Ложь);
Попытка
ДоступенПривилегированныйРежим = ВозможноВыполнениеОбработчиковБезУстановкиБезопасногоРежима();
Исключение
ДоступенПривилегированныйРежим = Ложь;
КонецПопытки;
Если Не ДоступенПривилегированныйРежим Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Невозможно установить параметры сеанса по причине: профиль безопасности %1 отсутствует в кластере серверов 1С:Предприятия, или для него запрещено использование в качестве профиля безопасности безопасного режима.
|
|Для восстановления работоспособности программы отключите использование профиля безопасности через консоль кластера и заново настройте профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).'"),
ПрофильИнформационнойБазы);
КонецЕсли;
КонецЕсли;
ДоступенПривилегированныйРежим = ДоступенПереходВПривилегированныйРежим();
УстановитьБезопасныйРежим(Ложь);
Если Не ДоступенПривилегированныйРежим Тогда
// Профиль ИБ доступен для выполнения обработчиков, но в нем невозможна установка привилегированного режима.
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Невозможно установить параметры сеанса по причине: профиль безопасности %1 не содержит разрешения на установку привилегированного режима. Возможно, он был отредактирован через консоль кластера.
|
|Для восстановления работоспособности программы отключите использование профиля безопасности через консоль кластера и заново настройте профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы).'"),
ПрофильИнформационнойБазы);
КонецЕсли;
Иначе
// Информационная база не настроена на использование с профилем безопасности, в котором запрещен
// полный доступ к внешним модулям.
Попытка
ДоступенПривилегированныйРежим = ВозможноВыполнениеОбработчиковБезУстановкиБезопасногоРежима();
Исключение
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Невозможно установить параметры сеанса по причине: %1.
|
|Возможно, для информационной базы через консоль кластера был установлен профиль безопасности, не допускающий выполнения внешних модулей без установки безопасного режима. В этом случае для восстановления работоспособности программы отключите использование профиля безопасности через консоль кластера и заново настройте профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы). При этом программа будет автоматически корректно настроена на использование совместно с включенными профилями безопасности.'"),
ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецПроцедуры
// Проверяет возможность выполнения обработчиков без установки безопасного режима.
//
// Возвращаемое значение:
// Булево
//
Функция ВозможноВыполнениеОбработчиковБезУстановкиБезопасногоРежима()
// Вызов ОбщегоНазначения.ВычислитьВБезопасномРежиме не требуется,
// т.к. это проверка установки привилегированного режима в функции Вычислить без установки безопасного режима.
Возврат Вычислить("ДоступенПереходВПривилегированныйРежим()"); // АПК:488
КонецФункции
// Проверяет возможность перехода в привилегированный режим из текущего безопасного режима.
//
// Возвращаемое значение:
// Булево
//
Функция ДоступенПереходВПривилегированныйРежим()
УстановитьПривилегированныйРежим(Истина);
Возврат ПривилегированныйРежим();
КонецФункции
// Для процедуры ЗарегистрироватьИзменениеПриоритетныхДанныхДляПодчиненныхУзловРИБ.
Процедура ЗарегистрироватьИзменениеПредопределенных(УзлыПлановОбменаРИБ, КоллекцияМетаданных)
Запрос = Новый Запрос;
Для Каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл
УзлыРИБ = Новый Массив;
Для Каждого УзлыПланаОбмена Из УзлыПлановОбменаРИБ Цикл
Если Не УзлыПланаОбмена.Ключ.Содержит(ОбъектМетаданных) Тогда
Продолжить;
КонецЕсли;
Для Каждого УзелРИБ Из УзлыПланаОбмена.Значение Цикл
УзлыРИБ.Добавить(УзелРИБ);
КонецЦикла;
КонецЦикла;
Если УзлыРИБ.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Запрос.Текст =
"ВЫБРАТЬ
| ТекущаяТаблица.Ссылка КАК Ссылка
|ИЗ
| &ТекущаяТаблица КАК ТекущаяТаблица
|ГДЕ
| ТекущаяТаблица.Предопределенный";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ОбъектМетаданных.ПолноеИмя());
// @skip-check query-in-loop - Порционная обработка данных
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ПланыОбмена.ЗарегистрироватьИзменения(УзлыРИБ, Выборка.Ссылка);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Для процедуры УстановитьКлючНазначенияФормы.
Процедура УстановитьКлючНазначенияИспользованияФормы(Форма, Ключ, УстановитьНастройки)
Если Не ЗначениеЗаполнено(Ключ)
Или Форма.КлючНазначенияИспользования = Ключ Тогда
Возврат;
КонецЕсли;
Если Не УстановитьНастройки Тогда
Форма.КлючНазначенияИспользования = Ключ;
Возврат;
КонецЕсли;
ТипыНастроек = Новый Массив;
// Русский вариант.
ТипыНастроек.Добавить("/КлючТекущегоВарианта");
ТипыНастроек.Добавить("/КлючТекущихПользовательскихНастроек");
ТипыНастроек.Добавить("/ТекущиеПользовательскиеНастройки");
ТипыНастроек.Добавить("/КлючТекущихНастроекДанных");
ТипыНастроек.Добавить("/ТекущиеДанные");
ТипыНастроек.Добавить("/НастройкиФормы");
// Английский вариант.
ТипыНастроек.Добавить("/CurrentVariantKey");
ТипыНастроек.Добавить("/CurrentUserSettingsKey");
ТипыНастроек.Добавить("/CurrentUserSettings");
ТипыНастроек.Добавить("/CurrentDataSettingsKey");
ТипыНастроек.Добавить("/CurrentData");
ТипыНастроек.Добавить("/FormSettings");
Если ХранилищеСистемныхНастроек.Загрузить(Ключ, "КлючНазначенияИспользованияФормы") <> Истина
И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
УстановитьНастройкиДляКлюча(Ключ, ТипыНастроек, Форма.ИмяФормы, Форма.КлючНазначенияИспользования);
ХранилищеСистемныхНастроек.Сохранить(Ключ, "КлючНазначенияИспользованияФормы", Истина);
КонецЕсли;
Форма.КлючНазначенияИспользования = Ключ;
КонецПроцедуры
// Для процедуры УстановитьКлючНазначенияФормы.
Процедура УстановитьКлючСохраненияПоложенияОкнаФормы(Форма, Ключ, УстановитьНастройки)
Если Не ЗначениеЗаполнено(Ключ)
Или Форма.КлючСохраненияПоложенияОкна = Ключ Тогда
Возврат;
КонецЕсли;
Если Не УстановитьНастройки Тогда
Форма.КлючСохраненияПоложенияОкна = Ключ;
Возврат;
КонецЕсли;
ТипыНастроек = Новый Массив;
// Русский вариант.
ТипыНастроек.Добавить("/НастройкиОкнаТонкогоКлиента"); // @Non-NLS
ТипыНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента"); // @Non-NLS
ТипыНастроек.Добавить("/НастройкиОкнаВебКлиента"); // @Non-NLS
ТипыНастроек.Добавить("/Такси/НастройкиОкнаВебКлиента"); // @Non-NLS
// Английский вариант.
ТипыНастроек.Добавить("/ThinClientWindowSettings");
ТипыНастроек.Добавить("/Taxi/ThinClientWindowSettings");
ТипыНастроек.Добавить("/WebClientWindowSettings");
ТипыНастроек.Добавить("/Taxi/WebClientWindowSettings");
Если ХранилищеСистемныхНастроек.Загрузить(Ключ, "КлючСохраненияПоложенияОкнаФормы") <> Истина
И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
УстановитьНастройкиДляКлюча(Ключ, ТипыНастроек, Форма.ИмяФормы, Форма.КлючСохраненияПоложенияОкна);
ХранилищеСистемныхНастроек.Сохранить(Ключ, "КлючСохраненияПоложенияОкнаФормы", Истина);
КонецЕсли;
Форма.КлючСохраненияПоложенияОкна = Ключ;
КонецПроцедуры
// Для процедур УстановитьКлючНазначенияИспользованияФормы, УстановитьКлючСохраненияПоложенияОкнаФормы.
Процедура УстановитьНастройкиДляКлюча(Ключ, ТипыНастроек, ИмяФормы, ТекущийКлюч)
Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
Возврат;
КонецЕсли;
НовыйКлюч = "/" + Ключ;
Отбор = Новый Структура;
Отбор.Вставить("Пользователь", ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
Для каждого ТипНастроек Из ТипыНастроек Цикл
Отбор.Вставить("КлючОбъекта", ИмяФормы + НовыйКлюч + ТипНастроек);
Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
Если Выборка.Следующий() Тогда
Возврат; // Настройки для ключа уже установлены.
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТекущийКлюч) Тогда
ТекущийКлюч = "/" + ТекущийКлюч;
КонецЕсли;
// Установка начальных настроек ключа копированием от текущего ключа.
Для Каждого ТипНастроек Из ТипыНастроек Цикл
Отбор.Вставить("КлючОбъекта", ИмяФормы + ТекущийКлюч + ТипНастроек);
Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
КлючОбъекта = ИмяФормы + НовыйКлюч + ТипНастроек;
Пока Выборка.Следующий() Цикл
ОписаниеНастроек = Новый ОписаниеНастроек;
ОписаниеНастроек.Представление = Выборка.Представление;
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, Выборка.КлючНастроек,
Выборка.Настройки, ОписаниеНастроек);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Проверка и отправка серверных оповещений клиенту.
// См. ПриПериодическомПолученииДанныхКлиентаНаСервере
Процедура ПриПериодическойПроверкеИзмененаКонфигурацияИлиРасширения(СообщениеПользователю)
УстановитьПривилегированныйРежим(Истина);
ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
МожноОповещать = ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммыДляПользователя(ИмяПользователя);
Если Не МожноОповещать Тогда
Возврат;
КонецЕсли;
ДатаНапомнитьЗавтра = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(
"КонтрольДинамическогоОбновления", "ДатаНапомнитьЗавтра",,, ИмяПользователя);
Если ТипЗнч(ДатаНапомнитьЗавтра) = Тип("Дата")
И ТекущаяДатаСеанса() < ДатаНапомнитьЗавтра Тогда
Возврат;
КонецЕсли;
КонфигурацияБазыДанныхИзмененаДинамически = КонфигурацияБазыДанныхИзмененаДинамически();
ДинамическиеИзменения = Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения(
Справочники.ВерсииРасширений.УстановленныеРасширенияПриЗапуске(), Истина);
Если Не КонфигурацияБазыДанныхИзмененаДинамически
И Не ЗначениеЗаполнено(ДинамическиеИзменения.Расширения)
И Не ЗначениеЗаполнено(ДинамическиеИзменения.Исправления) Тогда
Возврат;
КонецЕсли;
Если ДинамическиеИзменения.Исправления <> Неопределено
И ДинамическиеИзменения.Расширения = Неопределено
И Не КонфигурацияБазыДанныхИзмененаДинамически
// Изменился только состав исправлений, необходимо проверить возможность отображения оповещения.
И ДинамическиеИзменения.Исправления.Добавлено <> 0
И ДинамическиеИзменения.Исправления.Удалено = 0 Тогда
РасписаниеОповещения = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(
"КонтрольДинамическогоОбновления", "РасписаниеПроверкиПатчей",,, ИмяПользователя);
Если ТипЗнч(РасписаниеОповещения) = Тип("Структура")
И РасписаниеОповещения.Свойство("Расписание")
И ТипЗнч(РасписаниеОповещения.Расписание) = Тип("РасписаниеРегламентногоЗадания") Тогда
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
МожноОповещать = РасписаниеОповещения.Расписание.ТребуетсяВыполнение(ТекущаяДатаСеанса,
РасписаниеОповещения.ПоследнееОповещение);
Если МожноОповещать Тогда
РасписаниеОповещения.ПоследнееОповещение = ТекущаяДатаСеанса;
ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить("КонтрольДинамическогоОбновления",
"РасписаниеПроверкиПатчей", РасписаниеОповещения,, ИмяПользователя);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не МожноОповещать Тогда
Возврат;
КонецЕсли;
ДинамическиеИзменения.Вставить("КонфигурацияБазыДанныхИзмененаДинамически",
КонфигурацияБазыДанныхИзмененаДинамически);
СообщениеПользователю = ТекстСообщенияПриДинамическомОбновлении(ДинамическиеИзменения);
КонецПроцедуры
// См. ПриОтправкеСерверногоОповещения
Процедура ПриОтправкеСерверногоОповещенияФункциональныеОпцииИзменены(ИмяОповещения, ВариантыПараметров)
ИмяПараметра = "СтандартныеПодсистемы.БазоваяФункциональность.ВключенныеФункциональныеОпции";
СтароеЗначение = ПараметрРаботыРасширения(ИмяПараметра, Истина);
НовыйСоставТипов = Новый Массив;
ФункциональныеОпцииПоТипам = Новый Соответствие;
Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл
ОбъектХранения = ФункциональнаяОпция.Хранение;
Если Не Метаданные.Константы.Содержит(ОбъектХранения) Тогда
Продолжить;
КонецЕсли;
Тип = Тип("КонстантаМенеджер." + ОбъектХранения.Имя);
ФункциональныеОпцииПоТипам.Вставить(Тип, ФункциональнаяОпция);
Если ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя) = Истина Тогда
НовыйСоставТипов.Добавить(Тип);
КонецЕсли;
КонецЦикла;
НовоеЗначение = Новый ОписаниеТипов(НовыйСоставТипов);
Если СтароеЗначение = НовоеЗначение Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(СтароеЗначение) = Тип("ОписаниеТипов") Тогда
СоставИзмененийТипов = Новый Соответствие;
Для Каждого Тип Из НовоеЗначение.Типы() Цикл
СоставИзмененийТипов.Вставить(Тип, Истина);
КонецЦикла;
Для Каждого Тип Из СтароеЗначение.Типы() Цикл
Если СоставИзмененийТипов.Получить(Тип) = Неопределено Тогда
СоставИзмененийТипов.Вставить(Тип, Истина);
Иначе
СоставИзмененийТипов.Удалить(Тип);
КонецЕсли;
КонецЦикла;
Объекты = Новый Соответствие;
Для Каждого КлючИЗначение Из СоставИзмененийТипов Цикл
ФункциональнаяОпция = ФункциональныеОпцииПоТипам.Получить(КлючИЗначение.Ключ);
Если ФункциональнаяОпция = Неопределено Тогда
Продолжить;
КонецЕсли;
ДобавитьОбъектыФункциональнойОпции(Объекты, ФункциональнаяОпция);
КонецЦикла;
Адресаты = Новый Соответствие;
Для Каждого ВариантПараметров Из ВариантыПараметров Цикл
Для Каждого Адресат Из ВариантПараметров.Адресаты Цикл
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Адресат.Ключ);
Если ПользовательИБ = Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого КлючИЗначение Из Объекты Цикл
Если ПравоДоступа(КлючИЗначение.Значение, КлючИЗначение.Ключ, ПользовательИБ) Тогда
Адресаты.Вставить(Адресат.Ключ, Адресат.Значение);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если ЗначениеЗаполнено(Адресаты) Тогда
СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения, "", Адресаты);
КонецЕсли;
КонецЕсли;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыВерсийРасширений");
ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", Справочники.ВерсииРасширений.ПустаяСсылка());
ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметра);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
СтароеЗначение = ПараметрРаботыРасширения(ИмяПараметра, Истина);
Если СтароеЗначение <> НовоеЗначение Тогда
УстановитьПараметрРаботыРасширения(ИмяПараметра, НовоеЗначение, Истина);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ДобавитьОбъектыФункциональнойОпции(Объекты, ФункциональнаяОпция)
ИменаБазовыхТипов =
"
|Подсистема
|ОбщийРеквизит
|ПланОбмена
|КритерийОтбора
|ОбщаяФорма
|ОбщаяКоманда
|Константа
|Справочник
|Документ
|ЖурналДокументов
|Отчет
|Обработка
|ПланВидовХарактеристик
|ПланСчетов
|ПланВидовРасчета
|РегистрСведений
|РегистрНакопления
|РегистрБухгалтерии
|РегистрРасчета
|БизнесПроцесс
|Задача
|";
Для Каждого ЭлементСостава Из ФункциональнаяОпция.Состав Цикл
Объект = ЭлементСостава.Объект;
Если Объекты.Получить(Объект) <> Неопределено
Или ТипЗнч(Объект) <> Тип("ОбъектМетаданных") Тогда
Продолжить;
КонецЕсли;
Попытка
ПолноеИмя = Объект.ПолноеИмя();
Исключение
ПолноеИмя = "";
КонецПопытки;
ЧастиИмени = СтрРазделить(ПолноеИмя, ".", Ложь);
Если ЧастиИмени.Количество() < 2 Тогда
Продолжить;
КонецЕсли;
ИмяБазовогоТипа = ЧастиИмени[0];
Если СтрНайти(ИменаБазовыхТипов, Символы.ПС + ИмяБазовогоТипа + Символы.ПС) = 0 Тогда
Продолжить;
КонецЕсли;
Если ЧастиИмени.Количество() > 2 Тогда
Если ИмяБазовогоТипа <> "Подсистема" Тогда
Объект = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЧастиИмени[0] + "." + ЧастиИмени[1]);
Если Объект = Неопределено
Или Объекты.Получить(Объект) <> Неопределено Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Объекты.Вставить(Объект, "Просмотр");
КонецЦикла;
КонецПроцедуры
// Многоязычные конфигурации
Функция ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
Возврат МодульМультиязычностьСервер.ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы();
КонецЕсли;
Возврат Ложь;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Другие процедуры и функции.
Функция ЭлементыСтиля() Экспорт
НаборЭлементовСтиля = Новый Структура;
Для каждого ЭлементСтиля Из Метаданные.ЭлементыСтиля Цикл
НаборЭлементовСтиля.Вставить(ЭлементСтиля.Имя, ЭлементСтиля.Значение);
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура(НаборЭлементовСтиля);
КонецФункции
// Возвращает сериализуемый набор элементов стиля.
//
// Возвращаемое значение:
// Структура:
// * Ключ - Строка - имя элемента стиля.
// * Значение - Строка
// - ОбъектМетаданныхЭлементСтиля - элемент стиля. Для толстого клиента обычного приложения
// элемент стиля преобразуется в системное строковое представление переданного значения.
//
Функция НаборЭлементовСтиля()
НаборЭлементовСтиля = Новый Структура;
Для каждого ЭлементСтиля Из Метаданные.ЭлементыСтиля Цикл
Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
НаборЭлементовСтиля.Вставить(ЭлементСтиля.Имя, Новый ХранилищеЗначения(ЭлементСтиля.Значение));
Иначе
НаборЭлементовСтиля.Вставить(ЭлементСтиля.Имя, ЭлементСтиля.Значение);
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура(НаборЭлементовСтиля);
КонецФункции
// Для процедуры ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.
Процедура ДобавитьЗапросРазрешенийНаИспользованиеРасширений(ЗапросыРазрешений)
Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
Разрешения = Новый Массив;
ВсеРасширения = РасширенияКонфигурации.Получить();
МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
Для Каждого Расширение Из ВсеРасширения Цикл
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля(
Расширение.Имя, Base64Строка(Расширение.ХешСумма)));
КонецЦикла;
ЗапросыРазрешений.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения,
ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.ПараметрыРаботыВерсийРасширений")));
КонецПроцедуры
Функция ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти()
Если ОбщегоНазначения.ЭтоВебКлиент()
Или Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
Возврат Ложь;
КонецЕсли;
ОперативнаяПамять = ПараметрыКлиентаНаСервере().Получить("ОперативнаяПамять");
Если ТипЗнч(ОперативнаяПамять) <> Тип("Число") Тогда
Возврат Ложь; // Параметр клиента на сервере не заполнен (нет клиентского приложения).
КонецЕсли;
РекомендуемыйОбъем = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности().РекомендуемыйОбъемОперативнойПамяти;
СохраненнаяРекомендация = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ОбщиеНастройкиПользователя",
"РекомендацияПоОбъемуОперативнойПамяти");
Рекомендация = Новый Структура;
Рекомендация.Вставить("Показывать", Истина);
Рекомендация.Вставить("ДатаПредыдущегоПоказа", Дата(1, 1, 1));
Если ТипЗнч(СохраненнаяРекомендация) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(Рекомендация, СохраненнаяРекомендация);
КонецЕсли;
Возврат ОперативнаяПамять < РекомендуемыйОбъем
И (Рекомендация.Показывать
Или (ТекущаяДатаСеанса() - Рекомендация.ДатаПредыдущегоПоказа) > 60*60*24*60)
КонецФункции
Процедура ИгнорироватьОтправкуДанныхОбработанныхВЦентральномУзлеРИБПриОбновленииИБ(ЭлементДанных, СозданиеНачальногоОбраза, Получатель)
Если Получатель <> Неопределено
И Не СозданиеНачальногоОбраза
И ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ДанныеОбработанныеВЦентральномУзлеРИБ") Тогда
Индекс = ЭлементДанных.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаНабора = ЭлементДанных[Индекс];
Если СтрокаНабора.УзелПланаОбмена <> Получатель Тогда
ЭлементДанных.Удалить(СтрокаНабора);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ИспользуетсяНедопустимаяВерсияПлатформы()
СистемнаяИнформация = Новый СистемнаяИнформация;
НерекомендуемыеВерсииПлатформы = ОбщегоНазначения.НедопустимыеВерсииПлатформы();
Возврат СтрНайти(НерекомендуемыеВерсииПлатформы, СистемнаяИнформация.ВерсияПриложения);
КонецФункции
#КонецОбласти