#include <StringConstants.au3> ; to declare the Constants of StringRegExp
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sRegex = "(?mi)(?<=(?:\/\/){1}[ [ruА-Яа-яёЁ])((?:[ruА-Яа-яёЁ\s\d \,\.\:\-\"\&\d\*\;\(\)\.\,\'\=\<\>\!-\?\@^#])*?)$(?:[\b\t\s]+((?:Функция|Процедура)\s+(?:[\w\d]|[А-Яа-я])+\([\w\W]*?\)\s*(?:Экспорт)?))"
Local $sString = "///////////////////////////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Copyright (c) 2023, ООО 1С-Софт" & @CRLF & _
"// Все права защищены. Эта программа и сопроводительные материалы предоставляются " & @CRLF & _
"// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)" & @CRLF & _
"// Текст лицензии доступен по ссылке:" & @CRLF & _
"// https://creativecommons.org/licenses/by/4.0/legalcode" & @CRLF & _
"///////////////////////////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"" & @CRLF & _
"#Область ПрограммныйИнтерфейс" & @CRLF & _
"" & @CRLF & _
"#Область ОповещениеПользователя" & @CRLF & _
"" & @CRLF & _
"// Формирует и выводит сообщение, которое может быть связано с элементом управления формы." & @CRLF & _
"//" & @CRLF & _
"// В фоновом задании длительной операции, если вызов выполнен вне транзакции," & @CRLF & _
"// сообщение записывается в служебный регистр и отправляется сразу на клиент," & @CRLF & _
"// если подключена система взаимодействия." & @CRLF & _
"// В конце фонового задания длительной операции, а также при отправке прогресса," & @CRLF & _
"// все сообщения извлекаются из очереди сообщений фонового задания," & @CRLF & _
"// записываются в служебный регистр и отправляются сразу на клиент," & @CRLF & _
"// если подключена система взаимодействия." & @CRLF & _
"//" & @CRLF & _
"// АПК:142-выкл 4 необязательных параметра для совместимости " & @CRLF & _
"// с устаревшей процедурой ОбщегоНазначенияКлиентСервер.СообщитьПользователю." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ТекстСообщенияПользователю - Строка - текст сообщения." & @CRLF & _
"// КлючДанных - ЛюбаяСсылка - объект или ключ записи информационной базы, к которому это сообщение относится." & @CRLF & _
"// Поле - Строка - наименование реквизита формы." & @CRLF & _
"// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы)." & @CRLF & _
"// Отказ - Булево - выходной параметр, всегда устанавливается в значение Истина." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"//" & @CRLF & _
"// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта:" & @CRLF & _
"// ОбщегоНазначения.СообщитьПользователю(" & @CRLF & _
"// НСтр("ru = 'Сообщение об ошибке.'"), ," & @CRLF & _
"// "ПолеВРеквизитеФормыОбъект"," & @CRLF & _
"// "Объект");" & @CRLF & _
"//" & @CRLF & _
"// Альтернативный вариант использования в форме объекта:" & @CRLF & _
"// ОбщегоНазначения.СообщитьПользователю(" & @CRLF & _
"// НСтр("ru = 'Сообщение об ошибке.'"), ," & @CRLF & _
"// "Объект.ПолеВРеквизитеФормыОбъект");" & @CRLF & _
"//" & @CRLF & _
"// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы:" & @CRLF & _
"// ОбщегоНазначения.СообщитьПользователю(" & @CRLF & _
"// НСтр("ru = 'Сообщение об ошибке.'"), ," & @CRLF & _
"// "ИмяРеквизитаФормы");" & @CRLF & _
"//" & @CRLF & _
"// 3. Для вывода сообщения связанного с объектом информационной базы:" & @CRLF & _
"// ОбщегоНазначения.СообщитьПользователю(" & @CRLF & _
"// НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ);" & @CRLF & _
"//" & @CRLF & _
"// 4. Для вывода сообщения по ссылке на объект информационной базы:" & @CRLF & _
"// ОбщегоНазначения.СообщитьПользователю(" & @CRLF & _
"// НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ);" & @CRLF & _
"//" & @CRLF & _
"// Случаи некорректного использования:" & @CRLF & _
"// 1. Передача одновременно параметров КлючДанных и ПутьКДанным." & @CRLF & _
"// 2. Передача в параметре КлючДанных значения типа отличного от допустимого." & @CRLF & _
"// 3. Установка ссылки без установки поля (и/или пути к данным)." & @CRLF & _
"//" & @CRLF & _
"Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = ""," & @CRLF & _
" Знач ПутьКДанным = "", Отказ = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" ЭтоОбъект = Ложь;" & @CRLF & _
" " & @CRLF & _
" Если КлючДанных <> Неопределено" & @CRLF & _
" И XMLТипЗнч(КлючДанных) <> Неопределено Тогда" & @CRLF & _
" " & @CRLF & _
" ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;" & @CRLF & _
" ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(ТекстСообщенияПользователю," & @CRLF & _
" КлючДанных, Поле, ПутьКДанным, Отказ, ЭтоОбъект);" & @CRLF & _
" " & @CRLF & _
"#Если НЕ МобильныйАвтономныйСервер Тогда" & @CRLF & _
" Если СтандартныеПодсистемыПовтИсп.ЭтоСеансДлительнойОперации()" & @CRLF & _
" И Не ТранзакцияАктивна() Тогда" & @CRLF & _
" " & @CRLF & _
" ДлительныеОперации.ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение);" & @CRLF & _
" Иначе" & @CRLF & _
" Сообщение.Сообщить();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"#Иначе" & @CRLF & _
" Сообщение.Сообщить();" & @CRLF & _
"#КонецЕсли" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"// АПК:142-вкл" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"" & @CRLF & _
"#Если НЕ МобильныйАвтономныйСервер Тогда" & @CRLF & _
"" & @CRLF & _
"#Область ДанныеВБазе" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Общие процедуры и функции для работы с данными в базе." & @CRLF & _
"" & @CRLF & _
"// Возвращает структуру, содержащую значения реквизитов, прочитанные из информационной базы по ссылке на объект." & @CRLF & _
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект" & @CRLF & _
"// для быстрого чтения отдельных реквизитов объекта из базы данных." & @CRLF & _
"//" & @CRLF & _
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя," & @CRLF & _
"// то следует использовать предварительный переход в привилегированный режим." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить." & @CRLF & _
"// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить." & @CRLF & _
"// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате" & @CRLF & _
"// требований к свойствам структуры." & @CRLF & _
"// Например, "Код, Наименование, Родитель"." & @CRLF & _
"// - Структура" & @CRLF & _
"// - ФиксированнаяСтруктура - в качестве ключа передается" & @CRLF & _
"// псевдоним поля для возвращаемой структуры с результатом, а в качестве" & @CRLF & _
"// значения (опционально) фактическое имя поля в таблице." & @CRLF & _
"// Если ключ задан, а значение не определено, то имя поля берется из ключа." & @CRLF & _
"// Допускается указание имени поля через точку, но при этом параметр КодЯзыка для такого поля" & @CRLF & _
"// учитываться не будет." & @CRLF & _
"// - Массив из Строка" & @CRLF & _
"// - ФиксированныйМассив из Строка - имена реквизитов в формате требований к свойствам структуры." & @CRLF & _
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;" & @CRLF & _
"// если есть ограничение на уровне записей, то все реквизиты вернутся со " & @CRLF & _
"// значением Неопределено; если нет прав для работы с таблицей, то возникнет исключение;" & @CRLF & _
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу " & @CRLF & _
"// или любой из реквизитов." & @CRLF & _
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура - содержит имена (ключи) и значения затребованных реквизитов." & @CRLF & _
"// Если в параметр Реквизиты передана пустая строка, то возвращается пустая структура." & @CRLF & _
"// Если в параметр Ссылка передана пустая ссылка, то возвращается структура, " & @CRLF & _
"// соответствующая именам реквизитов со значениями Неопределено." & @CRLF & _
"// Если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), " & @CRLF & _
"// то все реквизиты вернутся со значением Неопределено." & @CRLF & _
"//" & @CRLF & _
"Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" // Если передано имя предопределенного." & @CRLF & _
" Если ТипЗнч(Ссылка) = Тип("Строка") Тогда" & @CRLF & _
" " & @CRLF & _
" ПолноеИмяПредопределенногоЭлемента = Ссылка;" & @CRLF & _
" " & @CRLF & _
" // Вычисление ссылки по имени предопределенного." & @CRLF & _
" // - дополнительно выполняет проверку метаданных предопределенного, выполняется предварительно." & @CRLF & _
" Попытка" & @CRLF & _
" Ссылка = ПредопределенныйЭлемент(ПолноеИмяПредопределенногоЭлемента);" & @CRLF & _
" Исключение" & @CRLF & _
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный первый параметр %1 в функции %2:" & @CRLF & _
" |%3'"), "Ссылка", "ОбщегоНазначения.ЗначенияРеквизитовОбъекта", " & @CRLF & _
" ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" ВызватьИсключение ТекстОшибки;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" // Разбор полного имени предопределенного." & @CRLF & _
" ЧастиПолногоИмени = СтрРазделить(ПолноеИмяПредопределенногоЭлемента, ".");" & @CRLF & _
" ПолноеИмяОбъектаМетаданных = ЧастиПолногоИмени[0] + "." + ЧастиПолногоИмени[1];" & @CRLF & _
" " & @CRLF & _
" // Если предопределенный не создан в ИБ, то требуется выполнить проверку доступа к объекту." & @CRLF & _
" // В других сценариях проверка доступа выполняется в момент исполнения запроса." & @CRLF & _
" Если Ссылка = Неопределено Тогда " & @CRLF & _
" МетаданныеОбъекта = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" Если Не ПравоДоступа("Чтение", МетаданныеОбъекта) Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Недостаточно прав для работы с таблицей ""%1""'"), ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Иначе // Если передана ссылка." & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" ПолноеИмяОбъектаМетаданных = Ссылка.Метаданные().ПолноеИмя(); " & @CRLF & _
" Исключение" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный первый параметр %1 в функции %2: " & @CRLF & _
" |Значение должно быть ссылкой или именем предопределенного элемента.'"), " & @CRLF & _
" "Ссылка", "ОбщегоНазначения.ЗначенияРеквизитовОбъекта");" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Разбор реквизитов, если второй параметр Строка." & @CRLF & _
" Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда" & @CRLF & _
" Если ПустаяСтрока(Реквизиты) Тогда" & @CRLF & _
" Возврат Новый Структура;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Реквизиты = СтрРазделить(Реквизиты, ",", Ложь);" & @CRLF & _
" Для Индекс = 0 По Реквизиты.ВГраница() Цикл" & @CRLF & _
" Реквизиты[Индекс] = СокрЛП(Реквизиты[Индекс]);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" МультиязычныеРеквизиты = Новый Соответствие;" & @CRLF & _
" СуффиксЯзыка = "";" & @CRLF & _
" Если ЗначениеЗаполнено(КодЯзыка) Тогда" & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда" & @CRLF & _
" МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер");" & @CRLF & _
" СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка);" & @CRLF & _
" Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда" & @CRLF & _
" МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Приведение реквизитов к единому формату." & @CRLF & _
" СтруктураПолей = Новый Структура;" & @CRLF & _
" Если ТипЗнч(Реквизиты) = Тип("Структура")" & @CRLF & _
" Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючИЗначение Из Реквизиты Цикл" & @CRLF & _
" СтруктураПолей.Вставить(КлючИЗначение.Ключ, СокрЛП(КлючИЗначение.Значение));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив")" & @CRLF & _
" Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда" & @CRLF & _
" " & @CRLF & _
" Для Каждого Реквизит Из Реквизиты Цикл" & @CRLF & _
" Реквизит = СокрЛП(Реквизит);" & @CRLF & _
" Попытка" & @CRLF & _
" ПсевдонимПоля = СтрЗаменить(Реквизит, ".", "");" & @CRLF & _
" СтруктураПолей.Вставить(ПсевдонимПоля, Реквизит);" & @CRLF & _
" Исключение " & @CRLF & _
" // Если псевдоним не является ключом." & @CRLF & _
" " & @CRLF & _
" // Поиск ошибки доступности полей." & @CRLF & _
" Результат = ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);" & @CRLF & _
" Если Результат.Ошибка Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: %3'")," & @CRLF & _
" "Реквизиты", "ОбщегоНазначения.ЗначенияРеквизитовОбъекта", Результат.ОписаниеОшибки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Не удалось распознать ошибку, проброс первичной ошибки." & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Иначе" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный тип второго параметра %1 в функции %2: %3.'"), " & @CRLF & _
" "Реквизиты", "ОбщегоНазначения.ЗначенияРеквизитовОбъекта", Строка(ТипЗнч(Реквизиты)));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Подготовка результата (после выполнения запроса переопределится)." & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" // Формирование текста запроса к выбираемым полям." & @CRLF & _
" ТекстЗапросаПолей = "";" & @CRLF & _
" Для каждого КлючИЗначение Из СтруктураПолей Цикл" & @CRLF & _
" " & @CRLF & _
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение)," & @CRLF & _
" КлючИЗначение.Значение," & @CRLF & _
" КлючИЗначение.Ключ);" & @CRLF & _
" ПсевдонимПоля = КлючИЗначение.Ключ;" & @CRLF & _
" " & @CRLF & _
" Если МультиязычныеРеквизиты[ИмяПоля] <> Неопределено Тогда" & @CRLF & _
" ИмяПоля = ИмяПоля + СуффиксЯзыка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТекстЗапросаПолей = " & @CRLF & _
" ТекстЗапросаПолей + ?(ПустаяСтрока(ТекстЗапросаПолей), "", ",") + "" & @CRLF & _
" | " + ИмяПоля + " КАК " + ПсевдонимПоля;" & @CRLF & _
" " & @CRLF & _
" // Предварительное добавление поля по псевдониму в возвращаемый результат." & @CRLF & _
" Результат.Вставить(ПсевдонимПоля);" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Если предопределенного нет в ИБ." & @CRLF & _
" // - приведение результата к отсутствию объекта в ИБ или передаче пустой ссылки." & @CRLF & _
" Если Ссылка = Неопределено Тогда " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Тип("Структура") = ТипЗнч(Реквизиты)" & @CRLF & _
" Или Тип("ФиксированнаяСтруктура") = ТипЗнч(Реквизиты) Тогда" & @CRLF & _
" Реквизиты = Новый Массив;" & @CRLF & _
" Для Каждого КлючИЗначение Из СтруктураПолей Цикл" & @CRLF & _
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение)," & @CRLF & _
" КлючИЗначение.Значение," & @CRLF & _
" КлючИЗначение.Ключ);" & @CRLF & _
" Реквизиты.Добавить(ИмяПоля);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" РеквизитыЧерезТочку = Новый Массив;" & @CRLF & _
" Для Индекс = -Реквизиты.ВГраница() По 0 Цикл" & @CRLF & _
" ИмяПоля = Реквизиты[-Индекс];" & @CRLF & _
" Если СтрНайти(ИмяПоля, ".") Тогда" & @CRLF & _
" РеквизитыЧерезТочку.Добавить(ИмяПоля);" & @CRLF & _
" Реквизиты.Удалить(-Индекс);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(Реквизиты) Тогда" & @CRLF & _
" ЗначенияРеквизитовОбъекта = ЗначенияРеквизитовОбъектов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Ссылка), Реквизиты, ВыбратьРазрешенные, КодЯзыка)[Ссылка];" & @CRLF & _
" Если ЗначенияРеквизитовОбъекта <> Неопределено Тогда" & @CRLF & _
" Для Каждого КлючИЗначение Из СтруктураПолей Цикл" & @CRLF & _
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение)," & @CRLF & _
" КлючИЗначение.Значение," & @CRLF & _
" КлючИЗначение.Ключ);" & @CRLF & _
" Если СтрНайти(ИмяПоля, ".") = 0 И ЗначенияРеквизитовОбъекта.Свойство(ИмяПоля) Тогда" & @CRLF & _
" Результат[КлючИЗначение.Ключ] = ЗначенияРеквизитовОбъекта[ИмяПоля];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не ЗначениеЗаполнено(РеквизитыЧерезТочку) Тогда" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Реквизиты = РеквизитыЧерезТочку;" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = " & @CRLF & _
" "ВЫБРАТЬ РАЗРЕШЕННЫЕ" & @CRLF & _
" |&ТекстЗапросаПолей" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка";" & @CRLF & _
" " & @CRLF & _
" Если Не ВыбратьРазрешенные Тогда " & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстЗапросаПолей", ТекстЗапросаПолей);" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" " & @CRLF & _
" // Выполнение запроса." & @CRLF & _
" Запрос = Новый Запрос;" & @CRLF & _
" Запрос.УстановитьПараметр("Ссылка", Ссылка);" & @CRLF & _
" Запрос.Текст = ТекстЗапроса;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Выборка = Запрос.Выполнить().Выбрать();" & @CRLF & _
" Исключение" & @CRLF & _
" " & @CRLF & _
" // Если реквизиты были переданы строкой, то они уже конвертированы в массив." & @CRLF & _
" // Если реквизиты - массив, оставляем без изменений." & @CRLF & _
" // Если реквизиты - структура - конвертируем в массив." & @CRLF & _
" // В остальных случаях уже было бы выброшено исключение." & @CRLF & _
" Если Тип("Структура") = ТипЗнч(Реквизиты)" & @CRLF & _
" Или Тип("ФиксированнаяСтруктура") = ТипЗнч(Реквизиты) Тогда" & @CRLF & _
" Реквизиты = Новый Массив;" & @CRLF & _
" Для каждого КлючИЗначение Из СтруктураПолей Цикл" & @CRLF & _
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение)," & @CRLF & _
" КлючИЗначение.Значение," & @CRLF & _
" КлючИЗначение.Ключ);" & @CRLF & _
" Реквизиты.Добавить(ИмяПоля);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Поиск ошибки доступности полей." & @CRLF & _
" Результат = ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);" & @CRLF & _
" Если Результат.Ошибка Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: %3'"), " & @CRLF & _
" "Реквизиты", "ОбщегоНазначения.ЗначенияРеквизитовОбъекта", Результат.ОписаниеОшибки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Не удалось распознать ошибку, проброс первичной ошибки." & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" // Заполнение реквизитов." & @CRLF & _
" Если Выборка.Следующий() Тогда" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Результат, Выборка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект." & @CRLF & _
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект" & @CRLF & _
"// для быстрого чтения отдельных реквизитов объекта из базы данных." & @CRLF & _
"//" & @CRLF & _
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя," & @CRLF & _
"// то следует использовать предварительный переход в привилегированный режим." & @CRLF & _
"// " & @CRLF & _
"// Если передано имя несуществующего реквизита, то вызывается исключение "Поле объекта не существует". " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить." & @CRLF & _
"// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить." & @CRLF & _
"// ИмяРеквизита - Строка - имя получаемого реквизита." & @CRLF & _
"// Допускается указание имени реквизита через точку, но при этом параметр КодЯзыка для" & @CRLF & _
"// такого реквизита учитываться не будет." & @CRLF & _
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;" & @CRLF & _
"// если есть ограничение на уровне записей, то возвращается Неопределено;" & @CRLF & _
"// если нет прав для работы с таблицей, то возникнет исключение;" & @CRLF & _
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу" & @CRLF & _
"// или любой из реквизитов." & @CRLF & _
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено." & @CRLF & _
"// Если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), " & @CRLF & _
"// то возвращается Неопределено." & @CRLF & _
"//" & @CRLF & _
"Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(ИмяРеквизита) Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: " & @CRLF & _
" |Имя реквизита должно быть заполнено.'"), "ИмяРеквизита", "ОбщегоНазначения.ЗначениеРеквизитаОбъекта");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные, КодЯзыка);" & @CRLF & _
" Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")];" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"// Возвращает значения реквизитов, прочитанные из информационной базы для нескольких объектов." & @CRLF & _
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект" & @CRLF & _
"// для быстрого чтения отдельных реквизитов объекта из базы данных." & @CRLF & _
"//" & @CRLF & _
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя," & @CRLF & _
"// то следует использовать предварительный переход в привилегированный режим." & @CRLF & _
"//" & @CRLF & _
"// Если передано имя несуществующего реквизита, то вызывается исключение "Поле объекта не существует". " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылки - Массив из ЛюбаяСсылка" & @CRLF & _
"// - ФиксированныйМассив из ЛюбаяСсылка - ссылки на объекты." & @CRLF & _
"// Если массив пуст, то результатом будет пустое соответствие." & @CRLF & _
"// Реквизиты - Строка - имена реквизитов перечисленные через запятую, в формате требований к свойствам" & @CRLF & _
"// структуры. Например, "Код, Наименование, Родитель"." & @CRLF & _
"// - Массив из Строка" & @CRLF & _
"// - ФиксированныйМассив из Строка - имена реквизитов в формате требований к свойствам структуры." & @CRLF & _
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя;" & @CRLF & _
"// если какой-либо объект будет исключен из выборки по правам, то этот объект" & @CRLF & _
"// будет исключен и из результата;" & @CRLF & _
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу" & @CRLF & _
"// или любой из реквизитов." & @CRLF & _
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение - список объектов и значений их реквизитов:" & @CRLF & _
"// * Ключ - ЛюбаяСсылка - ссылка на объект;" & @CRLF & _
"// * Значение - Структура:" & @CRLF & _
"// ** Ключ - Строка - имя реквизита;" & @CRLF & _
"// ** Значение - Произвольный - значение реквизита." & @CRLF & _
"// " & @CRLF & _
"Функция ЗначенияРеквизитовОбъектов(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда" & @CRLF & _
" Реквизиты = СтрСоединить(Реквизиты, ",");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(Реквизиты) Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: " & @CRLF & _
" |Поле объекта должно быть указано.'"), "Реквизиты", "ОбщегоНазначения.ЗначенияРеквизитовОбъектов");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если СтрНайти(Реквизиты, ".") <> 0 Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: " & @CRLF & _
" |Обращение через точку не поддерживается.'"), "Реквизиты", "ОбщегоНазначения.ЗначенияРеквизитовОбъектов");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗначенияРеквизитов = Новый Соответствие;" & @CRLF & _
" Если Ссылки.Количество() = 0 Тогда" & @CRLF & _
" Возврат ЗначенияРеквизитов;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(КодЯзыка) Тогда" & @CRLF & _
" КодЯзыка = СтрРазделить(КодЯзыка, "_", Истина)[0];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" РеквизитыТекстЗапроса = Реквизиты;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда" & @CRLF & _
" МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер");" & @CRLF & _
" Если ЗначениеЗаполнено(КодЯзыка) Тогда" & @CRLF & _
" СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка);" & @CRLF & _
" Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда" & @CRLF & _
" МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылки[0]);" & @CRLF & _
" НаборРеквизитов = СтрРазделить(Реквизиты, ",");" & @CRLF & _
" Для Позиция = 0 По НаборРеквизитов.ВГраница() Цикл" & @CRLF & _
" ИмяРеквизита = СокрЛП(НаборРеквизитов[Позиция]);" & @CRLF & _
" Если МультиязычныеРеквизиты[ИмяРеквизита] <> Неопределено Тогда" & @CRLF & _
" ИмяССуффиксом = ИмяРеквизита + СуффиксЯзыка;" & @CRLF & _
" НаборРеквизитов[Позиция] = ИмяССуффиксом + " КАК " + ИмяРеквизита;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" РеквизитыТекстЗапроса = СтрСоединить(НаборРеквизитов, ",");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" СсылкиПоТипам = Новый Соответствие;" & @CRLF & _
" Для Каждого Ссылка Из Ссылки Цикл" & @CRLF & _
" Тип = ТипЗнч(Ссылка);" & @CRLF & _
" Если СсылкиПоТипам[Тип] = Неопределено Тогда" & @CRLF & _
" СсылкиПоТипам[Тип] = Новый Массив;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ЭлементПоТипу = СсылкиПоТипам[Тип]; // Массив" & @CRLF & _
" ЭлементПоТипу.Добавить(Ссылка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ТекстыЗапросов = Новый Массив;" & @CRLF & _
" ПараметрыЗапроса = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" ИменаОбъектовМетаданных = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл" & @CRLF & _
" Тип = СсылкиПоТипу.Ключ;" & @CRLF & _
" ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);" & @CRLF & _
" Если ОбъектМетаданных = Неопределено Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный первый параметр %1 в функции %2: " & @CRLF & _
" |Значения массива должны быть ссылками.'"), "Ссылки", "ОбщегоНазначения.ЗначенияРеквизитовОбъектов");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя();" & @CRLF & _
" ИменаОбъектовМетаданных.Добавить(ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса =" & @CRLF & _
" "ВЫБРАТЬ РАЗРЕШЕННЫЕ" & @CRLF & _
" | Ссылка," & @CRLF & _
" | &Реквизиты" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | ПсевдонимЗаданнойТаблицы.Ссылка В (&Ссылки)";" & @CRLF & _
" Если Не ВыбратьРазрешенные Или ТекстыЗапросов.Количество() > 0 Тогда" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты", РеквизитыТекстЗапроса);" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); // @Query-part-1" & @CRLF & _
" ПараметрыЗапроса.Вставить(ИмяПараметра, СсылкиПоТипу.Значение);" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда" & @CRLF & _
" МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер");" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(КодЯзыка) И КодЯзыка <> КодОсновногоЯзыка()" & @CRLF & _
" И МодульМультиязычностьСервер.ОбъектСодержитТЧПредставления(ПолноеИмяОбъектаМетаданных) Тогда" & @CRLF & _
" " & @CRLF & _
" МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданных);" & @CRLF & _
" ПоляТаблиц = Новый Массив;" & @CRLF & _
" ПоляТаблиц.Добавить("ПсевдонимЗаданнойТаблицы.Ссылка");" & @CRLF & _
" Для Каждого Реквизит Из СтрРазделить(Реквизиты, ",") Цикл" & @CRLF & _
" Если МультиязычныеРеквизиты[Реквизит] <> Неопределено Тогда" & @CRLF & _
" " & @CRLF & _
" Если МультиязычныеРеквизиты[Реквизит] = Истина Тогда" & @CRLF & _
" ПолеРеквизита = "ЕСТЬNULL(ТаблицаПредставления." + Реквизит + ", """")";" & @CRLF & _
" Иначе" & @CRLF & _
" СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка);" & @CRLF & _
" ПолеРеквизита = ?(ЗначениеЗаполнено(СуффиксЯзыка), Реквизит + СуффиксЯзыка, Реквизит);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПоляТаблиц.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 КАК %2"," & @CRLF & _
" ПолеРеквизита, Реквизит));" & @CRLF & _
" Иначе" & @CRLF & _
" ПоляТаблиц.Добавить(Реквизит);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ПоляТаблиц = СтрСоединить(ПоляТаблиц, "," + Символы.ПС);" & @CRLF & _
" " & @CRLF & _
" Таблицы = ПолноеИмяОбъектаМетаданных + " " + "КАК ПсевдонимЗаданнойТаблицы" + Символы.ПС" & @CRLF & _
" + "ЛЕВОЕ СОЕДИНЕНИЕ" + " " + ПолноеИмяОбъектаМетаданных + ".Представления КАК ТаблицаПредставления" + Символы.ПС" & @CRLF & _
" + "ПО ТаблицаПредставления.Ссылка = ПсевдонимЗаданнойТаблицы.Ссылка И ТаблицаПредставления.КодЯзыка = &КодЯзыка";" & @CRLF & _
" " & @CRLF & _
" ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");" & @CRLF & _
" Условия = "ПсевдонимЗаданнойТаблицы.Ссылка В (&" + ИмяПараметра + ")";" & @CRLF & _
" " & @CRLF & _
" СтрокиЗапроса = Новый Массив;" & @CRLF & _
" СтрокиЗапроса.Добавить("ВЫБРАТЬ" + ?(ВыбратьРазрешенные И Не ЗначениеЗаполнено(ТекстыЗапросов), " " + "РАЗРЕШЕННЫЕ", "")); // @Query-part-1, @Query-part-3" & @CRLF & _
" СтрокиЗапроса.Добавить(ПоляТаблиц);" & @CRLF & _
" СтрокиЗапроса.Добавить("ИЗ"); // @Query-part-1" & @CRLF & _
" СтрокиЗапроса.Добавить(Таблицы);" & @CRLF & _
" СтрокиЗапроса.Добавить("ГДЕ"); // @Query-part-1" & @CRLF & _
" СтрокиЗапроса.Добавить(Условия);" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = СтрСоединить(СтрокиЗапроса, Символы.ПС);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТекстыЗапросов.Добавить(ТекстЗапроса);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС);" & @CRLF & _
" " & @CRLF & _
" Запрос = Новый Запрос(ТекстЗапроса);" & @CRLF & _
" Запрос.УстановитьПараметр("КодЯзыка", КодЯзыка);" & @CRLF & _
" Для Каждого Параметр Из ПараметрыЗапроса Цикл" & @CRLF & _
" Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Выборка = Запрос.Выполнить().Выбрать();" & @CRLF & _
" Исключение" & @CRLF & _
" " & @CRLF & _
" // Удаление пробелов." & @CRLF & _
" Реквизиты = СтрЗаменить(Реквизиты, " ", "");" & @CRLF & _
" // Преобразование параметра в массив полей." & @CRLF & _
" Реквизиты = СтрРазделить(Реквизиты, ",");" & @CRLF & _
" " & @CRLF & _
" // Поиск ошибки доступности полей." & @CRLF & _
" СписокОшибок = Новый Массив;" & @CRLF & _
" Для Каждого ПолноеИмяОбъектаМетаданных Из ИменаОбъектовМетаданных Цикл" & @CRLF & _
" Результат = ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);" & @CRLF & _
" Если Результат.Ошибка Тогда " & @CRLF & _
" СписокОшибок.Добавить(Результат.ОписаниеОшибки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(СписокОшибок) Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: %3'"), " & @CRLF & _
" "Реквизиты", "ОбщегоНазначения.ЗначенияРеквизитовОбъектов", СтрСоединить(СписокОшибок, Символы.ПС));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Не удалось распознать ошибку, проброс первичной ошибки." & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Пока Выборка.Следующий() Цикл" & @CRLF & _
" Результат = Новый Структура(Реквизиты);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Результат, Выборка);" & @CRLF & _
" ЗначенияРеквизитов[Выборка.Ссылка] = Результат;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ЗначенияРеквизитов;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает значения реквизита, прочитанного из информационной базы для нескольких объектов." & @CRLF & _
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект" & @CRLF & _
"// для быстрого чтения отдельных реквизитов объекта из базы данных." & @CRLF & _
"//" & @CRLF & _
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя," & @CRLF & _
"// то следует использовать предварительный переход в привилегированный режим." & @CRLF & _
"// " & @CRLF & _
"// Если передано имя несуществующего реквизита, то вызывается исключение "Поле объекта не существует". " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// МассивСсылок - Массив из ЛюбаяСсылка" & @CRLF & _
"// - ФиксированныйМассив из ЛюбаяСсылка" & @CRLF & _
"// ИмяРеквизита - Строка - например, "Код"." & @CRLF & _
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя;" & @CRLF & _
"// если какой-либо объект будет исключен из выборки по правам, то этот объект" & @CRLF & _
"// будет исключен и из результата;" & @CRLF & _
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу" & @CRLF & _
"// или любой из реквизитов." & @CRLF & _
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - ЛюбаяСсылка - ссылка на объект," & @CRLF & _
"// * Значение - Произвольный - значение прочитанного реквизита." & @CRLF & _
"// " & @CRLF & _
"Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(ИмяРеквизита) Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неверный второй параметр %1 в функции %2: " & @CRLF & _
" |Имя реквизита должно быть заполнено.'"), "ИмяРеквизита", "ОбщегоНазначения.ЗначениеРеквизитаОбъектов");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗначенияРеквизитов = ЗначенияРеквизитовОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные, КодЯзыка);" & @CRLF & _
" Для каждого Элемент Из ЗначенияРеквизитов Цикл" & @CRLF & _
" ЗначенияРеквизитов[Элемент.Ключ] = Элемент.Значение[ИмяРеквизита];" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ЗначенияРеквизитов;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Добавляет или изменяет значение реквизита в объекте." & @CRLF & _
"//" & @CRLF & _
"// Если передано имя несуществующего реквизита, то вызывается исключение. " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Объект - СправочникОбъект" & @CRLF & _
"// - ДокументОбъект" & @CRLF & _
"// - ПланВидовХарактеристикОбъект" & @CRLF & _
"// - РегистрСведенийЗапись - заполняемый объект." & @CRLF & _
"// ИмяРеквизита - Строка - имя заполняемого реквизита. Например, "Комментарий"" & @CRLF & _
"// Значение - Строка - значение помещаемое в реквизит." & @CRLF & _
"// КодЯзыка - Строка - код языка реквизита. Например, "ru"." & @CRLF & _
"//" & @CRLF & _
"Процедура УстановитьЗначениеРеквизита(Объект, ИмяРеквизита, Значение, КодЯзыка = Неопределено) Экспорт" & @CRLF & _
" УстановитьЗначенияРеквизитов(Объект, Новый Структура(ИмяРеквизита, Значение), КодЯзыка);" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Добавляет или изменяет значения реквизитов в объекте." & @CRLF & _
"//" & @CRLF & _
"// Если передано имя несуществующего реквизита, то вызывается исключение. " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Объект - СправочникОбъект" & @CRLF & _
"// - ДокументОбъект" & @CRLF & _
"// - ПланВидовХарактеристикОбъект" & @CRLF & _
"// - РегистрСведенийЗапись - заполняемый объект." & @CRLF & _
"// Значения - Структура - где ключ это имя реквизита, а значение содержит строку помещаемую в реквизит." & @CRLF & _
"// КодЯзыка - Строка - код языка реквизита. Например, "ru"." & @CRLF & _
"//" & @CRLF & _
"Процедура УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда" & @CRLF & _
" МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер");" & @CRLF & _
" МодульМультиязычностьСервер.УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка);" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ЗначениеРеквизита Из Значения Цикл" & @CRLF & _
" Значение = ЗначениеРеквизита.Значение;" & @CRLF & _
" Если ТипЗнч(Значение) = Тип("Строка") И СтрокаВВидеНСтр(Значение) Тогда" & @CRLF & _
" Значение = НСтр(ЗначениеРеквизита.Значение);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Объект[ЗначениеРеквизита.Ключ] = Значение;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает код основного языка информационной базы, например "ru"." & @CRLF & _
"// На котором программно записываются автогенерируемые строки в информационную базу." & @CRLF & _
"// Например, при начальном заполнении информационной базы данными из макета, автогенерации комментария" & @CRLF & _
"// к проводке или определении значения параметра ИмяСобытия метода ЗаписьЖурналаРегистрации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка" & @CRLF & _
"//" & @CRLF & _
"Функция КодОсновногоЯзыка() Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда" & @CRLF & _
" МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер");" & @CRLF & _
" Возврат МодульМультиязычностьСервер.КодОсновногоЯзыка();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.ОсновнойЯзык.КодЯзыка;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает признак того, что для пользователя установлен язык интерфейса" & @CRLF & _
"// соответствующий основному языку информационной базы." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево" & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоОсновнойЯзык() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат СтрСравнить(КодОсновногоЯзыка(), ТекущийЯзык().КодЯзыка) = 0;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает ссылку предопределенного элемента по его полному имени." & @CRLF & _
"// Предопределенные элементы могут содержаться только в следующих объектах:" & @CRLF & _
"// - справочники;" & @CRLF & _
"// - планы видов характеристик;" & @CRLF & _
"// - планы счетов;" & @CRLF & _
"// - планы видов расчета." & @CRLF & _
"// После изменения состава предопределенных следует выполнить метод" & @CRLF & _
"// ОбновитьПовторноИспользуемыеЗначения(), который сбросит кэш ПовтИсп в текущем сеансе." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПолноеИмяПредопределенного - Строка - полный путь к предопределенному элементу, включая его имя." & @CRLF & _
"// Формат аналогичен функции глобального контекста ПредопределенноеЗначение()." & @CRLF & _
"// Например:" & @CRLF & _
"// "Справочник.ВидыКонтактнойИнформации.EmailПользователя"" & @CRLF & _
"// "ПланСчетов.Хозрасчетный.Материалы"" & @CRLF & _
"// "ПланВидовРасчета.Начисления.ОплатаПоОкладу"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// ЛюбаяСсылка - ссылка на предопределенный элемент." & @CRLF & _
"// Неопределено - если предопределенный элемент есть в метаданных, но не создан в ИБ." & @CRLF & _
"//" & @CRLF & _
"Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт" & @CRLF & _
" " & @CRLF & _
" СтандартнаяОбработка = ОбщегоНазначенияСлужебныйКлиентСервер.ИспользоватьСтандартнуюФункциюПолученияПредопределенного(" & @CRLF & _
" ПолноеИмяПредопределенного);" & @CRLF & _
" " & @CRLF & _
" Если СтандартнаяОбработка Тогда " & @CRLF & _
" Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПоляПредопределенного = ОбщегоНазначенияСлужебныйКлиентСервер.ИмяПредопределенногоПоПолям(ПолноеИмяПредопределенного);" & @CRLF & _
" " & @CRLF & _
" ПредопределенныеЗначения = СтандартныеПодсистемыПовтИсп.СсылкиПоИменамПредопределенных(" & @CRLF & _
" ПоляПредопределенного.ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" " & @CRLF & _
" Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредопределенныйЭлемент(" & @CRLF & _
" ПолноеИмяПредопределенного, ПоляПредопределенного, ПредопределенныеЗначения);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает информацию о том, являются ли переданные элементы предопределенными." & @CRLF & _
"// Если нет прав доступа на уровне записей, то элемент не включается в результат." & @CRLF & _
"// Если нет прав доступа к таблице, то вызывается исключение." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Элементы - Массив из ЛюбаяСсылка" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение - список объектов и значений их реквизитов:" & @CRLF & _
"// * Ключ - ЛюбаяСсылка - ссылка на объект." & @CRLF & _
"// * Значение - Булево - Истина, если это ссылка на предопределенный элемент." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПредопределенныеЭлементы(Знач Элементы) Экспорт" & @CRLF & _
" " & @CRLF & _
" ИменаРеквизитов = Новый Массив;" & @CRLF & _
" Для каждого ИмяРеквизита Из СтандартныеПодсистемыСервер.РеквизитыПредопределенныхДанных() Цикл" & @CRLF & _
" ИменаРеквизитов.Добавить(ИмяРеквизита.Ключ);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ЗначенияРеквизитов = СтандартныеПодсистемыСервер.ЗначенияРеквизитовОбъектовЕслиСуществуют(Элементы, ИменаРеквизитов);" & @CRLF & _
" Результат = Новый Соответствие;" & @CRLF & _
" Для каждого Элемент Из ЗначенияРеквизитов Цикл" & @CRLF & _
" ЭтоПредопределенныйЭлемент = Ложь;" & @CRLF & _
" Для каждого Значение Из Элемент.Значение Цикл" & @CRLF & _
" Если ЗначениеЗаполнено(Значение.Значение) Тогда" & @CRLF & _
" ЭтоПредопределенныйЭлемент = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Результат[Элемент.Ключ] = ЭтоПредопределенныйЭлемент;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Возврат Результат; " & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверяет статус проведения переданных документов и возвращает" & @CRLF & _
"// те из них, которые не проведены." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Документы - Массив из ДокументСсылка - документы, статус проведения которых необходимо проверить." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив из ДокументСсылка - непроведенные документы." & @CRLF & _
"//" & @CRLF & _
"Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" ШаблонЗапроса = " & @CRLF & _
" "ВЫБРАТЬ" & @CRLF & _
" | ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &ИмяДокумента КАК ПсевдонимЗаданнойТаблицы" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | ПсевдонимЗаданнойТаблицы.Ссылка В(&МассивДокументов)" & @CRLF & _
" | И НЕ ПсевдонимЗаданнойТаблицы.Проведен";" & @CRLF & _
" " & @CRLF & _
" ТекстОбъединитьВсе =" & @CRLF & _
" "" & @CRLF & _
" |" & @CRLF & _
" |ОБЪЕДИНИТЬ ВСЕ" & @CRLF & _
" |" & @CRLF & _
" |";" & @CRLF & _
" " & @CRLF & _
" ИменаДокументов = Новый Массив;" & @CRLF & _
" Для Каждого Документ Из Документы Цикл" & @CRLF & _
" МетаданныеДокумента = Документ.Метаданные();" & @CRLF & _
" Если ИменаДокументов.Найти(МетаданныеДокумента.ПолноеИмя()) = Неопределено" & @CRLF & _
" И Метаданные.Документы.Содержит(МетаданныеДокумента)" & @CRLF & _
" И МетаданныеДокумента.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда" & @CRLF & _
" ИменаДокументов.Добавить(МетаданныеДокумента.ПолноеИмя());" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = "";" & @CRLF & _
" Для Каждого ИмяДокумента Из ИменаДокументов Цикл" & @CRLF & _
" Если Не ПустаяСтрока(ТекстЗапроса) Тогда" & @CRLF & _
" ТекстЗапроса = ТекстЗапроса + ТекстОбъединитьВсе;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ТекстПодзапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяДокумента", ИмяДокумента);" & @CRLF & _
" ТекстЗапроса = ТекстЗапроса + ТекстПодзапроса;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Запрос = Новый Запрос;" & @CRLF & _
" Запрос.Текст = ТекстЗапроса;" & @CRLF & _
" Запрос.УстановитьПараметр("МассивДокументов", Документы);" & @CRLF & _
" " & @CRLF & _
" Если Не ПустаяСтрока(ТекстЗапроса) Тогда" & @CRLF & _
" Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Выполняет попытку проведения документов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Документы - Массив из ДокументСсылка - документы, которые необходимо провести." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив из Структура:" & @CRLF & _
"// * Ссылка - ДокументСсылка - документ, который не удалось провести," & @CRLF & _
"// * ОписаниеОшибки - Строка - текст описания ошибки при проведении." & @CRLF & _
"//" & @CRLF & _
"Функция ПровестиДокументы(Документы) Экспорт" & @CRLF & _
" " & @CRLF & _
" НепроведенныеДокументы = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ДокументСсылка Из Документы Цикл" & @CRLF & _
" " & @CRLF & _
" ВыполненоУспешно = Ложь;" & @CRLF & _
" ДокументОбъект = ДокументСсылка.ПолучитьОбъект();" & @CRLF & _
" Если ДокументОбъект.ПроверитьЗаполнение() Тогда" & @CRLF & _
" РежимПроведения = РежимПроведенияДокумента.Неоперативный;" & @CRLF & _
" Если ДокументОбъект.Дата >= НачалоДня(ТекущаяДатаСеанса())" & @CRLF & _
" И ДокументСсылка.Метаданные().ОперативноеПроведение = Метаданные.СвойстваОбъектов.ОперативноеПроведение.Разрешить Тогда" & @CRLF & _
" РежимПроведения = РежимПроведенияДокумента.Оперативный;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Попытка" & @CRLF & _
" ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведения);" & @CRLF & _
" ВыполненоУспешно = Истина;" & @CRLF & _
" Исключение" & @CRLF & _
" ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" Иначе" & @CRLF & _
" ПредставлениеОшибки = НСтр("ru = 'Поля документа не заполнены.'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не ВыполненоУспешно Тогда" & @CRLF & _
" НепроведенныеДокументы.Добавить(Новый Структура("Ссылка,ОписаниеОшибки", ДокументСсылка, ПредставлениеОшибки));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат НепроведенныеДокументы;" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"// Проверяет наличие ссылок на объект в базе данных." & @CRLF & _
"// При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СсылкаИлиМассивСсылок - ЛюбаяСсылка" & @CRLF & _
"// - Массив из ЛюбаяСсылка - объект или список объектов." & @CRLF & _
"// ИскатьСредиСлужебныхОбъектов - Булево - если Истина, то не будут учитываться" & @CRLF & _
"// исключения поиска ссылок, заданные при разработке конфигурации." & @CRLF & _
"// Про исключение поиска ссылок см. подробнее" & @CRLF & _
"// ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если есть ссылки на объект." & @CRLF & _
"//" & @CRLF & _
"Функция ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(СсылкаИлиМассивСсылок) = Тип("Массив") Тогда" & @CRLF & _
" МассивСсылок = СсылкаИлиМассивСсылок;" & @CRLF & _
" Иначе" & @CRLF & _
" МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаИлиМассивСсылок);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" МестаИспользования = НайтиПоСсылкам(МассивСсылок);" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" " & @CRLF & _
" Если Не ИскатьСредиСлужебныхОбъектов Тогда" & @CRLF & _
" Для каждого Элемент Из СлужебныеСвязиДанных(МестаИспользования) Цикл" & @CRLF & _
" МестаИспользования.Удалить(Элемент.Ключ);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат МестаИспользования.Количество() > 0;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"" & @CRLF & _
"// Определяет, указаны ли места использования в исключениях поиска ссылок." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// МестаИспользования - ТаблицаЗначений - результат функции НайтиПоСсылкам:" & @CRLF & _
"// * Ссылка - ЛюбаяСсылка - проверяемая ссылка." & @CRLF & _
"// * Данные - ЛюбаяСсылка - место использования." & @CRLF & _
"// * Метаданные - ОбъектМетаданных - метаданные места использования." & @CRLF & _
"// ИсключенияПоискаСсылок - см. ИсключенияПоискаСсылок" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - СтрокаТаблицыЗначений" & @CRLF & _
"// * Значение - Булево - всегда Истина. Если это не служебная связь данных, то в соответствии нет элемента." & @CRLF & _
"//" & @CRLF & _
"Функция СлужебныеСвязиДанных(Знач МестаИспользования, Знач ИсключенияПоискаСсылок = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ИсключенияПоискаСсылок = Неопределено Тогда" & @CRLF & _
" ИсключенияПоискаСсылок = ИсключенияПоискаСсылок();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" Результат = Новый Соответствие;" & @CRLF & _
" МестоИспользованияПоМетаданным = Новый Соответствие;" & @CRLF & _
" " & @CRLF & _
" Для каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ИсключениеПоиска = ИсключенияПоискаСсылок[МестоИспользования.Метаданные];" & @CRLF & _
" " & @CRLF & _
" // Данные могут быть как ссылкой, так и ключом записи регистра." & @CRLF & _
" Если ИсключениеПоиска = Неопределено Тогда" & @CRLF & _
" Если МестоИспользования.Ссылка = МестоИспользования.Данные Тогда" & @CRLF & _
" Результат[МестоИспользования] = Истина; // Ссылку саму на себя исключаем." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Продолжить;" & @CRLF & _
" ИначеЕсли ИсключениеПоиска = "*" Тогда" & @CRLF & _
" Результат[МестоИспользования] = Истина; // Если указано исключить все - считаем все исключением." & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЭтоСсылка = ЭтоСсылка(ТипЗнч(МестоИспользования.Данные));" & @CRLF & _
" Если Не ЭтоСсылка Тогда " & @CRLF & _
" Для Каждого ПутьКРеквизиту Из ИсключениеПоиска Цикл" & @CRLF & _
" ЗначениеРеквизита = Новый Структура(ПутьКРеквизиту);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ЗначениеРеквизита, МестоИспользования.Данные);" & @CRLF & _
" Если ЗначениеРеквизита[ПутьКРеквизиту] = МестоИспользования.Ссылка Тогда " & @CRLF & _
" Результат[МестоИспользования] = Истина;" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" Если ИсключениеПоиска.Количество() = 0 Тогда" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИмяТаблицы = МестоИспользования.Метаданные.ПолноеИмя();" & @CRLF & _
" Значение = МестоИспользованияПоМетаданным[ИмяТаблицы];" & @CRLF & _
" Если Значение = Неопределено Тогда" & @CRLF & _
" Значение = Новый ТаблицаЗначений;" & @CRLF & _
" Значение.Колонки.Добавить("Ссылка", ОписаниеТипаВсеСсылки());" & @CRLF & _
" Значение.Колонки.Добавить("Данные", ОписаниеТипаВсеСсылки());" & @CRLF & _
" Значение.Колонки.Добавить("Метаданные");" & @CRLF & _
" МестоИспользованияПоМетаданным[ИмяТаблицы] = Значение;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Значение.Добавить(), МестоИспользования);" & @CRLF & _
"" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Индекс = 1;" & @CRLF & _
" Запрос = Новый Запрос;" & @CRLF & _
" ТекстыЗапроса = Новый Массив;" & @CRLF & _
" ВременныеТаблицы = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Для каждого МестоИспользования Из МестоИспользованияПоМетаданным Цикл" & @CRLF & _
" " & @CRLF & _
" ИмяТаблицы = МестоИспользования.Ключ; // Строка" & @CRLF & _
" МестоИспользования = МестоИспользования.Значение; // ТаблицаЗначений" & @CRLF & _
"" & @CRLF & _
" // Проверка, есть ли по исключаемому пути в указанных данных проверяемая ссылка." & @CRLF & _
" Если МестоИспользования.Количество() > 1 Тогда" & @CRLF & _
" ШаблонЗапроса = " & @CRLF & _
" "ВЫБРАТЬ" & @CRLF & _
" | Ссылки.Данные КАК Ссылка," & @CRLF & _
" | Ссылки.Ссылка КАК ПроверяемаяСсылка" & @CRLF & _
" |ПОМЕСТИТЬ ВТТаблицаСсылок" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &Ссылки КАК Ссылки" & @CRLF & _
" |;" & @CRLF & _
" |" & @CRLF & _
" |ВЫБРАТЬ" & @CRLF & _
" | ТаблицаСсылок.Ссылка КАК Ссылка," & @CRLF & _
" | ТаблицаСсылок.ПроверяемаяСсылка КАК ПроверяемаяСсылка" & @CRLF & _
" |ИЗ" & @CRLF & _
" | ВТТаблицаСсылок КАК ТаблицаСсылок" & @CRLF & _
" | ЛЕВОЕ СОЕДИНЕНИЕ #ПолноеИмяОбъектаМетаданных КАК Таблица" & @CRLF & _
" | ПО ТаблицаСсылок.Ссылка = Таблица.Ссылка" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | &Условие";" & @CRLF & _
"" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#ПолноеИмяОбъектаМетаданных", ИмяТаблицы);" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВТТаблицаСсылок", "ВТТаблицаСсылок" + Формат(Индекс, "ЧГ=;ЧН="));" & @CRLF & _
"" & @CRLF & _
" ИмяПараметра = "Ссылки" + Формат(Индекс, "ЧГ=;ЧН=");" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра);" & @CRLF & _
" Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования);" & @CRLF & _
" " & @CRLF & _
" ЧастиЗапроса = СтрРазделить(ТекстЗапроса, ";");" & @CRLF & _
" ВременныеТаблицы.Добавить(ЧастиЗапроса[0]);" & @CRLF & _
" ТекстЗапроса = ЧастиЗапроса[1];" & @CRLF & _
"" & @CRLF & _
" Иначе" & @CRLF & _
" ШаблонЗапроса = " & @CRLF & _
" "ВЫБРАТЬ" & @CRLF & _
" | &СсылкаНаВладельца КАК Ссылка," & @CRLF & _
" | &ПроверяемаяСсылка КАК ПроверяемаяСсылка" & @CRLF & _
" |ИЗ" & @CRLF & _
" | #ПолноеИмяОбъектаМетаданных КАК Таблица" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | Таблица.Ссылка = &СсылкаНаВладельца" & @CRLF & _
" | И (&Условие)";" & @CRLF & _
"" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#ПолноеИмяОбъектаМетаданных", ИмяТаблицы);" & @CRLF & _
"" & @CRLF & _
" ИмяПараметра = "СсылкаНаВладельца" + Формат(Индекс, "ЧГ=;ЧН=");" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СсылкаНаВладельца", "&" + ИмяПараметра);" & @CRLF & _
" Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования[0].Данные);" & @CRLF & _
"" & @CRLF & _
" ИмяПараметра = "ПроверяемаяСсылка" + Формат(Индекс, "ЧГ=;ЧН=");" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПроверяемаяСсылка", "&" + ИмяПараметра);" & @CRLF & _
" Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования[0].Ссылка);" & @CRLF & _
"" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" ТекстУсловия = Новый Массив;" & @CRLF & _
" // Относительный путь к реквизиту: "<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]"." & @CRLF & _
" Для Каждого ПутьКРеквизиту Из ИсключенияПоискаСсылок[МестоИспользования[0].Метаданные] Цикл" & @CRLF & _
" ТекстУсловия.Добавить(ПутьКРеквизиту + " = " " & @CRLF & _
" + ?(МестоИспользования.Количество() > 1, "ТаблицаСсылок.ПроверяемаяСсылка", "&" + ИмяПараметра));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Условие", СтрСоединить(ТекстУсловия, " ИЛИ "));" & @CRLF & _
" " & @CRLF & _
" ТекстыЗапроса.Добавить(ТекстЗапроса);" & @CRLF & _
" Индекс = Индекс + 1;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ТекстыЗапроса.Количество() = 0 Тогда" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Запрос.Текст = СтрСоединить(ВременныеТаблицы, ";" + Символы.ПС)" & @CRLF & _
" + ?(ВременныеТаблицы.Количество() > 0, ";" + Символы.ПС, "") " & @CRLF & _
" + СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС);" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" ВыборкаЗапроса = Запрос.Выполнить().Выбрать();" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" " & @CRLF & _
" МестаИспользования.Индексы.Добавить("Ссылка,Данные");" & @CRLF & _
" Пока ВыборкаЗапроса.Следующий() Цикл" & @CRLF & _
" СлужебныеСвязиДанных = МестаИспользования.НайтиСтроки(Новый Структура("Ссылка,Данные", " & @CRLF & _
" ВыборкаЗапроса.ПроверяемаяСсылка, ВыборкаЗапроса.Ссылка));" & @CRLF & _
" Для каждого СлужебнаяСвязьДанных Из СлужебныеСвязиДанных Цикл" & @CRLF & _
" Результат[СлужебнаяСвязьДанных] = Истина;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет, указано ли место использования в исключениях поиска ссылок." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// МестоИспользования - Структура:" & @CRLF & _
"// * Ссылка - ЛюбаяСсылка - проверяемая ссылка." & @CRLF & _
"// * Данные - ЛюбаяСсылка - место использования." & @CRLF & _
"// * Метаданные - ОбъектМетаданных - метаданные места использования." & @CRLF & _
"// ИсключенияПоискаСсылок - см. ИсключенияПоискаСсылок" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево" & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоСлужебнаяСвязьДанных(Знач МестоИспользования, Знач ИсключенияПоискаСсылок = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ИсключенияПоискаСсылок = Неопределено Тогда" & @CRLF & _
" ИсключенияПоискаСсылок = ИсключенияПоискаСсылок();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" Значение = Новый ТаблицаЗначений;" & @CRLF & _
" Значение.Колонки.Добавить("Ссылка", ОписаниеТипаВсеСсылки());" & @CRLF & _
" Значение.Колонки.Добавить("Данные", ОписаниеТипаВсеСсылки());" & @CRLF & _
" Значение.Колонки.Добавить("Метаданные");" & @CRLF & _
" МестоИспользованияСтрока = Значение.Добавить();" & @CRLF & _
" ЗаполнитьЗначенияСвойств(МестоИспользованияСтрока, МестоИспользования);" & @CRLF & _
" " & @CRLF & _
" Результат = СлужебныеСвязиДанных(Значение, ИсключенияПоискаСсылок);" & @CRLF & _
" Возврат Результат[МестоИспользованияСтрока] <> Неопределено;" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Производит замену ссылок во всех данных. После замены неиспользуемые ссылки опционально удаляются." & @CRLF & _
"// Замена ссылок происходит с транзакциями по изменяемому объекту и его связям, не по анализируемой ссылке." & @CRLF & _
"// При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях." & @CRLF & _
"// Если описаны связи подчиненных и основных объектов (см. СвязиПодчиненныхОбъектов), то:" & @CRLF & _
"// * при замене основных объектов будет выполнен поиск замен подчиненных объектов;" & @CRLF & _
"// * если ВыполнятьАвтоматическийПоискЗамен = Истина, то будет выполнена попытка поиска замен для подчиненных объектов " & @CRLF & _
"// по значениям полей связи. В случае, если объект не существует, будет выполнена процедура ПриПоискеЗаменыСсылок; " & @CRLF & _
"// * если МетодПоиска в описании связей задан, то если автоматический поиск не нашел замен" & @CRLF & _
"// или не выполнялся, будет вызван МетодПоиска для подбора замен." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПарыЗамен - Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - ЛюбаяСсылка - что ищем (дубль)." & @CRLF & _
"// * Значение - ЛюбаяСсылка - на что заменяем (оригинал)." & @CRLF & _
"// Ссылки сами на себя и пустые ссылки для поиска будут проигнорированы." & @CRLF & _
"// " & @CRLF & _
"// ПараметрыЗамены - см. ОбщегоНазначения.ПараметрыЗаменыСсылок" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ТаблицаЗначений - неуспешные замены (ошибки):" & @CRLF & _
"// * Ссылка - ЛюбаяСсылка - ссылка, которую заменяли." & @CRLF & _
"// * ОбъектОшибки - Произвольный - объект-причина ошибки." & @CRLF & _
"// * ПредставлениеОбъектаОшибки - Строка - строковое представление объекта ошибки." & @CRLF & _
"// * ТипОшибки - Строка - тип ошибки:" & @CRLF & _
"// "ОшибкаБлокировки" - при обработке ссылки некоторые объекты были заблокированы." & @CRLF & _
"// "ДанныеИзменены" - в процессе обработки данные были изменены другим пользователем." & @CRLF & _
"// "ОшибкаЗаписи" - не смогли записать объект, или метод ВозможностьЗаменыЭлементов вернул отказ." & @CRLF & _
"// "ОшибкаУдаления" - не смогли удалить объект." & @CRLF & _
"// "НеизвестныеДанные" - при обработке были найдены данные, которые не планировались к замене." & @CRLF & _
"// * ТекстОшибки - Строка - подробное описание ошибки." & @CRLF & _
"//" & @CRLF & _
"Функция ЗаменитьСсылки(Знач ПарыЗамен, Знач ПараметрыЗамены = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Статистика = Новый Соответствие;" & @CRLF & _
" ТипСтрока = Новый ОписаниеТипов("Строка");" & @CRLF & _
" " & @CRLF & _
" ОшибкиЗамены = Новый ТаблицаЗначений;" & @CRLF & _
" ОшибкиЗамены.Колонки.Добавить("Ссылка");" & @CRLF & _
" ОшибкиЗамены.Колонки.Добавить("ОбъектОшибки");" & @CRLF & _
" ОшибкиЗамены.Колонки.Добавить("ПредставлениеОбъектаОшибки", ТипСтрока);" & @CRLF & _
" ОшибкиЗамены.Колонки.Добавить("ТипОшибки", ТипСтрока);" & @CRLF & _
" ОшибкиЗамены.Колонки.Добавить("ТекстОшибки", ТипСтрока);" & @CRLF & _
" " & @CRLF & _
" ОшибкиЗамены.Индексы.Добавить("Ссылка");" & @CRLF & _
" ОшибкиЗамены.Индексы.Добавить("Ссылка, ОбъектОшибки, ТипОшибки");" & @CRLF & _
" " & @CRLF & _
" Результат = РезультатЗаменыСсылок(ОшибкиЗамены);" & @CRLF & _
" " & @CRLF & _
" ПараметрыВыполнения = НовыйПараметрыВыполненияЗаменыСсылок(ПараметрыЗамены);" & @CRLF & _
" " & @CRLF & _
" ПараметрыПоискаМестИспользования = ПараметрыПоискаМестИспользования();" & @CRLF & _
" ДополнитьИсключенияПоискаСсылокПодчиненнымиОбъектами(ПараметрыПоискаМестИспользования.ДополнительныеИсключенияПоискаСсылок);" & @CRLF & _
" ПараметрыВыполнения.Вставить("ПараметрыПоискаМестИспользования", ПараметрыПоискаМестИспользования);" & @CRLF & _
" " & @CRLF & _
" ИнтеграцияПодсистемБСП.ПередПоискомМестИспользования(ПарыЗамен, ПараметрыВыполнения);" & @CRLF & _
" " & @CRLF & _
" Если ПарыЗамен.Количество() = 0 Тогда" & @CRLF & _
" Возврат Результат.Ошибки;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Дубли = СформироватьДубли(ПараметрыВыполнения, ПараметрыЗамены, ПарыЗамен, Результат); " & @CRLF & _
" ТаблицаПоиска = МестаИспользования(Дубли,, ПараметрыВыполнения.ПараметрыПоискаМестИспользования);" & @CRLF & _
" " & @CRLF & _
" // Для каждой ссылки объекта будем производить замены в порядке "Константа", "Объект", "Набор"." & @CRLF & _
" // Одновременно пустая строка в этой колонке - флаг того, что эта замена не нужна или уже была произведена." & @CRLF & _
" ТаблицаПоиска.Колонки.Добавить("КлючЗамены", ТипСтрока);" & @CRLF & _
" ТаблицаПоиска.Индексы.Добавить("Ссылка, КлючЗамены");" & @CRLF & _
" ТаблицаПоиска.Индексы.Добавить("Данные, КлючЗамены");" & @CRLF & _
" " & @CRLF & _
" // Вспомогательные данные" & @CRLF & _
" ТаблицаПоиска.Колонки.Добавить("ЦелеваяСсылка");" & @CRLF & _
" ТаблицаПоиска.Колонки.Добавить("Обработано", Новый ОписаниеТипов("Булево"));" & @CRLF & _
" " & @CRLF & _
" // Определяем порядок обработки и проверяем то, что можно обработать." & @CRLF & _
" ОшибкиРазметки = Новый Массив;" & @CRLF & _
" ОбъектыСОшибками = Новый Массив;" & @CRLF & _
" Количество = Дубли.Количество();" & @CRLF & _
" Для Номер = 1 По Количество Цикл" & @CRLF & _
" ОбратныйИндекс = Количество - Номер;" & @CRLF & _
" Дубль = Дубли[ОбратныйИндекс];" & @CRLF & _
" РезультатРазметки = РазметитьМестаИспользования(ПараметрыВыполнения, Дубль, ПарыЗамен[Дубль], ТаблицаПоиска);" & @CRLF & _
" Если Не РезультатРазметки.Успех Тогда" & @CRLF & _
" Дубли.Удалить(ОбратныйИндекс);" & @CRLF & _
" Для Каждого Ошибка Из РезультатРазметки.ОшибкиРазметки Цикл" & @CRLF & _
" Ошибка.Вставить("Дубль", Дубль);" & @CRLF & _
" ОбъектыСОшибками.Добавить(Ошибка.Объект);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОшибкиРазметки, РезультатРазметки.ОшибкиРазметки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ОшибкиРазметки.Количество() > 0 Тогда" & @CRLF & _
" ПредставленияОбъектов = ПредметыСтрокой(ОбъектыСОшибками);" & @CRLF & _
" Для Каждого Ошибка Из ОшибкиРазметки Цикл" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Ошибка.Дубль," & @CRLF & _
" ОписаниеОшибкиЗамены("НеизвестныеДанные", Ошибка.Объект, ПредставленияОбъектов[Ошибка.Объект], " & @CRLF & _
" Ошибка.Текст));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Замена и удаление найденных дублей." & @CRLF & _
" ПараметрыВыполнения.Вставить("ПарыЗамен", ПарыЗамен);" & @CRLF & _
" ПараметрыВыполнения.Вставить("УспешныеЗамены", Новый Соответствие);" & @CRLF & _
" " & @CRLF & _
" ОтключитьОбновлениеКлючейДоступа(Истина);" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" " & @CRLF & _
" КоличествоДублей = Дубли.Количество();" & @CRLF & _
" Номер = 1;" & @CRLF & _
" Для Каждого Дубль Из Дубли Цикл" & @CRLF & _
" " & @CRLF & _
" БылиОшибки = Результат.ЕстьОшибки;" & @CRLF & _
" Результат.ЕстьОшибки = Ложь;" & @CRLF & _
" " & @CRLF & _
" // @skip-check query-in-loop - Порционная обработка большого объема данных." & @CRLF & _
" ЗаменитьСсылкиКороткимиТранзакциями(Результат, ПараметрыВыполнения, Дубль, ТаблицаПоиска);" & @CRLF & _
" " & @CRLF & _
" Если НЕ Результат.ЕстьОшибки Тогда" & @CRLF & _
" ПараметрыВыполнения.УспешныеЗамены.Вставить(Дубль, ПараметрыВыполнения.ПарыЗамен[Дубль]); " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Результат.ЕстьОшибки = Результат.ЕстьОшибки ИЛИ БылиОшибки;" & @CRLF & _
" " & @CRLF & _
" ДополнительныеПараметры = Новый Структура;" & @CRLF & _
" ДополнительныеПараметры.Вставить("НомерСеанса", НомерСеансаИнформационнойБазы());" & @CRLF & _
" ДополнительныеПараметры.Вставить("КоличествоОбработанных", Номер);" & @CRLF & _
" ДлительныеОперации.СообщитьПрогресс(Номер," & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Замена дублей... обработано (%1 из %2)'"), " & @CRLF & _
" Номер, КоличествоДублей), ДополнительныеПараметры);" & @CRLF & _
" Номер = Номер + 1;" & @CRLF & _
" ДобавитьВСтатистикуЗаменыСсылок(Статистика, Дубль, Результат.ЕстьОшибки);" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияПереопределяемый.ПослеЗаменыСсылок(Результат, ПараметрыВыполнения, ТаблицаПоиска);" & @CRLF & _
" " & @CRLF & _
" ОтключитьОбновлениеКлючейДоступа(Ложь);" & @CRLF & _
" " & @CRLF & _
" Исключение" & @CRLF & _
" ОтключитьОбновлениеКлючейДоступа(Ложь);" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") " & @CRLF & _
" И ПараметрыВыполнения.УдалятьНепосредственно Тогда" & @CRLF & _
" " & @CRLF & _
" МодульУдалениеПомеченныхОбъектов = ОбщийМодуль("УдалениеПомеченныхОбъектов");" & @CRLF & _
" " & @CRLF & _
" ДлительныеОперации.СообщитьПрогресс(0, НСтр("ru = 'Удаление дублей...'"));" & @CRLF & _
" РезультатУдаления = МодульУдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(Результат.ОчередьКНепосредственномуУдалению);" & @CRLF & _
" ЗарегистрироватьОшибкиУдаления(Результат, РезультатУдаления.ПрепятствующиеУдалению);" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОтправитьСтатистикуЗаменыСсылок(Статистика);" & @CRLF & _
" " & @CRLF & _
" Возврат Результат.Ошибки;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Конструктор структуры для параметра ПараметрыЗамены функции ОбщегоНазначения.ЗаменитьСсылки." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * СпособУдаления - Строка - указывает, что делать с дублем после успешной замены:" & @CRLF & _
"// "" - не предпринимать никаких действий (по умолчанию);" & @CRLF & _
"// "Пометка" - помечать на удаление;" & @CRLF & _
"// "Непосредственно" - удалять непосредственно." & @CRLF & _
"// * УчитыватьПрикладныеПравила - Булево - если Истина, то для каждой пары "дубль-оригинал" " & @CRLF & _
"// вызывается функция ВозможностьЗаменыЭлементов модуля менеджера " & @CRLF & _
"// (требуется подсистема "Поиск и удаление дублей"). По умолчанию, Ложь." & @CRLF & _
"// * ВключатьБизнесЛогику - Булево - режим записи объектов при замене в них ссылок дублей на оригиналы." & @CRLF & _
"// Если Истина (по умолчанию), то места использования дублей записываются в обычном режиме," & @CRLF & _
"// иначе запись ведется в режиме ОбменДанными.Загрузка = Истина." & @CRLF & _
"// * ЗаменаПарыВТранзакции - Булево - устарел. определяет размер транзакции при замене дублей." & @CRLF & _
"// Если Истина (по умолчанию), то все места использования одного дубля заменяются в одной транзакции. " & @CRLF & _
"// Это может быть очень ресурсоемко в случае большого количества мест использований." & @CRLF & _
"// Если Ложь, то замена в каждом месте использования выполняется в отдельной транзакции." & @CRLF & _
"// * ПривилегированнаяЗапись - Булево - если Истина, то устанавливать привилегированный режим перед запись" & @CRLF & _
"// объектов при замене в них ссылок дублей на оригиналы. По умолчанию Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ПараметрыЗаменыСсылок() Экспорт" & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("СпособУдаления", "");" & @CRLF & _
" Результат.Вставить("УчитыватьПрикладныеПравила", Ложь);" & @CRLF & _
" Результат.Вставить("ВключатьБизнесЛогику", Истина);" & @CRLF & _
" Результат.Вставить("ЗаменаПарыВТранзакции", Ложь);" & @CRLF & _
" Результат.Вставить("ПривилегированнаяЗапись", Ложь);" & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Получает все места использования ссылок." & @CRLF & _
"// Если какая-либо ссылка нигде не используется, то строк для нее в результирующей таблице не будет." & @CRLF & _
"// При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// НаборСсылок - Массив из ЛюбаяСсылка - ссылки, для которых ищем места использования." & @CRLF & _
"// АдресРезультата - Строка - адрес во временном хранилище, куда будет помещен копия результата замены." & @CRLF & _
"// ДополнительныеПараметры - см. ОбщегоНазначения.ПараметрыПоискаМестИспользования " & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ТаблицаЗначений:" & @CRLF & _
"// * Ссылка - ЛюбаяСсылка - ссылка, которая анализируется." & @CRLF & _
"// * Данные - Произвольный - данные, содержащие анализируемую ссылку." & @CRLF & _
"// * Метаданные - ОбъектМетаданных - метаданные найденных данных." & @CRLF & _
"// * ПредставлениеДанных - Строка - представление данных, содержащих анализируемую ссылку." & @CRLF & _
"// * ТипСсылки - Тип - тип анализируемой ссылки." & @CRLF & _
"// * ВспомогательныеДанные - Булево - Истина, если данные используются анализируемой ссылкой как" & @CRLF & _
"// вспомогательные данные (ведущее измерение или попали в исключение ПриДобавленииИсключенийПоискаСсылок)." & @CRLF & _
"// * ЭтоСлужебныеДанные - Булево - данные попали в исключение ПриДобавленииИсключенийПоискаСсылок" & @CRLF & _
"//" & @CRLF & _
"Функция МестаИспользования(Знач НаборСсылок, Знач АдресРезультата = "", ДополнительныеПараметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" МестаИспользования = Новый ТаблицаЗначений;" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" МестаИспользования = НайтиПоСсылкам(НаборСсылок); // см. МестаИспользования." & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" " & @CRLF & _
" // МестаИспользования - ТаблицаЗначений - где:" & @CRLF & _
" // * Ссылка - ЛюбаяСсылка - Ссылка, которая анализируется." & @CRLF & _
" // * Данные - Произвольный - Данные, содержащие анализируемую ссылку." & @CRLF & _
" // * Метаданные - ОбъектМетаданных - Метаданные найденных данных." & @CRLF & _
" " & @CRLF & _
" МестаИспользования.Колонки.Добавить("ПредставлениеДанных", Новый ОписаниеТипов("Строка"));" & @CRLF & _
" МестаИспользования.Колонки.Добавить("ТипСсылки");" & @CRLF & _
" МестаИспользования.Колонки.Добавить("ИнформацияОМестеИспользования");" & @CRLF & _
" МестаИспользования.Колонки.Добавить("ВспомогательныеДанные", Новый ОписаниеТипов("Булево"));" & @CRLF & _
" МестаИспользования.Колонки.Добавить("ЭтоСлужебныеДанные", Новый ОписаниеТипов("Булево"));" & @CRLF & _
" " & @CRLF & _
" МестаИспользования.Индексы.Добавить("Ссылка");" & @CRLF & _
" МестаИспользования.Индексы.Добавить("Данные");" & @CRLF & _
" МестаИспользования.Индексы.Добавить("ВспомогательныеДанные");" & @CRLF & _
" МестаИспользования.Индексы.Добавить("Ссылка, ВспомогательныеДанные");" & @CRLF & _
" " & @CRLF & _
" ТипКлючиЗаписей = ОписаниеТипаКлючиЗаписей();" & @CRLF & _
" ТипВсеСсылки = ОписаниеТипаВсеСсылки();" & @CRLF & _
" " & @CRLF & _
" МетаданныеПоследовательностей = Метаданные.Последовательности;" & @CRLF & _
" МетаданныеКонстант = Метаданные.Константы;" & @CRLF & _
" МетаданныеДокументов = Метаданные.Документы;" & @CRLF & _
" " & @CRLF & _
" ИсключенияПоискаСсылок = ИсключенияПоискаСсылок();" & @CRLF & _
" " & @CRLF & _
" ДополнительныеИсключенияПоискаСсылок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(" & @CRLF & _
" ДополнительныеПараметры, " & @CRLF & _
" "ДополнительныеИсключенияПоискаСсылок"," & @CRLF & _
" Новый Соответствие);" & @CRLF & _
" Для каждого МетаданныеРеквизитыИсключения Из ДополнительныеИсключенияПоискаСсылок Цикл" & @CRLF & _
" " & @CRLF & _
" ЗначениеИсключения = ИсключенияПоискаСсылок[МетаданныеРеквизитыИсключения.Ключ];" & @CRLF & _
" Если ЗначениеИсключения = Неопределено Тогда" & @CRLF & _
" ИсключенияПоискаСсылок.Вставить(МетаданныеРеквизитыИсключения.Ключ," & @CRLF & _
" МетаданныеРеквизитыИсключения.Значение); " & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(ЗначениеИсключения) = Тип("Массив") Тогда" & @CRLF & _
" ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ЗначениеИсключения," & @CRLF & _
" МетаданныеРеквизитыИсключения.Значение); " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли; " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ОтменаИсключенийПоискаСсылок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеПараметры," & @CRLF & _
" "ОтменаИсключенийПоискаСсылок", Новый Массив);" & @CRLF & _
" Для каждого ОтменаИсключения Из ОтменаИсключенийПоискаСсылок Цикл" & @CRLF & _
" ИсключенияПоискаСсылок.Удалить(ОтменаИсключения); " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" СлужебныеСвязиДанных = СлужебныеСвязиДанных(МестаИспользования, ИсключенияПоискаСсылок);" & @CRLF & _
" КэшИзмеренийРегистров = Новый Соответствие;" & @CRLF & _
" " & @CRLF & _
" Для Каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ТипДанных = ТипЗнч(МестоИспользования.Данные);" & @CRLF & _
" " & @CRLF & _
" ЭтоСлужебныеДанные = СлужебныеСвязиДанных[МестоИспользования] <> Неопределено;" & @CRLF & _
" ЭтоВспомогательныеДанные = ЭтоСлужебныеДанные;" & @CRLF & _
" " & @CRLF & _
" Если ТипДанных = Неопределено Или МетаданныеДокументов.Содержит(МестоИспользования.Метаданные) Тогда" & @CRLF & _
" Представление = Строка(МестоИспользования.Данные);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаданныеКонстант.Содержит(МестоИспользования.Метаданные) Тогда" & @CRLF & _
" Представление = МестоИспользования.Метаданные.Представление() + " (" + НСтр("ru = 'константа'") + ")";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаданныеПоследовательностей.Содержит(МестоИспользования.Метаданные) Тогда" & @CRLF & _
" Представление = МестоИспользования.Метаданные.Представление() + " (" + НСтр("ru = 'последовательность'") + ")";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипВсеСсылки.СодержитТип(ТипДанных) Тогда" & @CRLF & _
" МетаПредставлениеОбъекта = Новый Структура("ПредставлениеОбъекта");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(МетаПредставлениеОбъекта, МестоИспользования.Метаданные);" & @CRLF & _
" Если ПустаяСтрока(МетаПредставлениеОбъекта.ПредставлениеОбъекта) Тогда" & @CRLF & _
" МетаПредставление = МестоИспользования.Метаданные.Представление();" & @CRLF & _
" Иначе" & @CRLF & _
" МетаПредставление = МетаПредставлениеОбъекта.ПредставлениеОбъекта;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Представление = Строка(МестоИспользования.Данные);" & @CRLF & _
" Если Не ПустаяСтрока(МетаПредставление) Тогда" & @CRLF & _
" Представление = Представление + " (" + МетаПредставление + ")";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипКлючиЗаписей.СодержитТип(ТипДанных) Тогда" & @CRLF & _
" Представление = МестоИспользования.Метаданные.ПредставлениеЗаписи;" & @CRLF & _
" Если ПустаяСтрока(Представление) Тогда" & @CRLF & _
" Представление = МестоИспользования.Метаданные.Представление();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеИзмерений = Новый Массив;" & @CRLF & _
" Для Каждого МетаданныеРеквизитыИсключения Из ОписаниеИзмеренийНабора(МестоИспользования.Метаданные, КэшИзмеренийРегистров) Цикл" & @CRLF & _
" Значение = МестоИспользования.Данные[МетаданныеРеквизитыИсключения.Ключ];" & @CRLF & _
" Описание = МетаданныеРеквизитыИсключения.Значение;" & @CRLF & _
" Если МестоИспользования.Ссылка = Значение Тогда" & @CRLF & _
" Если Описание.Ведущее Тогда" & @CRLF & _
" ЭтоВспомогательныеДанные = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Если Не ЭтоСлужебныеДанные Тогда // для оптимизации" & @CRLF & _
" ФорматЗначения = Описание.Формат; " & @CRLF & _
" ОписаниеИзмерений.Добавить(Описание.Представление + " """ " & @CRLF & _
" + ?(ФорматЗначения = Неопределено, Строка(Значение), Формат(Значение, ФорматЗначения)) + """");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ОписаниеИзмерений.Количество() > 0 Тогда" & @CRLF & _
" Представление = Представление + " (" + СтрСоединить(ОписаниеИзмерений, ", ") + ")";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" Представление = Строка(МестоИспользования.Данные);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" МестоИспользования.ПредставлениеДанных = Представление;" & @CRLF & _
" МестоИспользования.ВспомогательныеДанные = ЭтоВспомогательныеДанные;" & @CRLF & _
" МестоИспользования.ЭтоСлужебныеДанные = ЭтоСлужебныеДанные;" & @CRLF & _
" МестоИспользования.ТипСсылки = ТипЗнч(МестоИспользования.Ссылка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если Не ПустаяСтрока(АдресРезультата) Тогда" & @CRLF & _
" ПоместитьВоВременноеХранилище(МестаИспользования, АдресРезультата);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат МестаИспользования;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает структуру для параметра ДополнительныеПараметры функции ОбщегоНазначения.МестаИспользования. " & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * ДополнительныеИсключенияПоискаСсылок - Соответствие - позволяет расширить исключения поиска ссылок" & @CRLF & _
"// см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок" & @CRLF & _
"// * ОтменаИсключенийПоискаСсылок - Массив из ОбъектМетаданных - полностью отменяет исключения поиска ссылок для" & @CRLF & _
"// объектов метаданных." & @CRLF & _
"//" & @CRLF & _
"Функция ПараметрыПоискаМестИспользования() Экспорт" & @CRLF & _
"" & @CRLF & _
" ПараметрыПоиска = Новый Структура;" & @CRLF & _
" ПараметрыПоиска.Вставить("ДополнительныеИсключенияПоискаСсылок", Новый Соответствие);" & @CRLF & _
" ПараметрыПоиска.Вставить("ОтменаИсключенийПоискаСсылок", Новый Соответствие);" & @CRLF & _
"" & @CRLF & _
" Возврат ПараметрыПоиска;" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает исключения при поиске мест использования объектов." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение - исключения поиска ссылок в разрезе объектов метаданных:" & @CRLF & _
"// * Ключ - ОбъектМетаданных - объект метаданных, для которого применяются исключения." & @CRLF & _
"// * Значение - Строка" & @CRLF & _
"// - Массив из Строка - описание исключенных реквизитов." & @CRLF & _
"// Если "*", то исключены все реквизиты объекта метаданных." & @CRLF & _
"// Если массив строк, то содержит относительные имена исключенных реквизитов." & @CRLF & _
"//" & @CRLF & _
"Функция ИсключенияПоискаСсылок() Экспорт" & @CRLF & _
" " & @CRLF & _
" ИсключенияПоискаИнтеграция = Новый Массив;" & @CRLF & _
" ИнтеграцияПодсистемБСП.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаИнтеграция);" & @CRLF & _
" " & @CRLF & _
" ИсключенияПоиска = Новый Массив;" & @CRLF & _
" ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИсключенияПоиска, ИсключенияПоискаИнтеграция);" & @CRLF & _
" ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоиска);" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Соответствие;" & @CRLF & _
" Для Каждого ИсключениеПоиска Из ИсключенияПоиска Цикл" & @CRLF & _
" // Определение полного имени реквизита и объекта метаданных - носителя реквизита." & @CRLF & _
" Если ТипЗнч(ИсключениеПоиска) = Тип("Строка") Тогда" & @CRLF & _
" ПолноеИмя = ИсключениеПоиска;" & @CRLF & _
" МассивПодстрок = СтрРазделить(ПолноеИмя, ".");" & @CRLF & _
" КоличествоПодстрок = МассивПодстрок.Количество();" & @CRLF & _
" ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(МассивПодстрок[0] + "." + МассивПодстрок[1]);" & @CRLF & _
" Иначе" & @CRLF & _
" ОбъектМетаданных = ИсключениеПоиска;" & @CRLF & _
" ПолноеИмя = ОбъектМетаданных.ПолноеИмя();" & @CRLF & _
" МассивПодстрок = СтрРазделить(ПолноеИмя, ".");" & @CRLF & _
" КоличествоПодстрок = МассивПодстрок.Количество();" & @CRLF & _
" Если КоличествоПодстрок > 2 Тогда" & @CRLF & _
" Пока Истина Цикл" & @CRLF & _
" Родитель = ОбъектМетаданных.Родитель();" & @CRLF & _
" Если ТипЗнч(Родитель) = Тип("ОбъектМетаданныхКонфигурация") Тогда" & @CRLF & _
" Прервать;" & @CRLF & _
" Иначе" & @CRLF & _
" ОбъектМетаданных = Родитель;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" // Регистрация." & @CRLF & _
" Если КоличествоПодстрок < 4 Тогда" & @CRLF & _
" Результат.Вставить(ОбъектМетаданных, "*");" & @CRLF & _
" Иначе" & @CRLF & _
" ПутиКРеквизитам = Результат.Получить(ОбъектМетаданных);" & @CRLF & _
" Если ПутиКРеквизитам = "*" Тогда" & @CRLF & _
" Продолжить; // Весь объект метаданных уже исключен." & @CRLF & _
" ИначеЕсли ПутиКРеквизитам = Неопределено Тогда" & @CRLF & _
" ПутиКРеквизитам = Новый Массив;" & @CRLF & _
" Результат.Вставить(ОбъектМетаданных, ПутиКРеквизитам);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" // Формат реквизита:" & @CRLF & _
" // "<ВидОМ>.<ИмяОМ>.<ТипРеквизитаИлиТЧ>.<ИмяРеквизитаИлиТЧ>[.<ТипРеквизита>.<ИмяРеквизитаТЧ>]"." & @CRLF & _
" // Примеры:" & @CRLF & _
" // "РегистрСведений.ВерсииОбъектов.Реквизит.АвторВерсии"," & @CRLF & _
" // "Документ._ДемоЗаказПокупателя.ТабличнаяЧасть.СчетаНаОплату.Реквизит.Счет"," & @CRLF & _
" // "ПланВидовРасчета._ДемоОсновныеНачисления.СтандартнаяТабличнаяЧасть.БазовыеВидыРасчета.СтандартныйРеквизит.ВидРасчета"." & @CRLF & _
" // Относительный путь к реквизиту должен получиться таким, чтобы его можно было использовать в условиях запроса:" & @CRLF & _
" // "<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]"." & @CRLF & _
" Если КоличествоПодстрок = 4 Тогда" & @CRLF & _
" ОтносительныйПутьКРеквизиту = МассивПодстрок[3];" & @CRLF & _
" Иначе" & @CRLF & _
" ОтносительныйПутьКРеквизиту = МассивПодстрок[3] + "." + МассивПодстрок[5];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ПутиКРеквизитам.Добавить(ОтносительныйПутьКРеквизиту);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает связи подчиненных объектов и перечень реквизитов, по которым осуществляется связь." & @CRLF & _
"//" & @CRLF & _
"// Есть возможность переопределить процедуру поиска подчиненных объектов." & @CRLF & _
"// Для этого в общем модуле или модуле менеджера необходимо реализовать процедуру" & @CRLF & _
"// ПриПоискеЗаменыСсылок с параметрами:" & @CRLF & _
"// ПарыЗамен - Соответствие - содержит пары значение оригинал/дубль." & @CRLF & _
"// НеобработанныеЗначенияОригиналов - Массив из Структура - дополнительная информация об обрабатываемых объектах:" & @CRLF & _
"// * ЗаменяемоеЗначение - ПроизвольнаяСсылка - оригинальное значение заменяемого объекта." & @CRLF & _
"// * ИспользуемыеСвязи - см. ОбщегоНазначения.СвязиПодчиненныхОбъектовПоТипам " & @CRLF & _
"// * ЗначениеКлючевыхРеквизитов - Структура - где Ключ - имя реквизита, значение - значение реквизита." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ТаблицаЗначений:" & @CRLF & _
"// * ПодчиненныйОбъект - ОбъектМетаданных - объект метаданных подчиненного объекта. " & @CRLF & _
"// * ПоляСвязей - Строка - имена реквизитов, определяющих связь между основными и подчиненными объектами." & @CRLF & _
"// * ПриПоискеЗаменыСсылок - Строка - опционально. Имя общего модуля или модуля менеджера, в котором определена " & @CRLF & _
"// процедура ПриПоискеЗаменыСсылок." & @CRLF & _
"// * ВыполнятьАвтоматическийПоискЗаменСсылок - Булево - если указать Истина, то будет выполнена попытка поиска замен " & @CRLF & _
"// для подчиненных объектов по значениям полей связи. В случае, если объект не существует, " & @CRLF & _
"// будет выполнена процедура ПриПоискеЗаменыСсылок. См. также ЗаменитьСсылки." & @CRLF & _
"//" & @CRLF & _
"Функция ПодчиненныеОбъекты() Экспорт" & @CRLF & _
" " & @CRLF & _
" ОписаниеСвязей = Новый ТаблицаЗначений;" & @CRLF & _
" ОписаниеСвязей.Колонки.Добавить("ПодчиненныйОбъект", Новый ОписаниеТипов("ОбъектМетаданных"));" & @CRLF & _
" ОписаниеСвязей.Колонки.Добавить("ПоляСвязей");" & @CRLF & _
" ОписаниеСвязей.Колонки.Добавить("ПриПоискеЗаменыСсылок", ОписаниеТипаСтрока(0));" & @CRLF & _
" ОписаниеСвязей.Колонки.Добавить("ВыполнятьАвтоматическийПоискЗаменСсылок", Новый ОписаниеТипов("Булево"));" & @CRLF & _
" " & @CRLF & _
" ИнтеграцияПодсистемБСП.ПриОпределенииПодчиненныхОбъектов(ОписаниеСвязей);" & @CRLF & _
" ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов(ОписаниеСвязей);" & @CRLF & _
" " & @CRLF & _
" // Если передали соответствие или структуру преобразуем к необходимому типу." & @CRLF & _
" Для каждого СтрокаСвязи Из ОписаниеСвязей Цикл" & @CRLF & _
" " & @CRLF & _
" ТипОписанияПолейСвязи = ТипЗнч(СтрокаСвязи.ПоляСвязей);" & @CRLF & _
" Если ТипОписанияПолейСвязи = Тип("Структура")" & @CRLF & _
" ИЛИ ТипОписанияПолейСвязи = Тип("Соответствие") Тогда" & @CRLF & _
" " & @CRLF & _
" ПоляСвязейСтрокой = "";" & @CRLF & _
" Для каждого КлючЗначение Из СтрокаСвязи.ПоляСвязей Цикл" & @CRLF & _
" ПоляСвязейСтрокой = ПоляСвязейСтрокой + КлючЗначение.Ключ + ","; " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ПоляСвязейСтрокой,1);" & @CRLF & _
" СтрокаСвязи.ПоляСвязей = ПоляСвязейСтрокой;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ТипОписанияПолейСвязи = Тип("Массив") Тогда" & @CRLF & _
" СтрокаСвязи.ПоляСвязей = СтрСоединить(СтрокаСвязи.ПоляСвязей, ","); " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеСвязей;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает связи подчиненных объектов с указанием типа поля связи." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ТаблицаЗначений:" & @CRLF & _
"// * Ключ - Строка" & @CRLF & _
"// * ТипРеквизита - Тип" & @CRLF & _
"// * ИмяРеквизита - Строка" & @CRLF & _
"// * Используется - Булево" & @CRLF & _
"// * Метаданные - ОбъектМетаданных" & @CRLF & _
"//" & @CRLF & _
"Функция СвязиПодчиненныхОбъектовПоТипам() Экспорт" & @CRLF & _
"" & @CRLF & _
" Результат = Новый ТаблицаЗначений;" & @CRLF & _
" Результат.Колонки.Добавить("ТипРеквизита", Новый ОписаниеТипов("Тип"));" & @CRLF & _
" Результат.Колонки.Добавить("ИмяРеквизита", ОписаниеТипаСтрока(0));" & @CRLF & _
" Результат.Колонки.Добавить("Ключ", ОписаниеТипаСтрока(0));" & @CRLF & _
" Результат.Колонки.Добавить("Используется", Новый ОписаниеТипов("Булево"));" & @CRLF & _
" Результат.Колонки.Добавить("Метаданные");" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"" & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область УсловныеВызовы" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Процедуры и функции для вызова необязательных подсистем." & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если функциональная подсистема существует в конфигурации." & @CRLF & _
"// Предназначена для реализации вызова необязательной подсистемы (условного вызова)." & @CRLF & _
"// У функциональной подсистемы снят флажок "Включать в командный интерфейс"." & @CRLF & _
"// См. также ОбщегоНазначенияПереопределяемый.ПриОпределенииОтключенныхПодсистем" & @CRLF & _
"// и ОбщегоНазначенияКлиент.ПодсистемаСуществует для вызова из клиентского кода." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПолноеИмяПодсистемы - Строка - полное имя объекта метаданных подсистема" & @CRLF & _
"// без слов "Подсистема." и с учетом регистра символов." & @CRLF & _
"// Например: "СтандартныеПодсистемы.ВариантыОтчетов"." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда" & @CRLF & _
"// МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");" & @CRLF & _
"// МодульВариантыОтчетов.<Имя метода>();" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если подсистема существует." & @CRLF & _
"//" & @CRLF & _
"Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт" & @CRLF & _
" " & @CRLF & _
" ИменаПодсистем = СтандартныеПодсистемыПовтИсп.ИменаПодсистем();" & @CRLF & _
" Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает ссылку на общий модуль или модуль менеджера по имени." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Имя - Строка - имя общего модуля." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОбщийМодуль" & @CRLF & _
"// МодульМенеджераОбъекта" & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда" & @CRLF & _
"// МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации");" & @CRLF & _
"// МодульОбновлениеКонфигурации.<Имя метода>();" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"//" & @CRLF & _
"// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда" & @CRLF & _
"// МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер");" & @CRLF & _
"// МодульПолнотекстовыйПоискСервер.<Имя метода>();" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"//" & @CRLF & _
"Функция ОбщийМодуль(Имя) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда" & @CRLF & _
" // АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно." & @CRLF & _
" УстановитьБезопасныйРежим(Истина);" & @CRLF & _
" Модуль = Вычислить(Имя);" & @CRLF & _
" // АПК:488-вкл" & @CRLF & _
" ИначеЕсли СтрЧислоВхождений(Имя, ".") = 1 Тогда" & @CRLF & _
" Возврат СерверныйМодульМенеджера(Имя);" & @CRLF & _
" Иначе" & @CRLF & _
" Модуль = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Общий модуль ""%1"" не существует.'")," & @CRLF & _
" Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Модуль;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ТекущееОкружение" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Функции описания текущего окружения клиентского приложения и операционной системы." & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если нет клиентского приложения, возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоWindowsКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" ЭтоWindowsКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ЭтоWindowsКлиент");" & @CRLF & _
" " & @CRLF & _
" Если ЭтоWindowsКлиент = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоWindowsКлиент;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если текущий сеанс выполняется на сервере, работающем под управлением ОС Windows." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если сервер работает под управлением ОС Windows." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоWindowsСервер() Экспорт" & @CRLF & _
" " & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация;" & @CRLF & _
" Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 " & @CRLF & _
" Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если клиентское приложение запущено под управлением ОС Linux." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если нет клиентского приложения, возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоLinuxКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" ЭтоLinuxКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ЭтоLinuxКлиент");" & @CRLF & _
" " & @CRLF & _
" Если ЭтоLinuxКлиент = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоLinuxКлиент;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если текущий сеанс выполняется на сервере, работающем под управлением ОС Linux." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если сервер работает под управлением ОС Linux." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоLinuxСервер() Экспорт" & @CRLF & _
" " & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация;" & @CRLF & _
" Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86" & @CRLF & _
" Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64" & @CRLF & _
" Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.22.1923") >= 0" & @CRLF & _
" И (СистемнаяИнформация.ТипПлатформы = ТипПлатформы["Linux_ARM64"]" & @CRLF & _
" Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы["Linux_E2K"]);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если клиентское приложение запущено под управлением macОС." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если нет клиентского приложения, возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоMacOSКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" ЭтоMacOSКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ЭтоMacOSКлиент");" & @CRLF & _
" " & @CRLF & _
" Если ЭтоMacOSКлиент = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоMacOSКлиент;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если клиентское приложение является Веб-клиентом." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если нет клиентского приложения, возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоВебКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" ЭтоВебКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ЭтоВебКлиент");" & @CRLF & _
" " & @CRLF & _
" Если ЭтоВебКлиент = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоВебКлиент;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если клиентское приложение является мобильным клиентом." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если нет клиентского приложения, возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоМобильныйКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" ЭтоМобильныйКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ЭтоМобильныйКлиент");" & @CRLF & _
" " & @CRLF & _
" Если ЭтоМобильныйКлиент = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоМобильныйКлиент;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если подключен." & @CRLF & _
"//" & @CRLF & _
"Функция КлиентПодключенЧерезВебСервер() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" СтрокаСоединенияИнформационнойБазы = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("СтрокаСоединенияИнформационнойБазы");" & @CRLF & _
" " & @CRLF & _
" Если СтрокаСоединенияИнформационнойБазы = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "WS=") = 1;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает системную информацию клиента, если есть клиентское приложение." & @CRLF & _
"// До первого серверного вызова с клиента вернет Неопределено." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ФиксированнаяСтруктура:" & @CRLF & _
"// * ВерсияОС - Строка" & @CRLF & _
"// * ВерсияПриложения - Строка" & @CRLF & _
"// * ИдентификаторКлиента - УникальныйИдентификатор" & @CRLF & _
"// * ИнформацияПрограммыПросмотра - Строка" & @CRLF & _
"// * ОперативнаяПамять - Число" & @CRLF & _
"// * Процессор - Строка" & @CRLF & _
"// * ТипПлатформы - см. ОбщегоНазначенияКлиентСервер.ИмяТипаПлатформы" & @CRLF & _
"// Неопределено - если нет клиентского приложения или информация запрашивается" & @CRLF & _
"// до первого серверного вызова, например, при первом вызове события" & @CRLF & _
"// платформы УстановкаПараметровСеанса в модуле сеанса." & @CRLF & _
"//" & @CRLF & _
"Функция СистемнаяИнформацияКлиента() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" Возврат СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("СистемнаяИнформация");" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает имя используемого клиента, а для веб-браузера название и версию, если есть." & @CRLF & _
"// До первого серверного вызова с клиента вернет Неопределено." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - варианты строк "ВебКлиент.<Название>[.<Версия>]", "ТонкийКлиент"," & @CRLF & _
"// "ТолстыйКлиентУправляемоеПриложение", "ТолстыйКлиентОбычноеПриложение"," & @CRLF & _
"// где <Название> - варианты строк "Chrome", "Firefox", "Safari", "IE", "Opera"" & @CRLF & _
"// или "Другой", когда не определен (ни один из указанных), например "ВебКлиент.Chrome.109"." & @CRLF & _
"// Неопределено - если нет клиентского приложения или информация запрашивается" & @CRLF & _
"// до первого серверного вызова, например, при первом вызове события" & @CRLF & _
"// платформы УстановкаПараметровСеанса в модуле сеанса." & @CRLF & _
"//" & @CRLF & _
"Функция ИспользуемыйКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" Возврат СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ИспользуемыйКлиент");" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если включен режим отладки." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если включен режим отладки." & @CRLF & _
"//" & @CRLF & _
"Функция РежимОтладки() Экспорт" & @CRLF & _
" " & @CRLF & _
" ПараметрЗапускаПриложения = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска");" & @CRLF & _
" " & @CRLF & _
" Возврат СтрНайти(ПараметрЗапускаПриложения, "РежимОтладки") > 0;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает объем оперативной памяти, доступной клиентскому приложению." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Число - количество гигабайтов оперативной памяти с точностью до десятых долей." & @CRLF & _
"// Неопределено - нет клиентского приложения, то есть ТекущийРежимЗапуска() = Неопределено." & @CRLF & _
"//" & @CRLF & _
"Функция ОперативнаяПамятьДоступнаяКлиентскомуПриложению() Экспорт" & @CRLF & _
" " & @CRLF & _
" ДоступныйОбъем = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ОперативнаяПамять");" & @CRLF & _
" Возврат ДоступныйОбъем;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь)." & @CRLF & _
"// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если" & @CRLF & _
"// нужно проверить строку соединения не текущей информационной базы." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если файловая." & @CRLF & _
"//" & @CRLF & _
"Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда" & @CRLF & _
" СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1;" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина, если эта информационная база подключена к 1С:Fresh." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - признак автономного рабочего места." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоАвтономноеРабочееМесто() Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда" & @CRLF & _
" МодульОбменДаннымиСервер = ОбщийМодуль("ОбменДаннымиСервер");" & @CRLF & _
" Возврат МодульОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает признак того, что информационная база является распределенной (РИБ)." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево" & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРаспределеннаяИнформационнаяБаза() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" Возврат СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет, что эта информационная база является подчиненным узлом" & @CRLF & _
"// распределенной информационной базы (РИБ)." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Булево - Истина, если эта информационная база является подчиненным узлом РИБ." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПодчиненныйУзелРИБ() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Возврат ПланыОбмена.ГлавныйУзел() <> Неопределено;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет, что эта информационная база является подчиненным узлом" & @CRLF & _
"// распределенной информационной базы (РИБ) с фильтром." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Булево - Истина, если эта информационная база является подчиненным узлом РИБ с фильтром." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПодчиненныйУзелРИБСФильтром() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Если ПланыОбмена.ГлавныйУзел() <> Неопределено" & @CRLF & _
" И ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда" & @CRLF & _
" МодульОбменДаннымиСервер = ОбщийМодуль("ОбменДаннымиСервер");" & @CRLF & _
" Если МодульОбменДаннымиСервер.НазначениеПланаОбмена(ПланыОбмена.ГлавныйУзел().Метаданные().Имя) = "РИБСФильтром" Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает Истина при необходимости обновления конфигурации информационной базы подчиненного узла РИБ." & @CRLF & _
"// В главном узле всегда Ложь." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Булево - Истина, если требуется." & @CRLF & _
"//" & @CRLF & _
"Функция ТребуетсяОбновлениеКонфигурацииПодчиненногоУзлаРИБ() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоПодчиненныйУзелРИБ() И КонфигурацияИзменена();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает признак работы в режиме разделения данных по областям" & @CRLF & _
"// (технически это признак условного разделения)." & @CRLF & _
"// " & @CRLF & _
"// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных" & @CRLF & _
"// (не содержит общих реквизитов, предназначенных для разделения данных)." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если разделение включено," & @CRLF & _
"// Ложь, если разделение выключено или не поддерживается." & @CRLF & _
"//" & @CRLF & _
"Функция РазделениеВключено() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат СтандартныеПодсистемыПовтИсп.РазделениеВключено();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей)." & @CRLF & _
"// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено" & @CRLF & _
"// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным." & @CRLF & _
"// " & @CRLF & _
"// Возвращает Истина, если конфигурация не может работать в режиме разделения данных" & @CRLF & _
"// (не содержит общих реквизитов, предназначенных для разделения данных)." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если разделение не поддерживается, либо разделение выключено," & @CRLF & _
"// либо разделение включено и разделители установлены." & @CRLF & _
"// Ложь, если разделение включено и разделители не установлены." & @CRLF & _
"//" & @CRLF & _
"Функция ДоступноИспользованиеРазделенныхДанных() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат СтандартныеПодсистемыПовтИсп.ДоступноИспользованиеРазделенныхДанных();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает адрес публикации информационной базы для формирования прямых ссылок на объекты ИБ " & @CRLF & _
"// для возможности перехода к ним пользователей, имеющих доступ к базе через публикацию в сети Интернет." & @CRLF & _
"// Например, если такой адрес включить в электронное письмо, то из письма одним нажатием" & @CRLF & _
"// можно перейти к форме объекта в самой программе." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - адрес информационной базы, как он задан в настройке "Адрес в Интернете" в панели администрирования" & @CRLF & _
"// (хранится в константе АдресПубликацииИнформационнойБазыВИнтернете)." & @CRLF & _
"// Например, "http://1c.com/database"." & @CRLF & _
"//" & @CRLF & _
"// Пример: " & @CRLF & _
"// ОбщегоНазначения.АдресПубликацииИнформационнойБазыВЛокальнойСети() + "/" + e1cib/app/Обработка.ВыгрузкаДанныхПроекта";" & @CRLF & _
"// возвращает прямую ссылку для открытия обработки ВыгрузкаДанныхПроекта." & @CRLF & _
"//" & @CRLF & _
"Функция АдресПубликацииИнформационнойБазыВИнтернете() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Возврат Константы.АдресПубликацииИнформационнойБазыВИнтернете.Получить();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает адрес публикации информационной базы для формирования прямых ссылок на объекты ИБ " & @CRLF & _
"// для возможности перехода к ним пользователей, имеющих доступ к базе через публикацию локальной сети." & @CRLF & _
"// Например, если такой адрес включить в электронное письмо, то из письма за одно нажатие" & @CRLF & _
"// можно перейти к форме объекта в самой программе." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - адрес информационной базы, как он задан в настройке "Локальный адрес" в панели администрирования" & @CRLF & _
"// (хранится в константе АдресПубликацииИнформационнойБазыВЛокальнойСети)." & @CRLF & _
"// Например, "http://localserver/base"." & @CRLF & _
"//" & @CRLF & _
"// Пример: " & @CRLF & _
"// ОбщегоНазначения.АдресПубликацииИнформационнойБазыВЛокальнойСети() + "/" + e1cib/app/Обработка.ВыгрузкаДанныхПроекта";" & @CRLF & _
"// возвращает прямую ссылку для открытия обработки ВыгрузкаДанныхПроекта." & @CRLF & _
"//" & @CRLF & _
"Функция АдресПубликацииИнформационнойБазыВЛокальнойСети() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Возврат Константы.АдресПубликацииИнформационнойБазыВЛокальнойСети.Получить();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Формирует ссылку для входа в программу для указанного пользователя." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Пользователь - Строка - логин пользователя для входа в программу;" & @CRLF & _
"// Пароль - Строка - пароль пользователя для входа в программу;" & @CRLF & _
"// ВидПубликацииИБ - Строка - через какую публикацию пользователь входит в программу:" & @CRLF & _
"// "ВИнтернете" или "ВЛокальнойСети"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка, Неопределено - адрес входа в программу или Неопределено, если адрес не настроен." & @CRLF & _
"//" & @CRLF & _
"Функция АдресВходаВПрограмму(Пользователь, Пароль, ВидПубликацииИБ) Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = "";" & @CRLF & _
" " & @CRLF & _
" Если НРег(ВидПубликацииИБ) = НРег("ВИнтернете") Тогда" & @CRLF & _
" Результат = АдресПубликацииИнформационнойБазыВИнтернете();" & @CRLF & _
" ИначеЕсли НРег(ВидПубликацииИБ) = НРег("ВЛокальнойСети") Тогда" & @CRLF & _
" Результат = АдресПубликацииИнформационнойБазыВЛокальнойСети();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(Результат) Тогда" & @CRLF & _
" Возврат Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не СтрЗаканчиваетсяНа(Результат, "/") Тогда" & @CRLF & _
" Результат = Результат + "/";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Результат = Результат + "?n=" + КодироватьСтроку(Пользователь, СпособКодированияСтроки.КодировкаURL);" & @CRLF & _
" Если ЗначениеЗаполнено(Пароль) Тогда" & @CRLF & _
" Результат = Результат + "&p=" + КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает редакцию конфигурации." & @CRLF & _
"// Редакцией принято называть две первые группы цифр полной версии конфигурации." & @CRLF & _
"// Например, у версии "1.2.3.4" редакция "1.2"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - номер редакции конфигурации." & @CRLF & _
"//" & @CRLF & _
"Функция РедакцияКонфигурации() Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = "";" & @CRLF & _
" ВерсияКонфигурации = Метаданные.Версия;" & @CRLF & _
" " & @CRLF & _
" Позиция = СтрНайти(ВерсияКонфигурации, ".");" & @CRLF & _
" Если Позиция > 0 Тогда" & @CRLF & _
" Результат = Лев(ВерсияКонфигурации, Позиция);" & @CRLF & _
" ВерсияКонфигурации = Сред(ВерсияКонфигурации, Позиция + 1);" & @CRLF & _
" Позиция = СтрНайти(ВерсияКонфигурации, ".");" & @CRLF & _
" Если Позиция > 0 Тогда" & @CRLF & _
" Результат = Результат + Лев(ВерсияКонфигурации, Позиция - 1);" & @CRLF & _
" Иначе" & @CRLF & _
" Результат = "";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(Результат) Тогда" & @CRLF & _
" Результат = Метаданные.Версия;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Общие параметры подсистемы." & @CRLF & _
"//" & @CRLF & _
"// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * ИмяФормыПерсональныхНастроек - Строка - имя формы для редактирования персональных настроек." & @CRLF & _
"// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - по умолчанию Истина. Если установить в Ложь, то " & @CRLF & _
"// подтверждение при завершении работы программы не" & @CRLF & _
"// будет запрашиваться, если явно не разрешить в" & @CRLF & _
"// персональных настройках программы." & @CRLF & _
"// * МинимальнаяВерсияПлатформы - Строка - минимальная версии платформы, требуемая для запуска программы." & @CRLF & _
"// Запуск программы на версии платформы ниже указанной будет невозможен." & @CRLF & _
"// Например, "8.3.6.1650"." & @CRLF & _
"// * РекомендуемаяВерсияПлатформы - Строка - рекомендуемая версия платформы для запуска программы." & @CRLF & _
"// Например, "8.3.8.2137"." & @CRLF & _
"// * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ." & @CRLF & _
"// Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку." & @CRLF & _
"// * РекомендуемыйОбъемОперативнойПамяти - Число - объем памяти в гигабайтах, рекомендуемый для комфортной работы в" & @CRLF & _
"// программе." & @CRLF & _
"// Устарели, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы:" & @CRLF & _
"// * МинимальноНеобходимаяВерсияПлатформы - Строка - полный номер версии платформы для запуска программы." & @CRLF & _
"// Например, "8.3.4.365"." & @CRLF & _
"// * РаботаВПрограммеЗапрещена - Булево - начальное значение Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ОбщиеПараметрыБазовойФункциональности() Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбщиеПараметры = Новый Структура;" & @CRLF & _
" ОбщиеПараметры.Вставить("ИмяФормыПерсональныхНастроек", "");" & @CRLF & _
" ОбщиеПараметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", Истина);" & @CRLF & _
" ОбщиеПараметры.Вставить("ОтключитьИдентификаторыОбъектовМетаданных", Ложь);" & @CRLF & _
" ОбщиеПараметры.Вставить("РекомендуемыйОбъемОперативнойПамяти", 4);" & @CRLF & _
" ОбщиеПараметры.Вставить("МинимальнаяВерсияПлатформы", МинимальнаяВерсияПлатформы());" & @CRLF & _
" ОбщиеПараметры.Вставить("РекомендуемаяВерсияПлатформы", ОбщиеПараметры.МинимальнаяВерсияПлатформы);" & @CRLF & _
" // Устарело, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы:" & @CRLF & _
" ОбщиеПараметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", "");" & @CRLF & _
" ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Ложь); // Блокировать запуск, если версия ниже минимальной." & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры);" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.МинимальнаяВерсияПлатформы);" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.РекомендуемаяВерсияПлатформы);" & @CRLF & _
" " & @CRLF & _
" // Локализация" & @CRLF & _
" УточнитьМинимальнуюВерсиюПлатформыИзСервиса(ОбщиеПараметры);" & @CRLF & _
" // Конец Локализация" & @CRLF & _
" " & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация;" & @CRLF & _
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, ОбщиеПараметры.МинимальнаяВерсияПлатформы) < 0" & @CRLF & _
" И ЭтоВерсияЗащищенногоПрограммногоКомплекса(СистемнаяИнформация.ВерсияПриложения) Тогда" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Минимальная = ОбщиеПараметры.МинимальнаяВерсияПлатформы;" & @CRLF & _
" Рекомендуемая = ОбщиеПараметры.РекомендуемаяВерсияПлатформы;" & @CRLF & _
" Если МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) Тогда" & @CRLF & _
" ТекстСообщения = НСтр("ru = 'Указанные в %1 минимальная и рекомендуемая версии платформы не соответствуют следующим требованиям:" & @CRLF & _
" | - минимальная версия должна быть заполнена;" & @CRLF & _
" | - минимальная версия не должна быть меньше минимальной версии БСП (см. %2);" & @CRLF & _
" | - минимальная версия не должна быть меньше рекомендуемой версии." & @CRLF & _
" |Минимальная версия: %3" & @CRLF & _
" |Минимальная версия БСП: %4" & @CRLF & _
" |Рекомендуемая версия: %5'"," & @CRLF & _
" КодОсновногоЯзыка());" & @CRLF & _
" ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения," & @CRLF & _
" "ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности"," & @CRLF & _
" "ОбщегоНазначения.МинимальнаяВерсияПлатформы"," & @CRLF & _
" Минимальная, НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы()), Рекомендуемая);" & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Базовая функциональность'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, " & @CRLF & _
" ТекстСообщения); " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Обратная совместимость." & @CRLF & _
" МинимальноНеобходимаяВерсияПлатформы = ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы;" & @CRLF & _
" Если ЗначениеЗаполнено(МинимальноНеобходимаяВерсияПлатформы) Тогда" & @CRLF & _
" Если ОбщиеПараметры.РаботаВПрограммеЗапрещена Тогда" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = МинимальноНеобходимаяВерсияПлатформы;" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = "";" & @CRLF & _
" Иначе" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = МинимальноНеобходимаяВерсияПлатформы;" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = "";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Иначе" & @CRLF & _
" Текущая = СистемнаяИнформация.ВерсияПриложения;" & @CRLF & _
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Текущая) > 0 Тогда" & @CRLF & _
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = Минимальная;" & @CRLF & _
" ОбщиеПараметры.РаботаВПрограммеЗапрещена = Истина;" & @CRLF & _
" Иначе" & @CRLF & _
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = Рекомендуемая;" & @CRLF & _
" ОбщиеПараметры.РаботаВПрограммеЗапрещена = Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" УточнитьВерсиюПлатформы(ОбщиеПараметры);" & @CRLF & _
" " & @CRLF & _
" Возврат ОбщиеПараметры;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает описания всех библиотек конфигурации, включая" & @CRLF & _
"// описание самой конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив - структур со свойствами:" & @CRLF & _
"// * Имя - Строка - имя подсистемы, например, "СтандартныеПодсистемы"." & @CRLF & _
"// * ИдентификаторИнтернетПоддержки - Строка - уникальное имя программы в сервисах интернет-поддержки." & @CRLF & _
"// * Версия - Строка - версия в формате из четырех цифр, например "2.3.3.1"." & @CRLF & _
"// * ЭтоКонфигурация - Булево - признак того, что данная подсистема является основной конфигурацией." & @CRLF & _
"//" & @CRLF & _
"Функция ОписанияПодсистем() Экспорт" & @CRLF & _
" Результат = Новый Массив;" & @CRLF & _
" ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем();" & @CRLF & _
" Для Каждого ОписаниеПодсистемы Из ОписанияПодсистем.ПоИменам Цикл" & @CRLF & _
" Параметры = Новый Структура;" & @CRLF & _
" Параметры.Вставить("Имя");" & @CRLF & _
" Параметры.Вставить("ИдентификаторИнтернетПоддержки");" & @CRLF & _
" Параметры.Вставить("Версия");" & @CRLF & _
" Параметры.Вставить("ЭтоКонфигурация");" & @CRLF & _
" " & @CRLF & _
" ЗаполнитьЗначенияСвойств(Параметры, ОписаниеПодсистемы.Значение);" & @CRLF & _
" Результат.Добавить(Параметры);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает идентификатор Интернет-поддержки основной конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - уникальное имя программы в сервисах Интернет-поддержки." & @CRLF & _
"//" & @CRLF & _
"Функция ИдентификаторИнтернетПоддержкиКонфигурации() Экспорт" & @CRLF & _
" ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем();" & @CRLF & _
" Для Каждого ОписаниеПодсистемы Из ОписанияПодсистем.ПоИменам Цикл" & @CRLF & _
" Если ОписаниеПодсистемы.Значение.ЭтоКонфигурация Тогда" & @CRLF & _
" Возврат ОписаниеПодсистемы.Значение.ИдентификаторИнтернетПоддержки;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат "";" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Даты" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Функции для работы с датами с учетом часового пояса сеанса" & @CRLF & _
"" & @CRLF & _
"// Преобразует локальную дату к формату "YYYY-MM-DDThh:mm:ssTZD" согласно ISO 8601." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ЛокальнаяДата - Дата - дата в часовом поясе сеанса." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - представление даты." & @CRLF & _
"//" & @CRLF & _
"Функция ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата) Экспорт" & @CRLF & _
" " & @CRLF & _
" Смещение = СмещениеСтандартногоВремени(ЧасовойПоясСеанса());" & @CRLF & _
" Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата, Смещение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает строковое представление интервала между переданными датами или" & @CRLF & _
"// относительно переданной даты и текущей даты сеанса." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ВремяНачала - Дата - начальная точка интервала." & @CRLF & _
"// ВремяОкончания - Дата - конечная точка интервала, если не задана - берется текущая дата сеанса." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - представление интервала времени." & @CRLF & _
"//" & @CRLF & _
"Функция ИнтервалВремениСтрокой(ВремяНачала, ВремяОкончания = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ВремяОкончания = Неопределено Тогда" & @CRLF & _
" ВремяОкончания = ТекущаяДатаСеанса();" & @CRLF & _
" ИначеЕсли ВремяНачала > ВремяОкончания Тогда" & @CRLF & _
" ВызватьИсключение НСтр("ru = 'Дата окончания интервала не может быть меньше даты начала.'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ВеличинаИнтервала = ВремяОкончания - ВремяНачала;" & @CRLF & _
" ВеличинаИнтервалаВДнях = Цел(ВеличинаИнтервала/60/60/24);" & @CRLF & _
" " & @CRLF & _
" Если ВеличинаИнтервалаВДнях > 365 Тогда" & @CRLF & _
" ОписаниеИнтервала = НСтр("ru = 'более года'");" & @CRLF & _
" ИначеЕсли ВеличинаИнтервалаВДнях > 31 Тогда" & @CRLF & _
" ОписаниеИнтервала = НСтр("ru = 'более месяца'");" & @CRLF & _
" ИначеЕсли ВеличинаИнтервалаВДнях >= 1 Тогда" & @CRLF & _
" ОписаниеИнтервала = Формат(ВеличинаИнтервалаВДнях, "ЧДЦ=0") + " "" & @CRLF & _
" + ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(ВеличинаИнтервалаВДнях," & @CRLF & _
" "", НСтр("ru = 'день,дня,дней,,,,,,0'"));" & @CRLF & _
" Иначе" & @CRLF & _
" ОписаниеИнтервала = НСтр("ru = 'менее одного дня'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеИнтервала;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Функции для работы с настройкой рабочей даты." & @CRLF & _
"" & @CRLF & _
"// Сохраняет настройку рабочей даты пользователя." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// НоваяРабочаяДата - Дата - дата, которую необходимо установить в качестве рабочей даты пользователя." & @CRLF & _
"// ИмяПользователя - Строка - имя пользователя, для которого устанавливается рабочая дата." & @CRLF & _
"// Если не задано, то устанавливается для текущего пользователя." & @CRLF & _
"// " & @CRLF & _
"Процедура УстановитьРабочуюДатуПользователя(НоваяРабочаяДата, ИмяПользователя = Неопределено) Экспорт" & @CRLF & _
"" & @CRLF & _
" КлючОбъекта = ВРег("РабочаяДата");" & @CRLF & _
" " & @CRLF & _
" ХранилищеОбщихНастроекСохранить(КлючОбъекта, "", НоваяРабочаяДата, , ИмяПользователя);" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает значение настройки рабочей даты для пользователя." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата." & @CRLF & _
"// Если не задано, то устанавливается для текущего пользователя." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Дата - значение настройки рабочей даты пользователя или пустая дата, если настройка не задана." & @CRLF & _
"//" & @CRLF & _
"Функция РабочаяДатаПользователя(ИмяПользователя = Неопределено) Экспорт" & @CRLF & _
"" & @CRLF & _
" КлючОбъекта = ВРег("РабочаяДата");" & @CRLF & _
"" & @CRLF & _
" Результат = ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, "", '0001-01-01', , ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Результат) <> Тип("Дата") Тогда" & @CRLF & _
" Результат = '0001-01-01';" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает значение настройки рабочей даты для пользователя или текущей даты сеанса," & @CRLF & _
"// если рабочая дата пользователя не задана." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата." & @CRLF & _
"// Если не задано, то устанавливается для текущего пользователя." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Дата - значение настройки рабочей даты пользователя или текущая дата сеанса, если настройка не задана." & @CRLF & _
"//" & @CRLF & _
"Функция ТекущаяДатаПользователя(ИмяПользователя = Неопределено) Экспорт" & @CRLF & _
"" & @CRLF & _
" Результат = РабочаяДатаПользователя(ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
" Если НЕ ЗначениеЗаполнено(Результат) Тогда" & @CRLF & _
" Результат = ТекущаяДатаСеанса();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат НачалоДня(Результат);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Данные" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Общие процедуры и функции для работы с прикладными типами и коллекциями значений." & @CRLF & _
"" & @CRLF & _
"// Возвращает строковое имя значения перечисления по его ссылке." & @CRLF & _
"// Вызывает исключение, если передано несуществующее значение перечисления " & @CRLF & _
"// (например, удаленное в конфигурации или от отключенного расширения конфигурации)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Значение - ПеречислениеСсылка - значение, для которого необходимо получить имя перечисления." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка" & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// В результат будет помещено строковое значение "ФизическоеЛицо":" & @CRLF & _
"// Результат = ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо);" & @CRLF & _
"//" & @CRLF & _
"Функция ИмяЗначенияПеречисления(Значение) Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбъектМетаданных = Значение.Метаданные();" & @CRLF & _
" ИндексЗначения = Перечисления[ОбъектМетаданных.Имя].Индекс(Значение);" & @CRLF & _
" Возврат ОбъектМетаданных.ЗначенияПеречисления[ИндексЗначения].Имя;" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"// Процедура удаляет из массива МассивРеквизитов элементы, соответствующие именам " & @CRLF & _
"// реквизитов объекта из массива МассивНепроверяемыхРеквизитов." & @CRLF & _
"// Для использования в обработчиках события ОбработкаПроверкиЗаполнения." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// МассивРеквизитов - Массив - коллекция имен реквизитов объекта." & @CRLF & _
"// МассивНепроверяемыхРеквизитов - Массив - коллекция имен реквизитов объекта, не требующих проверки." & @CRLF & _
"//" & @CRLF & _
"Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт" & @CRLF & _
" " & @CRLF & _
" Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл" & @CRLF & _
" " & @CRLF & _
" ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);" & @CRLF & _
" Если ПорядковыйНомер <> Неопределено Тогда" & @CRLF & _
" МассивРеквизитов.Удалить(ПорядковыйНомер);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Преобразует таблицу значений в массив структур." & @CRLF & _
"// Может использоваться для передачи на клиент данных в том случае, если таблица" & @CRLF & _
"// значений содержит только такие значения, которые могут" & @CRLF & _
"// быть переданы с сервера на клиент." & @CRLF & _
"//" & @CRLF & _
"// Полученный массив содержит структуры, каждая из которых повторяет" & @CRLF & _
"// структуру колонок таблицы значений." & @CRLF & _
"//" & @CRLF & _
"// Не рекомендуется использовать для преобразования таблиц значений" & @CRLF & _
"// с большим количеством строк." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ТаблицаЗначений - ТаблицаЗначений - исходная таблица значений." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив - коллекция строк таблицы в виде структур." & @CRLF & _
"//" & @CRLF & _
"Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт" & @CRLF & _
" " & @CRLF & _
" Массив = Новый Массив();" & @CRLF & _
" СтруктураСтрокой = "";" & @CRLF & _
" НужнаЗапятая = Ложь;" & @CRLF & _
" Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл" & @CRLF & _
" Если НужнаЗапятая Тогда" & @CRLF & _
" СтруктураСтрокой = СтруктураСтрокой + ",";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;" & @CRLF & _
" НужнаЗапятая = Истина;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого Строка Из ТаблицаЗначений Цикл" & @CRLF & _
" НоваяСтрока = Новый Структура(СтруктураСтрокой);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);" & @CRLF & _
" Массив.Добавить(НоваяСтрока);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Возврат Массив;" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Преобразует строку таблицы значений в структуру." & @CRLF & _
"// Свойства структуры и их значения совпадают с колонками переданной строки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура - преобразованная строка таблицы значений." & @CRLF & _
"//" & @CRLF & _
"Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт" & @CRLF & _
" " & @CRLF & _
" Структура = Новый Структура;" & @CRLF & _
" Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл" & @CRLF & _
" Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Структура;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Создает структуру, содержащую имена и значения измерений, ресурсов и реквизитов" & @CRLF & _
"// переданного менеджера записи регистра сведений." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// МенеджерЗаписи - РегистрСведенийМенеджерЗаписиИмяРегистраСведений - менеджер записи, из которого надо получить структуру." & @CRLF & _
"// МетаданныеРегистра - ОбъектМетаданныхРегистрСведений - метаданные регистра сведений." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура - коллекция измерений ресурсов и реквизитов, переданного менеджеру записи." & @CRLF & _
"//" & @CRLF & _
"Функция СтруктураПоМенеджеруЗаписи(МенеджерЗаписи, МетаданныеРегистра) Экспорт" & @CRLF & _
" " & @CRLF & _
" ЗаписьКакСтруктура = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" Если МетаданныеРегистра.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда" & @CRLF & _
" ЗаписьКакСтруктура.Вставить("Период", МенеджерЗаписи.Период);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Для Каждого Поле Из МетаданныеРегистра.Измерения Цикл" & @CRLF & _
" ЗаписьКакСтруктура.Вставить(Поле.Имя, МенеджерЗаписи[Поле.Имя]);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого Поле Из МетаданныеРегистра.Ресурсы Цикл" & @CRLF & _
" ЗаписьКакСтруктура.Вставить(Поле.Имя, МенеджерЗаписи[Поле.Имя]);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого Поле Из МетаданныеРегистра.Реквизиты Цикл" & @CRLF & _
" ЗаписьКакСтруктура.Вставить(Поле.Имя, МенеджерЗаписи[Поле.Имя]);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ЗаписьКакСтруктура;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Создает массив и копирует в него значения, содержащиеся в колонке объекта, для" & @CRLF & _
"// которого доступен обход посредством оператора Для каждого … Из." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КоллекцияСтрок - ТаблицаЗначений" & @CRLF & _
"// - ДеревоЗначений" & @CRLF & _
"// - СписокЗначений" & @CRLF & _
"// - ТабличнаяЧасть" & @CRLF & _
"// - Соответствие" & @CRLF & _
"// - Структура - коллекция, колонку которой нужно выгрузить в массив." & @CRLF & _
"// А так же другие объекты, для которых доступен обход" & @CRLF & _
"// посредством оператора Для каждого … Из … Цикл." & @CRLF & _
"// ИмяКолонки - Строка - имя поля коллекции, значения которого нужно выгрузить." & @CRLF & _
"// ТолькоУникальныеЗначения - Булево - если Истина, то в массив будут включены" & @CRLF & _
"// только различающиеся значения." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив - значения колонки." & @CRLF & _
"//" & @CRLF & _
"Функция ВыгрузитьКолонку(КоллекцияСтрок, ИмяКолонки, ТолькоУникальныеЗначения = Ложь) Экспорт" & @CRLF & _
"" & @CRLF & _
" МассивЗначений = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" УникальныеЗначения = Новый Соответствие;" & @CRLF & _
" " & @CRLF & _
" Для каждого СтрокаКоллекции Из КоллекцияСтрок Цикл" & @CRLF & _
" Значение = СтрокаКоллекции[ИмяКолонки];" & @CRLF & _
" Если ТолькоУникальныеЗначения И УникальныеЗначения[Значение] <> Неопределено Тогда" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" МассивЗначений.Добавить(Значение);" & @CRLF & _
" УникальныеЗначения.Вставить(Значение, Истина);" & @CRLF & _
" КонецЦикла; " & @CRLF & _
" " & @CRLF & _
" Возврат МассивЗначений;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Преобразует текст указанного формата XML в таблицу значений," & @CRLF & _
"// при этом колонки таблицы формируются на основе описания в XML." & @CRLF & _
"//" & @CRLF & _
"// Схема XML:" & @CRLF & _
"// <?xml version="1.0" encoding="utf-8"?>" & @CRLF & _
"// <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">" & @CRLF & _
"// <xs:element name="Items">" & @CRLF & _
"// <xs:complexType>" & @CRLF & _
"// <xs:sequence>" & @CRLF & _
"// <xs:element maxOccurs="unbounded" name="Item">" & @CRLF & _
"// <xs:complexType>" & @CRLF & _
"// <xs:attribute name="Code" type="xs:integer" use="required" />" & @CRLF & _
"// <xs:attribute name="Name" type="xs:string" use="required" />" & @CRLF & _
"// <xs:attribute name="Socr" type="xs:string" use="required" />" & @CRLF & _
"// <xs:attribute name="Index" type="xs:string" use="required" />" & @CRLF & _
"// </xs:complexType>" & @CRLF & _
"// </xs:element>" & @CRLF & _
"// </xs:sequence>" & @CRLF & _
"// <xs:attribute name="Description" type="xs:string" use="required" />" & @CRLF & _
"// <xs:attribute name="Columns" type="xs:string" use="required" />" & @CRLF & _
"// </xs:complexType>" & @CRLF & _
"// </xs:element>" & @CRLF & _
"// </xs:schema>" & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// XML - Строка" & @CRLF & _
"// - ЧтениеXML - текст в формате XML или ЧтениеXML." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * ИмяТаблицы - Строка - имя таблицы." & @CRLF & _
"// * Данные - ТаблицаЗначений - преобразованная из XML таблица." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(" & @CRLF & _
"// Обработки.ЗагрузкаКурсовВалют.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст()).Данные;" & @CRLF & _
"//" & @CRLF & _
"Функция ПрочитатьXMLВТаблицу(Знач XML) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(XML) <> Тип("ЧтениеXML") Тогда" & @CRLF & _
" Чтение = Новый ЧтениеXML;" & @CRLF & _
" Чтение.УстановитьСтроку(XML);" & @CRLF & _
" Иначе" & @CRLF & _
" Чтение = XML;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Прочитаем первый узел и проверим его." & @CRLF & _
" Если Не Чтение.Прочитать() Тогда" & @CRLF & _
" ВызватьИсключение НСтр("ru = 'Пустой XML'");" & @CRLF & _
" ИначеЕсли Чтение.Имя <> "Items" Тогда" & @CRLF & _
" ВызватьИсключение НСтр("ru = 'Ошибка в структуре XML'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Получим описание таблицы и создадим ее." & @CRLF & _
" ИмяТаблицы = Чтение.ПолучитьАтрибут("Description");" & @CRLF & _
" ИменаКолонок = СтрЗаменить(Чтение.ПолучитьАтрибут("Columns"), ",", Символы.ПС);" & @CRLF & _
" Колонок = СтрЧислоСтрок(ИменаКолонок);" & @CRLF & _
" " & @CRLF & _
" ТаблицаЗначений = Новый ТаблицаЗначений;" & @CRLF & _
" Для Сч = 1 По Колонок Цикл" & @CRLF & _
" ТаблицаЗначений.Колонки.Добавить(СтрПолучитьСтроку(ИменаКолонок, Сч), Новый ОписаниеТипов("Строка"));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Заполним значения в таблице." & @CRLF & _
" Пока Чтение.Прочитать() Цикл" & @CRLF & _
" " & @CRLF & _
" Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "Items" Тогда" & @CRLF & _
" Прервать;" & @CRLF & _
" ИначеЕсли Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда" & @CRLF & _
" Продолжить;" & @CRLF & _
" ИначеЕсли Чтение.Имя <> "Item" Тогда" & @CRLF & _
" ВызватьИсключение НСтр("ru = 'Ошибка в структуре XML'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" новСтр = ТаблицаЗначений.Добавить();" & @CRLF & _
" Для Сч = 1 По Колонок Цикл" & @CRLF & _
" ИмяКолонки = СтрПолучитьСтроку(ИменаКолонок, Сч);" & @CRLF & _
" новСтр[Сч-1] = Чтение.ПолучитьАтрибут(ИмяКолонки);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Заполним результат" & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("ИмяТаблицы", ИмяТаблицы);" & @CRLF & _
" Результат.Вставить("Данные", ТаблицаЗначений);" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Сравнивает две коллекции строк (ТаблицаЗначений, ДеревоЗначений и т.д.)," & @CRLF & _
"// для которых доступен обход посредством оператора Для каждого … Из … Цикл." & @CRLF & _
"// Сравниваемые коллекции должны отвечать следующим требованиям:" & @CRLF & _
"// - доступен обход посредством оператора Для каждого … Из … Цикл," & @CRLF & _
"// - наличие в обеих коллекциях всех колонок, перечисленных в параметре ИменаКолонок " & @CRLF & _
"// (если ИменаКолонок не заполнен - все колонки первой коллекции должны существовать во второй коллекции)." & @CRLF & _
"// Также позволяет сравнивать массивы." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КоллекцияСтрок1 - ТаблицаЗначений" & @CRLF & _
"// - ДеревоЗначений" & @CRLF & _
"// - СписокЗначений" & @CRLF & _
"// - ТабличнаяЧасть" & @CRLF & _
"// - Соответствие" & @CRLF & _
"// - Массив" & @CRLF & _
"// - ФиксированныйМассив" & @CRLF & _
"// - Структура - коллекция, отвечающая вышеописанным требованиям. А также другие" & @CRLF & _
"// объекты, для которых доступен обход посредством оператора Для каждого … Из … Цикл." & @CRLF & _
"// КоллекцияСтрок2 - ТаблицаЗначений" & @CRLF & _
"// - ДеревоЗначений" & @CRLF & _
"// - СписокЗначений" & @CRLF & _
"// - ТабличнаяЧасть" & @CRLF & _
"// - Соответствие" & @CRLF & _
"// - Массив" & @CRLF & _
"// - ФиксированныйМассив" & @CRLF & _
"// - Структура - коллекция, отвечающая вышеописанным требованиям. А также другие" & @CRLF & _
"// объекты, для которых доступен обход посредством оператора Для каждого … Из … Цикл." & @CRLF & _
"// ИменаКолонок - Строка - имена колонок через запятую, по которым производится сравнение." & @CRLF & _
"// Не обязательно для коллекций, состав колонок которых можно определить автоматически:" & @CRLF & _
"// ТаблицаЗначений, СписокЗначений, Соответствие, Структура." & @CRLF & _
"// Если не указан, то сравнение производится по колонкам первой коллекции." & @CRLF & _
"// Для коллекций других типов является обязательным." & @CRLF & _
"// ИсключаяКолонки - Строка - имена колонок, которые игнорируются при сравнении." & @CRLF & _
"// УчитыватьПоследовательностьСтрок - Булево - если Истина, то коллекции признаются " & @CRLF & _
"// идентичными, только если одинаковые строки размещены в коллекциях на одинаковых местах." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если идентичны." & @CRLF & _
"//" & @CRLF & _
"Функция КоллекцииИдентичны(КоллекцияСтрок1, КоллекцияСтрок2, Знач ИменаКолонок = "", Знач ИсключаяКолонки = "", " & @CRLF & _
" УчитыватьПоследовательностьСтрок = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" ТипКоллекции = ТипЗнч(КоллекцияСтрок1);" & @CRLF & _
" СравниваютсяМассивы = (ТипКоллекции = Тип("Массив") Или ТипКоллекции = Тип("ФиксированныйМассив"));" & @CRLF & _
" " & @CRLF & _
" СравниваемыеКолонки = Неопределено;" & @CRLF & _
" Если Не СравниваютсяМассивы Тогда" & @CRLF & _
" СравниваемыеКолонки = СравниваемыеКолонки(КоллекцияСтрок1, ИменаКолонок, ИсключаяКолонки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если УчитыватьПоследовательностьСтрок Тогда" & @CRLF & _
" Возврат СравнитьСУчетомПоследовательности(КоллекцияСтрок1, КоллекцияСтрок2, СравниваемыеКолонки);" & @CRLF & _
" ИначеЕсли СравниваютсяМассивы Тогда // Для массивов используется более простой алгоритм." & @CRLF & _
" Возврат СравнитьМассивы(КоллекцияСтрок1, КоллекцияСтрок2);" & @CRLF & _
" Иначе" & @CRLF & _
" Возврат СравнитьБезУчетаПоследовательности(КоллекцияСтрок1, КоллекцияСтрок2, СравниваемыеКолонки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Сравнивает данные сложной структуры с учетом вложенности." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Данные1 - Структура" & @CRLF & _
"// - ФиксированнаяСтруктура" & @CRLF & _
"// - Соответствие" & @CRLF & _
"// - ФиксированноеСоответствие" & @CRLF & _
"// - Массив" & @CRLF & _
"// - ФиксированныйМассив" & @CRLF & _
"// - ХранилищеЗначения" & @CRLF & _
"// - ТаблицаЗначений" & @CRLF & _
"// - Строка" & @CRLF & _
"// - Число" & @CRLF & _
"// - Булево - сравниваемые данные." & @CRLF & _
"// Данные2 - Произвольный - те же типы, что и для параметра Данные1." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если совпадают." & @CRLF & _
"//" & @CRLF & _
"Функция ДанныеСовпадают(Данные1, Данные2) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Данные1) <> ТипЗнч(Данные2) Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Данные1) = Тип("Структура")" & @CRLF & _
" ИЛИ ТипЗнч(Данные1) = Тип("ФиксированнаяСтруктура") Тогда" & @CRLF & _
" " & @CRLF & _
" Если Данные1.Количество() <> Данные2.Количество() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для каждого КлючИЗначение Из Данные1 Цикл" & @CRLF & _
" СтароеЗначение = Неопределено;" & @CRLF & _
" " & @CRLF & _
" Если НЕ Данные2.Свойство(КлючИЗначение.Ключ, СтароеЗначение)" & @CRLF & _
" ИЛИ НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипЗнч(Данные1) = Тип("Соответствие")" & @CRLF & _
" ИЛИ ТипЗнч(Данные1) = Тип("ФиксированноеСоответствие") Тогда" & @CRLF & _
" " & @CRLF & _
" Если Данные1.Количество() <> Данные2.Количество() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КлючиНовогоСоответствия = Новый Соответствие;" & @CRLF & _
" " & @CRLF & _
" Для каждого КлючИЗначение Из Данные1 Цикл" & @CRLF & _
" КлючиНовогоСоответствия.Вставить(КлючИЗначение.Ключ, Истина);" & @CRLF & _
" СтароеЗначение = Данные2.Получить(КлючИЗначение.Ключ);" & @CRLF & _
" " & @CRLF & _
" Если НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для каждого КлючИЗначение Из Данные2 Цикл" & @CRLF & _
" Если КлючиНовогоСоответствия[КлючИЗначение.Ключ] = Неопределено Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипЗнч(Данные1) = Тип("Массив")" & @CRLF & _
" ИЛИ ТипЗнч(Данные1) = Тип("ФиксированныйМассив") Тогда" & @CRLF & _
" " & @CRLF & _
" Если Данные1.Количество() <> Данные2.Количество() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Индекс = Данные1.Количество()-1;" & @CRLF & _
" Пока Индекс >= 0 Цикл" & @CRLF & _
" Если НЕ ДанныеСовпадают(Данные1.Получить(Индекс), Данные2.Получить(Индекс)) Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Индекс = Индекс - 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипЗнч(Данные1) = Тип("ТаблицаЗначений") Тогда" & @CRLF & _
" " & @CRLF & _
" Если Данные1.Количество() <> Данные2.Количество() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Данные1.Колонки.Количество() <> Данные2.Колонки.Количество() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для каждого Колонка Из Данные1.Колонки Цикл" & @CRLF & _
" Если Данные2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Индекс = Данные1.Количество()-1;" & @CRLF & _
" Пока Индекс >= 0 Цикл" & @CRLF & _
" Если НЕ ДанныеСовпадают(Данные1[Индекс][Колонка.Имя], Данные2[Индекс][Колонка.Имя]) Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Индекс = Индекс - 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипЗнч(Данные1) = Тип("ХранилищеЗначения") Тогда" & @CRLF & _
" " & @CRLF & _
" Если НЕ ДанныеСовпадают(Данные1.Получить(), Данные2.Получить()) Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Данные1 = Данные2;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Фиксирует данные типов Структура, Соответствие, Массив с учетом вложенности." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Данные - Структура" & @CRLF & _
"// - Соответствие" & @CRLF & _
"// - Массив - коллекции, значения которых являются примитивными типами," & @CRLF & _
"// хранилищем значения или не могут быть изменены. Поддерживаются типы значений:" & @CRLF & _
"// Булево, Строка, Число, Дата, Неопределено, УникальныйИдентификатор, Null, Тип," & @CRLF & _
"// ХранилищеЗначения, ОбщийМодуль, ОбъектМетаданных, ТипЗначенияXDTO, ТипОбъектаXDTO," & @CRLF & _
"// ЛюбаяСсылка." & @CRLF & _
"//" & @CRLF & _
"// ВызыватьИсключение - Булево - начальное значение Истина. Когда установлено Ложь, тогда в случае наличия" & @CRLF & _
"// нефиксируемых данных исключение не будет вызвано, при этом данные будут" & @CRLF & _
"// зафиксированы на сколько возможно." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ФиксированнаяСтруктура, ФиксированноеСоответствие, ФиксированныйМассив - фиксированные данные, аналогичные" & @CRLF & _
"// переданным в параметре Данные." & @CRLF & _
"// " & @CRLF & _
"Функция ФиксированныеДанные(Данные, ВызыватьИсключение = Истина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Данные) = Тип("Массив") Тогда" & @CRLF & _
" Массив = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Для каждого Значение Из Данные Цикл" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Значение) = Тип("Структура")" & @CRLF & _
" ИЛИ ТипЗнч(Значение) = Тип("Соответствие")" & @CRLF & _
" ИЛИ ТипЗнч(Значение) = Тип("Массив") Тогда" & @CRLF & _
" " & @CRLF & _
" Массив.Добавить(ФиксированныеДанные(Значение, ВызыватьИсключение));" & @CRLF & _
" Иначе" & @CRLF & _
" Если ВызыватьИсключение Тогда" & @CRLF & _
" ПроверкаФиксированностиДанных(Значение, Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Массив.Добавить(Значение);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ФиксированныйМассив(Массив);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ТипЗнч(Данные) = Тип("Структура")" & @CRLF & _
" ИЛИ ТипЗнч(Данные) = Тип("Соответствие") Тогда" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Данные) = Тип("Структура") Тогда" & @CRLF & _
" Коллекция = Новый Структура;" & @CRLF & _
" Иначе" & @CRLF & _
" Коллекция = Новый Соответствие;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для каждого КлючИЗначение Из Данные Цикл" & @CRLF & _
" Значение = КлючИЗначение.Значение;" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Значение) = Тип("Структура")" & @CRLF & _
" ИЛИ ТипЗнч(Значение) = Тип("Соответствие")" & @CRLF & _
" ИЛИ ТипЗнч(Значение) = Тип("Массив") Тогда" & @CRLF & _
" " & @CRLF & _
" Коллекция.Вставить(" & @CRLF & _
" КлючИЗначение.Ключ, ФиксированныеДанные(Значение, ВызыватьИсключение));" & @CRLF & _
" Иначе" & @CRLF & _
" Если ВызыватьИсключение Тогда" & @CRLF & _
" ПроверкаФиксированностиДанных(Значение, Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Коллекция.Вставить(КлючИЗначение.Ключ, Значение);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Данные) = Тип("Структура") Тогда" & @CRLF & _
" Возврат Новый ФиксированнаяСтруктура(Коллекция);" & @CRLF & _
" Иначе" & @CRLF & _
" Возврат Новый ФиксированноеСоответствие(Коллекция);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВызыватьИсключение Тогда" & @CRLF & _
" ПроверкаФиксированностиДанных(Данные);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Данные;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Вычисляет контрольную сумму для произвольных данных по указанному алгоритму." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Данные - Произвольный - любое сериализуемое значение." & @CRLF & _
"// Алгоритм - ХешФункция - алгоритм расчета контрольной суммы. По умолчанию, MD5." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - контрольная сумма строкой без пробелов (например 32 символа)." & @CRLF & _
"//" & @CRLF & _
"Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Алгоритм = Неопределено Тогда" & @CRLF & _
" Алгоритм = ХешФункция.MD5;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ХешированиеДанных = Новый ХешированиеДанных(Алгоритм);" & @CRLF & _
" Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда" & @CRLF & _
" Данные = ЗначениеВСтрокуXML(Данные);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ХешированиеДанных.Добавить(Данные);" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("ДвоичныеДанные") Тогда " & @CRLF & _
" Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");" & @CRLF & _
" ИначеЕсли ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("Число") Тогда" & @CRLF & _
" Результат = Формат(ХешированиеДанных.ХешСумма, "ЧГ=");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Сокращает строку до нужной длины, при этом обрезанная часть хешируется," & @CRLF & _
"// обеспечивая уникальность строки. Проверяет длину строки на входе и, в случае" & @CRLF & _
"// превышения максимальной длины, преобразует ее конец по алгоритму MD5 в" & @CRLF & _
"// уникальную строку из 32 символов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Строка - Строка - исходная строка произвольной длины." & @CRLF & _
"// МаксимальнаяДлина - Число - требуемое максимальное количество символов в строке," & @CRLF & _
"// минимальное значение: 32." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - строка, не превышающая максимальную длину." & @CRLF & _
"//" & @CRLF & _
"Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если МаксимальнаяДлина < 32 Тогда" & @CRLF & _
" ОбщегоНазначенияКлиентСервер.Проверить(Ложь, " & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Параметр %1 не может быть меньше 32.'")," & @CRLF & _
" "МаксимальнаяДлина"), "ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Результат = Строка;" & @CRLF & _
" Если СтрДлина(Строка) > МаксимальнаяДлина Тогда" & @CRLF & _
" Результат = Лев(Строка, МаксимальнаяДлина - 32);" & @CRLF & _
" ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);" & @CRLF & _
" ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1));" & @CRLF & _
" Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Создает полную копию структуры, соответствия, массива, списка или таблицы значений, рекурсивно," & @CRLF & _
"// с учетом типов дочерних элементов. При этом содержимое значений объектных типов" & @CRLF & _
"// (СправочникОбъект, ДокументОбъект и т.п.) не копируются, а возвращаются ссылки на исходный объект." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Источник - Структура" & @CRLF & _
"// - ФиксированнаяСтруктура" & @CRLF & _
"// - Соответствие" & @CRLF & _
"// - ФиксированноеСоответствие" & @CRLF & _
"// - Массив" & @CRLF & _
"// - ФиксированныйМассив" & @CRLF & _
"// - СписокЗначений - объект, который необходимо скопировать." & @CRLF & _
"// ФиксироватьДанные - Булево - если Истина - фиксировать, если Ложь - снять фиксацию." & @CRLF & _
"// - Неопределено - не изменять." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура, " & @CRLF & _
"// ФиксированнаяСтруктура," & @CRLF & _
"// Соответствие" & @CRLF & _
"// ФиксированноеСоответствие" & @CRLF & _
"// Массив" & @CRLF & _
"// ФиксированныйМассив" & @CRLF & _
"// СписокЗначений - копия объекта, переданного в параметре Источник." & @CRLF & _
"//" & @CRLF & _
"Функция СкопироватьРекурсивно(Источник, ФиксироватьДанные = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Перем Приемник;" & @CRLF & _
" " & @CRLF & _
" ТипИсточника = ТипЗнч(Источник);" & @CRLF & _
" " & @CRLF & _
" Если ТипИсточника = Тип("ТаблицаЗначений") Тогда" & @CRLF & _
" Приемник = Источник.Скопировать();" & @CRLF & _
" СкопироватьЗначенияТаблицыЗначений(Приемник, ФиксироватьДанные);" & @CRLF & _
" ИначеЕсли ТипИсточника = Тип("ДеревоЗначений") Тогда" & @CRLF & _
" Приемник = Источник.Скопировать();" & @CRLF & _
" СкопироватьЗначенияСтрокиДереваЗначений(Приемник.Строки, ФиксироватьДанные);" & @CRLF & _
" ИначеЕсли ТипИсточника = Тип("Структура")" & @CRLF & _
" Или ТипИсточника = Тип("ФиксированнаяСтруктура") Тогда" & @CRLF & _
" Приемник = СкопироватьСтруктуру(Источник, ФиксироватьДанные);" & @CRLF & _
" ИначеЕсли ТипИсточника = Тип("Соответствие")" & @CRLF & _
" Или ТипИсточника = Тип("ФиксированноеСоответствие") Тогда" & @CRLF & _
" Приемник = СкопироватьСоответствие(Источник, ФиксироватьДанные);" & @CRLF & _
" ИначеЕсли ТипИсточника = Тип("Массив")" & @CRLF & _
" Или ТипИсточника = Тип("ФиксированныйМассив") Тогда" & @CRLF & _
" Приемник = СкопироватьМассив(Источник, ФиксироватьДанные);" & @CRLF & _
" ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда" & @CRLF & _
" Приемник = СкопироватьСписокЗначений(Источник, ФиксироватьДанные);" & @CRLF & _
" Иначе" & @CRLF & _
" Приемник = Источник;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Приемник;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает описание предмета в виде текстовой строки." & @CRLF & _
"// Для документов возвращается представление, для остальных ссылочных типов возвращается " & @CRLF & _
"// представление и тип в скобках, например, "Ножницы (Номенклатура)"." & @CRLF & _
"// Для пустых ссылок, Неопределено или незаполненных значений примитивных типов возвращается "не задан"." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// СсылкаНаПредмет - Произвольный." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - например, "Ножницы (Номенклатура)", "Заказ клиента № 0001 от 01.01.2001" или "не задан"." & @CRLF & _
"// " & @CRLF & _
"Функция ПредметСтрокой(СсылкаНаПредмет) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если СсылкаНаПредмет <> Неопределено Тогда" & @CRLF & _
" Возврат ПредметыСтрокой(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаНаПредмет))[СсылкаНаПредмет];" & @CRLF & _
" Иначе" & @CRLF & _
" Возврат НСтр("ru = 'не задан'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает описания предметов СсылкиНаПредметы." & @CRLF & _
"// Для документов возвращается представление, для остальных ссылочных типов возвращается " & @CRLF & _
"// представление и тип в скобках, например, "Ножницы (Номенклатура)"." & @CRLF & _
"// Для пустых ссылок или незаполненных значений примитивных типов возвращается "не задан"." & @CRLF & _
"// Значение "удален", если объект не существует в информационной базе." & @CRLF & _
"// Значения Неопределено пропускаются." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// СсылкиНаПредметы - Массив из ЛюбаяСсылка" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - ЛюбаяСсылка" & @CRLF & _
"// * Значение - Строка - например, "Ножницы (Номенклатура)", "Заказ клиента № 0001 от 01.01.2001" или "не задан"." & @CRLF & _
"// " & @CRLF & _
"Функция ПредметыСтрокой(Знач СсылкиНаПредметы) Экспорт" & @CRLF & _
" " & @CRLF & _
" ПроверяемыеСсылки = Новый Массив;" & @CRLF & _
" Результат = Новый Соответствие;" & @CRLF & _
" Для каждого СсылкаНаПредмет Из СсылкиНаПредметы Цикл" & @CRLF & _
" Если СсылкаНаПредмет = Неопределено Тогда" & @CRLF & _
" Результат[СсылкаНаПредмет] = НСтр("ru = 'не задан'");" & @CRLF & _
" ИначеЕсли Не ЭтоСсылка(ТипЗнч(СсылкаНаПредмет)) Тогда " & @CRLF & _
" Результат[СсылкаНаПредмет] = Строка(СсылкаНаПредмет);" & @CRLF & _
" ИначеЕсли СсылкаНаПредмет.Пустая() Тогда " & @CRLF & _
" Результат[СсылкаНаПредмет] = НСтр("ru = 'не задан'");" & @CRLF & _
" ИначеЕсли Метаданные.Перечисления.Содержит(СсылкаНаПредмет.Метаданные()) Тогда" & @CRLF & _
" Результат[СсылкаНаПредмет] = Строка(СсылкаНаПредмет);" & @CRLF & _
" Иначе" & @CRLF & _
" ПроверяемыеСсылки.Добавить(СсылкаНаПредмет);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для каждого СуществующаяСсылка Из ПредставленияСсылок(ПроверяемыеСсылки) Цикл" & @CRLF & _
" СсылкаНаПредмет = СуществующаяСсылка.Ключ;" & @CRLF & _
" Результат[СсылкаНаПредмет] = СуществующаяСсылка.Значение;" & @CRLF & _
" Если Не Метаданные.Документы.Содержит(СсылкаНаПредмет.Метаданные()) Тогда" & @CRLF & _
" ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().ПредставлениеОбъекта;" & @CRLF & _
" Если ПустаяСтрока(ПредставлениеОбъекта) Тогда" & @CRLF & _
" ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().Представление();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Результат[СсылкаНаПредмет] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 (%2)", " & @CRLF & _
" Результат[СсылкаНаПредмет], ПредставлениеОбъекта);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает представления переданных ссылок." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПроверяемыеСсылки - Массив из ЛюбаяСсылка, ЛюбаяСсылка" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - ЛюбаяСсылка" & @CRLF & _
"// * Значение - Строка - представление ссылки или "удален", если ссылка не существует в информационной базе." & @CRLF & _
"//" & @CRLF & _
"Функция ПредставленияСсылок(ПроверяемыеСсылки) Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбъектыПоТипу = Новый Соответствие;" & @CRLF & _
" Если ТипЗнч(ПроверяемыеСсылки) = Тип("Массив") Тогда" & @CRLF & _
" Для каждого ПроверяемаяСсылка Из ПроверяемыеСсылки Цикл" & @CRLF & _
" Объекты = ОбъектыПоТипу[ПроверяемаяСсылка.Метаданные()];" & @CRLF & _
" Если Объекты = Неопределено Тогда" & @CRLF & _
" Объекты = Новый Массив;" & @CRLF & _
" ОбъектыПоТипу[ПроверяемаяСсылка.Метаданные()] = Объекты;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Объекты.Добавить(ПроверяемаяСсылка);" & @CRLF & _
" КонецЦикла; " & @CRLF & _
" Иначе" & @CRLF & _
" ОбъектыПоТипу[ПроверяемыеСсылки.Метаданные()] = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПроверяемыеСсылки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Соответствие;" & @CRLF & _
" Если ОбъектыПоТипу.Количество() = 0 Тогда" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Запрос = Новый Запрос;" & @CRLF & _
" ТекстыЗапросов = Новый Массив;" & @CRLF & _
" Индекс = 0;" & @CRLF & _
" Для каждого ТипОбъекта Из ОбъектыПоТипу Цикл" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = " & @CRLF & _
" "ВЫБРАТЬ РАЗРЕШЕННЫЕ" & @CRLF & _
" | Представление КАК Представление," & @CRLF & _
" | Таблица.Ссылка КАК Ссылка" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &ИмяТаблицы КАК Таблица" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | Таблица.Ссылка В (&Ссылка)";" & @CRLF & _
" " & @CRLF & _
" Если ТекстыЗапросов.Количество() > 0 Тогда" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ТипОбъекта.Ключ.ПолноеИмя());" & @CRLF & _
" " & @CRLF & _
" ИмяПараметра = "Ссылка" + Формат(Индекс, "ЧГ=;ЧН=");" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылка", "&" + ИмяПараметра);" & @CRLF & _
" ТекстыЗапросов.Добавить(ТекстЗапроса);" & @CRLF & _
" Запрос.УстановитьПараметр(ИмяПараметра, ТипОбъекта.Значение);" & @CRLF & _
"" & @CRLF & _
" Индекс = Индекс + 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Запрос.Текст = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); // @query-part;" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" ФактическиеСсылки = Запрос.Выполнить().Выгрузить();" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" " & @CRLF & _
" ПредставленияСсылок = Запрос.Выполнить().Выгрузить();" & @CRLF & _
" ПредставленияСсылок.Индексы.Добавить("Ссылка");" & @CRLF & _
" " & @CRLF & _
" Для каждого Ссылка Из ФактическиеСсылки Цикл" & @CRLF & _
" Если ЗначениеЗаполнено(Ссылка.Ссылка) Тогда" & @CRLF & _
" ПредставлениеСсылки = ПредставленияСсылок.Найти(Ссылка.Ссылка, "Ссылка");" & @CRLF & _
" Результат[Ссылка.Ссылка] = ?(ПредставлениеСсылки <> Неопределено, " & @CRLF & _
" ПредставлениеСсылки.Представление, Строка(Ссылка.Ссылка));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для каждого Ссылка Из ПроверяемыеСсылки Цикл" & @CRLF & _
" Если Результат[Ссылка] = Неопределено Тогда" & @CRLF & _
" Результат[Ссылка] = НСтр("ru = 'удален'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ДинамическийСписок" & @CRLF & _
"" & @CRLF & _
"// Создает структуру для второго параметра СвойстваСписка процедуры УстановитьСвойстваДинамическогоСписка." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура - любое поле может иметь значение Неопределено, если оно не устанавливается:" & @CRLF & _
"// * ТекстЗапроса - Строка - новый текст запроса." & @CRLF & _
"// * ОсновнаяТаблица - Строка - имя основной таблицы." & @CRLF & _
"// * ДинамическоеСчитываниеДанных - Булево - признак использования динамического считывания." & @CRLF & _
"//" & @CRLF & _
"Функция СтруктураСвойствДинамическогоСписка() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Новый Структура("ТекстЗапроса, ОсновнаяТаблица, ДинамическоеСчитываниеДанных");" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Установить текст запроса, основную таблицу или динамическое считывание в динамическом списке." & @CRLF & _
"// Устанавливать эти свойства следует за один вызов этой процедуры, чтобы не снижалась производительность." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Список - ТаблицаФормы - элемент формы динамического списка, для которого устанавливаются свойства." & @CRLF & _
"// СвойстваСписка - см. СтруктураСвойствДинамическогоСписка" & @CRLF & _
"//" & @CRLF & _
"Процедура УстановитьСвойстваДинамическогоСписка(Список, СвойстваСписка) Экспорт" & @CRLF & _
" " & @CRLF & _
" Форма = Список.Родитель;" & @CRLF & _
" ТипФормаКлиентскогоПриложения = Тип("ФормаКлиентскогоПриложения");" & @CRLF & _
" " & @CRLF & _
" Пока ТипЗнч(Форма) <> ТипФормаКлиентскогоПриложения Цикл" & @CRLF & _
" Форма = Форма.Родитель;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ДинамическийСписок = Форма[Список.ПутьКДанным];" & @CRLF & _
" ТекстЗапроса = СвойстваСписка.ТекстЗапроса;" & @CRLF & _
" " & @CRLF & _
" Если Не ПустаяСтрока(ТекстЗапроса) Тогда" & @CRLF & _
" ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОсновнаяТаблица = СвойстваСписка.ОсновнаяТаблица;" & @CRLF & _
" " & @CRLF & _
" Если ОсновнаяТаблица <> Неопределено Тогда" & @CRLF & _
" ДинамическийСписок.ОсновнаяТаблица = ОсновнаяТаблица;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ДинамическоеСчитываниеДанных = СвойстваСписка.ДинамическоеСчитываниеДанных;" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(ДинамическоеСчитываниеДанных) = Тип("Булево") Тогда" & @CRLF & _
" ДинамическийСписок.ДинамическоеСчитываниеДанных = ДинамическоеСчитываниеДанных;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ВнешнееСоединение" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Процедуры и функции для работы с внешним соединением." & @CRLF & _
"" & @CRLF & _
"// Возвращает CLSID COM-класса для работы с "1С:Предприятием 8" через COM-соединение." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяCOMСоединителя - Строка - имя COM-класса для работы с "1С:Предприятием 8" через COM-соединение." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - строковое представление CLSID." & @CRLF & _
"//" & @CRLF & _
"Функция ИдентификаторCOMСоединителя(Знач ИмяCOMСоединителя) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ИмяCOMСоединителя = "v83.COMConnector" Тогда" & @CRLF & _
" Возврат "181E893D-73A4-4722-B61D-D604B3D67D47";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'На задан CLSID для класса %1.'"), " & @CRLF & _
" ИмяCOMСоединителя);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель" & @CRLF & _
"// на это соединение." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Параметры - см. ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * Соединение - COMОбъект" & @CRLF & _
"// - Неопределено - COM-объект соединения или Неопределено в случае ошибки;" & @CRLF & _
"// * КраткоеОписаниеОшибки - Строка - краткое описание ошибки;" & @CRLF & _
"// * ПодробноеОписаниеОшибки - Строка - подробное описание ошибки;" & @CRLF & _
"// * ОшибкаПодключенияКомпоненты - Булево - флаг ошибки подключения COM." & @CRLF & _
"//" & @CRLF & _
"Функция УстановитьВнешнееСоединениеСБазой(Параметры) Экспорт" & @CRLF & _
" " & @CRLF & _
" ПодключениеНедоступно = ЭтоLinuxСервер();" & @CRLF & _
" КраткоеОписаниеОшибки = НСтр("ru = 'Прямое подключение к информационной базе недоступно на сервере под управлением ОС Linux.'");" & @CRLF & _
" " & @CRLF & _
" Возврат ОбщегоНазначенияСлужебныйКлиентСервер.УстановитьВнешнееСоединениеСБазой(Параметры, ПодключениеНедоступно, КраткоеОписаниеОшибки);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Метаданные" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Функции определения типов объектов метаданных." & @CRLF & _
"" & @CRLF & _
"// Ссылочные типы данных" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Документ"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к документам." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является документом." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоДокумент(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.Документы.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Справочник"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является справочником." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоСправочник(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.Справочники.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Перечисление"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является перечислением." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПеречисление(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.Перечисления.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "План обмена"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является планом обмена." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПланОбмена(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "План видов характеристик"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является планом видов характеристик." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПланВидовХарактеристик(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Бизнес-процесс"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является бизнес-процессом." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоБизнесПроцесс(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Задача"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является задачей." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоЗадача(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.Задачи.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "План счетов"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является планом счетов." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПланСчетов(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "План видов расчета"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является планом видов расчета." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПланВидовРасчета(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Регистры" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Регистр сведений"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является регистром сведений." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРегистрСведений(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Регистр накопления"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является регистром накопления." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРегистрНакопления(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Регистр бухгалтерии"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является регистром бухгалтерии." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРегистрБухгалтерии(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Регистр расчета"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является регистром расчета." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРегистрРасчета(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Константы" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Константа"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является константой." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоКонстанта(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.Константы.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Журналы документов" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Журнал документов"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является журналом документов." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоЖурналДокументов(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Последовательности" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Последовательности"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является последовательностью." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоПоследовательность(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.Последовательности.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// РегламентныеЗадания" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к общему типу "Регламентные задания"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является регламентным заданием." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРегламентноеЗадание(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Общие" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к типу регистр." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект является каким-либо регистром." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоРегистр(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных)" & @CRLF & _
" Или Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)" & @CRLF & _
" Или Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных)" & @CRLF & _
" Или Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет принадлежность объекта метаданных к ссылочному типу." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект ссылочного типа." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" ИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя();" & @CRLF & _
" Позиция = СтрНайти(ИмяОбъектаМетаданных, ".");" & @CRLF & _
" Если Позиция > 0 Тогда " & @CRLF & _
" ИмяБазовогоТипа = Лев(ИмяОбъектаМетаданных, Позиция - 1);" & @CRLF & _
" Возврат ИмяБазовогоТипа = "Справочник"" & @CRLF & _
" Или ИмяБазовогоТипа = "Документ"" & @CRLF & _
" Или ИмяБазовогоТипа = "БизнесПроцесс"" & @CRLF & _
" Или ИмяБазовогоТипа = "Задача"" & @CRLF & _
" Или ИмяБазовогоТипа = "ПланСчетов"" & @CRLF & _
" Или ИмяБазовогоТипа = "ПланОбмена"" & @CRLF & _
" Или ИмяБазовогоТипа = "ПланВидовХарактеристик"" & @CRLF & _
" Или ИмяБазовогоТипа = "ПланВидовРасчета";" & @CRLF & _
" Иначе" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Процедуры и функции для работы с типами, объектами метаданных и их строковыми представлениями." & @CRLF & _
"" & @CRLF & _
"// Возвращает имена реквизитов объекта заданного типа." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылка - ЛюбаяСсылка - ссылка на элемент базы данных, для которого требуется получить результат функции;" & @CRLF & _
"// Тип - Тип - тип значения реквизита." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - строка реквизитов объекта метаданных конфигурации, разделенных символом ","." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// РеквизитыОрганизации = ОбщегоНазначения.ИменаРеквизитовПоТипу(Документ.Ссылка, Тип("СправочникСсылка.Организации"));" & @CRLF & _
"//" & @CRLF & _
"Функция ИменаРеквизитовПоТипу(Ссылка, Тип) Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = "";" & @CRLF & _
" МетаданныеОбъекта = Ссылка.Метаданные();" & @CRLF & _
" " & @CRLF & _
" Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл" & @CRLF & _
" Если Реквизит.Тип.СодержитТип(Тип) Тогда" & @CRLF & _
" Результат = Результат + ?(ПустаяСтрока(Результат), "", ", ") + Реквизит.Имя;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает имя базового типа по переданному значению объекта метаданных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект метаданных, по которому необходимо определить базовый тип." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - имя базового типа по переданному значению объекта метаданных." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Метаданные.Справочники.Номенклатура); = "Справочники"." & @CRLF & _
"//" & @CRLF & _
"Функция ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Документы";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Справочники";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Перечисления";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "РегистрыСведений";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "РегистрыНакопления";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "РегистрыБухгалтерии";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "РегистрыРасчета";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПланыОбмена";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПланыВидовХарактеристик";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "БизнесПроцессы";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Задачи";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПланыСчетов";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПланыВидовРасчета";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Константы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Константы";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ЖурналыДокументов";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Последовательности";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "РегламентныеЗадания";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных.Родитель())" & @CRLF & _
" И ОбъектМетаданных.Родитель().Перерасчеты.Найти(ОбъектМетаданных.Имя) = ОбъектМетаданных Тогда" & @CRLF & _
" Возврат "Перерасчеты";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Обработки";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Отчеты";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Подсистемы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Подсистемы";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ОбщиеМодули.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ОбщиеМодули";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПараметрыСеанса.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПараметрыСеанса";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Роли.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Роли";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ОбщиеРеквизиты.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ОбщиеРеквизиты";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.КритерииОтбора.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "КритерииОтбора";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПодпискиНаСобытия.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПодпискиНаСобытия";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ФункциональныеОпции.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ФункциональныеОпции";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПараметрыФункциональныхОпций.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПараметрыФункциональныхОпций";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ХранилищаНастроек.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ХранилищаНастроек";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ОбщиеФормы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ОбщиеФормы";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ОбщиеКоманды.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ОбщиеКоманды";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ГруппыКоманд.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ГруппыКоманд";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ОбщиеМакеты.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ОбщиеМакеты";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ОбщиеКартинки.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ОбщиеКартинки";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ПакетыXDTO.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ПакетыXDTO";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.WebСервисы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "WebСервисы";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.WSСсылки.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "WSСсылки";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Стили.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Стили";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.Языки.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "Языки";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.ВнешниеИсточникиДанных.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат "ВнешниеИсточникиДанных";" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" Возврат "";" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает менеджер объекта по полному имени объекта метаданных." & @CRLF & _
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПолноеИмя - Строка - полное имя объекта метаданных. Пример: "Справочник.Организации"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта." & @CRLF & _
"// " & @CRLF & _
"// Пример:" & @CRLF & _
"// МенеджерСправочника = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник.Организации");" & @CRLF & _
"// ПустаяСсылка = МенеджерСправочника.ПустаяСсылка();" & @CRLF & _
"//" & @CRLF & _
"Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) Экспорт" & @CRLF & _
" " & @CRLF & _
" Перем КлассОМ, ИмяОМ, Менеджер;" & @CRLF & _
" " & @CRLF & _
" ЧастиИмени = СтрРазделить(ПолноеИмя, ".");" & @CRLF & _
" " & @CRLF & _
" Если ЧастиИмени.Количество() >= 2 Тогда" & @CRLF & _
" КлассОМ = ЧастиИмени[0];" & @CRLF & _
" ИмяОМ = ЧастиИмени[1];" & @CRLF & _
" Иначе " & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ВРег(КлассОМ) = "ПЛАНОБМЕНА" Тогда" & @CRLF & _
" Менеджер = ПланыОбмена;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "СПРАВОЧНИК" Тогда" & @CRLF & _
" Менеджер = Справочники;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ДОКУМЕНТ" Тогда" & @CRLF & _
" Менеджер = Документы;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ЖУРНАЛДОКУМЕНТОВ" Тогда" & @CRLF & _
" Менеджер = ЖурналыДокументов;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ПЕРЕЧИСЛЕНИЕ" Тогда" & @CRLF & _
" Менеджер = Перечисления;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ОТЧЕТ" Тогда" & @CRLF & _
" Менеджер = Отчеты;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ОБРАБОТКА" Тогда" & @CRLF & _
" Менеджер = Обработки;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда" & @CRLF & _
" Менеджер = ПланыВидовХарактеристик;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ПЛАНСЧЕТОВ" Тогда" & @CRLF & _
" Менеджер = ПланыСчетов;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВРАСЧЕТА" Тогда" & @CRLF & _
" Менеджер = ПланыВидовРасчета;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРСВЕДЕНИЙ" Тогда" & @CRLF & _
" Менеджер = РегистрыСведений;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРНАКОПЛЕНИЯ" Тогда" & @CRLF & _
" Менеджер = РегистрыНакопления;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРБУХГАЛТЕРИИ" Тогда" & @CRLF & _
" Менеджер = РегистрыБухгалтерии;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРРАСЧЕТА" Тогда" & @CRLF & _
" " & @CRLF & _
" Если ЧастиИмени.Количество() = 2 Тогда" & @CRLF & _
" Менеджер = РегистрыРасчета;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ЧастиИмени.Количество() = 4 Тогда" & @CRLF & _
" КлассПодчиненногоОМ = ЧастиИмени[2];" & @CRLF & _
" ИмяПодчиненногоОМ = ЧастиИмени[3];" & @CRLF & _
" " & @CRLF & _
" Если ВРег(КлассПодчиненногоОМ) = "ПЕРЕРАСЧЕТ" Тогда " & @CRLF & _
" Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты;" & @CRLF & _
" ИмяОм = ИмяПодчиненногоОМ;" & @CRLF & _
" " & @CRLF & _
" Иначе " & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "БИЗНЕСПРОЦЕСС" Тогда" & @CRLF & _
" Менеджер = БизнесПроцессы;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ЗАДАЧА" Тогда" & @CRLF & _
" Менеджер = Задачи;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "КОНСТАНТА" Тогда" & @CRLF & _
" Менеджер = Константы;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ВРег(КлассОМ) = "ПОСЛЕДОВАТЕЛЬНОСТЬ" Тогда" & @CRLF & _
" Менеджер = Последовательности;" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Менеджер = Неопределено Тогда" & @CRLF & _
" ПроверитьОбъектМетаданныхСуществует(ПолноеИмя);" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Объект метаданных ""%1"" не имеет менеджера объекта.'"), ПолноеИмя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Возврат Менеджер[ИмяОМ];" & @CRLF & _
" Исключение" & @CRLF & _
" ПроверитьОбъектМетаданныхСуществует(ПолноеИмя);" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает менеджер объекта по ссылке на объект." & @CRLF & _
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов." & @CRLF & _
"// См. также ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылка - ЛюбаяСсылка - объект, менеджер которого требуется получить." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// МенеджерСправочника = ОбщегоНазначения.МенеджерОбъектаПоСсылке(СсылкаНаОрганизацию);" & @CRLF & _
"// ПустаяСсылка = МенеджерСправочника.ПустаяСсылка();" & @CRLF & _
"//" & @CRLF & _
"Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт" & @CRLF & _
" " & @CRLF & _
" ИмяОбъекта = Ссылка.Метаданные().Имя;" & @CRLF & _
" ТипСсылки = ТипЗнч(Ссылка);" & @CRLF & _
" " & @CRLF & _
" Если Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат Справочники[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат Документы[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат БизнесПроцессы[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат ПланыВидовХарактеристик[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат ПланыСчетов[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат ПланыВидовРасчета[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат Задачи[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат ПланыОбмена[ИмяОбъекта];" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда" & @CRLF & _
" Возврат Перечисления[ИмяОбъекта];" & @CRLF & _
" Иначе" & @CRLF & _
" Возврат Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверка того, что переданный тип является ссылочным типом данных." & @CRLF & _
"// Для типа Неопределено возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПроверяемыйТип - Тип - для проверки на ссылочный тип данных." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если это ссылка." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоСсылка(ПроверяемыйТип) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ПроверяемыйТип <> Тип("Неопределено") И ОписаниеТипаВсеСсылки().СодержитТип(ПроверяемыйТип);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПроверяемаяСсылка - ЛюбаяСсылка - значение любой ссылки информационной базы данных." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если существует." & @CRLF & _
"//" & @CRLF & _
"Функция СсылкаСуществует(ПроверяемаяСсылка) Экспорт" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = " & @CRLF & _
" "ВЫБРАТЬ ПЕРВЫЕ 1" & @CRLF & _
" | 1 КАК Поле1" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &ИмяТаблицы КАК Таблица" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | Таблица.Ссылка = &Ссылка";" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ИмяТаблицыПоСсылке(ПроверяемаяСсылка));" & @CRLF & _
" " & @CRLF & _
" Запрос = Новый Запрос;" & @CRLF & _
" Запрос.Текст = ТекстЗапроса;" & @CRLF & _
" Запрос.УстановитьПараметр("Ссылка", ПроверяемаяСсылка);" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" Возврат НЕ Запрос.Выполнить().Пустой();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает имя вида объектов метаданных по ссылке на объект." & @CRLF & _
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов." & @CRLF & _
"// См. так же ВидОбъектаПоТипу." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылка - ЛюбаяСсылка - объект, вид которого требуется получить." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - имя вида объектов метаданных. Например: "Справочник", "Документ"." & @CRLF & _
"// " & @CRLF & _
"Функция ВидОбъектаПоСсылке(Ссылка) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ВидОбъектаПоТипу(ТипЗнч(Ссылка));" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"// Возвращает имя вида объектов метаданных по типу объекта." & @CRLF & _
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов." & @CRLF & _
"// См. так же ВидОбъектаПоСсылке." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ТипОбъекта - Тип - тип прикладного объекта, определенный в конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - имя вида объектов метаданных. Например: "Справочник", "Документ"." & @CRLF & _
"// " & @CRLF & _
"Функция ВидОбъектаПоТипу(ТипОбъекта) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Справочники.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "Справочник";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "Документ";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "БизнесПроцесс";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "ПланВидовХарактеристик";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "ПланСчетов";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "ПланВидовРасчета";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "Задача";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "ПланОбмена";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда" & @CRLF & _
" Возврат "Перечисление";" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный тип значения параметра (%1)'"), Строка(ТипОбъекта));" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает полное имя объекта метаданных по переданному значению ссылки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Ссылка - ЛюбаяСсылка - объект, для которого необходимо получить имя таблицы ИБ." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - полное имя объекта метаданных для указанного объекта. Например: "Справочник.Номенклатура"." & @CRLF & _
"//" & @CRLF & _
"Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Ссылка.Метаданные().ПолноеИмя();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверяет, что переданное значение имеет ссылочный тип данных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Значение - Произвольный - проверяемое значение." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если тип значения ссылочный." & @CRLF & _
"//" & @CRLF & _
"Функция ЗначениеСсылочногоТипа(Значение) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоСсылка(ТипЗнч(Значение));" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверяет, является ли элемент справочника или плана видов характеристик группой элементов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Объект - СправочникСсылка" & @CRLF & _
"// - ПланВидовХарактеристикСсылка" & @CRLF & _
"// - СправочникОбъект" & @CRLF & _
"// - ПланВидовХарактеристикОбъект - проверяемый объект." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево" & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектЯвляетсяГруппой(Объект) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеСсылочногоТипа(Объект) Тогда" & @CRLF & _
" Ссылка = Объект;" & @CRLF & _
" Иначе" & @CRLF & _
" Ссылка = Объект.Ссылка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" МетаданныеОбъекта = Ссылка.Метаданные();" & @CRLF & _
" Если ЭтоСправочник(МетаданныеОбъекта) Тогда" & @CRLF & _
" Если Не МетаданныеОбъекта.Иерархический" & @CRLF & _
" Или МетаданныеОбъекта.ВидИерархии <> Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли Не ЭтоПланВидовХарактеристик(МетаданныеОбъекта) Или Не МетаданныеОбъекта.Иерархический Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Ссылка <> Объект Тогда" & @CRLF & _
" Возврат Объект.ЭтоГруппа;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЗначениеРеквизитаОбъекта(Ссылка, "ЭтоГруппа") = Истина;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает ссылку, соответствующую объекту метаданных, для использования в базе данных." & @CRLF & _
"// См. также ОбщегоНазначения.ИдентификаторыОбъектовМетаданных." & @CRLF & _
"//" & @CRLF & _
"// Ссылки возвращаются для следующих объектов метаданных:" & @CRLF & _
"// - Подсистемы (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);" & @CRLF & _
"// - Роли (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);" & @CRLF & _
"// - ПланыОбмена;" & @CRLF & _
"// - Константы;" & @CRLF & _
"// - Справочники;" & @CRLF & _
"// - Документы;" & @CRLF & _
"// - ЖурналыДокументов;" & @CRLF & _
"// - Отчеты;" & @CRLF & _
"// - Обработки;" & @CRLF & _
"// - ПланыВидовХарактеристик;" & @CRLF & _
"// - ПланыСчетов;" & @CRLF & _
"// - ПланыВидовРасчета;" & @CRLF & _
"// - РегистрыСведений;" & @CRLF & _
"// - РегистрыНакопления;" & @CRLF & _
"// - РегистрыБухгалтерии;" & @CRLF & _
"// - РегистрыРасчета;" & @CRLF & _
"// - БизнесПроцессы;" & @CRLF & _
"// - Задачи." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОписаниеОбъектаМетаданных - ОбъектМетаданных - объект метаданных конфигурации;" & @CRLF & _
"// - Тип - тип, который можно использовать в функции Метаданные.НайтиПоТипу;" & @CRLF & _
"// - Строка - полное имя объекта метаданных, которое можно " & @CRLF & _
"// использовать в функции Метаданные.НайтиПоПолномуИмени." & @CRLF & _
"//" & @CRLF & _
"// ВызыватьИсключение - Булево - если Ложь, то вместо вызова исключения возвращается Null для несуществующего" & @CRLF & _
"// или неподдерживаемого объекта метаданных." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// СправочникСсылка.ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// СправочникСсылка.ИдентификаторыОбъектовРасширений" & @CRLF & _
"// Null" & @CRLF & _
"// " & @CRLF & _
"// Пример:" & @CRLF & _
"// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Ссылка));" & @CRLF & _
"// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных);" & @CRLF & _
"// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Организации");" & @CRLF & _
"//" & @CRLF & _
"Функция ИдентификаторОбъектаМетаданных(ОписаниеОбъектаМетаданных, ВызыватьИсключение = Истина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданных(" & @CRLF & _
" ОписаниеОбъектаМетаданных, ВызыватьИсключение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает ссылки, соответствующие объектам метаданных, для использования в базе данных." & @CRLF & _
"// См. также ОбщегоНазначения.ИдентификаторОбъектаМетаданных." & @CRLF & _
"//" & @CRLF & _
"// Ссылки возвращаются для следующих объектов метаданных:" & @CRLF & _
"// - Подсистемы (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);" & @CRLF & _
"// - Роли (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);" & @CRLF & _
"// - ПланыОбмена." & @CRLF & _
"// - Константы." & @CRLF & _
"// - Справочники." & @CRLF & _
"// - Документы." & @CRLF & _
"// - ЖурналыДокументов." & @CRLF & _
"// - Отчеты." & @CRLF & _
"// - Обработки." & @CRLF & _
"// - ПланыВидовХарактеристик." & @CRLF & _
"// - ПланыСчетов." & @CRLF & _
"// - ПланыВидовРасчета." & @CRLF & _
"// - РегистрыСведений." & @CRLF & _
"// - РегистрыНакопления." & @CRLF & _
"// - РегистрыБухгалтерии." & @CRLF & _
"// - РегистрыРасчета." & @CRLF & _
"// - БизнесПроцессы." & @CRLF & _
"// - Задачи." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОписаниеОбъектовМетаданных - Массив из ОбъектМетаданных - объекты метаданных конфигурации;" & @CRLF & _
"// - Массив из Строка - полные имена объектов метаданных, которые можно использовать" & @CRLF & _
"// в функции Метаданные.НайтиПоПолномуИмени;" & @CRLF & _
"// - Массив из Тип - типы, которые можно использовать в функции Метаданные.НайтиПоТипу." & @CRLF & _
"// ВызыватьИсключение - Булево - если Ложь, то несуществующие и неподдерживаемые объекты метаданных" & @CRLF & _
"// будут пропущены в возвращаемом значении." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - Строка - полное имя указанного объекта метаданных." & @CRLF & _
"// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - найденный идентификатор." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// ПолныеИмена = Новый Массив;" & @CRLF & _
"// ПолныеИмена.Добавить(Метаданные.Справочники.Валюты.ПолноеИмя());" & @CRLF & _
"// ПолныеИмена.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя());" & @CRLF & _
"// Идентификаторы = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИмена);" & @CRLF & _
"//" & @CRLF & _
"Функция ИдентификаторыОбъектовМетаданных(ОписаниеОбъектовМетаданных, ВызыватьИсключение = Истина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторыОбъектовМетаданных(" & @CRLF & _
" ОписаниеОбъектовМетаданных, ВызыватьИсключение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает объект метаданных по переданному идентификатору." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Идентификатор - СправочникСсылка.ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор" & @CRLF & _
"// объекта метаданных конфигурации или расширения конфигурации." & @CRLF & _
"//" & @CRLF & _
"// ВызыватьИсключение - Булево - если Ложь, тогда в случае, когда объект метаданных" & @CRLF & _
"// не существует или недоступен, возвращает соответственно" & @CRLF & _
"// Null или Неопределено вместо вызова исключения." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОбъектМетаданных - объект метаданных, соответствующий идентификатору." & @CRLF & _
"//" & @CRLF & _
"// Null - возвращается, когда ВызыватьИсключение = Ложь. Обозначает, что" & @CRLF & _
"// для указанного идентификатора объект метаданных не существует (идентификатор устарел)." & @CRLF & _
"//" & @CRLF & _
"// Неопределено - возвращается, когда ВызыватьИсключение = Ложь. Обозначает," & @CRLF & _
"// что идентификатор действующий, но в текущем сеансе ОбъектМетаданных не может быть получен." & @CRLF & _
"// Для расширений конфигурации это значит, что расширение установлено, но не подключено," & @CRLF & _
"// либо потому что перезапуск еще не выполнен, либо при подключении произошла ошибка." & @CRLF & _
"// Для конфигурации это значит, что в новом сеансе (новом динамическом поколении) объект" & @CRLF & _
"// метаданных имеется, а в текущем (старом) сеансе нет." & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектМетаданныхПоИдентификатору(Идентификатор, ВызыватьИсключение = Истина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ОбъектМетаданныхПоИдентификатору(" & @CRLF & _
" Идентификатор, ВызыватьИсключение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает объекты метаданных по переданным идентификаторам." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Идентификаторы - Массив - со значениями:" & @CRLF & _
"// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификаторы" & @CRLF & _
"// объектов метаданных конфигурации или расширений конфигурации." & @CRLF & _
"//" & @CRLF & _
"// ВызыватьИсключение - Булево - если Ложь, тогда в случае, когда объект метаданных" & @CRLF & _
"// не существует или недоступен, возвращает соответственно" & @CRLF & _
"// Null или Неопределено вместо вызова исключения." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - переданный идентификатор." & @CRLF & _
"// * Значение - ОбъектМетаданных - объект метаданных, соответствующий идентификатору." & @CRLF & _
"// - Null - возвращается, когда ВызыватьИсключение = Ложь. Обозначает, что" & @CRLF & _
"// для указанного идентификатора объект метаданных не существует (идентификатор устарел)." & @CRLF & _
"// - Неопределено - возвращается, когда ВызыватьИсключение = Ложь. Обозначает," & @CRLF & _
"// что идентификатор действующий, но в текущем сеансе ОбъектМетаданных не может быть получен." & @CRLF & _
"// Для расширений конфигурации это значит, что расширение установлено, но не подключено," & @CRLF & _
"// либо потому что перезапуск еще не выполнен, либо при подключении произошла ошибка." & @CRLF & _
"// Для конфигурации это значит, что в новом сеансе (новом динамическом поколении) объект" & @CRLF & _
"// метаданных имеется, а в текущем (старом) сеансе нет." & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектыМетаданныхПоИдентификаторам(Идентификаторы, ВызыватьИсключение = Истина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ОбъектыМетаданныхПоИдентификаторам(" & @CRLF & _
" Идентификаторы, ВызыватьИсключение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает ОбъектМетаданных, быстро найденный по полному имени." & @CRLF & _
"// Более производительный аналог метода платформы Метаданные.НайтиПоПолномуИмени" & @CRLF & _
"// для корневых объектов метаданных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПолноеИмя - Строка - полное имя объекта метаданных, например, Справочник.Организации" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОбъектМетаданных - когда найден" & @CRLF & _
"// Неопределено - когда не найден" & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) Экспорт" & @CRLF & _
" " & @CRLF & _
" ПозицияТочки = СтрНайти(ПолноеИмя, ".");" & @CRLF & _
" ИмяБазовогоТипа = Лев(ПолноеИмя, ПозицияТочки - 1);" & @CRLF & _
" " & @CRLF & _
" ИменаКоллекций = СтандартныеПодсистемыПовтИсп.ИменаКоллекцийПоИменамБазовыхТипов();" & @CRLF & _
" Коллекция = ИменаКоллекций.Получить(ВРег(ИмяБазовогоТипа));" & @CRLF & _
" " & @CRLF & _
" Если Коллекция <> Неопределено Тогда" & @CRLF & _
" Если Коллекция <> "Подсистемы" Тогда" & @CRLF & _
" ИмяОбъекта = Сред(ПолноеИмя, ПозицияТочки + 1);" & @CRLF & _
" ОбъектМетаданных = Метаданные[Коллекция].Найти(ИмяОбъекта);" & @CRLF & _
" Иначе" & @CRLF & _
" ИменаПодсистем = СтрРазделить(ВРег(ПолноеИмя), ".");" & @CRLF & _
" Количество = ИменаПодсистем.Количество();" & @CRLF & _
" Подсистема = Метаданные;" & @CRLF & _
" ОбъектМетаданных = Неопределено;" & @CRLF & _
" Индекс = 0;" & @CRLF & _
" Пока Истина Цикл" & @CRLF & _
" Индекс = Индекс + 1;" & @CRLF & _
" Если Индекс >= Количество Тогда" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИмяПодсистемы = ИменаПодсистем[Индекс];" & @CRLF & _
" Подсистема = Подсистема.Подсистемы.Найти(ИмяПодсистемы);" & @CRLF & _
" Если Подсистема = Неопределено Тогда" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Индекс = Индекс + 1;" & @CRLF & _
" Если Индекс = Количество Тогда" & @CRLF & _
" ОбъектМетаданных = Подсистема;" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ОбъектМетаданных = Неопределено Тогда" & @CRLF & _
" ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ОбъектМетаданных;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Определяет доступность объекта метаданных по функциональным опциям." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных" & @CRLF & _
"// - Строка - проверяемый объект метаданных." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если объект доступен." & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектМетаданныхДоступенПоФункциональнымОпциям(Знач ОбъектМетаданных) Экспорт" & @CRLF & _
" Если ОбъектМетаданных = Неопределено Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Если ТипЗнч(ОбъектМетаданных) <> Тип("Строка") Тогда" & @CRLF & _
" ПолноеИмя = ОбъектМетаданных.ПолноеИмя();" & @CRLF & _
" Иначе" & @CRLF & _
" ПолноеИмя = ОбъектМетаданных;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат СтандартныеПодсистемыПовтИсп.ДоступностьОбъектовПоОпциям().Получить(ПолноеИмя) <> Ложь;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Добавляет описание переименования объекта метаданных при переходе на указанную версию конфигурации." & @CRLF & _
"// Добавление выполняется в структуру Итог, которая передается в" & @CRLF & _
"// процедуру ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Итог - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.Итог" & @CRLF & _
"// ВерсияИБ - Строка - версия конечной конфигурации, при переходе на которую нужно" & @CRLF & _
"// выполнить переименование, например, "2.1.2.14"." & @CRLF & _
"// СтароеПолноеИмя - Строка - старое полное имя объекта метаданных, которое нужно переименовать," & @CRLF & _
"// например "Подсистема._ДемоПодсистемы"." & @CRLF & _
"// НовоеПолноеИмя - Строка - новое полное имя объекта метаданных, на которое нужно переименовать," & @CRLF & _
"// например "Подсистема._ДемоСервисныеПодсистемы"." & @CRLF & _
"// ИдентификаторБиблиотеки - Строка - внутренний идентификатор библиотеки, к которой относится ВерсияИБ." & @CRLF & _
"// Для основной конфигурации не требуется." & @CRLF & _
"// Например, "СтандартныеПодсистемы" - как указано" & @CRLF & _
"// в ОбновлениеИнформационнойБазыБСП.ПриДобавленииПодсистемы." & @CRLF & _
"// Пример:" & @CRLF & _
"// ОбщегоНазначения.ДобавитьПереименование(Итог, "2.1.2.14"," & @CRLF & _
"// "Подсистема._ДемоПодсистемы"," & @CRLF & _
"// "Подсистема._ДемоСервисныеПодсистемы");" & @CRLF & _
"//" & @CRLF & _
"Процедура ДобавитьПереименование(Итог, ВерсияИБ, СтароеПолноеИмя, НовоеПолноеИмя, ИдентификаторБиблиотеки = "") Экспорт" & @CRLF & _
" " & @CRLF & _
" Справочники.ИдентификаторыОбъектовМетаданных.ДобавитьПереименование(Итог," & @CRLF & _
" ВерсияИБ, СтароеПолноеИмя, НовоеПолноеИмя, ИдентификаторБиблиотеки);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает строковое представление типа, например, "СправочникСсылка.ИмяОбъекта", "ДокументСсылка.ИмяОбъекта"." & @CRLF & _
"// Для остальных типов приводит тип к строке, например "Число"." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Тип - Тип - для которого надо получить представление." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка" & @CRLF & _
"//" & @CRLF & _
"Функция СтроковоеПредставлениеТипа(Тип) Экспорт" & @CRLF & _
" " & @CRLF & _
" Представление = "";" & @CRLF & _
" " & @CRLF & _
" Если ЭтоСсылка(Тип) Тогда" & @CRLF & _
" " & @CRLF & _
" ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();" & @CRLF & _
" ИмяОбъекта = СтрРазделить(ПолноеИмя, ".")[1];" & @CRLF & _
" " & @CRLF & _
" Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "СправочникСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ДокументСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "БизнесПроцессСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ТочкаМаршрутаБизнесПроцессаСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ПланВидовХарактеристикСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ПланСчетовСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ПланВидовРасчетаСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ЗадачаСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ПланОбменаСсылка";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" Представление = "ПеречислениеСсылка";" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Результат = ?(Представление = "", Представление, Представление + "." + ИмяОбъекта);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Тип = Тип("Неопределено") Тогда" & @CRLF & _
" Результат = "Неопределено";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Тип = Тип("Строка") Тогда" & @CRLF & _
" Результат = "Строка";" & @CRLF & _
"" & @CRLF & _
" ИначеЕсли Тип = Тип("Число") Тогда" & @CRLF & _
" Результат = "Число";" & @CRLF & _
"" & @CRLF & _
" ИначеЕсли Тип = Тип("Булево") Тогда" & @CRLF & _
" Результат = "Булево";" & @CRLF & _
"" & @CRLF & _
" ИначеЕсли Тип = Тип("Дата") Тогда" & @CRLF & _
" Результат = "Дата";" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" Результат = Строка(Тип);" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает таблицу значений с описанием требуемых свойств всех реквизитов объекта метаданных." & @CRLF & _
"// Получает значения свойств стандартных реквизитов и пользовательских реквизитов (созданных в режиме конфигуратора)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо получить значение свойств реквизитов." & @CRLF & _
"// Например: Метаданные.Документ.РеализацияТоваровИУслуг" & @CRLF & _
"// Свойства - Строка - свойства реквизитов, перечисленные через запятую, значение которых необходимо получить." & @CRLF & _
"// Например: "Имя, Тип, Синоним, Подсказка"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ТаблицаЗначений - описание требуемых свойств всех реквизитов объекта метаданных." & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеСвойствОбъекта(ОбъектМетаданных, Свойства) Экспорт" & @CRLF & _
" " & @CRLF & _
" МассивСвойств = СтрРазделить(Свойства, ",");" & @CRLF & _
" " & @CRLF & _
" // Возвращаемое значение функции." & @CRLF & _
" ТаблицаОписанияСвойствОбъекта = Новый ТаблицаЗначений;" & @CRLF & _
" " & @CRLF & _
" // Добавляем в таблицу поля согласно именам переданных свойств." & @CRLF & _
" Для Каждого ИмяСвойства Из МассивСвойств Цикл" & @CRLF & _
" ТаблицаОписанияСвойствОбъекта.Колонки.Добавить(СокрЛП(ИмяСвойства));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Заполняем строку таблицы свойствами реквизитов объекта метаданных." & @CRLF & _
" Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ТаблицаОписанияСвойствОбъекта.Добавить(), Реквизит);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Заполняем строку таблицы свойствами стандартных реквизитов объекта метаданных." & @CRLF & _
" Для Каждого Реквизит Из ОбъектМетаданных.СтандартныеРеквизиты Цикл" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ТаблицаОписанияСвойствОбъекта.Добавить(), Реквизит);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ТаблицаОписанияСвойствОбъекта;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает признак того, что реквизит входит в подмножество стандартных реквизитов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СтандартныеРеквизиты - ОписанияСтандартныхРеквизитов - тип и значение, описывающие коллекцию настроек различных" & @CRLF & _
"// стандартных реквизитов;" & @CRLF & _
"// ИмяРеквизита - Строка - реквизит, который необходимо проверить на принадлежность множеству стандартных" & @CRLF & _
"// реквизитов." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если реквизит входит в подмножество стандартных реквизитов." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоСтандартныйРеквизит(СтандартныеРеквизиты, ИмяРеквизита) Экспорт" & @CRLF & _
" " & @CRLF & _
" Для Каждого Реквизит Из СтандартныеРеквизиты Цикл" & @CRLF & _
" Если Реквизит.Имя = ИмяРеквизита Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Позволяет определить, есть ли среди реквизитов объекта реквизит с переданным именем." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяРеквизита - Строка - имя реквизита;" & @CRLF & _
"// МетаданныеОбъекта - ОбъектМетаданных - объект, в котором требуется проверить наличие реквизита." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если есть." & @CRLF & _
"//" & @CRLF & _
"Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт" & @CRLF & _
"" & @CRLF & _
" Реквизиты = МетаданныеОбъекта.Реквизиты; // КоллекцияОбъектовМетаданных" & @CRLF & _
" Возврат НЕ (Реквизиты.Найти(ИмяРеквизита) = Неопределено);" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверить, что описание типа состоит из единственного типа значения и " & @CRLF & _
"// совпадает с нужным типом." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОписаниеТипа - ОписаниеТипов - проверяемая коллекция типов;" & @CRLF & _
"// ТипЗначения - Тип - проверяемый тип." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если совпадает." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Если ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип("Булево") Тогда" & @CRLF & _
"// // Выводим поле в виде флажка." & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеТипаСостоитИзТипа(ОписаниеТипа, ТипЗначения) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ОписаниеТипа.Типы().Количество() = 1" & @CRLF & _
" И ОписаниеТипа.Типы().Получить(0) = ТипЗначения Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Создает объект ОписаниеТипов, содержащий тип Строка." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ДлинаСтроки - Число - длина строки." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОписаниеТипов - описание типа Строка." & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеТипаСтрока(ДлинаСтроки) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(ДлинаСтроки));" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Создает объект ОписаниеТипов, содержащий тип Число." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Разрядность - Число - общее количество разрядов числа (количество разрядов" & @CRLF & _
"// целой части плюс количество разрядов дробной части)." & @CRLF & _
"// РазрядностьДробнойЧасти - Число - число разрядов дробной части." & @CRLF & _
"// ЗнакЧисла - ДопустимыйЗнак - допустимый знак числа." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОписаниеТипов - описание типа Число." & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, Знач ЗнакЧисла = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ЗнакЧисла = Неопределено Тогда " & @CRLF & _
" ЗнакЧисла = ДопустимыйЗнак.Любой;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти, ЗнакЧисла));" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Создает объект ОписаниеТипов, содержащий тип Дата." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ЧастиДаты - ЧастиДаты - набор вариантов использования значений типа Дата." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОписаниеТипов - описание типа Дата." & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеТипаДата(ЧастиДаты) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты));" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает описание типа, включающего в себя все возможные ссылочные типы конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОписаниеТипов - все ссылочные типы конфигурации." & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеТипаВсеСсылки() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат СтандартныеПодсистемыПовтИсп.ОписаниеТипаВсеСсылки();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает строковое представление списка, заданное в свойствах объекта метаданных." & @CRLF & _
"// В зависимости от того, какие свойства объекта метаданных заполнены, функция возвращают одно из них в указанном" & @CRLF & _
"// порядке: Расширенное представление списка, Представление списка, Синоним или Имя." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - произвольный объект." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - представление списка." & @CRLF & _
"//" & @CRLF & _
"Функция ПредставлениеСписка(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" СвойстваОбъекта = Новый Структура("РасширенноеПредставлениеСписка,ПредставлениеСписка");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(СвойстваОбъекта.РасширенноеПредставлениеСписка) Тогда" & @CRLF & _
" Результат = СвойстваОбъекта.РасширенноеПредставлениеСписка;" & @CRLF & _
" ИначеЕсли ЗначениеЗаполнено(СвойстваОбъекта.ПредставлениеСписка) Тогда" & @CRLF & _
" Результат = СвойстваОбъекта.ПредставлениеСписка;" & @CRLF & _
" Иначе" & @CRLF & _
" Результат = ОбъектМетаданных.Представление();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает строковое представление объекта, заданное в свойствах объекта метаданных." & @CRLF & _
"// В зависимости от того, какие свойства объекта метаданных заполнены, функция возвращают одно из них в указанном" & @CRLF & _
"// порядке: Расширенное представление объекта, Представление объекта, Синоним или Имя." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных - произвольный объект." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - представление объекта." & @CRLF & _
"//" & @CRLF & _
"Функция ПредставлениеОбъекта(ОбъектМетаданных) Экспорт" & @CRLF & _
" " & @CRLF & _
" СвойстваОбъекта = Новый Структура("РасширенноеПредставлениеОбъекта,ПредставлениеОбъекта");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(СвойстваОбъекта.РасширенноеПредставлениеОбъекта) Тогда" & @CRLF & _
" Результат = СвойстваОбъекта.РасширенноеПредставлениеОбъекта;" & @CRLF & _
" ИначеЕсли ЗначениеЗаполнено(СвойстваОбъекта.ПредставлениеОбъекта) Тогда" & @CRLF & _
" Результат = СвойстваОбъекта.ПредставлениеОбъекта;" & @CRLF & _
" Иначе" & @CRLF & _
" Результат = ОбъектМетаданных.Представление();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ХранилищеНастроек" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Сохранение, чтение и удаление настроек из хранилищ." & @CRLF & _
"" & @CRLF & _
"// Сохраняет настройку в хранилище общих настроек, как метод платформы Сохранить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// Настройки - Произвольный - см. синтакс-помощник платформы." & @CRLF & _
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки," & @CRLF & _
" ОписаниеНастроек = Неопределено," & @CRLF & _
" ИмяПользователя = Неопределено," & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" ХранилищеСохранить(ХранилищеОбщихНастроек," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" Настройки," & @CRLF & _
" ОписаниеНастроек," & @CRLF & _
" ИмяПользователя," & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Сохраняет несколько настроек в хранилище общих настроек, как метод платформы Сохранить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// НесколькоНастроек - Массив - со значениями:" & @CRLF & _
"// * Значение - Структура:" & @CRLF & _
"// * Объект - Строка - см. параметр КлючОбъекта в синтакс-помощнике платформы." & @CRLF & _
"// * Настройка - Строка - см. параметр КлючНастроек в синтакс-помощнике платформы." & @CRLF & _
"// * Значение - Произвольный - см. параметр Настройки в синтакс-помощнике платформы." & @CRLF & _
"//" & @CRLF & _
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеОбщихНастроекСохранитьМассив(НесколькоНастроек," & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Элемент Из НесколькоНастроек Цикл" & @CRLF & _
" ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, КлючНастроек(Элемент.Настройка), Элемент.Значение);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ОбновитьПовторноИспользуемыеЗначения Тогда" & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Загружает настройку из хранилища общих настроек, как метод платформы Загрузить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Кроме того, возвращает указанное значение по умолчанию, если настройки не существуют." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки." & @CRLF & _
"//" & @CRLF & _
"// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно" & @CRLF & _
"// - возвращаемая ссылка заменяется на указанное значение по умолчанию;" & @CRLF & _
"// - из данных типа Массив ссылки удаляются;" & @CRLF & _
"// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;" & @CRLF & _
"// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не существуют." & @CRLF & _
"// Если не указано, возвращается значение Неопределено." & @CRLF & _
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Произвольный - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, " & @CRLF & _
" ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ХранилищеЗагрузить(ХранилищеОбщихНастроек," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" ЗначениеПоУмолчанию," & @CRLF & _
" ОписаниеНастроек," & @CRLF & _
" ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Удаляет настройку из хранилища общих настроек, как метод платформы Удалить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт" & @CRLF & _
" " & @CRLF & _
" ХранилищеУдалить(ХранилищеОбщихНастроек," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Сохраняет настройку в хранилище системных настроек, как метод платформы Сохранить" & @CRLF & _
"// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек" & @CRLF & _
"// более 128 символов путем хеширования части, которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// Настройки - Произвольный - см. синтакс-помощник платформы." & @CRLF & _
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки," & @CRLF & _
" ОписаниеНастроек = Неопределено," & @CRLF & _
" ИмяПользователя = Неопределено," & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" ХранилищеСохранить(ХранилищеСистемныхНастроек, " & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" Настройки," & @CRLF & _
" ОписаниеНастроек," & @CRLF & _
" ИмяПользователя," & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Загружает настройку из хранилища системных настроек, как метод платформы Загрузить," & @CRLF & _
"// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек" & @CRLF & _
"// более 128 символов путем хеширования части, которая превышает 96 символов." & @CRLF & _
"// Кроме того, возвращает указанное значение по умолчанию, если настройки не существуют." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки." & @CRLF & _
"//" & @CRLF & _
"// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно:" & @CRLF & _
"// - возвращаемая ссылка заменяется на указанное значение по умолчанию;" & @CRLF & _
"// - из данных типа Массив ссылки удаляются;" & @CRLF & _
"// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;" & @CRLF & _
"// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не существуют." & @CRLF & _
"// Если не указано, возвращается значение Неопределено." & @CRLF & _
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Произвольный - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"Функция ХранилищеСистемныхНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, " & @CRLF & _
" ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ХранилищеЗагрузить(ХранилищеСистемныхНастроек," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" ЗначениеПоУмолчанию," & @CRLF & _
" ОписаниеНастроек," & @CRLF & _
" ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Удаляет настройку из хранилища системных настроек, как метод платформы Удалить," & @CRLF & _
"// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек" & @CRLF & _
"// более 128 символов путем хеширования части, которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт" & @CRLF & _
" " & @CRLF & _
" ХранилищеУдалить(ХранилищеСистемныхНастроек," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Сохраняет настройку в хранилище настроек данных форм, как метод платформы Сохранить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// Настройки - Произвольный - см. синтакс-помощник платформы." & @CRLF & _
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки," & @CRLF & _
" ОписаниеНастроек = Неопределено," & @CRLF & _
" ИмяПользователя = Неопределено, " & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" ХранилищеСохранить(ХранилищеНастроекДанныхФорм," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" Настройки," & @CRLF & _
" ОписаниеНастроек," & @CRLF & _
" ИмяПользователя," & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Загружает настройку из хранилища настроек данных форм, как метод платформы Загрузить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Кроме того, возвращает указанное значение по умолчанию, если настройки не существуют." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки." & @CRLF & _
"//" & @CRLF & _
"// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно" & @CRLF & _
"// - возвращаемая ссылка заменяется на указанное значение по умолчанию;" & @CRLF & _
"// - из данных типа Массив ссылки удаляются;" & @CRLF & _
"// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;" & @CRLF & _
"// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка - см. синтакс-помощник платформы." & @CRLF & _
"// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не существуют." & @CRLF & _
"// Если не указано, возвращается значение Неопределено." & @CRLF & _
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Произвольный - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, " & @CRLF & _
" ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ХранилищеЗагрузить(ХранилищеНастроекДанныхФорм," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" ЗначениеПоУмолчанию," & @CRLF & _
" ОписаниеНастроек, " & @CRLF & _
" ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Удаляет настройку из хранилища настроек данных форм, как метод платформы Удалить," & @CRLF & _
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>," & @CRLF & _
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части," & @CRLF & _
"// которая превышает 96 символов." & @CRLF & _
"// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КлючОбъекта - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"// КлючНастроек - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"// ИмяПользователя - Строка" & @CRLF & _
"// - Неопределено - см. синтакс-помощник платформы." & @CRLF & _
"//" & @CRLF & _
"Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт" & @CRLF & _
" " & @CRLF & _
" ХранилищеУдалить(ХранилищеНастроекДанныхФорм," & @CRLF & _
" КлючОбъекта," & @CRLF & _
" КлючНастроек," & @CRLF & _
" ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область СериализацияXML" & @CRLF & _
"" & @CRLF & _
"// Преобразует (сериализует) любое значение в XML-строку." & @CRLF & _
"// Преобразованы в могут быть только те объекты, для которых в синтакс-помощнике указано, что они сериализуются." & @CRLF & _
"// См. также ЗначениеИзСтрокиXML." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - XML-строка." & @CRLF & _
"//" & @CRLF & _
"Функция ЗначениеВСтрокуXML(Значение) Экспорт" & @CRLF & _
" " & @CRLF & _
" ЗаписьXML = Новый ЗаписьXML;" & @CRLF & _
" ЗаписьXML.УстановитьСтроку();" & @CRLF & _
" СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);" & @CRLF & _
" " & @CRLF & _
" Возврат ЗаписьXML.Закрыть();" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Выполняет преобразование (десериализацию) XML-строки в значение." & @CRLF & _
"// См. также ЗначениеВСтрокуXML." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СтрокаXML - Строка - XML-строка, с сериализованным объектом.." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный - значение, полученное из переданной XML-строки." & @CRLF & _
"//" & @CRLF & _
"Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт" & @CRLF & _
" " & @CRLF & _
" ЧтениеXML = Новый ЧтениеXML;" & @CRLF & _
" ЧтениеXML.УстановитьСтроку(СтрокаXML);" & @CRLF & _
" " & @CRLF & _
" Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает XML-представление XDTO-объекта." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектXDTO - ОбъектXDTO - объект, для которого требуется сформировать XML-представление." & @CRLF & _
"// Фабрика - ФабрикаXDTO - фабрика, с использованием которой требуется формировать XML-представление." & @CRLF & _
"// Если параметр не указан - будет использоваться глобальная фабрика XDTO." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Строка - XML-представление XDTO-объекта." & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектXDTOВСтрокуXML(Знач ОбъектXDTO, Знач Фабрика = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбъектXDTO.Проверить();" & @CRLF & _
" " & @CRLF & _
" Если Фабрика = Неопределено Тогда" & @CRLF & _
" Фабрика = ФабрикаXDTO;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Запись = Новый ЗаписьXML();" & @CRLF & _
" Запись.УстановитьСтроку();" & @CRLF & _
" Фабрика.ЗаписатьXML(Запись, ОбъектXDTO, , , , НазначениеТипаXML.Явное);" & @CRLF & _
" " & @CRLF & _
" Возврат Запись.Закрыть();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Формирует XDTO-объект по XML-представлению." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СтрокаXML - Строка - XML-представление XDTO-объекта," & @CRLF & _
"// Фабрика - ФабрикаXDTO - фабрика, с использованием которой требуется формировать XDTO-объект." & @CRLF & _
"// Если параметр не указан - будет использоваться глобальная фабрика XDTO." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// ОбъектXDTO - XDTO-объект." & @CRLF & _
"//" & @CRLF & _
"Функция ОбъектXDTOИзСтрокиXML(Знач СтрокаXML, Знач Фабрика = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Фабрика = Неопределено Тогда" & @CRLF & _
" Фабрика = ФабрикаXDTO;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Чтение = Новый ЧтениеXML();" & @CRLF & _
" Чтение.УстановитьСтроку(СтрокаXML);" & @CRLF & _
" " & @CRLF & _
" Возврат Фабрика.ПрочитатьXML(Чтение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область СериализацияJSON" & @CRLF & _
"" & @CRLF & _
"// Преобразует значение в строку JSON при помощи метода глобального контекста ЗаписатьJSON." & @CRLF & _
"// Допускаются не все типы значений, подробности см. в синтакс-помощнике." & @CRLF & _
"// Даты преобразуются в формат ISO (YYYY-MM-DDThh:mm:ssZ)." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Значение - Произвольный" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка" & @CRLF & _
"//" & @CRLF & _
"Функция ЗначениеВJSON(Знач Значение) Экспорт" & @CRLF & _
" " & @CRLF & _
" ЗаписьJSON = Новый ЗаписьJSON;" & @CRLF & _
" ЗаписьJSON.УстановитьСтроку();" & @CRLF & _
" ЗаписатьJSON(ЗаписьJSON, Значение);" & @CRLF & _
" " & @CRLF & _
" Возврат ЗаписьJSON.Закрыть();" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Преобразует строку в формате JSON в значение при помощи метода глобального контекста ПрочитатьJSON." & @CRLF & _
"// См. ограничения в синтакс-помощнике." & @CRLF & _
"// Объекты JSON по умолчанию преобразует в значения типа Соответствие. " & @CRLF & _
"// Имена свойств со значением типа Дата необходимо явно указывать, чтобы было выполнено преобразование." & @CRLF & _
"// Ожидаемый формат дат - ISO (YYYY-MM-DDThh:mm:ssZ)." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Строка - Строка - значение в формате JSON." & @CRLF & _
"// ИменаСвойствСоЗначениямиДата - Строка - имя свойства, содержащее значение типа Дата. Допустимо указывать несколько" & @CRLF & _
"// свойств через запятую." & @CRLF & _
"// - Массив из Строка " & @CRLF & _
"// ПрочитатьВСоответствие - Булево - если Ложь, то объекты JSON будут преобразованы в значение типа Структура." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный" & @CRLF & _
"//" & @CRLF & _
"Функция JSONВЗначение(Знач Строка, Знач ИменаСвойствСоЗначениямиДата = Неопределено, Знач ПрочитатьВСоответствие = Истина) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(ИменаСвойствСоЗначениямиДата) = Тип("Строка") Тогда" & @CRLF & _
" ИменаСвойствСоЗначениямиДата = СтрРазделить(ИменаСвойствСоЗначениямиДата, ", " + Символы.ПС, Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЧтениеJSON = Новый ЧтениеJSON;" & @CRLF & _
" ЧтениеJSON.УстановитьСтроку(Строка);" & @CRLF & _
" " & @CRLF & _
" Возврат ПрочитатьJSON(ЧтениеJSON, ПрочитатьВСоответствие, ИменаСвойствСоЗначениямиДата);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ВебСервисы" & @CRLF & _
"" & @CRLF & _
"// Возвращает структуру параметров для функции СоздатьWSПрокси." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// см. СоздатьWSПрокси.ПараметрыПодключенияWSПрокси" & @CRLF & _
"//" & @CRLF & _
"Функция ПараметрыПодключенияWSПрокси() Экспорт" & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("АдресWSDL");" & @CRLF & _
" Результат.Вставить("URIПространстваИмен");" & @CRLF & _
" Результат.Вставить("ИмяСервиса");" & @CRLF & _
" Результат.Вставить("ИмяТочкиПодключения", "");" & @CRLF & _
" Результат.Вставить("ИмяПользователя");" & @CRLF & _
" Результат.Вставить("Пароль");" & @CRLF & _
" Результат.Вставить("Таймаут", 0);" & @CRLF & _
" Результат.Вставить("Местоположение");" & @CRLF & _
" Результат.Вставить("ИспользоватьАутентификациюОС", Ложь);" & @CRLF & _
" Результат.Вставить("ДелатьКонтрольныйВызов", Ложь);" & @CRLF & _
" Результат.Вставить("ЗащищенноеСоединение", Неопределено);" & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Конструктор объекта WSПрокси с дополнительными возможностями по сравнению с конструктором Новый WSПрокси:" & @CRLF & _
"// - создает WSОпределения;" & @CRLF & _
"// - кэширует файл WSDL для ускорения работы с веб-сервисом;" & @CRLF & _
"// - не требуется указание ИнтернетПрокси (используется автоматически, если настроен);" & @CRLF & _
"// - позволяет делать быструю проверку доступности сервиса с помощью операции Ping." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПараметрыПодключенияWSПрокси - Структура:" & @CRLF & _
"// * АдресWSDL - Строка - месторасположение wsdl, например, "http://webservice.net/webservice.asmx?wsdl"." & @CRLF & _
"// * URIПространстваИмен - Строка - URI пространства имен web-сервиса, например, "http://www.webservice.net/WebService/1.0.0.1"." & @CRLF & _
"// * ИмяСервиса - Строка - имя сервиса, например, "WebService_1_0_0_1"." & @CRLF & _
"// * ИмяТочкиПодключения - Строка - необязательный параметр. Если не задано, образуется как "<ИмяСервиса>Soap"." & @CRLF & _
"// * ИмяПользователя - Строка - необязательный параметр. Имя пользователя для входа на сервер." & @CRLF & _
"// * Пароль - Строка - необязательный параметр. Пароль пользователя." & @CRLF & _
"// * Таймаут - Число - необязательный параметр. Таймаут на операции веб-сервиса, выполняемые " & @CRLF & _
"// через прокси. В секундах. " & @CRLF & _
"// * Местоположение - Строка - необязательный параметр. Фактический адрес сервиса. Используется, если" & @CRLF & _
"// адрес реального расположения сервиса отличается от адреса, который указан" & @CRLF & _
"// в WSDL-файле." & @CRLF & _
"// * ИспользоватьАутентификациюОС - Булево - необязательный параметр. Включает использование авторизации NTLM или " & @CRLF & _
"// Negotiate на сервере." & @CRLF & _
"// * ДелатьКонтрольныйВызов - Булево - необязательный параметр. Выполнять проверку доступности сервиса (требуется " & @CRLF & _
"// поддержка команды Ping в веб-сервисе). По умолчанию, Ложь." & @CRLF & _
"// * ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL" & @CRLF & _
"// - Неопределено - необязательные параметры защищенного соединения." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// WSПрокси" & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси();" & @CRLF & _
"// ПараметрыПодключения.АдресWSDL = "http://webservice.net/webservice.asmx?wsdl";" & @CRLF & _
"// ПараметрыПодключения.URIПространстваИмен = "http://www.webservice.net/WebService/1.0.0.1";" & @CRLF & _
"// ПараметрыПодключения.ИмяСервиса = "WebService_1_0_0_1";" & @CRLF & _
"// ПараметрыПодключения.Таймаут = 20;" & @CRLF & _
"// Прокси = ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения);" & @CRLF & _
"//" & @CRLF & _
"Функция СоздатьWSПрокси(Знач ПараметрыПодключенияWSПрокси) Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СоздатьWSПрокси", "Параметры", ПараметрыПодключенияWSПрокси, Тип("Структура")," & @CRLF & _
" Новый Структура("АдресWSDL,URIПространстваИмен,ИмяСервиса", Тип("Строка"), Тип("Строка"), Тип("Строка")));" & @CRLF & _
" " & @CRLF & _
" ПараметрыПодключения = ПараметрыПодключенияWSПрокси();" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ПараметрыПодключения, ПараметрыПодключенияWSПрокси);" & @CRLF & _
" " & @CRLF & _
" ДелатьКонтрольныйВызов = ПараметрыПодключения.ДелатьКонтрольныйВызов;" & @CRLF & _
" Таймаут = ПараметрыПодключения.Таймаут;" & @CRLF & _
" " & @CRLF & _
" Если ДелатьКонтрольныйВызов И Таймаут <> Неопределено И Таймаут > 20 Тогда" & @CRLF & _
" ПараметрыПодключения.Таймаут = 7;" & @CRLF & _
" WSПроксиPing = РегистрыСведений.КэшПрограммныхИнтерфейсов.ВнутренняяWSПрокси(ПараметрыПодключения);" & @CRLF & _
" Попытка" & @CRLF & _
" WSПроксиPing.Ping();" & @CRLF & _
" Исключение" & @CRLF & _
" АдресТочкиПодключения = WSПроксиPing.ТочкаПодключения.Местоположение;" & @CRLF & _
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Не удалось проверить доступность web-сервиса" & @CRLF & _
" |%1" & @CRLF & _
" |по причине:" & @CRLF & _
" |%2'")," & @CRLF & _
" ПараметрыПодключения.АдресWSDL," & @CRLF & _
" ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда" & @CRLF & _
" МодульПолучениеФайловИзИнтернета = ОбщийМодуль("ПолучениеФайловИзИнтернета");" & @CRLF & _
" РезультатДиагностики = МодульПолучениеФайловИзИнтернета.ДиагностикаСоединения(АдресТочкиПодключения);" & @CRLF & _
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = '%1" & @CRLF & _
" |Результат диагностики:" & @CRLF & _
" |%2'")," & @CRLF & _
" ТекстОшибки," & @CRLF & _
" РезультатДиагностики.ОписаниеОшибки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ВызватьИсключение ТекстОшибки;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" ПараметрыПодключения.Таймаут = Таймаут;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат РегистрыСведений.КэшПрограммныхИнтерфейсов.ВнутренняяWSПрокси(ПараметрыПодключения);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"/////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Версионирование программных интерфейсов." & @CRLF & _
"" & @CRLF & _
"// Возвращает номера версий программных интерфейсов удаленной системы, доступной через веб-сервис." & @CRLF & _
"// Позволяет обеспечивать полную обратную совместимость при изменениях в программных интерфейсах" & @CRLF & _
"// с помощью их явного версионирования. Например, если программный интерфейс выше определенной версии," & @CRLF & _
"// то только в этом случае допустимо вызывать у него новую функцию." & @CRLF & _
"//" & @CRLF & _
"// В целях экономии трафика при интенсивном взаимодействии между вызывающей и вызываемой сторонами " & @CRLF & _
"// сведения о версиях кэшируются на одни сутки. Если для целей отладки требуется сбросить кэш раньше этого времени," & @CRLF & _
"// следует удалить соответствующие записи из регистра сведений КэшПрограммныхИнтерфейсов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Адрес - Строка - адрес веб-сервиса версионирования интерфейсов InterfaceVersion;" & @CRLF & _
"// Пользователь - Строка - имя пользователя веб-сервиса;" & @CRLF & _
"// Пароль - Строка - пароль пользователя веб-сервиса;" & @CRLF & _
"// Интерфейс - Строка - имя запрашиваемого программного интерфейса, например, "СервисПередачиФайлов"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. " & @CRLF & _
"// Например, "1.0.2.1"." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Версии = ПолучитьВерсииИнтерфейса("http://vsrvx/sm", "ivanov",, "СервисПередачиФайлов");" & @CRLF & _
"//" & @CRLF & _
"// Также для обратной совместимости поддерживается устаревший вариант вызова:" & @CRLF & _
"// ПараметрыПодключения = Новый Структура;" & @CRLF & _
"// ПараметрыПодключения.Вставить("URL", "http://vsrvx/sm");" & @CRLF & _
"// ПараметрыПодключения.Вставить("UserName", "ivanov");" & @CRLF & _
"// ПараметрыПодключения.Вставить("Password", "");" & @CRLF & _
"// Версии = ПолучитьВерсииИнтерфейса(ПараметрыПодключения, "СервисПередачиФайлов");" & @CRLF & _
"//" & @CRLF & _
"Функция ПолучитьВерсииИнтерфейса(Знач Адрес, Знач Пользователь, Знач Пароль = Неопределено, Знач Интерфейс = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(Адрес) = Тип("Структура") Тогда // для обратной совместимости" & @CRLF & _
" ПараметрыПодключения = Адрес;" & @CRLF & _
" ИмяИнтерфейса = Пользователь;" & @CRLF & _
" Иначе" & @CRLF & _
" ПараметрыПодключения = Новый Структура;" & @CRLF & _
" ПараметрыПодключения.Вставить("URL", Адрес);" & @CRLF & _
" ПараметрыПодключения.Вставить("UserName", Пользователь);" & @CRLF & _
" ПараметрыПодключения.Вставить("Password", Пароль);" & @CRLF & _
" ИмяИнтерфейса = Интерфейс;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не ПараметрыПодключения.Свойство("URL") " & @CRLF & _
" Или Не ЗначениеЗаполнено(ПараметрыПодключения.URL) Тогда" & @CRLF & _
" " & @CRLF & _
" ВызватьИсключение(НСтр("ru = 'Не задан URL сервиса.'"));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПараметрыПолучения = Новый Массив;" & @CRLF & _
" ПараметрыПолучения.Добавить(ПараметрыПодключения);" & @CRLF & _
" ПараметрыПолучения.Добавить(ИмяИнтерфейса);" & @CRLF & _
" " & @CRLF & _
" Возврат РегистрыСведений.КэшПрограммныхИнтерфейсов.ДанныеКэшаВерсий(" & @CRLF & _
" РегистрыСведений.КэшПрограммныхИнтерфейсов.ИдентификаторЗаписиКэшаВерсий(ПараметрыПодключения.URL, ИмяИнтерфейса), " & @CRLF & _
" Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ВерсииИнтерфейса, " & @CRLF & _
" ПараметрыПолучения," & @CRLF & _
" Истина);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает номера версий программных интерфейсов удаленной системы, подключенной через внешнее соединение." & @CRLF & _
"// Позволяет обеспечивать полную обратную совместимость при изменениях в программных интерфейсах" & @CRLF & _
"// с помощью их явного версионирования. Например, если программный интерфейс выше определенной версии," & @CRLF & _
"// то только в этом случае допустимо вызывать у него новую функцию." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ВнешнееСоединение - COMОбъект - внешнее соединение, которое используется для работы с удаленной системой." & @CRLF & _
"// ИмяИнтерфейса - Строка - имя запрашиваемого программного интерфейса, например "СервисПередачиФайлов"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. " & @CRLF & _
"// Например "1.0.2.1"." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Версии = ОбщегоНазначения.ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, "СервисПередачиФайлов");" & @CRLF & _
"//" & @CRLF & _
"Функция ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, Знач ИмяИнтерфейса) Экспорт" & @CRLF & _
" Попытка" & @CRLF & _
" ВерсииИнтерфейсаXML = ВнешнееСоединение.СтандартныеПодсистемыСервер.ПоддерживаемыеВерсии(ИмяИнтерфейса);" & @CRLF & _
" Исключение" & @CRLF & _
" СтрокаСообщения = НСтр("ru = 'Корреспондент не поддерживает версионирование программных интерфейсов." & @CRLF & _
" |Описание ошибки: %1'");" & @CRLF & _
" СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение версий интерфейса'", КодОсновногоЯзыка())," & @CRLF & _
" УровеньЖурналаРегистрации.Ошибка, , , СтрокаСообщения);" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ФиксированныйМассив(Новый Массив);" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ФиксированныйМассив(ЗначениеИзСтрокиXML(ВерсииИнтерфейсаXML));" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Удаляет записи кэша версий программных интерфейсов, содержащих в идентификаторе указанную подстроку. " & @CRLF & _
"// В качестве подстроки может использоваться, например, имя интерфейса, более не используемого в конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПодстрокаПоискаИдентификаторов - Строка - подстрока поиска идентификаторов. " & @CRLF & _
"// Не может содержать символов %, _ и [." & @CRLF & _
"//" & @CRLF & _
"Процедура УдалитьЗаписиКэшаВерсий(Знач ПодстрокаПоискаИдентификаторов) Экспорт" & @CRLF & _
" " & @CRLF & _
" НачатьТранзакцию();" & @CRLF & _
" Попытка" & @CRLF & _
" " & @CRLF & _
" Блокировка = Новый БлокировкаДанных;" & @CRLF & _
" Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов");" & @CRLF & _
" Блокировка.Заблокировать();" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса =" & @CRLF & _
" "ВЫБРАТЬ" & @CRLF & _
" | ТаблицаКэша.Идентификатор КАК Идентификатор," & @CRLF & _
" | ТаблицаКэша.ТипДанных КАК ТипДанных" & @CRLF & _
" |ИЗ" & @CRLF & _
" | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | ТаблицаКэша.Идентификатор ПОДОБНО ""%ПодстрокаПоиска%"" СПЕЦСИМВОЛ ""~""";" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПодстрокаПоиска", " & @CRLF & _
" СформироватьСтрокуДляПоискаВЗапросе(ПодстрокаПоискаИдентификаторов));" & @CRLF & _
" Запрос = Новый Запрос(ТекстЗапроса);" & @CRLF & _
" Результат = Запрос.Выполнить();" & @CRLF & _
" Выборка = Результат.Выбрать();" & @CRLF & _
" Пока Выборка.Следующий() Цикл" & @CRLF & _
" Запись = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьМенеджерЗаписи();" & @CRLF & _
" Запись.Идентификатор = Выборка.Идентификатор;" & @CRLF & _
" Запись.ТипДанных = Выборка.ТипДанных;" & @CRLF & _
" Запись.Удалить();" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ЗафиксироватьТранзакцию();" & @CRLF & _
" Исключение" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область БезопасноеХранилище" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Процедуры и функции для работы с хранилищем паролей." & @CRLF & _
"" & @CRLF & _
"// Записывает конфиденциальные данные в безопасное хранилище." & @CRLF & _
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим." & @CRLF & _
"//" & @CRLF & _
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов)," & @CRLF & _
"// а доступно только коду, который делает обращения только к своей части данных и" & @CRLF & _
"// в том контексте, который предполагает чтение или запись конфиденциальных данных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Владелец - ПланОбменаСсылка" & @CRLF & _
"// - СправочникСсылка" & @CRLF & _
"// - Строка - ссылка на объект информационной базы," & @CRLF & _
"// представляющий объект-владелец сохраняемого пароля или строка до 128 символов." & @CRLF & _
"// Для объектов других типов в качестве владельца рекомендуется использовать ссылку на" & @CRLF & _
"// элемент метаданных этого типа в справочнике ИдентификаторыОбъектовМетаданных" & @CRLF & _
"// или ключ в виде строки с учетом имен подсистем." & @CRLF & _
"// Например, для БСП:" & @CRLF & _
"// Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.АдресныеОбъекты");" & @CRLF & _
"// если нужно 1 хранилище на подсистему БСП:" & @CRLF & _
"// Владелец = "СтандартныеПодсистемы.УправлениеДоступом";" & @CRLF & _
"// если нужно более 1 хранилища на подсистему БСП:" & @CRLF & _
"// Владелец = "СтандартныеПодсистемы.УправлениеДоступом.<Уточнение>";" & @CRLF & _
"// Данные - Произвольный - данные помещаемые в безопасное хранилище. Неопределенно - удаляет все данные." & @CRLF & _
"// Для удаления данных по ключу следует использовать процедуру УдалитьДанныеИзБезопасногоХранилища." & @CRLF & _
"// - Структура - если параметр Ключ содержит Неопределено. Подробнее см. описание параметра Ключ" & @CRLF & _
"// Ключ - Строка - ключ сохраняемых настроек, по умолчанию "Пароль"." & @CRLF & _
"// Ключ должен соответствовать правилам имен идентификаторов:" & @CRLF & _
"// 1. Первым символом ключа должна быть буква или символ подчеркивания (_)." & @CRLF & _
"// 2. Каждый из последующих символов может быть буквой, цифрой или символом подчеркивания (_). " & @CRLF & _
"// Неопределено - для добавления набора данных структурой, где ключ структуры - это имя ключа данных," & @CRLF & _
"// а значение - сохраняемые данные. Пример использования см. ниже." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"//" & @CRLF & _
"// Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)" & @CRLF & _
"// Если ТекущийПользовательМожетИзменятьПароль Тогда" & @CRLF & _
"// УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
"// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Логин, "Логин");" & @CRLF & _
"// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Пароль);" & @CRLF & _
"// УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"// КонецПроцедуры" & @CRLF & _
"// " & @CRLF & _
"// Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)" & @CRLF & _
"// Если ТекущийПользовательМожетИзменятьПароль Тогда" & @CRLF & _
"// ЛогинИПароль = Новый Структура;" & @CRLF & _
"// ЛогинИПароль.Вставить("Логин", Логин);" & @CRLF & _
"// ЛогинИПароль.Вставить("Пароль", Пароль);" & @CRLF & _
"// УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
"// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ЛогинИПароль, Неопределено);" & @CRLF & _
"// УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"// КонецПроцедуры" & @CRLF & _
"//" & @CRLF & _
"Процедура ЗаписатьДанныеВБезопасноеХранилище(Владелец, Данные, Ключ = "Пароль") Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец)," & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Недопустимое значение параметра %1 в %2." & @CRLF & _
" |параметр должен содержать ссылку; передано значение: %3 (тип %4).'")," & @CRLF & _
" "Владелец", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Владелец, ТипЗнч(Владелец)));" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(Ключ) Тогда" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Ключ) = Тип("Строка")," & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Недопустимое значение параметра %1 в %2." & @CRLF & _
" |параметр должен содержать строку; передано значение: %3 (тип %4).'")," & @CRLF & _
" "Ключ", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Ключ, ТипЗнч(Ключ))); " & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Данные) = Тип("Структура")," & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Недопустимое значение параметра %1 в %2." & @CRLF & _
" |Если Ключ = Неопределено, то параметр должен содержать структуру; передано значение: %3 (тип %4).'")," & @CRLF & _
" "Данные", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Данные, ТипЗнч(Данные)));" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЭтоОбластьДанных = РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных();" & @CRLF & _
" Если ЭтоОбластьДанных Тогда" & @CRLF & _
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи();" & @CRLF & _
" Иначе" & @CRLF & _
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" БезопасноеХранилищеДанных.Владелец = Владелец;" & @CRLF & _
" БезопасноеХранилищеДанных.Прочитать();" & @CRLF & _
" " & @CRLF & _
" Если Данные <> Неопределено Тогда" & @CRLF & _
" " & @CRLF & _
" Если БезопасноеХранилищеДанных.Выбран() Тогда" & @CRLF & _
" " & @CRLF & _
" ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить();" & @CRLF & _
" " & @CRLF & _
" Если ТипЗнч(ДанныеДляСохранения) <> Тип("Структура") Тогда" & @CRLF & _
" ДанныеДляСохранения = Новый Структура();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(Ключ) Тогда" & @CRLF & _
" ДанныеДляСохранения.Вставить(Ключ, Данные);" & @CRLF & _
" Иначе" & @CRLF & _
" ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ДанныеДляСохранения, Данные, Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6));" & @CRLF & _
" БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения;" & @CRLF & _
" БезопасноеХранилищеДанных.Записать();" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" ДанныеДляСохранения = ?(ЗначениеЗаполнено(Ключ), Новый Структура(Ключ, Данные), Данные);" & @CRLF & _
" ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6));" & @CRLF & _
" " & @CRLF & _
" БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения;" & @CRLF & _
" БезопасноеХранилищеДанных.Владелец = Владелец;" & @CRLF & _
" БезопасноеХранилищеДанных.Записать();" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" БезопасноеХранилищеДанных.Удалить();" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает данные из безопасного хранилища." & @CRLF & _
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим." & @CRLF & _
"//" & @CRLF & _
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов)," & @CRLF & _
"// а доступно только коду, который делает обращения только к своей части данных и" & @CRLF & _
"// в том контексте, который предполагает чтение или запись конфиденциальных данных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Владельцы - Массив из ПланОбменаСсылка" & @CRLF & _
"// - Массив из СправочникСсылка" & @CRLF & _
"// - Массив из Строка - ссылки на объекты информационной базы," & @CRLF & _
"// представляющих объекты-владельцы или уникальные строки(до 128 символов) владельцев данных." & @CRLF & _
"// Ключи - Строка - содержит имя ключа данных или список имен ключей, указанных через запятую." & @CRLF & _
"// - Неопределено - будут возвращены все сохраненные данные переданных владельцев. " & @CRLF & _
"// ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Соответствие из КлючИЗначение:" & @CRLF & _
"// * Ключ - ПланОбменаСсылка" & @CRLF & _
"// - СправочникСсылка" & @CRLF & _
"// - Строка - ссылка на объект информационной базы " & @CRLF & _
"// или строка до 128 символов идентифицирующая владельца данных." & @CRLF & _
"// * Значение - Произвольный - если в параметре Ключи указан один ключ, " & @CRLF & _
"// то возвращается его значение произвольного типа." & @CRLF & _
"// - Структура - если в параметре Ключи указано несколько ключей или Неопределено, " & @CRLF & _
"// где ключ структуры - это имя ключа сохраненных данных, " & @CRLF & _
"// а значение - данные произвольного типа. Когда для ключа отсутствуют данные, " & @CRLF & _
"// то значение содержит Неопределено." & @CRLF & _
"// - Неопределено - если данные по ключу отсутствуют." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Процедура РассылкаПриглашений(Пользователи)" & @CRLF & _
"// " & @CRLF & _
"// УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
"// ДанныеАвторизации = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Пользователи, "Логин, Пароль");" & @CRLF & _
"// УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
"// " & @CRLF & _
"// Для каждого Пользователь Из Пользователи Цикл" & @CRLF & _
"// ОтправитьПриглашение(Пользователь, ДанныеАвторизации[Пользователь]);" & @CRLF & _
"// КонецЦикла;" & @CRLF & _
"// " & @CRLF & _
"// КонецПроцедуры" & @CRLF & _
"//" & @CRLF & _
"Функция ПрочитатьДанныеВладельцевИзБезопасногоХранилища(Владельцы, Ключи = "Пароль", ОбщиеДанные = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Владельцы) = Тип("Массив")," & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Недопустимое значение параметра %1 в %2." & @CRLF & _
" |параметр должен содержать массив; передано значение: %3 (тип %4).'")," & @CRLF & _
" "Владельцы", "ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища", Владельцы, ТипЗнч(Владельцы)));" & @CRLF & _
" " & @CRLF & _
" Результат = ДанныеИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные);" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает данные из безопасного хранилища." & @CRLF & _
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим." & @CRLF & _
"//" & @CRLF & _
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов)," & @CRLF & _
"// а доступно только коду, который делает обращения только к своей части данных и" & @CRLF & _
"// в том контексте, который предполагает чтение или запись конфиденциальных данных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Владелец - ПланОбменаСсылка" & @CRLF & _
"// - СправочникСсылка" & @CRLF & _
"// - Строка - ссылка на объект информационной базы," & @CRLF & _
"// представляющий объект-владелец сохраняемого пароля или уникальная строка(до 128 символов)." & @CRLF & _
"// Ключи - Строка - содержит список имен сохраненных данных, указанных через запятую." & @CRLF & _
"// - Неопределено - будут возвращены все сохраненные данные владельца." & @CRLF & _
"// ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный, Структура, Неопределено - данные из безопасного хранилища. Если указан один ключ," & @CRLF & _
"// то возвращается его значение, иначе структура." & @CRLF & _
"// Если данные отсутствуют - Неопределенно." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Если ТекущийПользовательМожетИзменятьПароль Тогда" & @CRLF & _
"// УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
"// Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, "Логин");" & @CRLF & _
"// Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка);" & @CRLF & _
"// УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
"// Иначе" & @CRLF & _
"// Элементы.ГруппаЛогинИПароль.Видимость = Ложь;" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"// " & @CRLF & _
"// УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
"// ЛогинИПароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, Неопределено);" & @CRLF & _
"//" & @CRLF & _
"Функция ПрочитатьДанныеИзБезопасногоХранилища(Владелец, Ключи = "Пароль", ОбщиеДанные = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Владельцы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Владелец);" & @CRLF & _
" ДанныеВладельца = ПрочитатьДанныеВладельцевИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные);" & @CRLF & _
" " & @CRLF & _
" Результат = ДанныеВладельца[Владелец];" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Удаляет конфиденциальные данные в безопасное хранилище." & @CRLF & _
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим." & @CRLF & _
"//" & @CRLF & _
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов)," & @CRLF & _
"// а доступно только коду, который делает обращения только к своей части данных и" & @CRLF & _
"// в том контексте, который предполагает чтение или запись конфиденциальных данных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Владелец - ПланОбменаСсылка" & @CRLF & _
"// - СправочникСсылка" & @CRLF & _
"// - Строка - ссылка на объект информационной базы," & @CRLF & _
"// представляющий объект-владелец сохраняемого пароля или уникальная строка(до 128 символов)." & @CRLF & _
"// - Массив - ссылки на объекты информационной базы для удаления данным по нескольким владельцам." & @CRLF & _
"// Ключи - Строка - содержит список имен удаляемых данных, указанных через запятую. " & @CRLF & _
"// Неопределено - удаляет все данные." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// Процедура ПередУдалением(Отказ)" & @CRLF & _
"// " & @CRLF & _
"// // Проверка значения свойства ОбменДанными.Загрузка отсутствует, так как удалять данные" & @CRLF & _
"// // из безопасного хранилища нужно даже при удалении объекта при обмене данными." & @CRLF & _
"// " & @CRLF & _
"// УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
"// ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища(Ссылка);" & @CRLF & _
"// УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
"// " & @CRLF & _
"// КонецПроцедуры" & @CRLF & _
"//" & @CRLF & _
"Процедура УдалитьДанныеИзБезопасногоХранилища(Владелец, Ключи = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец)," & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Недопустимое значение параметра %1 в %2." & @CRLF & _
" |параметр должен содержать ссылку; передано значение: %3 (тип %4).'")," & @CRLF & _
" "Владелец", "ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища", Владелец, ТипЗнч(Владелец)));" & @CRLF & _
" " & @CRLF & _
" Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() Тогда" & @CRLF & _
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи();" & @CRLF & _
" Иначе" & @CRLF & _
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" " & @CRLF & _
" Владельцы = ?(ТипЗнч(Владелец) = Тип("Массив"), Владелец, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Владелец));" & @CRLF & _
" " & @CRLF & _
" Для Каждого ВладелецДанных Из Владельцы Цикл" & @CRLF & _
" " & @CRLF & _
" БезопасноеХранилищеДанных.Владелец = ВладелецДанных;" & @CRLF & _
" БезопасноеХранилищеДанных.Прочитать();" & @CRLF & _
" Если ТипЗнч(БезопасноеХранилищеДанных.Данные) = Тип("ХранилищеЗначения") Тогда" & @CRLF & _
" ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить();" & @CRLF & _
" Если Ключи <> Неопределено И ТипЗнч(ДанныеДляСохранения) = Тип("Структура") Тогда" & @CRLF & _
" СписокКлючей = СтрРазделить(Ключи, ",", Ложь);" & @CRLF & _
" Если БезопасноеХранилищеДанных.Выбран() И СписокКлючей.Количество() > 0 Тогда" & @CRLF & _
" Для каждого КлючДляУдаления Из СписокКлючей Цикл" & @CRLF & _
" Если ДанныеДляСохранения.Свойство(КлючДляУдаления) Тогда" & @CRLF & _
" ДанныеДляСохранения.Удалить(КлючДляУдаления);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6));" & @CRLF & _
" БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения;" & @CRLF & _
" БезопасноеХранилищеДанных.Записать();" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" БезопасноеХранилищеДанных.Удалить();" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область БуферОбмена" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Процедуры и функции для работы с внутренним буфером обмена." & @CRLF & _
"" & @CRLF & _
"// Помещает выделенные строки табличной части во внутренний буфер обмена" & @CRLF & _
"// откуда их можно получить с помощью СтрокиИзБуфераОбмена." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ТабличнаяЧасть - ДанныеФормыКоллекция - табличная часть, строки которой" & @CRLF & _
"// необходимо поместить во внутренний буфер обмена." & @CRLF & _
"// ВыделенныеСтроки - Массив - массив идентификаторов выделенных строк." & @CRLF & _
"// Источник - Строка - произвольный строковый идентификатор, например, имя объекта," & @CRLF & _
"// строки табличной части которого помещаются во внутренний буфер обмена." & @CRLF & _
"//" & @CRLF & _
"Процедура СкопироватьСтрокиВБуферОбмена(ТабличнаяЧасть, ВыделенныеСтроки, Источник = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если ВыделенныеСтроки = Неопределено Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТаблицаЗначений = ТабличнаяЧасть.Выгрузить();" & @CRLF & _
" ТаблицаЗначений.Очистить();" & @CRLF & _
" " & @CRLF & _
" УдаляемыеКолонки = Новый Массив;" & @CRLF & _
" УдаляемыеКолонки.Добавить("ИсходныйНомерСтроки");" & @CRLF & _
" УдаляемыеКолонки.Добавить("НомерСтроки");" & @CRLF & _
" " & @CRLF & _
" Для Каждого ИмяКолонки Из УдаляемыеКолонки Цикл" & @CRLF & _
" Колонка = ТаблицаЗначений.Колонки.Найти(ИмяКолонки);" & @CRLF & _
" Если Колонка = Неопределено Тогда" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТаблицаЗначений.Колонки.Удалить(Колонка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл" & @CRLF & _
" КопируемаяСтрока = ТабличнаяЧасть.НайтиПоИдентификатору(ИдентификаторСтроки);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ТаблицаЗначений.Добавить(), КопируемаяСтрока);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" СкопироватьВБуферОбмена(ТаблицаЗначений, Источник);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Помещает произвольные данные во внутренний буфер обмена, откуда их можно получить с помощью СтрокиИзБуфераОбмена." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Данные - Произвольный - данные, которые необходимо поместить в внутренний буфер обмена." & @CRLF & _
"// Источник - Строка - произвольный строковый идентификатор, например, имя объекта," & @CRLF & _
"// строки табличной части которого помещаются во внутренний буфер обмена." & @CRLF & _
"//" & @CRLF & _
"Процедура СкопироватьВБуферОбмена(Данные, Источник = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ТекущийБуферОбмена = ПараметрыСеанса.БуферОбмена;" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(ТекущийБуферОбмена.Данные) Тогда" & @CRLF & _
" Адрес = ТекущийБуферОбмена.Данные;" & @CRLF & _
" Иначе" & @CRLF & _
" Адрес = Новый УникальныйИдентификатор;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ДанныеВХранилище = ПоместитьВоВременноеХранилище(Данные, Адрес);" & @CRLF & _
" " & @CRLF & _
" СтруктураБуфераОбмена = Новый Структура;" & @CRLF & _
" СтруктураБуфераОбмена.Вставить("Источник", Источник);" & @CRLF & _
" СтруктураБуфераОбмена.Вставить("Данные", ДанныеВХранилище);" & @CRLF & _
" " & @CRLF & _
" ПараметрыСеанса.БуферОбмена = Новый ФиксированнаяСтруктура(СтруктураБуфераОбмена);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Получает строки табличной части, помещенные во внутренний буфер обмена с помощью СкопироватьСтрокиВБуферОбмена." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * Данные - Произвольный - данные из внутреннего буфера обмена." & @CRLF & _
"// Например, ТаблицаЗначений при вызове СкопироватьСтрокиВБуферОбмена." & @CRLF & _
"// * Источник - Строка - объект, к которому относятся данные." & @CRLF & _
"// Если при помещении во внутренний буфер не был указан, то Неопределено." & @CRLF & _
"//" & @CRLF & _
"Функция СтрокиИзБуфераОбмена() Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("Источник", Неопределено);" & @CRLF & _
" Результат.Вставить("Данные", Неопределено);" & @CRLF & _
" " & @CRLF & _
" Если ПустойБуферОбмена() Тогда" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТекущийБуферОбмена = ПараметрыСеанса.БуферОбмена; // см. СтрокиИзБуфераОбмена" & @CRLF & _
" Результат.Источник = ТекущийБуферОбмена.Источник;" & @CRLF & _
" Результат.Данные = ПолучитьИзВременногоХранилища(ТекущийБуферОбмена.Данные);" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Проверяет наличие сохраненных данных во внутренний буфере обмена." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Источник - Строка - если передан, то проверяется наличие данных" & @CRLF & _
"// в внутреннем буфере обмена с этим ключом." & @CRLF & _
"// По умолчанию - Неопределено." & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если пустой." & @CRLF & _
"//" & @CRLF & _
"Функция ПустойБуферОбмена(Источник = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ТекущийБуферОбмена = ПараметрыСеанса.БуферОбмена; // см. СтрокиИзБуфераОбмена" & @CRLF & _
" ИсточникСовпадает = Истина;" & @CRLF & _
" Если Источник <> Неопределено Тогда" & @CRLF & _
" ИсточникСовпадает = (Источник = ТекущийБуферОбмена.Источник);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат (Не ИсточникСовпадает Или Не ЗначениеЗаполнено(ТекущийБуферОбмена.Данные));" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область БезопасноеВыполнениеВнешнегоКода" & @CRLF & _
"" & @CRLF & _
"////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
"// Функции для поддержки работы конфигурации с профилем безопасности, в котором" & @CRLF & _
"// запрещено подключение внешних модулей без установки безопасного режима." & @CRLF & _
"//" & @CRLF & _
"" & @CRLF & _
"// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации." & @CRLF & _
"// При включении профилей безопасности для вызова оператора Выполнить() используется" & @CRLF & _
"// переход в безопасный режим с профилем безопасности, используемым для информационной базы" & @CRLF & _
"// (если выше по стеку не был установлен другой безопасный режим)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяМетода - Строка - имя экспортной процедуры в формате" & @CRLF & _
"// <имя объекта>.<имя процедуры>, где <имя объекта> - это" & @CRLF & _
"// общий модуль или модуль менеджера объекта." & @CRLF & _
"// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры>" & @CRLF & _
"// в порядке расположения элементов массива." & @CRLF & _
"// " & @CRLF & _
"// Пример:" & @CRLF & _
"// Параметры = Новый Массив();" & @CRLF & _
"// Параметры.Добавить("1");" & @CRLF & _
"// ОбщегоНазначения.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры);" & @CRLF & _
"//" & @CRLF & _
"Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ПроверитьИмяПроцедурыКонфигурации(ИмяМетода);" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда" & @CRLF & _
" МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");" & @CRLF & _
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()" & @CRLF & _
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда" & @CRLF & _
" " & @CRLF & _
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();" & @CRLF & _
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);" & @CRLF & _
" Если БезопасныйРежим() = Истина Тогда" & @CRLF & _
" УстановитьБезопасныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПараметрыСтрока = "";" & @CRLF & _
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда" & @CRLF & _
" Для Индекс = 0 По Параметры.ВГраница() Цикл " & @CRLF & _
" ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + XMLСтрока(Индекс) + "],";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Выполнить экспортную процедуру объекта встроенного языка по имени." & @CRLF & _
"// При включении профилей безопасности для вызова оператора Выполнить() используется" & @CRLF & _
"// переход в безопасный режим с профилем безопасности, используемым для информационной базы" & @CRLF & _
"// (если выше по стеку не был установлен другой безопасный режим)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект)." & @CRLF & _
"// ИмяМетода - Строка - имя экспортной процедуры модуля объекта обработки." & @CRLF & _
"// Параметры - Массив - параметры передаются в процедуру <ИмяПроцедуры>" & @CRLF & _
"// в порядке расположения элементов массива." & @CRLF & _
"//" & @CRLF & _
"Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" // Проверка имени метода на корректность." & @CRLF & _
" Попытка" & @CRLF & _
" Тест = Новый Структура(ИмяМетода, ИмяМетода);" & @CRLF & _
" Если Тест = Неопределено Тогда " & @CRLF & _
" ВызватьИсключение НСтр("ru = 'Синтетический тест'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Исключение" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Некорректное значение параметра %1 (%2) в %3.'"), " & @CRLF & _
" "ИмяМетода", ИмяМетода, "ОбщегоНазначения.ВыполнитьМетодОбъекта");" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда" & @CRLF & _
" МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");" & @CRLF & _
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()" & @CRLF & _
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда" & @CRLF & _
" " & @CRLF & _
" МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");" & @CRLF & _
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);" & @CRLF & _
" Если БезопасныйРежим() = Истина Тогда" & @CRLF & _
" УстановитьБезопасныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПараметрыСтрока = "";" & @CRLF & _
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда" & @CRLF & _
" Для Индекс = 0 По Параметры.ВГраница() Цикл " & @CRLF & _
" ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + XMLСтрока(Индекс) + "],";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Выполнить "Объект." + ИмяМетода + "(" + ПараметрыСтрока + ")";" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Выполняет произвольный алгоритм на встроенном языке 1С:Предприятия, предварительно устанавливая" & @CRLF & _
"// безопасный режим выполнения кода и безопасный режим разделения данных для всех разделителей," & @CRLF & _
"// присутствующих в составе конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Алгоритм - Строка - алгоритм на встроенном языке "1С:Предприятия"." & @CRLF & _
"// Параметры - Произвольный - контекст, который требуется для выполнения алгоритма." & @CRLF & _
"// В тексте алгоритма обращение к контексту должно происходить по имени "Параметры"." & @CRLF & _
"// Например, выражение "Параметры.Значение1 = Параметры.Значение2" обращается к значениям" & @CRLF & _
"// "Значение1" и "Значение2", переданным в Параметры, как свойства." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"//" & @CRLF & _
"// Параметры = Новый Структура;" & @CRLF & _
"// Параметры.Вставить("Значение1", 1);" & @CRLF & _
"// Параметры.Вставить("Значение2", 10);" & @CRLF & _
"// ОбщегоНазначения.ВыполнитьВБезопасномРежиме("Параметры.Значение1 = Параметры.Значение2", Параметры);" & @CRLF & _
"//" & @CRLF & _
"Процедура ВыполнитьВБезопасномРежиме(Знач Алгоритм, Знач Параметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда" & @CRLF & _
" МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса");" & @CRLF & _
" МассивРазделителей = МодульРаботаВМоделиСервиса.РазделителиКонфигурации();" & @CRLF & _
" Иначе" & @CRLF & _
" МассивРазделителей = Новый Массив;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ИмяРазделителя Из МассивРазделителей Цикл" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина);" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Выполнить Алгоритм;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Вычисляет переданное выражение, предварительно устанавливая безопасный режим выполнения кода" & @CRLF & _
"// и безопасный режим разделения данных для всех разделителей, присутствующих в составе конфигурации." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Выражение - Строка - выражение на встроенном языке 1С:Предприятия." & @CRLF & _
"// Параметры - Произвольный - контекст, который требуется для вычисления выражения." & @CRLF & _
"// В тексте выражения обращение к контексту должно происходить по имени "Параметры"." & @CRLF & _
"// Например, выражение "Параметры.Значение1 = Параметры.Значение2" обращается к значениям" & @CRLF & _
"// "Значение1" и "Значение2" переданные в Параметры, как свойства." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный - результат вычисления выражения." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"//" & @CRLF & _
"// // Пример 1" & @CRLF & _
"// Параметры = Новый Структура;" & @CRLF & _
"// Параметры.Вставить("Значение1", 1);" & @CRLF & _
"// Параметры.Вставить("Значение2", 10);" & @CRLF & _
"// Результат = ОбщегоНазначения.ВычислитьВБезопасномРежиме("Параметры.Значение1 = Параметры.Значение2", Параметры);" & @CRLF & _
"//" & @CRLF & _
"// // Пример 2" & @CRLF & _
"// Результат = ОбщегоНазначения.ВычислитьВБезопасномРежиме("СтандартныеПодсистемыСервер.ВерсияБиблиотеки()");" & @CRLF & _
"//" & @CRLF & _
"Функция ВычислитьВБезопасномРежиме(Знач Выражение, Знач Параметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда" & @CRLF & _
" МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса");" & @CRLF & _
" МассивРазделителей = МодульРаботаВМоделиСервиса.РазделителиКонфигурации();" & @CRLF & _
" Иначе" & @CRLF & _
" МассивРазделителей = Новый Массив;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ИмяРазделителя Из МассивРазделителей Цикл" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина);" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Вычислить(Выражение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает описание защиты от опасных действий с отключенными предупреждениями." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОписаниеЗащитыОтОпасныхДействий - со свойством ПредупреждатьОбОпасныхДействиях = Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеЗащитыБезПредупреждений() Экспорт" & @CRLF & _
" " & @CRLF & _
" ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;" & @CRLF & _
" ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеЗащиты;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Запросы" & @CRLF & _
"" & @CRLF & _
"// Подготавливает строку для использования в качестве шаблона поиска в запросе с оператором ПОДОБНО." & @CRLF & _
"// Экранирует служебные символы, если они есть в строке." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// СтрокаПоиска - Строка - произвольная строка." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка" & @CRLF & _
"// " & @CRLF & _
"// Пример:" & @CRLF & _
"// ВЫБРАТЬ" & @CRLF & _
"// Номенклатура.Ссылка КАК Ссылка" & @CRLF & _
"// ИЗ" & @CRLF & _
"// Справочник.Номенклатура КАК Номенклатура" & @CRLF & _
"// ГДЕ" & @CRLF & _
"// Номенклатура.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~"" & @CRLF & _
"//" & @CRLF & _
"// Запрос.УстановитьПараметр("Шаблон", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИскомыйТекст));" & @CRLF & _
"//" & @CRLF & _
"Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = СтрокаПоиска;" & @CRLF & _
" Результат = СтрЗаменить(Результат, "~", "~~");" & @CRLF & _
" Результат = СтрЗаменить(Результат, "%", "~%");" & @CRLF & _
" Результат = СтрЗаменить(Результат, "_", "~_");" & @CRLF & _
" Результат = СтрЗаменить(Результат, "[", "~[");" & @CRLF & _
" Результат = СтрЗаменить(Результат, "]", "~]");" & @CRLF & _
" Результат = СтрЗаменить(Результат, "^", "~^"); " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает фрагмент текста запроса, отделяющего один запрос от другого." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - разделитель запросов." & @CRLF & _
"//" & @CRLF & _
"Функция РазделительПакетаЗапросов() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат "" & @CRLF & _
" |;" & @CRLF & _
" |" & @CRLF & _
" |////////////////////////////////////////////////////////////////////////////////" & @CRLF & _
" |";" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Прочее" & @CRLF & _
"" & @CRLF & _
"// Выполняет проверки перед выполнением обработчика регламентного задания и прерывает выполнение," & @CRLF & _
"// если его запуск в данный момент невозможен, например:" & @CRLF & _
"// - еще не завершено обновление программы;" & @CRLF & _
"// - запуск через консоль или другим способом, минуя включение функциональной опции " & @CRLF & _
"// (если регламентное задание зависит от функциональных опций);" & @CRLF & _
"// - попытка выполнения задания, работающего с внешними ресурсами в копии информационной базы." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// РегламентноеЗадание - ОбъектМетаданныхРегламентноеЗадание - регламентное задание," & @CRLF & _
"// из которого вызывается данная процедура." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.<ИмяРегламентногоЗадания>);" & @CRLF & _
"//" & @CRLF & _
"Процедура ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Если РегистрыСведений.ПараметрыРаботыПрограммы.НеобходимоОбновление() Тогда" & @CRLF & _
" Текст = НСтр("ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию." & @CRLF & _
" |Рекомендуется запрещать выполнение регламентных заданий на время обновления.'");" & @CRLF & _
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);" & @CRLF & _
" ВызватьИсключение Текст;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не РазделениеВключено()" & @CRLF & _
" И ПланыОбмена.ГлавныйУзел() = Неопределено" & @CRLF & _
" И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()) Тогда" & @CRLF & _
" " & @CRLF & _
" Текст = НСтр("ru = 'Вход в программу временно невозможен до восстановления связи с главным узлом." & @CRLF & _
" |Рекомендуется запрещать выполнение регламентных заданий на время восстановления.'");" & @CRLF & _
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);" & @CRLF & _
" ВызватьИсключение Текст;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если РегламентноеЗадание <> Неопределено" & @CRLF & _
" И ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда" & @CRLF & _
" " & @CRLF & _
" МодульБлокировкаРаботыСВнешнимиРесурсами = ОбщийМодуль("БлокировкаРаботыСВнешнимиРесурсами");" & @CRLF & _
" МодульБлокировкаРаботыСВнешнимиРесурсами.ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание);" & @CRLF & _
" " & @CRLF & _
" МодульРегламентныеЗаданияСлужебный = ОбщийМодуль("РегламентныеЗаданияСлужебный");" & @CRLF & _
" Доступно = МодульРегламентныеЗаданияСлужебный.РегламентноеЗаданиеДоступноПоФункциональнымОпциям(РегламентноеЗадание);" & @CRLF & _
" " & @CRLF & _
" Если Не Доступно Тогда" & @CRLF & _
" Задания = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", РегламентноеЗадание));" & @CRLF & _
" Для Каждого Задание Из Задания Цикл" & @CRLF & _
" РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор," & @CRLF & _
" Новый Структура("Использование", Ложь));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Текст = НСтр("ru = 'Регламентное задание недоступно по функциональным опциям или" & @CRLF & _
" |не поддерживает работу в текущем режиме работы программы." & @CRLF & _
" |Выполнение прервано. Задание отключено.'");" & @CRLF & _
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);" & @CRLF & _
" ВызватьИсключение Текст;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если СтандартныеПодсистемыСервер.ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Тогда" & @CRLF & _
" Текст = НСтр("ru = 'Регламентное задание недоступно до установки начальных региональных настроек программы." & @CRLF & _
" |Выполнение прервано.'");" & @CRLF & _
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);" & @CRLF & _
" ВызватьИсключение Текст;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений();" & @CRLF & _
" " & @CRLF & _
" РегистрыСведений.ПараметрыРаботыВерсийРасширений.ПриУспешномНачалеВыполненияРегламентногоЗадания();" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Переводит параметры сеанса в состояние "Не установлено". " & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПараметрыДляОчистки - Строка - имена параметров сеанса для очистки, разделенные ","." & @CRLF & _
"// Исключения - Строка - имена параметров сеанса не предназначенные для очистки, разделенные ","." & @CRLF & _
"//" & @CRLF & _
"Процедура ОчиститьПараметрыСеанса(ПараметрыДляОчистки = "", Исключения = "") Экспорт" & @CRLF & _
" " & @CRLF & _
" МассивИсключений = СтрРазделить(Исключения, ",");" & @CRLF & _
" МассивПараметровДляОчистки = СтрРазделить(ПараметрыДляОчистки, ",", Ложь);" & @CRLF & _
" " & @CRLF & _
" Если МассивПараметровДляОчистки.Количество() = 0 Тогда" & @CRLF & _
" Для Каждого ПараметрСеанса Из Метаданные.ПараметрыСеанса Цикл" & @CRLF & _
" Если МассивИсключений.Найти(ПараметрСеанса.Имя) = Неопределено Тогда" & @CRLF & _
" МассивПараметровДляОчистки.Добавить(ПараметрСеанса.Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Индекс = МассивПараметровДляОчистки.Найти("ПараметрыКлиентаНаСервере");" & @CRLF & _
" Если Индекс <> Неопределено Тогда" & @CRLF & _
" МассивПараметровДляОчистки.Удалить(Индекс);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Индекс = МассивПараметровДляОчистки.Найти("ОсновнойЯзык");" & @CRLF & _
" Если Индекс <> Неопределено Тогда" & @CRLF & _
" МассивПараметровДляОчистки.Удалить(Индекс);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Индекс = МассивПараметровДляОчистки.Найти("УстановленныеРасширения");" & @CRLF & _
" Если Индекс <> Неопределено Тогда" & @CRLF & _
" МассивПараметровДляОчистки.Удалить(Индекс);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПараметрыСеанса.Очистить(МассивПараметровДляОчистки);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Проверяет, умещаются ли переданные табличные документы на страницу при печати." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ТабДокумент - ТабличныйДокумент - табличный документ." & @CRLF & _
"// ВыводимыеОбласти - Массив" & @CRLF & _
"// - ТабличныйДокумент - массив из проверяемых таблиц или табличный документ. " & @CRLF & _
"// РезультатПриОшибке - Булево - какой возвращать результат при возникновении ошибки." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - умещаются или нет переданные документы." & @CRLF & _
"//" & @CRLF & _
"Функция ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти, РезультатПриОшибке = Истина) Экспорт" & @CRLF & _
"" & @CRLF & _
" Попытка" & @CRLF & _
" Возврат ТабДокумент.ПроверитьВывод(ВыводимыеОбласти);" & @CRLF & _
" Исключение" & @CRLF & _
" Возврат РезультатПриОшибке;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
"" & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"// Сохраняет персональные настройки пользователя, относящиеся к подсистеме БазоваяФункциональность." & @CRLF & _
"// Для получения настроек предусмотрены следующие функции:" & @CRLF & _
"// - ОбщегоНазначенияКлиент.ПредлагатьУстановкуРасширенияРаботыСФайлами()," & @CRLF & _
"// - СтандартныеПодсистемыСервер.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы()," & @CRLF & _
"// - СтандартныеПодсистемыСервер.ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы()." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Настройки - Структура:" & @CRLF & _
"// * НапоминатьОбУстановкеРасширенияРаботыСФайлами - Булево - признак необходимости" & @CRLF & _
"// напоминания об установке расширения." & @CRLF & _
"// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - запрашивать подтверждение по завершении работы." & @CRLF & _
"// * ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы - Булево - показывать оповещение при" & @CRLF & _
"// динамическом обновлении программы." & @CRLF & _
"//" & @CRLF & _
"Процедура СохранитьПерсональныеНастройки(Настройки) Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Настройки.Свойство("НапоминатьОбУстановкеРасширенияРаботыСФайлами") Тогда" & @CRLF & _
" Если ЭтоВебКлиент() Тогда" & @CRLF & _
" ИдентификаторКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ИдентификаторКлиента");" & @CRLF & _
" Если ИдентификаторКлиента = Неопределено Тогда" & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация;" & @CRLF & _
" ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ХранилищеОбщихНастроекСохранить(" & @CRLF & _
" "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами"," & @CRLF & _
" ИдентификаторКлиента, Настройки.НапоминатьОбУстановкеРасширенияРаботыСФайлами);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Настройки.Свойство("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы") Тогда" & @CRLF & _
" ХранилищеОбщихНастроекСохранить("ОбщиеНастройкиПользователя"," & @CRLF & _
" "ЗапрашиватьПодтверждениеПриЗавершенииПрограммы"," & @CRLF & _
" Настройки.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Настройки.Свойство("ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы") Тогда" & @CRLF & _
" ХранилищеОбщихНастроекСохранить("ОбщиеНастройкиПользователя"," & @CRLF & _
" "ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы"," & @CRLF & _
" Настройки.ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Выполняет пропорциональное распределение суммы в соответствии" & @CRLF & _
"// с заданными коэффициентами распределения. " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// РаспределяемаяСумма - Число - сумма, которую надо распределить, если сумма равна 0 - то возвращается Неопределено;" & @CRLF & _
"// Если передана отрицательная - расчет по модулю и после инверсия знаков результата." & @CRLF & _
"// Коэффициенты - Массив из Число - коэффициенты распределения, должны быть положительны или отрицательными " & @CRLF & _
"// одновременно." & @CRLF & _
"// Точность - Число - точность округления при распределении. " & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив из Число - массив размерностью равный массиву коэффициентов, содержит" & @CRLF & _
"// суммы в соответствии с весом коэффициента (из массива коэффициентов)." & @CRLF & _
"// В случае, если распределить невозможно (кол-во коэффициентов = 0" & @CRLF & _
"// есть коэффициенты с отрицательным значением или суммарный вес коэффициентов = 0)," & @CRLF & _
"// тогда будет возвращено Неопределено." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"//" & @CRLF & _
"// Коэффициенты = Новый Массив;" & @CRLF & _
"// Коэффициенты.Добавить(1);" & @CRLF & _
"// Коэффициенты.Добавить(2);" & @CRLF & _
"// Результат = ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам(1, Коэффициенты);" & @CRLF & _
"// // Результат = [0.33, 0.67]" & @CRLF & _
"//" & @CRLF & _
"Функция РаспределитьСуммуПропорциональноКоэффициентам(" & @CRLF & _
" Знач РаспределяемаяСумма, Коэффициенты, Знач Точность = 2) Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам(" & @CRLF & _
" РаспределяемаяСумма, Коэффициенты, Точность);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Процедура предназначена для заполнения реквизита формы типа ДанныеФормыДерево." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// КоллекцияЭлементовДерева - ДанныеФормыКоллекцияЭлементовДерева - реквизит, который нужно заполнить." & @CRLF & _
"// ДеревоЗначений - ДеревоЗначений - данные для заполнения." & @CRLF & _
"// " & @CRLF & _
"Процедура ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, ДеревоЗначений) Экспорт" & @CRLF & _
" " & @CRLF & _
" Для Каждого Строка Из ДеревоЗначений.Строки Цикл" & @CRLF & _
" " & @CRLF & _
" ЭлементДерева = КоллекцияЭлементовДерева.Добавить();" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ЭлементДерева, Строка);" & @CRLF & _
" Если Строка.Строки.Количество() > 0 Тогда" & @CRLF & _
" ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(ЭлементДерева.ПолучитьЭлементы(), Строка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Подключает внешнюю компоненту, выполненную по технологии Native API или COM," & @CRLF & _
"// из макета конфигурации (хранится в виде ZIP-архива)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Идентификатор - Строка - идентификатор объекта внешней компоненты." & @CRLF & _
"// ПолноеИмяМакета - Строка - полное имя макета конфигурации с ZIP-архивом." & @CRLF & _
"// Изолированно - Булево, Неопределено - (по умолчанию Ложь) если Истина, компонента будет подключена" & @CRLF & _
"// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы;" & @CRLF & _
"// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы," & @CRLF & _
"// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию:" & @CRLF & _
"// не изолированно - если компонентой поддерживается только этот режим, изолированно - в остальных случаях." & @CRLF & _
"// См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866" & @CRLF & _
"//" & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОбъектВнешнейКомпоненты, Неопределено - экземпляр объекта внешней компоненты или Неопределено, если не удалось создать." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"//" & @CRLF & _
"// ПодключаемыйМодуль = ОбщегоНазначения.ПодключитьКомпонентуИзМакета(" & @CRLF & _
"// "QRCodeExtension"," & @CRLF & _
"// "ОбщийМакет.КомпонентаПечатиQRКода");" & @CRLF & _
"//" & @CRLF & _
"// Если ПодключаемыйМодуль <> Неопределено Тогда " & @CRLF & _
"// // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты." & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"//" & @CRLF & _
"// ПодключаемыйМодуль = Неопределено;" & @CRLF & _
"//" & @CRLF & _
"Функция ПодключитьКомпонентуИзМакета(Знач Идентификатор, Знач ПолноеИмяМакета, Знач Изолированно = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" РезультатПроверкиВнешнейКомпоненты = Неопределено;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда" & @CRLF & _
" МодульВнешниеКомпонентыСлужебный = ОбщийМодуль("ВнешниеКомпонентыСлужебный");" & @CRLF & _
" РезультатПроверкиВнешнейКомпоненты = МодульВнешниеКомпонентыСлужебный.ПроверитьПодключениеКомпоненты(Идентификатор);" & @CRLF & _
" РезультатПроверкиВнешнейКомпоненты.Вставить("Доступна", " & @CRLF & _
" Не ЗначениеЗаполнено(РезультатПроверкиВнешнейКомпоненты.ОписаниеОшибки));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КомпонентаПоследнейВерсии = СтандартныеПодсистемыСервер.КомпонентаПоследнейВерсии(" & @CRLF & _
" Идентификатор, ПолноеИмяМакета, РезультатПроверкиВнешнейКомпоненты);" & @CRLF & _
" " & @CRLF & _
" Результат = ПодключитьКомпонентуПоИдентификатору(Идентификатор," & @CRLF & _
" КомпонентаПоследнейВерсии.Местоположение, Изолированно);" & @CRLF & _
" " & @CRLF & _
" Возврат Результат.ПодключаемыйМодуль;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область УстаревшиеПроцедурыИФункции" & @CRLF & _
"" & @CRLF & _
"// Устарела. Следует использовать" & @CRLF & _
"// ОбщегоНазначения.РазделениеВключено И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево" & @CRLF & _
"//" & @CRLF & _
"Функция ИспользованиеРазделителяСеанса() Экспорт" & @CRLF & _
" " & @CRLF & _
" Если Не РазделениеВключено() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда" & @CRLF & _
" МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса");" & @CRLF & _
" Возврат МодульРаботаВМоделиСервиса.ИспользованиеРазделителяСеанса();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Устарела. Следует использовать ФайловаяСистема.СоздатьВременныйКаталог" & @CRLF & _
"// Создает временный каталог. После окончания работы с временным каталогом его необходимо удалить " & @CRLF & _
"// с помощью ОбщегоНазначения.УдалитьВременныйКаталог." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Расширение - Строка - расширение каталога, которое идентифицирует назначение временного каталога" & @CRLF & _
"// и подсистему, которая его создала." & @CRLF & _
"// Рекомендуется указывать на английском языке." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - полный путь к каталогу с разделителем пути." & @CRLF & _
"//" & @CRLF & _
"Функция СоздатьВременныйКаталог(Знач Расширение = "") Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат ФайловаяСистема.СоздатьВременныйКаталог(Расширение);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Устарела. Следует использовать ФайловаяСистема.УдалитьВременныйКаталог" & @CRLF & _
"// Удаляет временный каталог вместе с его содержимым, если возможно." & @CRLF & _
"// Если временный каталог не может быть удален (например, он занят каким-то процессом)," & @CRLF & _
"// то в журнал регистрации записывается соответствующее предупреждение, а процедура завершается." & @CRLF & _
"//" & @CRLF & _
"// Для совместного использования с ОбщегоНазначения.СоздатьВременныйКаталог, " & @CRLF & _
"// после окончания работы с временным каталогом." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПутьККаталогу - Строка - полный путь к временному каталогу." & @CRLF & _
"//" & @CRLF & _
"Процедура УдалитьВременныйКаталог(Знач ПутьККаталогу) Экспорт" & @CRLF & _
" " & @CRLF & _
" ФайловаяСистема.УдалитьВременныйКаталог(ПутьККаталогу);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Устарела. Проверяет наличие механизма платформы, предупреждающего об опасных действиях." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если Истина, тогда работает механизм предупреждений безопасности." & @CRLF & _
"//" & @CRLF & _
"Функция ЕстьЗащитаОтОпасныхДействий() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Устарела. Создает и возвращает экземпляр отчета или обработки по полному имени объекта метаданных." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПолноеИмя - Строка - полное имя объекта метаданных. Пример: "Отчет.БизнесПроцессы"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// ОтчетОбъект" & @CRLF & _
"// ОбработкаОбъект - экземпляр отчета или обработки." & @CRLF & _
"// " & @CRLF & _
"Функция ОбъектПоПолномуИмени(ПолноеИмя) Экспорт" & @CRLF & _
" МассивСтрок = СтрРазделить(ПолноеИмя, ".");" & @CRLF & _
" " & @CRLF & _
" Если МассивСтрок.Количество() >= 2 Тогда" & @CRLF & _
" Вид = ВРег(МассивСтрок[0]);" & @CRLF & _
" Имя = МассивСтрок[1];" & @CRLF & _
" Иначе" & @CRLF & _
" ВызватьИсключение СтрЗаменить(НСтр("ru = 'Некорректное полное имя отчета или обработки ""%1"".'"), "%1", ПолноеИмя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Вид = "ОТЧЕТ" Тогда" & @CRLF & _
" Возврат Отчеты[Имя].Создать();" & @CRLF & _
" ИначеЕсли Вид = "ОБРАБОТКА" Тогда" & @CRLF & _
" Возврат Обработки[Имя].Создать();" & @CRLF & _
" Иначе" & @CRLF & _
" ВызватьИсключение СтрЗаменить(НСтр("ru = '""%1"" не является отчетом или обработкой.'"), "%1", ПолноеИмя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Устарела. Следует использовать ОбщегоНазначения.ЭтоMacOSКлиент" & @CRLF & _
"// Возвращает Истина, если клиентское приложение запущено под управлением ОС X." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - если нет клиентского приложения, возвращается Ложь." & @CRLF & _
"//" & @CRLF & _
"Функция ЭтоOSXКлиент() Экспорт" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" ЭтоMacOSКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ЭтоMacOSКлиент");" & @CRLF & _
" " & @CRLF & _
" Если ЭтоMacOSКлиент = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Нет клиентского приложения." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ЭтоMacOSКлиент;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#КонецЕсли" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Если НЕ МобильныйАвтономныйСервер Тогда" & @CRLF & _
"" & @CRLF & _
"#Область СлужебныйПрограммныйИнтерфейс" & @CRLF & _
"" & @CRLF & _
"// Выгружает запрос в строку XML, которую можно вставить в Консоль запросов." & @CRLF & _
"// Для переноса запроса и всех его параметров в Консоль запросов, необходимо вызвать функцию в окне." & @CRLF & _
"// "Вычислить выражение" (Shift + F9), скопировать полученный XML в поле "Текст запроса"" & @CRLF & _
"// консоли запросов и выполнить команду "Заполнить из XML" из меню "Еще"." & @CRLF & _
"// Подробнее об использование функции смотрите в справке к консоли запросов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Запрос - Запрос - запрос, который необходимо выгрузить в формат строки XML." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - строка в формате XML, которую можно извлечь при помощи метода "ОбщегоНазначения.ЗначениеИзСтрокиXML"." & @CRLF & _
"// После извлечения получится объект типа "Структура" с полями:" & @CRLF & _
"// * Текст - Строка - текст запроса." & @CRLF & _
"// * Параметры - Структура - параметры запроса." & @CRLF & _
"//" & @CRLF & _
"Функция ЗапросВСтрокуXML(Запрос) Экспорт // АПК:299 - используется при отладке запросов, см. описание функции." & @CRLF & _
" Структура = Новый Структура("Текст, Параметры");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Структура, Запрос);" & @CRLF & _
" Возврат ЗначениеВСтрокуXML(Структура);" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ПодключитьКомпонентуПоИдентификатору(Знач Идентификатор, Знач Местоположение, Знач Изолированно = Ложь) Экспорт" & @CRLF & _
"" & @CRLF & _
" ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение);" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("Подключено", Ложь);" & @CRLF & _
" Результат.Вставить("ПодключаемыйМодуль", Неопределено);" & @CRLF & _
" Результат.Вставить("ОписаниеОшибки", "");" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" " & @CRLF & _
" #Если МобильноеПриложениеСервер Тогда" & @CRLF & _
" РезультатПодключения = ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + "SymbolicName");" & @CRLF & _
" #Иначе" & @CRLF & _
" РезультатПодключения = ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + "SymbolicName",," & @CRLF & _
" ОбщегоНазначенияСлужебныйКлиентСервер.ТипПодключенияКомпоненты(Изолированно));" & @CRLF & _
" #КонецЕсли" & @CRLF & _
" " & @CRLF & _
" Исключение" & @CRLF & _
" Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на сервере по причине:" & @CRLF & _
" |%2.'")," & @CRLF & _
" Идентификатор, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" " & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение внешней компоненты на сервере'", КодОсновногоЯзыка())," & @CRLF & _
" УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки);" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если Не РезультатПодключения Тогда" & @CRLF & _
" Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на сервере по причине:" & @CRLF & _
" |Метод %2 вернул Ложь.'")," & @CRLF & _
" Идентификатор, "ПодключитьВнешнююКомпоненту");" & @CRLF & _
" " & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение внешней компоненты на сервере'", КодОсновногоЯзыка())," & @CRLF & _
" УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки);" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПодключаемыйМодуль = Неопределено;" & @CRLF & _
" Попытка" & @CRLF & _
" ПодключаемыйМодуль = Новый("AddIn." + Идентификатор + "SymbolicName" + "." + Идентификатор);" & @CRLF & _
" Если ПодключаемыйМодуль = Неопределено Тогда " & @CRLF & _
" ВызватьИсключение НСтр("ru = 'Оператор Новый вернул Неопределено'");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Исключение" & @CRLF & _
" ПодключаемыйМодуль = Неопределено;" & @CRLF & _
" ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если ПодключаемыйМодуль = Неопределено Тогда" & @CRLF & _
" Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Не удалось создать объект внешней компоненты ""%1"", подключенной на сервере, по причине:" & @CRLF & _
" |%2'")," & @CRLF & _
" Идентификатор, ТекстОшибки);" & @CRLF & _
" " & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение внешней компоненты на сервере'", КодОсновногоЯзыка())," & @CRLF & _
" УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки);" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Результат.Подключено = Истина;" & @CRLF & _
" Результат.ПодключаемыйМодуль = ПодключаемыйМодуль;" & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция СтрокаВВидеНСтр(Знач ПроверяемаяСтрока) Экспорт" & @CRLF & _
" " & @CRLF & _
" ПроверяемаяСтрока = СтрЗаменить(ПроверяемаяСтрока, " ", "");" & @CRLF & _
" " & @CRLF & _
" ВариантыСовпадений = Новый Массив;" & @CRLF & _
" Для каждого Язык Из Метаданные.Языки Цикл" & @CRLF & _
" ВариантыСовпадений.Добавить(Язык.КодЯзыка + "=");" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для каждого ВариантСовпадения Из ВариантыСовпадений Цикл" & @CRLF & _
" Если СтрНайти(ПроверяемаяСтрока, ВариантСовпадения) > 0 Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Устанавливает условное оформление списка выбора" & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// Форма - ФормаКлиентскогоПриложения - форма, для которой устанавливается оформление." & @CRLF & _
"// ИмяЭлемента - Строка - имя элемента, для которого устанавливается оформление." & @CRLF & _
"// ИмяПоляКомпоновкиДанных - Строка - имя поля компоновки данных." & @CRLF & _
"//" & @CRLF & _
"Процедура УстановитьУсловноеОформлениеСпискаВыбора(Форма, ИмяЭлемента, ИмяПоляКомпоновкиДанных) Экспорт" & @CRLF & _
" " & @CRLF & _
" Элементы = Форма.Элементы;" & @CRLF & _
" УсловноеОформление = Форма.УсловноеОформление;" & @CRLF & _
" " & @CRLF & _
" Для каждого ЭлементВыбора Из Элементы[ИмяЭлемента].СписокВыбора Цикл" & @CRLF & _
" " & @CRLF & _
" Элемент = УсловноеОформление.Элементы.Добавить();" & @CRLF & _
" " & @CRLF & _
" ПолеЭлемента = Элемент.Поля.Элементы.Добавить();" & @CRLF & _
" ЭлементФормы = Элементы[ИмяЭлемента]; // ПолеФормы" & @CRLF & _
" ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ЭлементФормы.Имя);" & @CRLF & _
" " & @CRLF & _
" ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));" & @CRLF & _
" ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоляКомпоновкиДанных);" & @CRLF & _
" ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;" & @CRLF & _
" ОтборЭлемента.ПравоеЗначение = ЭлементВыбора.Значение;" & @CRLF & _
" " & @CRLF & _
" Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ЭлементВыбора.Представление);" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает суффикс текущего языка для мультиязычных реквизитов." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - "Язык1" или "Язык2", если язык пользователя является дополнительным" & @CRLF & _
"// Пустая строка, если язык пользователя является основным." & @CRLF & _
"// Неопределено - мультиязычное хранение данных не используется." & @CRLF & _
"//" & @CRLF & _
"Функция СуффиксЯзыкаТекущегоПользователя() Экспорт" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Структура();" & @CRLF & _
" Результат.Вставить("СуффиксТекущегоЯзыка", "");" & @CRLF & _
" Результат.Вставить("ЭтоОсновнойЯзык", "");" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда" & @CRLF & _
" МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер");" & @CRLF & _
" СуффиксТекущегоЯзыка = МодульМультиязычностьСервер.СуффиксТекущегоЯзыка();" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда" & @CRLF & _
" Возврат СуффиксТекущегоЯзыка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Иначе" & @CRLF & _
" СуффиксТекущегоЯзыка = "";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ЭтоОсновнойЯзык() Тогда" & @CRLF & _
" Возврат СуффиксТекущегоЯзыка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Неопределено;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Сокращает имя файла с расширением." & @CRLF & _
"// Сокращение имени, производится, когда имя файла с расширением превышает размер 255 байт." & @CRLF & _
"// Сокращение ими файла достигая за счет сокращения имени файла без расширения и " & @CRLF & _
"// добавления значения хеш функции сокращенной строки." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяФайла - Строка - имя файла с расширением" & @CRLF & _
"// " & @CRLF & _
"Процедура СократитьИмяФайла(ИмяФайла) Экспорт" & @CRLF & _
" ОграничениеВБайтах = 255; " & @CRLF & _
" Если РазмерСтрокиВБайтах(ИмяФайла) <= ОграничениеВБайтах Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Файл = Новый Файл(ИмяФайла);" & @CRLF & _
" ИмяБезРасширения = Файл.ИмяБезРасширения;" & @CRLF & _
" " & @CRLF & _
" ОграничениеВБайтах = ОграничениеВБайтах - РазмерСтрокиВБайтах(Файл.Расширение);" & @CRLF & _
" " & @CRLF & _
" ДлинаСтроки = СтрДлина(ИмяБезРасширения);" & @CRLF & _
" ИспользуемоеКоличествоСимволов = ОграничениеВБайтах - 32;" & @CRLF & _
" БольшееКоличествоСимволов = Мин(ДлинаСтроки, ОграничениеВБайтах);" & @CRLF & _
" МеньшееКоличествоСимволов = Цел((ОграничениеВБайтах - 32)/4);" & @CRLF & _
" Уменьшить = Истина;" & @CRLF & _
" Пока Истина Цикл" & @CRLF & _
" Если Уменьшить Тогда" & @CRLF & _
" ИспользуемоеКоличествоСимволов = МеньшееКоличествоСимволов + Цел((ИспользуемоеКоличествоСимволов-МеньшееКоличествоСимволов)/2);" & @CRLF & _
" Иначе" & @CRLF & _
" ИспользуемоеКоличествоСимволов = ИспользуемоеКоличествоСимволов + Цел((БольшееКоличествоСимволов - ИспользуемоеКоличествоСимволов)/2);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" РазмерСтрокиВБайтах = РазмерСтрокиВБайтах(ИмяБезРасширения)+32;" & @CRLF & _
" " & @CRLF & _
" Если РазмерСтрокиВБайтах = ОграничениеВБайтах Или БольшееКоличествоСимволов - МеньшееКоличествоСимволов = 1 Тогда" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если РазмерСтрокиВБайтах > ОграничениеВБайтах Тогда" & @CRLF & _
" Уменьшить = Истина;" & @CRLF & _
" БольшееКоличествоСимволов = ИспользуемоеКоличествоСимволов; " & @CRLF & _
" Иначе " & @CRLF & _
" Уменьшить = Ложь;" & @CRLF & _
" МеньшееКоличествоСимволов = ИспользуемоеКоличествоСимволов;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" СокращеннаяСтрока = СократитьСтрокуКонтрольнойСуммой(ИмяБезРасширения, ИспользуемоеКоличествоСимволов+32);" & @CRLF & _
" " & @CRLF & _
" ИмяФайла = СокращеннаяСтрока+Файл.Расширение;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Служебные объекты и объекты при загрузке из резервной копии," & @CRLF & _
"// должны записываться без какой-либо прикладной логики." & @CRLF & _
"//" & @CRLF & _
"// Запись служебных объектов без отключения прикладной логики," & @CRLF & _
"// может привести к зацикливанию, снижению производительности," & @CRLF & _
"// а также избыточным изменениях, которые в некоторых случаях" & @CRLF & _
"// могут неожиданно повлиять на логику работы." & @CRLF & _
"//" & @CRLF & _
"// Служебными являются объекты, которые обычно не участвуют" & @CRLF & _
"// в обмене данными, не зависят от других объектов, например:" & @CRLF & _
"// - кэши;" & @CRLF & _
"// - даты обновления кэшей и аналогичные признаки;" & @CRLF & _
"// - промежуточные данные для передачи параметров в фоновые задания;" & @CRLF & _
"// - вспомогательные служебные данные (например, ключи доступа," & @CRLF & _
"// идентификаторы объектов метаданных)." & @CRLF & _
"//" & @CRLF & _
"// При использовании подсистемы Управление доступом, требуется" & @CRLF & _
"// отдельно вызывать процедуру ОтключитьОбновлениеКлючейДоступа" & @CRLF & _
"// общего модуля УправлениеДоступом." & @CRLF & _
"//" & @CRLF & _
"// Процедура включает режим загрузки данных," & @CRLF & _
"// отключает регистрацию объектов на планах обмена," & @CRLF & _
"// отключает контроль механизма удаления помеченных объектов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Объект - ПланОбменаОбъект" & @CRLF & _
"// - КонстантаМенеджерЗначения" & @CRLF & _
"// - СправочникОбъект" & @CRLF & _
"// - ДокументОбъект" & @CRLF & _
"// - ПоследовательностьНаборЗаписей" & @CRLF & _
"// - ПланВидовХарактеристикОбъект" & @CRLF & _
"// - ПланСчетовОбъект" & @CRLF & _
"// - ПланВидовРасчетаОбъект" & @CRLF & _
"// - БизнесПроцессОбъект" & @CRLF & _
"// - ЗадачаОбъект" & @CRLF & _
"// - УдалениеОбъекта" & @CRLF & _
"// - РегистрСведенийНаборЗаписей" & @CRLF & _
"// - РегистрНакопленияНаборЗаписей" & @CRLF & _
"// - РегистрБухгалтерииНаборЗаписей" & @CRLF & _
"// - РегистрРасчетаНаборЗаписей" & @CRLF & _
"// - ПерерасчетНаборЗаписей" & @CRLF & _
"//" & @CRLF & _
"// ЭтоУзелПланаОбмена - Булево" & @CRLF & _
"//" & @CRLF & _
"Процедура ОтключитьКонтрольЗаписи(Объект, ЭтоУзелПланаОбмена = Ложь) Экспорт" & @CRLF & _
" " & @CRLF & _
" Объект.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых");" & @CRLF & _
" Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");" & @CRLF & _
" Объект.ОбменДанными.Загрузка = Истина;" & @CRLF & _
" Если Не ЭтоУзелПланаОбмена Тогда" & @CRLF & _
" Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область СлужебныеПроцедурыИФункции" & @CRLF & _
"" & @CRLF & _
"#Область ДанныеВБазе" & @CRLF & _
"" & @CRLF & _
"#Область ЗначенияРеквизитов" & @CRLF & _
"" & @CRLF & _
"// Проверяет существование указанных реквизитов у объекта метаданных." & @CRLF & _
"// " & @CRLF & _
"// Параметры:" & @CRLF & _
"// ПолноеИмяОбъектаМетаданных - Строка - полное имя проверяемого объекта." & @CRLF & _
"// ПроверяемыеВыражения - Массив - имена полей или проверяемые выражения объекта метаданных." & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * Ошибка - Булево - найдена ошибка." & @CRLF & _
"// * ОписаниеОшибки - Строка - описание найденных ошибок." & @CRLF & _
"//" & @CRLF & _
"// Пример:" & @CRLF & _
"// " & @CRLF & _
"// Реквизиты = Новый Массив;" & @CRLF & _
"// Реквизиты.Добавить("Номер");" & @CRLF & _
"// Реквизиты.Добавить("Валюта.НаименованиеПолное");" & @CRLF & _
"//" & @CRLF & _
"// Результат = ОбщегоНазначения.ПроверитьСуществованиеРеквизитовОбъекта("Документ._ДемоЗаказПокупателя", Реквизиты);" & @CRLF & _
"//" & @CRLF & _
"// Если Результат.Ошибка Тогда" & @CRLF & _
"// ВызватьИсключение Результат.ОписаниеОшибки;" & @CRLF & _
"// КонецЕсли;" & @CRLF & _
"//" & @CRLF & _
"Функция ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, ПроверяемыеВыражения)" & @CRLF & _
" " & @CRLF & _
" МетаданныеОбъекта = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных);" & @CRLF & _
" Если МетаданныеОбъекта = Неопределено Тогда " & @CRLF & _
" Возврат Новый Структура("Ошибка, ОписаниеОшибки", Истина, " & @CRLF & _
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Несуществующий объект метаданных ""%1"".'"), ПолноеИмяОбъектаМетаданных));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" // Разрешение вызова из безопасного режима внешней обработки или расширения." & @CRLF & _
" // Информация о доступности полей источника схемы при проверке метаданных не является секретной." & @CRLF & _
" УстановитьОтключениеБезопасногоРежима(Истина);" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Схема = Новый СхемаЗапроса;" & @CRLF & _
" Пакет = Схема.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));" & @CRLF & _
" Оператор = Пакет.Операторы.Получить(0);" & @CRLF & _
" " & @CRLF & _
" Источник = Оператор.Источники.Добавить(ПолноеИмяОбъектаМетаданных, "Таблица");" & @CRLF & _
" ТекстОшибки = "";" & @CRLF & _
" " & @CRLF & _
" Для Каждого ТекущееВыражение Из ПроверяемыеВыражения Цикл" & @CRLF & _
" " & @CRLF & _
" Если Не ПолеИсточникаСхемыЗапросаДоступно(Источник, ТекущееВыражение) Тогда " & @CRLF & _
" ТекстОшибки = ТекстОшибки + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Поле объекта ""%1"" не существует.'"), ТекущееВыражение);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Новый Структура("Ошибка, ОписаниеОшибки", Не ПустаяСтрока(ТекстОшибки), ТекстОшибки);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Используется в ПроверитьСуществованиеРеквизитовОбъекта." & @CRLF & _
"// Выполняет проверку доступности поля проверяемого выражения в источнике оператора схемы запроса." & @CRLF & _
"//" & @CRLF & _
"Функция ПолеИсточникаСхемыЗапросаДоступно(ИсточникОператора, ПроверяемоеВыражение)" & @CRLF & _
" " & @CRLF & _
" ЧастиИмениПоля = СтрРазделить(ПроверяемоеВыражение, ".");" & @CRLF & _
" ДоступныеПоля = ИсточникОператора.Источник.ДоступныеПоля;" & @CRLF & _
" " & @CRLF & _
" ТекущаяЧастьИмениПоля = 0;" & @CRLF & _
" Пока ТекущаяЧастьИмениПоля < ЧастиИмениПоля.Количество() Цикл " & @CRLF & _
" " & @CRLF & _
" ТекущееПоле = ДоступныеПоля.Найти(ЧастиИмениПоля.Получить(ТекущаяЧастьИмениПоля)); " & @CRLF & _
" " & @CRLF & _
" Если ТекущееПоле = Неопределено Тогда " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Инкрементация следующей части имени поля и соответствующего списка доступности полей." & @CRLF & _
" ТекущаяЧастьИмениПоля = ТекущаяЧастьИмениПоля + 1;" & @CRLF & _
" ДоступныеПоля = ТекущееПоле.Поля;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ЗаменитьСсылки" & @CRLF & _
"" & @CRLF & _
"Функция РазметитьМестаИспользования(Знач ПараметрыВыполнения, Знач Ссылка, Знач ЦелеваяСсылка, Знач ТаблицаПоиска)" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" // Устанавливаем порядок известных и проверяем наличие неопознанных объектов." & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("МестаИспользования", ТаблицаПоиска.НайтиСтроки(Новый Структура("Ссылка", Ссылка)));" & @CRLF & _
" Результат.Вставить("ОшибкиРазметки", Новый Массив);" & @CRLF & _
" Результат.Вставить("Успех", Истина);" & @CRLF & _
" " & @CRLF & _
" Для Каждого МестоИспользования Из Результат.МестаИспользования Цикл" & @CRLF & _
" Если МестоИспользования.ЭтоСлужебныеДанные Тогда" & @CRLF & _
" Продолжить; // Зависимые данные не обрабатываются." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Информация = ИнформацияОТипе(МестоИспользования.Метаданные, ПараметрыВыполнения);" & @CRLF & _
" Если Информация.Вид = "КОНСТАНТА" Тогда" & @CRLF & _
" МестоИспользования.КлючЗамены = "Константа";" & @CRLF & _
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Информация.Вид = "ПОСЛЕДОВАТЕЛЬНОСТЬ" Тогда" & @CRLF & _
" МестоИспользования.КлючЗамены = "Последовательность";" & @CRLF & _
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Информация.Вид = "РЕГИСТРСВЕДЕНИЙ" Тогда" & @CRLF & _
" МестоИспользования.КлючЗамены = "РегистрСведений";" & @CRLF & _
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Информация.Вид = "РЕГИСТРБУХГАЛТЕРИИ"" & @CRLF & _
" Или Информация.Вид = "РЕГИСТРНАКОПЛЕНИЯ"" & @CRLF & _
" Или Информация.Вид = "РЕГИСТРРАСЧЕТА" Тогда" & @CRLF & _
" МестоИспользования.КлючЗамены = "КлючЗаписи";" & @CRLF & _
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Информация.Ссылочный Тогда" & @CRLF & _
" МестоИспользования.КлючЗамены = "Объект";" & @CRLF & _
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" // Неизвестный объект для замены ссылок." & @CRLF & _
" Результат.Успех = Ложь;" & @CRLF & _
" Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Замена ссылок в ""%1"" не поддерживается.'"), Информация.ПолноеИмя);" & @CRLF & _
" ОписаниеОшибки = Новый Структура("Объект, Текст", МестоИспользования.Данные, Текст);" & @CRLF & _
" Результат.ОшибкиРазметки.Добавить(ОписаниеОшибки);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ТаблицаПоиска - см. МестаИспользования" & @CRLF & _
"//" & @CRLF & _
"Процедура ЗаменитьСсылкиКороткимиТранзакциями(Результат, Знач ПараметрыВыполнения, Знач Дубль, Знач ТаблицаПоиска)" & @CRLF & _
" " & @CRLF & _
" // Основной цикл обработки" & @CRLF & _
" ФильтрСсылок = Новый Структура("Ссылка, КлючЗамены");" & @CRLF & _
" " & @CRLF & _
" Результат.ЕстьОшибки = Ложь;" & @CRLF & _
" " & @CRLF & _
" ФильтрСсылок.Ссылка = Дубль;" & @CRLF & _
" ФильтрСсылок.КлючЗамены = "Константа";" & @CRLF & _
" " & @CRLF & _
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);" & @CRLF & _
" Для Каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ПроизвестиЗаменуВКонстанте(Результат, МестоИспользования, ПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ФильтрСсылок.КлючЗамены = "Объект";" & @CRLF & _
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);" & @CRLF & _
" Для Каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ПроизвестиЗаменуВОбъекте(Результат, МестоИспользования, ПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ФильтрСсылок.КлючЗамены = "КлючЗаписи";" & @CRLF & _
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);" & @CRLF & _
" Для Каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ПроизвестиЗаменуВНаборе(Результат, МестоИспользования, ПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ФильтрСсылок.КлючЗамены = "Последовательность";" & @CRLF & _
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);" & @CRLF & _
" Для Каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ПроизвестиЗаменуВНаборе(Результат, МестоИспользования, ПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ФильтрСсылок.КлючЗамены = "РегистрСведений";" & @CRLF & _
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);" & @CRLF & _
" Для Каждого МестоИспользования Из МестаИспользования Цикл" & @CRLF & _
" ПроизвестиЗаменуВРегистреСведений(Результат, МестоИспользования, ПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ПроизводимыеЗамены = Новый Массив;" & @CRLF & _
" ПроизводимыеЗамены.Добавить(Дубль);" & @CRLF & _
" " & @CRLF & _
" Если ПараметрыВыполнения.УдалятьНепосредственно" & @CRLF & _
" ИЛИ ПараметрыВыполнения.ПомечатьНаУдаление Тогда" & @CRLF & _
" " & @CRLF & _
" УстановитьПометкуУдаленияДляОбъектов(Результат, ПроизводимыеЗамены, ПараметрыВыполнения);" & @CRLF & _
" Иначе" & @CRLF & _
" " & @CRLF & _
" ТаблицаПовторногоПоиска = МестаИспользования(ПроизводимыеЗамены,, ПараметрыВыполнения.ПараметрыПоискаМестИспользования);" & @CRLF & _
" ДобавитьРезультатыЗаменыИзмененныхОбъектов(Результат, ТаблицаПовторногоПоиска);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ПроизвестиЗаменуВКонстанте(Результат, Знач МестоИспользования, Знач ПараметрыЗаписи)" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Данные = МестоИспользования.Данные;" & @CRLF & _
" МетаданныеКонстанты = МестоИспользования.Метаданные;" & @CRLF & _
" " & @CRLF & _
" ПредставлениеДанных = Строка(Данные);" & @CRLF & _
" " & @CRLF & _
" // Будем производить сразу все замены для этих данных." & @CRLF & _
" Фильтр = Новый Структура("Данные, КлючЗамены", Данные, "Константа");" & @CRLF & _
" ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования" & @CRLF & _
" // Помечаем как обработанные" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" Строка.КлючЗамены = "";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"" & @CRLF & _
" СостояниеОперации = "";" & @CRLF & _
" Ошибка = "";" & @CRLF & _
" НачатьТранзакцию();" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Блокировка = Новый БлокировкаДанных;" & @CRLF & _
" Блокировка.Добавить(МетаданныеКонстанты.ПолноеИмя());" & @CRLF & _
" Попытка" & @CRLF & _
" Блокировка.Заблокировать();" & @CRLF & _
" Исключение" & @CRLF & _
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось заблокировать константу %1'"), " & @CRLF & _
" ПредставлениеДанных);" & @CRLF & _
" СостояниеОперации = "ОшибкаБлокировки";" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" МенеджерКонстанты = Константы[МетаданныеКонстанты.Имя].СоздатьМенеджерЗначения();" & @CRLF & _
" МенеджерКонстанты.Прочитать();" & @CRLF & _
" " & @CRLF & _
" ЗаменаПроизведена = Ложь;" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" Если МенеджерКонстанты.Значение = Строка.Ссылка Тогда" & @CRLF & _
" МенеджерКонстанты.Значение = Строка.ЦелеваяСсылка;" & @CRLF & _
" ЗаменаПроизведена = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если Не ЗаменаПроизведена Тогда" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" " & @CRLF & _
" // Пытаемся сохранить" & @CRLF & _
" Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" ЗаписатьОбъект(МенеджерКонстанты, ПараметрыЗаписи);" & @CRLF & _
" Исключение" & @CRLF & _
" ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());" & @CRLF & _
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), " & @CRLF & _
" ПредставлениеДанных, ОписаниеОшибки);" & @CRLF & _
" СостояниеОперации = "ОшибкаЗаписи";" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗафиксироватьТранзакцию();" & @CRLF & _
" Исключение" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка," & @CRLF & _
" МетаданныеКонстанты,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" Если СостояниеОперации = "ОшибкаЗаписи" Тогда" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, " & @CRLF & _
" ОписаниеОшибкиЗамены("ОшибкаЗаписи", Данные, ПредставлениеДанных, Ошибка));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Иначе " & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, " & @CRLF & _
" ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, Ошибка));" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ПроизвестиЗаменуВОбъекте(Результат, Знач МестоИспользования, Знач ПараметрыВыполнения)" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Данные = МестоИспользования.Данные;" & @CRLF & _
" " & @CRLF & _
" // Будем производить сразу все замены для этих данных." & @CRLF & _
" Фильтр = Новый Структура("Данные, КлючЗамены", Данные, "Объект");" & @CRLF & _
" ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования" & @CRLF & _
" " & @CRLF & _
" ПредставлениеДанных = ПредметСтрокой(Данные);" & @CRLF & _
" СостояниеОперации = "";" & @CRLF & _
" ТекстОшибки = "";" & @CRLF & _
" НачатьТранзакцию();" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" " & @CRLF & _
" Блокировка = Новый БлокировкаДанных;" & @CRLF & _
" ЗаблокироватьМестоИспользования(ПараметрыВыполнения, Блокировка, МестоИспользования);" & @CRLF & _
" Попытка" & @CRLF & _
" Блокировка.Заблокировать();" & @CRLF & _
" Исключение" & @CRLF & _
" СостояниеОперации = "ОшибкаБлокировки";" & @CRLF & _
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Не удалось заблокировать объект ""%1"":" & @CRLF & _
" |%2'")," & @CRLF & _
" ПредставлениеДанных," & @CRLF & _
" ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" ОбъектыЗаписи = ИзмененныеОбъектыПриЗаменеВОбъекте(ПараметрыВыполнения, МестоИспользования, ОбрабатываемыеСтроки);" & @CRLF & _
" " & @CRLF & _
" // Пытаемся сохранить, сам объект идет последним." & @CRLF & _
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Если ПараметрыВыполнения.ВключатьБизнесЛогику Тогда" & @CRLF & _
" // Первая запись без контроля, чтобы устранить циклические ссылки." & @CRLF & _
" НовыеПараметрыВыполнения = СкопироватьРекурсивно(ПараметрыВыполнения);" & @CRLF & _
" НовыеПараметрыВыполнения.ВключатьБизнесЛогику = Ложь;" & @CRLF & _
" Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл" & @CRLF & _
" ЗаписатьОбъект(КлючЗначение.Ключ, НовыеПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" // Вторая запись c контролем." & @CRLF & _
" НовыеПараметрыВыполнения.ВключатьБизнесЛогику = Истина;" & @CRLF & _
" Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл" & @CRLF & _
" ЗаписатьОбъект(КлючЗначение.Ключ, НовыеПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Иначе" & @CRLF & _
" // Запись без контроля бизнес-логики." & @CRLF & _
" Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл" & @CRLF & _
" ЗаписатьОбъект(КлючЗначение.Ключ, ПараметрыВыполнения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Исключение" & @CRLF & _
" СостояниеОперации = "ОшибкаЗаписи";" & @CRLF & _
" ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());" & @CRLF & _
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), " & @CRLF & _
" ПредставлениеДанных, ОписаниеОшибки);" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" ЗафиксироватьТранзакцию();" & @CRLF & _
" " & @CRLF & _
" Исключение" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" Информация = ИнформацияОбОшибке();" & @CRLF & _
" ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка," & @CRLF & _
" МестоИспользования.Метаданные,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));" & @CRLF & _
" Ошибка = ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, ТекстОшибки);" & @CRLF & _
" Если СостояниеОперации = "ОшибкаЗаписи" Тогда" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, Ошибка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Иначе " & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, МестоИспользования.Ссылка, Ошибка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" // Помечаем как обработанные" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" Строка.КлючЗамены = "";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ПроизвестиЗаменуВНаборе(Результат, Знач МестоИспользования, Знач ПараметрыВыполнения)" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Данные = МестоИспользования.Данные;" & @CRLF & _
" Мета = МестоИспользования.Метаданные;" & @CRLF & _
" " & @CRLF & _
" ПредставлениеДанных = Строка(Данные);" & @CRLF & _
" " & @CRLF & _
" // Будем производить сразу все замены для этих данных." & @CRLF & _
" Фильтр = Новый Структура("Данные, КлючЗамены");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Фильтр, МестоИспользования);" & @CRLF & _
" ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования" & @CRLF & _
" " & @CRLF & _
" ОписаниеНабора = ОписаниеКлючаЗаписи(Мета);" & @CRLF & _
" НаборЗаписей = ОписаниеНабора.НаборЗаписей; // РегистрСведенийНаборЗаписей" & @CRLF & _
" " & @CRLF & _
" ПарыЗамен = Новый Соответствие;" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" ПарыЗамен.Вставить(Строка.Ссылка, Строка.ЦелеваяСсылка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Помечаем как обработанные" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" Строка.КлючЗамены = "";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" СостояниеОперации = "";" & @CRLF & _
" Ошибка = "";" & @CRLF & _
" НачатьТранзакцию();" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" " & @CRLF & _
" // Блокировка и подготовка набора." & @CRLF & _
" Блокировка = Новый БлокировкаДанных;" & @CRLF & _
" Для Каждого КлючЗначение Из ОписаниеНабора.СписокИзмерений Цикл" & @CRLF & _
" ТипИзмерения = КлючЗначение.Значение;" & @CRLF & _
" Имя = КлючЗначение.Ключ;" & @CRLF & _
" Значение = Данные[Имя];" & @CRLF & _
" " & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" ТекущаяСсылка = Строка.Ссылка;" & @CRLF & _
" Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда" & @CRLF & _
" Блокировка.Добавить(ОписаниеНабора.ПространствоБлокировки).УстановитьЗначение(Имя, ТекущаяСсылка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" НаборЗаписей.Отбор[Имя].Установить(Значение);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Блокировка.Заблокировать();" & @CRLF & _
" Исключение" & @CRLF & _
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось заблокировать набор %1'"), " & @CRLF & _
" ПредставлениеДанных);" & @CRLF & _
" СостояниеОперации = "ОшибкаБлокировки";" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" НаборЗаписей.Прочитать();" & @CRLF & _
" ЗаменитьВКоллекцииСтрок("НаборЗаписей", "НаборЗаписей", НаборЗаписей, НаборЗаписей, ОписаниеНабора.СписокПолей, ПарыЗамен);" & @CRLF & _
" " & @CRLF & _
" Если НаборЗаписей.Модифицированность() Тогда" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли; " & @CRLF & _
"" & @CRLF & _
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" ЗаписатьОбъект(НаборЗаписей, ПараметрыВыполнения);" & @CRLF & _
" Исключение" & @CRLF & _
" ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());" & @CRLF & _
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), " & @CRLF & _
" ПредставлениеДанных, ОписаниеОшибки);" & @CRLF & _
" СостояниеОперации = "ОшибкаЗаписи";" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗафиксироватьТранзакцию();" & @CRLF & _
" " & @CRLF & _
" Исключение" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" Информация = ИнформацияОбОшибке();" & @CRLF & _
" ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка," & @CRLF & _
" Мета,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));" & @CRLF & _
" Ошибка = ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, Ошибка);" & @CRLF & _
" Если СостояниеОперации = "ОшибкаЗаписи" Тогда" & @CRLF & _
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, Ошибка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Иначе " & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, МестоИспользования.Ссылка, Ошибка);" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ПроизвестиЗаменуВРегистреСведений(Результат, Знач МестоИспользования, Знач ПараметрыВыполнения)" & @CRLF & _
" " & @CRLF & _
" Если МестоИспользования.Обработано Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" МестоИспользования.Обработано = Истина;" & @CRLF & _
" " & @CRLF & _
" // В случае, если дубль указан в измерениях набора, тогда используется 2 набора записей:" & @CRLF & _
" // НаборЗаписейДубля - чтение старых значений (по старым измерениям) и удаление старых значений." & @CRLF & _
" // НаборЗаписейОригинала - чтение актуальных значений (по новым измерениям) и запись новых значений." & @CRLF & _
" // Данные дублей и оригиналов объединяются по правилам:" & @CRLF & _
" // Приоритет у данных оригинала." & @CRLF & _
" // Если в оригинале нет данных, то берутся данные из дубля." & @CRLF & _
" // Набор оригинала записывается, а набор дубля удаляется." & @CRLF & _
" //" & @CRLF & _
" // В случае, если дубль не указан в измерениях набора, тогда используется 1 набор записей:" & @CRLF & _
" // НаборЗаписейДубля - чтение старых значений и запись новых значений." & @CRLF & _
" //" & @CRLF & _
" // Замена ссылок в ресурсах и реквизитах производится в обоих случаях." & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" Дубль = МестоИспользования.Ссылка;" & @CRLF & _
" Оригинал = МестоИспользования.ЦелеваяСсылка;" & @CRLF & _
" " & @CRLF & _
" МетаданныеРегистра = МестоИспользования.Метаданные;" & @CRLF & _
" КлючЗаписиРегистра = МестоИспользования.Данные;" & @CRLF & _
" " & @CRLF & _
" Информация = ИнформацияОТипе(МетаданныеРегистра, ПараметрыВыполнения);" & @CRLF & _
" " & @CRLF & _
" ТребуетсяДваНабора = Ложь;" & @CRLF & _
" Для Каждого КлючЗначение Из Информация.Измерения Цикл" & @CRLF & _
" ЗначениеИзмеренияДубля = КлючЗаписиРегистра[КлючЗначение.Ключ];" & @CRLF & _
" Если ЗначениеИзмеренияДубля = Дубль" & @CRLF & _
" Или ПараметрыВыполнения.УспешныеЗамены[ЗначениеИзмеренияДубля] = Дубль Тогда" & @CRLF & _
" ТребуетсяДваНабора = Истина; // Дубль указан в измерениях." & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Менеджер = МенеджерОбъектаПоПолномуИмени(Информация.ПолноеИмя);" & @CRLF & _
" НаборЗаписейДубля = Менеджер.СоздатьНаборЗаписей();" & @CRLF & _
" " & @CRLF & _
" Если ТребуетсяДваНабора Тогда" & @CRLF & _
" ЗначенияИзмеренийОригинала = Новый Структура;" & @CRLF & _
" НаборЗаписейОригинала = Менеджер.СоздатьНаборЗаписей();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" НачатьТранзакцию();" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" Блокировка = Новый БлокировкаДанных;" & @CRLF & _
" БлокировкаДубля = Блокировка.Добавить(Информация.ПолноеИмя);" & @CRLF & _
" Если ТребуетсяДваНабора Тогда" & @CRLF & _
" БлокировкаОригинала = Блокировка.Добавить(Информация.ПолноеИмя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючЗначение Из Информация.Измерения Цикл" & @CRLF & _
" ЗначениеИзмеренияДубля = КлючЗаписиРегистра[КлючЗначение.Ключ];" & @CRLF & _
" " & @CRLF & _
" // Для решения проблемы уникальности" & @CRLF & _
" // выполняется замена старых значений измерений ключа записи на актуальные." & @CRLF & _
" // Соответствие старых и актуальных обеспечивает соответствием УспешныеЗамены." & @CRLF & _
" // Данные соответствия актуальны на текущий момент времени," & @CRLF & _
" // т.к. пополняются только после успешной обработки очередной пары и фиксации транзакции." & @CRLF & _
" НовоеЗначениеИзмеренияДубля = ПараметрыВыполнения.УспешныеЗамены[ЗначениеИзмеренияДубля];" & @CRLF & _
" Если НовоеЗначениеИзмеренияДубля <> Неопределено Тогда" & @CRLF & _
" ЗначениеИзмеренияДубля = НовоеЗначениеИзмеренияДубля;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" НаборЗаписейДубля.Отбор[КлючЗначение.Ключ].Установить(ЗначениеИзмеренияДубля);" & @CRLF & _
" " & @CRLF & _
" // Замена в конкретной паре и блокировка на конкретную замену." & @CRLF & _
" БлокировкаДубля.УстановитьЗначение(КлючЗначение.Ключ, ЗначениеИзмеренияДубля);" & @CRLF & _
" " & @CRLF & _
" " & @CRLF & _
" Если ТребуетсяДваНабора Тогда" & @CRLF & _
" Если ЗначениеИзмеренияДубля = Дубль Тогда" & @CRLF & _
" ЗначениеИзмеренияОригинала = Оригинал;" & @CRLF & _
" Иначе" & @CRLF & _
" ЗначениеИзмеренияОригинала = ЗначениеИзмеренияДубля;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" НаборЗаписейОригинала.Отбор[КлючЗначение.Ключ].Установить(ЗначениеИзмеренияОригинала);" & @CRLF & _
" ЗначенияИзмеренийОригинала.Вставить(КлючЗначение.Ключ, ЗначениеИзмеренияОригинала);" & @CRLF & _
" " & @CRLF & _
" // Замена в конкретной паре и блокировка на конкретную замену." & @CRLF & _
" БлокировкаОригинала.УстановитьЗначение(КлючЗначение.Ключ, ЗначениеИзмеренияОригинала);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Установка блокировки." & @CRLF & _
" Попытка" & @CRLF & _
" Блокировка.Заблокировать();" & @CRLF & _
" Исключение" & @CRLF & _
" // Вид ошибки "БлокировкаДляРегистра"." & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" // Откуда читаем?" & @CRLF & _
" НаборЗаписейДубля.Прочитать();" & @CRLF & _
" Если НаборЗаписейДубля.Количество() = 0 Тогда // Нечего писать." & @CRLF & _
" ОтменитьТранзакцию(); // Замена не требуется." & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ЗаписьДубля = НаборЗаписейДубля[0];" & @CRLF & _
" " & @CRLF & _
" // Куда пишем?" & @CRLF & _
" Если ТребуетсяДваНабора Тогда" & @CRLF & _
" // Пишем в набор с другими измерениями." & @CRLF & _
" НаборЗаписейОригинала.Прочитать();" & @CRLF & _
" Если НаборЗаписейОригинала.Количество() = 0 Тогда" & @CRLF & _
" ЗаписьОригинала = НаборЗаписейОригинала.Добавить();" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ЗаписьОригинала, ЗаписьДубля);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ЗаписьОригинала, ЗначенияИзмеренийОригинала);" & @CRLF & _
" Иначе" & @CRLF & _
" ЗаписьОригинала = НаборЗаписейОригинала[0];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Иначе" & @CRLF & _
" // Пишем туда-же, откуда и читаем." & @CRLF & _
" НаборЗаписейОригинала = НаборЗаписейДубля;" & @CRLF & _
" ЗаписьОригинала = ЗаписьДубля; // Ситуация с нулевым количеством записей в наборе обработана выше." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Замена дубля на оригинал в ресурсах и реквизитах." & @CRLF & _
" Для Каждого КлючЗначение Из Информация.Ресурсы Цикл" & @CRLF & _
" ЗначениеРеквизитаВОригинале = ЗаписьОригинала[КлючЗначение.Ключ];" & @CRLF & _
" Если ЗначениеРеквизитаВОригинале = Дубль Тогда" & @CRLF & _
" ЗаписьОригинала[КлючЗначение.Ключ] = Оригинал;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого КлючЗначение Из Информация.Реквизиты Цикл" & @CRLF & _
" ЗначениеРеквизитаВОригинале = ЗаписьОригинала[КлючЗначение.Ключ];" & @CRLF & _
" Если ЗначениеРеквизитаВОригинале = Дубль Тогда" & @CRLF & _
" ЗаписьОригинала[КлючЗначение.Ключ] = Оригинал;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Удаление данных дубля." & @CRLF & _
" Если ТребуетсяДваНабора Тогда" & @CRLF & _
" НаборЗаписейДубля.Очистить();" & @CRLF & _
" Попытка" & @CRLF & _
" ЗаписатьОбъект(НаборЗаписейДубля, ПараметрыВыполнения);" & @CRLF & _
" Исключение" & @CRLF & _
" // Вид ошибки "УдалитьНаборДубля"." & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Запись данных оригинала." & @CRLF & _
" Если НаборЗаписейОригинала.Модифицированность() Тогда" & @CRLF & _
" Попытка" & @CRLF & _
" ЗаписатьОбъект(НаборЗаписейОригинала, ПараметрыВыполнения);" & @CRLF & _
" Исключение" & @CRLF & _
" // Вид ошибки "ЗаписатьНаборОригинала"." & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗафиксироватьТранзакцию();" & @CRLF & _
" Исключение" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" ЗарегистрироватьОшибкуВТаблицу(Результат, Дубль, Оригинал, КлючЗаписиРегистра, Информация, " & @CRLF & _
" "БлокировкаДляРегистра", ИнформацияОбОшибке());" & @CRLF & _
" КонецПопытки" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция ИзмененныеОбъектыПриЗаменеВОбъекте(ПараметрыВыполнения, МестоИспользования, ОбрабатываемыеСтроки)" & @CRLF & _
" Данные = МестоИспользования.Данные;" & @CRLF & _
" ОписаниеПоследовательностей = ОписаниеПоследовательностей(МестоИспользования.Метаданные);" & @CRLF & _
" ОписаниеДвижений = ОписаниеДвижений(МестоИспользования.Метаданные);" & @CRLF & _
" ОписаниеЗадач = ОписаниеЗадач(МестоИспользования.Метаданные);" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" // Возвращаем измененные обработанные объекты." & @CRLF & _
" Измененные = Новый Соответствие;" & @CRLF & _
" " & @CRLF & _
" // Считываем" & @CRLF & _
" Описание = ОписаниеОбъекта(Данные.Метаданные());" & @CRLF & _
" Попытка" & @CRLF & _
" Объект = Данные.ПолучитьОбъект();" & @CRLF & _
" Исключение" & @CRLF & _
" // Был уже обработан с ошибками." & @CRLF & _
" Объект = Неопределено;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если Объект = Неопределено Тогда" & @CRLF & _
" Возврат Измененные;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл" & @CRLF & _
" ОписаниеДвижения.НаборЗаписей.Отбор.Регистратор.Установить(Данные);" & @CRLF & _
" ОписаниеДвижения.НаборЗаписей.Прочитать();" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл" & @CRLF & _
" ОписаниеПоследовательности.НаборЗаписей.Отбор.Регистратор.Установить(Данные);" & @CRLF & _
" ОписаниеПоследовательности.НаборЗаписей.Прочитать();" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Заменяем сразу все варианты." & @CRLF & _
" ПарыЗамен = Новый Соответствие;" & @CRLF & _
" Для Каждого МестоИспользования Из ОбрабатываемыеСтроки Цикл" & @CRLF & _
" ПарыЗамен.Вставить(МестоИспользования.Ссылка, МестоИспользования.ЦелеваяСсылка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ВыполнитьЗаменуВРеквизитахОбъекта(Объект, Описание, ПарыЗамен);" & @CRLF & _
" " & @CRLF & _
" // Движения" & @CRLF & _
" Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл" & @CRLF & _
" ЗаменитьВКоллекцииСтрок(" & @CRLF & _
" "Движения"," & @CRLF & _
" ОписаниеДвижения.ПространствоБлокировки," & @CRLF & _
" ОписаниеДвижения.НаборЗаписей," & @CRLF & _
" ОписаниеДвижения.НаборЗаписей," & @CRLF & _
" ОписаниеДвижения.СписокПолей," & @CRLF & _
" ПарыЗамен);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Последовательности" & @CRLF & _
" Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл" & @CRLF & _
" ЗаменитьВКоллекцииСтрок(" & @CRLF & _
" "Последовательности"," & @CRLF & _
" ОписаниеПоследовательности.ПространствоБлокировки," & @CRLF & _
" ОписаниеПоследовательности.НаборЗаписей," & @CRLF & _
" ОписаниеПоследовательности.НаборЗаписей," & @CRLF & _
" ОписаниеПоследовательности.СписокПолей," & @CRLF & _
" ПарыЗамен);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл" & @CRLF & _
" Если ОписаниеДвижения.НаборЗаписей.Модифицированность() Тогда" & @CRLF & _
" Измененные.Вставить(ОписаниеДвижения.НаборЗаписей, Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл" & @CRLF & _
" Если ОписаниеПоследовательности.НаборЗаписей.Модифицированность() Тогда" & @CRLF & _
" Измененные.Вставить(ОписаниеПоследовательности.НаборЗаписей, Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ОписаниеЗадач <> Неопределено Тогда" & @CRLF & _
" " & @CRLF & _
" ЗадачаПроцесса = ЗадачиПроцесса(Данные, ОписаниеЗадач.ПространствоБлокировки);" & @CRLF & _
" Пока ЗадачаПроцесса.Следующий() Цикл" & @CRLF & _
" " & @CRLF & _
" ЗадачаОбъект = ЗадачаПроцесса.Ссылка.ПолучитьОбъект();" & @CRLF & _
" Фильтр = Новый Структура("Данные, КлючЗамены", ЗадачаПроцесса.Ссылка, "Объект");" & @CRLF & _
" ОбрабатываемыеСтрокиЗадачи = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования" & @CRLF & _
" Для каждого МестоИспользованияЗадачи Из ОбрабатываемыеСтрокиЗадачи Цикл" & @CRLF & _
" ПарыЗамен.Вставить(МестоИспользованияЗадачи.Ссылка, МестоИспользованияЗадачи.ЦелеваяСсылка); " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ВыполнитьЗаменуВРеквизитахОбъекта(ЗадачаОбъект, ОписаниеЗадач, ПарыЗамен);" & @CRLF & _
" " & @CRLF & _
" Если ЗадачаОбъект.Модифицированность() Тогда" & @CRLF & _
" Измененные.Вставить(ЗадачаОбъект, Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Сам объект последний - для возможного перепроведения." & @CRLF & _
" Если Объект.Модифицированность() Тогда" & @CRLF & _
" Измененные.Вставить(Объект, Описание.МожетБытьПроведен);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Измененные;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ЗадачиПроцесса(БизнесПроцесс, ТипЗадач)" & @CRLF & _
"" & @CRLF & _
" ТекстЗапроса = "ВЫБРАТЬ" & @CRLF & _
" | ИмяТаблицы.Ссылка" & @CRLF & _
" |ИЗ" & @CRLF & _
" | &ИмяТаблицы КАК ИмяТаблицы" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | ИмяТаблицы.БизнесПроцесс = &БизнесПроцесс";" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ТипЗадач);" & @CRLF & _
" Запрос = Новый Запрос(ТекстЗапроса);" & @CRLF & _
" Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);" & @CRLF & _
" Возврат Запрос.Выполнить().Выбрать();" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Процедура ВыполнитьЗаменуВРеквизитахОбъекта(Объект, Описание, ПарыЗамен)" & @CRLF & _
" " & @CRLF & _
" // Реквизиты" & @CRLF & _
" Для Каждого КлючЗначение Из Описание.Реквизиты Цикл" & @CRLF & _
" Имя = КлючЗначение.Ключ;" & @CRLF & _
" ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];" & @CRLF & _
" Если ЦелеваяСсылка <> Неопределено Тогда" & @CRLF & _
" ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, "Реквизиты", Имя);" & @CRLF & _
" Объект[Имя] = ЦелеваяСсылка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Стандартные реквизиты" & @CRLF & _
" Для Каждого КлючЗначение Из Описание.СтандартныеРеквизиты Цикл" & @CRLF & _
" Имя = КлючЗначение.Ключ;" & @CRLF & _
" ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];" & @CRLF & _
" Если ЦелеваяСсылка <> Неопределено Тогда" & @CRLF & _
" ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, "СтандартныеРеквизиты", Имя);" & @CRLF & _
" Объект[Имя] = ЦелеваяСсылка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Табличные части" & @CRLF & _
" Для Каждого Элемент Из Описание.ТабличныеЧасти Цикл" & @CRLF & _
" ЗаменитьВКоллекцииСтрок(" & @CRLF & _
" "ТабличныеЧасти"," & @CRLF & _
" Элемент.Имя," & @CRLF & _
" Объект," & @CRLF & _
" Объект[Элемент.Имя]," & @CRLF & _
" Элемент.СписокПолей," & @CRLF & _
" ПарыЗамен);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Стандартные табличные части." & @CRLF & _
" Для Каждого Элемент Из Описание.СтандартныеТабличныеЧасти Цикл" & @CRLF & _
" ЗаменитьВКоллекцииСтрок(" & @CRLF & _
" "СтандартныеТабличныеЧасти"," & @CRLF & _
" Элемент.Имя," & @CRLF & _
" Объект," & @CRLF & _
" Объект[Элемент.Имя]," & @CRLF & _
" Элемент.СписокПолей," & @CRLF & _
" ПарыЗамен);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"" & @CRLF & _
" Для Каждого Реквизит Из Описание.РеквизитыАдресации Цикл" & @CRLF & _
" Имя = Реквизит.Ключ;" & @CRLF & _
" ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];" & @CRLF & _
" Если ЦелеваяСсылка <> Неопределено Тогда" & @CRLF & _
" ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, "РеквизитыАдресации", Имя);" & @CRLF & _
" Объект[Имя] = ЦелеваяСсылка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ЗарегистрироватьФактЗамены(Объект, СсылкаДубля, СсылкаОригинала, ВидРеквизита, ИмяРеквизита, " & @CRLF & _
" Индекс = Неопределено, ИмяКолонки = Неопределено)" & @CRLF & _
" " & @CRLF & _
" ЕстьДополнительныеСвойства = Новый Структура("ДополнительныеСвойства");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ЕстьДополнительныеСвойства, Объект);" & @CRLF & _
" Если ТипЗнч(ЕстьДополнительныеСвойства.ДополнительныеСвойства) <> Тип("Структура") Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ДополнительныеСвойства = Объект.ДополнительныеСвойства;" & @CRLF & _
" ДополнительныеСвойства.Вставить("ЗаменаСсылок", Истина);" & @CRLF & _
" ВыполненныеЗамены = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ВыполненныеЗамены");" & @CRLF & _
" Если ВыполненныеЗамены = Неопределено Тогда" & @CRLF & _
" ВыполненныеЗамены = Новый Массив;" & @CRLF & _
" ДополнительныеСвойства.Вставить("ВыполненныеЗамены", ВыполненныеЗамены);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеЗамены = Новый Структура;" & @CRLF & _
" ОписаниеЗамены.Вставить("СсылкаДубля", СсылкаДубля);" & @CRLF & _
" ОписаниеЗамены.Вставить("СсылкаОригинала", СсылкаОригинала);" & @CRLF & _
" ОписаниеЗамены.Вставить("ВидРеквизита", ВидРеквизита);" & @CRLF & _
" ОписаниеЗамены.Вставить("ИмяРеквизита", ИмяРеквизита);" & @CRLF & _
" ОписаниеЗамены.Вставить("Индекс", Индекс);" & @CRLF & _
" ОписаниеЗамены.Вставить("ИмяКолонки", ИмяКолонки);" & @CRLF & _
" ВыполненныеЗамены.Добавить(ОписаниеЗамены);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура УстановитьПометкуУдаленияДляОбъектов(Результат, Знач УдаляемыеСсылки, Знач ПараметрыВыполнения)" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" ЕстьВнешняяТранзакция = ТранзакцияАктивна();" & @CRLF & _
" ВсеМестаИспользования = МестаИспользования(УдаляемыеСсылки,,ПараметрыВыполнения.ПараметрыПоискаМестИспользования);" & @CRLF & _
" Для Каждого УдаляемаяСсылка Из УдаляемыеСсылки Цикл" & @CRLF & _
" Информация = ИнформацияОТипе(ТипЗнч(УдаляемаяСсылка), ПараметрыВыполнения);" & @CRLF & _
" Блокировка = Новый БлокировкаДанных;" & @CRLF & _
" Блокировка.Добавить(Информация.ПолноеИмя).УстановитьЗначение("Ссылка", УдаляемаяСсылка);" & @CRLF & _
" " & @CRLF & _
" НачатьТранзакцию();" & @CRLF & _
" Попытка" & @CRLF & _
" ЭтоОшибкаБлокировки = Истина;" & @CRLF & _
" Блокировка.Заблокировать();" & @CRLF & _
" " & @CRLF & _
" ЭтоОшибкаБлокировки = Ложь;" & @CRLF & _
" Успешно = УстановитьПометкуУдаления(Результат, УдаляемаяСсылка, ВсеМестаИспользования, " & @CRLF & _
" ПараметрыВыполнения, ЕстьВнешняяТранзакция);" & @CRLF & _
" Если Не Успешно Тогда" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ЗафиксироватьТранзакцию();" & @CRLF & _
" Исключение" & @CRLF & _
" ОтменитьТранзакцию();" & @CRLF & _
" Если ЭтоОшибкаБлокировки Тогда " & @CRLF & _
" ЗарегистрироватьОшибкуВТаблицу(Результат, УдаляемаяСсылка, Неопределено, УдаляемаяСсылка, Информация, " & @CRLF & _
" "БлокировкаДляУдаленияДубля", ИнформацияОбОшибке());" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Если ЕстьВнешняяТранзакция Тогда" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция УстановитьПометкуУдаления(Результат, Знач УдаляемаяСсылка, Знач ВсеМестаИспользования, Знач ПараметрыВыполнения, " & @CRLF & _
" ЕстьВнешняяТранзакция)" & @CRLF & _
"" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" " & @CRLF & _
" ПредставлениеСсылки = ПредметСтрокой(УдаляемаяСсылка);" & @CRLF & _
" Фильтр = Новый Структура("Ссылка");" & @CRLF & _
" Фильтр.Ссылка = УдаляемаяСсылка;" & @CRLF & _
" МестаИспользования = ВсеМестаИспользования.НайтиСтроки(Фильтр);" & @CRLF & _
" " & @CRLF & _
" Индекс = МестаИспользования.ВГраница();" & @CRLF & _
" Пока Индекс >= 0 Цикл" & @CRLF & _
" Если МестаИспользования[Индекс].ВспомогательныеДанные Тогда" & @CRLF & _
" МестаИспользования.Удалить(Индекс);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Индекс = Индекс - 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если МестаИспользования.Количество() > 0 Тогда" & @CRLF & _
" ДобавитьРезультатыЗаменыИзмененныхОбъектов(Результат, МестаИспользования);" & @CRLF & _
" Возврат Ложь; // Остались места использования, нельзя удалять." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Объект = УдаляемаяСсылка.ПолучитьОбъект(); // ДокументОбъект, СправочникОбъект" & @CRLF & _
" Если Объект = Неопределено Тогда" & @CRLF & _
" Возврат Ложь; // Уже удален." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Успешно = Истина;" & @CRLF & _
" Попытка " & @CRLF & _
" ОбработатьОбъектСПерехватомСообщений(Объект, "ПометкаУдаления", " & @CRLF & _
" Неопределено, ПараметрыВыполнения);" & @CRLF & _
" Результат.ОчередьКНепосредственномуУдалению.Добавить(Объект.Ссылка);" & @CRLF & _
" Исключение" & @CRLF & _
" ТекстОшибки = НСтр("ru = 'Элемент не был помечен на удаление по причине:'");" & @CRLF & _
" ТекстОшибки = ТекстОшибки + Символы.ПС + СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" ОписаниеОшибки = ОписаниеОшибкиЗамены("ОшибкаУдаления", УдаляемаяСсылка, ПредставлениеСсылки, ТекстОшибки);" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, УдаляемаяСсылка, ОписаниеОшибки);" & @CRLF & _
" Успешно = Ложь;" & @CRLF & _
" Если ЕстьВнешняяТранзакция Тогда" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Возврат Успешно;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Процедура ДобавитьРезультатыЗаменыИзмененныхОбъектов(Результат, ТаблицаПовторногоПоиска)" & @CRLF & _
" " & @CRLF & _
" Фильтр = Новый Структура("ТипОшибки, Ссылка, ОбъектОшибки", "");" & @CRLF & _
" Для Каждого Строка Из ТаблицаПовторногоПоиска Цикл" & @CRLF & _
" Тест = Новый Структура("ВспомогательныеДанные", Ложь);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Тест, Строка);" & @CRLF & _
" Если Тест.ВспомогательныеДанные Тогда" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Данные = Строка.Данные;" & @CRLF & _
" Ссылка = Строка.Ссылка;" & @CRLF & _
" " & @CRLF & _
" ПредставлениеДанных = Строка(Данные);" & @CRLF & _
" " & @CRLF & _
" Фильтр.ОбъектОшибки = Данные;" & @CRLF & _
" Фильтр.Ссылка = Ссылка;" & @CRLF & _
" Если Результат.Ошибки.НайтиСтроки(Фильтр).Количество() > 0 Тогда" & @CRLF & _
" Продолжить; // По данной проблеме уже записана ошибка." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Ссылка, " & @CRLF & _
" ОписаниеОшибкиЗамены("ДанныеИзменены", Данные, ПредставлениеДанных," & @CRLF & _
" НСтр("ru = 'Заменены не все места использования. Возможно места использования были добавлены или изменены другим пользователем.'")));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ЗаблокироватьМестоИспользования(ПараметрыВыполнения, Блокировка, МестоИспользования)" & @CRLF & _
" " & @CRLF & _
" Если МестоИспользования.КлючЗамены = "Константа" Тогда" & @CRLF & _
" " & @CRLF & _
" Блокировка.Добавить(МестоИспользования.Метаданные.ПолноеИмя());" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МестоИспользования.КлючЗамены = "Объект" Тогда" & @CRLF & _
" " & @CRLF & _
" СсылкаОбъекта = МестоИспользования.Данные;" & @CRLF & _
" МетаданныеОбъекта = МестоИспользования.Метаданные;" & @CRLF & _
" " & @CRLF & _
" // Сам объект." & @CRLF & _
" Блокировка.Добавить(МетаданныеОбъекта.ПолноеИмя()).УстановитьЗначение("Ссылка", СсылкаОбъекта);" & @CRLF & _
" " & @CRLF & _
" // Движения по регистратору." & @CRLF & _
" ОписаниеДвижений = ОписаниеДвижений(МетаданныеОбъекта);" & @CRLF & _
" Для Каждого Элемент Из ОписаниеДвижений Цикл" & @CRLF & _
" Блокировка.Добавить(Элемент.ПространствоБлокировки + ".НаборЗаписей").УстановитьЗначение("Регистратор", СсылкаОбъекта);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Последовательности." & @CRLF & _
" ОписаниеПоследовательностей = ОписаниеПоследовательностей(МетаданныеОбъекта);" & @CRLF & _
" Для Каждого Элемент Из ОписаниеПоследовательностей Цикл" & @CRLF & _
" Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение("Регистратор", СсылкаОбъекта);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Задачи (для бизнес-процессов)" & @CRLF & _
" ОписаниеЗадач = ОписаниеЗадач(МетаданныеОбъекта);" & @CRLF & _
" Если ОписаниеЗадач <> Неопределено Тогда" & @CRLF & _
" Блокировка.Добавить(ОписаниеЗадач.ПространствоБлокировки).УстановитьЗначение("БизнесПроцесс", СсылкаОбъекта); " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МестоИспользования.КлючЗамены = "Последовательность" Тогда" & @CRLF & _
" " & @CRLF & _
" СсылкаОбъекта = МестоИспользования.Данные;" & @CRLF & _
" МетаданныеОбъекта = МестоИспользования.Метаданные;" & @CRLF & _
" " & @CRLF & _
" ОписаниеПоследовательностей = ОписаниеПоследовательностей(МетаданныеОбъекта);" & @CRLF & _
" Для Каждого Элемент Из ОписаниеПоследовательностей Цикл" & @CRLF & _
" Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение("Регистратор", СсылкаОбъекта);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МестоИспользования.КлючЗамены = "КлючЗаписи"" & @CRLF & _
" Или МестоИспользования.КлючЗамены = "РегистрСведений" Тогда" & @CRLF & _
" " & @CRLF & _
" Информация = ИнформацияОТипе(МестоИспользования.Метаданные, ПараметрыВыполнения);" & @CRLF & _
" ТипДубля = МестоИспользования.ТипСсылки;" & @CRLF & _
" ТипОригинала = ТипЗнч(МестоИспользования.ЦелеваяСсылка);" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючЗначение Из Информация.Измерения Цикл" & @CRLF & _
" ТипИзмерения = КлючЗначение.Значение.Тип;" & @CRLF & _
" Если ТипИзмерения.СодержитТип(ТипДубля) Тогда" & @CRLF & _
" БлокировкаПоИзмерению = Блокировка.Добавить(Информация.ПолноеИмя);" & @CRLF & _
" БлокировкаПоИзмерению.УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.Ссылка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Если ТипИзмерения.СодержитТип(ТипОригинала) Тогда" & @CRLF & _
" БлокировкаПоИзмерению = Блокировка.Добавить(Информация.ПолноеИмя);" & @CRLF & _
" БлокировкаПоИзмерению.УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.ЦелеваяСсылка);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ОтключитьОбновлениеКлючейДоступа(Значение)" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" МодульУправлениеДоступом = ОбщийМодуль("УправлениеДоступом");" & @CRLF & _
" МодульУправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Значение);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры " & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив из Структура:" & @CRLF & _
"// * СписокПолей - Структура" & @CRLF & _
"// * СтруктураИзмерений - Структура" & @CRLF & _
"// * СписокВедущих - Структура" & @CRLF & _
"// * НаборЗаписей - РегистрСведенийНаборЗаписей" & @CRLF & _
"// * ПространствоБлокировки - Строка" & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеДвижений(Знач ОбъектМетаданных)" & @CRLF & _
" " & @CRLF & _
" ОписаниеДвижений = Новый Массив;" & @CRLF & _
" Если Не Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Возврат ОписаниеДвижений;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Движение Из ОбъектМетаданных.Движения Цикл" & @CRLF & _
" " & @CRLF & _
" Если Метаданные.РегистрыНакопления.Содержит(Движение) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыНакопления[Движение.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИсключатьПоля = "Активность, НомерСтроки, Период, Регистратор"; " & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыСведений.Содержит(Движение) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыСведений[Движение.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИсключатьПоля = "Активность, ВидДвижения, НомерСтроки, Период, Регистратор"; " & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Движение) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыБухгалтерии[Движение.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИсключатьПоля = "Активность, ВидДвижения, НомерСтроки, Период, Регистратор"; " & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движение) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыРасчета[Движение.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИсключатьПоля = "Активность, БазовыйПериодКонец, БазовыйПериодНачало, НомерСтроки, ПериодДействия," & @CRLF & _
" |ПериодДействияКонец, ПериодДействияНачало, ПериодРегистрации, Регистратор, Сторно," & @CRLF & _
" |ФактическийПериодДействия";" & @CRLF & _
" Иначе" & @CRLF & _
" // Неизвестный тип" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Поля ссылочного типа и измерения - кандидаты." & @CRLF & _
" // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы." & @CRLF & _
" Описание = СпискиПолейОбъекта(НаборЗаписей, Движение.Измерения, ИсключатьПоля);" & @CRLF & _
" Если Описание.СписокПолей.Количество() = 0 Тогда" & @CRLF & _
" // Незачем обрабатывать" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Описание.Вставить("НаборЗаписей", НаборЗаписей);" & @CRLF & _
" Описание.Вставить("ПространствоБлокировки", Движение.ПолноеИмя() );" & @CRLF & _
" " & @CRLF & _
" ОписаниеДвижений.Добавить(Описание);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеДвижений;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Мета - ОбъектМетаданных" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив из Структура:" & @CRLF & _
"// * НаборЗаписей - ПоследовательностьНаборЗаписей" & @CRLF & _
"// * ПространствоБлокировки - Строка" & @CRLF & _
"// * Измерения - Структура" & @CRLF & _
"// " & @CRLF & _
"Функция ОписаниеПоследовательностей(Знач Мета)" & @CRLF & _
" " & @CRLF & _
" ОписаниеПоследовательностей = Новый Массив;" & @CRLF & _
" Если Не Метаданные.Документы.Содержит(Мета) Тогда" & @CRLF & _
" Возврат ОписаниеПоследовательностей;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Последовательность Из Метаданные.Последовательности Цикл" & @CRLF & _
" Если Не Последовательность.Документы.Содержит(Мета) Тогда" & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИмяТаблицы = Последовательность.ПолноеИмя();" & @CRLF & _
" " & @CRLF & _
" // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы." & @CRLF & _
" Описание = СпискиПолейОбъекта(ИмяТаблицы, Последовательность.Измерения, "Регистратор");" & @CRLF & _
" Если Описание.СписокПолей.Количество() > 0 Тогда" & @CRLF & _
" " & @CRLF & _
" Описание.Вставить("НаборЗаписей", Последовательности[Последовательность.Имя].СоздатьНаборЗаписей());" & @CRLF & _
" Описание.Вставить("ПространствоБлокировки", ИмяТаблицы + ".Записи");" & @CRLF & _
" Описание.Вставить("Измерения", Новый Структура);" & @CRLF & _
" " & @CRLF & _
" ОписаниеПоследовательностей.Добавить(Описание);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеПоследовательностей;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * СтандартныеРеквизиты - Структура" & @CRLF & _
"// * РеквизитыАдресации - Структура" & @CRLF & _
"// * Реквизиты - Структура" & @CRLF & _
"// * СтандартныеТабличныеЧасти - Массив из Структура:" & @CRLF & _
"// ** Имя - Строка" & @CRLF & _
"// ** СписокПолей - Структура" & @CRLF & _
"// * ТабличныеЧасти - Массив из Структура:" & @CRLF & _
"// ** Имя - Строка" & @CRLF & _
"// ** СписокПолей - Структура" & @CRLF & _
"// * МожетБытьПроведен - Булево" & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеОбъекта(Знач ОбъектМетаданных)" & @CRLF & _
" " & @CRLF & _
" ТипВсеСсылки = ОписаниеТипаВсеСсылки();" & @CRLF & _
" " & @CRLF & _
" Кандидаты = Новый Структура("Реквизиты, СтандартныеРеквизиты, ТабличныеЧасти, СтандартныеТабличныеЧасти, РеквизитыАдресации");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Кандидаты, ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта.Вставить("Реквизиты", Новый Структура);" & @CRLF & _
" Если Кандидаты.Реквизиты <> Неопределено Тогда" & @CRLF & _
" Для Каждого МетаРеквизит Из Кандидаты.Реквизиты Цикл" & @CRLF & _
" Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда" & @CRLF & _
" ОписаниеОбъекта.Реквизиты.Вставить(МетаРеквизит.Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта.Вставить("СтандартныеРеквизиты", Новый Структура);" & @CRLF & _
" Если Кандидаты.СтандартныеРеквизиты <> Неопределено Тогда" & @CRLF & _
" Исключаемые = Новый Структура("Ссылка");" & @CRLF & _
" " & @CRLF & _
" Для Каждого МетаРеквизит Из Кандидаты.СтандартныеРеквизиты Цикл" & @CRLF & _
" Имя = МетаРеквизит.Имя;" & @CRLF & _
" Если Не Исключаемые.Свойство(Имя) И ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда" & @CRLF & _
" ОписаниеОбъекта.Реквизиты.Вставить(МетаРеквизит.Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта.Вставить("ТабличныеЧасти", Новый Массив);" & @CRLF & _
" Если Кандидаты.ТабличныеЧасти <> Неопределено Тогда" & @CRLF & _
" Для Каждого МетаТаблица Из Кандидаты.ТабличныеЧасти Цикл" & @CRLF & _
" " & @CRLF & _
" СписокПолей = Новый Структура;" & @CRLF & _
" Для Каждого МетаРеквизит Из МетаТаблица.Реквизиты Цикл" & @CRLF & _
" Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда" & @CRLF & _
" СписокПолей.Вставить(МетаРеквизит.Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если СписокПолей.Количество() > 0 Тогда" & @CRLF & _
" ОписаниеОбъекта.ТабличныеЧасти.Добавить(Новый Структура("Имя, СписокПолей", МетаТаблица.Имя, СписокПолей));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта.Вставить("СтандартныеТабличныеЧасти", Новый Массив);" & @CRLF & _
" Если Кандидаты.СтандартныеТабличныеЧасти <> Неопределено Тогда" & @CRLF & _
" Для Каждого МетаТаблица Из Кандидаты.СтандартныеТабличныеЧасти Цикл" & @CRLF & _
" " & @CRLF & _
" СписокПолей = Новый Структура;" & @CRLF & _
" Для Каждого МетаРеквизит Из МетаТаблица.СтандартныеРеквизиты Цикл" & @CRLF & _
" Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда" & @CRLF & _
" СписокПолей.Вставить(МетаРеквизит.Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если СписокПолей.Количество() > 0 Тогда" & @CRLF & _
" ОписаниеОбъекта.СтандартныеТабличныеЧасти.Добавить(Новый Структура("Имя, СписокПолей", МетаТаблица.Имя, СписокПолей));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта.Вставить("РеквизитыАдресации", Новый Структура);" & @CRLF & _
" Если Кандидаты.РеквизитыАдресации <> Неопределено Тогда" & @CRLF & _
" Для Каждого Реквизит Из Кандидаты.РеквизитыАдресации Цикл" & @CRLF & _
" Если ОписанияТиповПересекаются(Реквизит.Тип, ТипВсеСсылки) Тогда" & @CRLF & _
" ОписаниеОбъекта.РеквизитыАдресации.Вставить(Реквизит.Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеОбъекта.Вставить("МожетБытьПроведен", Метаданные.Документы.Содержит(ОбъектМетаданных));" & @CRLF & _
" Возврат ОписаниеОбъекта;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбъектМетаданных - ОбъектМетаданных" & @CRLF & _
"// " & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Массив из Структура:" & @CRLF & _
"// * СписокПолей - Структура" & @CRLF & _
"// * СтруктураИзмерений - Структура" & @CRLF & _
"// * СписокВедущих - Структура" & @CRLF & _
"// * НаборЗаписей - РегистрСведенийНаборЗаписей" & @CRLF & _
"// * ПространствоБлокировки - Строка" & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеЗадач(Знач Мета)" & @CRLF & _
"" & @CRLF & _
" ОписаниеЗадач = Неопределено;" & @CRLF & _
" Если НЕ Метаданные.БизнесПроцессы.Содержит(Мета) Тогда" & @CRLF & _
" Возврат ОписаниеЗадач;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеЗадач = ОписаниеОбъекта(Мета.Задача);" & @CRLF & _
" ОписаниеЗадач.Вставить("ПространствоБлокировки", Мета.Задача.ПолноеИмя());" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеЗадач;" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ОписаниеКлючаЗаписи(Знач МетаданныеТаблицы)" & @CRLF & _
" " & @CRLF & _
" ИмяТаблицы = МетаданныеТаблицы.ПолноеИмя();" & @CRLF & _
" " & @CRLF & _
" // Поля ссылочного типа - кандидаты и набор измерений." & @CRLF & _
" // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы." & @CRLF & _
" ОписаниеКлюча = СпискиПолейОбъекта(ИмяТаблицы, МетаданныеТаблицы.Измерения, "Период, Регистратор");" & @CRLF & _
" " & @CRLF & _
" Если Метаданные.РегистрыСведений.Содержит(МетаданныеТаблицы) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыСведений[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИначеЕсли Метаданные.РегистрыНакопления.Содержит(МетаданныеТаблицы) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыНакопления[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(МетаданныеТаблицы) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыБухгалтерии[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(МетаданныеТаблицы) Тогда" & @CRLF & _
" НаборЗаписей = РегистрыРасчета[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" ИначеЕсли Метаданные.Последовательности.Содержит(МетаданныеТаблицы) Тогда" & @CRLF & _
" НаборЗаписей = Последовательности[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();" & @CRLF & _
" Иначе" & @CRLF & _
" НаборЗаписей = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ОписаниеКлюча.Вставить("НаборЗаписей", НаборЗаписей);" & @CRLF & _
" ОписаниеКлюча.Вставить("ПространствоБлокировки", ИмяТаблицы);" & @CRLF & _
" " & @CRLF & _
" Возврат ОписаниеКлюча;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ОписанияТиповПересекаются(Знач Описание1, Знач Описание2)" & @CRLF & _
" " & @CRLF & _
" Для Каждого Тип Из Описание1.Типы() Цикл" & @CRLF & _
" Если Описание2.СодержитТип(Тип) Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращает описание по имени таблицы или по набору записей." & @CRLF & _
"Функция СпискиПолейОбъекта(Знач ИсточникДанных, Знач МетаданныеИзмеренийРегистра, Знач ИсключатьПоля)" & @CRLF & _
" " & @CRLF & _
" Описание = Новый Структура;" & @CRLF & _
" Описание.Вставить("СписокПолей", Новый Структура);" & @CRLF & _
" Описание.Вставить("СтруктураИзмерений", Новый Структура);" & @CRLF & _
" Описание.Вставить("СписокВедущих", Новый Структура);" & @CRLF & _
" " & @CRLF & _
" ТипКонтроля = ОписаниеТипаВсеСсылки();" & @CRLF & _
" Исключаемые = Новый Структура(ИсключатьПоля);" & @CRLF & _
" " & @CRLF & _
" ТипИсточникаДанных = ТипЗнч(ИсточникДанных);" & @CRLF & _
" " & @CRLF & _
" Если ТипИсточникаДанных = Тип("Строка") Тогда" & @CRLF & _
" // Источник - имя таблицы, получаем поля запросом." & @CRLF & _
" ТекстЗапроса = "ВЫБРАТЬ * ИЗ &ИмяТаблицы ГДЕ ЛОЖЬ";" & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ИсточникДанных);" & @CRLF & _
" Запрос = Новый Запрос(ТекстЗапроса);" & @CRLF & _
" ИсточникПолей = Запрос.Выполнить();" & @CRLF & _
" Иначе" & @CRLF & _
" // Источник - набор записей" & @CRLF & _
" ИсточникПолей = ИсточникДанных.ВыгрузитьКолонки();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Колонка Из ИсточникПолей.Колонки Цикл" & @CRLF & _
" Имя = Колонка.Имя;" & @CRLF & _
" Если Не Исключаемые.Свойство(Имя) И ОписанияТиповПересекаются(Колонка.ТипЗначения, ТипКонтроля) Тогда" & @CRLF & _
" Описание.СписокПолей.Вставить(Имя);" & @CRLF & _
" " & @CRLF & _
" // И проверка на ведущее измерение." & @CRLF & _
" Мета = МетаданныеИзмеренийРегистра.Найти(Имя);" & @CRLF & _
" Если Мета <> Неопределено Тогда" & @CRLF & _
" Описание.СтруктураИзмерений.Вставить(Имя, Мета.Тип);" & @CRLF & _
" Тест = Новый Структура("Ведущее", Ложь);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Тест, Мета);" & @CRLF & _
" Если Тест.Ведущее Тогда" & @CRLF & _
" Описание.СписокВедущих.Вставить(Имя, Мета.Тип);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Описание;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"" & @CRLF & _
"Процедура ЗаменитьВКоллекцииСтрок(ВидКоллекции, ИмяКоллекции, Объект, Коллекция, Знач СписокПолей, Знач ПарыЗамен)" & @CRLF & _
" " & @CRLF & _
" ИзмененнаяКоллекция = Коллекция.Выгрузить();" & @CRLF & _
" Модифицировано = Ложь;" & @CRLF & _
" ИменаИзмененныхРеквизитов = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Строка Из ИзмененнаяКоллекция Цикл" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючЗначение Из СписокПолей Цикл" & @CRLF & _
" ИмяРеквизита = КлючЗначение.Ключ;" & @CRLF & _
" ЦелеваяСсылка = ПарыЗамен[ Строка[ИмяРеквизита] ];" & @CRLF & _
" Если ЦелеваяСсылка <> Неопределено Тогда" & @CRLF & _
" ЗарегистрироватьФактЗамены(Объект, Строка[ИмяРеквизита], ЦелеваяСсылка, ВидКоллекции, ИмяКоллекции, " & @CRLF & _
" ИзмененнаяКоллекция.Индекс(Строка), ИмяРеквизита);" & @CRLF & _
" Строка[ИмяРеквизита] = ЦелеваяСсылка;" & @CRLF & _
" Модифицировано = Истина;" & @CRLF & _
" ИменаИзмененныхРеквизитов.Добавить(ИмяРеквизита);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если Модифицировано Тогда" & @CRLF & _
" ЭтоРегистрБухгалтерии = ВидКоллекции = "Движения" И ЭтоРегистрБухгалтерии(Коллекция.Метаданные());" & @CRLF & _
" Если ЭтоРегистрБухгалтерии Тогда" & @CRLF & _
" ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(Коллекция, ИзмененнаяКоллекция, ИменаИзмененныхРеквизитов);" & @CRLF & _
" Иначе " & @CRLF & _
" Коллекция.Загрузить(ИзмененнаяКоллекция);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(НаборЗаписей, ИзмененнаяКоллекция, ИменаИзмененныхРеквизитов)" & @CRLF & _
" НеизмененныеИзмерения = Новый Соответствие;" & @CRLF & _
" ИзмененныеИзмерения = Новый Соответствие;" & @CRLF & _
" МетаданныеРегистра = НаборЗаписей.Метаданные();" & @CRLF & _
" " & @CRLF & _
" Для каждого Измерение Из МетаданныеРегистра.Измерения Цикл" & @CRLF & _
" ИменаИзмерений = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Если Измерение.Балансовый ИЛИ НЕ МетаданныеРегистра.Корреспонденция Тогда" & @CRLF & _
" ИменаИзмерений.Добавить(Измерение.Имя); " & @CRLF & _
" Иначе " & @CRLF & _
" ИменаИзмерений.Добавить(Измерение.Имя + "Дт");" & @CRLF & _
" ИменаИзмерений.Добавить(Измерение.Имя + "Кт"); " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для каждого ИмяИзмерения Из ИменаИзмерений Цикл" & @CRLF & _
" Если ИменаИзмененныхРеквизитов.Найти(ИмяИзмерения) = Неопределено Тогда" & @CRLF & _
" НеизмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения));" & @CRLF & _
" Иначе" & @CRLF & _
" ИзмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для Сч = 0 По НаборЗаписей.Количество()-1 Цикл" & @CRLF & _
" " & @CRLF & _
" Для каждого ИмяИзмеренияЗначения Из ИзмененныеИзмерения Цикл" & @CRLF & _
" Если НаборЗаписей[Сч][ИмяИзмеренияЗначения.Ключ] = NULL Тогда" & @CRLF & _
" ИмяИзмеренияЗначения.Значение[Сч] = NULL;" & @CRLF & _
" Иначе" & @CRLF & _
" ИмяИзмеренияЗначения.Значение[Сч] = ИзмененнаяКоллекция[Сч][ИмяИзмеренияЗначения.Ключ];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" НаборЗаписей.Загрузить(ИзмененнаяКоллекция);" & @CRLF & _
" " & @CRLF & _
" Для каждого ИзмеренияЗначенияВКолонке Из НеизмененныеИзмерения Цикл" & @CRLF & _
" НаборЗаписей.ЗагрузитьКолонку(ИзмеренияЗначенияВКолонке.Значение, ИзмеренияЗначенияВКолонке.Ключ);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Для каждого ИзмеренияЗначенияВКолонке Из ИзмененныеИзмерения Цикл" & @CRLF & _
" НаборЗаписей.ЗагрузитьКолонку(ИзмеренияЗначенияВКолонке.Значение, ИзмеренияЗначенияВКолонке.Ключ);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ОбработатьОбъектСПерехватомСообщений(Знач Объект, Знач Действие, Знач РежимЗаписи, Знач ПараметрыЗаписи)" & @CRLF & _
" " & @CRLF & _
" // Текущие сообщения до исключения запоминаем." & @CRLF & _
" ПредыдущиеСообщения = ПолучитьСообщенияПользователю(Истина);" & @CRLF & _
" СообщатьПовторно = ТекущийРежимЗапуска() <> Неопределено;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" " & @CRLF & _
" Если Действие = "Запись" Тогда" & @CRLF & _
" " & @CRLF & _
" Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику;" & @CRLF & _
" " & @CRLF & _
" Если РежимЗаписи = Неопределено Тогда" & @CRLF & _
" Объект.Записать();" & @CRLF & _
" Иначе" & @CRLF & _
" Объект.Записать(РежимЗаписи);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Действие = "ПометкаУдаления" Тогда" & @CRLF & _
" " & @CRLF & _
" МетаданныеОбъекта = Объект.Метаданные();" & @CRLF & _
" Если ЭтоСправочник(МетаданныеОбъекта)" & @CRLF & _
" Или ЭтоПланВидовХарактеристик(МетаданныеОбъекта)" & @CRLF & _
" Или ЭтоПланСчетов(МетаданныеОбъекта) Тогда " & @CRLF & _
" " & @CRLF & _
" Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику;" & @CRLF & _
" Объект.УстановитьПометкуУдаления(Истина, Ложь);" & @CRLF & _
" ИначеЕсли ЭтоДокумент(МетаданныеОбъекта) " & @CRLF & _
" И МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда" & @CRLF & _
" " & @CRLF & _
" Объект.УстановитьПометкуУдаления(Истина);" & @CRLF & _
" Иначе" & @CRLF & _
" Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику;" & @CRLF & _
" Объект.УстановитьПометкуУдаления(Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Исключение" & @CRLF & _
" // Перехватываем все сообщенное при ошибке и добавляем их в одно исключение." & @CRLF & _
" ТекстИсключения = "";" & @CRLF & _
" Для Каждого Сообщение Из ПолучитьСообщенияПользователю(Ложь) Цикл" & @CRLF & _
" ТекстИсключения = ТекстИсключения + Символы.ПС + Сообщение.Текст;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Сообщаем предыдущие" & @CRLF & _
" Если СообщатьПовторно Тогда" & @CRLF & _
" СообщитьОтложенныеСообщения(ПредыдущиеСообщения);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ТекстИсключения = "" Тогда" & @CRLF & _
" ВызватьИсключение;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ВызватьИсключение СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + СокрЛП(ТекстИсключения));" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если СообщатьПовторно Тогда" & @CRLF & _
" СообщитьОтложенныеСообщения(ПредыдущиеСообщения);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура СообщитьОтложенныеСообщения(Знач Сообщения)" & @CRLF & _
" " & @CRLF & _
" Для Каждого Сообщение Из Сообщения Цикл" & @CRLF & _
" Сообщение.Сообщить();" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ЗаписатьОбъект(Знач Объект, Знач ПараметрыЗаписи)" & @CRLF & _
" " & @CRLF & _
" МетаданныеОбъекта = Объект.Метаданные();" & @CRLF & _
" " & @CRLF & _
" Если ЭтоДокумент(МетаданныеОбъекта) Тогда" & @CRLF & _
" ОбработатьОбъектСПерехватомСообщений(Объект, "Запись", РежимЗаписиДокумента.Запись, ПараметрыЗаписи);" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Проверка на возможные циклические ссылки." & @CRLF & _
" СвойстваОбъекта = Новый Структура("Иерархический, ВидыСубконто, Владельцы", Ложь, Неопределено, Новый Массив);" & @CRLF & _
" ЗаполнитьЗначенияСвойств(СвойстваОбъекта, МетаданныеОбъекта);" & @CRLF & _
" " & @CRLF & _
" // По родителю" & @CRLF & _
" Если СвойстваОбъекта.Иерархический Или СвойстваОбъекта.ВидыСубконто <> Неопределено Тогда " & @CRLF & _
" " & @CRLF & _
" Если Объект.Родитель = Объект.Ссылка Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'При записи ""%1"" возникает циклическая ссылка в иерархии.'")," & @CRLF & _
" Строка(Объект));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // По владельцу" & @CRLF & _
" Если СвойстваОбъекта.Владельцы.Количество() > 1 И Объект.Владелец = Объект.Ссылка Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'При записи ""%1"" возникает циклическая ссылка в подчинении.'")," & @CRLF & _
" Строка(Объект));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Для последовательностей право "Изменение" может отсутствовать даже у роли "АдминистраторСистемы"." & @CRLF & _
" Если ЭтоПоследовательность(МетаданныеОбъекта)" & @CRLF & _
" И Не ПравоДоступа("Изменение", МетаданныеОбъекта)" & @CRLF & _
" И Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда" & @CRLF & _
" " & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Просто запись" & @CRLF & _
" ОбработатьОбъектСПерехватомСообщений(Объект, "Запись", Неопределено, ПараметрыЗаписи);" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция СобытиеЖурналаРегистрацииЗаменыСсылок()" & @CRLF & _
" " & @CRLF & _
" Возврат НСтр("ru = 'Поиск и удаление ссылок'", КодОсновногоЯзыка());" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Результат - см. РезультатЗаменыСсылок " & @CRLF & _
"// Ссылка - ЛюбаяСсылка" & @CRLF & _
"// ОписаниеОшибки - см. ОписаниеОшибкиЗамены" & @CRLF & _
"//" & @CRLF & _
"Процедура ЗарегистрироватьОшибкуЗамены(Результат, Знач Ссылка, Знач ОписаниеОшибки)" & @CRLF & _
" " & @CRLF & _
" Результат.ЕстьОшибки = Истина;" & @CRLF & _
" " & @CRLF & _
" Строка = Результат.Ошибки.Добавить();" & @CRLF & _
" Строка.Ссылка = Ссылка;" & @CRLF & _
" Строка.ПредставлениеОбъектаОшибки = ОписаниеОшибки.ПредставлениеОбъектаОшибки;" & @CRLF & _
" Строка.ОбъектОшибки = ОписаниеОшибки.ОбъектОшибки;" & @CRLF & _
" Строка.ТекстОшибки = ОписаниеОшибки.ТекстОшибки;" & @CRLF & _
" Строка.ТипОшибки = ОписаниеОшибки.ТипОшибки;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * ТипОшибки - Строка" & @CRLF & _
"// * ОбъектОшибки - ЛюбаяСсылка" & @CRLF & _
"// * ПредставлениеОбъектаОшибки - Строка" & @CRLF & _
"// * ТекстОшибки - Строка" & @CRLF & _
"//" & @CRLF & _
"Функция ОписаниеОшибкиЗамены(Знач ТипОшибки, Знач ОбъектОшибки, Знач ПредставлениеОбъектаОшибки, Знач ТекстОшибки)" & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" Результат.Вставить("ТипОшибки", ТипОшибки);" & @CRLF & _
" Результат.Вставить("ОбъектОшибки", ОбъектОшибки);" & @CRLF & _
" Результат.Вставить("ПредставлениеОбъектаОшибки", ПредставлениеОбъектаОшибки);" & @CRLF & _
" Результат.Вставить("ТекстОшибки", ТекстОшибки);" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Структура:" & @CRLF & _
"// * ЕстьОшибки - Булево" & @CRLF & _
"// * ОчередьКНепосредственномуУдалению - Массив" & @CRLF & _
"// * Ошибки - см. ОбщегоНазначения.ЗаменитьСсылки" & @CRLF & _
"//" & @CRLF & _
"Функция РезультатЗаменыСсылок(Знач ОшибкиЗамены)" & @CRLF & _
"" & @CRLF & _
" Результат = Новый Структура;" & @CRLF & _
" Результат.Вставить("ЕстьОшибки", Ложь);" & @CRLF & _
" Результат.Вставить("ОчередьКНепосредственномуУдалению", Новый Массив);" & @CRLF & _
" Результат.Вставить("Ошибки", ОшибкиЗамены);" & @CRLF & _
" Возврат Результат" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Процедура ЗарегистрироватьОшибкуВТаблицу(Результат, Дубль, Оригинал, Данные, Информация, ТипОшибки, ИнформацияОбОшибке)" & @CRLF & _
" Результат.ЕстьОшибки = Истина;" & @CRLF & _
" " & @CRLF & _
" ЗаписьЖурналаРегистрации(" & @CRLF & _
" СобытиеЖурналаРегистрацииЗаменыСсылок()," & @CRLF & _
" УровеньЖурналаРегистрации.Ошибка," & @CRLF & _
" ," & @CRLF & _
" ," & @CRLF & _
" ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));" & @CRLF & _
" " & @CRLF & _
" ПолноеПредставлениеДанных = Строка(Данные) + " (" + Информация.ПредставлениеЭлемента + ")";" & @CRLF & _
" " & @CRLF & _
" Ошибка = Результат.Ошибки.Добавить();" & @CRLF & _
" Ошибка.Ссылка = Дубль;" & @CRLF & _
" Ошибка.ОбъектОшибки = Данные;" & @CRLF & _
" Ошибка.ПредставлениеОбъектаОшибки = ПолноеПредставлениеДанных;" & @CRLF & _
" " & @CRLF & _
" Если ТипОшибки = "БлокировкаДляРегистра" Тогда" & @CRLF & _
" НовыйШаблон = НСтр("ru = 'Не удалось начать редактирование %1: %2'");" & @CRLF & _
" Ошибка.ТипОшибки = "ОшибкаБлокировки";" & @CRLF & _
" ИначеЕсли ТипОшибки = "БлокировкаДляУдаленияДубля" Тогда" & @CRLF & _
" НовыйШаблон = НСтр("ru = 'Не удалось начать удаление: %2'");" & @CRLF & _
" Ошибка.ТипОшибки = "ОшибкаБлокировки";" & @CRLF & _
" ИначеЕсли ТипОшибки = "УдалитьНаборДубля" Тогда" & @CRLF & _
" НовыйШаблон = НСтр("ru = 'Не удалось очистить сведения о дубле в %1: %2'");" & @CRLF & _
" Ошибка.ТипОшибки = "ОшибкаЗаписи";" & @CRLF & _
" ИначеЕсли ТипОшибки = "ЗаписатьНаборОригинала" Тогда" & @CRLF & _
" НовыйШаблон = НСтр("ru = 'Не удалось обновить сведения в %1: %2'");" & @CRLF & _
" Ошибка.ТипОшибки = "ОшибкаЗаписи";" & @CRLF & _
" Иначе" & @CRLF & _
" НовыйШаблон = ТипОшибки + " (%1): %2";" & @CRLF & _
" Ошибка.ТипОшибки = ТипОшибки;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" НовыйШаблон = НовыйШаблон + Символы.ПС + Символы.ПС + НСтр("ru = 'Подробности в журнале регистрации.'");" & @CRLF & _
" " & @CRLF & _
" КраткоеПредставление = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);" & @CRLF & _
" Ошибка.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НовыйШаблон, ПолноеПредставлениеДанных, КраткоеПредставление);" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Формирует информацию о типе объекта метаданных: полное имя, представления, вид и т.п." & @CRLF & _
"Функция ИнформацияОТипе(ПолноеИмяИлиМетаданныеИлиТип, Кэш)" & @CRLF & _
" ТипПервогоПараметра = ТипЗнч(ПолноеИмяИлиМетаданныеИлиТип);" & @CRLF & _
" Если ТипПервогоПараметра = Тип("Строка") Тогда" & @CRLF & _
" ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяИлиМетаданныеИлиТип);" & @CRLF & _
" Иначе" & @CRLF & _
" Если ТипПервогоПараметра = Тип("Тип") Тогда // Поиск объекта метаданных." & @CRLF & _
" ОбъектМетаданных = Метаданные.НайтиПоТипу(ПолноеИмяИлиМетаданныеИлиТип);" & @CRLF & _
" Иначе" & @CRLF & _
" ОбъектМетаданных = ПолноеИмяИлиМетаданныеИлиТип;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ПолноеИмя = ВРег(ОбъектМетаданных.ПолноеИмя());" & @CRLF & _
" " & @CRLF & _
" ИнформацияОТипах = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Кэш, "ИнформацияОТипах");" & @CRLF & _
" Если ИнформацияОТипах = Неопределено Тогда" & @CRLF & _
" ИнформацияОТипах = Новый Соответствие;" & @CRLF & _
" Кэш.Вставить("ИнформацияОТипах", ИнформацияОТипах);" & @CRLF & _
" Иначе" & @CRLF & _
" Информация = ИнформацияОТипах.Получить(ПолноеИмя);" & @CRLF & _
" Если Информация <> Неопределено Тогда" & @CRLF & _
" Возврат Информация;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Информация = Новый Структура("ПолноеИмя, ПредставлениеЭлемента, " & @CRLF & _
" |Вид, Ссылочный, Технический, Разделенный," & @CRLF & _
" |Иерархический," & @CRLF & _
" |ЕстьПодчиненные, ИменаПодчиненных," & @CRLF & _
" |Измерения, Реквизиты, Ресурсы");" & @CRLF & _
" ИнформацияОТипах.Вставить(ПолноеИмя, Информация);" & @CRLF & _
" " & @CRLF & _
" // Заполнение базовой информации." & @CRLF & _
" Информация.ПолноеИмя = ПолноеИмя;" & @CRLF & _
" " & @CRLF & _
" // Представление элемента." & @CRLF & _
" Информация.ПредставлениеЭлемента = ПредставлениеОбъекта(ОбъектМетаданных);" & @CRLF & _
" " & @CRLF & _
" // Вид и его свойства." & @CRLF & _
" Информация.Вид = Лев(Информация.ПолноеИмя, СтрНайти(Информация.ПолноеИмя, ".")-1);" & @CRLF & _
" Если Информация.Вид = "СПРАВОЧНИК"" & @CRLF & _
" Или Информация.Вид = "ДОКУМЕНТ"" & @CRLF & _
" Или Информация.Вид = "ПЕРЕЧИСЛЕНИЕ"" & @CRLF & _
" Или Информация.Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК"" & @CRLF & _
" Или Информация.Вид = "ПЛАНСЧЕТОВ"" & @CRLF & _
" Или Информация.Вид = "ПЛАНВИДОВРАСЧЕТА"" & @CRLF & _
" Или Информация.Вид = "БИЗНЕСПРОЦЕСС"" & @CRLF & _
" Или Информация.Вид = "ЗАДАЧА"" & @CRLF & _
" Или Информация.Вид = "ПЛАНОБМЕНА" Тогда" & @CRLF & _
" Информация.Ссылочный = Истина;" & @CRLF & _
" Иначе" & @CRLF & _
" Информация.Ссылочный = Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Информация.Вид = "СПРАВОЧНИК"" & @CRLF & _
" Или Информация.Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда" & @CRLF & _
" Информация.Иерархический = ОбъектМетаданных.Иерархический;" & @CRLF & _
" ИначеЕсли Информация.Вид = "ПЛАНСЧЕТОВ" Тогда" & @CRLF & _
" Информация.Иерархический = Истина;" & @CRLF & _
" Иначе" & @CRLF & _
" Информация.Иерархический = Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Информация.ЕстьПодчиненные = Ложь;" & @CRLF & _
" Если Информация.Вид = "СПРАВОЧНИК"" & @CRLF & _
" Или Информация.Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК"" & @CRLF & _
" Или Информация.Вид = "ПЛАНОБМЕНА"" & @CRLF & _
" Или Информация.Вид = "ПЛАНСЧЕТОВ"" & @CRLF & _
" Или Информация.Вид = "ПЛАНВИДОВРАСЧЕТА" Тогда" & @CRLF & _
" Для Каждого Справочник Из Метаданные.Справочники Цикл" & @CRLF & _
" Если Справочник.Владельцы.Содержит(ОбъектМетаданных) Тогда" & @CRLF & _
" Если Информация.ЕстьПодчиненные = Ложь Тогда" & @CRLF & _
" Информация.ЕстьПодчиненные = Истина;" & @CRLF & _
" Информация.ИменаПодчиненных = Новый Массив;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИменаПодчиненных = Информация.ИменаПодчиненных; // Массив - " & @CRLF & _
" ИменаПодчиненных.Добавить(Справочник.ПолноеИмя());" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Информация.ПолноеИмя = "СПРАВОЧНИК.ИДЕНТИФИКАТОРЫОБЪЕКТОВМЕТАДАННЫХ"" & @CRLF & _
" Или Информация.ПолноеИмя = "СПРАВОЧНИК.ПРЕДОПРЕДЕЛЕННЫЕВАРИАНТЫОТЧЕТОВ" Тогда" & @CRLF & _
" Информация.Технический = Истина;" & @CRLF & _
" Информация.Разделенный = Ложь;" & @CRLF & _
" Иначе" & @CRLF & _
" Информация.Технический = Ложь;" & @CRLF & _
" Если Не Кэш.Свойство("МодельСервиса") Тогда" & @CRLF & _
" Кэш.Вставить("МодельСервиса", РазделениеВключено());" & @CRLF & _
" Если Кэш.МодельСервиса Тогда" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда" & @CRLF & _
" МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса");" & @CRLF & _
" РазделительОсновныхДанных = МодульРаботаВМоделиСервиса.РазделительОсновныхДанных();" & @CRLF & _
" РазделительВспомогательныхДанных = МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных();" & @CRLF & _
" Иначе" & @CRLF & _
" РазделительОсновныхДанных = Неопределено;" & @CRLF & _
" РазделительВспомогательныхДанных = Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Кэш.Вставить("ВОбластиДанных", РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных());" & @CRLF & _
" Кэш.Вставить("РазделительОсновныхДанных", РазделительОсновныхДанных);" & @CRLF & _
" Кэш.Вставить("РазделительВспомогательныхДанных", РазделительВспомогательныхДанных);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Если Кэш.МодельСервиса Тогда" & @CRLF & _
" Если ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда" & @CRLF & _
" МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса");" & @CRLF & _
" ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных);" & @CRLF & _
" Иначе" & @CRLF & _
" ЭтоРазделенныйОбъектМетаданных = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Информация.Разделенный = ЭтоРазделенныйОбъектМетаданных;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Информация.Измерения = Новый Структура;" & @CRLF & _
" Информация.Реквизиты = Новый Структура;" & @CRLF & _
" Информация.Ресурсы = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" ВидыРеквизитов = Новый Структура("СтандартныеРеквизиты, Реквизиты, Измерения, Ресурсы");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ВидыРеквизитов, ОбъектМетаданных);" & @CRLF & _
" Для Каждого КлючИЗначение Из ВидыРеквизитов Цикл" & @CRLF & _
" Коллекция = КлючИЗначение.Значение; // КоллекцияОбъектовМетаданных" & @CRLF & _
" Если ТипЗнч(Коллекция) = Тип("КоллекцияОбъектовМетаданных") Тогда" & @CRLF & _
" КудаПишем = ?(Информация.Свойство(КлючИЗначение.Ключ), Информация[КлючИЗначение.Ключ], Информация.Реквизиты);" & @CRLF & _
" Для Каждого Реквизит Из Коллекция Цикл" & @CRLF & _
" КудаПишем.Вставить(Реквизит.Имя, ИнформацияПоРеквизиту(Реквизит));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Если Информация.Вид = "РЕГИСТРСВЕДЕНИЙ"" & @CRLF & _
" И ОбъектМетаданных.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда" & @CRLF & _
" ИнформацияПоРеквизиту = Новый Структура("Ведущее, Представление, Формат, Тип, ЗначениеПоУмолчанию, ЗаполнятьИзДанныхЗаполнения");" & @CRLF & _
" ИнформацияПоРеквизиту.Ведущее = Ложь;" & @CRLF & _
" ИнформацияПоРеквизиту.ЗаполнятьИзДанныхЗаполнения = Ложь;" & @CRLF & _
" Если ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора Тогда" & @CRLF & _
" ИнформацияПоРеквизиту.Тип = Новый ОписаниеТипов("МоментВремени");" & @CRLF & _
" ИначеЕсли ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Секунда Тогда" & @CRLF & _
" ИнформацияПоРеквизиту.Тип = Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));" & @CRLF & _
" Иначе" & @CRLF & _
" ИнформацияПоРеквизиту.Тип = Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Информация.Измерения.Вставить("Период", ИнформацияПоРеквизиту);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Информация;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// МетаданныеРеквизита - ОбъектМетаданныхРеквизит" & @CRLF & _
"// " & @CRLF & _
"Функция ИнформацияПоРеквизиту(МетаданныеРеквизита)" & @CRLF & _
" // ОписаниеСтандартногоРеквизита" & @CRLF & _
" // ОбъектМетаданных: Измерение" & @CRLF & _
" // ОбъектМетаданных: Ресурс" & @CRLF & _
" // ОбъектМетаданных: Реквизит" & @CRLF & _
" Информация = Новый Структура("Ведущее, Представление, Формат, Тип, ЗначениеПоУмолчанию, ЗаполнятьИзДанныхЗаполнения");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Информация, МетаданныеРеквизита);" & @CRLF & _
" Информация.Представление = МетаданныеРеквизита.Представление();" & @CRLF & _
" Если Информация.ЗаполнятьИзДанныхЗаполнения = Истина Тогда" & @CRLF & _
" Информация.ЗначениеПоУмолчанию = МетаданныеРеквизита.ЗначениеЗаполнения;" & @CRLF & _
" Иначе" & @CRLF & _
" Информация.ЗначениеПоУмолчанию = МетаданныеРеквизита.Тип.ПривестиЗначение();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат Информация;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Процедура ДобавитьВСтатистикуЗаменыСсылок(Статистика, Дубль, ЕстьОшибки)" & @CRLF & _
"" & @CRLF & _
" КлючДубля = Дубль.Метаданные().ПолноеИмя();" & @CRLF & _
" ЭлементСтатистики = Статистика[КлючДубля];" & @CRLF & _
" Если ЭлементСтатистики = Неопределено Тогда" & @CRLF & _
" ЭлементСтатистики = Новый Структура("КоличествоЭлементов, КоличествоОшибок",0,0);" & @CRLF & _
" Статистика.Вставить(КлючДубля, ЭлементСтатистики);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЭлементСтатистики.КоличествоЭлементов = ЭлементСтатистики.КоличествоЭлементов + 1;" & @CRLF & _
" ЭлементСтатистики.КоличествоОшибок = ЭлементСтатистики.КоличествоОшибок + ?(ЕстьОшибки, 1,0);" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ОтправитьСтатистикуЗаменыСсылок(Статистика)" & @CRLF & _
"" & @CRLF & _
" Если НЕ ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" " & @CRLF & _
" МодульЦентрМониторинга = ОбщийМодуль("ЦентрМониторинга");" & @CRLF & _
" Для каждого ЭлементСтатистики Из Статистика Цикл" & @CRLF & _
" МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики(" & @CRLF & _
" "БазоваяФункциональность.ЗаменаСсылок." + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоЭлементов);" & @CRLF & _
" МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики(" & @CRLF & _
" "БазоваяФункциональность.ЗаменаСсылокКоличествоОшибок." + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоОшибок);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ДополнитьИсключенияПоискаСсылокПодчиненнымиОбъектами(Знач ИсключенияПоискаСсылок)" & @CRLF & _
" " & @CRLF & _
" Для каждого ОписаниеПодчиненногоОбъекта Из ПодчиненныеОбъекты() Цикл" & @CRLF & _
" " & @CRLF & _
" ПоляСвязи = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" & @CRLF & _
" ОписаниеПодчиненногоОбъекта.ПоляСвязей, ",",, Истина);" & @CRLF & _
" ЗначениеИсключенияПоискаСсылок = Новый Массив;" & @CRLF & _
" Для каждого ПолеСвязи Из ПоляСвязи Цикл" & @CRLF & _
" ЗначениеИсключенияПоискаСсылок.Добавить(ПолеСвязи);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ИсключенияПоискаСсылок.Вставить(ОписаниеПодчиненногоОбъекта.ПодчиненныйОбъект, ЗначениеИсключенияПоискаСсылок);" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура ЗарегистрироватьОшибкиУдаления(Результат, ПрепятствующиеУдалению)" & @CRLF & _
"" & @CRLF & _
" ПредставленияСсылок = ПредметыСтрокой(ПрепятствующиеУдалению.ВыгрузитьКолонку("МестоИспользования")); " & @CRLF & _
" Для каждого ПрепятствующиеУдалению Из ПрепятствующиеУдалению Цикл" & @CRLF & _
" ТекстОшибки = НСтр("ru = 'Элемент не удален, т.к. на него есть ссылки'");" & @CRLF & _
" ОписаниеОшибки = ОписаниеОшибкиЗамены("ОшибкаУдаления", ПрепятствующиеУдалению.МестоИспользования, " & @CRLF & _
" ПредставленияСсылок[ПрепятствующиеУдалению.МестоИспользования], ТекстОшибки);" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, ПрепятствующиеУдалению.УдаляемыйСсылка, ОписаниеОшибки);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция СформироватьДубли(ПараметрыВыполнения, ПараметрыЗамены, ПарыЗамен, Результат)" & @CRLF & _
" " & @CRLF & _
" Дубли = Новый Массив;" & @CRLF & _
" Для Каждого КлючЗначение Из ПарыЗамен Цикл" & @CRLF & _
" Дубль = КлючЗначение.Ключ;" & @CRLF & _
" Оригинал = КлючЗначение.Значение;" & @CRLF & _
" Если Дубль = Оригинал Или Дубль.Пустая() Тогда" & @CRLF & _
" Продолжить; // Самого на себя и пустые ссылки не заменяем." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Дубли.Добавить(Дубль);" & @CRLF & _
" // Пропускаем промежуточные замены, чтобы не строить граф (если A->B и B->C то вместо A->B производится замена A->C)." & @CRLF & _
" ОригиналОригинала = ПарыЗамен[Оригинал];" & @CRLF & _
" ЕстьОригиналОригинала = (ОригиналОригинала <> Неопределено И ОригиналОригинала <> Дубль И ОригиналОригинала <> Оригинал);" & @CRLF & _
" Если ЕстьОригиналОригинала Тогда" & @CRLF & _
" Пока ЕстьОригиналОригинала Цикл" & @CRLF & _
" Оригинал = ОригиналОригинала;" & @CRLF & _
" ОригиналОригинала = ПарыЗамен[Оригинал];" & @CRLF & _
" ЕстьОригиналОригинала = (ОригиналОригинала <> Неопределено И ОригиналОригинала <> Дубль И ОригиналОригинала <> Оригинал);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ПарыЗамен.Вставить(Дубль, Оригинал);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ПараметрыВыполнения.УчитыватьПрикладныеПравила И ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда" & @CRLF & _
" МодульПоискИУдалениеДублей = ОбщийМодуль("ПоискИУдалениеДублей");" & @CRLF & _
" Ошибки = МодульПоискИУдалениеДублей.ПроверитьВозможностьЗаменыЭлементов(ПарыЗамен, ПараметрыЗамены);" & @CRLF & _
" " & @CRLF & _
" ОригиналыОбъектов = Новый Массив;" & @CRLF & _
" Для Каждого КлючЗначение Из Ошибки Цикл" & @CRLF & _
" Дубль = КлючЗначение.Ключ;" & @CRLF & _
" ОригиналыОбъектов.Добавить(ПарыЗамен[Дубль]);" & @CRLF & _
"" & @CRLF & _
" Индекс = Дубли.Найти(Дубль);" & @CRLF & _
" Если Индекс <> Неопределено Тогда" & @CRLF & _
" Дубли.Удалить(Индекс); // пропускаем проблемный элемент." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ПредставленияОбъектов = ПредметыСтрокой(ОригиналыОбъектов);" & @CRLF & _
" Для Каждого КлючЗначение Из Ошибки Цикл" & @CRLF & _
" Дубль = КлючЗначение.Ключ;" & @CRLF & _
" Оригинал = ПарыЗамен[Дубль];" & @CRLF & _
" ТекстОшибки = КлючЗначение.Значение;" & @CRLF & _
" Причина = ОписаниеОшибкиЗамены("ОшибкаЗаписи", Оригинал, ПредставленияОбъектов[Оригинал], ТекстОшибки);" & @CRLF & _
" ЗарегистрироватьОшибкуЗамены(Результат, Дубль, Причина);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат Дубли;" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция НовыйПараметрыВыполненияЗаменыСсылок(Знач ПараметрыЗамены)" & @CRLF & _
" " & @CRLF & _
" ПараметрыПоУмолчанию = ПараметрыЗаменыСсылок();" & @CRLF & _
" ПараметрыВыполнения = Новый Структура;" & @CRLF & _
" ПараметрыВыполнения.Вставить("УдалятьНепосредственно", ПараметрыПоУмолчанию.СпособУдаления = "Непосредственно");" & @CRLF & _
" ПараметрыВыполнения.Вставить("ПомечатьНаУдаление", ПараметрыПоУмолчанию.СпособУдаления = "Пометка");" & @CRLF & _
" ПараметрыВыполнения.Вставить("ВключатьБизнесЛогику", ПараметрыПоУмолчанию.ВключатьБизнесЛогику);" & @CRLF & _
" ПараметрыВыполнения.Вставить("ПривилегированнаяЗапись", ПараметрыПоУмолчанию.ПривилегированнаяЗапись);" & @CRLF & _
" ПараметрыВыполнения.Вставить("УчитыватьПрикладныеПравила", ПараметрыПоУмолчанию.УчитыватьПрикладныеПравила);" & @CRLF & _
" ПараметрыВыполнения.Вставить("МестаЗамены", Новый Массив);" & @CRLF & _
" " & @CRLF & _
" // Переданные параметры обрабатываются условно для обратной совместимости." & @CRLF & _
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "СпособУдаления");" & @CRLF & _
" Если ЗначениеПараметра = "Непосредственно" Тогда" & @CRLF & _
" ПараметрыВыполнения.УдалятьНепосредственно = Истина;" & @CRLF & _
" ПараметрыВыполнения.ПомечатьНаУдаление = Ложь;" & @CRLF & _
" ИначеЕсли ЗначениеПараметра = "Пометка" Тогда" & @CRLF & _
" ПараметрыВыполнения.УдалятьНепосредственно = Ложь;" & @CRLF & _
" ПараметрыВыполнения.ПомечатьНаУдаление = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "ВключатьБизнесЛогику");" & @CRLF & _
" Если ТипЗнч(ЗначениеПараметра) = Тип("Булево") Тогда" & @CRLF & _
" ПараметрыВыполнения.ВключатьБизнесЛогику = ЗначениеПараметра;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "ПривилегированнаяЗапись");" & @CRLF & _
" Если ТипЗнч(ЗначениеПараметра) = Тип("Булево") Тогда" & @CRLF & _
" ПараметрыВыполнения.ПривилегированнаяЗапись = ЗначениеПараметра;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "УчитыватьПрикладныеПравила");" & @CRLF & _
" Если ТипЗнч(ЗначениеПараметра) = Тип("Булево") Тогда" & @CRLF & _
" ПараметрыВыполнения.УчитыватьПрикладныеПравила = ЗначениеПараметра;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "МестаЗамены", Новый Массив);" & @CRLF & _
" Если (ЗначениеПараметра.Количество() > 0) Тогда" & @CRLF & _
" ПараметрыВыполнения.МестаЗамены = Новый Массив(Новый ФиксированныйМассив(ЗначениеПараметра));" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ПараметрыВыполнения;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область МестаИспользования" & @CRLF & _
"" & @CRLF & _
"Функция ОписаниеТипаКлючиЗаписей()" & @CRLF & _
" " & @CRLF & _
" ДобавляемыеТипы = Новый Массив;" & @CRLF & _
" Для Каждого Мета Из Метаданные.РегистрыСведений Цикл" & @CRLF & _
" ДобавляемыеТипы.Добавить(Тип("РегистрСведенийКлючЗаписи." + Мета.Имя));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого Мета Из Метаданные.РегистрыНакопления Цикл" & @CRLF & _
" ДобавляемыеТипы.Добавить(Тип("РегистрНакопленияКлючЗаписи." + Мета.Имя));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого Мета Из Метаданные.РегистрыБухгалтерии Цикл" & @CRLF & _
" ДобавляемыеТипы.Добавить(Тип("РегистрБухгалтерииКлючЗаписи." + Мета.Имя));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Для Каждого Мета Из Метаданные.РегистрыРасчета Цикл" & @CRLF & _
" ДобавляемыеТипы.Добавить(Тип("РегистрРасчетаКлючЗаписи." + Мета.Имя));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Новый ОписаниеТипов(ДобавляемыеТипы); " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ОписаниеИзмеренийНабора(Знач МетаданныеРегистра, КэшИзмеренийРегистров)" & @CRLF & _
" " & @CRLF & _
" ОписаниеИзмерений = КэшИзмеренийРегистров[МетаданныеРегистра];" & @CRLF & _
" Если ОписаниеИзмерений <> Неопределено Тогда" & @CRLF & _
" Возврат ОписаниеИзмерений;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Период и регистратор, если есть." & @CRLF & _
" ОписаниеИзмерений = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" ДанныеИзмерения = Новый Структура("Ведущее, Представление, Формат, Тип", Ложь);" & @CRLF & _
" " & @CRLF & _
" Если Метаданные.РегистрыСведений.Содержит(МетаданныеРегистра) Тогда" & @CRLF & _
" // Возможно есть период" & @CRLF & _
" МетаПериод = МетаданныеРегистра.ПериодичностьРегистраСведений; " & @CRLF & _
" Периодичность = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений;" & @CRLF & _
" " & @CRLF & _
" Если МетаПериод = Периодичность.ПозицияРегистратора Тогда" & @CRLF & _
" ДанныеИзмерения.Тип = Документы.ТипВсеСсылки();" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Регистратор'");" & @CRLF & _
" ДанныеИзмерения.Ведущее = Истина;" & @CRLF & _
" ОписаниеИзмерений.Вставить("Регистратор", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаПериод = Периодичность.Год Тогда" & @CRLF & _
" ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата");" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Период'");" & @CRLF & _
" ДанныеИзмерения.Формат = НСтр("ru = 'ДФ=''yyyy ""г.""''; ДП=''Дата не задана'''");" & @CRLF & _
" ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаПериод = Периодичность.День Тогда" & @CRLF & _
" ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата");" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Период'");" & @CRLF & _
" ДанныеИзмерения.Формат = НСтр("ru = 'ДЛФ=D; ДП=''Дата не задана'''");" & @CRLF & _
" ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаПериод = Периодичность.Квартал Тогда" & @CRLF & _
" ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата");" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Период'");" & @CRLF & _
" ДанныеИзмерения.Формат = НСтр("ru = 'ДФ=''к """"квартал """"yyyy """"г.""""''; ДП=''Дата не задана'''");" & @CRLF & _
" ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаПериод = Периодичность.Месяц Тогда" & @CRLF & _
" ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата");" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Период'");" & @CRLF & _
" ДанныеИзмерения.Формат = НСтр("ru = 'ДФ=''ММММ yyyy """"г.""""''; ДП=''Дата не задана'''");" & @CRLF & _
" ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли МетаПериод = Периодичность.Секунда Тогда" & @CRLF & _
" ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата");" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Период'");" & @CRLF & _
" ДанныеИзмерения.Формат = НСтр("ru = 'ДЛФ=DT; ДП=''Дата не задана'''");" & @CRLF & _
" ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" ДанныеИзмерения.Тип = Документы.ТипВсеСсылки();" & @CRLF & _
" ДанныеИзмерения.Представление = НСтр("ru = 'Регистратор'");" & @CRLF & _
" ДанныеИзмерения.Ведущее = Истина;" & @CRLF & _
" ОписаниеИзмерений.Вставить("Регистратор", ДанныеИзмерения);" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Все измерения" & @CRLF & _
" Для Каждого МетаИзмерение Из МетаданныеРегистра.Измерения Цикл" & @CRLF & _
" ДанныеИзмерения = Новый Структура("Ведущее, Представление, Формат, Тип");" & @CRLF & _
" ДанныеИзмерения.Тип = МетаИзмерение.Тип;" & @CRLF & _
" ДанныеИзмерения.Представление = МетаИзмерение.Представление();" & @CRLF & _
" ДанныеИзмерения.Ведущее = МетаИзмерение.Ведущее;" & @CRLF & _
" ОписаниеИзмерений.Вставить(МетаИзмерение.Имя, ДанныеИзмерения);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КэшИзмеренийРегистров[МетаданныеРегистра] = ОписаниеИзмерений;" & @CRLF & _
" Возврат ОписаниеИзмерений;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область УсловныеВызовы" & @CRLF & _
"" & @CRLF & _
"// Возвращает серверный модуль менеджера по имени объекта." & @CRLF & _
"Функция СерверныйМодульМенеджера(Имя)" & @CRLF & _
" ОбъектНайден = Ложь;" & @CRLF & _
" " & @CRLF & _
" ЧастиИмени = СтрРазделить(Имя, ".");" & @CRLF & _
" Если ЧастиИмени.Количество() = 2 Тогда" & @CRLF & _
" " & @CRLF & _
" ИмяВида = ВРег(ЧастиИмени[0]);" & @CRLF & _
" ИмяОбъекта = ЧастиИмени[1];" & @CRLF & _
" " & @CRLF & _
" Если ИмяВида = ВРег("Константы") Тогда" & @CRLF & _
" Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("РегистрыСведений") Тогда" & @CRLF & _
" Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("РегистрыНакопления") Тогда" & @CRLF & _
" Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("РегистрыБухгалтерии") Тогда" & @CRLF & _
" Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("РегистрыРасчета") Тогда" & @CRLF & _
" Если Метаданные.РегистрыРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("Справочники") Тогда" & @CRLF & _
" Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("Документы") Тогда" & @CRLF & _
" Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("Отчеты") Тогда" & @CRLF & _
" Если Метаданные.Отчеты.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("Обработки") Тогда" & @CRLF & _
" Если Метаданные.Обработки.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("БизнесПроцессы") Тогда" & @CRLF & _
" Если Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("ЖурналыДокументов") Тогда" & @CRLF & _
" Если Метаданные.ЖурналыДокументов.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("Задачи") Тогда" & @CRLF & _
" Если Метаданные.Задачи.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("ПланыСчетов") Тогда" & @CRLF & _
" Если Метаданные.ПланыСчетов.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("ПланыОбмена") Тогда" & @CRLF & _
" Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("ПланыВидовХарактеристик") Тогда" & @CRLF & _
" Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ИмяВида = ВРег("ПланыВидовРасчета") Тогда" & @CRLF & _
" Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда" & @CRLF & _
" ОбъектНайден = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Не ОбъектНайден Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Объект метаданных ""%1"" не существует.'"), Имя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно." & @CRLF & _
" УстановитьБезопасныйРежим(Истина);" & @CRLF & _
" Модуль = Вычислить(Имя);" & @CRLF & _
" // АПК:488-вкл" & @CRLF & _
" " & @CRLF & _
" Возврат Модуль;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Данные" & @CRLF & _
"" & @CRLF & _
"Функция СравниваемыеКолонки(Знач КоллекцияСтрок, Знач ИменаКолонок, Знач ИсключаяКолонки)" & @CRLF & _
" " & @CRLF & _
" Если ПустаяСтрока(ИменаКолонок) Тогда" & @CRLF & _
" " & @CRLF & _
" ТипКоллекции = ТипЗнч(КоллекцияСтрок);" & @CRLF & _
" ЭтоСписокЗначений = (ТипКоллекции = Тип("СписокЗначений"));" & @CRLF & _
" ЭтоТаблицаЗначений = (ТипКоллекции = Тип("ТаблицаЗначений"));" & @CRLF & _
" ЭтоКоллекцияКлючИЗначение = (ТипКоллекции = Тип("Соответствие"))" & @CRLF & _
" Или (ТипКоллекции = Тип("Структура"))" & @CRLF & _
" Или (ТипКоллекции = Тип("ФиксированноеСоответствие"))" & @CRLF & _
" Или (ТипКоллекции = Тип("ФиксированнаяСтруктура"));" & @CRLF & _
" " & @CRLF & _
" СравниваемыеКолонки = Новый Массив;" & @CRLF & _
" Если ЭтоТаблицаЗначений Тогда" & @CRLF & _
" Для Каждого Колонка Из КоллекцияСтрок.Колонки Цикл" & @CRLF & _
" СравниваемыеКолонки.Добавить(Колонка.Имя);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ИначеЕсли ЭтоСписокЗначений Тогда" & @CRLF & _
" СравниваемыеКолонки.Добавить("Значение");" & @CRLF & _
" СравниваемыеКолонки.Добавить("Картинка");" & @CRLF & _
" СравниваемыеКолонки.Добавить("Пометка");" & @CRLF & _
" СравниваемыеКолонки.Добавить("Представление");" & @CRLF & _
" ИначеЕсли ЭтоКоллекцияКлючИЗначение Тогда" & @CRLF & _
" СравниваемыеКолонки.Добавить("Ключ");" & @CRLF & _
" СравниваемыеКолонки.Добавить("Значение");" & @CRLF & _
" Иначе " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Для коллекции типа %1 укажите имена полей, по которым производится сравнение в %2.'")," & @CRLF & _
" ТипКоллекции, "ОбщегоНазначения.КоллекцииИдентичны");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Иначе" & @CRLF & _
" СравниваемыеКолонки = СтрРазделить(СтрЗаменить(ИменаКолонок, " ", ""), ",");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Вычитаем исключаемые поля" & @CRLF & _
" Если Не ПустаяСтрока(ИсключаяКолонки) Тогда" & @CRLF & _
" ИсключаяКолонки = СтрРазделить(СтрЗаменить(ИсключаяКолонки, " ", ""), ",");" & @CRLF & _
" СравниваемыеКолонки = ОбщегоНазначенияКлиентСервер.РазностьМассивов(СравниваемыеКолонки, ИсключаяКолонки);" & @CRLF & _
" КонецЕсли; " & @CRLF & _
" Возврат СравниваемыеКолонки;" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция СравнитьСУчетомПоследовательности(Знач КоллекцияСтрок1, Знач КоллекцияСтрок2, Знач СравниваемыеКолонки)" & @CRLF & _
" " & @CRLF & _
" ТипКоллекции = ТипЗнч(КоллекцияСтрок1);" & @CRLF & _
" СравниваютсяМассивы = (ТипКоллекции = Тип("Массив") Или ТипКоллекции = Тип("ФиксированныйМассив"));" & @CRLF & _
" " & @CRLF & _
" // Параллельный обход обеих коллекций." & @CRLF & _
" НомерСтрокиКоллекции1 = 0;" & @CRLF & _
" Для Каждого СтрокаКоллекции1 Из КоллекцияСтрок1 Цикл" & @CRLF & _
" // Спозиционируемся на аналогичную строку второй коллекции." & @CRLF & _
" НомерСтрокиКоллекции2 = 0;" & @CRLF & _
" ЕстьСтрокиКоллекции2 = Ложь;" & @CRLF & _
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл" & @CRLF & _
" ЕстьСтрокиКоллекции2 = Истина;" & @CRLF & _
" Если НомерСтрокиКоллекции2 = НомерСтрокиКоллекции1 Тогда" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" НомерСтрокиКоллекции2 = НомерСтрокиКоллекции2 + 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Если Не ЕстьСтрокиКоллекции2 Тогда" & @CRLF & _
" // Во второй коллекции вообще нет строк." & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" // Сравниваем значения полей двух строк." & @CRLF & _
" Если СравниваютсяМассивы Тогда" & @CRLF & _
" Если СтрокаКоллекции1 <> СтрокаКоллекции2 Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Иначе" & @CRLF & _
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл" & @CRLF & _
" Если СтрокаКоллекции1[ИмяКолонки] <> СтрокаКоллекции2[ИмяКолонки] Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" НомерСтрокиКоллекции1 = НомерСтрокиКоллекции1 + 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" КоличествоСтрокКоллекции1 = НомерСтрокиКоллекции1;" & @CRLF & _
" " & @CRLF & _
" // Отдельно подсчитаем количество строк второй коллекции." & @CRLF & _
" КоличествоСтрокКоллекции2 = 0;" & @CRLF & _
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл" & @CRLF & _
" КоличествоСтрокКоллекции2 = КоличествоСтрокКоллекции2 + 1;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Если в первой коллекции не оказалось строк, " & @CRLF & _
" // то их не должно быть и во второй." & @CRLF & _
" Если КоличествоСтрокКоллекции1 = 0 Тогда" & @CRLF & _
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КоличествоСтрокКоллекции2 = 0;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Количество строк не должно отличаться." & @CRLF & _
" Если КоличествоСтрокКоллекции1 <> КоличествоСтрокКоллекции2 Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция СравнитьБезУчетаПоследовательности(Знач КоллекцияСтрок1, Знач КоллекцияСтрок2, Знач СравниваемыеКолонки)" & @CRLF & _
" " & @CRLF & _
" // Строки отбора накапливаем по первой коллекции для того, чтобы:" & @CRLF & _
" // - повторно не искать одинаковые строки," & @CRLF & _
" // - убедиться, что во второй коллекции ни одной такой строки, которой нет в накопленных." & @CRLF & _
" " & @CRLF & _
" СтрокиОтбора = Новый ТаблицаЗначений;" & @CRLF & _
" ПараметрыОтбора = Новый Структура;" & @CRLF & _
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл" & @CRLF & _
" СтрокиОтбора.Колонки.Добавить(ИмяКолонки);" & @CRLF & _
" ПараметрыОтбора.Вставить(ИмяКолонки);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" ЕстьСтрокиКоллекции1 = Ложь;" & @CRLF & _
" Для Каждого СтрокаОтбора Из КоллекцияСтрок1 Цикл" & @CRLF & _
" " & @CRLF & _
" ЗаполнитьЗначенияСвойств(ПараметрыОтбора, СтрокаОтбора);" & @CRLF & _
" Если СтрокиОтбора.НайтиСтроки(ПараметрыОтбора).Количество() > 0 Тогда" & @CRLF & _
" // Строку с такими полями уже искали." & @CRLF & _
" Продолжить;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ЗаполнитьЗначенияСвойств(СтрокиОтбора.Добавить(), СтрокаОтбора);" & @CRLF & _
" " & @CRLF & _
" // Подсчитаем количество таких строк в первой коллекции." & @CRLF & _
" НайденоСтрокКоллекции1 = 0;" & @CRLF & _
" Для Каждого СтрокаКоллекции1 Из КоллекцияСтрок1 Цикл" & @CRLF & _
" СтрокаПодходит = Истина;" & @CRLF & _
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл" & @CRLF & _
" Если СтрокаКоллекции1[ИмяКолонки] <> СтрокаОтбора[ИмяКолонки] Тогда" & @CRLF & _
" СтрокаПодходит = Ложь;" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Если СтрокаПодходит Тогда" & @CRLF & _
" НайденоСтрокКоллекции1 = НайденоСтрокКоллекции1 + 1;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Подсчитаем количество таких строк во второй коллекции." & @CRLF & _
" НайденоСтрокКоллекции2 = 0;" & @CRLF & _
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл" & @CRLF & _
" СтрокаПодходит = Истина;" & @CRLF & _
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл" & @CRLF & _
" Если СтрокаКоллекции2[ИмяКолонки] <> СтрокаОтбора[ИмяКолонки] Тогда" & @CRLF & _
" СтрокаПодходит = Ложь;" & @CRLF & _
" Прервать;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Если СтрокаПодходит Тогда" & @CRLF & _
" НайденоСтрокКоллекции2 = НайденоСтрокКоллекции2 + 1;" & @CRLF & _
" // Если количество таких строк во второй коллекции превысило количество в первой, " & @CRLF & _
" // то уже можно сделать вывод, что коллекции не идентичны." & @CRLF & _
" Если НайденоСтрокКоллекции2 > НайденоСтрокКоллекции1 Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Количество таких строк не должно отличаться." & @CRLF & _
" Если НайденоСтрокКоллекции1 <> НайденоСтрокКоллекции2 Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ЕстьСтрокиКоллекции1 = Истина;" & @CRLF & _
" " & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" // Если в первой коллекции не оказалось строк, " & @CRLF & _
" // то их не должно быть и во второй." & @CRLF & _
" Если Не ЕстьСтрокиКоллекции1 Тогда" & @CRLF & _
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Проверим, что во второй коллекции нет ни одной такой строки, которой нет в накопленных." & @CRLF & _
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ПараметрыОтбора, СтрокаКоллекции2);" & @CRLF & _
" Если СтрокиОтбора.НайтиСтроки(ПараметрыОтбора).Количество() = 0 Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"Функция СравнитьМассивы(Знач Массив1, Знач Массив2)" & @CRLF & _
" " & @CRLF & _
" Если Массив1.Количество() <> Массив2.Количество() Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Элемент Из Массив1 Цикл" & @CRLF & _
" Если Массив2.Найти(Элемент) = Неопределено Тогда" & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Истина;" & @CRLF & _
" " & @CRLF & _
"КонецФункции " & @CRLF & _
"" & @CRLF & _
"Процедура ПроверкаФиксированностиДанных(Данные, ДанныеВЗначенииФиксированныхТипов = Ложь)" & @CRLF & _
" " & @CRLF & _
" ТипДанных = ТипЗнч(Данные);" & @CRLF & _
" СоставТипов = Новый ОписаниеТипов(" & @CRLF & _
" "ХранилищеЗначения," & @CRLF & _
" |ФиксированныйМассив," & @CRLF & _
" |ФиксированнаяСтруктура," & @CRLF & _
" |ФиксированноеСоответствие");" & @CRLF & _
" " & @CRLF & _
" Если СоставТипов.СодержитТип(ТипДанных) Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ДанныеВЗначенииФиксированныхТипов Тогда" & @CRLF & _
" " & @CRLF & _
" СоставТипов = Новый ОписаниеТипов(" & @CRLF & _
" "Булево,Строка,Число,Дата," & @CRLF & _
" |Неопределено,УникальныйИдентификатор,Null,Тип," & @CRLF & _
" |ХранилищеЗначения,ОбщийМодуль,ОбъектМетаданных," & @CRLF & _
" |ТипЗначенияXDTO,ТипОбъектаXDTO," & @CRLF & _
" |ИдентификаторОбсужденияСистемыВзаимодействия");" & @CRLF & _
" " & @CRLF & _
" Если СоставТипов.СодержитТип(ТипДанных)" & @CRLF & _
" Или ЭтоСсылка(ТипДанных) Тогда" & @CRLF & _
" " & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Данные типа %1 не могут быть зафиксированы в функции %2.'")," & @CRLF & _
" Строка(ТипДанных), "ОбщегоНазначения.ФиксированныеДанные");" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция РазмерСтрокиВБайтах(Знач Строка)" & @CRLF & _
" " & @CRLF & _
" Возврат ПолучитьДвоичныеДанныеИзСтроки(Строка, "UTF-8").Размер();" & @CRLF & _
"" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#Область СкопироватьРекурсивно" & @CRLF & _
"" & @CRLF & _
"Функция СкопироватьСтруктуру(СтруктураИсточник, ФиксироватьДанные)" & @CRLF & _
" " & @CRLF & _
" СтруктураРезультат = Новый Структура;" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючИЗначение Из СтруктураИсточник Цикл" & @CRLF & _
" СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксироватьДанные));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ФиксироватьДанные = Истина " & @CRLF & _
" Или ФиксироватьДанные = Неопределено" & @CRLF & _
" И ТипЗнч(СтруктураИсточник) = Тип("ФиксированнаяСтруктура") Тогда " & @CRLF & _
" " & @CRLF & _
" Возврат Новый ФиксированнаяСтруктура(СтруктураРезультат);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат СтруктураРезультат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция СкопироватьСоответствие(СоответствиеИсточник, ФиксироватьДанные)" & @CRLF & _
" " & @CRLF & _
" СоответствиеРезультат = Новый Соответствие;" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл" & @CRLF & _
" СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксироватьДанные));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ФиксироватьДанные = Истина " & @CRLF & _
" Или ФиксироватьДанные = Неопределено" & @CRLF & _
" И ТипЗнч(СоответствиеИсточник) = Тип("ФиксированноеСоответствие") Тогда " & @CRLF & _
" Возврат Новый ФиксированноеСоответствие(СоответствиеРезультат);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат СоответствиеРезультат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция СкопироватьМассив(МассивИсточник, ФиксироватьДанные)" & @CRLF & _
" " & @CRLF & _
" МассивРезультат = Новый Массив;" & @CRLF & _
" " & @CRLF & _
" Для Каждого Элемент Из МассивИсточник Цикл" & @CRLF & _
" МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент, ФиксироватьДанные));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Если ФиксироватьДанные = Истина " & @CRLF & _
" Или ФиксироватьДанные = Неопределено" & @CRLF & _
" И ТипЗнч(МассивИсточник) = Тип("ФиксированныйМассив") Тогда " & @CRLF & _
" Возврат Новый ФиксированныйМассив(МассивРезультат);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат МассивРезультат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция СкопироватьСписокЗначений(СписокИсточник, ФиксироватьДанные)" & @CRLF & _
" " & @CRLF & _
" СписокРезультат = Новый СписокЗначений;" & @CRLF & _
" " & @CRLF & _
" Для Каждого ЭлементСписка Из СписокИсточник Цикл" & @CRLF & _
" СписокРезультат.Добавить(" & @CRLF & _
" СкопироватьРекурсивно(ЭлементСписка.Значение, ФиксироватьДанные), " & @CRLF & _
" ЭлементСписка.Представление, " & @CRLF & _
" ЭлементСписка.Пометка, " & @CRLF & _
" ЭлементСписка.Картинка);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат СписокРезультат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Процедура СкопироватьЗначенияТаблицыЗначений(ТаблицаЗначений, ФиксироватьДанные)" & @CRLF & _
" Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл" & @CRLF & _
" Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл" & @CRLF & _
" СтрокаТаблицыЗначений[Колонка.Имя] = СкопироватьРекурсивно(СтрокаТаблицыЗначений[Колонка.Имя], ФиксироватьДанные);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Процедура СкопироватьЗначенияСтрокиДереваЗначений(СтрокиДереваЗначений, ФиксироватьДанные);" & @CRLF & _
" Для Каждого СтрокаДереваЗначений Из СтрокиДереваЗначений Цикл" & @CRLF & _
" Для Каждого Колонка Из СтрокаДереваЗначений.Владелец().Колонки Цикл" & @CRLF & _
" СтрокаДереваЗначений[Колонка.Имя] = СкопироватьРекурсивно(СтрокаДереваЗначений[Колонка.Имя], ФиксироватьДанные);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" СкопироватьЗначенияСтрокиДереваЗначений(СтрокаДереваЗначений.Строки, ФиксироватьДанные);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область Метаданные" & @CRLF & _
"" & @CRLF & _
"Процедура ПроверитьОбъектМетаданныхСуществует(ПолноеИмя)" & @CRLF & _
" " & @CRLF & _
" Если ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) = Неопределено Тогда " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неизвестный тип объекта метаданных ""%1"".'"), ПолноеИмя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ХранилищеНастроек" & @CRLF & _
"" & @CRLF & _
"Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Настройки," & @CRLF & _
" ОписаниеНастроек, ИмяПользователя, ОбновитьПовторноИспользуемыеЗначения)" & @CRLF & _
" " & @CRLF & _
" Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Настройки," & @CRLF & _
" ОписаниеНастроек, ИмяПользователя);" & @CRLF & _
" " & @CRLF & _
" Если ОбновитьПовторноИспользуемыеЗначения Тогда" & @CRLF & _
" ОбновитьПовторноИспользуемыеЗначения();" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию," & @CRLF & _
" ОписаниеНастроек, ИмяПользователя)" & @CRLF & _
" " & @CRLF & _
" Результат = Неопределено;" & @CRLF & _
" " & @CRLF & _
" Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда" & @CRLF & _
" Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек)," & @CRLF & _
" ОписаниеНастроек, ИмяПользователя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Результат = Неопределено Тогда" & @CRLF & _
" Результат = ЗначениеПоУмолчанию;" & @CRLF & _
" Иначе" & @CRLF & _
" УстановитьПривилегированныйРежим(Истина);" & @CRLF & _
" Если ОчиститьНесуществующиеСсылки(Результат) Тогда" & @CRLF & _
" Результат = ЗначениеПоУмолчанию;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Удаляет из переданной коллекции ссылки, ссылающиеся на несуществующие данные в информационной базе." & @CRLF & _
"// Не очищает переданное значение, если в нем передана несуществующая ссылка, а возвращает Ложь. " & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Значение - ЛюбаяСсылка" & @CRLF & _
"// - Произвольный - проверяемое значение или коллекция." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение: " & @CRLF & _
"// Булево - Истина, если Значение ссылочного типа и объект не существует в информационной базе." & @CRLF & _
"// Ложь, если Значение не ссылочного типа или объект существует." & @CRLF & _
"//" & @CRLF & _
"Функция ОчиститьНесуществующиеСсылки(Значение)" & @CRLF & _
" " & @CRLF & _
" Тип = ТипЗнч(Значение);" & @CRLF & _
" Если Тип = Тип("Неопределено")" & @CRLF & _
" Или Тип = Тип("Булево")" & @CRLF & _
" Или Тип = Тип("Строка")" & @CRLF & _
" Или Тип = Тип("Число")" & @CRLF & _
" Или Тип = Тип("Дата") Тогда // Оптимизация - часто используемые примитивные типы." & @CRLF & _
" " & @CRLF & _
" Возврат Ложь; // Не ссылка." & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Тип = Тип("Массив") Тогда" & @CRLF & _
" " & @CRLF & _
" Количество = Значение.Количество();" & @CRLF & _
" Для Номер = 1 По Количество Цикл" & @CRLF & _
" ОбратныйИндекс = Количество - Номер;" & @CRLF & _
" // @skip-check query-in-loop - выборка ссылок из разных таблиц." & @CRLF & _
" Если ОчиститьНесуществующиеСсылки(Значение[ОбратныйИндекс]) Тогда" & @CRLF & _
" Значение.Удалить(ОбратныйИндекс);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь; // Не ссылка." & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Тип = Тип("Структура")" & @CRLF & _
" Или Тип = Тип("Соответствие") Тогда" & @CRLF & _
" " & @CRLF & _
" Для Каждого КлючИЗначение Из Значение Цикл" & @CRLF & _
" // @skip-check query-in-loop - выборка ссылок из разных таблиц." & @CRLF & _
" Если ОчиститьНесуществующиеСсылки(КлючИЗначение.Значение) Тогда" & @CRLF & _
" Значение.Вставить(КлючИЗначение.Ключ, Неопределено);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь; // Не ссылка." & @CRLF & _
" " & @CRLF & _
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или Справочники.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или Перечисления.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип)" & @CRLF & _
" Или Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда" & @CRLF & _
" // Ссылочный тип, исключая ТочкаМаршрутаБизнесПроцессаСсылка." & @CRLF & _
" " & @CRLF & _
" Если Значение.Пустая() Тогда" & @CRLF & _
" Возврат Ложь; // Ссылка пустая." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Возврат ЗначениеРеквизитаОбъекта(Значение, "Ссылка") = Неопределено;" & @CRLF & _
" " & @CRLF & _
" Иначе" & @CRLF & _
" Возврат Ложь; // Не ссылка." & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Процедура ХранилищеУдалить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ИмяПользователя)" & @CRLF & _
" " & @CRLF & _
" Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда" & @CRLF & _
" МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек(КлючНастроек), ИмяПользователя);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает строку ключа настроек, не превышающую допустимую длину 128 символов." & @CRLF & _
"// Если указанная строка превышает 128, тогда вместо символов сверх 96 символов" & @CRLF & _
"// добавляется их хеш-сумма по алгоритму MD5 размером 32 символа." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Строка - Строка - строка произвольной длины." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Строка - не более 128 символов." & @CRLF & _
"//" & @CRLF & _
"Функция КлючНастроек(Знач Строка)" & @CRLF & _
" Возврат СократитьСтрокуКонтрольнойСуммой(Строка, 128);" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область БезопасноеХранилище" & @CRLF & _
"" & @CRLF & _
"Функция ДанныеИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные)" & @CRLF & _
" " & @CRLF & _
" ИмяБезопасногоХранилищаДанных = "РегистрСведений.БезопасноеХранилищеДанных";" & @CRLF & _
" Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() И ОбщиеДанные <> Истина Тогда" & @CRLF & _
" ИмяБезопасногоХранилищаДанных = "РегистрСведений.БезопасноеХранилищеДанныхОбластейДанных";" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса =" & @CRLF & _
" "ВЫБРАТЬ" & @CRLF & _
" | БезопасноеХранилищеДанных.Владелец КАК ВладелецДанных," & @CRLF & _
" | БезопасноеХранилищеДанных.Данные КАК Данные" & @CRLF & _
" |ИЗ" & @CRLF & _
" | #ИмяБезопасногоХранилищаДанных КАК БезопасноеХранилищеДанных" & @CRLF & _
" |ГДЕ" & @CRLF & _
" | БезопасноеХранилищеДанных.Владелец В (&Владельцы)";" & @CRLF & _
" " & @CRLF & _
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяБезопасногоХранилищаДанных", ИмяБезопасногоХранилищаДанных);" & @CRLF & _
" Запрос = Новый Запрос(ТекстЗапроса);" & @CRLF & _
" Запрос.УстановитьПараметр("Владельцы", Владельцы);" & @CRLF & _
" РезультатЗапроса = Запрос.Выполнить().Выбрать();" & @CRLF & _
" " & @CRLF & _
" Результат = Новый Соответствие(); " & @CRLF & _
" " & @CRLF & _
" НаборДанныхКлюча = ?(ЗначениеЗаполнено(Ключи) И СтрНайти(Ключи, ","), Новый Структура(Ключи), Неопределено);" & @CRLF & _
" Для Каждого ВладелецДанных Из Владельцы Цикл" & @CRLF & _
" Результат.Вставить(ВладелецДанных, НаборДанныхКлюча);" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Пока РезультатЗапроса.Следующий() Цикл" & @CRLF & _
" " & @CRLF & _
" ДанныеВладельца = Новый Структура(Ключи);" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда" & @CRLF & _
" " & @CRLF & _
" СохраненныеДанные = РезультатЗапроса.Данные.Получить();" & @CRLF & _
" Если ЗначениеЗаполнено(СохраненныеДанные) Тогда" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(Ключи) Тогда" & @CRLF & _
" ВладелецДанных = Результат[РезультатЗапроса.ВладелецДанных];" & @CRLF & _
" ЗаполнитьЗначенияСвойств(ДанныеВладельца, СохраненныеДанные);" & @CRLF & _
" Иначе" & @CRLF & _
" ДанныеВладельца = СохраненныеДанные;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Ключи <> Неопределено" & @CRLF & _
" И ДанныеВладельца <> Неопределено" & @CRLF & _
" И ДанныеВладельца.Количество() = 1 Тогда" & @CRLF & _
" ЗначениеПоКлючу = ?(ДанныеВладельца.Свойство(Ключи), ДанныеВладельца[Ключи], Неопределено);" & @CRLF & _
" Результат.Вставить(РезультатЗапроса.ВладелецДанных, ЗначениеПоКлючу);" & @CRLF & _
" Иначе" & @CRLF & _
" Результат.Вставить(РезультатЗапроса.ВладелецДанных, ДанныеВладельца);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область БезопасноеВыполнениеВнешнегоКода" & @CRLF & _
"" & @CRLF & _
"// Проверяет, что переданное имя ИмяПроцедуры является именем экспортной процедуры конфигурации." & @CRLF & _
"// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма" & @CRLF & _
"// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить и Вычислить" & @CRLF & _
"// при их использовании для динамического вызова методов код конфигурации." & @CRLF & _
"//" & @CRLF & _
"// В случае если переданная строка не является именем процедуры конфигурации, генерируется исключение." & @CRLF & _
"//" & @CRLF & _
"// Предназначена для вызова из см. процедуру ВыполнитьМетодКонфигурации." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяПроцедуры - Строка - проверяемое имя экспортной процедуры." & @CRLF & _
"//" & @CRLF & _
"Процедура ПроверитьИмяПроцедурыКонфигурации(Знач ИмяПроцедуры)" & @CRLF & _
" " & @CRLF & _
" ЧастиИмени = СтрРазделить(ИмяПроцедуры, ".");" & @CRLF & _
" Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неправильный формат параметра %1 (передано значение: ""%2"") в %3.'"), " & @CRLF & _
" "ИмяПроцедуры", ИмяПроцедуры, "ОбщегоНазначения.ВыполнитьМетодКонфигурации");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИмяОбъекта = ЧастиИмени[0];" & @CRLF & _
" Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неправильный формат параметра %1 (передано значение: ""%2"") в %3:" & @CRLF & _
" |Не существует общий модуль ""%4"".'")," & @CRLF & _
" "ИмяПроцедуры", ИмяПроцедуры, "ОбщегоНазначения.ВыполнитьМетодКонфигурации", ИмяОбъекта);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ЧастиИмени.Количество() = 3 Тогда" & @CRLF & _
" ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1];" & @CRLF & _
" Попытка" & @CRLF & _
" Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта);" & @CRLF & _
" Исключение" & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" Если Менеджер = Неопределено Тогда" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неправильный формат параметра %1 (передано значение: ""%2"") в %3:" & @CRLF & _
" |Не существует менеджер объекта ""%4"".'")," & @CRLF & _
" "ИмяПроцедуры", ИмяПроцедуры, "ОбщегоНазначения.ВыполнитьМетодКонфигурации", ПолноеИмяОбъекта);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()];" & @CRLF & _
" ВременнаяСтруктура = Новый Структура;" & @CRLF & _
" Попытка" & @CRLF & _
" // Проверка того, что ИмяПроцедуры является допустимым идентификатором." & @CRLF & _
" // Например: МояПроцедура." & @CRLF & _
" ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта);" & @CRLF & _
" Исключение" & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", КодОсновногоЯзыка())," & @CRLF & _
" УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Неправильный формат параметра %1 (передано значение: ""%2"") в %3:" & @CRLF & _
" |Имя метода ""%4"" не соответствует требованиям образования имен процедур и функций.'")," & @CRLF & _
" "ИмяПроцедуры", ИмяПроцедуры, "ОбщегоНазначения.ВыполнитьМетодКонфигурации", ИмяМетодаОбъекта);" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Возвращает менеджер объекта по имени." & @CRLF & _
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации"." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// СправочникиМенеджер" & @CRLF & _
"// СправочникМенеджер" & @CRLF & _
"// ДокументыМенеджер" & @CRLF & _
"// ДокументМенеджер" & @CRLF & _
"// ..." & @CRLF & _
"//" & @CRLF & _
"Функция МенеджерОбъектаПоИмени(Имя)" & @CRLF & _
" Перем КлассОМ, ИмяОМ, Менеджер;" & @CRLF & _
" " & @CRLF & _
" ЧастиИмени = СтрРазделить(Имя, ".");" & @CRLF & _
" " & @CRLF & _
" Если ЧастиИмени.Количество() > 0 Тогда" & @CRLF & _
" КлассОМ = ВРег(ЧастиИмени[0]);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ЧастиИмени.Количество() > 1 Тогда" & @CRLF & _
" ИмяОМ = ЧастиИмени[1];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если КлассОМ = "ПЛАНОБМЕНА"" & @CRLF & _
" Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда" & @CRLF & _
" Менеджер = ПланыОбмена;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "СПРАВОЧНИК"" & @CRLF & _
" Или КлассОМ = "СПРАВОЧНИКИ" Тогда" & @CRLF & _
" Менеджер = Справочники;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ДОКУМЕНТ"" & @CRLF & _
" Или КлассОМ = "ДОКУМЕНТЫ" Тогда" & @CRLF & _
" Менеджер = Документы;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ"" & @CRLF & _
" Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда" & @CRLF & _
" Менеджер = ЖурналыДокументов;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ"" & @CRLF & _
" Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда" & @CRLF & _
" Менеджер = Перечисления;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ОБЩИЙМОДУЛЬ"" & @CRLF & _
" Или КлассОМ = "ОБЩИЕМОДУЛИ" Тогда" & @CRLF & _
" " & @CRLF & _
" Возврат ОбщийМодуль(ИмяОМ);" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ОТЧЕТ"" & @CRLF & _
" Или КлассОМ = "ОТЧЕТЫ" Тогда" & @CRLF & _
" Менеджер = Отчеты;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ОБРАБОТКА"" & @CRLF & _
" Или КлассОМ = "ОБРАБОТКИ" Тогда" & @CRLF & _
" Менеджер = Обработки;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК"" & @CRLF & _
" Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда" & @CRLF & _
" Менеджер = ПланыВидовХарактеристик;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ"" & @CRLF & _
" Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда" & @CRLF & _
" Менеджер = ПланыСчетов;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА"" & @CRLF & _
" Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда" & @CRLF & _
" Менеджер = ПланыВидовРасчета;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ"" & @CRLF & _
" Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда" & @CRLF & _
" Менеджер = РегистрыСведений;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ"" & @CRLF & _
" Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда" & @CRLF & _
" Менеджер = РегистрыНакопления;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ"" & @CRLF & _
" Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда" & @CRLF & _
" Менеджер = РегистрыБухгалтерии;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА"" & @CRLF & _
" Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда" & @CRLF & _
" " & @CRLF & _
" Если ЧастиИмени.Количество() < 3 Тогда" & @CRLF & _
" // Регистр расчета" & @CRLF & _
" Менеджер = РегистрыРасчета;" & @CRLF & _
" Иначе" & @CRLF & _
" КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]);" & @CRLF & _
" Если ЧастиИмени.Количество() > 3 Тогда" & @CRLF & _
" ИмяПодчиненногоОМ = ЧастиИмени[3];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ"" & @CRLF & _
" Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда" & @CRLF & _
" // Перерасчет" & @CRLF & _
" Попытка" & @CRLF & _
" Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты;" & @CRLF & _
" ИмяОМ = ИмяПодчиненногоОМ;" & @CRLF & _
" Исключение" & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС"" & @CRLF & _
" Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда" & @CRLF & _
" Менеджер = БизнесПроцессы;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ЗАДАЧА"" & @CRLF & _
" Или КлассОМ = "ЗАДАЧИ" Тогда" & @CRLF & _
" Менеджер = Задачи;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "КОНСТАНТА"" & @CRLF & _
" Или КлассОМ = "КОНСТАНТЫ" Тогда" & @CRLF & _
" Менеджер = Константы;" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ"" & @CRLF & _
" Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда" & @CRLF & _
" Менеджер = Последовательности;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если Менеджер <> Неопределено Тогда" & @CRLF & _
" Если ЗначениеЗаполнено(ИмяОМ) Тогда" & @CRLF & _
" Попытка" & @CRLF & _
" Возврат Менеджер[ИмяОМ];" & @CRLF & _
" Исключение" & @CRLF & _
" Менеджер = Неопределено;" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" Иначе" & @CRLF & _
" Возврат Менеджер;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя);" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Вызвать экспортную функцию по имени с уровнем привилегий конфигурации." & @CRLF & _
"// При включении профилей безопасности для вызова оператора Выполнить() используется" & @CRLF & _
"// переход в безопасный режим с профилем безопасности, используемом для информационной базы" & @CRLF & _
"// (если выше по стеку не был установлен другой безопасный режим)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ИмяМетода - Строка - имя экспортной функции в формате" & @CRLF & _
"// <имя объекта>.<имя процедуры>, где <имя объекта> - это" & @CRLF & _
"// общий модуль или модуль менеджера объекта." & @CRLF & _
"// Параметры - Массив - параметры передаются в функцию <ИмяМетода>" & @CRLF & _
"// в порядке расположения элементов массива." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный - результат вызываемой функции." & @CRLF & _
"//" & @CRLF & _
"Функция ВызватьФункциюКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" ПроверитьИмяПроцедурыКонфигурации(ИмяМетода);" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда" & @CRLF & _
" МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");" & @CRLF & _
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()" & @CRLF & _
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда" & @CRLF & _
" " & @CRLF & _
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();" & @CRLF & _
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);" & @CRLF & _
" Если БезопасныйРежим() = Истина Тогда" & @CRLF & _
" УстановитьБезопасныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПараметрыСтрока = "";" & @CRLF & _
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда" & @CRLF & _
" Для Индекс = 0 По Параметры.ВГраница() Цикл " & @CRLF & _
" ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + XMLСтрока(Индекс) + "],";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Вычислить(ИмяМетода + "(" + ПараметрыСтрока + ")"); // АПК:488 Исполняемый код безопасен." & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Вызвать экспортную функцию объекта встроенного языка по имени." & @CRLF & _
"// При включении профилей безопасности для вызова оператора Выполнить() используется" & @CRLF & _
"// переход в безопасный режим с профилем безопасности, используемом для информационной базы" & @CRLF & _
"// (если выше по стеку не был установлен другой безопасный режим)." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект)." & @CRLF & _
"// ИмяМетода - Строка - имя экспортной функции модуля объекта обработки." & @CRLF & _
"// Параметры - Массив - параметры передаются в функцию <ИмяМетода>" & @CRLF & _
"// в порядке расположения элементов массива." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Произвольный - результат вызываемой функции." & @CRLF & _
"//" & @CRLF & _
"Функция ВызватьФункциюОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт" & @CRLF & _
" " & @CRLF & _
" // Проверка имени метода на корректность." & @CRLF & _
" Попытка" & @CRLF & _
" Тест = Новый Структура;" & @CRLF & _
" Тест.Вставить(ИмяМетода, ИмяМетода);" & @CRLF & _
" Исключение" & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Некорректное значение параметра %1 (%2) в %3.'"), " & @CRLF & _
" "ИмяМетода", ИмяМетода, "ОбщегоНазначения.ВыполнитьМетодОбъекта");" & @CRLF & _
" КонецПопытки;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда" & @CRLF & _
" МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");" & @CRLF & _
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()" & @CRLF & _
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда" & @CRLF & _
" " & @CRLF & _
" МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");" & @CRLF & _
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();" & @CRLF & _
" " & @CRLF & _
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда" & @CRLF & _
" " & @CRLF & _
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);" & @CRLF & _
" Если БезопасныйРежим() = Истина Тогда" & @CRLF & _
" УстановитьБезопасныйРежим(Ложь);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" ПараметрыСтрока = "";" & @CRLF & _
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда" & @CRLF & _
" Для Индекс = 0 По Параметры.ВГраница() Цикл " & @CRLF & _
" ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + XMLСтрока(Индекс) + "],";" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Вычислить("Объект." + ИмяМетода + "(" + ПараметрыСтрока + ")"); // АПК:488 Исполняемый код безопасен." & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ВнешниеКомпоненты" & @CRLF & _
"" & @CRLF & _
"Процедура ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение)" & @CRLF & _
" " & @CRLF & _
" Если МакетСуществует(Местоположение) Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Если ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда" & @CRLF & _
" МодульВнешниеКомпонентыСлужебный = ОбщийМодуль("ВнешниеКомпонентыСлужебный");" & @CRLF & _
" МодульВнешниеКомпонентыСлужебный.ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение);" & @CRLF & _
" Иначе " & @CRLF & _
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Указан несуществующий макет ""%1"" при подключении внешней компоненты ""%2"".'")," & @CRLF & _
" Местоположение, Идентификатор);" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"Функция МакетСуществует(ПолноеИмяМакета)" & @CRLF & _
" " & @CRLF & _
" Макет = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМакета);" & @CRLF & _
" Если ТипЗнч(Макет) = Тип("ОбъектМетаданных") Тогда " & @CRLF & _
" " & @CRLF & _
" Шаблон = Новый Структура("ТипМакета");" & @CRLF & _
" ЗаполнитьЗначенияСвойств(Шаблон, Макет);" & @CRLF & _
" ТипМакета = Неопределено;" & @CRLF & _
" Если Шаблон.Свойство("ТипМакета", ТипМакета) Тогда " & @CRLF & _
" Возврат ТипМакета <> Неопределено;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Ложь;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#Область ТекущееОкружение" & @CRLF & _
"" & @CRLF & _
"Функция НомерСборкиПоТекущейВерсииПлатформы(НомераСборокСтрокой)" & @CRLF & _
" " & @CRLF & _
" НомераСборок = СтрРазделить(НомераСборокСтрокой, ";", Истина);" & @CRLF & _
" " & @CRLF & _
" СборкиПоВерсиям = Новый Соответствие;" & @CRLF & _
" Для Каждого НомерСборки Из НомераСборок Цикл" & @CRLF & _
" НомерВерсии = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(НомерСборки);" & @CRLF & _
" СборкиПоВерсиям.Вставить(СокрЛП(НомерВерсии), СокрЛП(НомерСборки));" & @CRLF & _
" КонецЦикла;" & @CRLF & _
" " & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация;" & @CRLF & _
" ТекущаяВерсия = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);" & @CRLF & _
" " & @CRLF & _
" Результат = СборкиПоВерсиям[ТекущаяВерсия];" & @CRLF & _
" Если Не ЗначениеЗаполнено(Результат) Тогда" & @CRLF & _
" Результат = НомераСборок[0];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат Результат;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"" & @CRLF & _
"// Ниже этой версии БСП может запуститься и показать окно с рекомендациями, если она выше чем в МинимальнаяВерсияПлатформыДляЗапуска." & @CRLF & _
"Функция МинимальнаяВерсияПлатформы() Экспорт // АПК:581 - экспортная, так как используется при тестировании." & @CRLF & _
" " & @CRLF & _
" ВерсияРежимаСовместимости = ВерсияРежимаСовместимости();" & @CRLF & _
" ПоддерживаемыеВерсииПлатформы = ПоддерживаемыеВерсииПлатформы();" & @CRLF & _
" НайденнаяВерсия = ПоддерживаемыеВерсииПлатформы.НайтиПоЗначению(ВерсияРежимаСовместимости);" & @CRLF & _
" " & @CRLF & _
" Если НайденнаяВерсия = Неопределено Тогда" & @CRLF & _
" НайденнаяВерсия = ПоддерживаемыеВерсииПлатформы[ПоддерживаемыеВерсииПлатформы.Количество() - 1];" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" НомераСборок = НайденнаяВерсия.Представление;" & @CRLF & _
" " & @CRLF & _
" Возврат НомераСборок;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Ниже этой версии БСП не может запуститься и показать окно с рекомендациями." & @CRLF & _
"Функция МинимальнаяВерсияПлатформыДляЗапуска() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат "8.3.21.1622; 8.3.22.1704";" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// СписокЗначений:" & @CRLF & _
"// * Значение - Строка - поддерживаемый номер версии (режим совместимости);" & @CRLF & _
"// * Представление - Строка - минимальные номера сборок платформы, разделитель - точка с запятой." & @CRLF & _
"//" & @CRLF & _
"Функция ПоддерживаемыеВерсииПлатформы() Экспорт" & @CRLF & _
" " & @CRLF & _
" ПоддерживаемыеВерсииПлатформы = Новый СписокЗначений;" & @CRLF & _
" ПоддерживаемыеВерсииПлатформы.Добавить("8.3.21", "8.3.21.1775; 8.3.22.1923");" & @CRLF & _
" ПоддерживаемыеВерсииПлатформы.Добавить("8.3.22", "8.3.22.2355; 8.3.23.2011; 8.3.24.1304");" & @CRLF & _
" ПоддерживаемыеВерсииПлатформы.Добавить("8.3.23", "8.3.23.2011; 8.3.24.1304");" & @CRLF & _
" ПоддерживаемыеВерсииПлатформы.Добавить("8.3.24", "8.3.24.1304");" & @CRLF & _
" " & @CRLF & _
" Возврат ПоддерживаемыеВерсииПлатформы;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ВерсияРежимаСовместимости() Экспорт" & @CRLF & _
" " & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация();" & @CRLF & _
" РежимСовместимости = Метаданные.РежимСовместимости;" & @CRLF & _
" " & @CRLF & _
" Если РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда" & @CRLF & _
" ВерсияРежимаСовместимости = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);" & @CRLF & _
" Иначе" & @CRLF & _
" ВерсияРежимаСовместимости = СтрСоединить(СтрРазделить(РежимСовместимости, СтрСоединить(СтрРазделить(РежимСовместимости, "1234567890", Ложь), ""), Ложь), ".");" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат ВерсияРежимаСовместимости;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Выполняет проверку правильности заполнения минимальной и рекомендуемой версии платформы." & @CRLF & _
"//" & @CRLF & _
"// Параметры:" & @CRLF & _
"// Минимальная - Строка - номер версия платформы." & @CRLF & _
"// Рекомендуемая - Строка - номер версия платформы." & @CRLF & _
"//" & @CRLF & _
"// Возвращаемое значение:" & @CRLF & _
"// Булево - Истина, если минимальная и рекомендуемая версия платформы заполнена неправильно." & @CRLF & _
"//" & @CRLF & _
"Функция МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая)" & @CRLF & _
" " & @CRLF & _
" // Минимальная версия платформы должна быть заполнена." & @CRLF & _
" Если ПустаяСтрока(Минимальная) Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Минимальная версия платформы, заданная в конфигурации, не должна быть меньше минимальной версии платформы," & @CRLF & _
" // заданной в библиотеке." & @CRLF & _
" МинимальнаяБСП = НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы());" & @CRLF & _
" Если Не ЭтоВерсияЗащищенногоПрограммногоКомплекса(Минимальная)" & @CRLF & _
" И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(МинимальнаяБСП, Минимальная) > 0 Тогда" & @CRLF & _
" Возврат Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" // Минимальная версия платформы не должны быть больше рекомендуемой." & @CRLF & _
" Возврат Не ПустаяСтрока(Минимальная)" & @CRLF & _
" И Не ПустаяСтрока(Рекомендуемая)" & @CRLF & _
" И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Рекомендуемая) > 0;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция НедопустимыеВерсииПлатформы() Экспорт" & @CRLF & _
" " & @CRLF & _
" Возврат "";" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"Функция ЭтоВерсияЗащищенногоПрограммногоКомплекса(Версия)" & @CRLF & _
" " & @CRLF & _
" Версии = Новый Массив;" & @CRLF & _
" Версии.Добавить("8.3.21.1676");" & @CRLF & _
" Версии.Добавить("8.3.21.1901");" & @CRLF & _
" Возврат Версии.Найти(Версия) <> Неопределено;" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Для функции ОбщиеПараметрыБазовойФункциональности." & @CRLF & _
"Процедура УточнитьВерсиюПлатформы(ОбщиеПараметры)" & @CRLF & _
" " & @CRLF & _
" СистемнаяИнформация = Новый СистемнаяИнформация;" & @CRLF & _
" НоваяСборка = НоваяСборка(СистемнаяИнформация.ВерсияПриложения);" & @CRLF & _
" Если Не ЗначениеЗаполнено(НоваяСборка) Тогда" & @CRLF & _
" НоваяРекомендуемаяСборка = НоваяСборка(ОбщиеПараметры.МинимальнаяВерсияПлатформы);" & @CRLF & _
" Если ЗначениеЗаполнено(НоваяРекомендуемаяСборка) Тогда" & @CRLF & _
" МинимальнаяСборка = НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы());" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = МинимальнаяСборка;" & @CRLF & _
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = МинимальнаяСборка;" & @CRLF & _
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ОбщиеПараметры.РекомендуемаяВерсияПлатформы, НоваяРекомендуемаяСборка) < 0 Тогда" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НоваяРекомендуемаяСборка;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" ИначеЕсли ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ОбщиеПараметры.МинимальнаяВерсияПлатформы, НоваяСборка) < 0 Тогда" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НоваяСборка;" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = НоваяСборка;" & @CRLF & _
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = НоваяСборка;" & @CRLF & _
" ОбщиеПараметры.РаботаВПрограммеЗапрещена = Истина;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"" & @CRLF & _
"// Для процедуры УточнитьВерсиюПлатформы." & @CRLF & _
"Функция НоваяСборка(ТекущаяСборка)" & @CRLF & _
" " & @CRLF & _
" Если СтрНайти("8.3.22.1672,8.3.22.1603", ТекущаяСборка) Тогда" & @CRLF & _
" Возврат "8.3.22.1709";" & @CRLF & _
" " & @CRLF & _
" ИначеЕсли СтрНайти("8.3.21.1607,8.3.21.1508,8.3.21.1484", ТекущаяСборка) Тогда" & @CRLF & _
" Возврат "8.3.21.1624";" & @CRLF & _
" " & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Возврат "";" & @CRLF & _
" " & @CRLF & _
"КонецФункции" & @CRLF & _
"" & @CRLF & _
"// Локализация" & @CRLF & _
"" & @CRLF & _
"// Параметры:" & @CRLF & _
"// ОбщиеПараметры - см. ОбщиеПараметрыБазовойФункциональности" & @CRLF & _
"// " & @CRLF & _
"Процедура УточнитьМинимальнуюВерсиюПлатформыИзСервиса(ОбщиеПараметры)" & @CRLF & _
"" & @CRLF & _
" Если Не ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы") Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" // Проверка версии БИП начиная с которой появился программный интерфейс" & @CRLF & _
" МодульИнтернетПоддержкаПользователейКлиентСервер = ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер");" & @CRLF & _
" ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки();" & @CRLF & _
" " & @CRLF & _
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.7.1.35") <= 0 Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Попытка" & @CRLF & _
" МодульПолучениеОбновленийПрограммы = ОбщийМодуль("ПолучениеОбновленийПрограммы");" & @CRLF & _
" ИнформацияОВерсияхПлатформы = МодульПолучениеОбновленийПрограммы.ИнформацияОВерсияхПлатформы();" & @CRLF & _
" " & @CRLF & _
" // Контроль заполнения версий платформы по данным сервиса" & @CRLF & _
" Если ПустаяСтрока(ИнформацияОВерсияхПлатформы.МинимальнаяВерсияПлатформы)" & @CRLF & _
" И ПустаяСтрока(ИнформацияОВерсияхПлатформы.РекомендуемаяВерсияПлатформы) Тогда" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
" " & @CRLF & _
" Минимальная = НомерСборкиПоТекущейВерсииПлатформы(ИнформацияОВерсияхПлатформы.МинимальнаяВерсияПлатформы);" & @CRLF & _
" Рекомендуемая = НомерСборкиПоТекущейВерсииПлатформы(ИнформацияОВерсияхПлатформы.РекомендуемаяВерсияПлатформы);" & @CRLF & _
" " & @CRLF & _
" Если МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) Тогда" & @CRLF & _
" " & @CRLF & _
" МодульПолучениеОбновленийПрограммы.УдалитьИнформациюОВерсияхПлатформы();" & @CRLF & _
" ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Минимальная и рекомендуемая версии платформы ""1С:Предприятие"", полученные с сервиса обновления программ, не соответствуют следующим требованиям:" & @CRLF & _
" | - минимальная версия должна быть заполнена;" & @CRLF & _
" | - минимальная версия не должна быть меньше минимальной версии БСП (см. %1);" & @CRLF & _
" | - минимальная версия не должна быть меньше рекомендуемой версии." & @CRLF & _
" |Минимальная версия сервиса обновления программ: %2" & @CRLF & _
" |Минимальная версия БСП: %3" & @CRLF & _
" |Рекомендуемая версия сервиса обновления программ: %4" & @CRLF & _
" |" & @CRLF & _
" |Минимальная и рекомендуемая версия платформы ""1С:Предприятие"" установлена по данным см. %5." & @CRLF & _
" |Минимальная версия: %6" & @CRLF & _
" |Рекомендуемая версия: %7'"," & @CRLF & _
" КодОсновногоЯзыка())," & @CRLF & _
" "ОбщегоНазначения.МинимальнаяВерсияПлатформы", Минимальная, НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы())," & @CRLF & _
" Рекомендуемая, "ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности"," & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы, ОбщиеПараметры.РекомендуемаяВерсияПлатформы);" & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Базовая функциональность'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, " & @CRLF & _
" ТекстСообщения);" & @CRLF & _
" Возврат;" & @CRLF & _
" КонецЕсли;" & @CRLF & _
"" & @CRLF & _
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = Минимальная;" & @CRLF & _
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = Рекомендуемая;" & @CRLF & _
" " & @CRLF & _
" Исключение" & @CRLF & _
" ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" & @CRLF & _
" НСтр("ru = 'Не удалось изменить минимальную и рекомендуемую версию платформы ""1С:Предприятие"", полученную с сервиса обновления программ, по причине:" & @CRLF & _
" |%1'"," & @CRLF & _
" КодОсновногоЯзыка()), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));" & @CRLF & _
" ЗаписьЖурналаРегистрации(НСтр("ru = 'Базовая функциональность'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,," & @CRLF & _
" ТекстСообщения);" & @CRLF & _
" КонецПопытки;" & @CRLF & _
"" & @CRLF & _
"КонецПроцедуры" & @CRLF & _
"// Конец Локализация" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#КонецОбласти" & @CRLF & _
"" & @CRLF & _
"#КонецЕсли" & @CRLF & _
""
Local $aArray = StringRegExp($sString, $sRegex, $STR_REGEXPARRAYGLOBALFULLMATCH)
Local $aFullArray[0]
For $i = 0 To UBound($aArray) -1
_ArrayConcatenate($aFullArray, $aArray[$i])
Next
$aArray = $aFullArray
; Present the entire match result
_ArrayDisplay($aArray, "Result")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for AutoIt, please visit: https://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm