Regular Expressions 101

Save & Share

Flavor

  • PCRE2 (PHP >=7.3)
  • PCRE (PHP <7.3)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java 8
  • .NET 7.0 (C#)
  • Rust
  • Regex Flavor Guide

Function

  • Match
  • Substitution
  • List
  • Unit Tests

Tools

Sponsors
There are currently no sponsors. Become a sponsor today!
An explanation of your regex will be automatically generated as you type.
Detailed match information will be displayed here automatically.
  • All Tokens
  • Common Tokens
  • General Tokens
  • Anchors
  • Meta Sequences
  • Quantifiers
  • Group Constructs
  • Character Classes
  • Flags/Modifiers
  • Substitution
  • A single character of: a, b or c
    [abc]
  • A character except: a, b or c
    [^abc]
  • A character in the range: a-z
    [a-z]
  • A character not in the range: a-z
    [^a-z]
  • A character in the range: a-z or A-Z
    [a-zA-Z]
  • Any single character
    .
  • Alternate - match either a or b
    a|b
  • Any whitespace character
    \s
  • Any non-whitespace character
    \S
  • Any digit
    \d
  • Any non-digit
    \D
  • Any word character
    \w
  • Any non-word character
    \W
  • Non-capturing group
    (?:...)
  • Capturing group
    (...)
  • Zero or one of a
    a?
  • Zero or more of a
    a*
  • One or more of a
    a+
  • Exactly 3 of a
    a{3}
  • 3 or more of a
    a{3,}
  • Between 3 and 6 of a
    a{3,6}
  • Start of string
    ^
  • End of string
    $
  • A word boundary
    \b
  • Non-word boundary
    \B

Regular Expression
No Match

r"
"
gmi

Test String

Code Generator

Generated Code

#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