# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"(?<=(?:\/\/){1}[ [ruА-Яа-яёЁ])((?:[ruА-Яа-яёЁ\s\d \,\.\:\-\"\&\d\*\;\(\)\.\,\'\=\<\>\!-\?\@^#])*?)$(?:[\b\t\s]+((?:Функция|Процедура)\s+(?:[\w\d]|[А-Яа-я])+\([\w\W]*?\)\s*(?:Экспорт)?))"
test_str = ("///////////////////////////////////////////////////////////////////////////////////////////////////////\n"
"// Copyright (c) 2023, ООО 1С-Софт\n"
"// Все права защищены. Эта программа и сопроводительные материалы предоставляются \n"
"// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)\n"
"// Текст лицензии доступен по ссылке:\n"
"// https://creativecommons.org/licenses/by/4.0/legalcode\n"
"///////////////////////////////////////////////////////////////////////////////////////////////////////\n\n"
"#Область ПрограммныйИнтерфейс\n\n"
"#Область ОповещениеПользователя\n\n"
"// Формирует и выводит сообщение, которое может быть связано с элементом управления формы.\n"
"//\n"
"// В фоновом задании длительной операции, если вызов выполнен вне транзакции,\n"
"// сообщение записывается в служебный регистр и отправляется сразу на клиент,\n"
"// если подключена система взаимодействия.\n"
"// В конце фонового задания длительной операции, а также при отправке прогресса,\n"
"// все сообщения извлекаются из очереди сообщений фонового задания,\n"
"// записываются в служебный регистр и отправляются сразу на клиент,\n"
"// если подключена система взаимодействия.\n"
"//\n"
"// АПК:142-выкл 4 необязательных параметра для совместимости \n"
"// с устаревшей процедурой ОбщегоНазначенияКлиентСервер.СообщитьПользователю.\n"
"//\n"
"// Параметры:\n"
"// ТекстСообщенияПользователю - Строка - текст сообщения.\n"
"// КлючДанных - ЛюбаяСсылка - объект или ключ записи информационной базы, к которому это сообщение относится.\n"
"// Поле - Строка - наименование реквизита формы.\n"
"// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы).\n"
"// Отказ - Булево - выходной параметр, всегда устанавливается в значение Истина.\n"
"//\n"
"// Пример:\n"
"//\n"
"// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта:\n"
"// ОбщегоНазначения.СообщитьПользователю(\n"
"// НСтр(\"ru = 'Сообщение об ошибке.'\"), ,\n"
"// \"ПолеВРеквизитеФормыОбъект\",\n"
"// \"Объект\");\n"
"//\n"
"// Альтернативный вариант использования в форме объекта:\n"
"// ОбщегоНазначения.СообщитьПользователю(\n"
"// НСтр(\"ru = 'Сообщение об ошибке.'\"), ,\n"
"// \"Объект.ПолеВРеквизитеФормыОбъект\");\n"
"//\n"
"// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы:\n"
"// ОбщегоНазначения.СообщитьПользователю(\n"
"// НСтр(\"ru = 'Сообщение об ошибке.'\"), ,\n"
"// \"ИмяРеквизитаФормы\");\n"
"//\n"
"// 3. Для вывода сообщения связанного с объектом информационной базы:\n"
"// ОбщегоНазначения.СообщитьПользователю(\n"
"// НСтр(\"ru = 'Сообщение об ошибке.'\"), ОбъектИнформационнойБазы, \"Ответственный\",,Отказ);\n"
"//\n"
"// 4. Для вывода сообщения по ссылке на объект информационной базы:\n"
"// ОбщегоНазначения.СообщитьПользователю(\n"
"// НСтр(\"ru = 'Сообщение об ошибке.'\"), Ссылка, , , Отказ);\n"
"//\n"
"// Случаи некорректного использования:\n"
"// 1. Передача одновременно параметров КлючДанных и ПутьКДанным.\n"
"// 2. Передача в параметре КлючДанных значения типа отличного от допустимого.\n"
"// 3. Установка ссылки без установки поля (и/или пути к данным).\n"
"//\n"
"Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = \"\",\n"
" Знач ПутьКДанным = \"\", Отказ = Ложь) Экспорт\n"
" \n"
" ЭтоОбъект = Ложь;\n"
" \n"
" Если КлючДанных <> Неопределено\n"
" И XMLТипЗнч(КлючДанных) <> Неопределено Тогда\n"
" \n"
" ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;\n"
" ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, \"Object.\") > 0;\n"
" КонецЕсли;\n"
" \n"
" Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(ТекстСообщенияПользователю,\n"
" КлючДанных, Поле, ПутьКДанным, Отказ, ЭтоОбъект);\n"
" \n"
"#Если НЕ МобильныйАвтономныйСервер Тогда\n"
" Если СтандартныеПодсистемыПовтИсп.ЭтоСеансДлительнойОперации()\n"
" И Не ТранзакцияАктивна() Тогда\n"
" \n"
" ДлительныеОперации.ОтправитьОповещениеКлиенту(\"СообщениеПользователю\", Сообщение);\n"
" Иначе\n"
" Сообщение.Сообщить();\n"
" КонецЕсли;\n"
"#Иначе\n"
" Сообщение.Сообщить();\n"
"#КонецЕсли\n"
" \n"
"КонецПроцедуры\n"
"// АПК:142-вкл\n\n"
"#КонецОбласти\n\n\n"
"#Если НЕ МобильныйАвтономныйСервер Тогда\n\n"
"#Область ДанныеВБазе\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Общие процедуры и функции для работы с данными в базе.\n\n"
"// Возвращает структуру, содержащую значения реквизитов, прочитанные из информационной базы по ссылке на объект.\n"
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект\n"
"// для быстрого чтения отдельных реквизитов объекта из базы данных.\n"
"//\n"
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя,\n"
"// то следует использовать предварительный переход в привилегированный режим.\n"
"//\n"
"// Параметры:\n"
"// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.\n"
"// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.\n"
"// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате\n"
"// требований к свойствам структуры.\n"
"// Например, \"Код, Наименование, Родитель\".\n"
"// - Структура\n"
"// - ФиксированнаяСтруктура - в качестве ключа передается\n"
"// псевдоним поля для возвращаемой структуры с результатом, а в качестве\n"
"// значения (опционально) фактическое имя поля в таблице.\n"
"// Если ключ задан, а значение не определено, то имя поля берется из ключа.\n"
"// Допускается указание имени поля через точку, но при этом параметр КодЯзыка для такого поля\n"
"// учитываться не будет.\n"
"// - Массив из Строка\n"
"// - ФиксированныйМассив из Строка - имена реквизитов в формате требований к свойствам структуры.\n"
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;\n"
"// если есть ограничение на уровне записей, то все реквизиты вернутся со \n"
"// значением Неопределено; если нет прав для работы с таблицей, то возникнет исключение;\n"
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу \n"
"// или любой из реквизитов.\n"
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура - содержит имена (ключи) и значения затребованных реквизитов.\n"
"// Если в параметр Реквизиты передана пустая строка, то возвращается пустая структура.\n"
"// Если в параметр Ссылка передана пустая ссылка, то возвращается структура, \n"
"// соответствующая именам реквизитов со значениями Неопределено.\n"
"// Если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), \n"
"// то все реквизиты вернутся со значением Неопределено.\n"
"//\n"
"Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт\n"
" \n"
" // Если передано имя предопределенного.\n"
" Если ТипЗнч(Ссылка) = Тип(\"Строка\") Тогда\n"
" \n"
" ПолноеИмяПредопределенногоЭлемента = Ссылка;\n"
" \n"
" // Вычисление ссылки по имени предопределенного.\n"
" // - дополнительно выполняет проверку метаданных предопределенного, выполняется предварительно.\n"
" Попытка\n"
" Ссылка = ПредопределенныйЭлемент(ПолноеИмяПредопределенногоЭлемента);\n"
" Исключение\n"
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный первый параметр %1 в функции %2:\n"
" |%3'\"), \"Ссылка\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъекта\", \n"
" ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" ВызватьИсключение ТекстОшибки;\n"
" КонецПопытки;\n"
" \n"
" // Разбор полного имени предопределенного.\n"
" ЧастиПолногоИмени = СтрРазделить(ПолноеИмяПредопределенногоЭлемента, \".\");\n"
" ПолноеИмяОбъектаМетаданных = ЧастиПолногоИмени[0] + \".\" + ЧастиПолногоИмени[1];\n"
" \n"
" // Если предопределенный не создан в ИБ, то требуется выполнить проверку доступа к объекту.\n"
" // В других сценариях проверка доступа выполняется в момент исполнения запроса.\n"
" Если Ссылка = Неопределено Тогда \n"
" МетаданныеОбъекта = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных);\n"
" Если Не ПравоДоступа(\"Чтение\", МетаданныеОбъекта) Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Недостаточно прав для работы с таблицей \"\"%1\"\"'\"), ПолноеИмяОбъектаМетаданных);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Иначе // Если передана ссылка.\n"
" \n"
" Попытка\n"
" ПолноеИмяОбъектаМетаданных = Ссылка.Метаданные().ПолноеИмя(); \n"
" Исключение\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный первый параметр %1 в функции %2: \n"
" |Значение должно быть ссылкой или именем предопределенного элемента.'\"), \n"
" \"Ссылка\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъекта\");\n"
" КонецПопытки;\n"
" \n"
" КонецЕсли;\n"
" \n"
" // Разбор реквизитов, если второй параметр Строка.\n"
" Если ТипЗнч(Реквизиты) = Тип(\"Строка\") Тогда\n"
" Если ПустаяСтрока(Реквизиты) Тогда\n"
" Возврат Новый Структура;\n"
" КонецЕсли;\n"
" \n"
" Реквизиты = СтрРазделить(Реквизиты, \",\", Ложь);\n"
" Для Индекс = 0 По Реквизиты.ВГраница() Цикл\n"
" Реквизиты[Индекс] = СокрЛП(Реквизиты[Индекс]);\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" МультиязычныеРеквизиты = Новый Соответствие;\n"
" СуффиксЯзыка = \"\";\n"
" Если ЗначениеЗаполнено(КодЯзыка) Тогда\n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.Мультиязычность\") Тогда\n"
" МодульМультиязычностьСервер = ОбщийМодуль(\"МультиязычностьСервер\");\n"
" СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка);\n"
" Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда\n"
" МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылка);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" // Приведение реквизитов к единому формату.\n"
" СтруктураПолей = Новый Структура;\n"
" Если ТипЗнч(Реквизиты) = Тип(\"Структура\")\n"
" Или ТипЗнч(Реквизиты) = Тип(\"ФиксированнаяСтруктура\") Тогда\n"
" \n"
" Для Каждого КлючИЗначение Из Реквизиты Цикл\n"
" СтруктураПолей.Вставить(КлючИЗначение.Ключ, СокрЛП(КлючИЗначение.Значение));\n"
" КонецЦикла;\n"
" \n"
" ИначеЕсли ТипЗнч(Реквизиты) = Тип(\"Массив\")\n"
" Или ТипЗнч(Реквизиты) = Тип(\"ФиксированныйМассив\") Тогда\n"
" \n"
" Для Каждого Реквизит Из Реквизиты Цикл\n"
" Реквизит = СокрЛП(Реквизит);\n"
" Попытка\n"
" ПсевдонимПоля = СтрЗаменить(Реквизит, \".\", \"\");\n"
" СтруктураПолей.Вставить(ПсевдонимПоля, Реквизит);\n"
" Исключение \n"
" // Если псевдоним не является ключом.\n"
" \n"
" // Поиск ошибки доступности полей.\n"
" Результат = ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);\n"
" Если Результат.Ошибка Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: %3'\"),\n"
" \"Реквизиты\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъекта\", Результат.ОписаниеОшибки);\n"
" КонецЕсли;\n"
" \n"
" // Не удалось распознать ошибку, проброс первичной ошибки.\n"
" ВызватьИсключение;\n"
" \n"
" КонецПопытки;\n"
" КонецЦикла;\n"
" Иначе\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный тип второго параметра %1 в функции %2: %3.'\"), \n"
" \"Реквизиты\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъекта\", Строка(ТипЗнч(Реквизиты)));\n"
" КонецЕсли;\n"
" \n"
" // Подготовка результата (после выполнения запроса переопределится).\n"
" Результат = Новый Структура;\n"
" \n"
" // Формирование текста запроса к выбираемым полям.\n"
" ТекстЗапросаПолей = \"\";\n"
" Для каждого КлючИЗначение Из СтруктураПолей Цикл\n"
" \n"
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),\n"
" КлючИЗначение.Значение,\n"
" КлючИЗначение.Ключ);\n"
" ПсевдонимПоля = КлючИЗначение.Ключ;\n"
" \n"
" Если МультиязычныеРеквизиты[ИмяПоля] <> Неопределено Тогда\n"
" ИмяПоля = ИмяПоля + СуффиксЯзыка;\n"
" КонецЕсли;\n"
" \n"
" ТекстЗапросаПолей = \n"
" ТекстЗапросаПолей + ?(ПустаяСтрока(ТекстЗапросаПолей), \"\", \",\") + \"\n"
" | \" + ИмяПоля + \" КАК \" + ПсевдонимПоля;\n"
" \n"
" // Предварительное добавление поля по псевдониму в возвращаемый результат.\n"
" Результат.Вставить(ПсевдонимПоля);\n"
" \n"
" КонецЦикла;\n"
" \n"
" // Если предопределенного нет в ИБ.\n"
" // - приведение результата к отсутствию объекта в ИБ или передаче пустой ссылки.\n"
" Если Ссылка = Неопределено Тогда \n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" Если Тип(\"Структура\") = ТипЗнч(Реквизиты)\n"
" Или Тип(\"ФиксированнаяСтруктура\") = ТипЗнч(Реквизиты) Тогда\n"
" Реквизиты = Новый Массив;\n"
" Для Каждого КлючИЗначение Из СтруктураПолей Цикл\n"
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),\n"
" КлючИЗначение.Значение,\n"
" КлючИЗначение.Ключ);\n"
" Реквизиты.Добавить(ИмяПоля);\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" РеквизитыЧерезТочку = Новый Массив;\n"
" Для Индекс = -Реквизиты.ВГраница() По 0 Цикл\n"
" ИмяПоля = Реквизиты[-Индекс];\n"
" Если СтрНайти(ИмяПоля, \".\") Тогда\n"
" РеквизитыЧерезТочку.Добавить(ИмяПоля);\n"
" Реквизиты.Удалить(-Индекс);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ЗначениеЗаполнено(Реквизиты) Тогда\n"
" ЗначенияРеквизитовОбъекта = ЗначенияРеквизитовОбъектов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Ссылка), Реквизиты, ВыбратьРазрешенные, КодЯзыка)[Ссылка];\n"
" Если ЗначенияРеквизитовОбъекта <> Неопределено Тогда\n"
" Для Каждого КлючИЗначение Из СтруктураПолей Цикл\n"
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),\n"
" КлючИЗначение.Значение,\n"
" КлючИЗначение.Ключ);\n"
" Если СтрНайти(ИмяПоля, \".\") = 0 И ЗначенияРеквизитовОбъекта.Свойство(ИмяПоля) Тогда\n"
" Результат[КлючИЗначение.Ключ] = ЗначенияРеквизитовОбъекта[ИмяПоля];\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Если Не ЗначениеЗаполнено(РеквизитыЧерезТочку) Тогда\n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" Реквизиты = РеквизитыЧерезТочку;\n"
" \n"
" ТекстЗапроса = \n"
" \"ВЫБРАТЬ РАЗРЕШЕННЫЕ\n"
" |&ТекстЗапросаПолей\n"
" |ИЗ\n"
" | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы\n"
" |ГДЕ\n"
" | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка\";\n"
" \n"
" Если Не ВыбратьРазрешенные Тогда \n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"РАЗРЕШЕННЫЕ\", \"\"); // @Query-part-1\n"
" КонецЕсли;\n"
" \n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ТекстЗапросаПолей\", ТекстЗапросаПолей);\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ПолноеИмяОбъектаМетаданных\", ПолноеИмяОбъектаМетаданных);\n"
" \n"
" // Выполнение запроса.\n"
" Запрос = Новый Запрос;\n"
" Запрос.УстановитьПараметр(\"Ссылка\", Ссылка);\n"
" Запрос.Текст = ТекстЗапроса;\n"
" \n"
" Попытка\n"
" Выборка = Запрос.Выполнить().Выбрать();\n"
" Исключение\n"
" \n"
" // Если реквизиты были переданы строкой, то они уже конвертированы в массив.\n"
" // Если реквизиты - массив, оставляем без изменений.\n"
" // Если реквизиты - структура - конвертируем в массив.\n"
" // В остальных случаях уже было бы выброшено исключение.\n"
" Если Тип(\"Структура\") = ТипЗнч(Реквизиты)\n"
" Или Тип(\"ФиксированнаяСтруктура\") = ТипЗнч(Реквизиты) Тогда\n"
" Реквизиты = Новый Массив;\n"
" Для каждого КлючИЗначение Из СтруктураПолей Цикл\n"
" ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),\n"
" КлючИЗначение.Значение,\n"
" КлючИЗначение.Ключ);\n"
" Реквизиты.Добавить(ИмяПоля);\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" // Поиск ошибки доступности полей.\n"
" Результат = ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);\n"
" Если Результат.Ошибка Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: %3'\"), \n"
" \"Реквизиты\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъекта\", Результат.ОписаниеОшибки);\n"
" КонецЕсли;\n"
" \n"
" // Не удалось распознать ошибку, проброс первичной ошибки.\n"
" ВызватьИсключение;\n"
" \n"
" КонецПопытки;\n"
" \n"
" // Заполнение реквизитов.\n"
" Если Выборка.Следующий() Тогда\n"
" ЗаполнитьЗначенияСвойств(Результат, Выборка);\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.\n"
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект\n"
"// для быстрого чтения отдельных реквизитов объекта из базы данных.\n"
"//\n"
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя,\n"
"// то следует использовать предварительный переход в привилегированный режим.\n"
"// \n"
"// Если передано имя несуществующего реквизита, то вызывается исключение \"Поле объекта не существует\". \n"
"//\n"
"// Параметры:\n"
"// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.\n"
"// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.\n"
"// ИмяРеквизита - Строка - имя получаемого реквизита.\n"
"// Допускается указание имени реквизита через точку, но при этом параметр КодЯзыка для\n"
"// такого реквизита учитываться не будет.\n"
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;\n"
"// если есть ограничение на уровне записей, то возвращается Неопределено;\n"
"// если нет прав для работы с таблицей, то возникнет исключение;\n"
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу\n"
"// или любой из реквизитов.\n"
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Произвольный - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено.\n"
"// Если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), \n"
"// то возвращается Неопределено.\n"
"//\n"
"Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт\n"
" \n"
" Если ПустаяСтрока(ИмяРеквизита) Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: \n"
" |Имя реквизита должно быть заполнено.'\"), \"ИмяРеквизита\", \"ОбщегоНазначения.ЗначениеРеквизитаОбъекта\");\n"
" КонецЕсли;\n"
" \n"
" Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные, КодЯзыка);\n"
" Возврат Результат[СтрЗаменить(ИмяРеквизита, \".\", \"\")];\n"
" \n"
"КонецФункции \n\n"
"// Возвращает значения реквизитов, прочитанные из информационной базы для нескольких объектов.\n"
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект\n"
"// для быстрого чтения отдельных реквизитов объекта из базы данных.\n"
"//\n"
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя,\n"
"// то следует использовать предварительный переход в привилегированный режим.\n"
"//\n"
"// Если передано имя несуществующего реквизита, то вызывается исключение \"Поле объекта не существует\". \n"
"//\n"
"// Параметры:\n"
"// Ссылки - Массив из ЛюбаяСсылка\n"
"// - ФиксированныйМассив из ЛюбаяСсылка - ссылки на объекты.\n"
"// Если массив пуст, то результатом будет пустое соответствие.\n"
"// Реквизиты - Строка - имена реквизитов перечисленные через запятую, в формате требований к свойствам\n"
"// структуры. Например, \"Код, Наименование, Родитель\".\n"
"// - Массив из Строка\n"
"// - ФиксированныйМассив из Строка - имена реквизитов в формате требований к свойствам структуры.\n"
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя;\n"
"// если какой-либо объект будет исключен из выборки по правам, то этот объект\n"
"// будет исключен и из результата;\n"
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу\n"
"// или любой из реквизитов.\n"
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение - список объектов и значений их реквизитов:\n"
"// * Ключ - ЛюбаяСсылка - ссылка на объект;\n"
"// * Значение - Структура:\n"
"// ** Ключ - Строка - имя реквизита;\n"
"// ** Значение - Произвольный - значение реквизита.\n"
"// \n"
"Функция ЗначенияРеквизитовОбъектов(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт\n"
" \n"
" Если ТипЗнч(Реквизиты) = Тип(\"Массив\") Или ТипЗнч(Реквизиты) = Тип(\"ФиксированныйМассив\") Тогда\n"
" Реквизиты = СтрСоединить(Реквизиты, \",\");\n"
" КонецЕсли;\n"
" \n"
" Если ПустаяСтрока(Реквизиты) Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: \n"
" |Поле объекта должно быть указано.'\"), \"Реквизиты\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъектов\");\n"
" КонецЕсли;\n"
" \n"
" Если СтрНайти(Реквизиты, \".\") <> 0 Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: \n"
" |Обращение через точку не поддерживается.'\"), \"Реквизиты\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъектов\");\n"
" КонецЕсли;\n"
" \n"
" ЗначенияРеквизитов = Новый Соответствие;\n"
" Если Ссылки.Количество() = 0 Тогда\n"
" Возврат ЗначенияРеквизитов;\n"
" КонецЕсли;\n"
" \n"
" Если ЗначениеЗаполнено(КодЯзыка) Тогда\n"
" КодЯзыка = СтрРазделить(КодЯзыка, \"_\", Истина)[0];\n"
" КонецЕсли;\n"
" \n"
" РеквизитыТекстЗапроса = Реквизиты;\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.Мультиязычность\") Тогда\n"
" МодульМультиязычностьСервер = ОбщийМодуль(\"МультиязычностьСервер\");\n"
" Если ЗначениеЗаполнено(КодЯзыка) Тогда\n"
" СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка);\n"
" Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда\n"
" МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылки[0]);\n"
" НаборРеквизитов = СтрРазделить(Реквизиты, \",\");\n"
" Для Позиция = 0 По НаборРеквизитов.ВГраница() Цикл\n"
" ИмяРеквизита = СокрЛП(НаборРеквизитов[Позиция]);\n"
" Если МультиязычныеРеквизиты[ИмяРеквизита] <> Неопределено Тогда\n"
" ИмяССуффиксом = ИмяРеквизита + СуффиксЯзыка;\n"
" НаборРеквизитов[Позиция] = ИмяССуффиксом + \" КАК \" + ИмяРеквизита;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" РеквизитыТекстЗапроса = СтрСоединить(НаборРеквизитов, \",\");\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" СсылкиПоТипам = Новый Соответствие;\n"
" Для Каждого Ссылка Из Ссылки Цикл\n"
" Тип = ТипЗнч(Ссылка);\n"
" Если СсылкиПоТипам[Тип] = Неопределено Тогда\n"
" СсылкиПоТипам[Тип] = Новый Массив;\n"
" КонецЕсли;\n"
" ЭлементПоТипу = СсылкиПоТипам[Тип]; // Массив\n"
" ЭлементПоТипу.Добавить(Ссылка);\n"
" КонецЦикла;\n"
" \n"
" ТекстыЗапросов = Новый Массив;\n"
" ПараметрыЗапроса = Новый Структура;\n"
" \n"
" ИменаОбъектовМетаданных = Новый Массив;\n"
" \n"
" Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл\n"
" Тип = СсылкиПоТипу.Ключ;\n"
" ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);\n"
" Если ОбъектМетаданных = Неопределено Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный первый параметр %1 в функции %2: \n"
" |Значения массива должны быть ссылками.'\"), \"Ссылки\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъектов\");\n"
" КонецЕсли;\n"
" \n"
" ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя();\n"
" ИменаОбъектовМетаданных.Добавить(ПолноеИмяОбъектаМетаданных);\n"
" \n"
" ТекстЗапроса =\n"
" \"ВЫБРАТЬ РАЗРЕШЕННЫЕ\n"
" | Ссылка,\n"
" | &Реквизиты\n"
" |ИЗ\n"
" | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы\n"
" |ГДЕ\n"
" | ПсевдонимЗаданнойТаблицы.Ссылка В (&Ссылки)\";\n"
" Если Не ВыбратьРазрешенные Или ТекстыЗапросов.Количество() > 0 Тогда\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"РАЗРЕШЕННЫЕ\", \"\"); // @Query-part-1\n"
" КонецЕсли;\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&Реквизиты\", РеквизитыТекстЗапроса);\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ПолноеИмяОбъектаМетаданных\", ПолноеИмяОбъектаМетаданных);\n"
" ИмяПараметра = \"Ссылки\" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, \".\", \"\");\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&Ссылки\", \"&\" + ИмяПараметра); // @Query-part-1\n"
" ПараметрыЗапроса.Вставить(ИмяПараметра, СсылкиПоТипу.Значение);\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.Мультиязычность\") Тогда\n"
" МодульМультиязычностьСервер = ОбщийМодуль(\"МультиязычностьСервер\");\n"
" \n"
" Если ЗначениеЗаполнено(КодЯзыка) И КодЯзыка <> КодОсновногоЯзыка()\n"
" И МодульМультиязычностьСервер.ОбъектСодержитТЧПредставления(ПолноеИмяОбъектаМетаданных) Тогда\n"
" \n"
" МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданных);\n"
" ПоляТаблиц = Новый Массив;\n"
" ПоляТаблиц.Добавить(\"ПсевдонимЗаданнойТаблицы.Ссылка\");\n"
" Для Каждого Реквизит Из СтрРазделить(Реквизиты, \",\") Цикл\n"
" Если МультиязычныеРеквизиты[Реквизит] <> Неопределено Тогда\n"
" \n"
" Если МультиязычныеРеквизиты[Реквизит] = Истина Тогда\n"
" ПолеРеквизита = \"ЕСТЬNULL(ТаблицаПредставления.\" + Реквизит + \", \"\"\"\")\";\n"
" Иначе\n"
" СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка);\n"
" ПолеРеквизита = ?(ЗначениеЗаполнено(СуффиксЯзыка), Реквизит + СуффиксЯзыка, Реквизит);\n"
" КонецЕсли;\n"
" \n"
" ПоляТаблиц.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\"%1 КАК %2\",\n"
" ПолеРеквизита, Реквизит));\n"
" Иначе\n"
" ПоляТаблиц.Добавить(Реквизит);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" ПоляТаблиц = СтрСоединить(ПоляТаблиц, \",\" + Символы.ПС);\n"
" \n"
" Таблицы = ПолноеИмяОбъектаМетаданных + \" \" + \"КАК ПсевдонимЗаданнойТаблицы\" + Символы.ПС\n"
" + \"ЛЕВОЕ СОЕДИНЕНИЕ\" + \" \" + ПолноеИмяОбъектаМетаданных + \".Представления КАК ТаблицаПредставления\" + Символы.ПС\n"
" + \"ПО ТаблицаПредставления.Ссылка = ПсевдонимЗаданнойТаблицы.Ссылка И ТаблицаПредставления.КодЯзыка = &КодЯзыка\";\n"
" \n"
" ИмяПараметра = \"Ссылки\" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, \".\", \"\");\n"
" Условия = \"ПсевдонимЗаданнойТаблицы.Ссылка В (&\" + ИмяПараметра + \")\";\n"
" \n"
" СтрокиЗапроса = Новый Массив;\n"
" СтрокиЗапроса.Добавить(\"ВЫБРАТЬ\" + ?(ВыбратьРазрешенные И Не ЗначениеЗаполнено(ТекстыЗапросов), \" \" + \"РАЗРЕШЕННЫЕ\", \"\")); // @Query-part-1, @Query-part-3\n"
" СтрокиЗапроса.Добавить(ПоляТаблиц);\n"
" СтрокиЗапроса.Добавить(\"ИЗ\"); // @Query-part-1\n"
" СтрокиЗапроса.Добавить(Таблицы);\n"
" СтрокиЗапроса.Добавить(\"ГДЕ\"); // @Query-part-1\n"
" СтрокиЗапроса.Добавить(Условия);\n"
" \n"
" ТекстЗапроса = СтрСоединить(СтрокиЗапроса, Символы.ПС);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ТекстыЗапросов.Добавить(ТекстЗапроса);\n"
" КонецЦикла;\n"
" \n"
" ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + \"ОБЪЕДИНИТЬ ВСЕ\" + Символы.ПС);\n"
" \n"
" Запрос = Новый Запрос(ТекстЗапроса);\n"
" Запрос.УстановитьПараметр(\"КодЯзыка\", КодЯзыка);\n"
" Для Каждого Параметр Из ПараметрыЗапроса Цикл\n"
" Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);\n"
" КонецЦикла;\n"
" \n"
" Попытка\n"
" Выборка = Запрос.Выполнить().Выбрать();\n"
" Исключение\n"
" \n"
" // Удаление пробелов.\n"
" Реквизиты = СтрЗаменить(Реквизиты, \" \", \"\");\n"
" // Преобразование параметра в массив полей.\n"
" Реквизиты = СтрРазделить(Реквизиты, \",\");\n"
" \n"
" // Поиск ошибки доступности полей.\n"
" СписокОшибок = Новый Массив;\n"
" Для Каждого ПолноеИмяОбъектаМетаданных Из ИменаОбъектовМетаданных Цикл\n"
" Результат = ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);\n"
" Если Результат.Ошибка Тогда \n"
" СписокОшибок.Добавить(Результат.ОписаниеОшибки);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ЗначениеЗаполнено(СписокОшибок) Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: %3'\"), \n"
" \"Реквизиты\", \"ОбщегоНазначения.ЗначенияРеквизитовОбъектов\", СтрСоединить(СписокОшибок, Символы.ПС));\n"
" КонецЕсли;\n"
" \n"
" // Не удалось распознать ошибку, проброс первичной ошибки.\n"
" ВызватьИсключение;\n"
" \n"
" КонецПопытки;\n"
" \n"
" Пока Выборка.Следующий() Цикл\n"
" Результат = Новый Структура(Реквизиты);\n"
" ЗаполнитьЗначенияСвойств(Результат, Выборка);\n"
" ЗначенияРеквизитов[Выборка.Ссылка] = Результат;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат ЗначенияРеквизитов;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает значения реквизита, прочитанного из информационной базы для нескольких объектов.\n"
"// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект\n"
"// для быстрого чтения отдельных реквизитов объекта из базы данных.\n"
"//\n"
"// Если необходимо зачитать реквизит независимо от прав текущего пользователя,\n"
"// то следует использовать предварительный переход в привилегированный режим.\n"
"// \n"
"// Если передано имя несуществующего реквизита, то вызывается исключение \"Поле объекта не существует\". \n"
"//\n"
"// Параметры:\n"
"// МассивСсылок - Массив из ЛюбаяСсылка\n"
"// - ФиксированныйМассив из ЛюбаяСсылка\n"
"// ИмяРеквизита - Строка - например, \"Код\".\n"
"// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя;\n"
"// если какой-либо объект будет исключен из выборки по правам, то этот объект\n"
"// будет исключен и из результата;\n"
"// если Ложь, то возникнет исключение при отсутствии прав на таблицу\n"
"// или любой из реквизитов.\n"
"// КодЯзыка - Строка - код языка для мультиязычного реквизита. Значение по умолчанию - основной язык конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - ЛюбаяСсылка - ссылка на объект,\n"
"// * Значение - Произвольный - значение прочитанного реквизита.\n"
"// \n"
"Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт\n"
" \n"
" Если ПустаяСтрока(ИмяРеквизита) Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неверный второй параметр %1 в функции %2: \n"
" |Имя реквизита должно быть заполнено.'\"), \"ИмяРеквизита\", \"ОбщегоНазначения.ЗначениеРеквизитаОбъектов\");\n"
" КонецЕсли;\n"
" \n"
" ЗначенияРеквизитов = ЗначенияРеквизитовОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные, КодЯзыка);\n"
" Для каждого Элемент Из ЗначенияРеквизитов Цикл\n"
" ЗначенияРеквизитов[Элемент.Ключ] = Элемент.Значение[ИмяРеквизита];\n"
" КонецЦикла;\n"
" \n"
" Возврат ЗначенияРеквизитов;\n"
" \n"
"КонецФункции\n\n"
"// Добавляет или изменяет значение реквизита в объекте.\n"
"//\n"
"// Если передано имя несуществующего реквизита, то вызывается исключение. \n"
"//\n"
"// Параметры:\n"
"// Объект - СправочникОбъект\n"
"// - ДокументОбъект\n"
"// - ПланВидовХарактеристикОбъект\n"
"// - РегистрСведенийЗапись - заполняемый объект.\n"
"// ИмяРеквизита - Строка - имя заполняемого реквизита. Например, \"Комментарий\"\n"
"// Значение - Строка - значение помещаемое в реквизит.\n"
"// КодЯзыка - Строка - код языка реквизита. Например, \"ru\".\n"
"//\n"
"Процедура УстановитьЗначениеРеквизита(Объект, ИмяРеквизита, Значение, КодЯзыка = Неопределено) Экспорт\n"
" УстановитьЗначенияРеквизитов(Объект, Новый Структура(ИмяРеквизита, Значение), КодЯзыка);\n"
"КонецПроцедуры\n\n"
"// Добавляет или изменяет значения реквизитов в объекте.\n"
"//\n"
"// Если передано имя несуществующего реквизита, то вызывается исключение. \n"
"//\n"
"// Параметры:\n"
"// Объект - СправочникОбъект\n"
"// - ДокументОбъект\n"
"// - ПланВидовХарактеристикОбъект\n"
"// - РегистрСведенийЗапись - заполняемый объект.\n"
"// Значения - Структура - где ключ это имя реквизита, а значение содержит строку помещаемую в реквизит.\n"
"// КодЯзыка - Строка - код языка реквизита. Например, \"ru\".\n"
"//\n"
"Процедура УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка = Неопределено) Экспорт\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.Мультиязычность\") Тогда\n"
" МодульМультиязычностьСервер = ОбщийМодуль(\"МультиязычностьСервер\");\n"
" МодульМультиязычностьСервер.УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка);\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого ЗначениеРеквизита Из Значения Цикл\n"
" Значение = ЗначениеРеквизита.Значение;\n"
" Если ТипЗнч(Значение) = Тип(\"Строка\") И СтрокаВВидеНСтр(Значение) Тогда\n"
" Значение = НСтр(ЗначениеРеквизита.Значение);\n"
" КонецЕсли;\n"
" Объект[ЗначениеРеквизита.Ключ] = Значение;\n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращает код основного языка информационной базы, например \"ru\".\n"
"// На котором программно записываются автогенерируемые строки в информационную базу.\n"
"// Например, при начальном заполнении информационной базы данными из макета, автогенерации комментария\n"
"// к проводке или определении значения параметра ИмяСобытия метода ЗаписьЖурналаРегистрации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка\n"
"//\n"
"Функция КодОсновногоЯзыка() Экспорт\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.Мультиязычность\") Тогда\n"
" МодульМультиязычностьСервер = ОбщийМодуль(\"МультиязычностьСервер\");\n"
" Возврат МодульМультиязычностьСервер.КодОсновногоЯзыка();\n"
" КонецЕсли;\n"
" \n"
" Возврат Метаданные.ОсновнойЯзык.КодЯзыка;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает признак того, что для пользователя установлен язык интерфейса\n"
"// соответствующий основному языку информационной базы.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево\n"
"//\n"
"Функция ЭтоОсновнойЯзык() Экспорт\n"
" \n"
" Возврат СтрСравнить(КодОсновногоЯзыка(), ТекущийЯзык().КодЯзыка) = 0;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает ссылку предопределенного элемента по его полному имени.\n"
"// Предопределенные элементы могут содержаться только в следующих объектах:\n"
"// - справочники;\n"
"// - планы видов характеристик;\n"
"// - планы счетов;\n"
"// - планы видов расчета.\n"
"// После изменения состава предопределенных следует выполнить метод\n"
"// ОбновитьПовторноИспользуемыеЗначения(), который сбросит кэш ПовтИсп в текущем сеансе.\n"
"//\n"
"// Параметры:\n"
"// ПолноеИмяПредопределенного - Строка - полный путь к предопределенному элементу, включая его имя.\n"
"// Формат аналогичен функции глобального контекста ПредопределенноеЗначение().\n"
"// Например:\n"
"// \"Справочник.ВидыКонтактнойИнформации.EmailПользователя\"\n"
"// \"ПланСчетов.Хозрасчетный.Материалы\"\n"
"// \"ПланВидовРасчета.Начисления.ОплатаПоОкладу\".\n"
"//\n"
"// Возвращаемое значение: \n"
"// ЛюбаяСсылка - ссылка на предопределенный элемент.\n"
"// Неопределено - если предопределенный элемент есть в метаданных, но не создан в ИБ.\n"
"//\n"
"Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт\n"
" \n"
" СтандартнаяОбработка = ОбщегоНазначенияСлужебныйКлиентСервер.ИспользоватьСтандартнуюФункциюПолученияПредопределенного(\n"
" ПолноеИмяПредопределенного);\n"
" \n"
" Если СтандартнаяОбработка Тогда \n"
" Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного);\n"
" КонецЕсли;\n"
" \n"
" ПоляПредопределенного = ОбщегоНазначенияСлужебныйКлиентСервер.ИмяПредопределенногоПоПолям(ПолноеИмяПредопределенного);\n"
" \n"
" ПредопределенныеЗначения = СтандартныеПодсистемыПовтИсп.СсылкиПоИменамПредопределенных(\n"
" ПоляПредопределенного.ПолноеИмяОбъектаМетаданных);\n"
" \n"
" Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредопределенныйЭлемент(\n"
" ПолноеИмяПредопределенного, ПоляПредопределенного, ПредопределенныеЗначения);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает информацию о том, являются ли переданные элементы предопределенными.\n"
"// Если нет прав доступа на уровне записей, то элемент не включается в результат.\n"
"// Если нет прав доступа к таблице, то вызывается исключение.\n"
"// \n"
"// Параметры:\n"
"// Элементы - Массив из ЛюбаяСсылка\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение - список объектов и значений их реквизитов:\n"
"// * Ключ - ЛюбаяСсылка - ссылка на объект.\n"
"// * Значение - Булево - Истина, если это ссылка на предопределенный элемент.\n"
"//\n"
"Функция ЭтоПредопределенныеЭлементы(Знач Элементы) Экспорт\n"
" \n"
" ИменаРеквизитов = Новый Массив;\n"
" Для каждого ИмяРеквизита Из СтандартныеПодсистемыСервер.РеквизитыПредопределенныхДанных() Цикл\n"
" ИменаРеквизитов.Добавить(ИмяРеквизита.Ключ);\n"
" КонецЦикла;\n"
" \n"
" ЗначенияРеквизитов = СтандартныеПодсистемыСервер.ЗначенияРеквизитовОбъектовЕслиСуществуют(Элементы, ИменаРеквизитов);\n"
" Результат = Новый Соответствие;\n"
" Для каждого Элемент Из ЗначенияРеквизитов Цикл\n"
" ЭтоПредопределенныйЭлемент = Ложь;\n"
" Для каждого Значение Из Элемент.Значение Цикл\n"
" Если ЗначениеЗаполнено(Значение.Значение) Тогда\n"
" ЭтоПредопределенныйЭлемент = Истина;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Результат[Элемент.Ключ] = ЭтоПредопределенныйЭлемент;\n"
" КонецЦикла;\n"
" Возврат Результат; \n"
" \n"
"КонецФункции\n\n"
"// Проверяет статус проведения переданных документов и возвращает\n"
"// те из них, которые не проведены.\n"
"//\n"
"// Параметры:\n"
"// Документы - Массив из ДокументСсылка - документы, статус проведения которых необходимо проверить.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Массив из ДокументСсылка - непроведенные документы.\n"
"//\n"
"Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт\n"
" \n"
" Результат = Новый Массив;\n"
" \n"
" ШаблонЗапроса = \n"
" \"ВЫБРАТЬ\n"
" | ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка\n"
" |ИЗ\n"
" | &ИмяДокумента КАК ПсевдонимЗаданнойТаблицы\n"
" |ГДЕ\n"
" | ПсевдонимЗаданнойТаблицы.Ссылка В(&МассивДокументов)\n"
" | И НЕ ПсевдонимЗаданнойТаблицы.Проведен\";\n"
" \n"
" ТекстОбъединитьВсе =\n"
" \"\n"
" |\n"
" |ОБЪЕДИНИТЬ ВСЕ\n"
" |\n"
" |\";\n"
" \n"
" ИменаДокументов = Новый Массив;\n"
" Для Каждого Документ Из Документы Цикл\n"
" МетаданныеДокумента = Документ.Метаданные();\n"
" Если ИменаДокументов.Найти(МетаданныеДокумента.ПолноеИмя()) = Неопределено\n"
" И Метаданные.Документы.Содержит(МетаданныеДокумента)\n"
" И МетаданныеДокумента.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда\n"
" ИменаДокументов.Добавить(МетаданныеДокумента.ПолноеИмя());\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" ТекстЗапроса = \"\";\n"
" Для Каждого ИмяДокумента Из ИменаДокументов Цикл\n"
" Если Не ПустаяСтрока(ТекстЗапроса) Тогда\n"
" ТекстЗапроса = ТекстЗапроса + ТекстОбъединитьВсе;\n"
" КонецЕсли;\n"
" ТекстПодзапроса = СтрЗаменить(ШаблонЗапроса, \"&ИмяДокумента\", ИмяДокумента);\n"
" ТекстЗапроса = ТекстЗапроса + ТекстПодзапроса;\n"
" КонецЦикла;\n"
" \n"
" Запрос = Новый Запрос;\n"
" Запрос.Текст = ТекстЗапроса;\n"
" Запрос.УстановитьПараметр(\"МассивДокументов\", Документы);\n"
" \n"
" Если Не ПустаяСтрока(ТекстЗапроса) Тогда\n"
" Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(\"Ссылка\");\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Выполняет попытку проведения документов.\n"
"//\n"
"// Параметры:\n"
"// Документы - Массив из ДокументСсылка - документы, которые необходимо провести.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Массив из Структура:\n"
"// * Ссылка - ДокументСсылка - документ, который не удалось провести,\n"
"// * ОписаниеОшибки - Строка - текст описания ошибки при проведении.\n"
"//\n"
"Функция ПровестиДокументы(Документы) Экспорт\n"
" \n"
" НепроведенныеДокументы = Новый Массив;\n"
" \n"
" Для Каждого ДокументСсылка Из Документы Цикл\n"
" \n"
" ВыполненоУспешно = Ложь;\n"
" ДокументОбъект = ДокументСсылка.ПолучитьОбъект();\n"
" Если ДокументОбъект.ПроверитьЗаполнение() Тогда\n"
" РежимПроведения = РежимПроведенияДокумента.Неоперативный;\n"
" Если ДокументОбъект.Дата >= НачалоДня(ТекущаяДатаСеанса())\n"
" И ДокументСсылка.Метаданные().ОперативноеПроведение = Метаданные.СвойстваОбъектов.ОперативноеПроведение.Разрешить Тогда\n"
" РежимПроведения = РежимПроведенияДокумента.Оперативный;\n"
" КонецЕсли;\n"
" Попытка\n"
" ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведения);\n"
" ВыполненоУспешно = Истина;\n"
" Исключение\n"
" ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());\n"
" КонецПопытки;\n"
" Иначе\n"
" ПредставлениеОшибки = НСтр(\"ru = 'Поля документа не заполнены.'\");\n"
" КонецЕсли;\n"
" \n"
" Если Не ВыполненоУспешно Тогда\n"
" НепроведенныеДокументы.Добавить(Новый Структура(\"Ссылка,ОписаниеОшибки\", ДокументСсылка, ПредставлениеОшибки));\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат НепроведенныеДокументы;\n"
" \n"
"КонецФункции \n\n"
"// Проверяет наличие ссылок на объект в базе данных.\n"
"// При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях.\n"
"//\n"
"// Параметры:\n"
"// СсылкаИлиМассивСсылок - ЛюбаяСсылка\n"
"// - Массив из ЛюбаяСсылка - объект или список объектов.\n"
"// ИскатьСредиСлужебныхОбъектов - Булево - если Истина, то не будут учитываться\n"
"// исключения поиска ссылок, заданные при разработке конфигурации.\n"
"// Про исключение поиска ссылок см. подробнее\n"
"// ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если есть ссылки на объект.\n"
"//\n"
"Функция ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь) Экспорт\n"
" \n"
" Если ТипЗнч(СсылкаИлиМассивСсылок) = Тип(\"Массив\") Тогда\n"
" МассивСсылок = СсылкаИлиМассивСсылок;\n"
" Иначе\n"
" МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаИлиМассивСсылок);\n"
" КонецЕсли;\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" МестаИспользования = НайтиПоСсылкам(МассивСсылок);\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" \n"
" Если Не ИскатьСредиСлужебныхОбъектов Тогда\n"
" Для каждого Элемент Из СлужебныеСвязиДанных(МестаИспользования) Цикл\n"
" МестаИспользования.Удалить(Элемент.Ключ);\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" Возврат МестаИспользования.Количество() > 0;\n"
" \n"
"КонецФункции\n\n\n"
"// Определяет, указаны ли места использования в исключениях поиска ссылок.\n"
"//\n"
"// Параметры:\n"
"// МестаИспользования - ТаблицаЗначений - результат функции НайтиПоСсылкам:\n"
"// * Ссылка - ЛюбаяСсылка - проверяемая ссылка.\n"
"// * Данные - ЛюбаяСсылка - место использования.\n"
"// * Метаданные - ОбъектМетаданных - метаданные места использования.\n"
"// ИсключенияПоискаСсылок - см. ИсключенияПоискаСсылок\n"
"// \n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - СтрокаТаблицыЗначений\n"
"// * Значение - Булево - всегда Истина. Если это не служебная связь данных, то в соответствии нет элемента.\n"
"//\n"
"Функция СлужебныеСвязиДанных(Знач МестаИспользования, Знач ИсключенияПоискаСсылок = Неопределено) Экспорт\n"
" \n"
" Если ИсключенияПоискаСсылок = Неопределено Тогда\n"
" ИсключенияПоискаСсылок = ИсключенияПоискаСсылок();\n"
" КонецЕсли;\n\n"
" Результат = Новый Соответствие;\n"
" МестоИспользованияПоМетаданным = Новый Соответствие;\n"
" \n"
" Для каждого МестоИспользования Из МестаИспользования Цикл\n"
" ИсключениеПоиска = ИсключенияПоискаСсылок[МестоИспользования.Метаданные];\n"
" \n"
" // Данные могут быть как ссылкой, так и ключом записи регистра.\n"
" Если ИсключениеПоиска = Неопределено Тогда\n"
" Если МестоИспользования.Ссылка = МестоИспользования.Данные Тогда\n"
" Результат[МестоИспользования] = Истина; // Ссылку саму на себя исключаем.\n"
" КонецЕсли;\n"
" Продолжить;\n"
" ИначеЕсли ИсключениеПоиска = \"*\" Тогда\n"
" Результат[МестоИспользования] = Истина; // Если указано исключить все - считаем все исключением.\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" ЭтоСсылка = ЭтоСсылка(ТипЗнч(МестоИспользования.Данные));\n"
" Если Не ЭтоСсылка Тогда \n"
" Для Каждого ПутьКРеквизиту Из ИсключениеПоиска Цикл\n"
" ЗначениеРеквизита = Новый Структура(ПутьКРеквизиту);\n"
" ЗаполнитьЗначенияСвойств(ЗначениеРеквизита, МестоИспользования.Данные);\n"
" Если ЗначениеРеквизита[ПутьКРеквизиту] = МестоИспользования.Ссылка Тогда \n"
" Результат[МестоИспользования] = Истина;\n"
" Прервать;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Продолжить;\n"
" КонецЕсли;\n\n"
" Если ИсключениеПоиска.Количество() = 0 Тогда\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" ИмяТаблицы = МестоИспользования.Метаданные.ПолноеИмя();\n"
" Значение = МестоИспользованияПоМетаданным[ИмяТаблицы];\n"
" Если Значение = Неопределено Тогда\n"
" Значение = Новый ТаблицаЗначений;\n"
" Значение.Колонки.Добавить(\"Ссылка\", ОписаниеТипаВсеСсылки());\n"
" Значение.Колонки.Добавить(\"Данные\", ОписаниеТипаВсеСсылки());\n"
" Значение.Колонки.Добавить(\"Метаданные\");\n"
" МестоИспользованияПоМетаданным[ИмяТаблицы] = Значение;\n"
" КонецЕсли;\n"
" ЗаполнитьЗначенияСвойств(Значение.Добавить(), МестоИспользования);\n\n"
" КонецЦикла;\n"
" \n"
" Индекс = 1;\n"
" Запрос = Новый Запрос;\n"
" ТекстыЗапроса = Новый Массив;\n"
" ВременныеТаблицы = Новый Массив;\n"
" \n"
" Для каждого МестоИспользования Из МестоИспользованияПоМетаданным Цикл\n"
" \n"
" ИмяТаблицы = МестоИспользования.Ключ; // Строка\n"
" МестоИспользования = МестоИспользования.Значение; // ТаблицаЗначений\n\n"
" // Проверка, есть ли по исключаемому пути в указанных данных проверяемая ссылка.\n"
" Если МестоИспользования.Количество() > 1 Тогда\n"
" ШаблонЗапроса = \n"
" \"ВЫБРАТЬ\n"
" | Ссылки.Данные КАК Ссылка,\n"
" | Ссылки.Ссылка КАК ПроверяемаяСсылка\n"
" |ПОМЕСТИТЬ ВТТаблицаСсылок\n"
" |ИЗ\n"
" | &Ссылки КАК Ссылки\n"
" |;\n"
" |\n"
" |ВЫБРАТЬ\n"
" | ТаблицаСсылок.Ссылка КАК Ссылка,\n"
" | ТаблицаСсылок.ПроверяемаяСсылка КАК ПроверяемаяСсылка\n"
" |ИЗ\n"
" | ВТТаблицаСсылок КАК ТаблицаСсылок\n"
" | ЛЕВОЕ СОЕДИНЕНИЕ #ПолноеИмяОбъектаМетаданных КАК Таблица\n"
" | ПО ТаблицаСсылок.Ссылка = Таблица.Ссылка\n"
" |ГДЕ\n"
" | &Условие\";\n\n"
" ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, \"#ПолноеИмяОбъектаМетаданных\", ИмяТаблицы);\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"ВТТаблицаСсылок\", \"ВТТаблицаСсылок\" + Формат(Индекс, \"ЧГ=;ЧН=\"));\n\n"
" ИмяПараметра = \"Ссылки\" + Формат(Индекс, \"ЧГ=;ЧН=\");\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&Ссылки\", \"&\" + ИмяПараметра);\n"
" Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования);\n"
" \n"
" ЧастиЗапроса = СтрРазделить(ТекстЗапроса, \";\");\n"
" ВременныеТаблицы.Добавить(ЧастиЗапроса[0]);\n"
" ТекстЗапроса = ЧастиЗапроса[1];\n\n"
" Иначе\n"
" ШаблонЗапроса = \n"
" \"ВЫБРАТЬ\n"
" | &СсылкаНаВладельца КАК Ссылка,\n"
" | &ПроверяемаяСсылка КАК ПроверяемаяСсылка\n"
" |ИЗ\n"
" | #ПолноеИмяОбъектаМетаданных КАК Таблица\n"
" |ГДЕ\n"
" | Таблица.Ссылка = &СсылкаНаВладельца\n"
" | И (&Условие)\";\n\n"
" ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, \"#ПолноеИмяОбъектаМетаданных\", ИмяТаблицы);\n\n"
" ИмяПараметра = \"СсылкаНаВладельца\" + Формат(Индекс, \"ЧГ=;ЧН=\");\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&СсылкаНаВладельца\", \"&\" + ИмяПараметра);\n"
" Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования[0].Данные);\n\n"
" ИмяПараметра = \"ПроверяемаяСсылка\" + Формат(Индекс, \"ЧГ=;ЧН=\");\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ПроверяемаяСсылка\", \"&\" + ИмяПараметра);\n"
" Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования[0].Ссылка);\n\n"
" КонецЕсли;\n\n"
" ТекстУсловия = Новый Массив;\n"
" // Относительный путь к реквизиту: \"<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]\".\n"
" Для Каждого ПутьКРеквизиту Из ИсключенияПоискаСсылок[МестоИспользования[0].Метаданные] Цикл\n"
" ТекстУсловия.Добавить(ПутьКРеквизиту + \" = \" \n"
" + ?(МестоИспользования.Количество() > 1, \"ТаблицаСсылок.ПроверяемаяСсылка\", \"&\" + ИмяПараметра));\n"
" КонецЦикла;\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&Условие\", СтрСоединить(ТекстУсловия, \" ИЛИ \"));\n"
" \n"
" ТекстыЗапроса.Добавить(ТекстЗапроса);\n"
" Индекс = Индекс + 1;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Если ТекстыЗапроса.Количество() = 0 Тогда\n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" Запрос.Текст = СтрСоединить(ВременныеТаблицы, \";\" + Символы.ПС)\n"
" + ?(ВременныеТаблицы.Количество() > 0, \";\" + Символы.ПС, \"\") \n"
" + СтрСоединить(ТекстыЗапроса, Символы.ПС + \"ОБЪЕДИНИТЬ\" + Символы.ПС);\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" ВыборкаЗапроса = Запрос.Выполнить().Выбрать();\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" \n"
" МестаИспользования.Индексы.Добавить(\"Ссылка,Данные\");\n"
" Пока ВыборкаЗапроса.Следующий() Цикл\n"
" СлужебныеСвязиДанных = МестаИспользования.НайтиСтроки(Новый Структура(\"Ссылка,Данные\", \n"
" ВыборкаЗапроса.ПроверяемаяСсылка, ВыборкаЗапроса.Ссылка));\n"
" Для каждого СлужебнаяСвязьДанных Из СлужебныеСвязиДанных Цикл\n"
" Результат[СлужебнаяСвязьДанных] = Истина;\n"
" КонецЦикла;\n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Определяет, указано ли место использования в исключениях поиска ссылок.\n"
"//\n"
"// Параметры:\n"
"// МестоИспользования - Структура:\n"
"// * Ссылка - ЛюбаяСсылка - проверяемая ссылка.\n"
"// * Данные - ЛюбаяСсылка - место использования.\n"
"// * Метаданные - ОбъектМетаданных - метаданные места использования.\n"
"// ИсключенияПоискаСсылок - см. ИсключенияПоискаСсылок\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево\n"
"//\n"
"Функция ЭтоСлужебнаяСвязьДанных(Знач МестоИспользования, Знач ИсключенияПоискаСсылок = Неопределено) Экспорт\n"
" \n"
" Если ИсключенияПоискаСсылок = Неопределено Тогда\n"
" ИсключенияПоискаСсылок = ИсключенияПоискаСсылок();\n"
" КонецЕсли;\n\n"
" Значение = Новый ТаблицаЗначений;\n"
" Значение.Колонки.Добавить(\"Ссылка\", ОписаниеТипаВсеСсылки());\n"
" Значение.Колонки.Добавить(\"Данные\", ОписаниеТипаВсеСсылки());\n"
" Значение.Колонки.Добавить(\"Метаданные\");\n"
" МестоИспользованияСтрока = Значение.Добавить();\n"
" ЗаполнитьЗначенияСвойств(МестоИспользованияСтрока, МестоИспользования);\n"
" \n"
" Результат = СлужебныеСвязиДанных(Значение, ИсключенияПоискаСсылок);\n"
" Возврат Результат[МестоИспользованияСтрока] <> Неопределено;\n\n"
"КонецФункции\n\n"
"// Производит замену ссылок во всех данных. После замены неиспользуемые ссылки опционально удаляются.\n"
"// Замена ссылок происходит с транзакциями по изменяемому объекту и его связям, не по анализируемой ссылке.\n"
"// При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях.\n"
"// Если описаны связи подчиненных и основных объектов (см. СвязиПодчиненныхОбъектов), то:\n"
"// * при замене основных объектов будет выполнен поиск замен подчиненных объектов;\n"
"// * если ВыполнятьАвтоматическийПоискЗамен = Истина, то будет выполнена попытка поиска замен для подчиненных объектов \n"
"// по значениям полей связи. В случае, если объект не существует, будет выполнена процедура ПриПоискеЗаменыСсылок; \n"
"// * если МетодПоиска в описании связей задан, то если автоматический поиск не нашел замен\n"
"// или не выполнялся, будет вызван МетодПоиска для подбора замен.\n"
"//\n"
"// Параметры:\n"
"// ПарыЗамен - Соответствие из КлючИЗначение:\n"
"// * Ключ - ЛюбаяСсылка - что ищем (дубль).\n"
"// * Значение - ЛюбаяСсылка - на что заменяем (оригинал).\n"
"// Ссылки сами на себя и пустые ссылки для поиска будут проигнорированы.\n"
"// \n"
"// ПараметрыЗамены - см. ОбщегоНазначения.ПараметрыЗаменыСсылок\n"
"//\n"
"// Возвращаемое значение:\n"
"// ТаблицаЗначений - неуспешные замены (ошибки):\n"
"// * Ссылка - ЛюбаяСсылка - ссылка, которую заменяли.\n"
"// * ОбъектОшибки - Произвольный - объект-причина ошибки.\n"
"// * ПредставлениеОбъектаОшибки - Строка - строковое представление объекта ошибки.\n"
"// * ТипОшибки - Строка - тип ошибки:\n"
"// \"ОшибкаБлокировки\" - при обработке ссылки некоторые объекты были заблокированы.\n"
"// \"ДанныеИзменены\" - в процессе обработки данные были изменены другим пользователем.\n"
"// \"ОшибкаЗаписи\" - не смогли записать объект, или метод ВозможностьЗаменыЭлементов вернул отказ.\n"
"// \"ОшибкаУдаления\" - не смогли удалить объект.\n"
"// \"НеизвестныеДанные\" - при обработке были найдены данные, которые не планировались к замене.\n"
"// * ТекстОшибки - Строка - подробное описание ошибки.\n"
"//\n"
"Функция ЗаменитьСсылки(Знач ПарыЗамен, Знач ПараметрыЗамены = Неопределено) Экспорт\n"
" \n"
" Статистика = Новый Соответствие;\n"
" ТипСтрока = Новый ОписаниеТипов(\"Строка\");\n"
" \n"
" ОшибкиЗамены = Новый ТаблицаЗначений;\n"
" ОшибкиЗамены.Колонки.Добавить(\"Ссылка\");\n"
" ОшибкиЗамены.Колонки.Добавить(\"ОбъектОшибки\");\n"
" ОшибкиЗамены.Колонки.Добавить(\"ПредставлениеОбъектаОшибки\", ТипСтрока);\n"
" ОшибкиЗамены.Колонки.Добавить(\"ТипОшибки\", ТипСтрока);\n"
" ОшибкиЗамены.Колонки.Добавить(\"ТекстОшибки\", ТипСтрока);\n"
" \n"
" ОшибкиЗамены.Индексы.Добавить(\"Ссылка\");\n"
" ОшибкиЗамены.Индексы.Добавить(\"Ссылка, ОбъектОшибки, ТипОшибки\");\n"
" \n"
" Результат = РезультатЗаменыСсылок(ОшибкиЗамены);\n"
" \n"
" ПараметрыВыполнения = НовыйПараметрыВыполненияЗаменыСсылок(ПараметрыЗамены);\n"
" \n"
" ПараметрыПоискаМестИспользования = ПараметрыПоискаМестИспользования();\n"
" ДополнитьИсключенияПоискаСсылокПодчиненнымиОбъектами(ПараметрыПоискаМестИспользования.ДополнительныеИсключенияПоискаСсылок);\n"
" ПараметрыВыполнения.Вставить(\"ПараметрыПоискаМестИспользования\", ПараметрыПоискаМестИспользования);\n"
" \n"
" ИнтеграцияПодсистемБСП.ПередПоискомМестИспользования(ПарыЗамен, ПараметрыВыполнения);\n"
" \n"
" Если ПарыЗамен.Количество() = 0 Тогда\n"
" Возврат Результат.Ошибки;\n"
" КонецЕсли;\n"
" \n"
" Дубли = СформироватьДубли(ПараметрыВыполнения, ПараметрыЗамены, ПарыЗамен, Результат); \n"
" ТаблицаПоиска = МестаИспользования(Дубли,, ПараметрыВыполнения.ПараметрыПоискаМестИспользования);\n"
" \n"
" // Для каждой ссылки объекта будем производить замены в порядке \"Константа\", \"Объект\", \"Набор\".\n"
" // Одновременно пустая строка в этой колонке - флаг того, что эта замена не нужна или уже была произведена.\n"
" ТаблицаПоиска.Колонки.Добавить(\"КлючЗамены\", ТипСтрока);\n"
" ТаблицаПоиска.Индексы.Добавить(\"Ссылка, КлючЗамены\");\n"
" ТаблицаПоиска.Индексы.Добавить(\"Данные, КлючЗамены\");\n"
" \n"
" // Вспомогательные данные\n"
" ТаблицаПоиска.Колонки.Добавить(\"ЦелеваяСсылка\");\n"
" ТаблицаПоиска.Колонки.Добавить(\"Обработано\", Новый ОписаниеТипов(\"Булево\"));\n"
" \n"
" // Определяем порядок обработки и проверяем то, что можно обработать.\n"
" ОшибкиРазметки = Новый Массив;\n"
" ОбъектыСОшибками = Новый Массив;\n"
" Количество = Дубли.Количество();\n"
" Для Номер = 1 По Количество Цикл\n"
" ОбратныйИндекс = Количество - Номер;\n"
" Дубль = Дубли[ОбратныйИндекс];\n"
" РезультатРазметки = РазметитьМестаИспользования(ПараметрыВыполнения, Дубль, ПарыЗамен[Дубль], ТаблицаПоиска);\n"
" Если Не РезультатРазметки.Успех Тогда\n"
" Дубли.Удалить(ОбратныйИндекс);\n"
" Для Каждого Ошибка Из РезультатРазметки.ОшибкиРазметки Цикл\n"
" Ошибка.Вставить(\"Дубль\", Дубль);\n"
" ОбъектыСОшибками.Добавить(Ошибка.Объект);\n"
" КонецЦикла;\n"
" ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОшибкиРазметки, РезультатРазметки.ОшибкиРазметки);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ОшибкиРазметки.Количество() > 0 Тогда\n"
" ПредставленияОбъектов = ПредметыСтрокой(ОбъектыСОшибками);\n"
" Для Каждого Ошибка Из ОшибкиРазметки Цикл\n"
" ЗарегистрироватьОшибкуЗамены(Результат, Ошибка.Дубль,\n"
" ОписаниеОшибкиЗамены(\"НеизвестныеДанные\", Ошибка.Объект, ПредставленияОбъектов[Ошибка.Объект], \n"
" Ошибка.Текст));\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" // Замена и удаление найденных дублей.\n"
" ПараметрыВыполнения.Вставить(\"ПарыЗамен\", ПарыЗамен);\n"
" ПараметрыВыполнения.Вставить(\"УспешныеЗамены\", Новый Соответствие);\n"
" \n"
" ОтключитьОбновлениеКлючейДоступа(Истина);\n"
" \n"
" Попытка\n"
" \n"
" КоличествоДублей = Дубли.Количество();\n"
" Номер = 1;\n"
" Для Каждого Дубль Из Дубли Цикл\n"
" \n"
" БылиОшибки = Результат.ЕстьОшибки;\n"
" Результат.ЕстьОшибки = Ложь;\n"
" \n"
" // @skip-check query-in-loop - Порционная обработка большого объема данных.\n"
" ЗаменитьСсылкиКороткимиТранзакциями(Результат, ПараметрыВыполнения, Дубль, ТаблицаПоиска);\n"
" \n"
" Если НЕ Результат.ЕстьОшибки Тогда\n"
" ПараметрыВыполнения.УспешныеЗамены.Вставить(Дубль, ПараметрыВыполнения.ПарыЗамен[Дубль]); \n"
" КонецЕсли;\n"
" Результат.ЕстьОшибки = Результат.ЕстьОшибки ИЛИ БылиОшибки;\n"
" \n"
" ДополнительныеПараметры = Новый Структура;\n"
" ДополнительныеПараметры.Вставить(\"НомерСеанса\", НомерСеансаИнформационнойБазы());\n"
" ДополнительныеПараметры.Вставить(\"КоличествоОбработанных\", Номер);\n"
" ДлительныеОперации.СообщитьПрогресс(Номер,\n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Замена дублей... обработано (%1 из %2)'\"), \n"
" Номер, КоличествоДублей), ДополнительныеПараметры);\n"
" Номер = Номер + 1;\n"
" ДобавитьВСтатистикуЗаменыСсылок(Статистика, Дубль, Результат.ЕстьОшибки);\n"
" \n"
" КонецЦикла;\n"
" \n"
" ОбщегоНазначенияПереопределяемый.ПослеЗаменыСсылок(Результат, ПараметрыВыполнения, ТаблицаПоиска);\n"
" \n"
" ОтключитьОбновлениеКлючейДоступа(Ложь);\n"
" \n"
" Исключение\n"
" ОтключитьОбновлениеКлючейДоступа(Ложь);\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.УдалениеПомеченныхОбъектов\") \n"
" И ПараметрыВыполнения.УдалятьНепосредственно Тогда\n"
" \n"
" МодульУдалениеПомеченныхОбъектов = ОбщийМодуль(\"УдалениеПомеченныхОбъектов\");\n"
" \n"
" ДлительныеОперации.СообщитьПрогресс(0, НСтр(\"ru = 'Удаление дублей...'\"));\n"
" РезультатУдаления = МодульУдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(Результат.ОчередьКНепосредственномуУдалению);\n"
" ЗарегистрироватьОшибкиУдаления(Результат, РезультатУдаления.ПрепятствующиеУдалению);\n"
" \n"
" КонецЕсли;\n"
" \n"
" ОтправитьСтатистикуЗаменыСсылок(Статистика);\n"
" \n"
" Возврат Результат.Ошибки;\n"
" \n"
"КонецФункции\n\n"
"// Конструктор структуры для параметра ПараметрыЗамены функции ОбщегоНазначения.ЗаменитьСсылки.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * СпособУдаления - Строка - указывает, что делать с дублем после успешной замены:\n"
"// \"\" - не предпринимать никаких действий (по умолчанию);\n"
"// \"Пометка\" - помечать на удаление;\n"
"// \"Непосредственно\" - удалять непосредственно.\n"
"// * УчитыватьПрикладныеПравила - Булево - если Истина, то для каждой пары \"дубль-оригинал\" \n"
"// вызывается функция ВозможностьЗаменыЭлементов модуля менеджера \n"
"// (требуется подсистема \"Поиск и удаление дублей\"). По умолчанию, Ложь.\n"
"// * ВключатьБизнесЛогику - Булево - режим записи объектов при замене в них ссылок дублей на оригиналы.\n"
"// Если Истина (по умолчанию), то места использования дублей записываются в обычном режиме,\n"
"// иначе запись ведется в режиме ОбменДанными.Загрузка = Истина.\n"
"// * ЗаменаПарыВТранзакции - Булево - устарел. определяет размер транзакции при замене дублей.\n"
"// Если Истина (по умолчанию), то все места использования одного дубля заменяются в одной транзакции. \n"
"// Это может быть очень ресурсоемко в случае большого количества мест использований.\n"
"// Если Ложь, то замена в каждом месте использования выполняется в отдельной транзакции.\n"
"// * ПривилегированнаяЗапись - Булево - если Истина, то устанавливать привилегированный режим перед запись\n"
"// объектов при замене в них ссылок дублей на оригиналы. По умолчанию Ложь.\n"
"//\n"
"Функция ПараметрыЗаменыСсылок() Экспорт\n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"СпособУдаления\", \"\");\n"
" Результат.Вставить(\"УчитыватьПрикладныеПравила\", Ложь);\n"
" Результат.Вставить(\"ВключатьБизнесЛогику\", Истина);\n"
" Результат.Вставить(\"ЗаменаПарыВТранзакции\", Ложь);\n"
" Результат.Вставить(\"ПривилегированнаяЗапись\", Ложь);\n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Получает все места использования ссылок.\n"
"// Если какая-либо ссылка нигде не используется, то строк для нее в результирующей таблице не будет.\n"
"// При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях.\n"
"//\n"
"// Параметры:\n"
"// НаборСсылок - Массив из ЛюбаяСсылка - ссылки, для которых ищем места использования.\n"
"// АдресРезультата - Строка - адрес во временном хранилище, куда будет помещен копия результата замены.\n"
"// ДополнительныеПараметры - см. ОбщегоНазначения.ПараметрыПоискаМестИспользования \n"
"// \n"
"// Возвращаемое значение:\n"
"// ТаблицаЗначений:\n"
"// * Ссылка - ЛюбаяСсылка - ссылка, которая анализируется.\n"
"// * Данные - Произвольный - данные, содержащие анализируемую ссылку.\n"
"// * Метаданные - ОбъектМетаданных - метаданные найденных данных.\n"
"// * ПредставлениеДанных - Строка - представление данных, содержащих анализируемую ссылку.\n"
"// * ТипСсылки - Тип - тип анализируемой ссылки.\n"
"// * ВспомогательныеДанные - Булево - Истина, если данные используются анализируемой ссылкой как\n"
"// вспомогательные данные (ведущее измерение или попали в исключение ПриДобавленииИсключенийПоискаСсылок).\n"
"// * ЭтоСлужебныеДанные - Булево - данные попали в исключение ПриДобавленииИсключенийПоискаСсылок\n"
"//\n"
"Функция МестаИспользования(Знач НаборСсылок, Знач АдресРезультата = \"\", ДополнительныеПараметры = Неопределено) Экспорт\n"
" \n"
" МестаИспользования = Новый ТаблицаЗначений;\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" МестаИспользования = НайтиПоСсылкам(НаборСсылок); // см. МестаИспользования.\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" \n"
" // МестаИспользования - ТаблицаЗначений - где:\n"
" // * Ссылка - ЛюбаяСсылка - Ссылка, которая анализируется.\n"
" // * Данные - Произвольный - Данные, содержащие анализируемую ссылку.\n"
" // * Метаданные - ОбъектМетаданных - Метаданные найденных данных.\n"
" \n"
" МестаИспользования.Колонки.Добавить(\"ПредставлениеДанных\", Новый ОписаниеТипов(\"Строка\"));\n"
" МестаИспользования.Колонки.Добавить(\"ТипСсылки\");\n"
" МестаИспользования.Колонки.Добавить(\"ИнформацияОМестеИспользования\");\n"
" МестаИспользования.Колонки.Добавить(\"ВспомогательныеДанные\", Новый ОписаниеТипов(\"Булево\"));\n"
" МестаИспользования.Колонки.Добавить(\"ЭтоСлужебныеДанные\", Новый ОписаниеТипов(\"Булево\"));\n"
" \n"
" МестаИспользования.Индексы.Добавить(\"Ссылка\");\n"
" МестаИспользования.Индексы.Добавить(\"Данные\");\n"
" МестаИспользования.Индексы.Добавить(\"ВспомогательныеДанные\");\n"
" МестаИспользования.Индексы.Добавить(\"Ссылка, ВспомогательныеДанные\");\n"
" \n"
" ТипКлючиЗаписей = ОписаниеТипаКлючиЗаписей();\n"
" ТипВсеСсылки = ОписаниеТипаВсеСсылки();\n"
" \n"
" МетаданныеПоследовательностей = Метаданные.Последовательности;\n"
" МетаданныеКонстант = Метаданные.Константы;\n"
" МетаданныеДокументов = Метаданные.Документы;\n"
" \n"
" ИсключенияПоискаСсылок = ИсключенияПоискаСсылок();\n"
" \n"
" ДополнительныеИсключенияПоискаСсылок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(\n"
" ДополнительныеПараметры, \n"
" \"ДополнительныеИсключенияПоискаСсылок\",\n"
" Новый Соответствие);\n"
" Для каждого МетаданныеРеквизитыИсключения Из ДополнительныеИсключенияПоискаСсылок Цикл\n"
" \n"
" ЗначениеИсключения = ИсключенияПоискаСсылок[МетаданныеРеквизитыИсключения.Ключ];\n"
" Если ЗначениеИсключения = Неопределено Тогда\n"
" ИсключенияПоискаСсылок.Вставить(МетаданныеРеквизитыИсключения.Ключ,\n"
" МетаданныеРеквизитыИсключения.Значение); \n"
" Иначе\n"
" \n"
" Если ТипЗнч(ЗначениеИсключения) = Тип(\"Массив\") Тогда\n"
" ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ЗначениеИсключения,\n"
" МетаданныеРеквизитыИсключения.Значение); \n"
" КонецЕсли;\n"
" \n"
" КонецЕсли; \n"
" КонецЦикла;\n"
" \n"
" ОтменаИсключенийПоискаСсылок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеПараметры,\n"
" \"ОтменаИсключенийПоискаСсылок\", Новый Массив);\n"
" Для каждого ОтменаИсключения Из ОтменаИсключенийПоискаСсылок Цикл\n"
" ИсключенияПоискаСсылок.Удалить(ОтменаИсключения); \n"
" КонецЦикла;\n"
" \n"
" СлужебныеСвязиДанных = СлужебныеСвязиДанных(МестаИспользования, ИсключенияПоискаСсылок);\n"
" КэшИзмеренийРегистров = Новый Соответствие;\n"
" \n"
" Для Каждого МестоИспользования Из МестаИспользования Цикл\n"
" ТипДанных = ТипЗнч(МестоИспользования.Данные);\n"
" \n"
" ЭтоСлужебныеДанные = СлужебныеСвязиДанных[МестоИспользования] <> Неопределено;\n"
" ЭтоВспомогательныеДанные = ЭтоСлужебныеДанные;\n"
" \n"
" Если ТипДанных = Неопределено Или МетаданныеДокументов.Содержит(МестоИспользования.Метаданные) Тогда\n"
" Представление = Строка(МестоИспользования.Данные);\n"
" \n"
" ИначеЕсли МетаданныеКонстант.Содержит(МестоИспользования.Метаданные) Тогда\n"
" Представление = МестоИспользования.Метаданные.Представление() + \" (\" + НСтр(\"ru = 'константа'\") + \")\";\n"
" \n"
" ИначеЕсли МетаданныеПоследовательностей.Содержит(МестоИспользования.Метаданные) Тогда\n"
" Представление = МестоИспользования.Метаданные.Представление() + \" (\" + НСтр(\"ru = 'последовательность'\") + \")\";\n"
" \n"
" ИначеЕсли ТипВсеСсылки.СодержитТип(ТипДанных) Тогда\n"
" МетаПредставлениеОбъекта = Новый Структура(\"ПредставлениеОбъекта\");\n"
" ЗаполнитьЗначенияСвойств(МетаПредставлениеОбъекта, МестоИспользования.Метаданные);\n"
" Если ПустаяСтрока(МетаПредставлениеОбъекта.ПредставлениеОбъекта) Тогда\n"
" МетаПредставление = МестоИспользования.Метаданные.Представление();\n"
" Иначе\n"
" МетаПредставление = МетаПредставлениеОбъекта.ПредставлениеОбъекта;\n"
" КонецЕсли;\n"
" Представление = Строка(МестоИспользования.Данные);\n"
" Если Не ПустаяСтрока(МетаПредставление) Тогда\n"
" Представление = Представление + \" (\" + МетаПредставление + \")\";\n"
" КонецЕсли;\n"
" \n"
" ИначеЕсли ТипКлючиЗаписей.СодержитТип(ТипДанных) Тогда\n"
" Представление = МестоИспользования.Метаданные.ПредставлениеЗаписи;\n"
" Если ПустаяСтрока(Представление) Тогда\n"
" Представление = МестоИспользования.Метаданные.Представление();\n"
" КонецЕсли;\n"
" \n"
" ОписаниеИзмерений = Новый Массив;\n"
" Для Каждого МетаданныеРеквизитыИсключения Из ОписаниеИзмеренийНабора(МестоИспользования.Метаданные, КэшИзмеренийРегистров) Цикл\n"
" Значение = МестоИспользования.Данные[МетаданныеРеквизитыИсключения.Ключ];\n"
" Описание = МетаданныеРеквизитыИсключения.Значение;\n"
" Если МестоИспользования.Ссылка = Значение Тогда\n"
" Если Описание.Ведущее Тогда\n"
" ЭтоВспомогательныеДанные = Истина;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" Если Не ЭтоСлужебныеДанные Тогда // для оптимизации\n"
" ФорматЗначения = Описание.Формат; \n"
" ОписаниеИзмерений.Добавить(Описание.Представление + \" \"\"\" \n"
" + ?(ФорматЗначения = Неопределено, Строка(Значение), Формат(Значение, ФорматЗначения)) + \"\"\"\");\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ОписаниеИзмерений.Количество() > 0 Тогда\n"
" Представление = Представление + \" (\" + СтрСоединить(ОписаниеИзмерений, \", \") + \")\";\n"
" КонецЕсли;\n"
" \n"
" Иначе\n"
" Представление = Строка(МестоИспользования.Данные);\n"
" КонецЕсли;\n"
" \n"
" МестоИспользования.ПредставлениеДанных = Представление;\n"
" МестоИспользования.ВспомогательныеДанные = ЭтоВспомогательныеДанные;\n"
" МестоИспользования.ЭтоСлужебныеДанные = ЭтоСлужебныеДанные;\n"
" МестоИспользования.ТипСсылки = ТипЗнч(МестоИспользования.Ссылка);\n"
" КонецЦикла;\n"
" \n"
" Если Не ПустаяСтрока(АдресРезультата) Тогда\n"
" ПоместитьВоВременноеХранилище(МестаИспользования, АдресРезультата);\n"
" КонецЕсли;\n"
" \n"
" Возврат МестаИспользования;\n"
"КонецФункции\n\n"
"// Возвращает структуру для параметра ДополнительныеПараметры функции ОбщегоНазначения.МестаИспользования. \n"
"// \n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * ДополнительныеИсключенияПоискаСсылок - Соответствие - позволяет расширить исключения поиска ссылок\n"
"// см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок\n"
"// * ОтменаИсключенийПоискаСсылок - Массив из ОбъектМетаданных - полностью отменяет исключения поиска ссылок для\n"
"// объектов метаданных.\n"
"//\n"
"Функция ПараметрыПоискаМестИспользования() Экспорт\n\n"
" ПараметрыПоиска = Новый Структура;\n"
" ПараметрыПоиска.Вставить(\"ДополнительныеИсключенияПоискаСсылок\", Новый Соответствие);\n"
" ПараметрыПоиска.Вставить(\"ОтменаИсключенийПоискаСсылок\", Новый Соответствие);\n\n"
" Возврат ПараметрыПоиска;\n\n"
"КонецФункции\n\n"
"// Возвращает исключения при поиске мест использования объектов.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение - исключения поиска ссылок в разрезе объектов метаданных:\n"
"// * Ключ - ОбъектМетаданных - объект метаданных, для которого применяются исключения.\n"
"// * Значение - Строка\n"
"// - Массив из Строка - описание исключенных реквизитов.\n"
"// Если \"*\", то исключены все реквизиты объекта метаданных.\n"
"// Если массив строк, то содержит относительные имена исключенных реквизитов.\n"
"//\n"
"Функция ИсключенияПоискаСсылок() Экспорт\n"
" \n"
" ИсключенияПоискаИнтеграция = Новый Массив;\n"
" ИнтеграцияПодсистемБСП.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаИнтеграция);\n"
" \n"
" ИсключенияПоиска = Новый Массив;\n"
" ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИсключенияПоиска, ИсключенияПоискаИнтеграция);\n"
" ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоиска);\n"
" \n"
" Результат = Новый Соответствие;\n"
" Для Каждого ИсключениеПоиска Из ИсключенияПоиска Цикл\n"
" // Определение полного имени реквизита и объекта метаданных - носителя реквизита.\n"
" Если ТипЗнч(ИсключениеПоиска) = Тип(\"Строка\") Тогда\n"
" ПолноеИмя = ИсключениеПоиска;\n"
" МассивПодстрок = СтрРазделить(ПолноеИмя, \".\");\n"
" КоличествоПодстрок = МассивПодстрок.Количество();\n"
" ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(МассивПодстрок[0] + \".\" + МассивПодстрок[1]);\n"
" Иначе\n"
" ОбъектМетаданных = ИсключениеПоиска;\n"
" ПолноеИмя = ОбъектМетаданных.ПолноеИмя();\n"
" МассивПодстрок = СтрРазделить(ПолноеИмя, \".\");\n"
" КоличествоПодстрок = МассивПодстрок.Количество();\n"
" Если КоличествоПодстрок > 2 Тогда\n"
" Пока Истина Цикл\n"
" Родитель = ОбъектМетаданных.Родитель();\n"
" Если ТипЗнч(Родитель) = Тип(\"ОбъектМетаданныхКонфигурация\") Тогда\n"
" Прервать;\n"
" Иначе\n"
" ОбъектМетаданных = Родитель;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" // Регистрация.\n"
" Если КоличествоПодстрок < 4 Тогда\n"
" Результат.Вставить(ОбъектМетаданных, \"*\");\n"
" Иначе\n"
" ПутиКРеквизитам = Результат.Получить(ОбъектМетаданных);\n"
" Если ПутиКРеквизитам = \"*\" Тогда\n"
" Продолжить; // Весь объект метаданных уже исключен.\n"
" ИначеЕсли ПутиКРеквизитам = Неопределено Тогда\n"
" ПутиКРеквизитам = Новый Массив;\n"
" Результат.Вставить(ОбъектМетаданных, ПутиКРеквизитам);\n"
" КонецЕсли;\n"
" // Формат реквизита:\n"
" // \"<ВидОМ>.<ИмяОМ>.<ТипРеквизитаИлиТЧ>.<ИмяРеквизитаИлиТЧ>[.<ТипРеквизита>.<ИмяРеквизитаТЧ>]\".\n"
" // Примеры:\n"
" // \"РегистрСведений.ВерсииОбъектов.Реквизит.АвторВерсии\",\n"
" // \"Документ._ДемоЗаказПокупателя.ТабличнаяЧасть.СчетаНаОплату.Реквизит.Счет\",\n"
" // \"ПланВидовРасчета._ДемоОсновныеНачисления.СтандартнаяТабличнаяЧасть.БазовыеВидыРасчета.СтандартныйРеквизит.ВидРасчета\".\n"
" // Относительный путь к реквизиту должен получиться таким, чтобы его можно было использовать в условиях запроса:\n"
" // \"<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]\".\n"
" Если КоличествоПодстрок = 4 Тогда\n"
" ОтносительныйПутьКРеквизиту = МассивПодстрок[3];\n"
" Иначе\n"
" ОтносительныйПутьКРеквизиту = МассивПодстрок[3] + \".\" + МассивПодстрок[5];\n"
" КонецЕсли;\n"
" ПутиКРеквизитам.Добавить(ОтносительныйПутьКРеквизиту);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает связи подчиненных объектов и перечень реквизитов, по которым осуществляется связь.\n"
"//\n"
"// Есть возможность переопределить процедуру поиска подчиненных объектов.\n"
"// Для этого в общем модуле или модуле менеджера необходимо реализовать процедуру\n"
"// ПриПоискеЗаменыСсылок с параметрами:\n"
"// ПарыЗамен - Соответствие - содержит пары значение оригинал/дубль.\n"
"// НеобработанныеЗначенияОригиналов - Массив из Структура - дополнительная информация об обрабатываемых объектах:\n"
"// * ЗаменяемоеЗначение - ПроизвольнаяСсылка - оригинальное значение заменяемого объекта.\n"
"// * ИспользуемыеСвязи - см. ОбщегоНазначения.СвязиПодчиненныхОбъектовПоТипам \n"
"// * ЗначениеКлючевыхРеквизитов - Структура - где Ключ - имя реквизита, значение - значение реквизита.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ТаблицаЗначений:\n"
"// * ПодчиненныйОбъект - ОбъектМетаданных - объект метаданных подчиненного объекта. \n"
"// * ПоляСвязей - Строка - имена реквизитов, определяющих связь между основными и подчиненными объектами.\n"
"// * ПриПоискеЗаменыСсылок - Строка - опционально. Имя общего модуля или модуля менеджера, в котором определена \n"
"// процедура ПриПоискеЗаменыСсылок.\n"
"// * ВыполнятьАвтоматическийПоискЗаменСсылок - Булево - если указать Истина, то будет выполнена попытка поиска замен \n"
"// для подчиненных объектов по значениям полей связи. В случае, если объект не существует, \n"
"// будет выполнена процедура ПриПоискеЗаменыСсылок. См. также ЗаменитьСсылки.\n"
"//\n"
"Функция ПодчиненныеОбъекты() Экспорт\n"
" \n"
" ОписаниеСвязей = Новый ТаблицаЗначений;\n"
" ОписаниеСвязей.Колонки.Добавить(\"ПодчиненныйОбъект\", Новый ОписаниеТипов(\"ОбъектМетаданных\"));\n"
" ОписаниеСвязей.Колонки.Добавить(\"ПоляСвязей\");\n"
" ОписаниеСвязей.Колонки.Добавить(\"ПриПоискеЗаменыСсылок\", ОписаниеТипаСтрока(0));\n"
" ОписаниеСвязей.Колонки.Добавить(\"ВыполнятьАвтоматическийПоискЗаменСсылок\", Новый ОписаниеТипов(\"Булево\"));\n"
" \n"
" ИнтеграцияПодсистемБСП.ПриОпределенииПодчиненныхОбъектов(ОписаниеСвязей);\n"
" ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов(ОписаниеСвязей);\n"
" \n"
" // Если передали соответствие или структуру преобразуем к необходимому типу.\n"
" Для каждого СтрокаСвязи Из ОписаниеСвязей Цикл\n"
" \n"
" ТипОписанияПолейСвязи = ТипЗнч(СтрокаСвязи.ПоляСвязей);\n"
" Если ТипОписанияПолейСвязи = Тип(\"Структура\")\n"
" ИЛИ ТипОписанияПолейСвязи = Тип(\"Соответствие\") Тогда\n"
" \n"
" ПоляСвязейСтрокой = \"\";\n"
" Для каждого КлючЗначение Из СтрокаСвязи.ПоляСвязей Цикл\n"
" ПоляСвязейСтрокой = ПоляСвязейСтрокой + КлючЗначение.Ключ + \",\"; \n"
" КонецЦикла;\n"
" СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ПоляСвязейСтрокой,1);\n"
" СтрокаСвязи.ПоляСвязей = ПоляСвязейСтрокой;\n"
" \n"
" КонецЕсли;\n"
" \n"
" Если ТипОписанияПолейСвязи = Тип(\"Массив\") Тогда\n"
" СтрокаСвязи.ПоляСвязей = СтрСоединить(СтрокаСвязи.ПоляСвязей, \",\"); \n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат ОписаниеСвязей;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает связи подчиненных объектов с указанием типа поля связи.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ТаблицаЗначений:\n"
"// * Ключ - Строка\n"
"// * ТипРеквизита - Тип\n"
"// * ИмяРеквизита - Строка\n"
"// * Используется - Булево\n"
"// * Метаданные - ОбъектМетаданных\n"
"//\n"
"Функция СвязиПодчиненныхОбъектовПоТипам() Экспорт\n\n"
" Результат = Новый ТаблицаЗначений;\n"
" Результат.Колонки.Добавить(\"ТипРеквизита\", Новый ОписаниеТипов(\"Тип\"));\n"
" Результат.Колонки.Добавить(\"ИмяРеквизита\", ОписаниеТипаСтрока(0));\n"
" Результат.Колонки.Добавить(\"Ключ\", ОписаниеТипаСтрока(0));\n"
" Результат.Колонки.Добавить(\"Используется\", Новый ОписаниеТипов(\"Булево\"));\n"
" Результат.Колонки.Добавить(\"Метаданные\");\n"
" \n"
" Возврат Результат;\n\n"
"КонецФункции \n\n"
"#КонецОбласти\n\n"
"#Область УсловныеВызовы\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Процедуры и функции для вызова необязательных подсистем.\n\n"
"// Возвращает Истина, если функциональная подсистема существует в конфигурации.\n"
"// Предназначена для реализации вызова необязательной подсистемы (условного вызова).\n"
"// У функциональной подсистемы снят флажок \"Включать в командный интерфейс\".\n"
"// См. также ОбщегоНазначенияПереопределяемый.ПриОпределенииОтключенныхПодсистем\n"
"// и ОбщегоНазначенияКлиент.ПодсистемаСуществует для вызова из клиентского кода.\n"
"//\n"
"// Параметры:\n"
"// ПолноеИмяПодсистемы - Строка - полное имя объекта метаданных подсистема\n"
"// без слов \"Подсистема.\" и с учетом регистра символов.\n"
"// Например: \"СтандартныеПодсистемы.ВариантыОтчетов\".\n"
"//\n"
"// Пример:\n"
"// Если ОбщегоНазначения.ПодсистемаСуществует(\"СтандартныеПодсистемы.ВариантыОтчетов\") Тогда\n"
"// МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль(\"ВариантыОтчетов\");\n"
"// МодульВариантыОтчетов.<Имя метода>();\n"
"// КонецЕсли;\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если подсистема существует.\n"
"//\n"
"Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт\n"
" \n"
" ИменаПодсистем = СтандартныеПодсистемыПовтИсп.ИменаПодсистем();\n"
" Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает ссылку на общий модуль или модуль менеджера по имени.\n"
"//\n"
"// Параметры:\n"
"// Имя - Строка - имя общего модуля.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОбщийМодуль\n"
"// МодульМенеджераОбъекта\n"
"//\n"
"// Пример:\n"
"// Если ОбщегоНазначения.ПодсистемаСуществует(\"СтандартныеПодсистемы.ОбновлениеКонфигурации\") Тогда\n"
"// МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль(\"ОбновлениеКонфигурации\");\n"
"// МодульОбновлениеКонфигурации.<Имя метода>();\n"
"// КонецЕсли;\n"
"//\n"
"// Если ОбщегоНазначения.ПодсистемаСуществует(\"СтандартныеПодсистемы.ПолнотекстовыйПоиск\") Тогда\n"
"// МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль(\"ПолнотекстовыйПоискСервер\");\n"
"// МодульПолнотекстовыйПоискСервер.<Имя метода>();\n"
"// КонецЕсли;\n"
"//\n"
"Функция ОбщийМодуль(Имя) Экспорт\n"
" \n"
" Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда\n"
" // АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно.\n"
" УстановитьБезопасныйРежим(Истина);\n"
" Модуль = Вычислить(Имя);\n"
" // АПК:488-вкл\n"
" ИначеЕсли СтрЧислоВхождений(Имя, \".\") = 1 Тогда\n"
" Возврат СерверныйМодульМенеджера(Имя);\n"
" Иначе\n"
" Модуль = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" Если ТипЗнч(Модуль) <> Тип(\"ОбщийМодуль\") Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Общий модуль \"\"%1\"\" не существует.'\"),\n"
" Имя);\n"
" КонецЕсли;\n"
" \n"
" Возврат Модуль;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ТекущееОкружение\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Функции описания текущего окружения клиентского приложения и операционной системы.\n\n"
"// Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если нет клиентского приложения, возвращается Ложь.\n"
"//\n"
"Функция ЭтоWindowsКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" ЭтоWindowsКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ЭтоWindowsКлиент\");\n"
" \n"
" Если ЭтоWindowsКлиент = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат ЭтоWindowsКлиент;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если текущий сеанс выполняется на сервере, работающем под управлением ОС Windows.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если сервер работает под управлением ОС Windows.\n"
"//\n"
"Функция ЭтоWindowsСервер() Экспорт\n"
" \n"
" СистемнаяИнформация = Новый СистемнаяИнформация;\n"
" Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 \n"
" Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если клиентское приложение запущено под управлением ОС Linux.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если нет клиентского приложения, возвращается Ложь.\n"
"//\n"
"Функция ЭтоLinuxКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" ЭтоLinuxКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ЭтоLinuxКлиент\");\n"
" \n"
" Если ЭтоLinuxКлиент = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат ЭтоLinuxКлиент;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если текущий сеанс выполняется на сервере, работающем под управлением ОС Linux.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если сервер работает под управлением ОС Linux.\n"
"//\n"
"Функция ЭтоLinuxСервер() Экспорт\n"
" \n"
" СистемнаяИнформация = Новый СистемнаяИнформация;\n"
" Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86\n"
" Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64\n"
" Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, \"8.3.22.1923\") >= 0\n"
" И (СистемнаяИнформация.ТипПлатформы = ТипПлатформы[\"Linux_ARM64\"]\n"
" Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы[\"Linux_E2K\"]);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если клиентское приложение запущено под управлением macОС.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если нет клиентского приложения, возвращается Ложь.\n"
"//\n"
"Функция ЭтоMacOSКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" ЭтоMacOSКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ЭтоMacOSКлиент\");\n"
" \n"
" Если ЭтоMacOSКлиент = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат ЭтоMacOSКлиент;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если клиентское приложение является Веб-клиентом.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если нет клиентского приложения, возвращается Ложь.\n"
"//\n"
"Функция ЭтоВебКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" ЭтоВебКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ЭтоВебКлиент\");\n"
" \n"
" Если ЭтоВебКлиент = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат ЭтоВебКлиент;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если клиентское приложение является мобильным клиентом.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если нет клиентского приложения, возвращается Ложь.\n"
"//\n"
"Функция ЭтоМобильныйКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" ЭтоМобильныйКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ЭтоМобильныйКлиент\");\n"
" \n"
" Если ЭтоМобильныйКлиент = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат ЭтоМобильныйКлиент;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если подключен.\n"
"//\n"
"Функция КлиентПодключенЧерезВебСервер() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" СтрокаСоединенияИнформационнойБазы = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"СтрокаСоединенияИнформационнойБазы\");\n"
" \n"
" Если СтрокаСоединенияИнформационнойБазы = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), \"WS=\") = 1;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает системную информацию клиента, если есть клиентское приложение.\n"
"// До первого серверного вызова с клиента вернет Неопределено.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ФиксированнаяСтруктура:\n"
"// * ВерсияОС - Строка\n"
"// * ВерсияПриложения - Строка\n"
"// * ИдентификаторКлиента - УникальныйИдентификатор\n"
"// * ИнформацияПрограммыПросмотра - Строка\n"
"// * ОперативнаяПамять - Число\n"
"// * Процессор - Строка\n"
"// * ТипПлатформы - см. ОбщегоНазначенияКлиентСервер.ИмяТипаПлатформы\n"
"// Неопределено - если нет клиентского приложения или информация запрашивается\n"
"// до первого серверного вызова, например, при первом вызове события\n"
"// платформы УстановкаПараметровСеанса в модуле сеанса.\n"
"//\n"
"Функция СистемнаяИнформацияКлиента() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" Возврат СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"СистемнаяИнформация\");\n"
" \n"
"КонецФункции\n\n"
"// Возвращает имя используемого клиента, а для веб-браузера название и версию, если есть.\n"
"// До первого серверного вызова с клиента вернет Неопределено.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - варианты строк \"ВебКлиент.<Название>[.<Версия>]\", \"ТонкийКлиент\",\n"
"// \"ТолстыйКлиентУправляемоеПриложение\", \"ТолстыйКлиентОбычноеПриложение\",\n"
"// где <Название> - варианты строк \"Chrome\", \"Firefox\", \"Safari\", \"IE\", \"Opera\"\n"
"// или \"Другой\", когда не определен (ни один из указанных), например \"ВебКлиент.Chrome.109\".\n"
"// Неопределено - если нет клиентского приложения или информация запрашивается\n"
"// до первого серверного вызова, например, при первом вызове события\n"
"// платформы УстановкаПараметровСеанса в модуле сеанса.\n"
"//\n"
"Функция ИспользуемыйКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" Возврат СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ИспользуемыйКлиент\");\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина, если включен режим отладки.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если включен режим отладки.\n"
"//\n"
"Функция РежимОтладки() Экспорт\n"
" \n"
" ПараметрЗапускаПриложения = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить(\"ПараметрЗапуска\");\n"
" \n"
" Возврат СтрНайти(ПараметрЗапускаПриложения, \"РежимОтладки\") > 0;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает объем оперативной памяти, доступной клиентскому приложению.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Число - количество гигабайтов оперативной памяти с точностью до десятых долей.\n"
"// Неопределено - нет клиентского приложения, то есть ТекущийРежимЗапуска() = Неопределено.\n"
"//\n"
"Функция ОперативнаяПамятьДоступнаяКлиентскомуПриложению() Экспорт\n"
" \n"
" ДоступныйОбъем = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ОперативнаяПамять\");\n"
" Возврат ДоступныйОбъем;\n"
" \n"
"КонецФункции\n\n"
"// Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь).\n"
"// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно.\n"
"//\n"
"// Параметры:\n"
"// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если\n"
"// нужно проверить строку соединения не текущей информационной базы.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если файловая.\n"
"//\n"
"Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = \"\") Экспорт\n"
" \n"
" Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда\n"
" СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы();\n"
" КонецЕсли;\n"
" Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), \"FILE=\") = 1;\n"
" \n"
"КонецФункции \n\n"
"// Возвращает Истина, если эта информационная база подключена к 1С:Fresh.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - признак автономного рабочего места.\n"
"//\n"
"Функция ЭтоАвтономноеРабочееМесто() Экспорт\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ОбменДанными\") Тогда\n"
" МодульОбменДаннымиСервер = ОбщийМодуль(\"ОбменДаннымиСервер\");\n"
" Возврат МодульОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто();\n"
" КонецЕсли;\n"
" \n"
" Возврат Ложь;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает признак того, что информационная база является распределенной (РИБ).\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево\n"
"//\n"
"Функция ЭтоРаспределеннаяИнформационнаяБаза() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" Возврат СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ();\n"
" \n"
"КонецФункции\n\n"
"// Определяет, что эта информационная база является подчиненным узлом\n"
"// распределенной информационной базы (РИБ).\n"
"//\n"
"// Возвращаемое значение: \n"
"// Булево - Истина, если эта информационная база является подчиненным узлом РИБ.\n"
"//\n"
"Функция ЭтоПодчиненныйУзелРИБ() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Возврат ПланыОбмена.ГлавныйУзел() <> Неопределено;\n"
" \n"
"КонецФункции\n\n"
"// Определяет, что эта информационная база является подчиненным узлом\n"
"// распределенной информационной базы (РИБ) с фильтром.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Булево - Истина, если эта информационная база является подчиненным узлом РИБ с фильтром.\n"
"//\n"
"Функция ЭтоПодчиненныйУзелРИБСФильтром() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Если ПланыОбмена.ГлавныйУзел() <> Неопределено\n"
" И ПодсистемаСуществует(\"СтандартныеПодсистемы.ОбменДанными\") Тогда\n"
" МодульОбменДаннымиСервер = ОбщийМодуль(\"ОбменДаннымиСервер\");\n"
" Если МодульОбменДаннымиСервер.НазначениеПланаОбмена(ПланыОбмена.ГлавныйУзел().Метаданные().Имя) = \"РИБСФильтром\" Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Возврат Ложь;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает Истина при необходимости обновления конфигурации информационной базы подчиненного узла РИБ.\n"
"// В главном узле всегда Ложь.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Булево - Истина, если требуется.\n"
"//\n"
"Функция ТребуетсяОбновлениеКонфигурацииПодчиненногоУзлаРИБ() Экспорт\n"
" \n"
" Возврат ЭтоПодчиненныйУзелРИБ() И КонфигурацияИзменена();\n"
" \n"
"КонецФункции\n\n"
"// Возвращает признак работы в режиме разделения данных по областям\n"
"// (технически это признак условного разделения).\n"
"// \n"
"// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных\n"
"// (не содержит общих реквизитов, предназначенных для разделения данных).\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если разделение включено,\n"
"// Ложь, если разделение выключено или не поддерживается.\n"
"//\n"
"Функция РазделениеВключено() Экспорт\n"
" \n"
" Возврат СтандартныеПодсистемыПовтИсп.РазделениеВключено();\n"
" \n"
"КонецФункции\n\n"
"// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей).\n"
"// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено\n"
"// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным.\n"
"// \n"
"// Возвращает Истина, если конфигурация не может работать в режиме разделения данных\n"
"// (не содержит общих реквизитов, предназначенных для разделения данных).\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если разделение не поддерживается, либо разделение выключено,\n"
"// либо разделение включено и разделители установлены.\n"
"// Ложь, если разделение включено и разделители не установлены.\n"
"//\n"
"Функция ДоступноИспользованиеРазделенныхДанных() Экспорт\n"
" \n"
" Возврат СтандартныеПодсистемыПовтИсп.ДоступноИспользованиеРазделенныхДанных();\n"
" \n"
"КонецФункции\n\n"
"// Возвращает адрес публикации информационной базы для формирования прямых ссылок на объекты ИБ \n"
"// для возможности перехода к ним пользователей, имеющих доступ к базе через публикацию в сети Интернет.\n"
"// Например, если такой адрес включить в электронное письмо, то из письма одним нажатием\n"
"// можно перейти к форме объекта в самой программе.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - адрес информационной базы, как он задан в настройке \"Адрес в Интернете\" в панели администрирования\n"
"// (хранится в константе АдресПубликацииИнформационнойБазыВИнтернете).\n"
"// Например, \"http://1c.com/database\".\n"
"//\n"
"// Пример: \n"
"// ОбщегоНазначения.АдресПубликацииИнформационнойБазыВЛокальнойСети() + \"/\" + e1cib/app/Обработка.ВыгрузкаДанныхПроекта\";\n"
"// возвращает прямую ссылку для открытия обработки ВыгрузкаДанныхПроекта.\n"
"//\n"
"Функция АдресПубликацииИнформационнойБазыВИнтернете() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Возврат Константы.АдресПубликацииИнформационнойБазыВИнтернете.Получить();\n"
" \n"
"КонецФункции\n\n"
"// Возвращает адрес публикации информационной базы для формирования прямых ссылок на объекты ИБ \n"
"// для возможности перехода к ним пользователей, имеющих доступ к базе через публикацию локальной сети.\n"
"// Например, если такой адрес включить в электронное письмо, то из письма за одно нажатие\n"
"// можно перейти к форме объекта в самой программе.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - адрес информационной базы, как он задан в настройке \"Локальный адрес\" в панели администрирования\n"
"// (хранится в константе АдресПубликацииИнформационнойБазыВЛокальнойСети).\n"
"// Например, \"http://localserver/base\".\n"
"//\n"
"// Пример: \n"
"// ОбщегоНазначения.АдресПубликацииИнформационнойБазыВЛокальнойСети() + \"/\" + e1cib/app/Обработка.ВыгрузкаДанныхПроекта\";\n"
"// возвращает прямую ссылку для открытия обработки ВыгрузкаДанныхПроекта.\n"
"//\n"
"Функция АдресПубликацииИнформационнойБазыВЛокальнойСети() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Возврат Константы.АдресПубликацииИнформационнойБазыВЛокальнойСети.Получить();\n"
" \n"
"КонецФункции\n\n"
"// Формирует ссылку для входа в программу для указанного пользователя.\n"
"//\n"
"// Параметры:\n"
"// Пользователь - Строка - логин пользователя для входа в программу;\n"
"// Пароль - Строка - пароль пользователя для входа в программу;\n"
"// ВидПубликацииИБ - Строка - через какую публикацию пользователь входит в программу:\n"
"// \"ВИнтернете\" или \"ВЛокальнойСети\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка, Неопределено - адрес входа в программу или Неопределено, если адрес не настроен.\n"
"//\n"
"Функция АдресВходаВПрограмму(Пользователь, Пароль, ВидПубликацииИБ) Экспорт\n"
" \n"
" Результат = \"\";\n"
" \n"
" Если НРег(ВидПубликацииИБ) = НРег(\"ВИнтернете\") Тогда\n"
" Результат = АдресПубликацииИнформационнойБазыВИнтернете();\n"
" ИначеЕсли НРег(ВидПубликацииИБ) = НРег(\"ВЛокальнойСети\") Тогда\n"
" Результат = АдресПубликацииИнформационнойБазыВЛокальнойСети();\n"
" КонецЕсли;\n"
" \n"
" Если ПустаяСтрока(Результат) Тогда\n"
" Возврат Неопределено;\n"
" КонецЕсли;\n"
" \n"
" Если Не СтрЗаканчиваетсяНа(Результат, \"/\") Тогда\n"
" Результат = Результат + \"/\";\n"
" КонецЕсли;\n"
" \n"
" Результат = Результат + \"?n=\" + КодироватьСтроку(Пользователь, СпособКодированияСтроки.КодировкаURL);\n"
" Если ЗначениеЗаполнено(Пароль) Тогда\n"
" Результат = Результат + \"&p=\" + КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает редакцию конфигурации.\n"
"// Редакцией принято называть две первые группы цифр полной версии конфигурации.\n"
"// Например, у версии \"1.2.3.4\" редакция \"1.2\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - номер редакции конфигурации.\n"
"//\n"
"Функция РедакцияКонфигурации() Экспорт\n"
" \n"
" Результат = \"\";\n"
" ВерсияКонфигурации = Метаданные.Версия;\n"
" \n"
" Позиция = СтрНайти(ВерсияКонфигурации, \".\");\n"
" Если Позиция > 0 Тогда\n"
" Результат = Лев(ВерсияКонфигурации, Позиция);\n"
" ВерсияКонфигурации = Сред(ВерсияКонфигурации, Позиция + 1);\n"
" Позиция = СтрНайти(ВерсияКонфигурации, \".\");\n"
" Если Позиция > 0 Тогда\n"
" Результат = Результат + Лев(ВерсияКонфигурации, Позиция - 1);\n"
" Иначе\n"
" Результат = \"\";\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Если ПустаяСтрока(Результат) Тогда\n"
" Результат = Метаданные.Версия;\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Общие параметры подсистемы.\n"
"//\n"
"// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * ИмяФормыПерсональныхНастроек - Строка - имя формы для редактирования персональных настроек.\n"
"// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - по умолчанию Истина. Если установить в Ложь, то \n"
"// подтверждение при завершении работы программы не\n"
"// будет запрашиваться, если явно не разрешить в\n"
"// персональных настройках программы.\n"
"// * МинимальнаяВерсияПлатформы - Строка - минимальная версии платформы, требуемая для запуска программы.\n"
"// Запуск программы на версии платформы ниже указанной будет невозможен.\n"
"// Например, \"8.3.6.1650\".\n"
"// * РекомендуемаяВерсияПлатформы - Строка - рекомендуемая версия платформы для запуска программы.\n"
"// Например, \"8.3.8.2137\".\n"
"// * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных\n"
"// и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ.\n"
"// Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку.\n"
"// * РекомендуемыйОбъемОперативнойПамяти - Число - объем памяти в гигабайтах, рекомендуемый для комфортной работы в\n"
"// программе.\n"
"// Устарели, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы:\n"
"// * МинимальноНеобходимаяВерсияПлатформы - Строка - полный номер версии платформы для запуска программы.\n"
"// Например, \"8.3.4.365\".\n"
"// * РаботаВПрограммеЗапрещена - Булево - начальное значение Ложь.\n"
"//\n"
"Функция ОбщиеПараметрыБазовойФункциональности() Экспорт\n"
" \n"
" ОбщиеПараметры = Новый Структура;\n"
" ОбщиеПараметры.Вставить(\"ИмяФормыПерсональныхНастроек\", \"\");\n"
" ОбщиеПараметры.Вставить(\"ЗапрашиватьПодтверждениеПриЗавершенииПрограммы\", Истина);\n"
" ОбщиеПараметры.Вставить(\"ОтключитьИдентификаторыОбъектовМетаданных\", Ложь);\n"
" ОбщиеПараметры.Вставить(\"РекомендуемыйОбъемОперативнойПамяти\", 4);\n"
" ОбщиеПараметры.Вставить(\"МинимальнаяВерсияПлатформы\", МинимальнаяВерсияПлатформы());\n"
" ОбщиеПараметры.Вставить(\"РекомендуемаяВерсияПлатформы\", ОбщиеПараметры.МинимальнаяВерсияПлатформы);\n"
" // Устарело, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы:\n"
" ОбщиеПараметры.Вставить(\"МинимальноНеобходимаяВерсияПлатформы\", \"\");\n"
" ОбщиеПараметры.Вставить(\"РаботаВПрограммеЗапрещена\", Ложь); // Блокировать запуск, если версия ниже минимальной.\n"
" \n"
" ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры);\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.МинимальнаяВерсияПлатформы);\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.РекомендуемаяВерсияПлатформы);\n"
" \n"
" // Локализация\n"
" УточнитьМинимальнуюВерсиюПлатформыИзСервиса(ОбщиеПараметры);\n"
" // Конец Локализация\n"
" \n"
" СистемнаяИнформация = Новый СистемнаяИнформация;\n"
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, ОбщиеПараметры.МинимальнаяВерсияПлатформы) < 0\n"
" И ЭтоВерсияЗащищенногоПрограммногоКомплекса(СистемнаяИнформация.ВерсияПриложения) Тогда\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;\n"
" КонецЕсли;\n"
" \n"
" Минимальная = ОбщиеПараметры.МинимальнаяВерсияПлатформы;\n"
" Рекомендуемая = ОбщиеПараметры.РекомендуемаяВерсияПлатформы;\n"
" Если МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) Тогда\n"
" ТекстСообщения = НСтр(\"ru = 'Указанные в %1 минимальная и рекомендуемая версии платформы не соответствуют следующим требованиям:\n"
" | - минимальная версия должна быть заполнена;\n"
" | - минимальная версия не должна быть меньше минимальной версии БСП (см. %2);\n"
" | - минимальная версия не должна быть меньше рекомендуемой версии.\n"
" |Минимальная версия: %3\n"
" |Минимальная версия БСП: %4\n"
" |Рекомендуемая версия: %5'\",\n"
" КодОсновногоЯзыка());\n"
" ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения,\n"
" \"ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности\",\n"
" \"ОбщегоНазначения.МинимальнаяВерсияПлатформы\",\n"
" Минимальная, НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы()), Рекомендуемая);\n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Базовая функциональность'\", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, \n"
" ТекстСообщения); \n"
" КонецЕсли;\n"
" \n"
" // Обратная совместимость.\n"
" МинимальноНеобходимаяВерсияПлатформы = ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы;\n"
" Если ЗначениеЗаполнено(МинимальноНеобходимаяВерсияПлатформы) Тогда\n"
" Если ОбщиеПараметры.РаботаВПрограммеЗапрещена Тогда\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = МинимальноНеобходимаяВерсияПлатформы;\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = \"\";\n"
" Иначе\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = МинимальноНеобходимаяВерсияПлатформы;\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = \"\";\n"
" КонецЕсли;\n"
" Иначе\n"
" Текущая = СистемнаяИнформация.ВерсияПриложения;\n"
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Текущая) > 0 Тогда\n"
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = Минимальная;\n"
" ОбщиеПараметры.РаботаВПрограммеЗапрещена = Истина;\n"
" Иначе\n"
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = Рекомендуемая;\n"
" ОбщиеПараметры.РаботаВПрограммеЗапрещена = Ложь;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" УточнитьВерсиюПлатформы(ОбщиеПараметры);\n"
" \n"
" Возврат ОбщиеПараметры;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает описания всех библиотек конфигурации, включая\n"
"// описание самой конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Массив - структур со свойствами:\n"
"// * Имя - Строка - имя подсистемы, например, \"СтандартныеПодсистемы\".\n"
"// * ИдентификаторИнтернетПоддержки - Строка - уникальное имя программы в сервисах интернет-поддержки.\n"
"// * Версия - Строка - версия в формате из четырех цифр, например \"2.3.3.1\".\n"
"// * ЭтоКонфигурация - Булево - признак того, что данная подсистема является основной конфигурацией.\n"
"//\n"
"Функция ОписанияПодсистем() Экспорт\n"
" Результат = Новый Массив;\n"
" ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем();\n"
" Для Каждого ОписаниеПодсистемы Из ОписанияПодсистем.ПоИменам Цикл\n"
" Параметры = Новый Структура;\n"
" Параметры.Вставить(\"Имя\");\n"
" Параметры.Вставить(\"ИдентификаторИнтернетПоддержки\");\n"
" Параметры.Вставить(\"Версия\");\n"
" Параметры.Вставить(\"ЭтоКонфигурация\");\n"
" \n"
" ЗаполнитьЗначенияСвойств(Параметры, ОписаниеПодсистемы.Значение);\n"
" Результат.Добавить(Параметры);\n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Возвращает идентификатор Интернет-поддержки основной конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - уникальное имя программы в сервисах Интернет-поддержки.\n"
"//\n"
"Функция ИдентификаторИнтернетПоддержкиКонфигурации() Экспорт\n"
" ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем();\n"
" Для Каждого ОписаниеПодсистемы Из ОписанияПодсистем.ПоИменам Цикл\n"
" Если ОписаниеПодсистемы.Значение.ЭтоКонфигурация Тогда\n"
" Возврат ОписаниеПодсистемы.Значение.ИдентификаторИнтернетПоддержки;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат \"\";\n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область Даты\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Функции для работы с датами с учетом часового пояса сеанса\n\n"
"// Преобразует локальную дату к формату \"YYYY-MM-DDThh:mm:ssTZD\" согласно ISO 8601.\n"
"//\n"
"// Параметры:\n"
"// ЛокальнаяДата - Дата - дата в часовом поясе сеанса.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - представление даты.\n"
"//\n"
"Функция ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата) Экспорт\n"
" \n"
" Смещение = СмещениеСтандартногоВремени(ЧасовойПоясСеанса());\n"
" Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата, Смещение);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает строковое представление интервала между переданными датами или\n"
"// относительно переданной даты и текущей даты сеанса.\n"
"//\n"
"// Параметры:\n"
"// ВремяНачала - Дата - начальная точка интервала.\n"
"// ВремяОкончания - Дата - конечная точка интервала, если не задана - берется текущая дата сеанса.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - представление интервала времени.\n"
"//\n"
"Функция ИнтервалВремениСтрокой(ВремяНачала, ВремяОкончания = Неопределено) Экспорт\n"
" \n"
" Если ВремяОкончания = Неопределено Тогда\n"
" ВремяОкончания = ТекущаяДатаСеанса();\n"
" ИначеЕсли ВремяНачала > ВремяОкончания Тогда\n"
" ВызватьИсключение НСтр(\"ru = 'Дата окончания интервала не может быть меньше даты начала.'\");\n"
" КонецЕсли;\n"
" \n"
" ВеличинаИнтервала = ВремяОкончания - ВремяНачала;\n"
" ВеличинаИнтервалаВДнях = Цел(ВеличинаИнтервала/60/60/24);\n"
" \n"
" Если ВеличинаИнтервалаВДнях > 365 Тогда\n"
" ОписаниеИнтервала = НСтр(\"ru = 'более года'\");\n"
" ИначеЕсли ВеличинаИнтервалаВДнях > 31 Тогда\n"
" ОписаниеИнтервала = НСтр(\"ru = 'более месяца'\");\n"
" ИначеЕсли ВеличинаИнтервалаВДнях >= 1 Тогда\n"
" ОписаниеИнтервала = Формат(ВеличинаИнтервалаВДнях, \"ЧДЦ=0\") + \" \"\n"
" + ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(ВеличинаИнтервалаВДнях,\n"
" \"\", НСтр(\"ru = 'день,дня,дней,,,,,,0'\"));\n"
" Иначе\n"
" ОписаниеИнтервала = НСтр(\"ru = 'менее одного дня'\");\n"
" КонецЕсли;\n"
" \n"
" Возврат ОписаниеИнтервала;\n"
" \n"
"КонецФункции\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Функции для работы с настройкой рабочей даты.\n\n"
"// Сохраняет настройку рабочей даты пользователя.\n"
"//\n"
"// Параметры:\n"
"// НоваяРабочаяДата - Дата - дата, которую необходимо установить в качестве рабочей даты пользователя.\n"
"// ИмяПользователя - Строка - имя пользователя, для которого устанавливается рабочая дата.\n"
"// Если не задано, то устанавливается для текущего пользователя.\n"
"// \n"
"Процедура УстановитьРабочуюДатуПользователя(НоваяРабочаяДата, ИмяПользователя = Неопределено) Экспорт\n\n"
" КлючОбъекта = ВРег(\"РабочаяДата\");\n"
" \n"
" ХранилищеОбщихНастроекСохранить(КлючОбъекта, \"\", НоваяРабочаяДата, , ИмяПользователя);\n\n"
"КонецПроцедуры\n\n"
"// Возвращает значение настройки рабочей даты для пользователя.\n"
"//\n"
"// Параметры:\n"
"// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата.\n"
"// Если не задано, то устанавливается для текущего пользователя.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Дата - значение настройки рабочей даты пользователя или пустая дата, если настройка не задана.\n"
"//\n"
"Функция РабочаяДатаПользователя(ИмяПользователя = Неопределено) Экспорт\n\n"
" КлючОбъекта = ВРег(\"РабочаяДата\");\n\n"
" Результат = ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, \"\", '0001-01-01', , ИмяПользователя);\n"
" \n"
" Если ТипЗнч(Результат) <> Тип(\"Дата\") Тогда\n"
" Результат = '0001-01-01';\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает значение настройки рабочей даты для пользователя или текущей даты сеанса,\n"
"// если рабочая дата пользователя не задана.\n"
"//\n"
"// Параметры:\n"
"// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата.\n"
"// Если не задано, то устанавливается для текущего пользователя.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Дата - значение настройки рабочей даты пользователя или текущая дата сеанса, если настройка не задана.\n"
"//\n"
"Функция ТекущаяДатаПользователя(ИмяПользователя = Неопределено) Экспорт\n\n"
" Результат = РабочаяДатаПользователя(ИмяПользователя);\n"
" \n"
" Если НЕ ЗначениеЗаполнено(Результат) Тогда\n"
" Результат = ТекущаяДатаСеанса();\n"
" КонецЕсли;\n"
" \n"
" Возврат НачалоДня(Результат);\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область Данные\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Общие процедуры и функции для работы с прикладными типами и коллекциями значений.\n\n"
"// Возвращает строковое имя значения перечисления по его ссылке.\n"
"// Вызывает исключение, если передано несуществующее значение перечисления \n"
"// (например, удаленное в конфигурации или от отключенного расширения конфигурации).\n"
"//\n"
"// Параметры:\n"
"// Значение - ПеречислениеСсылка - значение, для которого необходимо получить имя перечисления.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка\n"
"//\n"
"// Пример:\n"
"// В результат будет помещено строковое значение \"ФизическоеЛицо\":\n"
"// Результат = ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо);\n"
"//\n"
"Функция ИмяЗначенияПеречисления(Значение) Экспорт\n"
" \n"
" ОбъектМетаданных = Значение.Метаданные();\n"
" ИндексЗначения = Перечисления[ОбъектМетаданных.Имя].Индекс(Значение);\n"
" Возврат ОбъектМетаданных.ЗначенияПеречисления[ИндексЗначения].Имя;\n"
" \n"
"КонецФункции \n\n"
"// Процедура удаляет из массива МассивРеквизитов элементы, соответствующие именам \n"
"// реквизитов объекта из массива МассивНепроверяемыхРеквизитов.\n"
"// Для использования в обработчиках события ОбработкаПроверкиЗаполнения.\n"
"//\n"
"// Параметры:\n"
"// МассивРеквизитов - Массив - коллекция имен реквизитов объекта.\n"
"// МассивНепроверяемыхРеквизитов - Массив - коллекция имен реквизитов объекта, не требующих проверки.\n"
"//\n"
"Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт\n"
" \n"
" Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл\n"
" \n"
" ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);\n"
" Если ПорядковыйНомер <> Неопределено Тогда\n"
" МассивРеквизитов.Удалить(ПорядковыйНомер);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"// Преобразует таблицу значений в массив структур.\n"
"// Может использоваться для передачи на клиент данных в том случае, если таблица\n"
"// значений содержит только такие значения, которые могут\n"
"// быть переданы с сервера на клиент.\n"
"//\n"
"// Полученный массив содержит структуры, каждая из которых повторяет\n"
"// структуру колонок таблицы значений.\n"
"//\n"
"// Не рекомендуется использовать для преобразования таблиц значений\n"
"// с большим количеством строк.\n"
"//\n"
"// Параметры:\n"
"// ТаблицаЗначений - ТаблицаЗначений - исходная таблица значений.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Массив - коллекция строк таблицы в виде структур.\n"
"//\n"
"Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт\n"
" \n"
" Массив = Новый Массив();\n"
" СтруктураСтрокой = \"\";\n"
" НужнаЗапятая = Ложь;\n"
" Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл\n"
" Если НужнаЗапятая Тогда\n"
" СтруктураСтрокой = СтруктураСтрокой + \",\";\n"
" КонецЕсли;\n"
" СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;\n"
" НужнаЗапятая = Истина;\n"
" КонецЦикла;\n"
" Для Каждого Строка Из ТаблицаЗначений Цикл\n"
" НоваяСтрока = Новый Структура(СтруктураСтрокой);\n"
" ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);\n"
" Массив.Добавить(НоваяСтрока);\n"
" КонецЦикла;\n"
" Возврат Массив;\n\n"
"КонецФункции\n\n"
"// Преобразует строку таблицы значений в структуру.\n"
"// Свойства структуры и их значения совпадают с колонками переданной строки.\n"
"//\n"
"// Параметры:\n"
"// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура - преобразованная строка таблицы значений.\n"
"//\n"
"Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт\n"
" \n"
" Структура = Новый Структура;\n"
" Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл\n"
" Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]);\n"
" КонецЦикла;\n"
" \n"
" Возврат Структура;\n"
" \n"
"КонецФункции\n\n"
"// Создает структуру, содержащую имена и значения измерений, ресурсов и реквизитов\n"
"// переданного менеджера записи регистра сведений.\n"
"//\n"
"// Параметры:\n"
"// МенеджерЗаписи - РегистрСведенийМенеджерЗаписиИмяРегистраСведений - менеджер записи, из которого надо получить структуру.\n"
"// МетаданныеРегистра - ОбъектМетаданныхРегистрСведений - метаданные регистра сведений.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура - коллекция измерений ресурсов и реквизитов, переданного менеджеру записи.\n"
"//\n"
"Функция СтруктураПоМенеджеруЗаписи(МенеджерЗаписи, МетаданныеРегистра) Экспорт\n"
" \n"
" ЗаписьКакСтруктура = Новый Структура;\n"
" \n"
" Если МетаданныеРегистра.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда\n"
" ЗаписьКакСтруктура.Вставить(\"Период\", МенеджерЗаписи.Период);\n"
" КонецЕсли;\n"
" Для Каждого Поле Из МетаданныеРегистра.Измерения Цикл\n"
" ЗаписьКакСтруктура.Вставить(Поле.Имя, МенеджерЗаписи[Поле.Имя]);\n"
" КонецЦикла;\n"
" Для Каждого Поле Из МетаданныеРегистра.Ресурсы Цикл\n"
" ЗаписьКакСтруктура.Вставить(Поле.Имя, МенеджерЗаписи[Поле.Имя]);\n"
" КонецЦикла;\n"
" Для Каждого Поле Из МетаданныеРегистра.Реквизиты Цикл\n"
" ЗаписьКакСтруктура.Вставить(Поле.Имя, МенеджерЗаписи[Поле.Имя]);\n"
" КонецЦикла;\n"
" \n"
" Возврат ЗаписьКакСтруктура;\n"
" \n"
"КонецФункции\n\n"
"// Создает массив и копирует в него значения, содержащиеся в колонке объекта, для\n"
"// которого доступен обход посредством оператора Для каждого … Из.\n"
"//\n"
"// Параметры:\n"
"// КоллекцияСтрок - ТаблицаЗначений\n"
"// - ДеревоЗначений\n"
"// - СписокЗначений\n"
"// - ТабличнаяЧасть\n"
"// - Соответствие\n"
"// - Структура - коллекция, колонку которой нужно выгрузить в массив.\n"
"// А так же другие объекты, для которых доступен обход\n"
"// посредством оператора Для каждого … Из … Цикл.\n"
"// ИмяКолонки - Строка - имя поля коллекции, значения которого нужно выгрузить.\n"
"// ТолькоУникальныеЗначения - Булево - если Истина, то в массив будут включены\n"
"// только различающиеся значения.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Массив - значения колонки.\n"
"//\n"
"Функция ВыгрузитьКолонку(КоллекцияСтрок, ИмяКолонки, ТолькоУникальныеЗначения = Ложь) Экспорт\n\n"
" МассивЗначений = Новый Массив;\n"
" \n"
" УникальныеЗначения = Новый Соответствие;\n"
" \n"
" Для каждого СтрокаКоллекции Из КоллекцияСтрок Цикл\n"
" Значение = СтрокаКоллекции[ИмяКолонки];\n"
" Если ТолькоУникальныеЗначения И УникальныеЗначения[Значение] <> Неопределено Тогда\n"
" Продолжить;\n"
" КонецЕсли;\n"
" МассивЗначений.Добавить(Значение);\n"
" УникальныеЗначения.Вставить(Значение, Истина);\n"
" КонецЦикла; \n"
" \n"
" Возврат МассивЗначений;\n"
" \n"
"КонецФункции\n\n"
"// Преобразует текст указанного формата XML в таблицу значений,\n"
"// при этом колонки таблицы формируются на основе описания в XML.\n"
"//\n"
"// Схема XML:\n"
"// <?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"// <xs:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"qualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
"// <xs:element name=\"Items\">\n"
"// <xs:complexType>\n"
"// <xs:sequence>\n"
"// <xs:element maxOccurs=\"unbounded\" name=\"Item\">\n"
"// <xs:complexType>\n"
"// <xs:attribute name=\"Code\" type=\"xs:integer\" use=\"required\" />\n"
"// <xs:attribute name=\"Name\" type=\"xs:string\" use=\"required\" />\n"
"// <xs:attribute name=\"Socr\" type=\"xs:string\" use=\"required\" />\n"
"// <xs:attribute name=\"Index\" type=\"xs:string\" use=\"required\" />\n"
"// </xs:complexType>\n"
"// </xs:element>\n"
"// </xs:sequence>\n"
"// <xs:attribute name=\"Description\" type=\"xs:string\" use=\"required\" />\n"
"// <xs:attribute name=\"Columns\" type=\"xs:string\" use=\"required\" />\n"
"// </xs:complexType>\n"
"// </xs:element>\n"
"// </xs:schema>\n"
"//\n"
"// Параметры:\n"
"// XML - Строка\n"
"// - ЧтениеXML - текст в формате XML или ЧтениеXML.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * ИмяТаблицы - Строка - имя таблицы.\n"
"// * Данные - ТаблицаЗначений - преобразованная из XML таблица.\n"
"//\n"
"// Пример:\n"
"// КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(\n"
"// Обработки.ЗагрузкаКурсовВалют.ПолучитьМакет(\"ОбщероссийскийКлассификаторВалют\").ПолучитьТекст()).Данные;\n"
"//\n"
"Функция ПрочитатьXMLВТаблицу(Знач XML) Экспорт\n"
" \n"
" Если ТипЗнч(XML) <> Тип(\"ЧтениеXML\") Тогда\n"
" Чтение = Новый ЧтениеXML;\n"
" Чтение.УстановитьСтроку(XML);\n"
" Иначе\n"
" Чтение = XML;\n"
" КонецЕсли;\n"
" \n"
" // Прочитаем первый узел и проверим его.\n"
" Если Не Чтение.Прочитать() Тогда\n"
" ВызватьИсключение НСтр(\"ru = 'Пустой XML'\");\n"
" ИначеЕсли Чтение.Имя <> \"Items\" Тогда\n"
" ВызватьИсключение НСтр(\"ru = 'Ошибка в структуре XML'\");\n"
" КонецЕсли;\n"
" \n"
" // Получим описание таблицы и создадим ее.\n"
" ИмяТаблицы = Чтение.ПолучитьАтрибут(\"Description\");\n"
" ИменаКолонок = СтрЗаменить(Чтение.ПолучитьАтрибут(\"Columns\"), \",\", Символы.ПС);\n"
" Колонок = СтрЧислоСтрок(ИменаКолонок);\n"
" \n"
" ТаблицаЗначений = Новый ТаблицаЗначений;\n"
" Для Сч = 1 По Колонок Цикл\n"
" ТаблицаЗначений.Колонки.Добавить(СтрПолучитьСтроку(ИменаКолонок, Сч), Новый ОписаниеТипов(\"Строка\"));\n"
" КонецЦикла;\n"
" \n"
" // Заполним значения в таблице.\n"
" Пока Чтение.Прочитать() Цикл\n"
" \n"
" Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = \"Items\" Тогда\n"
" Прервать;\n"
" ИначеЕсли Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда\n"
" Продолжить;\n"
" ИначеЕсли Чтение.Имя <> \"Item\" Тогда\n"
" ВызватьИсключение НСтр(\"ru = 'Ошибка в структуре XML'\");\n"
" КонецЕсли;\n"
" \n"
" новСтр = ТаблицаЗначений.Добавить();\n"
" Для Сч = 1 По Колонок Цикл\n"
" ИмяКолонки = СтрПолучитьСтроку(ИменаКолонок, Сч);\n"
" новСтр[Сч-1] = Чтение.ПолучитьАтрибут(ИмяКолонки);\n"
" КонецЦикла;\n"
" \n"
" КонецЦикла;\n"
" \n"
" // Заполним результат\n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"ИмяТаблицы\", ИмяТаблицы);\n"
" Результат.Вставить(\"Данные\", ТаблицаЗначений);\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Сравнивает две коллекции строк (ТаблицаЗначений, ДеревоЗначений и т.д.),\n"
"// для которых доступен обход посредством оператора Для каждого … Из … Цикл.\n"
"// Сравниваемые коллекции должны отвечать следующим требованиям:\n"
"// - доступен обход посредством оператора Для каждого … Из … Цикл,\n"
"// - наличие в обеих коллекциях всех колонок, перечисленных в параметре ИменаКолонок \n"
"// (если ИменаКолонок не заполнен - все колонки первой коллекции должны существовать во второй коллекции).\n"
"// Также позволяет сравнивать массивы.\n"
"//\n"
"// Параметры:\n"
"// КоллекцияСтрок1 - ТаблицаЗначений\n"
"// - ДеревоЗначений\n"
"// - СписокЗначений\n"
"// - ТабличнаяЧасть\n"
"// - Соответствие\n"
"// - Массив\n"
"// - ФиксированныйМассив\n"
"// - Структура - коллекция, отвечающая вышеописанным требованиям. А также другие\n"
"// объекты, для которых доступен обход посредством оператора Для каждого … Из … Цикл.\n"
"// КоллекцияСтрок2 - ТаблицаЗначений\n"
"// - ДеревоЗначений\n"
"// - СписокЗначений\n"
"// - ТабличнаяЧасть\n"
"// - Соответствие\n"
"// - Массив\n"
"// - ФиксированныйМассив\n"
"// - Структура - коллекция, отвечающая вышеописанным требованиям. А также другие\n"
"// объекты, для которых доступен обход посредством оператора Для каждого … Из … Цикл.\n"
"// ИменаКолонок - Строка - имена колонок через запятую, по которым производится сравнение.\n"
"// Не обязательно для коллекций, состав колонок которых можно определить автоматически:\n"
"// ТаблицаЗначений, СписокЗначений, Соответствие, Структура.\n"
"// Если не указан, то сравнение производится по колонкам первой коллекции.\n"
"// Для коллекций других типов является обязательным.\n"
"// ИсключаяКолонки - Строка - имена колонок, которые игнорируются при сравнении.\n"
"// УчитыватьПоследовательностьСтрок - Булево - если Истина, то коллекции признаются \n"
"// идентичными, только если одинаковые строки размещены в коллекциях на одинаковых местах.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если идентичны.\n"
"//\n"
"Функция КоллекцииИдентичны(КоллекцияСтрок1, КоллекцияСтрок2, Знач ИменаКолонок = \"\", Знач ИсключаяКолонки = \"\", \n"
" УчитыватьПоследовательностьСтрок = Ложь) Экспорт\n"
" \n"
" ТипКоллекции = ТипЗнч(КоллекцияСтрок1);\n"
" СравниваютсяМассивы = (ТипКоллекции = Тип(\"Массив\") Или ТипКоллекции = Тип(\"ФиксированныйМассив\"));\n"
" \n"
" СравниваемыеКолонки = Неопределено;\n"
" Если Не СравниваютсяМассивы Тогда\n"
" СравниваемыеКолонки = СравниваемыеКолонки(КоллекцияСтрок1, ИменаКолонок, ИсключаяКолонки);\n"
" КонецЕсли;\n"
" \n"
" Если УчитыватьПоследовательностьСтрок Тогда\n"
" Возврат СравнитьСУчетомПоследовательности(КоллекцияСтрок1, КоллекцияСтрок2, СравниваемыеКолонки);\n"
" ИначеЕсли СравниваютсяМассивы Тогда // Для массивов используется более простой алгоритм.\n"
" Возврат СравнитьМассивы(КоллекцияСтрок1, КоллекцияСтрок2);\n"
" Иначе\n"
" Возврат СравнитьБезУчетаПоследовательности(КоллекцияСтрок1, КоллекцияСтрок2, СравниваемыеКолонки);\n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"// Сравнивает данные сложной структуры с учетом вложенности.\n"
"//\n"
"// Параметры:\n"
"// Данные1 - Структура\n"
"// - ФиксированнаяСтруктура\n"
"// - Соответствие\n"
"// - ФиксированноеСоответствие\n"
"// - Массив\n"
"// - ФиксированныйМассив\n"
"// - ХранилищеЗначения\n"
"// - ТаблицаЗначений\n"
"// - Строка\n"
"// - Число\n"
"// - Булево - сравниваемые данные.\n"
"// Данные2 - Произвольный - те же типы, что и для параметра Данные1.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если совпадают.\n"
"//\n"
"Функция ДанныеСовпадают(Данные1, Данные2) Экспорт\n"
" \n"
" Если ТипЗнч(Данные1) <> ТипЗнч(Данные2) Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Если ТипЗнч(Данные1) = Тип(\"Структура\")\n"
" ИЛИ ТипЗнч(Данные1) = Тип(\"ФиксированнаяСтруктура\") Тогда\n"
" \n"
" Если Данные1.Количество() <> Данные2.Количество() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Для каждого КлючИЗначение Из Данные1 Цикл\n"
" СтароеЗначение = Неопределено;\n"
" \n"
" Если НЕ Данные2.Свойство(КлючИЗначение.Ключ, СтароеЗначение)\n"
" ИЛИ НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда\n"
" \n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Истина;\n"
" \n"
" ИначеЕсли ТипЗнч(Данные1) = Тип(\"Соответствие\")\n"
" ИЛИ ТипЗнч(Данные1) = Тип(\"ФиксированноеСоответствие\") Тогда\n"
" \n"
" Если Данные1.Количество() <> Данные2.Количество() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" КлючиНовогоСоответствия = Новый Соответствие;\n"
" \n"
" Для каждого КлючИЗначение Из Данные1 Цикл\n"
" КлючиНовогоСоответствия.Вставить(КлючИЗначение.Ключ, Истина);\n"
" СтароеЗначение = Данные2.Получить(КлючИЗначение.Ключ);\n"
" \n"
" Если НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Для каждого КлючИЗначение Из Данные2 Цикл\n"
" Если КлючиНовогоСоответствия[КлючИЗначение.Ключ] = Неопределено Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Истина;\n"
" \n"
" ИначеЕсли ТипЗнч(Данные1) = Тип(\"Массив\")\n"
" ИЛИ ТипЗнч(Данные1) = Тип(\"ФиксированныйМассив\") Тогда\n"
" \n"
" Если Данные1.Количество() <> Данные2.Количество() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Индекс = Данные1.Количество()-1;\n"
" Пока Индекс >= 0 Цикл\n"
" Если НЕ ДанныеСовпадают(Данные1.Получить(Индекс), Данные2.Получить(Индекс)) Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" Индекс = Индекс - 1;\n"
" КонецЦикла;\n"
" \n"
" Возврат Истина;\n"
" \n"
" ИначеЕсли ТипЗнч(Данные1) = Тип(\"ТаблицаЗначений\") Тогда\n"
" \n"
" Если Данные1.Количество() <> Данные2.Количество() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Если Данные1.Колонки.Количество() <> Данные2.Колонки.Количество() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Для каждого Колонка Из Данные1.Колонки Цикл\n"
" Если Данные2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Индекс = Данные1.Количество()-1;\n"
" Пока Индекс >= 0 Цикл\n"
" Если НЕ ДанныеСовпадают(Данные1[Индекс][Колонка.Имя], Данные2[Индекс][Колонка.Имя]) Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" Индекс = Индекс - 1;\n"
" КонецЦикла;\n"
" КонецЦикла;\n"
" \n"
" Возврат Истина;\n"
" \n"
" ИначеЕсли ТипЗнч(Данные1) = Тип(\"ХранилищеЗначения\") Тогда\n"
" \n"
" Если НЕ ДанныеСовпадают(Данные1.Получить(), Данные2.Получить()) Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" \n"
" Возврат Данные1 = Данные2;\n"
" \n"
"КонецФункции\n\n"
"// Фиксирует данные типов Структура, Соответствие, Массив с учетом вложенности.\n"
"//\n"
"// Параметры:\n"
"// Данные - Структура\n"
"// - Соответствие\n"
"// - Массив - коллекции, значения которых являются примитивными типами,\n"
"// хранилищем значения или не могут быть изменены. Поддерживаются типы значений:\n"
"// Булево, Строка, Число, Дата, Неопределено, УникальныйИдентификатор, Null, Тип,\n"
"// ХранилищеЗначения, ОбщийМодуль, ОбъектМетаданных, ТипЗначенияXDTO, ТипОбъектаXDTO,\n"
"// ЛюбаяСсылка.\n"
"//\n"
"// ВызыватьИсключение - Булево - начальное значение Истина. Когда установлено Ложь, тогда в случае наличия\n"
"// нефиксируемых данных исключение не будет вызвано, при этом данные будут\n"
"// зафиксированы на сколько возможно.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ФиксированнаяСтруктура, ФиксированноеСоответствие, ФиксированныйМассив - фиксированные данные, аналогичные\n"
"// переданным в параметре Данные.\n"
"// \n"
"Функция ФиксированныеДанные(Данные, ВызыватьИсключение = Истина) Экспорт\n"
" \n"
" Если ТипЗнч(Данные) = Тип(\"Массив\") Тогда\n"
" Массив = Новый Массив;\n"
" \n"
" Для каждого Значение Из Данные Цикл\n"
" \n"
" Если ТипЗнч(Значение) = Тип(\"Структура\")\n"
" ИЛИ ТипЗнч(Значение) = Тип(\"Соответствие\")\n"
" ИЛИ ТипЗнч(Значение) = Тип(\"Массив\") Тогда\n"
" \n"
" Массив.Добавить(ФиксированныеДанные(Значение, ВызыватьИсключение));\n"
" Иначе\n"
" Если ВызыватьИсключение Тогда\n"
" ПроверкаФиксированностиДанных(Значение, Истина);\n"
" КонецЕсли;\n"
" Массив.Добавить(Значение);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Новый ФиксированныйМассив(Массив);\n"
" \n"
" ИначеЕсли ТипЗнч(Данные) = Тип(\"Структура\")\n"
" ИЛИ ТипЗнч(Данные) = Тип(\"Соответствие\") Тогда\n"
" \n"
" Если ТипЗнч(Данные) = Тип(\"Структура\") Тогда\n"
" Коллекция = Новый Структура;\n"
" Иначе\n"
" Коллекция = Новый Соответствие;\n"
" КонецЕсли;\n"
" \n"
" Для каждого КлючИЗначение Из Данные Цикл\n"
" Значение = КлючИЗначение.Значение;\n"
" \n"
" Если ТипЗнч(Значение) = Тип(\"Структура\")\n"
" ИЛИ ТипЗнч(Значение) = Тип(\"Соответствие\")\n"
" ИЛИ ТипЗнч(Значение) = Тип(\"Массив\") Тогда\n"
" \n"
" Коллекция.Вставить(\n"
" КлючИЗначение.Ключ, ФиксированныеДанные(Значение, ВызыватьИсключение));\n"
" Иначе\n"
" Если ВызыватьИсключение Тогда\n"
" ПроверкаФиксированностиДанных(Значение, Истина);\n"
" КонецЕсли;\n"
" Коллекция.Вставить(КлючИЗначение.Ключ, Значение);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ТипЗнч(Данные) = Тип(\"Структура\") Тогда\n"
" Возврат Новый ФиксированнаяСтруктура(Коллекция);\n"
" Иначе\n"
" Возврат Новый ФиксированноеСоответствие(Коллекция);\n"
" КонецЕсли;\n"
" \n"
" ИначеЕсли ВызыватьИсключение Тогда\n"
" ПроверкаФиксированностиДанных(Данные);\n"
" КонецЕсли;\n"
" \n"
" Возврат Данные;\n"
" \n"
"КонецФункции\n\n"
"// Вычисляет контрольную сумму для произвольных данных по указанному алгоритму.\n"
"//\n"
"// Параметры:\n"
"// Данные - Произвольный - любое сериализуемое значение.\n"
"// Алгоритм - ХешФункция - алгоритм расчета контрольной суммы. По умолчанию, MD5.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - контрольная сумма строкой без пробелов (например 32 символа).\n"
"//\n"
"Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт\n"
" \n"
" Если Алгоритм = Неопределено Тогда\n"
" Алгоритм = ХешФункция.MD5;\n"
" КонецЕсли;\n"
" \n"
" ХешированиеДанных = Новый ХешированиеДанных(Алгоритм);\n"
" Если ТипЗнч(Данные) <> Тип(\"Строка\") И ТипЗнч(Данные) <> Тип(\"ДвоичныеДанные\") Тогда\n"
" Данные = ЗначениеВСтрокуXML(Данные);\n"
" КонецЕсли;\n"
" ХешированиеДанных.Добавить(Данные);\n"
" \n"
" Если ТипЗнч(ХешированиеДанных.ХешСумма) = Тип(\"ДвоичныеДанные\") Тогда \n"
" Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, \" \", \"\");\n"
" ИначеЕсли ТипЗнч(ХешированиеДанных.ХешСумма) = Тип(\"Число\") Тогда\n"
" Результат = Формат(ХешированиеДанных.ХешСумма, \"ЧГ=\");\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Сокращает строку до нужной длины, при этом обрезанная часть хешируется,\n"
"// обеспечивая уникальность строки. Проверяет длину строки на входе и, в случае\n"
"// превышения максимальной длины, преобразует ее конец по алгоритму MD5 в\n"
"// уникальную строку из 32 символов.\n"
"//\n"
"// Параметры:\n"
"// Строка - Строка - исходная строка произвольной длины.\n"
"// МаксимальнаяДлина - Число - требуемое максимальное количество символов в строке,\n"
"// минимальное значение: 32.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - строка, не превышающая максимальную длину.\n"
"//\n"
"Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина) Экспорт\n"
" \n"
" Если МаксимальнаяДлина < 32 Тогда\n"
" ОбщегоНазначенияКлиентСервер.Проверить(Ложь, \n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Параметр %1 не может быть меньше 32.'\"),\n"
" \"МаксимальнаяДлина\"), \"ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой\");\n"
" КонецЕсли;\n"
" \n"
" Результат = Строка;\n"
" Если СтрДлина(Строка) > МаксимальнаяДлина Тогда\n"
" Результат = Лев(Строка, МаксимальнаяДлина - 32);\n"
" ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);\n"
" ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1));\n"
" Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, \" \", \"\");\n"
" КонецЕсли;\n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Создает полную копию структуры, соответствия, массива, списка или таблицы значений, рекурсивно,\n"
"// с учетом типов дочерних элементов. При этом содержимое значений объектных типов\n"
"// (СправочникОбъект, ДокументОбъект и т.п.) не копируются, а возвращаются ссылки на исходный объект.\n"
"//\n"
"// Параметры:\n"
"// Источник - Структура\n"
"// - ФиксированнаяСтруктура\n"
"// - Соответствие\n"
"// - ФиксированноеСоответствие\n"
"// - Массив\n"
"// - ФиксированныйМассив\n"
"// - СписокЗначений - объект, который необходимо скопировать.\n"
"// ФиксироватьДанные - Булево - если Истина - фиксировать, если Ложь - снять фиксацию.\n"
"// - Неопределено - не изменять.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура, \n"
"// ФиксированнаяСтруктура,\n"
"// Соответствие\n"
"// ФиксированноеСоответствие\n"
"// Массив\n"
"// ФиксированныйМассив\n"
"// СписокЗначений - копия объекта, переданного в параметре Источник.\n"
"//\n"
"Функция СкопироватьРекурсивно(Источник, ФиксироватьДанные = Неопределено) Экспорт\n"
" \n"
" Перем Приемник;\n"
" \n"
" ТипИсточника = ТипЗнч(Источник);\n"
" \n"
" Если ТипИсточника = Тип(\"ТаблицаЗначений\") Тогда\n"
" Приемник = Источник.Скопировать();\n"
" СкопироватьЗначенияТаблицыЗначений(Приемник, ФиксироватьДанные);\n"
" ИначеЕсли ТипИсточника = Тип(\"ДеревоЗначений\") Тогда\n"
" Приемник = Источник.Скопировать();\n"
" СкопироватьЗначенияСтрокиДереваЗначений(Приемник.Строки, ФиксироватьДанные);\n"
" ИначеЕсли ТипИсточника = Тип(\"Структура\")\n"
" Или ТипИсточника = Тип(\"ФиксированнаяСтруктура\") Тогда\n"
" Приемник = СкопироватьСтруктуру(Источник, ФиксироватьДанные);\n"
" ИначеЕсли ТипИсточника = Тип(\"Соответствие\")\n"
" Или ТипИсточника = Тип(\"ФиксированноеСоответствие\") Тогда\n"
" Приемник = СкопироватьСоответствие(Источник, ФиксироватьДанные);\n"
" ИначеЕсли ТипИсточника = Тип(\"Массив\")\n"
" Или ТипИсточника = Тип(\"ФиксированныйМассив\") Тогда\n"
" Приемник = СкопироватьМассив(Источник, ФиксироватьДанные);\n"
" ИначеЕсли ТипИсточника = Тип(\"СписокЗначений\") Тогда\n"
" Приемник = СкопироватьСписокЗначений(Источник, ФиксироватьДанные);\n"
" Иначе\n"
" Приемник = Источник;\n"
" КонецЕсли;\n"
" \n"
" Возврат Приемник;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает описание предмета в виде текстовой строки.\n"
"// Для документов возвращается представление, для остальных ссылочных типов возвращается \n"
"// представление и тип в скобках, например, \"Ножницы (Номенклатура)\".\n"
"// Для пустых ссылок, Неопределено или незаполненных значений примитивных типов возвращается \"не задан\".\n"
"// \n"
"// Параметры:\n"
"// СсылкаНаПредмет - Произвольный.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - например, \"Ножницы (Номенклатура)\", \"Заказ клиента № 0001 от 01.01.2001\" или \"не задан\".\n"
"// \n"
"Функция ПредметСтрокой(СсылкаНаПредмет) Экспорт\n"
" \n"
" Если СсылкаНаПредмет <> Неопределено Тогда\n"
" Возврат ПредметыСтрокой(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаНаПредмет))[СсылкаНаПредмет];\n"
" Иначе\n"
" Возврат НСтр(\"ru = 'не задан'\");\n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает описания предметов СсылкиНаПредметы.\n"
"// Для документов возвращается представление, для остальных ссылочных типов возвращается \n"
"// представление и тип в скобках, например, \"Ножницы (Номенклатура)\".\n"
"// Для пустых ссылок или незаполненных значений примитивных типов возвращается \"не задан\".\n"
"// Значение \"удален\", если объект не существует в информационной базе.\n"
"// Значения Неопределено пропускаются.\n"
"// \n"
"// Параметры:\n"
"// СсылкиНаПредметы - Массив из ЛюбаяСсылка\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - ЛюбаяСсылка\n"
"// * Значение - Строка - например, \"Ножницы (Номенклатура)\", \"Заказ клиента № 0001 от 01.01.2001\" или \"не задан\".\n"
"// \n"
"Функция ПредметыСтрокой(Знач СсылкиНаПредметы) Экспорт\n"
" \n"
" ПроверяемыеСсылки = Новый Массив;\n"
" Результат = Новый Соответствие;\n"
" Для каждого СсылкаНаПредмет Из СсылкиНаПредметы Цикл\n"
" Если СсылкаНаПредмет = Неопределено Тогда\n"
" Результат[СсылкаНаПредмет] = НСтр(\"ru = 'не задан'\");\n"
" ИначеЕсли Не ЭтоСсылка(ТипЗнч(СсылкаНаПредмет)) Тогда \n"
" Результат[СсылкаНаПредмет] = Строка(СсылкаНаПредмет);\n"
" ИначеЕсли СсылкаНаПредмет.Пустая() Тогда \n"
" Результат[СсылкаНаПредмет] = НСтр(\"ru = 'не задан'\");\n"
" ИначеЕсли Метаданные.Перечисления.Содержит(СсылкаНаПредмет.Метаданные()) Тогда\n"
" Результат[СсылкаНаПредмет] = Строка(СсылкаНаПредмет);\n"
" Иначе\n"
" ПроверяемыеСсылки.Добавить(СсылкаНаПредмет);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Для каждого СуществующаяСсылка Из ПредставленияСсылок(ПроверяемыеСсылки) Цикл\n"
" СсылкаНаПредмет = СуществующаяСсылка.Ключ;\n"
" Результат[СсылкаНаПредмет] = СуществующаяСсылка.Значение;\n"
" Если Не Метаданные.Документы.Содержит(СсылкаНаПредмет.Метаданные()) Тогда\n"
" ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().ПредставлениеОбъекта;\n"
" Если ПустаяСтрока(ПредставлениеОбъекта) Тогда\n"
" ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().Представление();\n"
" КонецЕсли;\n"
" Результат[СсылкаНаПредмет] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\"%1 (%2)\", \n"
" Результат[СсылкаНаПредмет], ПредставлениеОбъекта);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает представления переданных ссылок.\n"
"//\n"
"// Параметры:\n"
"// ПроверяемыеСсылки - Массив из ЛюбаяСсылка, ЛюбаяСсылка\n"
"// \n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - ЛюбаяСсылка\n"
"// * Значение - Строка - представление ссылки или \"удален\", если ссылка не существует в информационной базе.\n"
"//\n"
"Функция ПредставленияСсылок(ПроверяемыеСсылки) Экспорт\n"
" \n"
" ОбъектыПоТипу = Новый Соответствие;\n"
" Если ТипЗнч(ПроверяемыеСсылки) = Тип(\"Массив\") Тогда\n"
" Для каждого ПроверяемаяСсылка Из ПроверяемыеСсылки Цикл\n"
" Объекты = ОбъектыПоТипу[ПроверяемаяСсылка.Метаданные()];\n"
" Если Объекты = Неопределено Тогда\n"
" Объекты = Новый Массив;\n"
" ОбъектыПоТипу[ПроверяемаяСсылка.Метаданные()] = Объекты;\n"
" КонецЕсли;\n"
" Объекты.Добавить(ПроверяемаяСсылка);\n"
" КонецЦикла; \n"
" Иначе\n"
" ОбъектыПоТипу[ПроверяемыеСсылки.Метаданные()] = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПроверяемыеСсылки);\n"
" КонецЕсли;\n"
" \n"
" Результат = Новый Соответствие;\n"
" Если ОбъектыПоТипу.Количество() = 0 Тогда\n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" Запрос = Новый Запрос;\n"
" ТекстыЗапросов = Новый Массив;\n"
" Индекс = 0;\n"
" Для каждого ТипОбъекта Из ОбъектыПоТипу Цикл\n"
" \n"
" ТекстЗапроса = \n"
" \"ВЫБРАТЬ РАЗРЕШЕННЫЕ\n"
" | Представление КАК Представление,\n"
" | Таблица.Ссылка КАК Ссылка\n"
" |ИЗ\n"
" | &ИмяТаблицы КАК Таблица\n"
" |ГДЕ\n"
" | Таблица.Ссылка В (&Ссылка)\";\n"
" \n"
" Если ТекстыЗапросов.Количество() > 0 Тогда\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"ВЫБРАТЬ РАЗРЕШЕННЫЕ\", \"ВЫБРАТЬ\"); // @query-part-1, @query-part-2\n"
" КонецЕсли;\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ИмяТаблицы\", ТипОбъекта.Ключ.ПолноеИмя());\n"
" \n"
" ИмяПараметра = \"Ссылка\" + Формат(Индекс, \"ЧГ=;ЧН=\");\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&Ссылка\", \"&\" + ИмяПараметра);\n"
" ТекстыЗапросов.Добавить(ТекстЗапроса);\n"
" Запрос.УстановитьПараметр(ИмяПараметра, ТипОбъекта.Значение);\n\n"
" Индекс = Индекс + 1;\n"
" КонецЦикла;\n"
" \n"
" Запрос.Текст = СтрСоединить(ТекстыЗапросов, Символы.ПС + \"ОБЪЕДИНИТЬ ВСЕ\" + Символы.ПС); // @query-part;\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" ФактическиеСсылки = Запрос.Выполнить().Выгрузить();\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" \n"
" ПредставленияСсылок = Запрос.Выполнить().Выгрузить();\n"
" ПредставленияСсылок.Индексы.Добавить(\"Ссылка\");\n"
" \n"
" Для каждого Ссылка Из ФактическиеСсылки Цикл\n"
" Если ЗначениеЗаполнено(Ссылка.Ссылка) Тогда\n"
" ПредставлениеСсылки = ПредставленияСсылок.Найти(Ссылка.Ссылка, \"Ссылка\");\n"
" Результат[Ссылка.Ссылка] = ?(ПредставлениеСсылки <> Неопределено, \n"
" ПредставлениеСсылки.Представление, Строка(Ссылка.Ссылка));\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Для каждого Ссылка Из ПроверяемыеСсылки Цикл\n"
" Если Результат[Ссылка] = Неопределено Тогда\n"
" Результат[Ссылка] = НСтр(\"ru = 'удален'\");\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ДинамическийСписок\n\n"
"// Создает структуру для второго параметра СвойстваСписка процедуры УстановитьСвойстваДинамическогоСписка.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура - любое поле может иметь значение Неопределено, если оно не устанавливается:\n"
"// * ТекстЗапроса - Строка - новый текст запроса.\n"
"// * ОсновнаяТаблица - Строка - имя основной таблицы.\n"
"// * ДинамическоеСчитываниеДанных - Булево - признак использования динамического считывания.\n"
"//\n"
"Функция СтруктураСвойствДинамическогоСписка() Экспорт\n"
" \n"
" Возврат Новый Структура(\"ТекстЗапроса, ОсновнаяТаблица, ДинамическоеСчитываниеДанных\");\n"
" \n"
"КонецФункции\n\n"
"// Установить текст запроса, основную таблицу или динамическое считывание в динамическом списке.\n"
"// Устанавливать эти свойства следует за один вызов этой процедуры, чтобы не снижалась производительность.\n"
"//\n"
"// Параметры:\n"
"// Список - ТаблицаФормы - элемент формы динамического списка, для которого устанавливаются свойства.\n"
"// СвойстваСписка - см. СтруктураСвойствДинамическогоСписка\n"
"//\n"
"Процедура УстановитьСвойстваДинамическогоСписка(Список, СвойстваСписка) Экспорт\n"
" \n"
" Форма = Список.Родитель;\n"
" ТипФормаКлиентскогоПриложения = Тип(\"ФормаКлиентскогоПриложения\");\n"
" \n"
" Пока ТипЗнч(Форма) <> ТипФормаКлиентскогоПриложения Цикл\n"
" Форма = Форма.Родитель;\n"
" КонецЦикла;\n"
" \n"
" ДинамическийСписок = Форма[Список.ПутьКДанным];\n"
" ТекстЗапроса = СвойстваСписка.ТекстЗапроса;\n"
" \n"
" Если Не ПустаяСтрока(ТекстЗапроса) Тогда\n"
" ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;\n"
" КонецЕсли;\n"
" \n"
" ОсновнаяТаблица = СвойстваСписка.ОсновнаяТаблица;\n"
" \n"
" Если ОсновнаяТаблица <> Неопределено Тогда\n"
" ДинамическийСписок.ОсновнаяТаблица = ОсновнаяТаблица;\n"
" КонецЕсли;\n"
" \n"
" ДинамическоеСчитываниеДанных = СвойстваСписка.ДинамическоеСчитываниеДанных;\n"
" \n"
" Если ТипЗнч(ДинамическоеСчитываниеДанных) = Тип(\"Булево\") Тогда\n"
" ДинамическийСписок.ДинамическоеСчитываниеДанных = ДинамическоеСчитываниеДанных;\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#Область ВнешнееСоединение\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Процедуры и функции для работы с внешним соединением.\n\n"
"// Возвращает CLSID COM-класса для работы с \"1С:Предприятием 8\" через COM-соединение.\n"
"//\n"
"// Параметры:\n"
"// ИмяCOMСоединителя - Строка - имя COM-класса для работы с \"1С:Предприятием 8\" через COM-соединение.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - строковое представление CLSID.\n"
"//\n"
"Функция ИдентификаторCOMСоединителя(Знач ИмяCOMСоединителя) Экспорт\n"
" \n"
" Если ИмяCOMСоединителя = \"v83.COMConnector\" Тогда\n"
" Возврат \"181E893D-73A4-4722-B61D-D604B3D67D47\";\n"
" КонецЕсли;\n"
" \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'На задан CLSID для класса %1.'\"), \n"
" ИмяCOMСоединителя);\n"
" \n"
"КонецФункции\n\n"
"// Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель\n"
"// на это соединение.\n"
"// \n"
"// Параметры:\n"
"// Параметры - см. ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения\n"
"// \n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * Соединение - COMОбъект\n"
"// - Неопределено - COM-объект соединения или Неопределено в случае ошибки;\n"
"// * КраткоеОписаниеОшибки - Строка - краткое описание ошибки;\n"
"// * ПодробноеОписаниеОшибки - Строка - подробное описание ошибки;\n"
"// * ОшибкаПодключенияКомпоненты - Булево - флаг ошибки подключения COM.\n"
"//\n"
"Функция УстановитьВнешнееСоединениеСБазой(Параметры) Экспорт\n"
" \n"
" ПодключениеНедоступно = ЭтоLinuxСервер();\n"
" КраткоеОписаниеОшибки = НСтр(\"ru = 'Прямое подключение к информационной базе недоступно на сервере под управлением ОС Linux.'\");\n"
" \n"
" Возврат ОбщегоНазначенияСлужебныйКлиентСервер.УстановитьВнешнееСоединениеСБазой(Параметры, ПодключениеНедоступно, КраткоеОписаниеОшибки);\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область Метаданные\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Функции определения типов объектов метаданных.\n\n"
"// Ссылочные типы данных\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Документ\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к документам.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является документом.\n"
"//\n"
"Функция ЭтоДокумент(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.Документы.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Справочник\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является справочником.\n"
"//\n"
"Функция ЭтоСправочник(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.Справочники.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Перечисление\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является перечислением.\n"
"//\n"
"Функция ЭтоПеречисление(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.Перечисления.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"План обмена\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является планом обмена.\n"
"//\n"
"Функция ЭтоПланОбмена(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"План видов характеристик\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является планом видов характеристик.\n"
"//\n"
"Функция ЭтоПланВидовХарактеристик(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Бизнес-процесс\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является бизнес-процессом.\n"
"//\n"
"Функция ЭтоБизнесПроцесс(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Задача\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является задачей.\n"
"//\n"
"Функция ЭтоЗадача(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.Задачи.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"План счетов\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является планом счетов.\n"
"//\n"
"Функция ЭтоПланСчетов(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"План видов расчета\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является планом видов расчета.\n"
"//\n"
"Функция ЭтоПланВидовРасчета(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Регистры\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Регистр сведений\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является регистром сведений.\n"
"//\n"
"Функция ЭтоРегистрСведений(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Регистр накопления\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является регистром накопления.\n"
"//\n"
"Функция ЭтоРегистрНакопления(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Регистр бухгалтерии\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является регистром бухгалтерии.\n"
"//\n"
"Функция ЭтоРегистрБухгалтерии(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Регистр расчета\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является регистром расчета.\n"
"//\n"
"Функция ЭтоРегистрРасчета(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Константы\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Константа\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является константой.\n"
"//\n"
"Функция ЭтоКонстанта(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.Константы.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Журналы документов\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Журнал документов\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является журналом документов.\n"
"//\n"
"Функция ЭтоЖурналДокументов(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Последовательности\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Последовательности\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является последовательностью.\n"
"//\n"
"Функция ЭтоПоследовательность(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.Последовательности.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// РегламентныеЗадания\n\n"
"// Определяет принадлежность объекта метаданных к общему типу \"Регламентные задания\".\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является регламентным заданием.\n"
"//\n"
"Функция ЭтоРегламентноеЗадание(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Общие\n\n"
"// Определяет принадлежность объекта метаданных к типу регистр.\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект является каким-либо регистром.\n"
"//\n"
"Функция ЭтоРегистр(ОбъектМетаданных) Экспорт\n"
" \n"
" Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных)\n"
" Или Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)\n"
" Или Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных)\n"
" Или Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных);\n"
" \n"
"КонецФункции\n\n"
"// Определяет принадлежность объекта метаданных к ссылочному типу.\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо определить принадлежность к заданному типу.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект ссылочного типа.\n"
"//\n"
"Функция ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) Экспорт\n"
" \n"
" ИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя();\n"
" Позиция = СтрНайти(ИмяОбъектаМетаданных, \".\");\n"
" Если Позиция > 0 Тогда \n"
" ИмяБазовогоТипа = Лев(ИмяОбъектаМетаданных, Позиция - 1);\n"
" Возврат ИмяБазовогоТипа = \"Справочник\"\n"
" Или ИмяБазовогоТипа = \"Документ\"\n"
" Или ИмяБазовогоТипа = \"БизнесПроцесс\"\n"
" Или ИмяБазовогоТипа = \"Задача\"\n"
" Или ИмяБазовогоТипа = \"ПланСчетов\"\n"
" Или ИмяБазовогоТипа = \"ПланОбмена\"\n"
" Или ИмяБазовогоТипа = \"ПланВидовХарактеристик\"\n"
" Или ИмяБазовогоТипа = \"ПланВидовРасчета\";\n"
" Иначе\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Процедуры и функции для работы с типами, объектами метаданных и их строковыми представлениями.\n\n"
"// Возвращает имена реквизитов объекта заданного типа.\n"
"//\n"
"// Параметры:\n"
"// Ссылка - ЛюбаяСсылка - ссылка на элемент базы данных, для которого требуется получить результат функции;\n"
"// Тип - Тип - тип значения реквизита.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - строка реквизитов объекта метаданных конфигурации, разделенных символом \",\".\n"
"//\n"
"// Пример:\n"
"// РеквизитыОрганизации = ОбщегоНазначения.ИменаРеквизитовПоТипу(Документ.Ссылка, Тип(\"СправочникСсылка.Организации\"));\n"
"//\n"
"Функция ИменаРеквизитовПоТипу(Ссылка, Тип) Экспорт\n"
" \n"
" Результат = \"\";\n"
" МетаданныеОбъекта = Ссылка.Метаданные();\n"
" \n"
" Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл\n"
" Если Реквизит.Тип.СодержитТип(Тип) Тогда\n"
" Результат = Результат + ?(ПустаяСтрока(Результат), \"\", \", \") + Реквизит.Имя;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Возвращает имя базового типа по переданному значению объекта метаданных.\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект метаданных, по которому необходимо определить базовый тип.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - имя базового типа по переданному значению объекта метаданных.\n"
"//\n"
"// Пример:\n"
"// ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Метаданные.Справочники.Номенклатура); = \"Справочники\".\n"
"//\n"
"Функция ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) Экспорт\n"
" \n"
" Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Документы\";\n"
" \n"
" ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Справочники\";\n"
" \n"
" ИначеЕсли Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Перечисления\";\n"
" \n"
" ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"РегистрыСведений\";\n"
" \n"
" ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"РегистрыНакопления\";\n"
" \n"
" ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"РегистрыБухгалтерии\";\n"
" \n"
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"РегистрыРасчета\";\n"
" \n"
" ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПланыОбмена\";\n"
" \n"
" ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПланыВидовХарактеристик\";\n"
" \n"
" ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"БизнесПроцессы\";\n"
" \n"
" ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Задачи\";\n"
" \n"
" ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПланыСчетов\";\n"
" \n"
" ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПланыВидовРасчета\";\n"
" \n"
" ИначеЕсли Метаданные.Константы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Константы\";\n"
" \n"
" ИначеЕсли Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ЖурналыДокументов\";\n"
" \n"
" ИначеЕсли Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Последовательности\";\n"
" \n"
" ИначеЕсли Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"РегламентныеЗадания\";\n"
" \n"
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных.Родитель())\n"
" И ОбъектМетаданных.Родитель().Перерасчеты.Найти(ОбъектМетаданных.Имя) = ОбъектМетаданных Тогда\n"
" Возврат \"Перерасчеты\";\n"
" \n"
" ИначеЕсли Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Обработки\";\n"
" \n"
" ИначеЕсли Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Отчеты\";\n"
" \n"
" ИначеЕсли Метаданные.Подсистемы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Подсистемы\";\n"
" \n"
" ИначеЕсли Метаданные.ОбщиеМодули.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ОбщиеМодули\";\n"
" \n"
" ИначеЕсли Метаданные.ПараметрыСеанса.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПараметрыСеанса\";\n"
" \n"
" ИначеЕсли Метаданные.Роли.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Роли\";\n"
" \n"
" ИначеЕсли Метаданные.ОбщиеРеквизиты.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ОбщиеРеквизиты\";\n"
" \n"
" ИначеЕсли Метаданные.КритерииОтбора.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"КритерииОтбора\";\n"
" \n"
" ИначеЕсли Метаданные.ПодпискиНаСобытия.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПодпискиНаСобытия\";\n"
" \n"
" ИначеЕсли Метаданные.ФункциональныеОпции.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ФункциональныеОпции\";\n"
" \n"
" ИначеЕсли Метаданные.ПараметрыФункциональныхОпций.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПараметрыФункциональныхОпций\";\n"
" \n"
" ИначеЕсли Метаданные.ХранилищаНастроек.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ХранилищаНастроек\";\n"
" \n"
" ИначеЕсли Метаданные.ОбщиеФормы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ОбщиеФормы\";\n"
" \n"
" ИначеЕсли Метаданные.ОбщиеКоманды.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ОбщиеКоманды\";\n"
" \n"
" ИначеЕсли Метаданные.ГруппыКоманд.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ГруппыКоманд\";\n"
" \n"
" ИначеЕсли Метаданные.ОбщиеМакеты.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ОбщиеМакеты\";\n"
" \n"
" ИначеЕсли Метаданные.ОбщиеКартинки.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ОбщиеКартинки\";\n"
" \n"
" ИначеЕсли Метаданные.ПакетыXDTO.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ПакетыXDTO\";\n"
" \n"
" ИначеЕсли Метаданные.WebСервисы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"WebСервисы\";\n"
" \n"
" ИначеЕсли Метаданные.WSСсылки.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"WSСсылки\";\n"
" \n"
" ИначеЕсли Метаданные.Стили.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Стили\";\n"
" \n"
" ИначеЕсли Метаданные.Языки.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"Языки\";\n"
" \n"
" ИначеЕсли Метаданные.ВнешниеИсточникиДанных.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат \"ВнешниеИсточникиДанных\";\n"
" \n"
" Иначе\n"
" \n"
" Возврат \"\";\n"
" \n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает менеджер объекта по полному имени объекта метаданных.\n"
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов.\n"
"//\n"
"// Параметры:\n"
"// ПолноеИмя - Строка - полное имя объекта метаданных. Пример: \"Справочник.Организации\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта.\n"
"// \n"
"// Пример:\n"
"// МенеджерСправочника = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(\"Справочник.Организации\");\n"
"// ПустаяСсылка = МенеджерСправочника.ПустаяСсылка();\n"
"//\n"
"Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) Экспорт\n"
" \n"
" Перем КлассОМ, ИмяОМ, Менеджер;\n"
" \n"
" ЧастиИмени = СтрРазделить(ПолноеИмя, \".\");\n"
" \n"
" Если ЧастиИмени.Количество() >= 2 Тогда\n"
" КлассОМ = ЧастиИмени[0];\n"
" ИмяОМ = ЧастиИмени[1];\n"
" Иначе \n"
" Менеджер = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" Если ВРег(КлассОМ) = \"ПЛАНОБМЕНА\" Тогда\n"
" Менеджер = ПланыОбмена;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"СПРАВОЧНИК\" Тогда\n"
" Менеджер = Справочники;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ДОКУМЕНТ\" Тогда\n"
" Менеджер = Документы;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ЖУРНАЛДОКУМЕНТОВ\" Тогда\n"
" Менеджер = ЖурналыДокументов;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ПЕРЕЧИСЛЕНИЕ\" Тогда\n"
" Менеджер = Перечисления;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ОТЧЕТ\" Тогда\n"
" Менеджер = Отчеты;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ОБРАБОТКА\" Тогда\n"
" Менеджер = Обработки;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ПЛАНВИДОВХАРАКТЕРИСТИК\" Тогда\n"
" Менеджер = ПланыВидовХарактеристик;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ПЛАНСЧЕТОВ\" Тогда\n"
" Менеджер = ПланыСчетов;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ПЛАНВИДОВРАСЧЕТА\" Тогда\n"
" Менеджер = ПланыВидовРасчета;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"РЕГИСТРСВЕДЕНИЙ\" Тогда\n"
" Менеджер = РегистрыСведений;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"РЕГИСТРНАКОПЛЕНИЯ\" Тогда\n"
" Менеджер = РегистрыНакопления;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"РЕГИСТРБУХГАЛТЕРИИ\" Тогда\n"
" Менеджер = РегистрыБухгалтерии;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"РЕГИСТРРАСЧЕТА\" Тогда\n"
" \n"
" Если ЧастиИмени.Количество() = 2 Тогда\n"
" Менеджер = РегистрыРасчета;\n"
" \n"
" ИначеЕсли ЧастиИмени.Количество() = 4 Тогда\n"
" КлассПодчиненногоОМ = ЧастиИмени[2];\n"
" ИмяПодчиненногоОМ = ЧастиИмени[3];\n"
" \n"
" Если ВРег(КлассПодчиненногоОМ) = \"ПЕРЕРАСЧЕТ\" Тогда \n"
" Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты;\n"
" ИмяОм = ИмяПодчиненногоОМ;\n"
" \n"
" Иначе \n"
" Менеджер = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" Иначе\n"
" Менеджер = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"БИЗНЕСПРОЦЕСС\" Тогда\n"
" Менеджер = БизнесПроцессы;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ЗАДАЧА\" Тогда\n"
" Менеджер = Задачи;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"КОНСТАНТА\" Тогда\n"
" Менеджер = Константы;\n"
" \n"
" ИначеЕсли ВРег(КлассОМ) = \"ПОСЛЕДОВАТЕЛЬНОСТЬ\" Тогда\n"
" Менеджер = Последовательности;\n"
" \n"
" Иначе\n"
" Менеджер = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" Если Менеджер = Неопределено Тогда\n"
" ПроверитьОбъектМетаданныхСуществует(ПолноеИмя);\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Объект метаданных \"\"%1\"\" не имеет менеджера объекта.'\"), ПолноеИмя);\n"
" КонецЕсли;\n"
" \n"
" Попытка\n"
" Возврат Менеджер[ИмяОМ];\n"
" Исключение\n"
" ПроверитьОбъектМетаданныхСуществует(ПолноеИмя);\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает менеджер объекта по ссылке на объект.\n"
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов.\n"
"// См. также ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени.\n"
"//\n"
"// Параметры:\n"
"// Ссылка - ЛюбаяСсылка - объект, менеджер которого требуется получить.\n"
"//\n"
"// Возвращаемое значение:\n"
"// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта.\n"
"//\n"
"// Пример:\n"
"// МенеджерСправочника = ОбщегоНазначения.МенеджерОбъектаПоСсылке(СсылкаНаОрганизацию);\n"
"// ПустаяСсылка = МенеджерСправочника.ПустаяСсылка();\n"
"//\n"
"Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт\n"
" \n"
" ИмяОбъекта = Ссылка.Метаданные().Имя;\n"
" ТипСсылки = ТипЗнч(Ссылка);\n"
" \n"
" Если Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат Справочники[ИмяОбъекта];\n"
" \n"
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат Документы[ИмяОбъекта];\n"
" \n"
" ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат БизнесПроцессы[ИмяОбъекта];\n"
" \n"
" ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат ПланыВидовХарактеристик[ИмяОбъекта];\n"
" \n"
" ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат ПланыСчетов[ИмяОбъекта];\n"
" \n"
" ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат ПланыВидовРасчета[ИмяОбъекта];\n"
" \n"
" ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат Задачи[ИмяОбъекта];\n"
" \n"
" ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат ПланыОбмена[ИмяОбъекта];\n"
" \n"
" ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда\n"
" Возврат Перечисления[ИмяОбъекта];\n"
" Иначе\n"
" Возврат Неопределено;\n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"// Проверка того, что переданный тип является ссылочным типом данных.\n"
"// Для типа Неопределено возвращается Ложь.\n"
"//\n"
"// Параметры:\n"
"// ПроверяемыйТип - Тип - для проверки на ссылочный тип данных.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если это ссылка.\n"
"//\n"
"Функция ЭтоСсылка(ПроверяемыйТип) Экспорт\n"
" \n"
" Возврат ПроверяемыйТип <> Тип(\"Неопределено\") И ОписаниеТипаВсеСсылки().СодержитТип(ПроверяемыйТип);\n"
" \n"
"КонецФункции\n\n"
"// Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки.\n"
"//\n"
"// Параметры:\n"
"// ПроверяемаяСсылка - ЛюбаяСсылка - значение любой ссылки информационной базы данных.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если существует.\n"
"//\n"
"Функция СсылкаСуществует(ПроверяемаяСсылка) Экспорт\n"
" \n"
" ТекстЗапроса = \n"
" \"ВЫБРАТЬ ПЕРВЫЕ 1\n"
" | 1 КАК Поле1\n"
" |ИЗ\n"
" | &ИмяТаблицы КАК Таблица\n"
" |ГДЕ\n"
" | Таблица.Ссылка = &Ссылка\";\n"
" \n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ИмяТаблицы\", ИмяТаблицыПоСсылке(ПроверяемаяСсылка));\n"
" \n"
" Запрос = Новый Запрос;\n"
" Запрос.Текст = ТекстЗапроса;\n"
" Запрос.УстановитьПараметр(\"Ссылка\", ПроверяемаяСсылка);\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" Возврат НЕ Запрос.Выполнить().Пустой();\n"
" \n"
"КонецФункции\n\n"
"// Возвращает имя вида объектов метаданных по ссылке на объект.\n"
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов.\n"
"// См. так же ВидОбъектаПоТипу.\n"
"//\n"
"// Параметры:\n"
"// Ссылка - ЛюбаяСсылка - объект, вид которого требуется получить.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - имя вида объектов метаданных. Например: \"Справочник\", \"Документ\".\n"
"// \n"
"Функция ВидОбъектаПоСсылке(Ссылка) Экспорт\n"
" \n"
" Возврат ВидОбъектаПоТипу(ТипЗнч(Ссылка));\n"
" \n"
"КонецФункции \n\n"
"// Возвращает имя вида объектов метаданных по типу объекта.\n"
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов.\n"
"// См. так же ВидОбъектаПоСсылке.\n"
"//\n"
"// Параметры:\n"
"// ТипОбъекта - Тип - тип прикладного объекта, определенный в конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - имя вида объектов метаданных. Например: \"Справочник\", \"Документ\".\n"
"// \n"
"Функция ВидОбъектаПоТипу(ТипОбъекта) Экспорт\n"
" \n"
" Если Справочники.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"Справочник\";\n"
" \n"
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"Документ\";\n"
" \n"
" ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"БизнесПроцесс\";\n"
" \n"
" ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"ПланВидовХарактеристик\";\n"
" \n"
" ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"ПланСчетов\";\n"
" \n"
" ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"ПланВидовРасчета\";\n"
" \n"
" ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"Задача\";\n"
" \n"
" ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"ПланОбмена\";\n"
" \n"
" ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипОбъекта) Тогда\n"
" Возврат \"Перечисление\";\n"
" \n"
" Иначе\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Неверный тип значения параметра (%1)'\"), Строка(ТипОбъекта));\n"
" \n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает полное имя объекта метаданных по переданному значению ссылки.\n"
"//\n"
"// Параметры:\n"
"// Ссылка - ЛюбаяСсылка - объект, для которого необходимо получить имя таблицы ИБ.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - полное имя объекта метаданных для указанного объекта. Например: \"Справочник.Номенклатура\".\n"
"//\n"
"Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт\n"
" \n"
" Возврат Ссылка.Метаданные().ПолноеИмя();\n"
" \n"
"КонецФункции\n\n"
"// Проверяет, что переданное значение имеет ссылочный тип данных.\n"
"//\n"
"// Параметры:\n"
"// Значение - Произвольный - проверяемое значение.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если тип значения ссылочный.\n"
"//\n"
"Функция ЗначениеСсылочногоТипа(Значение) Экспорт\n"
" \n"
" Возврат ЭтоСсылка(ТипЗнч(Значение));\n"
" \n"
"КонецФункции\n\n"
"// Проверяет, является ли элемент справочника или плана видов характеристик группой элементов.\n"
"//\n"
"// Параметры:\n"
"// Объект - СправочникСсылка\n"
"// - ПланВидовХарактеристикСсылка\n"
"// - СправочникОбъект\n"
"// - ПланВидовХарактеристикОбъект - проверяемый объект.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево\n"
"//\n"
"Функция ОбъектЯвляетсяГруппой(Объект) Экспорт\n"
" \n"
" Если ЗначениеСсылочногоТипа(Объект) Тогда\n"
" Ссылка = Объект;\n"
" Иначе\n"
" Ссылка = Объект.Ссылка;\n"
" КонецЕсли;\n"
" \n"
" МетаданныеОбъекта = Ссылка.Метаданные();\n"
" Если ЭтоСправочник(МетаданныеОбъекта) Тогда\n"
" Если Не МетаданныеОбъекта.Иерархический\n"
" Или МетаданныеОбъекта.ВидИерархии <> Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" ИначеЕсли Не ЭтоПланВидовХарактеристик(МетаданныеОбъекта) Или Не МетаданныеОбъекта.Иерархический Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Если Ссылка <> Объект Тогда\n"
" Возврат Объект.ЭтоГруппа;\n"
" КонецЕсли;\n"
" \n"
" Возврат ЗначениеРеквизитаОбъекта(Ссылка, \"ЭтоГруппа\") = Истина;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает ссылку, соответствующую объекту метаданных, для использования в базе данных.\n"
"// См. также ОбщегоНазначения.ИдентификаторыОбъектовМетаданных.\n"
"//\n"
"// Ссылки возвращаются для следующих объектов метаданных:\n"
"// - Подсистемы (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);\n"
"// - Роли (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);\n"
"// - ПланыОбмена;\n"
"// - Константы;\n"
"// - Справочники;\n"
"// - Документы;\n"
"// - ЖурналыДокументов;\n"
"// - Отчеты;\n"
"// - Обработки;\n"
"// - ПланыВидовХарактеристик;\n"
"// - ПланыСчетов;\n"
"// - ПланыВидовРасчета;\n"
"// - РегистрыСведений;\n"
"// - РегистрыНакопления;\n"
"// - РегистрыБухгалтерии;\n"
"// - РегистрыРасчета;\n"
"// - БизнесПроцессы;\n"
"// - Задачи.\n"
"// \n"
"// Параметры:\n"
"// ОписаниеОбъектаМетаданных - ОбъектМетаданных - объект метаданных конфигурации;\n"
"// - Тип - тип, который можно использовать в функции Метаданные.НайтиПоТипу;\n"
"// - Строка - полное имя объекта метаданных, которое можно \n"
"// использовать в функции Метаданные.НайтиПоПолномуИмени.\n"
"//\n"
"// ВызыватьИсключение - Булево - если Ложь, то вместо вызова исключения возвращается Null для несуществующего\n"
"// или неподдерживаемого объекта метаданных.\n"
"//\n"
"// Возвращаемое значение:\n"
"// СправочникСсылка.ИдентификаторыОбъектовМетаданных\n"
"// СправочникСсылка.ИдентификаторыОбъектовРасширений\n"
"// Null\n"
"// \n"
"// Пример:\n"
"// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Ссылка));\n"
"// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных);\n"
"// Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(\"Справочник.Организации\");\n"
"//\n"
"Функция ИдентификаторОбъектаМетаданных(ОписаниеОбъектаМетаданных, ВызыватьИсключение = Истина) Экспорт\n"
" \n"
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданных(\n"
" ОписаниеОбъектаМетаданных, ВызыватьИсключение);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает ссылки, соответствующие объектам метаданных, для использования в базе данных.\n"
"// См. также ОбщегоНазначения.ИдентификаторОбъектаМетаданных.\n"
"//\n"
"// Ссылки возвращаются для следующих объектов метаданных:\n"
"// - Подсистемы (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);\n"
"// - Роли (см. также ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных);\n"
"// - ПланыОбмена.\n"
"// - Константы.\n"
"// - Справочники.\n"
"// - Документы.\n"
"// - ЖурналыДокументов.\n"
"// - Отчеты.\n"
"// - Обработки.\n"
"// - ПланыВидовХарактеристик.\n"
"// - ПланыСчетов.\n"
"// - ПланыВидовРасчета.\n"
"// - РегистрыСведений.\n"
"// - РегистрыНакопления.\n"
"// - РегистрыБухгалтерии.\n"
"// - РегистрыРасчета.\n"
"// - БизнесПроцессы.\n"
"// - Задачи.\n"
"// \n"
"// Параметры:\n"
"// ОписаниеОбъектовМетаданных - Массив из ОбъектМетаданных - объекты метаданных конфигурации;\n"
"// - Массив из Строка - полные имена объектов метаданных, которые можно использовать\n"
"// в функции Метаданные.НайтиПоПолномуИмени;\n"
"// - Массив из Тип - типы, которые можно использовать в функции Метаданные.НайтиПоТипу.\n"
"// ВызыватьИсключение - Булево - если Ложь, то несуществующие и неподдерживаемые объекты метаданных\n"
"// будут пропущены в возвращаемом значении.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - Строка - полное имя указанного объекта метаданных.\n"
"// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных\n"
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - найденный идентификатор.\n"
"//\n"
"// Пример:\n"
"// ПолныеИмена = Новый Массив;\n"
"// ПолныеИмена.Добавить(Метаданные.Справочники.Валюты.ПолноеИмя());\n"
"// ПолныеИмена.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя());\n"
"// Идентификаторы = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИмена);\n"
"//\n"
"Функция ИдентификаторыОбъектовМетаданных(ОписаниеОбъектовМетаданных, ВызыватьИсключение = Истина) Экспорт\n"
" \n"
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторыОбъектовМетаданных(\n"
" ОписаниеОбъектовМетаданных, ВызыватьИсключение);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает объект метаданных по переданному идентификатору.\n"
"//\n"
"// Параметры:\n"
"// Идентификатор - СправочникСсылка.ИдентификаторыОбъектовМетаданных\n"
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор\n"
"// объекта метаданных конфигурации или расширения конфигурации.\n"
"//\n"
"// ВызыватьИсключение - Булево - если Ложь, тогда в случае, когда объект метаданных\n"
"// не существует или недоступен, возвращает соответственно\n"
"// Null или Неопределено вместо вызова исключения.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОбъектМетаданных - объект метаданных, соответствующий идентификатору.\n"
"//\n"
"// Null - возвращается, когда ВызыватьИсключение = Ложь. Обозначает, что\n"
"// для указанного идентификатора объект метаданных не существует (идентификатор устарел).\n"
"//\n"
"// Неопределено - возвращается, когда ВызыватьИсключение = Ложь. Обозначает,\n"
"// что идентификатор действующий, но в текущем сеансе ОбъектМетаданных не может быть получен.\n"
"// Для расширений конфигурации это значит, что расширение установлено, но не подключено,\n"
"// либо потому что перезапуск еще не выполнен, либо при подключении произошла ошибка.\n"
"// Для конфигурации это значит, что в новом сеансе (новом динамическом поколении) объект\n"
"// метаданных имеется, а в текущем (старом) сеансе нет.\n"
"//\n"
"Функция ОбъектМетаданныхПоИдентификатору(Идентификатор, ВызыватьИсключение = Истина) Экспорт\n"
" \n"
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ОбъектМетаданныхПоИдентификатору(\n"
" Идентификатор, ВызыватьИсключение);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает объекты метаданных по переданным идентификаторам.\n"
"//\n"
"// Параметры:\n"
"// Идентификаторы - Массив - со значениями:\n"
"// * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных\n"
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификаторы\n"
"// объектов метаданных конфигурации или расширений конфигурации.\n"
"//\n"
"// ВызыватьИсключение - Булево - если Ложь, тогда в случае, когда объект метаданных\n"
"// не существует или недоступен, возвращает соответственно\n"
"// Null или Неопределено вместо вызова исключения.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных\n"
"// - СправочникСсылка.ИдентификаторыОбъектовРасширений - переданный идентификатор.\n"
"// * Значение - ОбъектМетаданных - объект метаданных, соответствующий идентификатору.\n"
"// - Null - возвращается, когда ВызыватьИсключение = Ложь. Обозначает, что\n"
"// для указанного идентификатора объект метаданных не существует (идентификатор устарел).\n"
"// - Неопределено - возвращается, когда ВызыватьИсключение = Ложь. Обозначает,\n"
"// что идентификатор действующий, но в текущем сеансе ОбъектМетаданных не может быть получен.\n"
"// Для расширений конфигурации это значит, что расширение установлено, но не подключено,\n"
"// либо потому что перезапуск еще не выполнен, либо при подключении произошла ошибка.\n"
"// Для конфигурации это значит, что в новом сеансе (новом динамическом поколении) объект\n"
"// метаданных имеется, а в текущем (старом) сеансе нет.\n"
"//\n"
"Функция ОбъектыМетаданныхПоИдентификаторам(Идентификаторы, ВызыватьИсключение = Истина) Экспорт\n"
" \n"
" Возврат Справочники.ИдентификаторыОбъектовМетаданных.ОбъектыМетаданныхПоИдентификаторам(\n"
" Идентификаторы, ВызыватьИсключение);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает ОбъектМетаданных, быстро найденный по полному имени.\n"
"// Более производительный аналог метода платформы Метаданные.НайтиПоПолномуИмени\n"
"// для корневых объектов метаданных.\n"
"//\n"
"// Параметры:\n"
"// ПолноеИмя - Строка - полное имя объекта метаданных, например, Справочник.Организации\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОбъектМетаданных - когда найден\n"
"// Неопределено - когда не найден\n"
"//\n"
"Функция ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) Экспорт\n"
" \n"
" ПозицияТочки = СтрНайти(ПолноеИмя, \".\");\n"
" ИмяБазовогоТипа = Лев(ПолноеИмя, ПозицияТочки - 1);\n"
" \n"
" ИменаКоллекций = СтандартныеПодсистемыПовтИсп.ИменаКоллекцийПоИменамБазовыхТипов();\n"
" Коллекция = ИменаКоллекций.Получить(ВРег(ИмяБазовогоТипа));\n"
" \n"
" Если Коллекция <> Неопределено Тогда\n"
" Если Коллекция <> \"Подсистемы\" Тогда\n"
" ИмяОбъекта = Сред(ПолноеИмя, ПозицияТочки + 1);\n"
" ОбъектМетаданных = Метаданные[Коллекция].Найти(ИмяОбъекта);\n"
" Иначе\n"
" ИменаПодсистем = СтрРазделить(ВРег(ПолноеИмя), \".\");\n"
" Количество = ИменаПодсистем.Количество();\n"
" Подсистема = Метаданные;\n"
" ОбъектМетаданных = Неопределено;\n"
" Индекс = 0;\n"
" Пока Истина Цикл\n"
" Индекс = Индекс + 1;\n"
" Если Индекс >= Количество Тогда\n"
" Прервать;\n"
" КонецЕсли;\n"
" ИмяПодсистемы = ИменаПодсистем[Индекс];\n"
" Подсистема = Подсистема.Подсистемы.Найти(ИмяПодсистемы);\n"
" Если Подсистема = Неопределено Тогда\n"
" Прервать;\n"
" КонецЕсли;\n"
" Индекс = Индекс + 1;\n"
" Если Индекс = Количество Тогда\n"
" ОбъектМетаданных = Подсистема;\n"
" Прервать;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Если ОбъектМетаданных = Неопределено Тогда\n"
" ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);\n"
" КонецЕсли;\n"
" \n"
" Возврат ОбъектМетаданных;\n"
" \n"
"КонецФункции\n\n"
"// Определяет доступность объекта метаданных по функциональным опциям.\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных\n"
"// - Строка - проверяемый объект метаданных.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если объект доступен.\n"
"//\n"
"Функция ОбъектМетаданныхДоступенПоФункциональнымОпциям(Знач ОбъектМетаданных) Экспорт\n"
" Если ОбъектМетаданных = Неопределено Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" Если ТипЗнч(ОбъектМетаданных) <> Тип(\"Строка\") Тогда\n"
" ПолноеИмя = ОбъектМетаданных.ПолноеИмя();\n"
" Иначе\n"
" ПолноеИмя = ОбъектМетаданных;\n"
" КонецЕсли;\n"
" Возврат СтандартныеПодсистемыПовтИсп.ДоступностьОбъектовПоОпциям().Получить(ПолноеИмя) <> Ложь;\n"
"КонецФункции\n\n"
"// Добавляет описание переименования объекта метаданных при переходе на указанную версию конфигурации.\n"
"// Добавление выполняется в структуру Итог, которая передается в\n"
"// процедуру ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.\n"
"// \n"
"// Параметры:\n"
"// Итог - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.Итог\n"
"// ВерсияИБ - Строка - версия конечной конфигурации, при переходе на которую нужно\n"
"// выполнить переименование, например, \"2.1.2.14\".\n"
"// СтароеПолноеИмя - Строка - старое полное имя объекта метаданных, которое нужно переименовать,\n"
"// например \"Подсистема._ДемоПодсистемы\".\n"
"// НовоеПолноеИмя - Строка - новое полное имя объекта метаданных, на которое нужно переименовать,\n"
"// например \"Подсистема._ДемоСервисныеПодсистемы\".\n"
"// ИдентификаторБиблиотеки - Строка - внутренний идентификатор библиотеки, к которой относится ВерсияИБ.\n"
"// Для основной конфигурации не требуется.\n"
"// Например, \"СтандартныеПодсистемы\" - как указано\n"
"// в ОбновлениеИнформационнойБазыБСП.ПриДобавленииПодсистемы.\n"
"// Пример:\n"
"// ОбщегоНазначения.ДобавитьПереименование(Итог, \"2.1.2.14\",\n"
"// \"Подсистема._ДемоПодсистемы\",\n"
"// \"Подсистема._ДемоСервисныеПодсистемы\");\n"
"//\n"
"Процедура ДобавитьПереименование(Итог, ВерсияИБ, СтароеПолноеИмя, НовоеПолноеИмя, ИдентификаторБиблиотеки = \"\") Экспорт\n"
" \n"
" Справочники.ИдентификаторыОбъектовМетаданных.ДобавитьПереименование(Итог,\n"
" ВерсияИБ, СтароеПолноеИмя, НовоеПолноеИмя, ИдентификаторБиблиотеки);\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращает строковое представление типа, например, \"СправочникСсылка.ИмяОбъекта\", \"ДокументСсылка.ИмяОбъекта\".\n"
"// Для остальных типов приводит тип к строке, например \"Число\".\n"
"//\n"
"// Параметры:\n"
"// Тип - Тип - для которого надо получить представление.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка\n"
"//\n"
"Функция СтроковоеПредставлениеТипа(Тип) Экспорт\n"
" \n"
" Представление = \"\";\n"
" \n"
" Если ЭтоСсылка(Тип) Тогда\n"
" \n"
" ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();\n"
" ИмяОбъекта = СтрРазделить(ПолноеИмя, \".\")[1];\n"
" \n"
" Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"СправочникСсылка\";\n"
" \n"
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ДокументСсылка\";\n"
" \n"
" ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"БизнесПроцессСсылка\";\n"
" \n"
" ИначеЕсли БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) Тогда\n"
" Представление = \"ТочкаМаршрутаБизнесПроцессаСсылка\";\n"
" \n"
" ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ПланВидовХарактеристикСсылка\";\n"
" \n"
" ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ПланСчетовСсылка\";\n"
" \n"
" ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ПланВидовРасчетаСсылка\";\n"
" \n"
" ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ЗадачаСсылка\";\n"
" \n"
" ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ПланОбменаСсылка\";\n"
" \n"
" ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" Представление = \"ПеречислениеСсылка\";\n"
" \n"
" КонецЕсли;\n"
" \n"
" Результат = ?(Представление = \"\", Представление, Представление + \".\" + ИмяОбъекта);\n"
" \n"
" ИначеЕсли Тип = Тип(\"Неопределено\") Тогда\n"
" Результат = \"Неопределено\";\n"
" \n"
" ИначеЕсли Тип = Тип(\"Строка\") Тогда\n"
" Результат = \"Строка\";\n\n"
" ИначеЕсли Тип = Тип(\"Число\") Тогда\n"
" Результат = \"Число\";\n\n"
" ИначеЕсли Тип = Тип(\"Булево\") Тогда\n"
" Результат = \"Булево\";\n\n"
" ИначеЕсли Тип = Тип(\"Дата\") Тогда\n"
" Результат = \"Дата\";\n"
" \n"
" Иначе\n"
" \n"
" Результат = Строка(Тип);\n"
" \n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает таблицу значений с описанием требуемых свойств всех реквизитов объекта метаданных.\n"
"// Получает значения свойств стандартных реквизитов и пользовательских реквизитов (созданных в режиме конфигуратора).\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - объект, для которого необходимо получить значение свойств реквизитов.\n"
"// Например: Метаданные.Документ.РеализацияТоваровИУслуг\n"
"// Свойства - Строка - свойства реквизитов, перечисленные через запятую, значение которых необходимо получить.\n"
"// Например: \"Имя, Тип, Синоним, Подсказка\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// ТаблицаЗначений - описание требуемых свойств всех реквизитов объекта метаданных.\n"
"//\n"
"Функция ОписаниеСвойствОбъекта(ОбъектМетаданных, Свойства) Экспорт\n"
" \n"
" МассивСвойств = СтрРазделить(Свойства, \",\");\n"
" \n"
" // Возвращаемое значение функции.\n"
" ТаблицаОписанияСвойствОбъекта = Новый ТаблицаЗначений;\n"
" \n"
" // Добавляем в таблицу поля согласно именам переданных свойств.\n"
" Для Каждого ИмяСвойства Из МассивСвойств Цикл\n"
" ТаблицаОписанияСвойствОбъекта.Колонки.Добавить(СокрЛП(ИмяСвойства));\n"
" КонецЦикла;\n"
" \n"
" // Заполняем строку таблицы свойствами реквизитов объекта метаданных.\n"
" Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл\n"
" ЗаполнитьЗначенияСвойств(ТаблицаОписанияСвойствОбъекта.Добавить(), Реквизит);\n"
" КонецЦикла;\n"
" \n"
" // Заполняем строку таблицы свойствами стандартных реквизитов объекта метаданных.\n"
" Для Каждого Реквизит Из ОбъектМетаданных.СтандартныеРеквизиты Цикл\n"
" ЗаполнитьЗначенияСвойств(ТаблицаОписанияСвойствОбъекта.Добавить(), Реквизит);\n"
" КонецЦикла;\n"
" \n"
" Возврат ТаблицаОписанияСвойствОбъекта;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает признак того, что реквизит входит в подмножество стандартных реквизитов.\n"
"//\n"
"// Параметры:\n"
"// СтандартныеРеквизиты - ОписанияСтандартныхРеквизитов - тип и значение, описывающие коллекцию настроек различных\n"
"// стандартных реквизитов;\n"
"// ИмяРеквизита - Строка - реквизит, который необходимо проверить на принадлежность множеству стандартных\n"
"// реквизитов.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если реквизит входит в подмножество стандартных реквизитов.\n"
"//\n"
"Функция ЭтоСтандартныйРеквизит(СтандартныеРеквизиты, ИмяРеквизита) Экспорт\n"
" \n"
" Для Каждого Реквизит Из СтандартныеРеквизиты Цикл\n"
" Если Реквизит.Имя = ИмяРеквизита Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Возврат Ложь;\n"
" \n"
"КонецФункции\n\n"
"// Позволяет определить, есть ли среди реквизитов объекта реквизит с переданным именем.\n"
"//\n"
"// Параметры:\n"
"// ИмяРеквизита - Строка - имя реквизита;\n"
"// МетаданныеОбъекта - ОбъектМетаданных - объект, в котором требуется проверить наличие реквизита.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если есть.\n"
"//\n"
"Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт\n\n"
" Реквизиты = МетаданныеОбъекта.Реквизиты; // КоллекцияОбъектовМетаданных\n"
" Возврат НЕ (Реквизиты.Найти(ИмяРеквизита) = Неопределено);\n\n"
"КонецФункции\n\n"
"// Проверить, что описание типа состоит из единственного типа значения и \n"
"// совпадает с нужным типом.\n"
"//\n"
"// Параметры:\n"
"// ОписаниеТипа - ОписаниеТипов - проверяемая коллекция типов;\n"
"// ТипЗначения - Тип - проверяемый тип.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если совпадает.\n"
"//\n"
"// Пример:\n"
"// Если ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип(\"Булево\") Тогда\n"
"// // Выводим поле в виде флажка.\n"
"// КонецЕсли;\n"
"//\n"
"Функция ОписаниеТипаСостоитИзТипа(ОписаниеТипа, ТипЗначения) Экспорт\n"
" \n"
" Если ОписаниеТипа.Типы().Количество() = 1\n"
" И ОписаниеТипа.Типы().Получить(0) = ТипЗначения Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" \n"
" Возврат Ложь;\n"
" \n"
"КонецФункции\n\n"
"// Создает объект ОписаниеТипов, содержащий тип Строка.\n"
"//\n"
"// Параметры:\n"
"// ДлинаСтроки - Число - длина строки.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОписаниеТипов - описание типа Строка.\n"
"//\n"
"Функция ОписаниеТипаСтрока(ДлинаСтроки) Экспорт\n"
" \n"
" Возврат Новый ОписаниеТипов(\"Строка\", , Новый КвалификаторыСтроки(ДлинаСтроки));\n"
" \n"
"КонецФункции\n\n"
"// Создает объект ОписаниеТипов, содержащий тип Число.\n"
"//\n"
"// Параметры:\n"
"// Разрядность - Число - общее количество разрядов числа (количество разрядов\n"
"// целой части плюс количество разрядов дробной части).\n"
"// РазрядностьДробнойЧасти - Число - число разрядов дробной части.\n"
"// ЗнакЧисла - ДопустимыйЗнак - допустимый знак числа.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОписаниеТипов - описание типа Число.\n"
"//\n"
"Функция ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, Знач ЗнакЧисла = Неопределено) Экспорт\n"
" \n"
" Если ЗнакЧисла = Неопределено Тогда \n"
" ЗнакЧисла = ДопустимыйЗнак.Любой;\n"
" КонецЕсли;\n"
" \n"
" Возврат Новый ОписаниеТипов(\"Число\", Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти, ЗнакЧисла));\n"
" \n"
"КонецФункции\n\n"
"// Создает объект ОписаниеТипов, содержащий тип Дата.\n"
"//\n"
"// Параметры:\n"
"// ЧастиДаты - ЧастиДаты - набор вариантов использования значений типа Дата.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОписаниеТипов - описание типа Дата.\n"
"//\n"
"Функция ОписаниеТипаДата(ЧастиДаты) Экспорт\n"
" \n"
" Возврат Новый ОписаниеТипов(\"Дата\", , , Новый КвалификаторыДаты(ЧастиДаты));\n"
" \n"
"КонецФункции\n\n"
"// Возвращает описание типа, включающего в себя все возможные ссылочные типы конфигурации.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОписаниеТипов - все ссылочные типы конфигурации.\n"
"//\n"
"Функция ОписаниеТипаВсеСсылки() Экспорт\n"
" \n"
" Возврат СтандартныеПодсистемыПовтИсп.ОписаниеТипаВсеСсылки();\n"
" \n"
"КонецФункции\n\n"
"// Возвращает строковое представление списка, заданное в свойствах объекта метаданных.\n"
"// В зависимости от того, какие свойства объекта метаданных заполнены, функция возвращают одно из них в указанном\n"
"// порядке: Расширенное представление списка, Представление списка, Синоним или Имя.\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - произвольный объект.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - представление списка.\n"
"//\n"
"Функция ПредставлениеСписка(ОбъектМетаданных) Экспорт\n"
" \n"
" СвойстваОбъекта = Новый Структура(\"РасширенноеПредставлениеСписка,ПредставлениеСписка\");\n"
" ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);\n"
" \n"
" Если ЗначениеЗаполнено(СвойстваОбъекта.РасширенноеПредставлениеСписка) Тогда\n"
" Результат = СвойстваОбъекта.РасширенноеПредставлениеСписка;\n"
" ИначеЕсли ЗначениеЗаполнено(СвойстваОбъекта.ПредставлениеСписка) Тогда\n"
" Результат = СвойстваОбъекта.ПредставлениеСписка;\n"
" Иначе\n"
" Результат = ОбъектМетаданных.Представление();\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает строковое представление объекта, заданное в свойствах объекта метаданных.\n"
"// В зависимости от того, какие свойства объекта метаданных заполнены, функция возвращают одно из них в указанном\n"
"// порядке: Расширенное представление объекта, Представление объекта, Синоним или Имя.\n"
"//\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных - произвольный объект.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - представление объекта.\n"
"//\n"
"Функция ПредставлениеОбъекта(ОбъектМетаданных) Экспорт\n"
" \n"
" СвойстваОбъекта = Новый Структура(\"РасширенноеПредставлениеОбъекта,ПредставлениеОбъекта\");\n"
" ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);\n"
" \n"
" Если ЗначениеЗаполнено(СвойстваОбъекта.РасширенноеПредставлениеОбъекта) Тогда\n"
" Результат = СвойстваОбъекта.РасширенноеПредставлениеОбъекта;\n"
" ИначеЕсли ЗначениеЗаполнено(СвойстваОбъекта.ПредставлениеОбъекта) Тогда\n"
" Результат = СвойстваОбъекта.ПредставлениеОбъекта;\n"
" Иначе\n"
" Результат = ОбъектМетаданных.Представление();\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ХранилищеНастроек\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Сохранение, чтение и удаление настроек из хранилищ.\n\n"
"// Сохраняет настройку в хранилище общих настроек, как метод платформы Сохранить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка - см. синтакс-помощник платформы.\n"
"// Настройки - Произвольный - см. синтакс-помощник платформы.\n"
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка - см. синтакс-помощник платформы.\n"
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы.\n"
"//\n"
"Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки,\n"
" ОписаниеНастроек = Неопределено,\n"
" ИмяПользователя = Неопределено,\n"
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт\n"
" \n"
" ХранилищеСохранить(ХранилищеОбщихНастроек,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" Настройки,\n"
" ОписаниеНастроек,\n"
" ИмяПользователя,\n"
" ОбновитьПовторноИспользуемыеЗначения);\n"
" \n"
"КонецПроцедуры\n\n"
"// Сохраняет несколько настроек в хранилище общих настроек, как метод платформы Сохранить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки.\n"
"// \n"
"// Параметры:\n"
"// НесколькоНастроек - Массив - со значениями:\n"
"// * Значение - Структура:\n"
"// * Объект - Строка - см. параметр КлючОбъекта в синтакс-помощнике платформы.\n"
"// * Настройка - Строка - см. параметр КлючНастроек в синтакс-помощнике платформы.\n"
"// * Значение - Произвольный - см. параметр Настройки в синтакс-помощнике платформы.\n"
"//\n"
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы.\n"
"//\n"
"Процедура ХранилищеОбщихНастроекСохранитьМассив(НесколькоНастроек,\n"
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт\n"
" \n"
" Если Не ПравоДоступа(\"СохранениеДанныхПользователя\", Метаданные) Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого Элемент Из НесколькоНастроек Цикл\n"
" ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, КлючНастроек(Элемент.Настройка), Элемент.Значение);\n"
" КонецЦикла;\n"
" \n"
" Если ОбновитьПовторноИспользуемыеЗначения Тогда\n"
" ОбновитьПовторноИспользуемыеЗначения();\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"// Загружает настройку из хранилища общих настроек, как метод платформы Загрузить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Кроме того, возвращает указанное значение по умолчанию, если настройки не существуют.\n"
"// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки.\n"
"//\n"
"// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно\n"
"// - возвращаемая ссылка заменяется на указанное значение по умолчанию;\n"
"// - из данных типа Массив ссылки удаляются;\n"
"// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;\n"
"// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка - см. синтакс-помощник платформы.\n"
"// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не существуют.\n"
"// Если не указано, возвращается значение Неопределено.\n"
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка - см. синтакс-помощник платформы.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Произвольный - см. синтакс-помощник платформы.\n"
"//\n"
"Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, \n"
" ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт\n"
" \n"
" Возврат ХранилищеЗагрузить(ХранилищеОбщихНастроек,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" ЗначениеПоУмолчанию,\n"
" ОписаниеНастроек,\n"
" ИмяПользователя);\n"
" \n"
"КонецФункции\n\n"
"// Удаляет настройку из хранилища общих настроек, как метод платформы Удалить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"//\n"
"Процедура ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт\n"
" \n"
" ХранилищеУдалить(ХранилищеОбщихНастроек,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" ИмяПользователя);\n"
" \n"
"КонецПроцедуры\n\n"
"// Сохраняет настройку в хранилище системных настроек, как метод платформы Сохранить\n"
"// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек\n"
"// более 128 символов путем хеширования части, которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка - см. синтакс-помощник платформы.\n"
"// Настройки - Произвольный - см. синтакс-помощник платформы.\n"
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка - см. синтакс-помощник платформы.\n"
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы.\n"
"//\n"
"Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки,\n"
" ОписаниеНастроек = Неопределено,\n"
" ИмяПользователя = Неопределено,\n"
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт\n"
" \n"
" ХранилищеСохранить(ХранилищеСистемныхНастроек, \n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" Настройки,\n"
" ОписаниеНастроек,\n"
" ИмяПользователя,\n"
" ОбновитьПовторноИспользуемыеЗначения);\n"
" \n"
"КонецПроцедуры\n\n"
"// Загружает настройку из хранилища системных настроек, как метод платформы Загрузить,\n"
"// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек\n"
"// более 128 символов путем хеширования части, которая превышает 96 символов.\n"
"// Кроме того, возвращает указанное значение по умолчанию, если настройки не существуют.\n"
"// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки.\n"
"//\n"
"// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно:\n"
"// - возвращаемая ссылка заменяется на указанное значение по умолчанию;\n"
"// - из данных типа Массив ссылки удаляются;\n"
"// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;\n"
"// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка - см. синтакс-помощник платформы.\n"
"// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не существуют.\n"
"// Если не указано, возвращается значение Неопределено.\n"
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка - см. синтакс-помощник платформы.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Произвольный - см. синтакс-помощник платформы.\n"
"//\n"
"Функция ХранилищеСистемныхНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, \n"
" ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт\n"
" \n"
" Возврат ХранилищеЗагрузить(ХранилищеСистемныхНастроек,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" ЗначениеПоУмолчанию,\n"
" ОписаниеНастроек,\n"
" ИмяПользователя);\n"
" \n"
"КонецФункции\n\n"
"// Удаляет настройку из хранилища системных настроек, как метод платформы Удалить,\n"
"// объекта СтандартноеХранилищеНастроекМенеджер, но с поддержкой длины ключа настроек\n"
"// более 128 символов путем хеширования части, которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"//\n"
"Процедура ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт\n"
" \n"
" ХранилищеУдалить(ХранилищеСистемныхНастроек,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" ИмяПользователя);\n"
" \n"
"КонецПроцедуры\n\n"
"// Сохраняет настройку в хранилище настроек данных форм, как метод платформы Сохранить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка - см. синтакс-помощник платформы.\n"
"// Настройки - Произвольный - см. синтакс-помощник платформы.\n"
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка - см. синтакс-помощник платформы.\n"
"// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы.\n"
"//\n"
"Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки,\n"
" ОписаниеНастроек = Неопределено,\n"
" ИмяПользователя = Неопределено, \n"
" ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт\n"
" \n"
" ХранилищеСохранить(ХранилищеНастроекДанныхФорм,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" Настройки,\n"
" ОписаниеНастроек,\n"
" ИмяПользователя,\n"
" ОбновитьПовторноИспользуемыеЗначения);\n"
" \n"
"КонецПроцедуры\n\n"
"// Загружает настройку из хранилища настроек данных форм, как метод платформы Загрузить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Кроме того, возвращает указанное значение по умолчанию, если настройки не существуют.\n"
"// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки.\n"
"//\n"
"// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно\n"
"// - возвращаемая ссылка заменяется на указанное значение по умолчанию;\n"
"// - из данных типа Массив ссылки удаляются;\n"
"// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;\n"
"// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка - см. синтакс-помощник платформы.\n"
"// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не существуют.\n"
"// Если не указано, возвращается значение Неопределено.\n"
"// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка - см. синтакс-помощник платформы.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Произвольный - см. синтакс-помощник платформы.\n"
"//\n"
"Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, \n"
" ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт\n"
" \n"
" Возврат ХранилищеЗагрузить(ХранилищеНастроекДанныхФорм,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" ЗначениеПоУмолчанию,\n"
" ОписаниеНастроек, \n"
" ИмяПользователя);\n"
" \n"
"КонецФункции\n\n"
"// Удаляет настройку из хранилища настроек данных форм, как метод платформы Удалить,\n"
"// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,\n"
"// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,\n"
"// которая превышает 96 символов.\n"
"// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки.\n"
"//\n"
"// Параметры:\n"
"// КлючОбъекта - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"// КлючНастроек - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"// ИмяПользователя - Строка\n"
"// - Неопределено - см. синтакс-помощник платформы.\n"
"//\n"
"Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт\n"
" \n"
" ХранилищеУдалить(ХранилищеНастроекДанныхФорм,\n"
" КлючОбъекта,\n"
" КлючНастроек,\n"
" ИмяПользователя);\n"
" \n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#Область СериализацияXML\n\n"
"// Преобразует (сериализует) любое значение в XML-строку.\n"
"// Преобразованы в могут быть только те объекты, для которых в синтакс-помощнике указано, что они сериализуются.\n"
"// См. также ЗначениеИзСтрокиXML.\n"
"//\n"
"// Параметры:\n"
"// Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - XML-строка.\n"
"//\n"
"Функция ЗначениеВСтрокуXML(Значение) Экспорт\n"
" \n"
" ЗаписьXML = Новый ЗаписьXML;\n"
" ЗаписьXML.УстановитьСтроку();\n"
" СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);\n"
" \n"
" Возврат ЗаписьXML.Закрыть();\n"
"КонецФункции\n\n"
"// Выполняет преобразование (десериализацию) XML-строки в значение.\n"
"// См. также ЗначениеВСтрокуXML.\n"
"//\n"
"// Параметры:\n"
"// СтрокаXML - Строка - XML-строка, с сериализованным объектом..\n"
"//\n"
"// Возвращаемое значение:\n"
"// Произвольный - значение, полученное из переданной XML-строки.\n"
"//\n"
"Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт\n"
" \n"
" ЧтениеXML = Новый ЧтениеXML;\n"
" ЧтениеXML.УстановитьСтроку(СтрокаXML);\n"
" \n"
" Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);\n"
"КонецФункции\n\n"
"// Возвращает XML-представление XDTO-объекта.\n"
"//\n"
"// Параметры:\n"
"// ОбъектXDTO - ОбъектXDTO - объект, для которого требуется сформировать XML-представление.\n"
"// Фабрика - ФабрикаXDTO - фабрика, с использованием которой требуется формировать XML-представление.\n"
"// Если параметр не указан - будет использоваться глобальная фабрика XDTO.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Строка - XML-представление XDTO-объекта.\n"
"//\n"
"Функция ОбъектXDTOВСтрокуXML(Знач ОбъектXDTO, Знач Фабрика = Неопределено) Экспорт\n"
" \n"
" ОбъектXDTO.Проверить();\n"
" \n"
" Если Фабрика = Неопределено Тогда\n"
" Фабрика = ФабрикаXDTO;\n"
" КонецЕсли;\n"
" \n"
" Запись = Новый ЗаписьXML();\n"
" Запись.УстановитьСтроку();\n"
" Фабрика.ЗаписатьXML(Запись, ОбъектXDTO, , , , НазначениеТипаXML.Явное);\n"
" \n"
" Возврат Запись.Закрыть();\n"
" \n"
"КонецФункции\n\n"
"// Формирует XDTO-объект по XML-представлению.\n"
"//\n"
"// Параметры:\n"
"// СтрокаXML - Строка - XML-представление XDTO-объекта,\n"
"// Фабрика - ФабрикаXDTO - фабрика, с использованием которой требуется формировать XDTO-объект.\n"
"// Если параметр не указан - будет использоваться глобальная фабрика XDTO.\n"
"//\n"
"// Возвращаемое значение: \n"
"// ОбъектXDTO - XDTO-объект.\n"
"//\n"
"Функция ОбъектXDTOИзСтрокиXML(Знач СтрокаXML, Знач Фабрика = Неопределено) Экспорт\n"
" \n"
" Если Фабрика = Неопределено Тогда\n"
" Фабрика = ФабрикаXDTO;\n"
" КонецЕсли;\n"
" \n"
" Чтение = Новый ЧтениеXML();\n"
" Чтение.УстановитьСтроку(СтрокаXML);\n"
" \n"
" Возврат Фабрика.ПрочитатьXML(Чтение);\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область СериализацияJSON\n\n"
"// Преобразует значение в строку JSON при помощи метода глобального контекста ЗаписатьJSON.\n"
"// Допускаются не все типы значений, подробности см. в синтакс-помощнике.\n"
"// Даты преобразуются в формат ISO (YYYY-MM-DDThh:mm:ssZ).\n"
"// \n"
"// Параметры:\n"
"// Значение - Произвольный\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка\n"
"//\n"
"Функция ЗначениеВJSON(Знач Значение) Экспорт\n"
" \n"
" ЗаписьJSON = Новый ЗаписьJSON;\n"
" ЗаписьJSON.УстановитьСтроку();\n"
" ЗаписатьJSON(ЗаписьJSON, Значение);\n"
" \n"
" Возврат ЗаписьJSON.Закрыть();\n"
" \n"
"КонецФункции\n\n"
"// Преобразует строку в формате JSON в значение при помощи метода глобального контекста ПрочитатьJSON.\n"
"// См. ограничения в синтакс-помощнике.\n"
"// Объекты JSON по умолчанию преобразует в значения типа Соответствие. \n"
"// Имена свойств со значением типа Дата необходимо явно указывать, чтобы было выполнено преобразование.\n"
"// Ожидаемый формат дат - ISO (YYYY-MM-DDThh:mm:ssZ).\n"
"// \n"
"// Параметры:\n"
"// Строка - Строка - значение в формате JSON.\n"
"// ИменаСвойствСоЗначениямиДата - Строка - имя свойства, содержащее значение типа Дата. Допустимо указывать несколько\n"
"// свойств через запятую.\n"
"// - Массив из Строка \n"
"// ПрочитатьВСоответствие - Булево - если Ложь, то объекты JSON будут преобразованы в значение типа Структура.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Произвольный\n"
"//\n"
"Функция JSONВЗначение(Знач Строка, Знач ИменаСвойствСоЗначениямиДата = Неопределено, Знач ПрочитатьВСоответствие = Истина) Экспорт\n"
" \n"
" Если ТипЗнч(ИменаСвойствСоЗначениямиДата) = Тип(\"Строка\") Тогда\n"
" ИменаСвойствСоЗначениямиДата = СтрРазделить(ИменаСвойствСоЗначениямиДата, \", \" + Символы.ПС, Ложь);\n"
" КонецЕсли;\n"
" \n"
" ЧтениеJSON = Новый ЧтениеJSON;\n"
" ЧтениеJSON.УстановитьСтроку(Строка);\n"
" \n"
" Возврат ПрочитатьJSON(ЧтениеJSON, ПрочитатьВСоответствие, ИменаСвойствСоЗначениямиДата);\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ВебСервисы\n\n"
"// Возвращает структуру параметров для функции СоздатьWSПрокси.\n"
"//\n"
"// Возвращаемое значение:\n"
"// см. СоздатьWSПрокси.ПараметрыПодключенияWSПрокси\n"
"//\n"
"Функция ПараметрыПодключенияWSПрокси() Экспорт\n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"АдресWSDL\");\n"
" Результат.Вставить(\"URIПространстваИмен\");\n"
" Результат.Вставить(\"ИмяСервиса\");\n"
" Результат.Вставить(\"ИмяТочкиПодключения\", \"\");\n"
" Результат.Вставить(\"ИмяПользователя\");\n"
" Результат.Вставить(\"Пароль\");\n"
" Результат.Вставить(\"Таймаут\", 0);\n"
" Результат.Вставить(\"Местоположение\");\n"
" Результат.Вставить(\"ИспользоватьАутентификациюОС\", Ложь);\n"
" Результат.Вставить(\"ДелатьКонтрольныйВызов\", Ложь);\n"
" Результат.Вставить(\"ЗащищенноеСоединение\", Неопределено);\n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Конструктор объекта WSПрокси с дополнительными возможностями по сравнению с конструктором Новый WSПрокси:\n"
"// - создает WSОпределения;\n"
"// - кэширует файл WSDL для ускорения работы с веб-сервисом;\n"
"// - не требуется указание ИнтернетПрокси (используется автоматически, если настроен);\n"
"// - позволяет делать быструю проверку доступности сервиса с помощью операции Ping.\n"
"//\n"
"// Параметры:\n"
"// ПараметрыПодключенияWSПрокси - Структура:\n"
"// * АдресWSDL - Строка - месторасположение wsdl, например, \"http://webservice.net/webservice.asmx?wsdl\".\n"
"// * URIПространстваИмен - Строка - URI пространства имен web-сервиса, например, \"http://www.webservice.net/WebService/1.0.0.1\".\n"
"// * ИмяСервиса - Строка - имя сервиса, например, \"WebService_1_0_0_1\".\n"
"// * ИмяТочкиПодключения - Строка - необязательный параметр. Если не задано, образуется как \"<ИмяСервиса>Soap\".\n"
"// * ИмяПользователя - Строка - необязательный параметр. Имя пользователя для входа на сервер.\n"
"// * Пароль - Строка - необязательный параметр. Пароль пользователя.\n"
"// * Таймаут - Число - необязательный параметр. Таймаут на операции веб-сервиса, выполняемые \n"
"// через прокси. В секундах. \n"
"// * Местоположение - Строка - необязательный параметр. Фактический адрес сервиса. Используется, если\n"
"// адрес реального расположения сервиса отличается от адреса, который указан\n"
"// в WSDL-файле.\n"
"// * ИспользоватьАутентификациюОС - Булево - необязательный параметр. Включает использование авторизации NTLM или \n"
"// Negotiate на сервере.\n"
"// * ДелатьКонтрольныйВызов - Булево - необязательный параметр. Выполнять проверку доступности сервиса (требуется \n"
"// поддержка команды Ping в веб-сервисе). По умолчанию, Ложь.\n"
"// * ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL\n"
"// - Неопределено - необязательные параметры защищенного соединения.\n"
"//\n"
"// Возвращаемое значение:\n"
"// WSПрокси\n"
"//\n"
"// Пример:\n"
"// ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси();\n"
"// ПараметрыПодключения.АдресWSDL = \"http://webservice.net/webservice.asmx?wsdl\";\n"
"// ПараметрыПодключения.URIПространстваИмен = \"http://www.webservice.net/WebService/1.0.0.1\";\n"
"// ПараметрыПодключения.ИмяСервиса = \"WebService_1_0_0_1\";\n"
"// ПараметрыПодключения.Таймаут = 20;\n"
"// Прокси = ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения);\n"
"//\n"
"Функция СоздатьWSПрокси(Знач ПараметрыПодключенияWSПрокси) Экспорт\n"
" \n"
" ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(\"СоздатьWSПрокси\", \"Параметры\", ПараметрыПодключенияWSПрокси, Тип(\"Структура\"),\n"
" Новый Структура(\"АдресWSDL,URIПространстваИмен,ИмяСервиса\", Тип(\"Строка\"), Тип(\"Строка\"), Тип(\"Строка\")));\n"
" \n"
" ПараметрыПодключения = ПараметрыПодключенияWSПрокси();\n"
" ЗаполнитьЗначенияСвойств(ПараметрыПодключения, ПараметрыПодключенияWSПрокси);\n"
" \n"
" ДелатьКонтрольныйВызов = ПараметрыПодключения.ДелатьКонтрольныйВызов;\n"
" Таймаут = ПараметрыПодключения.Таймаут;\n"
" \n"
" Если ДелатьКонтрольныйВызов И Таймаут <> Неопределено И Таймаут > 20 Тогда\n"
" ПараметрыПодключения.Таймаут = 7;\n"
" WSПроксиPing = РегистрыСведений.КэшПрограммныхИнтерфейсов.ВнутренняяWSПрокси(ПараметрыПодключения);\n"
" Попытка\n"
" WSПроксиPing.Ping();\n"
" Исключение\n"
" АдресТочкиПодключения = WSПроксиPing.ТочкаПодключения.Местоположение;\n"
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Не удалось проверить доступность web-сервиса\n"
" |%1\n"
" |по причине:\n"
" |%2'\"),\n"
" ПараметрыПодключения.АдресWSDL,\n"
" ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ПолучениеФайловИзИнтернета\") Тогда\n"
" МодульПолучениеФайловИзИнтернета = ОбщийМодуль(\"ПолучениеФайловИзИнтернета\");\n"
" РезультатДиагностики = МодульПолучениеФайловИзИнтернета.ДиагностикаСоединения(АдресТочкиПодключения);\n"
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = '%1\n"
" |Результат диагностики:\n"
" |%2'\"),\n"
" ТекстОшибки,\n"
" РезультатДиагностики.ОписаниеОшибки);\n"
" КонецЕсли;\n"
" \n"
" ВызватьИсключение ТекстОшибки;\n"
" КонецПопытки;\n"
" ПараметрыПодключения.Таймаут = Таймаут;\n"
" КонецЕсли;\n"
" \n"
" Возврат РегистрыСведений.КэшПрограммныхИнтерфейсов.ВнутренняяWSПрокси(ПараметрыПодключения);\n"
" \n"
"КонецФункции\n\n"
"/////////////////////////////////////////////////////////////////////////////////\n"
"// Версионирование программных интерфейсов.\n\n"
"// Возвращает номера версий программных интерфейсов удаленной системы, доступной через веб-сервис.\n"
"// Позволяет обеспечивать полную обратную совместимость при изменениях в программных интерфейсах\n"
"// с помощью их явного версионирования. Например, если программный интерфейс выше определенной версии,\n"
"// то только в этом случае допустимо вызывать у него новую функцию.\n"
"//\n"
"// В целях экономии трафика при интенсивном взаимодействии между вызывающей и вызываемой сторонами \n"
"// сведения о версиях кэшируются на одни сутки. Если для целей отладки требуется сбросить кэш раньше этого времени,\n"
"// следует удалить соответствующие записи из регистра сведений КэшПрограммныхИнтерфейсов.\n"
"//\n"
"// Параметры:\n"
"// Адрес - Строка - адрес веб-сервиса версионирования интерфейсов InterfaceVersion;\n"
"// Пользователь - Строка - имя пользователя веб-сервиса;\n"
"// Пароль - Строка - пароль пользователя веб-сервиса;\n"
"// Интерфейс - Строка - имя запрашиваемого программного интерфейса, например, \"СервисПередачиФайлов\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. \n"
"// Например, \"1.0.2.1\".\n"
"//\n"
"// Пример:\n"
"// Версии = ПолучитьВерсииИнтерфейса(\"http://vsrvx/sm\", \"ivanov\",, \"СервисПередачиФайлов\");\n"
"//\n"
"// Также для обратной совместимости поддерживается устаревший вариант вызова:\n"
"// ПараметрыПодключения = Новый Структура;\n"
"// ПараметрыПодключения.Вставить(\"URL\", \"http://vsrvx/sm\");\n"
"// ПараметрыПодключения.Вставить(\"UserName\", \"ivanov\");\n"
"// ПараметрыПодключения.Вставить(\"Password\", \"\");\n"
"// Версии = ПолучитьВерсииИнтерфейса(ПараметрыПодключения, \"СервисПередачиФайлов\");\n"
"//\n"
"Функция ПолучитьВерсииИнтерфейса(Знач Адрес, Знач Пользователь, Знач Пароль = Неопределено, Знач Интерфейс = Неопределено) Экспорт\n"
" \n"
" Если ТипЗнч(Адрес) = Тип(\"Структура\") Тогда // для обратной совместимости\n"
" ПараметрыПодключения = Адрес;\n"
" ИмяИнтерфейса = Пользователь;\n"
" Иначе\n"
" ПараметрыПодключения = Новый Структура;\n"
" ПараметрыПодключения.Вставить(\"URL\", Адрес);\n"
" ПараметрыПодключения.Вставить(\"UserName\", Пользователь);\n"
" ПараметрыПодключения.Вставить(\"Password\", Пароль);\n"
" ИмяИнтерфейса = Интерфейс;\n"
" КонецЕсли;\n"
" \n"
" Если Не ПараметрыПодключения.Свойство(\"URL\") \n"
" Или Не ЗначениеЗаполнено(ПараметрыПодключения.URL) Тогда\n"
" \n"
" ВызватьИсключение(НСтр(\"ru = 'Не задан URL сервиса.'\"));\n"
" КонецЕсли;\n"
" \n"
" ПараметрыПолучения = Новый Массив;\n"
" ПараметрыПолучения.Добавить(ПараметрыПодключения);\n"
" ПараметрыПолучения.Добавить(ИмяИнтерфейса);\n"
" \n"
" Возврат РегистрыСведений.КэшПрограммныхИнтерфейсов.ДанныеКэшаВерсий(\n"
" РегистрыСведений.КэшПрограммныхИнтерфейсов.ИдентификаторЗаписиКэшаВерсий(ПараметрыПодключения.URL, ИмяИнтерфейса), \n"
" Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ВерсииИнтерфейса, \n"
" ПараметрыПолучения,\n"
" Истина);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает номера версий программных интерфейсов удаленной системы, подключенной через внешнее соединение.\n"
"// Позволяет обеспечивать полную обратную совместимость при изменениях в программных интерфейсах\n"
"// с помощью их явного версионирования. Например, если программный интерфейс выше определенной версии,\n"
"// то только в этом случае допустимо вызывать у него новую функцию.\n"
"//\n"
"// Параметры:\n"
"// ВнешнееСоединение - COMОбъект - внешнее соединение, которое используется для работы с удаленной системой.\n"
"// ИмяИнтерфейса - Строка - имя запрашиваемого программного интерфейса, например \"СервисПередачиФайлов\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// ФиксированныйМассив - массив строк, каждая строка является представлением номера версии интерфейса. \n"
"// Например \"1.0.2.1\".\n"
"//\n"
"// Пример:\n"
"// Версии = ОбщегоНазначения.ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, \"СервисПередачиФайлов\");\n"
"//\n"
"Функция ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение, Знач ИмяИнтерфейса) Экспорт\n"
" Попытка\n"
" ВерсииИнтерфейсаXML = ВнешнееСоединение.СтандартныеПодсистемыСервер.ПоддерживаемыеВерсии(ИмяИнтерфейса);\n"
" Исключение\n"
" СтрокаСообщения = НСтр(\"ru = 'Корреспондент не поддерживает версионирование программных интерфейсов.\n"
" |Описание ошибки: %1'\");\n"
" СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Получение версий интерфейса'\", КодОсновногоЯзыка()),\n"
" УровеньЖурналаРегистрации.Ошибка, , , СтрокаСообщения);\n"
" \n"
" Возврат Новый ФиксированныйМассив(Новый Массив);\n"
" КонецПопытки;\n"
" \n"
" Возврат Новый ФиксированныйМассив(ЗначениеИзСтрокиXML(ВерсииИнтерфейсаXML));\n"
"КонецФункции\n\n"
"// Удаляет записи кэша версий программных интерфейсов, содержащих в идентификаторе указанную подстроку. \n"
"// В качестве подстроки может использоваться, например, имя интерфейса, более не используемого в конфигурации.\n"
"//\n"
"// Параметры:\n"
"// ПодстрокаПоискаИдентификаторов - Строка - подстрока поиска идентификаторов. \n"
"// Не может содержать символов %, _ и [.\n"
"//\n"
"Процедура УдалитьЗаписиКэшаВерсий(Знач ПодстрокаПоискаИдентификаторов) Экспорт\n"
" \n"
" НачатьТранзакцию();\n"
" Попытка\n"
" \n"
" Блокировка = Новый БлокировкаДанных;\n"
" Блокировка.Добавить(\"РегистрСведений.КэшПрограммныхИнтерфейсов\");\n"
" Блокировка.Заблокировать();\n"
" \n"
" ТекстЗапроса =\n"
" \"ВЫБРАТЬ\n"
" | ТаблицаКэша.Идентификатор КАК Идентификатор,\n"
" | ТаблицаКэша.ТипДанных КАК ТипДанных\n"
" |ИЗ\n"
" | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша\n"
" |ГДЕ\n"
" | ТаблицаКэша.Идентификатор ПОДОБНО \"\"%ПодстрокаПоиска%\"\" СПЕЦСИМВОЛ \"\"~\"\"\";\n"
" \n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"ПодстрокаПоиска\", \n"
" СформироватьСтрокуДляПоискаВЗапросе(ПодстрокаПоискаИдентификаторов));\n"
" Запрос = Новый Запрос(ТекстЗапроса);\n"
" Результат = Запрос.Выполнить();\n"
" Выборка = Результат.Выбрать();\n"
" Пока Выборка.Следующий() Цикл\n"
" Запись = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьМенеджерЗаписи();\n"
" Запись.Идентификатор = Выборка.Идентификатор;\n"
" Запись.ТипДанных = Выборка.ТипДанных;\n"
" Запись.Удалить();\n"
" КонецЦикла;\n"
" \n"
" ЗафиксироватьТранзакцию();\n"
" Исключение\n"
" ОтменитьТранзакцию();\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#Область БезопасноеХранилище\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Процедуры и функции для работы с хранилищем паролей.\n\n"
"// Записывает конфиденциальные данные в безопасное хранилище.\n"
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим.\n"
"//\n"
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов),\n"
"// а доступно только коду, который делает обращения только к своей части данных и\n"
"// в том контексте, который предполагает чтение или запись конфиденциальных данных.\n"
"//\n"
"// Параметры:\n"
"// Владелец - ПланОбменаСсылка\n"
"// - СправочникСсылка\n"
"// - Строка - ссылка на объект информационной базы,\n"
"// представляющий объект-владелец сохраняемого пароля или строка до 128 символов.\n"
"// Для объектов других типов в качестве владельца рекомендуется использовать ссылку на\n"
"// элемент метаданных этого типа в справочнике ИдентификаторыОбъектовМетаданных\n"
"// или ключ в виде строки с учетом имен подсистем.\n"
"// Например, для БСП:\n"
"// Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(\"РегистрСведений.АдресныеОбъекты\");\n"
"// если нужно 1 хранилище на подсистему БСП:\n"
"// Владелец = \"СтандартныеПодсистемы.УправлениеДоступом\";\n"
"// если нужно более 1 хранилища на подсистему БСП:\n"
"// Владелец = \"СтандартныеПодсистемы.УправлениеДоступом.<Уточнение>\";\n"
"// Данные - Произвольный - данные помещаемые в безопасное хранилище. Неопределенно - удаляет все данные.\n"
"// Для удаления данных по ключу следует использовать процедуру УдалитьДанныеИзБезопасногоХранилища.\n"
"// - Структура - если параметр Ключ содержит Неопределено. Подробнее см. описание параметра Ключ\n"
"// Ключ - Строка - ключ сохраняемых настроек, по умолчанию \"Пароль\".\n"
"// Ключ должен соответствовать правилам имен идентификаторов:\n"
"// 1. Первым символом ключа должна быть буква или символ подчеркивания (_).\n"
"// 2. Каждый из последующих символов может быть буквой, цифрой или символом подчеркивания (_). \n"
"// Неопределено - для добавления набора данных структурой, где ключ структуры - это имя ключа данных,\n"
"// а значение - сохраняемые данные. Пример использования см. ниже.\n"
"//\n"
"// Пример:\n"
"//\n"
"// Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)\n"
"// Если ТекущийПользовательМожетИзменятьПароль Тогда\n"
"// УстановитьПривилегированныйРежим(Истина);\n"
"// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Логин, \"Логин\");\n"
"// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Пароль);\n"
"// УстановитьПривилегированныйРежим(Ложь);\n"
"// КонецЕсли;\n"
"// КонецПроцедуры\n"
"// \n"
"// Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)\n"
"// Если ТекущийПользовательМожетИзменятьПароль Тогда\n"
"// ЛогинИПароль = Новый Структура;\n"
"// ЛогинИПароль.Вставить(\"Логин\", Логин);\n"
"// ЛогинИПароль.Вставить(\"Пароль\", Пароль);\n"
"// УстановитьПривилегированныйРежим(Истина);\n"
"// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ЛогинИПароль, Неопределено);\n"
"// УстановитьПривилегированныйРежим(Ложь);\n"
"// КонецЕсли;\n"
"// КонецПроцедуры\n"
"//\n"
"Процедура ЗаписатьДанныеВБезопасноеХранилище(Владелец, Данные, Ключ = \"Пароль\") Экспорт\n"
" \n"
" ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец),\n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Недопустимое значение параметра %1 в %2.\n"
" |параметр должен содержать ссылку; передано значение: %3 (тип %4).'\"),\n"
" \"Владелец\", \"ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище\", Владелец, ТипЗнч(Владелец)));\n"
" \n"
" Если ЗначениеЗаполнено(Ключ) Тогда\n"
" \n"
" ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Ключ) = Тип(\"Строка\"),\n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Недопустимое значение параметра %1 в %2.\n"
" |параметр должен содержать строку; передано значение: %3 (тип %4).'\"),\n"
" \"Ключ\", \"ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище\", Ключ, ТипЗнч(Ключ))); \n"
" \n"
" Иначе\n"
" \n"
" ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Данные) = Тип(\"Структура\"),\n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Недопустимое значение параметра %1 в %2.\n"
" |Если Ключ = Неопределено, то параметр должен содержать структуру; передано значение: %3 (тип %4).'\"),\n"
" \"Данные\", \"ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище\", Данные, ТипЗнч(Данные)));\n"
" \n"
" КонецЕсли;\n"
" \n"
" ЭтоОбластьДанных = РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных();\n"
" Если ЭтоОбластьДанных Тогда\n"
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи();\n"
" Иначе\n"
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();\n"
" КонецЕсли;\n"
" \n"
" БезопасноеХранилищеДанных.Владелец = Владелец;\n"
" БезопасноеХранилищеДанных.Прочитать();\n"
" \n"
" Если Данные <> Неопределено Тогда\n"
" \n"
" Если БезопасноеХранилищеДанных.Выбран() Тогда\n"
" \n"
" ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить();\n"
" \n"
" Если ТипЗнч(ДанныеДляСохранения) <> Тип(\"Структура\") Тогда\n"
" ДанныеДляСохранения = Новый Структура();\n"
" КонецЕсли;\n"
" \n"
" Если ЗначениеЗаполнено(Ключ) Тогда\n"
" ДанныеДляСохранения.Вставить(Ключ, Данные);\n"
" Иначе\n"
" ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ДанныеДляСохранения, Данные, Истина);\n"
" КонецЕсли;\n"
" \n"
" ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6));\n"
" БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения;\n"
" БезопасноеХранилищеДанных.Записать();\n"
" \n"
" Иначе\n"
" \n"
" ДанныеДляСохранения = ?(ЗначениеЗаполнено(Ключ), Новый Структура(Ключ, Данные), Данные);\n"
" ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6));\n"
" \n"
" БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения;\n"
" БезопасноеХранилищеДанных.Владелец = Владелец;\n"
" БезопасноеХранилищеДанных.Записать();\n"
" \n"
" КонецЕсли;\n"
" Иначе\n"
" \n"
" БезопасноеХранилищеДанных.Удалить();\n"
" \n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращает данные из безопасного хранилища.\n"
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим.\n"
"//\n"
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов),\n"
"// а доступно только коду, который делает обращения только к своей части данных и\n"
"// в том контексте, который предполагает чтение или запись конфиденциальных данных.\n"
"//\n"
"// Параметры:\n"
"// Владельцы - Массив из ПланОбменаСсылка\n"
"// - Массив из СправочникСсылка\n"
"// - Массив из Строка - ссылки на объекты информационной базы,\n"
"// представляющих объекты-владельцы или уникальные строки(до 128 символов) владельцев данных.\n"
"// Ключи - Строка - содержит имя ключа данных или список имен ключей, указанных через запятую.\n"
"// - Неопределено - будут возвращены все сохраненные данные переданных владельцев. \n"
"// ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Соответствие из КлючИЗначение:\n"
"// * Ключ - ПланОбменаСсылка\n"
"// - СправочникСсылка\n"
"// - Строка - ссылка на объект информационной базы \n"
"// или строка до 128 символов идентифицирующая владельца данных.\n"
"// * Значение - Произвольный - если в параметре Ключи указан один ключ, \n"
"// то возвращается его значение произвольного типа.\n"
"// - Структура - если в параметре Ключи указано несколько ключей или Неопределено, \n"
"// где ключ структуры - это имя ключа сохраненных данных, \n"
"// а значение - данные произвольного типа. Когда для ключа отсутствуют данные, \n"
"// то значение содержит Неопределено.\n"
"// - Неопределено - если данные по ключу отсутствуют.\n"
"//\n"
"// Пример:\n"
"// Процедура РассылкаПриглашений(Пользователи)\n"
"// \n"
"// УстановитьПривилегированныйРежим(Истина);\n"
"// ДанныеАвторизации = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Пользователи, \"Логин, Пароль\");\n"
"// УстановитьПривилегированныйРежим(Ложь);\n"
"// \n"
"// Для каждого Пользователь Из Пользователи Цикл\n"
"// ОтправитьПриглашение(Пользователь, ДанныеАвторизации[Пользователь]);\n"
"// КонецЦикла;\n"
"// \n"
"// КонецПроцедуры\n"
"//\n"
"Функция ПрочитатьДанныеВладельцевИзБезопасногоХранилища(Владельцы, Ключи = \"Пароль\", ОбщиеДанные = Неопределено) Экспорт\n"
" \n"
" ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Владельцы) = Тип(\"Массив\"),\n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Недопустимое значение параметра %1 в %2.\n"
" |параметр должен содержать массив; передано значение: %3 (тип %4).'\"),\n"
" \"Владельцы\", \"ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища\", Владельцы, ТипЗнч(Владельцы)));\n"
" \n"
" Результат = ДанныеИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные);\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает данные из безопасного хранилища.\n"
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим.\n"
"//\n"
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов),\n"
"// а доступно только коду, который делает обращения только к своей части данных и\n"
"// в том контексте, который предполагает чтение или запись конфиденциальных данных.\n"
"//\n"
"// Параметры:\n"
"// Владелец - ПланОбменаСсылка\n"
"// - СправочникСсылка\n"
"// - Строка - ссылка на объект информационной базы,\n"
"// представляющий объект-владелец сохраняемого пароля или уникальная строка(до 128 символов).\n"
"// Ключи - Строка - содержит список имен сохраненных данных, указанных через запятую.\n"
"// - Неопределено - будут возвращены все сохраненные данные владельца.\n"
"// ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Произвольный, Структура, Неопределено - данные из безопасного хранилища. Если указан один ключ,\n"
"// то возвращается его значение, иначе структура.\n"
"// Если данные отсутствуют - Неопределенно.\n"
"//\n"
"// Пример:\n"
"// Если ТекущийПользовательМожетИзменятьПароль Тогда\n"
"// УстановитьПривилегированныйРежим(Истина);\n"
"// Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, \"Логин\");\n"
"// Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка);\n"
"// УстановитьПривилегированныйРежим(Ложь);\n"
"// Иначе\n"
"// Элементы.ГруппаЛогинИПароль.Видимость = Ложь;\n"
"// КонецЕсли;\n"
"// \n"
"// УстановитьПривилегированныйРежим(Истина);\n"
"// ЛогинИПароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, Неопределено);\n"
"//\n"
"Функция ПрочитатьДанныеИзБезопасногоХранилища(Владелец, Ключи = \"Пароль\", ОбщиеДанные = Неопределено) Экспорт\n"
" \n"
" Владельцы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Владелец);\n"
" ДанныеВладельца = ПрочитатьДанныеВладельцевИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные);\n"
" \n"
" Результат = ДанныеВладельца[Владелец];\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Удаляет конфиденциальные данные в безопасное хранилище.\n"
"// Вызывающий код должен самостоятельно устанавливать привилегированный режим.\n"
"//\n"
"// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов),\n"
"// а доступно только коду, который делает обращения только к своей части данных и\n"
"// в том контексте, который предполагает чтение или запись конфиденциальных данных.\n"
"//\n"
"// Параметры:\n"
"// Владелец - ПланОбменаСсылка\n"
"// - СправочникСсылка\n"
"// - Строка - ссылка на объект информационной базы,\n"
"// представляющий объект-владелец сохраняемого пароля или уникальная строка(до 128 символов).\n"
"// - Массив - ссылки на объекты информационной базы для удаления данным по нескольким владельцам.\n"
"// Ключи - Строка - содержит список имен удаляемых данных, указанных через запятую. \n"
"// Неопределено - удаляет все данные.\n"
"//\n"
"// Пример:\n"
"// Процедура ПередУдалением(Отказ)\n"
"// \n"
"// // Проверка значения свойства ОбменДанными.Загрузка отсутствует, так как удалять данные\n"
"// // из безопасного хранилища нужно даже при удалении объекта при обмене данными.\n"
"// \n"
"// УстановитьПривилегированныйРежим(Истина);\n"
"// ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища(Ссылка);\n"
"// УстановитьПривилегированныйРежим(Ложь);\n"
"// \n"
"// КонецПроцедуры\n"
"//\n"
"Процедура УдалитьДанныеИзБезопасногоХранилища(Владелец, Ключи = Неопределено) Экспорт\n"
" \n"
" ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец),\n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Недопустимое значение параметра %1 в %2.\n"
" |параметр должен содержать ссылку; передано значение: %3 (тип %4).'\"),\n"
" \"Владелец\", \"ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища\", Владелец, ТипЗнч(Владелец)));\n"
" \n"
" Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() Тогда\n"
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи();\n"
" Иначе\n"
" БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();\n"
" КонецЕсли; \n"
" \n"
" Владельцы = ?(ТипЗнч(Владелец) = Тип(\"Массив\"), Владелец, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Владелец));\n"
" \n"
" Для Каждого ВладелецДанных Из Владельцы Цикл\n"
" \n"
" БезопасноеХранилищеДанных.Владелец = ВладелецДанных;\n"
" БезопасноеХранилищеДанных.Прочитать();\n"
" Если ТипЗнч(БезопасноеХранилищеДанных.Данные) = Тип(\"ХранилищеЗначения\") Тогда\n"
" ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить();\n"
" Если Ключи <> Неопределено И ТипЗнч(ДанныеДляСохранения) = Тип(\"Структура\") Тогда\n"
" СписокКлючей = СтрРазделить(Ключи, \",\", Ложь);\n"
" Если БезопасноеХранилищеДанных.Выбран() И СписокКлючей.Количество() > 0 Тогда\n"
" Для каждого КлючДляУдаления Из СписокКлючей Цикл\n"
" Если ДанныеДляСохранения.Свойство(КлючДляУдаления) Тогда\n"
" ДанныеДляСохранения.Удалить(КлючДляУдаления);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6));\n"
" БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения;\n"
" БезопасноеХранилищеДанных.Записать();\n"
" Возврат;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" БезопасноеХранилищеДанных.Удалить();\n"
" \n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#Область БуферОбмена\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Процедуры и функции для работы с внутренним буфером обмена.\n\n"
"// Помещает выделенные строки табличной части во внутренний буфер обмена\n"
"// откуда их можно получить с помощью СтрокиИзБуфераОбмена.\n"
"//\n"
"// Параметры:\n"
"// ТабличнаяЧасть - ДанныеФормыКоллекция - табличная часть, строки которой\n"
"// необходимо поместить во внутренний буфер обмена.\n"
"// ВыделенныеСтроки - Массив - массив идентификаторов выделенных строк.\n"
"// Источник - Строка - произвольный строковый идентификатор, например, имя объекта,\n"
"// строки табличной части которого помещаются во внутренний буфер обмена.\n"
"//\n"
"Процедура СкопироватьСтрокиВБуферОбмена(ТабличнаяЧасть, ВыделенныеСтроки, Источник = Неопределено) Экспорт\n"
" \n"
" Если ВыделенныеСтроки = Неопределено Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" ТаблицаЗначений = ТабличнаяЧасть.Выгрузить();\n"
" ТаблицаЗначений.Очистить();\n"
" \n"
" УдаляемыеКолонки = Новый Массив;\n"
" УдаляемыеКолонки.Добавить(\"ИсходныйНомерСтроки\");\n"
" УдаляемыеКолонки.Добавить(\"НомерСтроки\");\n"
" \n"
" Для Каждого ИмяКолонки Из УдаляемыеКолонки Цикл\n"
" Колонка = ТаблицаЗначений.Колонки.Найти(ИмяКолонки);\n"
" Если Колонка = Неопределено Тогда\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" ТаблицаЗначений.Колонки.Удалить(Колонка);\n"
" КонецЦикла;\n"
" \n"
" Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл\n"
" КопируемаяСтрока = ТабличнаяЧасть.НайтиПоИдентификатору(ИдентификаторСтроки);\n"
" ЗаполнитьЗначенияСвойств(ТаблицаЗначений.Добавить(), КопируемаяСтрока);\n"
" КонецЦикла;\n"
" \n"
" СкопироватьВБуферОбмена(ТаблицаЗначений, Источник);\n"
" \n"
"КонецПроцедуры\n\n"
"// Помещает произвольные данные во внутренний буфер обмена, откуда их можно получить с помощью СтрокиИзБуфераОбмена.\n"
"//\n"
"// Параметры:\n"
"// Данные - Произвольный - данные, которые необходимо поместить в внутренний буфер обмена.\n"
"// Источник - Строка - произвольный строковый идентификатор, например, имя объекта,\n"
"// строки табличной части которого помещаются во внутренний буфер обмена.\n"
"//\n"
"Процедура СкопироватьВБуферОбмена(Данные, Источник = Неопределено) Экспорт\n"
" \n"
" ТекущийБуферОбмена = ПараметрыСеанса.БуферОбмена;\n"
" \n"
" Если ЗначениеЗаполнено(ТекущийБуферОбмена.Данные) Тогда\n"
" Адрес = ТекущийБуферОбмена.Данные;\n"
" Иначе\n"
" Адрес = Новый УникальныйИдентификатор;\n"
" КонецЕсли;\n"
" \n"
" ДанныеВХранилище = ПоместитьВоВременноеХранилище(Данные, Адрес);\n"
" \n"
" СтруктураБуфераОбмена = Новый Структура;\n"
" СтруктураБуфераОбмена.Вставить(\"Источник\", Источник);\n"
" СтруктураБуфераОбмена.Вставить(\"Данные\", ДанныеВХранилище);\n"
" \n"
" ПараметрыСеанса.БуферОбмена = Новый ФиксированнаяСтруктура(СтруктураБуфераОбмена);\n"
" \n"
"КонецПроцедуры\n\n"
"// Получает строки табличной части, помещенные во внутренний буфер обмена с помощью СкопироватьСтрокиВБуферОбмена.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * Данные - Произвольный - данные из внутреннего буфера обмена.\n"
"// Например, ТаблицаЗначений при вызове СкопироватьСтрокиВБуферОбмена.\n"
"// * Источник - Строка - объект, к которому относятся данные.\n"
"// Если при помещении во внутренний буфер не был указан, то Неопределено.\n"
"//\n"
"Функция СтрокиИзБуфераОбмена() Экспорт\n"
" \n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"Источник\", Неопределено);\n"
" Результат.Вставить(\"Данные\", Неопределено);\n"
" \n"
" Если ПустойБуферОбмена() Тогда\n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" ТекущийБуферОбмена = ПараметрыСеанса.БуферОбмена; // см. СтрокиИзБуфераОбмена\n"
" Результат.Источник = ТекущийБуферОбмена.Источник;\n"
" Результат.Данные = ПолучитьИзВременногоХранилища(ТекущийБуферОбмена.Данные);\n"
" \n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Проверяет наличие сохраненных данных во внутренний буфере обмена.\n"
"//\n"
"// Параметры:\n"
"// Источник - Строка - если передан, то проверяется наличие данных\n"
"// в внутреннем буфере обмена с этим ключом.\n"
"// По умолчанию - Неопределено.\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если пустой.\n"
"//\n"
"Функция ПустойБуферОбмена(Источник = Неопределено) Экспорт\n"
" \n"
" ТекущийБуферОбмена = ПараметрыСеанса.БуферОбмена; // см. СтрокиИзБуфераОбмена\n"
" ИсточникСовпадает = Истина;\n"
" Если Источник <> Неопределено Тогда\n"
" ИсточникСовпадает = (Источник = ТекущийБуферОбмена.Источник);\n"
" КонецЕсли;\n"
" Возврат (Не ИсточникСовпадает Или Не ЗначениеЗаполнено(ТекущийБуферОбмена.Данные));\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область БезопасноеВыполнениеВнешнегоКода\n\n"
"////////////////////////////////////////////////////////////////////////////////\n"
"// Функции для поддержки работы конфигурации с профилем безопасности, в котором\n"
"// запрещено подключение внешних модулей без установки безопасного режима.\n"
"//\n\n"
"// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации.\n"
"// При включении профилей безопасности для вызова оператора Выполнить() используется\n"
"// переход в безопасный режим с профилем безопасности, используемым для информационной базы\n"
"// (если выше по стеку не был установлен другой безопасный режим).\n"
"//\n"
"// Параметры:\n"
"// ИмяМетода - Строка - имя экспортной процедуры в формате\n"
"// <имя объекта>.<имя процедуры>, где <имя объекта> - это\n"
"// общий модуль или модуль менеджера объекта.\n"
"// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры>\n"
"// в порядке расположения элементов массива.\n"
"// \n"
"// Пример:\n"
"// Параметры = Новый Массив();\n"
"// Параметры.Добавить(\"1\");\n"
"// ОбщегоНазначения.ВыполнитьМетодКонфигурации(\"МойОбщийМодуль.МояПроцедура\", Параметры);\n"
"//\n"
"Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт\n"
" \n"
" ПроверитьИмяПроцедурыКонфигурации(ИмяМетода);\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ПрофилиБезопасности\") Тогда\n"
" МодульРаботаВБезопасномРежиме = ОбщийМодуль(\"РаботаВБезопасномРежиме\");\n"
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()\n"
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда\n"
" \n"
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();\n"
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда\n"
" \n"
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);\n"
" Если БезопасныйРежим() = Истина Тогда\n"
" УстановитьБезопасныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ПараметрыСтрока = \"\";\n"
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда\n"
" Для Индекс = 0 По Параметры.ВГраница() Цикл \n"
" ПараметрыСтрока = ПараметрыСтрока + \"Параметры[\" + XMLСтрока(Индекс) + \"],\";\n"
" КонецЦикла;\n"
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);\n"
" КонецЕсли;\n"
" \n"
" Выполнить ИмяМетода + \"(\" + ПараметрыСтрока + \")\";\n"
" \n"
"КонецПроцедуры\n\n"
"// Выполнить экспортную процедуру объекта встроенного языка по имени.\n"
"// При включении профилей безопасности для вызова оператора Выполнить() используется\n"
"// переход в безопасный режим с профилем безопасности, используемым для информационной базы\n"
"// (если выше по стеку не был установлен другой безопасный режим).\n"
"//\n"
"// Параметры:\n"
"// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект).\n"
"// ИмяМетода - Строка - имя экспортной процедуры модуля объекта обработки.\n"
"// Параметры - Массив - параметры передаются в процедуру <ИмяПроцедуры>\n"
"// в порядке расположения элементов массива.\n"
"//\n"
"Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт\n"
" \n"
" // Проверка имени метода на корректность.\n"
" Попытка\n"
" Тест = Новый Структура(ИмяМетода, ИмяМетода);\n"
" Если Тест = Неопределено Тогда \n"
" ВызватьИсключение НСтр(\"ru = 'Синтетический тест'\");\n"
" КонецЕсли;\n"
" Исключение\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Некорректное значение параметра %1 (%2) в %3.'\"), \n"
" \"ИмяМетода\", ИмяМетода, \"ОбщегоНазначения.ВыполнитьМетодОбъекта\");\n"
" КонецПопытки;\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ПрофилиБезопасности\") Тогда\n"
" МодульРаботаВБезопасномРежиме = ОбщийМодуль(\"РаботаВБезопасномРежиме\");\n"
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()\n"
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда\n"
" \n"
" МодульРаботаВБезопасномРежиме = ОбщийМодуль(\"РаботаВБезопасномРежиме\");\n"
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();\n"
" \n"
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда\n"
" \n"
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);\n"
" Если БезопасныйРежим() = Истина Тогда\n"
" УстановитьБезопасныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ПараметрыСтрока = \"\";\n"
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда\n"
" Для Индекс = 0 По Параметры.ВГраница() Цикл \n"
" ПараметрыСтрока = ПараметрыСтрока + \"Параметры[\" + XMLСтрока(Индекс) + \"],\";\n"
" КонецЦикла;\n"
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);\n"
" КонецЕсли;\n"
" \n"
" Выполнить \"Объект.\" + ИмяМетода + \"(\" + ПараметрыСтрока + \")\";\n"
" \n"
"КонецПроцедуры\n\n"
"// Выполняет произвольный алгоритм на встроенном языке 1С:Предприятия, предварительно устанавливая\n"
"// безопасный режим выполнения кода и безопасный режим разделения данных для всех разделителей,\n"
"// присутствующих в составе конфигурации.\n"
"//\n"
"// Параметры:\n"
"// Алгоритм - Строка - алгоритм на встроенном языке \"1С:Предприятия\".\n"
"// Параметры - Произвольный - контекст, который требуется для выполнения алгоритма.\n"
"// В тексте алгоритма обращение к контексту должно происходить по имени \"Параметры\".\n"
"// Например, выражение \"Параметры.Значение1 = Параметры.Значение2\" обращается к значениям\n"
"// \"Значение1\" и \"Значение2\", переданным в Параметры, как свойства.\n"
"//\n"
"// Пример:\n"
"//\n"
"// Параметры = Новый Структура;\n"
"// Параметры.Вставить(\"Значение1\", 1);\n"
"// Параметры.Вставить(\"Значение2\", 10);\n"
"// ОбщегоНазначения.ВыполнитьВБезопасномРежиме(\"Параметры.Значение1 = Параметры.Значение2\", Параметры);\n"
"//\n"
"Процедура ВыполнитьВБезопасномРежиме(Знач Алгоритм, Знач Параметры = Неопределено) Экспорт\n"
" \n"
" УстановитьБезопасныйРежим(Истина);\n"
" \n"
" Если ПодсистемаСуществует(\"ТехнологияСервиса.БазоваяФункциональность\") Тогда\n"
" МодульРаботаВМоделиСервиса = ОбщийМодуль(\"РаботаВМоделиСервиса\");\n"
" МассивРазделителей = МодульРаботаВМоделиСервиса.РазделителиКонфигурации();\n"
" Иначе\n"
" МассивРазделителей = Новый Массив;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого ИмяРазделителя Из МассивРазделителей Цикл\n"
" \n"
" УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина);\n"
" \n"
" КонецЦикла;\n"
" \n"
" Выполнить Алгоритм;\n"
" \n"
"КонецПроцедуры\n\n"
"// Вычисляет переданное выражение, предварительно устанавливая безопасный режим выполнения кода\n"
"// и безопасный режим разделения данных для всех разделителей, присутствующих в составе конфигурации.\n"
"//\n"
"// Параметры:\n"
"// Выражение - Строка - выражение на встроенном языке 1С:Предприятия.\n"
"// Параметры - Произвольный - контекст, который требуется для вычисления выражения.\n"
"// В тексте выражения обращение к контексту должно происходить по имени \"Параметры\".\n"
"// Например, выражение \"Параметры.Значение1 = Параметры.Значение2\" обращается к значениям\n"
"// \"Значение1\" и \"Значение2\" переданные в Параметры, как свойства.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Произвольный - результат вычисления выражения.\n"
"//\n"
"// Пример:\n"
"//\n"
"// // Пример 1\n"
"// Параметры = Новый Структура;\n"
"// Параметры.Вставить(\"Значение1\", 1);\n"
"// Параметры.Вставить(\"Значение2\", 10);\n"
"// Результат = ОбщегоНазначения.ВычислитьВБезопасномРежиме(\"Параметры.Значение1 = Параметры.Значение2\", Параметры);\n"
"//\n"
"// // Пример 2\n"
"// Результат = ОбщегоНазначения.ВычислитьВБезопасномРежиме(\"СтандартныеПодсистемыСервер.ВерсияБиблиотеки()\");\n"
"//\n"
"Функция ВычислитьВБезопасномРежиме(Знач Выражение, Знач Параметры = Неопределено) Экспорт\n"
" \n"
" УстановитьБезопасныйРежим(Истина);\n"
" \n"
" Если ПодсистемаСуществует(\"ТехнологияСервиса.БазоваяФункциональность\") Тогда\n"
" МодульРаботаВМоделиСервиса = ОбщийМодуль(\"РаботаВМоделиСервиса\");\n"
" МассивРазделителей = МодульРаботаВМоделиСервиса.РазделителиКонфигурации();\n"
" Иначе\n"
" МассивРазделителей = Новый Массив;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого ИмяРазделителя Из МассивРазделителей Цикл\n"
" \n"
" УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина);\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат Вычислить(Выражение);\n"
" \n"
"КонецФункции\n\n"
"// Возвращает описание защиты от опасных действий с отключенными предупреждениями.\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОписаниеЗащитыОтОпасныхДействий - со свойством ПредупреждатьОбОпасныхДействиях = Ложь.\n"
"//\n"
"Функция ОписаниеЗащитыБезПредупреждений() Экспорт\n"
" \n"
" ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;\n"
" ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;\n"
" \n"
" Возврат ОписаниеЗащиты;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область Запросы\n\n"
"// Подготавливает строку для использования в качестве шаблона поиска в запросе с оператором ПОДОБНО.\n"
"// Экранирует служебные символы, если они есть в строке.\n"
"//\n"
"// Параметры:\n"
"// СтрокаПоиска - Строка - произвольная строка.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка\n"
"// \n"
"// Пример:\n"
"// ВЫБРАТЬ\n"
"// Номенклатура.Ссылка КАК Ссылка\n"
"// ИЗ\n"
"// Справочник.Номенклатура КАК Номенклатура\n"
"// ГДЕ\n"
"// Номенклатура.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ \"~\"\n"
"//\n"
"// Запрос.УстановитьПараметр(\"Шаблон\", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИскомыйТекст));\n"
"//\n"
"Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт\n"
" \n"
" Результат = СтрокаПоиска;\n"
" Результат = СтрЗаменить(Результат, \"~\", \"~~\");\n"
" Результат = СтрЗаменить(Результат, \"%\", \"~%\");\n"
" Результат = СтрЗаменить(Результат, \"_\", \"~_\");\n"
" Результат = СтрЗаменить(Результат, \"[\", \"~[\");\n"
" Результат = СтрЗаменить(Результат, \"]\", \"~]\");\n"
" Результат = СтрЗаменить(Результат, \"^\", \"~^\"); \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Возвращает фрагмент текста запроса, отделяющего один запрос от другого.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - разделитель запросов.\n"
"//\n"
"Функция РазделительПакетаЗапросов() Экспорт\n"
" \n"
" Возврат \"\n"
" |;\n"
" |\n"
" |////////////////////////////////////////////////////////////////////////////////\n"
" |\";\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область Прочее\n\n"
"// Выполняет проверки перед выполнением обработчика регламентного задания и прерывает выполнение,\n"
"// если его запуск в данный момент невозможен, например:\n"
"// - еще не завершено обновление программы;\n"
"// - запуск через консоль или другим способом, минуя включение функциональной опции \n"
"// (если регламентное задание зависит от функциональных опций);\n"
"// - попытка выполнения задания, работающего с внешними ресурсами в копии информационной базы.\n"
"//\n"
"// Параметры:\n"
"// РегламентноеЗадание - ОбъектМетаданныхРегламентноеЗадание - регламентное задание,\n"
"// из которого вызывается данная процедура.\n"
"//\n"
"// Пример:\n"
"// ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.<ИмяРегламентногоЗадания>);\n"
"//\n"
"Процедура ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание = Неопределено) Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Если РегистрыСведений.ПараметрыРаботыПрограммы.НеобходимоОбновление() Тогда\n"
" Текст = НСтр(\"ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию.\n"
" |Рекомендуется запрещать выполнение регламентных заданий на время обновления.'\");\n"
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);\n"
" ВызватьИсключение Текст;\n"
" КонецЕсли;\n"
" \n"
" Если Не РазделениеВключено()\n"
" И ПланыОбмена.ГлавныйУзел() = Неопределено\n"
" И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()) Тогда\n"
" \n"
" Текст = НСтр(\"ru = 'Вход в программу временно невозможен до восстановления связи с главным узлом.\n"
" |Рекомендуется запрещать выполнение регламентных заданий на время восстановления.'\");\n"
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);\n"
" ВызватьИсключение Текст;\n"
" КонецЕсли;\n"
" \n"
" Если РегламентноеЗадание <> Неопределено\n"
" И ПодсистемаСуществует(\"СтандартныеПодсистемы.РегламентныеЗадания\") Тогда\n"
" \n"
" МодульБлокировкаРаботыСВнешнимиРесурсами = ОбщийМодуль(\"БлокировкаРаботыСВнешнимиРесурсами\");\n"
" МодульБлокировкаРаботыСВнешнимиРесурсами.ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание);\n"
" \n"
" МодульРегламентныеЗаданияСлужебный = ОбщийМодуль(\"РегламентныеЗаданияСлужебный\");\n"
" Доступно = МодульРегламентныеЗаданияСлужебный.РегламентноеЗаданиеДоступноПоФункциональнымОпциям(РегламентноеЗадание);\n"
" \n"
" Если Не Доступно Тогда\n"
" Задания = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура(\"Метаданные\", РегламентноеЗадание));\n"
" Для Каждого Задание Из Задания Цикл\n"
" РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор,\n"
" Новый Структура(\"Использование\", Ложь));\n"
" КонецЦикла;\n"
" Текст = НСтр(\"ru = 'Регламентное задание недоступно по функциональным опциям или\n"
" |не поддерживает работу в текущем режиме работы программы.\n"
" |Выполнение прервано. Задание отключено.'\");\n"
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);\n"
" ВызватьИсключение Текст;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Если СтандартныеПодсистемыСервер.ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Тогда\n"
" Текст = НСтр(\"ru = 'Регламентное задание недоступно до установки начальных региональных настроек программы.\n"
" |Выполнение прервано.'\");\n"
" РегламентныеЗаданияСервер.ОтменитьВыполнениеЗадания(РегламентноеЗадание, Текст);\n"
" ВызватьИсключение Текст;\n"
" КонецЕсли;\n"
" \n"
" Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений();\n"
" \n"
" РегистрыСведений.ПараметрыРаботыВерсийРасширений.ПриУспешномНачалеВыполненияРегламентногоЗадания();\n"
" \n"
"КонецПроцедуры\n\n"
"// Переводит параметры сеанса в состояние \"Не установлено\". \n"
"// \n"
"// Параметры:\n"
"// ПараметрыДляОчистки - Строка - имена параметров сеанса для очистки, разделенные \",\".\n"
"// Исключения - Строка - имена параметров сеанса не предназначенные для очистки, разделенные \",\".\n"
"//\n"
"Процедура ОчиститьПараметрыСеанса(ПараметрыДляОчистки = \"\", Исключения = \"\") Экспорт\n"
" \n"
" МассивИсключений = СтрРазделить(Исключения, \",\");\n"
" МассивПараметровДляОчистки = СтрРазделить(ПараметрыДляОчистки, \",\", Ложь);\n"
" \n"
" Если МассивПараметровДляОчистки.Количество() = 0 Тогда\n"
" Для Каждого ПараметрСеанса Из Метаданные.ПараметрыСеанса Цикл\n"
" Если МассивИсключений.Найти(ПараметрСеанса.Имя) = Неопределено Тогда\n"
" МассивПараметровДляОчистки.Добавить(ПараметрСеанса.Имя);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" Индекс = МассивПараметровДляОчистки.Найти(\"ПараметрыКлиентаНаСервере\");\n"
" Если Индекс <> Неопределено Тогда\n"
" МассивПараметровДляОчистки.Удалить(Индекс);\n"
" КонецЕсли;\n"
" \n"
" Индекс = МассивПараметровДляОчистки.Найти(\"ОсновнойЯзык\");\n"
" Если Индекс <> Неопределено Тогда\n"
" МассивПараметровДляОчистки.Удалить(Индекс);\n"
" КонецЕсли;\n"
" \n"
" Индекс = МассивПараметровДляОчистки.Найти(\"УстановленныеРасширения\");\n"
" Если Индекс <> Неопределено Тогда\n"
" МассивПараметровДляОчистки.Удалить(Индекс);\n"
" КонецЕсли;\n"
" \n"
" ПараметрыСеанса.Очистить(МассивПараметровДляОчистки);\n"
" \n"
"КонецПроцедуры\n\n"
"// Проверяет, умещаются ли переданные табличные документы на страницу при печати.\n"
"//\n"
"// Параметры:\n"
"// ТабДокумент - ТабличныйДокумент - табличный документ.\n"
"// ВыводимыеОбласти - Массив\n"
"// - ТабличныйДокумент - массив из проверяемых таблиц или табличный документ. \n"
"// РезультатПриОшибке - Булево - какой возвращать результат при возникновении ошибки.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - умещаются или нет переданные документы.\n"
"//\n"
"Функция ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти, РезультатПриОшибке = Истина) Экспорт\n\n"
" Попытка\n"
" Возврат ТабДокумент.ПроверитьВывод(ВыводимыеОбласти);\n"
" Исключение\n"
" Возврат РезультатПриОшибке;\n"
" КонецПопытки;\n\n"
"КонецФункции \n\n"
"// Сохраняет персональные настройки пользователя, относящиеся к подсистеме БазоваяФункциональность.\n"
"// Для получения настроек предусмотрены следующие функции:\n"
"// - ОбщегоНазначенияКлиент.ПредлагатьУстановкуРасширенияРаботыСФайлами(),\n"
"// - СтандартныеПодсистемыСервер.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы(),\n"
"// - СтандартныеПодсистемыСервер.ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы().\n"
"// \n"
"// Параметры:\n"
"// Настройки - Структура:\n"
"// * НапоминатьОбУстановкеРасширенияРаботыСФайлами - Булево - признак необходимости\n"
"// напоминания об установке расширения.\n"
"// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - запрашивать подтверждение по завершении работы.\n"
"// * ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы - Булево - показывать оповещение при\n"
"// динамическом обновлении программы.\n"
"//\n"
"Процедура СохранитьПерсональныеНастройки(Настройки) Экспорт\n"
" \n"
" Если Настройки.Свойство(\"НапоминатьОбУстановкеРасширенияРаботыСФайлами\") Тогда\n"
" Если ЭтоВебКлиент() Тогда\n"
" ИдентификаторКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ИдентификаторКлиента\");\n"
" Если ИдентификаторКлиента = Неопределено Тогда\n"
" СистемнаяИнформация = Новый СистемнаяИнформация;\n"
" ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;\n"
" КонецЕсли;\n"
" ХранилищеОбщихНастроекСохранить(\n"
" \"НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами\",\n"
" ИдентификаторКлиента, Настройки.НапоминатьОбУстановкеРасширенияРаботыСФайлами);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Если Настройки.Свойство(\"ЗапрашиватьПодтверждениеПриЗавершенииПрограммы\") Тогда\n"
" ХранилищеОбщихНастроекСохранить(\"ОбщиеНастройкиПользователя\",\n"
" \"ЗапрашиватьПодтверждениеПриЗавершенииПрограммы\",\n"
" Настройки.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы);\n"
" КонецЕсли;\n"
" \n"
" Если Настройки.Свойство(\"ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы\") Тогда\n"
" ХранилищеОбщихНастроекСохранить(\"ОбщиеНастройкиПользователя\",\n"
" \"ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы\",\n"
" Настройки.ПоказыватьПредупреждениеОбУстановленныхОбновленияхПрограммы);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"// Выполняет пропорциональное распределение суммы в соответствии\n"
"// с заданными коэффициентами распределения. \n"
"//\n"
"// Параметры:\n"
"// РаспределяемаяСумма - Число - сумма, которую надо распределить, если сумма равна 0 - то возвращается Неопределено;\n"
"// Если передана отрицательная - расчет по модулю и после инверсия знаков результата.\n"
"// Коэффициенты - Массив из Число - коэффициенты распределения, должны быть положительны или отрицательными \n"
"// одновременно.\n"
"// Точность - Число - точность округления при распределении. \n"
"//\n"
"// Возвращаемое значение:\n"
"// Массив из Число - массив размерностью равный массиву коэффициентов, содержит\n"
"// суммы в соответствии с весом коэффициента (из массива коэффициентов).\n"
"// В случае, если распределить невозможно (кол-во коэффициентов = 0\n"
"// есть коэффициенты с отрицательным значением или суммарный вес коэффициентов = 0),\n"
"// тогда будет возвращено Неопределено.\n"
"//\n"
"// Пример:\n"
"//\n"
"// Коэффициенты = Новый Массив;\n"
"// Коэффициенты.Добавить(1);\n"
"// Коэффициенты.Добавить(2);\n"
"// Результат = ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам(1, Коэффициенты);\n"
"// // Результат = [0.33, 0.67]\n"
"//\n"
"Функция РаспределитьСуммуПропорциональноКоэффициентам(\n"
" Знач РаспределяемаяСумма, Коэффициенты, Знач Точность = 2) Экспорт\n"
" \n"
" Возврат ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам(\n"
" РаспределяемаяСумма, Коэффициенты, Точность);\n"
" \n"
"КонецФункции\n\n"
"// Процедура предназначена для заполнения реквизита формы типа ДанныеФормыДерево.\n"
"//\n"
"// Параметры:\n"
"// КоллекцияЭлементовДерева - ДанныеФормыКоллекцияЭлементовДерева - реквизит, который нужно заполнить.\n"
"// ДеревоЗначений - ДеревоЗначений - данные для заполнения.\n"
"// \n"
"Процедура ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, ДеревоЗначений) Экспорт\n"
" \n"
" Для Каждого Строка Из ДеревоЗначений.Строки Цикл\n"
" \n"
" ЭлементДерева = КоллекцияЭлементовДерева.Добавить();\n"
" ЗаполнитьЗначенияСвойств(ЭлементДерева, Строка);\n"
" Если Строка.Строки.Количество() > 0 Тогда\n"
" ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(ЭлементДерева.ПолучитьЭлементы(), Строка);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"// Подключает внешнюю компоненту, выполненную по технологии Native API или COM,\n"
"// из макета конфигурации (хранится в виде ZIP-архива).\n"
"//\n"
"// Параметры:\n"
"// Идентификатор - Строка - идентификатор объекта внешней компоненты.\n"
"// ПолноеИмяМакета - Строка - полное имя макета конфигурации с ZIP-архивом.\n"
"// Изолированно - Булево, Неопределено - (по умолчанию Ложь) если Истина, компонента будет подключена\n"
"// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы;\n"
"// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы,\n"
"// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию:\n"
"// не изолированно - если компонентой поддерживается только этот режим, изолированно - в остальных случаях.\n"
"// См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866\n"
"//\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОбъектВнешнейКомпоненты, Неопределено - экземпляр объекта внешней компоненты или Неопределено, если не удалось создать.\n"
"//\n"
"// Пример:\n"
"//\n"
"// ПодключаемыйМодуль = ОбщегоНазначения.ПодключитьКомпонентуИзМакета(\n"
"// \"QRCodeExtension\",\n"
"// \"ОбщийМакет.КомпонентаПечатиQRКода\");\n"
"//\n"
"// Если ПодключаемыйМодуль <> Неопределено Тогда \n"
"// // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты.\n"
"// КонецЕсли;\n"
"//\n"
"// ПодключаемыйМодуль = Неопределено;\n"
"//\n"
"Функция ПодключитьКомпонентуИзМакета(Знач Идентификатор, Знач ПолноеИмяМакета, Знач Изолированно = Ложь) Экспорт\n"
" \n"
" РезультатПроверкиВнешнейКомпоненты = Неопределено;\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ВнешниеКомпоненты\") Тогда\n"
" МодульВнешниеКомпонентыСлужебный = ОбщийМодуль(\"ВнешниеКомпонентыСлужебный\");\n"
" РезультатПроверкиВнешнейКомпоненты = МодульВнешниеКомпонентыСлужебный.ПроверитьПодключениеКомпоненты(Идентификатор);\n"
" РезультатПроверкиВнешнейКомпоненты.Вставить(\"Доступна\", \n"
" Не ЗначениеЗаполнено(РезультатПроверкиВнешнейКомпоненты.ОписаниеОшибки));\n"
" КонецЕсли;\n"
" \n"
" КомпонентаПоследнейВерсии = СтандартныеПодсистемыСервер.КомпонентаПоследнейВерсии(\n"
" Идентификатор, ПолноеИмяМакета, РезультатПроверкиВнешнейКомпоненты);\n"
" \n"
" Результат = ПодключитьКомпонентуПоИдентификатору(Идентификатор,\n"
" КомпонентаПоследнейВерсии.Местоположение, Изолированно);\n"
" \n"
" Возврат Результат.ПодключаемыйМодуль;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область УстаревшиеПроцедурыИФункции\n\n"
"// Устарела. Следует использовать\n"
"// ОбщегоНазначения.РазделениеВключено И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево\n"
"//\n"
"Функция ИспользованиеРазделителяСеанса() Экспорт\n"
" \n"
" Если Не РазделениеВключено() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Если ПодсистемаСуществует(\"ТехнологияСервиса.БазоваяФункциональность\") Тогда\n"
" МодульРаботаВМоделиСервиса = ОбщийМодуль(\"РаботаВМоделиСервиса\");\n"
" Возврат МодульРаботаВМоделиСервиса.ИспользованиеРазделителяСеанса();\n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"// Устарела. Следует использовать ФайловаяСистема.СоздатьВременныйКаталог\n"
"// Создает временный каталог. После окончания работы с временным каталогом его необходимо удалить \n"
"// с помощью ОбщегоНазначения.УдалитьВременныйКаталог.\n"
"//\n"
"// Параметры:\n"
"// Расширение - Строка - расширение каталога, которое идентифицирует назначение временного каталога\n"
"// и подсистему, которая его создала.\n"
"// Рекомендуется указывать на английском языке.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - полный путь к каталогу с разделителем пути.\n"
"//\n"
"Функция СоздатьВременныйКаталог(Знач Расширение = \"\") Экспорт\n"
" \n"
" Возврат ФайловаяСистема.СоздатьВременныйКаталог(Расширение);\n"
" \n"
"КонецФункции\n\n"
"// Устарела. Следует использовать ФайловаяСистема.УдалитьВременныйКаталог\n"
"// Удаляет временный каталог вместе с его содержимым, если возможно.\n"
"// Если временный каталог не может быть удален (например, он занят каким-то процессом),\n"
"// то в журнал регистрации записывается соответствующее предупреждение, а процедура завершается.\n"
"//\n"
"// Для совместного использования с ОбщегоНазначения.СоздатьВременныйКаталог, \n"
"// после окончания работы с временным каталогом.\n"
"//\n"
"// Параметры:\n"
"// ПутьККаталогу - Строка - полный путь к временному каталогу.\n"
"//\n"
"Процедура УдалитьВременныйКаталог(Знач ПутьККаталогу) Экспорт\n"
" \n"
" ФайловаяСистема.УдалитьВременныйКаталог(ПутьККаталогу);\n"
" \n"
"КонецПроцедуры\n\n"
"// Устарела. Проверяет наличие механизма платформы, предупреждающего об опасных действиях.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если Истина, тогда работает механизм предупреждений безопасности.\n"
"//\n"
"Функция ЕстьЗащитаОтОпасныхДействий() Экспорт\n"
" \n"
" Возврат Истина;\n"
" \n"
"КонецФункции\n\n"
"// Устарела. Создает и возвращает экземпляр отчета или обработки по полному имени объекта метаданных.\n"
"//\n"
"// Параметры:\n"
"// ПолноеИмя - Строка - полное имя объекта метаданных. Пример: \"Отчет.БизнесПроцессы\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// ОтчетОбъект\n"
"// ОбработкаОбъект - экземпляр отчета или обработки.\n"
"// \n"
"Функция ОбъектПоПолномуИмени(ПолноеИмя) Экспорт\n"
" МассивСтрок = СтрРазделить(ПолноеИмя, \".\");\n"
" \n"
" Если МассивСтрок.Количество() >= 2 Тогда\n"
" Вид = ВРег(МассивСтрок[0]);\n"
" Имя = МассивСтрок[1];\n"
" Иначе\n"
" ВызватьИсключение СтрЗаменить(НСтр(\"ru = 'Некорректное полное имя отчета или обработки \"\"%1\"\".'\"), \"%1\", ПолноеИмя);\n"
" КонецЕсли;\n"
" \n"
" Если Вид = \"ОТЧЕТ\" Тогда\n"
" Возврат Отчеты[Имя].Создать();\n"
" ИначеЕсли Вид = \"ОБРАБОТКА\" Тогда\n"
" Возврат Обработки[Имя].Создать();\n"
" Иначе\n"
" ВызватьИсключение СтрЗаменить(НСтр(\"ru = '\"\"%1\"\" не является отчетом или обработкой.'\"), \"%1\", ПолноеИмя);\n"
" КонецЕсли;\n"
"КонецФункции\n\n"
"// Устарела. Следует использовать ОбщегоНазначения.ЭтоMacOSКлиент\n"
"// Возвращает Истина, если клиентское приложение запущено под управлением ОС X.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - если нет клиентского приложения, возвращается Ложь.\n"
"//\n"
"Функция ЭтоOSXКлиент() Экспорт\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" ЭтоMacOSКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить(\"ЭтоMacOSКлиент\");\n"
" \n"
" Если ЭтоMacOSКлиент = Неопределено Тогда\n"
" Возврат Ложь; // Нет клиентского приложения.\n"
" КонецЕсли;\n"
" \n"
" Возврат ЭтоMacOSКлиент;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#КонецЕсли\n\n"
"#КонецОбласти\n\n"
"#Если НЕ МобильныйАвтономныйСервер Тогда\n\n"
"#Область СлужебныйПрограммныйИнтерфейс\n\n"
"// Выгружает запрос в строку XML, которую можно вставить в Консоль запросов.\n"
"// Для переноса запроса и всех его параметров в Консоль запросов, необходимо вызвать функцию в окне.\n"
"// \"Вычислить выражение\" (Shift + F9), скопировать полученный XML в поле \"Текст запроса\"\n"
"// консоли запросов и выполнить команду \"Заполнить из XML\" из меню \"Еще\".\n"
"// Подробнее об использование функции смотрите в справке к консоли запросов.\n"
"//\n"
"// Параметры:\n"
"// Запрос - Запрос - запрос, который необходимо выгрузить в формат строки XML.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - строка в формате XML, которую можно извлечь при помощи метода \"ОбщегоНазначения.ЗначениеИзСтрокиXML\".\n"
"// После извлечения получится объект типа \"Структура\" с полями:\n"
"// * Текст - Строка - текст запроса.\n"
"// * Параметры - Структура - параметры запроса.\n"
"//\n"
"Функция ЗапросВСтрокуXML(Запрос) Экспорт // АПК:299 - используется при отладке запросов, см. описание функции.\n"
" Структура = Новый Структура(\"Текст, Параметры\");\n"
" ЗаполнитьЗначенияСвойств(Структура, Запрос);\n"
" Возврат ЗначениеВСтрокуXML(Структура);\n"
"КонецФункции\n\n"
"Функция ПодключитьКомпонентуПоИдентификатору(Знач Идентификатор, Знач Местоположение, Знач Изолированно = Ложь) Экспорт\n\n"
" ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение);\n"
" \n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"Подключено\", Ложь);\n"
" Результат.Вставить(\"ПодключаемыйМодуль\", Неопределено);\n"
" Результат.Вставить(\"ОписаниеОшибки\", \"\");\n"
" \n"
" Попытка\n"
" \n"
" #Если МобильноеПриложениеСервер Тогда\n"
" РезультатПодключения = ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + \"SymbolicName\");\n"
" #Иначе\n"
" РезультатПодключения = ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + \"SymbolicName\",,\n"
" ОбщегоНазначенияСлужебныйКлиентСервер.ТипПодключенияКомпоненты(Изолированно));\n"
" #КонецЕсли\n"
" \n"
" Исключение\n"
" Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Не удалось подключить внешнюю компоненту \"\"%1\"\" на сервере по причине:\n"
" |%2.'\"),\n"
" Идентификатор, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" \n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Подключение внешней компоненты на сервере'\", КодОсновногоЯзыка()),\n"
" УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки);\n"
" Возврат Результат;\n"
" КонецПопытки;\n"
" \n"
" Если Не РезультатПодключения Тогда\n"
" Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Не удалось подключить внешнюю компоненту \"\"%1\"\" на сервере по причине:\n"
" |Метод %2 вернул Ложь.'\"),\n"
" Идентификатор, \"ПодключитьВнешнююКомпоненту\");\n"
" \n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Подключение внешней компоненты на сервере'\", КодОсновногоЯзыка()),\n"
" УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки);\n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" ПодключаемыйМодуль = Неопределено;\n"
" Попытка\n"
" ПодключаемыйМодуль = Новый(\"AddIn.\" + Идентификатор + \"SymbolicName\" + \".\" + Идентификатор);\n"
" Если ПодключаемыйМодуль = Неопределено Тогда \n"
" ВызватьИсключение НСтр(\"ru = 'Оператор Новый вернул Неопределено'\");\n"
" КонецЕсли;\n"
" Исключение\n"
" ПодключаемыйМодуль = Неопределено;\n"
" ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());\n"
" КонецПопытки;\n"
" \n"
" Если ПодключаемыйМодуль = Неопределено Тогда\n"
" Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Не удалось создать объект внешней компоненты \"\"%1\"\", подключенной на сервере, по причине:\n"
" |%2'\"),\n"
" Идентификатор, ТекстОшибки);\n"
" \n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Подключение внешней компоненты на сервере'\", КодОсновногоЯзыка()),\n"
" УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки);\n"
" Возврат Результат;\n"
" КонецЕсли;\n"
" \n"
" Результат.Подключено = Истина;\n"
" Результат.ПодключаемыйМодуль = ПодключаемыйМодуль;\n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"Функция СтрокаВВидеНСтр(Знач ПроверяемаяСтрока) Экспорт\n"
" \n"
" ПроверяемаяСтрока = СтрЗаменить(ПроверяемаяСтрока, \" \", \"\");\n"
" \n"
" ВариантыСовпадений = Новый Массив;\n"
" Для каждого Язык Из Метаданные.Языки Цикл\n"
" ВариантыСовпадений.Добавить(Язык.КодЯзыка + \"=\");\n"
" КонецЦикла;\n"
" \n"
" Для каждого ВариантСовпадения Из ВариантыСовпадений Цикл\n"
" Если СтрНайти(ПроверяемаяСтрока, ВариантСовпадения) > 0 Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Ложь;\n"
" \n"
"КонецФункции\n\n"
"// Устанавливает условное оформление списка выбора\n"
"// \n"
"// Параметры:\n"
"// Форма - ФормаКлиентскогоПриложения - форма, для которой устанавливается оформление.\n"
"// ИмяЭлемента - Строка - имя элемента, для которого устанавливается оформление.\n"
"// ИмяПоляКомпоновкиДанных - Строка - имя поля компоновки данных.\n"
"//\n"
"Процедура УстановитьУсловноеОформлениеСпискаВыбора(Форма, ИмяЭлемента, ИмяПоляКомпоновкиДанных) Экспорт\n"
" \n"
" Элементы = Форма.Элементы;\n"
" УсловноеОформление = Форма.УсловноеОформление;\n"
" \n"
" Для каждого ЭлементВыбора Из Элементы[ИмяЭлемента].СписокВыбора Цикл\n"
" \n"
" Элемент = УсловноеОформление.Элементы.Добавить();\n"
" \n"
" ПолеЭлемента = Элемент.Поля.Элементы.Добавить();\n"
" ЭлементФормы = Элементы[ИмяЭлемента]; // ПолеФормы\n"
" ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ЭлементФормы.Имя);\n"
" \n"
" ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип(\"ЭлементОтбораКомпоновкиДанных\"));\n"
" ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоляКомпоновкиДанных);\n"
" ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;\n"
" ОтборЭлемента.ПравоеЗначение = ЭлементВыбора.Значение;\n"
" \n"
" Элемент.Оформление.УстановитьЗначениеПараметра(\"Текст\", ЭлементВыбора.Представление);\n"
" \n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращает суффикс текущего языка для мультиязычных реквизитов.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Строка - \"Язык1\" или \"Язык2\", если язык пользователя является дополнительным\n"
"// Пустая строка, если язык пользователя является основным.\n"
"// Неопределено - мультиязычное хранение данных не используется.\n"
"//\n"
"Функция СуффиксЯзыкаТекущегоПользователя() Экспорт\n"
" \n"
" Результат = Новый Структура();\n"
" Результат.Вставить(\"СуффиксТекущегоЯзыка\", \"\");\n"
" Результат.Вставить(\"ЭтоОсновнойЯзык\", \"\");\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.Мультиязычность\") Тогда\n"
" МодульМультиязычностьСервер = ОбщийМодуль(\"МультиязычностьСервер\");\n"
" СуффиксТекущегоЯзыка = МодульМультиязычностьСервер.СуффиксТекущегоЯзыка();\n"
" \n"
" Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда\n"
" Возврат СуффиксТекущегоЯзыка;\n"
" КонецЕсли;\n"
" Иначе\n"
" СуффиксТекущегоЯзыка = \"\";\n"
" КонецЕсли;\n"
" \n"
" Если ЭтоОсновнойЯзык() Тогда\n"
" Возврат СуффиксТекущегоЯзыка;\n"
" КонецЕсли;\n"
" \n"
" Возврат Неопределено;\n"
" \n"
"КонецФункции\n\n"
"// Сокращает имя файла с расширением.\n"
"// Сокращение имени, производится, когда имя файла с расширением превышает размер 255 байт.\n"
"// Сокращение ими файла достигая за счет сокращения имени файла без расширения и \n"
"// добавления значения хеш функции сокращенной строки.\n"
"// \n"
"// Параметры:\n"
"// ИмяФайла - Строка - имя файла с расширением\n"
"// \n"
"Процедура СократитьИмяФайла(ИмяФайла) Экспорт\n"
" ОграничениеВБайтах = 255; \n"
" Если РазмерСтрокиВБайтах(ИмяФайла) <= ОграничениеВБайтах Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Файл = Новый Файл(ИмяФайла);\n"
" ИмяБезРасширения = Файл.ИмяБезРасширения;\n"
" \n"
" ОграничениеВБайтах = ОграничениеВБайтах - РазмерСтрокиВБайтах(Файл.Расширение);\n"
" \n"
" ДлинаСтроки = СтрДлина(ИмяБезРасширения);\n"
" ИспользуемоеКоличествоСимволов = ОграничениеВБайтах - 32;\n"
" БольшееКоличествоСимволов = Мин(ДлинаСтроки, ОграничениеВБайтах);\n"
" МеньшееКоличествоСимволов = Цел((ОграничениеВБайтах - 32)/4);\n"
" Уменьшить = Истина;\n"
" Пока Истина Цикл\n"
" Если Уменьшить Тогда\n"
" ИспользуемоеКоличествоСимволов = МеньшееКоличествоСимволов + Цел((ИспользуемоеКоличествоСимволов-МеньшееКоличествоСимволов)/2);\n"
" Иначе\n"
" ИспользуемоеКоличествоСимволов = ИспользуемоеКоличествоСимволов + Цел((БольшееКоличествоСимволов - ИспользуемоеКоличествоСимволов)/2);\n"
" КонецЕсли;\n"
" \n"
" РазмерСтрокиВБайтах = РазмерСтрокиВБайтах(ИмяБезРасширения)+32;\n"
" \n"
" Если РазмерСтрокиВБайтах = ОграничениеВБайтах Или БольшееКоличествоСимволов - МеньшееКоличествоСимволов = 1 Тогда\n"
" Прервать;\n"
" КонецЕсли;\n"
" \n"
" Если РазмерСтрокиВБайтах > ОграничениеВБайтах Тогда\n"
" Уменьшить = Истина;\n"
" БольшееКоличествоСимволов = ИспользуемоеКоличествоСимволов; \n"
" Иначе \n"
" Уменьшить = Ложь;\n"
" МеньшееКоличествоСимволов = ИспользуемоеКоличествоСимволов;\n"
" КонецЕсли;\n\n"
" КонецЦикла;\n"
" \n"
" СокращеннаяСтрока = СократитьСтрокуКонтрольнойСуммой(ИмяБезРасширения, ИспользуемоеКоличествоСимволов+32);\n"
" \n"
" ИмяФайла = СокращеннаяСтрока+Файл.Расширение;\n"
" \n"
"КонецПроцедуры\n\n"
"// Служебные объекты и объекты при загрузке из резервной копии,\n"
"// должны записываться без какой-либо прикладной логики.\n"
"//\n"
"// Запись служебных объектов без отключения прикладной логики,\n"
"// может привести к зацикливанию, снижению производительности,\n"
"// а также избыточным изменениях, которые в некоторых случаях\n"
"// могут неожиданно повлиять на логику работы.\n"
"//\n"
"// Служебными являются объекты, которые обычно не участвуют\n"
"// в обмене данными, не зависят от других объектов, например:\n"
"// - кэши;\n"
"// - даты обновления кэшей и аналогичные признаки;\n"
"// - промежуточные данные для передачи параметров в фоновые задания;\n"
"// - вспомогательные служебные данные (например, ключи доступа,\n"
"// идентификаторы объектов метаданных).\n"
"//\n"
"// При использовании подсистемы Управление доступом, требуется\n"
"// отдельно вызывать процедуру ОтключитьОбновлениеКлючейДоступа\n"
"// общего модуля УправлениеДоступом.\n"
"//\n"
"// Процедура включает режим загрузки данных,\n"
"// отключает регистрацию объектов на планах обмена,\n"
"// отключает контроль механизма удаления помеченных объектов.\n"
"//\n"
"// Параметры:\n"
"// Объект - ПланОбменаОбъект\n"
"// - КонстантаМенеджерЗначения\n"
"// - СправочникОбъект\n"
"// - ДокументОбъект\n"
"// - ПоследовательностьНаборЗаписей\n"
"// - ПланВидовХарактеристикОбъект\n"
"// - ПланСчетовОбъект\n"
"// - ПланВидовРасчетаОбъект\n"
"// - БизнесПроцессОбъект\n"
"// - ЗадачаОбъект\n"
"// - УдалениеОбъекта\n"
"// - РегистрСведенийНаборЗаписей\n"
"// - РегистрНакопленияНаборЗаписей\n"
"// - РегистрБухгалтерииНаборЗаписей\n"
"// - РегистрРасчетаНаборЗаписей\n"
"// - ПерерасчетНаборЗаписей\n"
"//\n"
"// ЭтоУзелПланаОбмена - Булево\n"
"//\n"
"Процедура ОтключитьКонтрольЗаписи(Объект, ЭтоУзелПланаОбмена = Ложь) Экспорт\n"
" \n"
" Объект.ДополнительныеСвойства.Вставить(\"НеВыполнятьКонтрольУдаляемых\");\n"
" Объект.ДополнительныеСвойства.Вставить(\"ОтключитьМеханизмРегистрацииОбъектов\");\n"
" Объект.ОбменДанными.Загрузка = Истина;\n"
" Если Не ЭтоУзелПланаОбмена Тогда\n"
" Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#Область СлужебныеПроцедурыИФункции\n\n"
"#Область ДанныеВБазе\n\n"
"#Область ЗначенияРеквизитов\n\n"
"// Проверяет существование указанных реквизитов у объекта метаданных.\n"
"// \n"
"// Параметры:\n"
"// ПолноеИмяОбъектаМетаданных - Строка - полное имя проверяемого объекта.\n"
"// ПроверяемыеВыражения - Массив - имена полей или проверяемые выражения объекта метаданных.\n"
"// \n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * Ошибка - Булево - найдена ошибка.\n"
"// * ОписаниеОшибки - Строка - описание найденных ошибок.\n"
"//\n"
"// Пример:\n"
"// \n"
"// Реквизиты = Новый Массив;\n"
"// Реквизиты.Добавить(\"Номер\");\n"
"// Реквизиты.Добавить(\"Валюта.НаименованиеПолное\");\n"
"//\n"
"// Результат = ОбщегоНазначения.ПроверитьСуществованиеРеквизитовОбъекта(\"Документ._ДемоЗаказПокупателя\", Реквизиты);\n"
"//\n"
"// Если Результат.Ошибка Тогда\n"
"// ВызватьИсключение Результат.ОписаниеОшибки;\n"
"// КонецЕсли;\n"
"//\n"
"Функция ПроверитьСуществованиеРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, ПроверяемыеВыражения)\n"
" \n"
" МетаданныеОбъекта = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных);\n"
" Если МетаданныеОбъекта = Неопределено Тогда \n"
" Возврат Новый Структура(\"Ошибка, ОписаниеОшибки\", Истина, \n"
" СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Несуществующий объект метаданных \"\"%1\"\".'\"), ПолноеИмяОбъектаМетаданных));\n"
" КонецЕсли;\n\n"
" // Разрешение вызова из безопасного режима внешней обработки или расширения.\n"
" // Информация о доступности полей источника схемы при проверке метаданных не является секретной.\n"
" УстановитьОтключениеБезопасногоРежима(Истина);\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Схема = Новый СхемаЗапроса;\n"
" Пакет = Схема.ПакетЗапросов.Добавить(Тип(\"ЗапросВыбораСхемыЗапроса\"));\n"
" Оператор = Пакет.Операторы.Получить(0);\n"
" \n"
" Источник = Оператор.Источники.Добавить(ПолноеИмяОбъектаМетаданных, \"Таблица\");\n"
" ТекстОшибки = \"\";\n"
" \n"
" Для Каждого ТекущееВыражение Из ПроверяемыеВыражения Цикл\n"
" \n"
" Если Не ПолеИсточникаСхемыЗапросаДоступно(Источник, ТекущееВыражение) Тогда \n"
" ТекстОшибки = ТекстОшибки + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Поле объекта \"\"%1\"\" не существует.'\"), ТекущееВыражение);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат Новый Структура(\"Ошибка, ОписаниеОшибки\", Не ПустаяСтрока(ТекстОшибки), ТекстОшибки);\n"
" \n"
"КонецФункции\n\n"
"// Используется в ПроверитьСуществованиеРеквизитовОбъекта.\n"
"// Выполняет проверку доступности поля проверяемого выражения в источнике оператора схемы запроса.\n"
"//\n"
"Функция ПолеИсточникаСхемыЗапросаДоступно(ИсточникОператора, ПроверяемоеВыражение)\n"
" \n"
" ЧастиИмениПоля = СтрРазделить(ПроверяемоеВыражение, \".\");\n"
" ДоступныеПоля = ИсточникОператора.Источник.ДоступныеПоля;\n"
" \n"
" ТекущаяЧастьИмениПоля = 0;\n"
" Пока ТекущаяЧастьИмениПоля < ЧастиИмениПоля.Количество() Цикл \n"
" \n"
" ТекущееПоле = ДоступныеПоля.Найти(ЧастиИмениПоля.Получить(ТекущаяЧастьИмениПоля)); \n"
" \n"
" Если ТекущееПоле = Неопределено Тогда \n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" // Инкрементация следующей части имени поля и соответствующего списка доступности полей.\n"
" ТекущаяЧастьИмениПоля = ТекущаяЧастьИмениПоля + 1;\n"
" ДоступныеПоля = ТекущееПоле.Поля;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат Истина;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ЗаменитьСсылки\n\n"
"Функция РазметитьМестаИспользования(Знач ПараметрыВыполнения, Знач Ссылка, Знач ЦелеваяСсылка, Знач ТаблицаПоиска)\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" // Устанавливаем порядок известных и проверяем наличие неопознанных объектов.\n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"МестаИспользования\", ТаблицаПоиска.НайтиСтроки(Новый Структура(\"Ссылка\", Ссылка)));\n"
" Результат.Вставить(\"ОшибкиРазметки\", Новый Массив);\n"
" Результат.Вставить(\"Успех\", Истина);\n"
" \n"
" Для Каждого МестоИспользования Из Результат.МестаИспользования Цикл\n"
" Если МестоИспользования.ЭтоСлужебныеДанные Тогда\n"
" Продолжить; // Зависимые данные не обрабатываются.\n"
" КонецЕсли;\n"
" \n"
" Информация = ИнформацияОТипе(МестоИспользования.Метаданные, ПараметрыВыполнения);\n"
" Если Информация.Вид = \"КОНСТАНТА\" Тогда\n"
" МестоИспользования.КлючЗамены = \"Константа\";\n"
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;\n"
" \n"
" ИначеЕсли Информация.Вид = \"ПОСЛЕДОВАТЕЛЬНОСТЬ\" Тогда\n"
" МестоИспользования.КлючЗамены = \"Последовательность\";\n"
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;\n"
" \n"
" ИначеЕсли Информация.Вид = \"РЕГИСТРСВЕДЕНИЙ\" Тогда\n"
" МестоИспользования.КлючЗамены = \"РегистрСведений\";\n"
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;\n"
" \n"
" ИначеЕсли Информация.Вид = \"РЕГИСТРБУХГАЛТЕРИИ\"\n"
" Или Информация.Вид = \"РЕГИСТРНАКОПЛЕНИЯ\"\n"
" Или Информация.Вид = \"РЕГИСТРРАСЧЕТА\" Тогда\n"
" МестоИспользования.КлючЗамены = \"КлючЗаписи\";\n"
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;\n"
" \n"
" ИначеЕсли Информация.Ссылочный Тогда\n"
" МестоИспользования.КлючЗамены = \"Объект\";\n"
" МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;\n"
" \n"
" Иначе\n"
" // Неизвестный объект для замены ссылок.\n"
" Результат.Успех = Ложь;\n"
" Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Замена ссылок в \"\"%1\"\" не поддерживается.'\"), Информация.ПолноеИмя);\n"
" ОписаниеОшибки = Новый Структура(\"Объект, Текст\", МестоИспользования.Данные, Текст);\n"
" Результат.ОшибкиРазметки.Добавить(ОписаниеОшибки);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Параметры:\n"
"// ТаблицаПоиска - см. МестаИспользования\n"
"//\n"
"Процедура ЗаменитьСсылкиКороткимиТранзакциями(Результат, Знач ПараметрыВыполнения, Знач Дубль, Знач ТаблицаПоиска)\n"
" \n"
" // Основной цикл обработки\n"
" ФильтрСсылок = Новый Структура(\"Ссылка, КлючЗамены\");\n"
" \n"
" Результат.ЕстьОшибки = Ложь;\n"
" \n"
" ФильтрСсылок.Ссылка = Дубль;\n"
" ФильтрСсылок.КлючЗамены = \"Константа\";\n"
" \n"
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);\n"
" Для Каждого МестоИспользования Из МестаИспользования Цикл\n"
" ПроизвестиЗаменуВКонстанте(Результат, МестоИспользования, ПараметрыВыполнения);\n"
" КонецЦикла;\n"
" \n"
" ФильтрСсылок.КлючЗамены = \"Объект\";\n"
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);\n"
" Для Каждого МестоИспользования Из МестаИспользования Цикл\n"
" ПроизвестиЗаменуВОбъекте(Результат, МестоИспользования, ПараметрыВыполнения);\n"
" КонецЦикла;\n"
" \n"
" ФильтрСсылок.КлючЗамены = \"КлючЗаписи\";\n"
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);\n"
" Для Каждого МестоИспользования Из МестаИспользования Цикл\n"
" ПроизвестиЗаменуВНаборе(Результат, МестоИспользования, ПараметрыВыполнения);\n"
" КонецЦикла;\n"
" \n"
" ФильтрСсылок.КлючЗамены = \"Последовательность\";\n"
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);\n"
" Для Каждого МестоИспользования Из МестаИспользования Цикл\n"
" ПроизвестиЗаменуВНаборе(Результат, МестоИспользования, ПараметрыВыполнения);\n"
" КонецЦикла;\n"
" \n"
" ФильтрСсылок.КлючЗамены = \"РегистрСведений\";\n"
" МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);\n"
" Для Каждого МестоИспользования Из МестаИспользования Цикл\n"
" ПроизвестиЗаменуВРегистреСведений(Результат, МестоИспользования, ПараметрыВыполнения);\n"
" КонецЦикла;\n"
" \n"
" ПроизводимыеЗамены = Новый Массив;\n"
" ПроизводимыеЗамены.Добавить(Дубль);\n"
" \n"
" Если ПараметрыВыполнения.УдалятьНепосредственно\n"
" ИЛИ ПараметрыВыполнения.ПомечатьНаУдаление Тогда\n"
" \n"
" УстановитьПометкуУдаленияДляОбъектов(Результат, ПроизводимыеЗамены, ПараметрыВыполнения);\n"
" Иначе\n"
" \n"
" ТаблицаПовторногоПоиска = МестаИспользования(ПроизводимыеЗамены,, ПараметрыВыполнения.ПараметрыПоискаМестИспользования);\n"
" ДобавитьРезультатыЗаменыИзмененныхОбъектов(Результат, ТаблицаПовторногоПоиска);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ПроизвестиЗаменуВКонстанте(Результат, Знач МестоИспользования, Знач ПараметрыЗаписи)\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Данные = МестоИспользования.Данные;\n"
" МетаданныеКонстанты = МестоИспользования.Метаданные;\n"
" \n"
" ПредставлениеДанных = Строка(Данные);\n"
" \n"
" // Будем производить сразу все замены для этих данных.\n"
" Фильтр = Новый Структура(\"Данные, КлючЗамены\", Данные, \"Константа\");\n"
" ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования\n"
" // Помечаем как обработанные\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" Строка.КлючЗамены = \"\";\n"
" КонецЦикла;\n\n"
" СостояниеОперации = \"\";\n"
" Ошибка = \"\";\n"
" НачатьТранзакцию();\n"
" \n"
" Попытка\n"
" Блокировка = Новый БлокировкаДанных;\n"
" Блокировка.Добавить(МетаданныеКонстанты.ПолноеИмя());\n"
" Попытка\n"
" Блокировка.Заблокировать();\n"
" Исключение\n"
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Не удалось заблокировать константу %1'\"), \n"
" ПредставлениеДанных);\n"
" СостояниеОперации = \"ОшибкаБлокировки\";\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" МенеджерКонстанты = Константы[МетаданныеКонстанты.Имя].СоздатьМенеджерЗначения();\n"
" МенеджерКонстанты.Прочитать();\n"
" \n"
" ЗаменаПроизведена = Ложь;\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" Если МенеджерКонстанты.Значение = Строка.Ссылка Тогда\n"
" МенеджерКонстанты.Значение = Строка.ЦелеваяСсылка;\n"
" ЗаменаПроизведена = Истина;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если Не ЗаменаПроизведена Тогда\n"
" ОтменитьТранзакцию();\n"
" Возврат;\n"
" КонецЕсли; \n"
" \n"
" // Пытаемся сохранить\n"
" Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" Попытка\n"
" ЗаписатьОбъект(МенеджерКонстанты, ПараметрыЗаписи);\n"
" Исключение\n"
" ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());\n"
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Не удалось записать %1 по причине: %2'\"), \n"
" ПредставлениеДанных, ОписаниеОшибки);\n"
" СостояниеОперации = \"ОшибкаЗаписи\";\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" КонецЕсли;\n"
" \n"
" ЗафиксироватьТранзакцию();\n"
" Исключение\n"
" ОтменитьТранзакцию();\n"
" ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка,\n"
" МетаданныеКонстанты,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" Если СостояниеОперации = \"ОшибкаЗаписи\" Тогда\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, \n"
" ОписаниеОшибкиЗамены(\"ОшибкаЗаписи\", Данные, ПредставлениеДанных, Ошибка));\n"
" КонецЦикла;\n"
" Иначе \n"
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, \n"
" ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, Ошибка));\n"
" КонецЕсли; \n"
" КонецПопытки;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ПроизвестиЗаменуВОбъекте(Результат, Знач МестоИспользования, Знач ПараметрыВыполнения)\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Данные = МестоИспользования.Данные;\n"
" \n"
" // Будем производить сразу все замены для этих данных.\n"
" Фильтр = Новый Структура(\"Данные, КлючЗамены\", Данные, \"Объект\");\n"
" ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования\n"
" \n"
" ПредставлениеДанных = ПредметСтрокой(Данные);\n"
" СостояниеОперации = \"\";\n"
" ТекстОшибки = \"\";\n"
" НачатьТранзакцию();\n"
" \n"
" Попытка\n"
" \n"
" Блокировка = Новый БлокировкаДанных;\n"
" ЗаблокироватьМестоИспользования(ПараметрыВыполнения, Блокировка, МестоИспользования);\n"
" Попытка\n"
" Блокировка.Заблокировать();\n"
" Исключение\n"
" СостояниеОперации = \"ОшибкаБлокировки\";\n"
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Не удалось заблокировать объект \"\"%1\"\":\n"
" |%2'\"),\n"
" ПредставлениеДанных,\n"
" ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" ОбъектыЗаписи = ИзмененныеОбъектыПриЗаменеВОбъекте(ПараметрыВыполнения, МестоИспользования, ОбрабатываемыеСтроки);\n"
" \n"
" // Пытаемся сохранить, сам объект идет последним.\n"
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" Попытка\n"
" Если ПараметрыВыполнения.ВключатьБизнесЛогику Тогда\n"
" // Первая запись без контроля, чтобы устранить циклические ссылки.\n"
" НовыеПараметрыВыполнения = СкопироватьРекурсивно(ПараметрыВыполнения);\n"
" НовыеПараметрыВыполнения.ВключатьБизнесЛогику = Ложь;\n"
" Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл\n"
" ЗаписатьОбъект(КлючЗначение.Ключ, НовыеПараметрыВыполнения);\n"
" КонецЦикла;\n"
" // Вторая запись c контролем.\n"
" НовыеПараметрыВыполнения.ВключатьБизнесЛогику = Истина;\n"
" Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл\n"
" ЗаписатьОбъект(КлючЗначение.Ключ, НовыеПараметрыВыполнения);\n"
" КонецЦикла;\n"
" Иначе\n"
" // Запись без контроля бизнес-логики.\n"
" Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл\n"
" ЗаписатьОбъект(КлючЗначение.Ключ, ПараметрыВыполнения);\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" Исключение\n"
" СостояниеОперации = \"ОшибкаЗаписи\";\n"
" ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());\n"
" ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Не удалось записать %1 по причине: %2'\"), \n"
" ПредставлениеДанных, ОписаниеОшибки);\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" ЗафиксироватьТранзакцию();\n"
" \n"
" Исключение\n"
" ОтменитьТранзакцию();\n"
" Информация = ИнформацияОбОшибке();\n"
" ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка,\n"
" МестоИспользования.Метаданные,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));\n"
" Ошибка = ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, ТекстОшибки);\n"
" Если СостояниеОперации = \"ОшибкаЗаписи\" Тогда\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, Ошибка);\n"
" КонецЦикла;\n"
" Иначе \n"
" ЗарегистрироватьОшибкуЗамены(Результат, МестоИспользования.Ссылка, Ошибка);\n"
" КонецЕсли;\n"
" КонецПопытки;\n"
" \n"
" // Помечаем как обработанные\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" Строка.КлючЗамены = \"\";\n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ПроизвестиЗаменуВНаборе(Результат, Знач МестоИспользования, Знач ПараметрыВыполнения)\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Данные = МестоИспользования.Данные;\n"
" Мета = МестоИспользования.Метаданные;\n"
" \n"
" ПредставлениеДанных = Строка(Данные);\n"
" \n"
" // Будем производить сразу все замены для этих данных.\n"
" Фильтр = Новый Структура(\"Данные, КлючЗамены\");\n"
" ЗаполнитьЗначенияСвойств(Фильтр, МестоИспользования);\n"
" ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования\n"
" \n"
" ОписаниеНабора = ОписаниеКлючаЗаписи(Мета);\n"
" НаборЗаписей = ОписаниеНабора.НаборЗаписей; // РегистрСведенийНаборЗаписей\n"
" \n"
" ПарыЗамен = Новый Соответствие;\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" ПарыЗамен.Вставить(Строка.Ссылка, Строка.ЦелеваяСсылка);\n"
" КонецЦикла;\n"
" \n"
" // Помечаем как обработанные\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" Строка.КлючЗамены = \"\";\n"
" КонецЦикла;\n"
" \n"
" СостояниеОперации = \"\";\n"
" Ошибка = \"\";\n"
" НачатьТранзакцию();\n"
" \n"
" Попытка\n"
" \n"
" // Блокировка и подготовка набора.\n"
" Блокировка = Новый БлокировкаДанных;\n"
" Для Каждого КлючЗначение Из ОписаниеНабора.СписокИзмерений Цикл\n"
" ТипИзмерения = КлючЗначение.Значение;\n"
" Имя = КлючЗначение.Ключ;\n"
" Значение = Данные[Имя];\n"
" \n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" ТекущаяСсылка = Строка.Ссылка;\n"
" Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда\n"
" Блокировка.Добавить(ОписаниеНабора.ПространствоБлокировки).УстановитьЗначение(Имя, ТекущаяСсылка);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" НаборЗаписей.Отбор[Имя].Установить(Значение);\n"
" КонецЦикла;\n"
" \n"
" Попытка\n"
" Блокировка.Заблокировать();\n"
" Исключение\n"
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Не удалось заблокировать набор %1'\"), \n"
" ПредставлениеДанных);\n"
" СостояниеОперации = \"ОшибкаБлокировки\";\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" НаборЗаписей.Прочитать();\n"
" ЗаменитьВКоллекцииСтрок(\"НаборЗаписей\", \"НаборЗаписей\", НаборЗаписей, НаборЗаписей, ОписаниеНабора.СписокПолей, ПарыЗамен);\n"
" \n"
" Если НаборЗаписей.Модифицированность() Тогда\n"
" ОтменитьТранзакцию();\n"
" Возврат;\n"
" КонецЕсли; \n\n"
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" Попытка\n"
" ЗаписатьОбъект(НаборЗаписей, ПараметрыВыполнения);\n"
" Исключение\n"
" ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());\n"
" Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Не удалось записать %1 по причине: %2'\"), \n"
" ПредставлениеДанных, ОписаниеОшибки);\n"
" СостояниеОперации = \"ОшибкаЗаписи\";\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" КонецЕсли;\n"
" \n"
" ЗафиксироватьТранзакцию();\n"
" \n"
" Исключение\n"
" ОтменитьТранзакцию();\n"
" Информация = ИнформацияОбОшибке();\n"
" ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка,\n"
" Мета,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));\n"
" Ошибка = ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, Ошибка);\n"
" Если СостояниеОперации = \"ОшибкаЗаписи\" Тогда\n"
" Для Каждого Строка Из ОбрабатываемыеСтроки Цикл\n"
" ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, Ошибка);\n"
" КонецЦикла;\n"
" Иначе \n"
" ЗарегистрироватьОшибкуЗамены(Результат, МестоИспользования.Ссылка, Ошибка);\n"
" КонецЕсли; \n"
" КонецПопытки;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ПроизвестиЗаменуВРегистреСведений(Результат, Знач МестоИспользования, Знач ПараметрыВыполнения)\n"
" \n"
" Если МестоИспользования.Обработано Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" МестоИспользования.Обработано = Истина;\n"
" \n"
" // В случае, если дубль указан в измерениях набора, тогда используется 2 набора записей:\n"
" // НаборЗаписейДубля - чтение старых значений (по старым измерениям) и удаление старых значений.\n"
" // НаборЗаписейОригинала - чтение актуальных значений (по новым измерениям) и запись новых значений.\n"
" // Данные дублей и оригиналов объединяются по правилам:\n"
" // Приоритет у данных оригинала.\n"
" // Если в оригинале нет данных, то берутся данные из дубля.\n"
" // Набор оригинала записывается, а набор дубля удаляется.\n"
" //\n"
" // В случае, если дубль не указан в измерениях набора, тогда используется 1 набор записей:\n"
" // НаборЗаписейДубля - чтение старых значений и запись новых значений.\n"
" //\n"
" // Замена ссылок в ресурсах и реквизитах производится в обоих случаях.\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" Дубль = МестоИспользования.Ссылка;\n"
" Оригинал = МестоИспользования.ЦелеваяСсылка;\n"
" \n"
" МетаданныеРегистра = МестоИспользования.Метаданные;\n"
" КлючЗаписиРегистра = МестоИспользования.Данные;\n"
" \n"
" Информация = ИнформацияОТипе(МетаданныеРегистра, ПараметрыВыполнения);\n"
" \n"
" ТребуетсяДваНабора = Ложь;\n"
" Для Каждого КлючЗначение Из Информация.Измерения Цикл\n"
" ЗначениеИзмеренияДубля = КлючЗаписиРегистра[КлючЗначение.Ключ];\n"
" Если ЗначениеИзмеренияДубля = Дубль\n"
" Или ПараметрыВыполнения.УспешныеЗамены[ЗначениеИзмеренияДубля] = Дубль Тогда\n"
" ТребуетсяДваНабора = Истина; // Дубль указан в измерениях.\n"
" Прервать;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Менеджер = МенеджерОбъектаПоПолномуИмени(Информация.ПолноеИмя);\n"
" НаборЗаписейДубля = Менеджер.СоздатьНаборЗаписей();\n"
" \n"
" Если ТребуетсяДваНабора Тогда\n"
" ЗначенияИзмеренийОригинала = Новый Структура;\n"
" НаборЗаписейОригинала = Менеджер.СоздатьНаборЗаписей();\n"
" КонецЕсли;\n"
" \n"
" НачатьТранзакцию();\n"
" \n"
" Попытка\n"
" Блокировка = Новый БлокировкаДанных;\n"
" БлокировкаДубля = Блокировка.Добавить(Информация.ПолноеИмя);\n"
" Если ТребуетсяДваНабора Тогда\n"
" БлокировкаОригинала = Блокировка.Добавить(Информация.ПолноеИмя);\n"
" КонецЕсли;\n"
" \n"
" Для Каждого КлючЗначение Из Информация.Измерения Цикл\n"
" ЗначениеИзмеренияДубля = КлючЗаписиРегистра[КлючЗначение.Ключ];\n"
" \n"
" // Для решения проблемы уникальности\n"
" // выполняется замена старых значений измерений ключа записи на актуальные.\n"
" // Соответствие старых и актуальных обеспечивает соответствием УспешныеЗамены.\n"
" // Данные соответствия актуальны на текущий момент времени,\n"
" // т.к. пополняются только после успешной обработки очередной пары и фиксации транзакции.\n"
" НовоеЗначениеИзмеренияДубля = ПараметрыВыполнения.УспешныеЗамены[ЗначениеИзмеренияДубля];\n"
" Если НовоеЗначениеИзмеренияДубля <> Неопределено Тогда\n"
" ЗначениеИзмеренияДубля = НовоеЗначениеИзмеренияДубля;\n"
" КонецЕсли;\n"
" \n"
" НаборЗаписейДубля.Отбор[КлючЗначение.Ключ].Установить(ЗначениеИзмеренияДубля);\n"
" \n"
" // Замена в конкретной паре и блокировка на конкретную замену.\n"
" БлокировкаДубля.УстановитьЗначение(КлючЗначение.Ключ, ЗначениеИзмеренияДубля);\n"
" \n"
" \n"
" Если ТребуетсяДваНабора Тогда\n"
" Если ЗначениеИзмеренияДубля = Дубль Тогда\n"
" ЗначениеИзмеренияОригинала = Оригинал;\n"
" Иначе\n"
" ЗначениеИзмеренияОригинала = ЗначениеИзмеренияДубля;\n"
" КонецЕсли;\n"
" \n"
" НаборЗаписейОригинала.Отбор[КлючЗначение.Ключ].Установить(ЗначениеИзмеренияОригинала);\n"
" ЗначенияИзмеренийОригинала.Вставить(КлючЗначение.Ключ, ЗначениеИзмеренияОригинала);\n"
" \n"
" // Замена в конкретной паре и блокировка на конкретную замену.\n"
" БлокировкаОригинала.УстановитьЗначение(КлючЗначение.Ключ, ЗначениеИзмеренияОригинала);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" // Установка блокировки.\n"
" Попытка\n"
" Блокировка.Заблокировать();\n"
" Исключение\n"
" // Вид ошибки \"БлокировкаДляРегистра\".\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" \n"
" // Откуда читаем?\n"
" НаборЗаписейДубля.Прочитать();\n"
" Если НаборЗаписейДубля.Количество() = 0 Тогда // Нечего писать.\n"
" ОтменитьТранзакцию(); // Замена не требуется.\n"
" Возврат;\n"
" КонецЕсли;\n"
" ЗаписьДубля = НаборЗаписейДубля[0];\n"
" \n"
" // Куда пишем?\n"
" Если ТребуетсяДваНабора Тогда\n"
" // Пишем в набор с другими измерениями.\n"
" НаборЗаписейОригинала.Прочитать();\n"
" Если НаборЗаписейОригинала.Количество() = 0 Тогда\n"
" ЗаписьОригинала = НаборЗаписейОригинала.Добавить();\n"
" ЗаполнитьЗначенияСвойств(ЗаписьОригинала, ЗаписьДубля);\n"
" ЗаполнитьЗначенияСвойств(ЗаписьОригинала, ЗначенияИзмеренийОригинала);\n"
" Иначе\n"
" ЗаписьОригинала = НаборЗаписейОригинала[0];\n"
" КонецЕсли;\n"
" Иначе\n"
" // Пишем туда-же, откуда и читаем.\n"
" НаборЗаписейОригинала = НаборЗаписейДубля;\n"
" ЗаписьОригинала = ЗаписьДубля; // Ситуация с нулевым количеством записей в наборе обработана выше.\n"
" КонецЕсли;\n"
" \n"
" // Замена дубля на оригинал в ресурсах и реквизитах.\n"
" Для Каждого КлючЗначение Из Информация.Ресурсы Цикл\n"
" ЗначениеРеквизитаВОригинале = ЗаписьОригинала[КлючЗначение.Ключ];\n"
" Если ЗначениеРеквизитаВОригинале = Дубль Тогда\n"
" ЗаписьОригинала[КлючЗначение.Ключ] = Оригинал;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Для Каждого КлючЗначение Из Информация.Реквизиты Цикл\n"
" ЗначениеРеквизитаВОригинале = ЗаписьОригинала[КлючЗначение.Ключ];\n"
" Если ЗначениеРеквизитаВОригинале = Дубль Тогда\n"
" ЗаписьОригинала[КлючЗначение.Ключ] = Оригинал;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" // Удаление данных дубля.\n"
" Если ТребуетсяДваНабора Тогда\n"
" НаборЗаписейДубля.Очистить();\n"
" Попытка\n"
" ЗаписатьОбъект(НаборЗаписейДубля, ПараметрыВыполнения);\n"
" Исключение\n"
" // Вид ошибки \"УдалитьНаборДубля\".\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" КонецЕсли;\n"
" \n"
" // Запись данных оригинала.\n"
" Если НаборЗаписейОригинала.Модифицированность() Тогда\n"
" Попытка\n"
" ЗаписатьОбъект(НаборЗаписейОригинала, ПараметрыВыполнения);\n"
" Исключение\n"
" // Вид ошибки \"ЗаписатьНаборОригинала\".\n"
" ВызватьИсключение;\n"
" КонецПопытки;\n"
" КонецЕсли;\n"
" \n"
" ЗафиксироватьТранзакцию();\n"
" Исключение\n"
" ОтменитьТранзакцию();\n"
" ЗарегистрироватьОшибкуВТаблицу(Результат, Дубль, Оригинал, КлючЗаписиРегистра, Информация, \n"
" \"БлокировкаДляРегистра\", ИнформацияОбОшибке());\n"
" КонецПопытки\n"
" \n"
"КонецПроцедуры\n\n"
"Функция ИзмененныеОбъектыПриЗаменеВОбъекте(ПараметрыВыполнения, МестоИспользования, ОбрабатываемыеСтроки)\n"
" Данные = МестоИспользования.Данные;\n"
" ОписаниеПоследовательностей = ОписаниеПоследовательностей(МестоИспользования.Метаданные);\n"
" ОписаниеДвижений = ОписаниеДвижений(МестоИспользования.Метаданные);\n"
" ОписаниеЗадач = ОписаниеЗадач(МестоИспользования.Метаданные);\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" // Возвращаем измененные обработанные объекты.\n"
" Измененные = Новый Соответствие;\n"
" \n"
" // Считываем\n"
" Описание = ОписаниеОбъекта(Данные.Метаданные());\n"
" Попытка\n"
" Объект = Данные.ПолучитьОбъект();\n"
" Исключение\n"
" // Был уже обработан с ошибками.\n"
" Объект = Неопределено;\n"
" КонецПопытки;\n"
" \n"
" Если Объект = Неопределено Тогда\n"
" Возврат Измененные;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл\n"
" ОписаниеДвижения.НаборЗаписей.Отбор.Регистратор.Установить(Данные);\n"
" ОписаниеДвижения.НаборЗаписей.Прочитать();\n"
" КонецЦикла;\n"
" \n"
" Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл\n"
" ОписаниеПоследовательности.НаборЗаписей.Отбор.Регистратор.Установить(Данные);\n"
" ОписаниеПоследовательности.НаборЗаписей.Прочитать();\n"
" КонецЦикла;\n"
" \n"
" // Заменяем сразу все варианты.\n"
" ПарыЗамен = Новый Соответствие;\n"
" Для Каждого МестоИспользования Из ОбрабатываемыеСтроки Цикл\n"
" ПарыЗамен.Вставить(МестоИспользования.Ссылка, МестоИспользования.ЦелеваяСсылка);\n"
" КонецЦикла;\n"
" \n"
" ВыполнитьЗаменуВРеквизитахОбъекта(Объект, Описание, ПарыЗамен);\n"
" \n"
" // Движения\n"
" Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл\n"
" ЗаменитьВКоллекцииСтрок(\n"
" \"Движения\",\n"
" ОписаниеДвижения.ПространствоБлокировки,\n"
" ОписаниеДвижения.НаборЗаписей,\n"
" ОписаниеДвижения.НаборЗаписей,\n"
" ОписаниеДвижения.СписокПолей,\n"
" ПарыЗамен);\n"
" КонецЦикла;\n"
" \n"
" // Последовательности\n"
" Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл\n"
" ЗаменитьВКоллекцииСтрок(\n"
" \"Последовательности\",\n"
" ОписаниеПоследовательности.ПространствоБлокировки,\n"
" ОписаниеПоследовательности.НаборЗаписей,\n"
" ОписаниеПоследовательности.НаборЗаписей,\n"
" ОписаниеПоследовательности.СписокПолей,\n"
" ПарыЗамен);\n"
" КонецЦикла;\n"
" \n"
" Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл\n"
" Если ОписаниеДвижения.НаборЗаписей.Модифицированность() Тогда\n"
" Измененные.Вставить(ОписаниеДвижения.НаборЗаписей, Ложь);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл\n"
" Если ОписаниеПоследовательности.НаборЗаписей.Модифицированность() Тогда\n"
" Измененные.Вставить(ОписаниеПоследовательности.НаборЗаписей, Ложь);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ОписаниеЗадач <> Неопределено Тогда\n"
" \n"
" ЗадачаПроцесса = ЗадачиПроцесса(Данные, ОписаниеЗадач.ПространствоБлокировки);\n"
" Пока ЗадачаПроцесса.Следующий() Цикл\n"
" \n"
" ЗадачаОбъект = ЗадачаПроцесса.Ссылка.ПолучитьОбъект();\n"
" Фильтр = Новый Структура(\"Данные, КлючЗамены\", ЗадачаПроцесса.Ссылка, \"Объект\");\n"
" ОбрабатываемыеСтрокиЗадачи = МестоИспользования.Владелец().НайтиСтроки(Фильтр); // см. МестаИспользования\n"
" Для каждого МестоИспользованияЗадачи Из ОбрабатываемыеСтрокиЗадачи Цикл\n"
" ПарыЗамен.Вставить(МестоИспользованияЗадачи.Ссылка, МестоИспользованияЗадачи.ЦелеваяСсылка); \n"
" КонецЦикла;\n"
" ВыполнитьЗаменуВРеквизитахОбъекта(ЗадачаОбъект, ОписаниеЗадач, ПарыЗамен);\n"
" \n"
" Если ЗадачаОбъект.Модифицированность() Тогда\n"
" Измененные.Вставить(ЗадачаОбъект, Ложь);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" КонецЕсли;\n"
" \n"
" // Сам объект последний - для возможного перепроведения.\n"
" Если Объект.Модифицированность() Тогда\n"
" Измененные.Вставить(Объект, Описание.МожетБытьПроведен);\n"
" КонецЕсли;\n"
" \n"
" Возврат Измененные;\n"
"КонецФункции\n\n"
"Функция ЗадачиПроцесса(БизнесПроцесс, ТипЗадач)\n\n"
" ТекстЗапроса = \"ВЫБРАТЬ\n"
" | ИмяТаблицы.Ссылка\n"
" |ИЗ\n"
" | &ИмяТаблицы КАК ИмяТаблицы\n"
" |ГДЕ\n"
" | ИмяТаблицы.БизнесПроцесс = &БизнесПроцесс\";\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ИмяТаблицы\", ТипЗадач);\n"
" Запрос = Новый Запрос(ТекстЗапроса);\n"
" Запрос.УстановитьПараметр(\"БизнесПроцесс\", БизнесПроцесс);\n"
" Возврат Запрос.Выполнить().Выбрать();\n\n"
"КонецФункции\n\n"
"Процедура ВыполнитьЗаменуВРеквизитахОбъекта(Объект, Описание, ПарыЗамен)\n"
" \n"
" // Реквизиты\n"
" Для Каждого КлючЗначение Из Описание.Реквизиты Цикл\n"
" Имя = КлючЗначение.Ключ;\n"
" ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];\n"
" Если ЦелеваяСсылка <> Неопределено Тогда\n"
" ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, \"Реквизиты\", Имя);\n"
" Объект[Имя] = ЦелеваяСсылка;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" // Стандартные реквизиты\n"
" Для Каждого КлючЗначение Из Описание.СтандартныеРеквизиты Цикл\n"
" Имя = КлючЗначение.Ключ;\n"
" ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];\n"
" Если ЦелеваяСсылка <> Неопределено Тогда\n"
" ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, \"СтандартныеРеквизиты\", Имя);\n"
" Объект[Имя] = ЦелеваяСсылка;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" // Табличные части\n"
" Для Каждого Элемент Из Описание.ТабличныеЧасти Цикл\n"
" ЗаменитьВКоллекцииСтрок(\n"
" \"ТабличныеЧасти\",\n"
" Элемент.Имя,\n"
" Объект,\n"
" Объект[Элемент.Имя],\n"
" Элемент.СписокПолей,\n"
" ПарыЗамен);\n"
" КонецЦикла;\n"
" \n"
" // Стандартные табличные части.\n"
" Для Каждого Элемент Из Описание.СтандартныеТабличныеЧасти Цикл\n"
" ЗаменитьВКоллекцииСтрок(\n"
" \"СтандартныеТабличныеЧасти\",\n"
" Элемент.Имя,\n"
" Объект,\n"
" Объект[Элемент.Имя],\n"
" Элемент.СписокПолей,\n"
" ПарыЗамен);\n"
" КонецЦикла;\n\n"
" Для Каждого Реквизит Из Описание.РеквизитыАдресации Цикл\n"
" Имя = Реквизит.Ключ;\n"
" ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];\n"
" Если ЦелеваяСсылка <> Неопределено Тогда\n"
" ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, \"РеквизитыАдресации\", Имя);\n"
" Объект[Имя] = ЦелеваяСсылка;\n"
" КонецЕсли;\n"
" КонецЦикла;\n\n"
"КонецПроцедуры\n\n"
"Процедура ЗарегистрироватьФактЗамены(Объект, СсылкаДубля, СсылкаОригинала, ВидРеквизита, ИмяРеквизита, \n"
" Индекс = Неопределено, ИмяКолонки = Неопределено)\n"
" \n"
" ЕстьДополнительныеСвойства = Новый Структура(\"ДополнительныеСвойства\");\n"
" ЗаполнитьЗначенияСвойств(ЕстьДополнительныеСвойства, Объект);\n"
" Если ТипЗнч(ЕстьДополнительныеСвойства.ДополнительныеСвойства) <> Тип(\"Структура\") Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" ДополнительныеСвойства = Объект.ДополнительныеСвойства;\n"
" ДополнительныеСвойства.Вставить(\"ЗаменаСсылок\", Истина);\n"
" ВыполненныеЗамены = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, \"ВыполненныеЗамены\");\n"
" Если ВыполненныеЗамены = Неопределено Тогда\n"
" ВыполненныеЗамены = Новый Массив;\n"
" ДополнительныеСвойства.Вставить(\"ВыполненныеЗамены\", ВыполненныеЗамены);\n"
" КонецЕсли;\n"
" \n"
" ОписаниеЗамены = Новый Структура;\n"
" ОписаниеЗамены.Вставить(\"СсылкаДубля\", СсылкаДубля);\n"
" ОписаниеЗамены.Вставить(\"СсылкаОригинала\", СсылкаОригинала);\n"
" ОписаниеЗамены.Вставить(\"ВидРеквизита\", ВидРеквизита);\n"
" ОписаниеЗамены.Вставить(\"ИмяРеквизита\", ИмяРеквизита);\n"
" ОписаниеЗамены.Вставить(\"Индекс\", Индекс);\n"
" ОписаниеЗамены.Вставить(\"ИмяКолонки\", ИмяКолонки);\n"
" ВыполненныеЗамены.Добавить(ОписаниеЗамены);\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура УстановитьПометкуУдаленияДляОбъектов(Результат, Знач УдаляемыеСсылки, Знач ПараметрыВыполнения)\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" ЕстьВнешняяТранзакция = ТранзакцияАктивна();\n"
" ВсеМестаИспользования = МестаИспользования(УдаляемыеСсылки,,ПараметрыВыполнения.ПараметрыПоискаМестИспользования);\n"
" Для Каждого УдаляемаяСсылка Из УдаляемыеСсылки Цикл\n"
" Информация = ИнформацияОТипе(ТипЗнч(УдаляемаяСсылка), ПараметрыВыполнения);\n"
" Блокировка = Новый БлокировкаДанных;\n"
" Блокировка.Добавить(Информация.ПолноеИмя).УстановитьЗначение(\"Ссылка\", УдаляемаяСсылка);\n"
" \n"
" НачатьТранзакцию();\n"
" Попытка\n"
" ЭтоОшибкаБлокировки = Истина;\n"
" Блокировка.Заблокировать();\n"
" \n"
" ЭтоОшибкаБлокировки = Ложь;\n"
" Успешно = УстановитьПометкуУдаления(Результат, УдаляемаяСсылка, ВсеМестаИспользования, \n"
" ПараметрыВыполнения, ЕстьВнешняяТранзакция);\n"
" Если Не Успешно Тогда\n"
" ОтменитьТранзакцию();\n"
" Продолжить;\n"
" КонецЕсли;\n"
" ЗафиксироватьТранзакцию();\n"
" Исключение\n"
" ОтменитьТранзакцию();\n"
" Если ЭтоОшибкаБлокировки Тогда \n"
" ЗарегистрироватьОшибкуВТаблицу(Результат, УдаляемаяСсылка, Неопределено, УдаляемаяСсылка, Информация, \n"
" \"БлокировкаДляУдаленияДубля\", ИнформацияОбОшибке());\n"
" КонецЕсли;\n"
" Если ЕстьВнешняяТранзакция Тогда\n"
" ВызватьИсключение;\n"
" КонецЕсли; \n"
" КонецПопытки;\n"
" \n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"Функция УстановитьПометкуУдаления(Результат, Знач УдаляемаяСсылка, Знач ВсеМестаИспользования, Знач ПараметрыВыполнения, \n"
" ЕстьВнешняяТранзакция)\n\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" \n"
" ПредставлениеСсылки = ПредметСтрокой(УдаляемаяСсылка);\n"
" Фильтр = Новый Структура(\"Ссылка\");\n"
" Фильтр.Ссылка = УдаляемаяСсылка;\n"
" МестаИспользования = ВсеМестаИспользования.НайтиСтроки(Фильтр);\n"
" \n"
" Индекс = МестаИспользования.ВГраница();\n"
" Пока Индекс >= 0 Цикл\n"
" Если МестаИспользования[Индекс].ВспомогательныеДанные Тогда\n"
" МестаИспользования.Удалить(Индекс);\n"
" КонецЕсли;\n"
" Индекс = Индекс - 1;\n"
" КонецЦикла;\n"
" \n"
" Если МестаИспользования.Количество() > 0 Тогда\n"
" ДобавитьРезультатыЗаменыИзмененныхОбъектов(Результат, МестаИспользования);\n"
" Возврат Ложь; // Остались места использования, нельзя удалять.\n"
" КонецЕсли;\n"
" \n"
" Объект = УдаляемаяСсылка.ПолучитьОбъект(); // ДокументОбъект, СправочникОбъект\n"
" Если Объект = Неопределено Тогда\n"
" Возврат Ложь; // Уже удален.\n"
" КонецЕсли;\n"
" \n"
" Если Не ПараметрыВыполнения.ПривилегированнаяЗапись Тогда\n"
" УстановитьПривилегированныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" Успешно = Истина;\n"
" Попытка \n"
" ОбработатьОбъектСПерехватомСообщений(Объект, \"ПометкаУдаления\", \n"
" Неопределено, ПараметрыВыполнения);\n"
" Результат.ОчередьКНепосредственномуУдалению.Добавить(Объект.Ссылка);\n"
" Исключение\n"
" ТекстОшибки = НСтр(\"ru = 'Элемент не был помечен на удаление по причине:'\");\n"
" ТекстОшибки = ТекстОшибки + Символы.ПС + СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" ОписаниеОшибки = ОписаниеОшибкиЗамены(\"ОшибкаУдаления\", УдаляемаяСсылка, ПредставлениеСсылки, ТекстОшибки);\n"
" ЗарегистрироватьОшибкуЗамены(Результат, УдаляемаяСсылка, ОписаниеОшибки);\n"
" Успешно = Ложь;\n"
" Если ЕстьВнешняяТранзакция Тогда\n"
" ВызватьИсключение;\n"
" КонецЕсли; \n"
" КонецПопытки;\n"
" \n"
" Возврат Успешно;\n"
" \n"
"КонецФункции\n\n"
"Процедура ДобавитьРезультатыЗаменыИзмененныхОбъектов(Результат, ТаблицаПовторногоПоиска)\n"
" \n"
" Фильтр = Новый Структура(\"ТипОшибки, Ссылка, ОбъектОшибки\", \"\");\n"
" Для Каждого Строка Из ТаблицаПовторногоПоиска Цикл\n"
" Тест = Новый Структура(\"ВспомогательныеДанные\", Ложь);\n"
" ЗаполнитьЗначенияСвойств(Тест, Строка);\n"
" Если Тест.ВспомогательныеДанные Тогда\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" Данные = Строка.Данные;\n"
" Ссылка = Строка.Ссылка;\n"
" \n"
" ПредставлениеДанных = Строка(Данные);\n"
" \n"
" Фильтр.ОбъектОшибки = Данные;\n"
" Фильтр.Ссылка = Ссылка;\n"
" Если Результат.Ошибки.НайтиСтроки(Фильтр).Количество() > 0 Тогда\n"
" Продолжить; // По данной проблеме уже записана ошибка.\n"
" КонецЕсли;\n"
" ЗарегистрироватьОшибкуЗамены(Результат, Ссылка, \n"
" ОписаниеОшибкиЗамены(\"ДанныеИзменены\", Данные, ПредставлениеДанных,\n"
" НСтр(\"ru = 'Заменены не все места использования. Возможно места использования были добавлены или изменены другим пользователем.'\")));\n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ЗаблокироватьМестоИспользования(ПараметрыВыполнения, Блокировка, МестоИспользования)\n"
" \n"
" Если МестоИспользования.КлючЗамены = \"Константа\" Тогда\n"
" \n"
" Блокировка.Добавить(МестоИспользования.Метаданные.ПолноеИмя());\n"
" \n"
" ИначеЕсли МестоИспользования.КлючЗамены = \"Объект\" Тогда\n"
" \n"
" СсылкаОбъекта = МестоИспользования.Данные;\n"
" МетаданныеОбъекта = МестоИспользования.Метаданные;\n"
" \n"
" // Сам объект.\n"
" Блокировка.Добавить(МетаданныеОбъекта.ПолноеИмя()).УстановитьЗначение(\"Ссылка\", СсылкаОбъекта);\n"
" \n"
" // Движения по регистратору.\n"
" ОписаниеДвижений = ОписаниеДвижений(МетаданныеОбъекта);\n"
" Для Каждого Элемент Из ОписаниеДвижений Цикл\n"
" Блокировка.Добавить(Элемент.ПространствоБлокировки + \".НаборЗаписей\").УстановитьЗначение(\"Регистратор\", СсылкаОбъекта);\n"
" КонецЦикла;\n"
" \n"
" // Последовательности.\n"
" ОписаниеПоследовательностей = ОписаниеПоследовательностей(МетаданныеОбъекта);\n"
" Для Каждого Элемент Из ОписаниеПоследовательностей Цикл\n"
" Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(\"Регистратор\", СсылкаОбъекта);\n"
" КонецЦикла;\n"
" \n"
" // Задачи (для бизнес-процессов)\n"
" ОписаниеЗадач = ОписаниеЗадач(МетаданныеОбъекта);\n"
" Если ОписаниеЗадач <> Неопределено Тогда\n"
" Блокировка.Добавить(ОписаниеЗадач.ПространствоБлокировки).УстановитьЗначение(\"БизнесПроцесс\", СсылкаОбъекта); \n"
" КонецЕсли;\n"
" \n"
" ИначеЕсли МестоИспользования.КлючЗамены = \"Последовательность\" Тогда\n"
" \n"
" СсылкаОбъекта = МестоИспользования.Данные;\n"
" МетаданныеОбъекта = МестоИспользования.Метаданные;\n"
" \n"
" ОписаниеПоследовательностей = ОписаниеПоследовательностей(МетаданныеОбъекта);\n"
" Для Каждого Элемент Из ОписаниеПоследовательностей Цикл\n"
" Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(\"Регистратор\", СсылкаОбъекта);\n"
" КонецЦикла;\n"
" \n"
" ИначеЕсли МестоИспользования.КлючЗамены = \"КлючЗаписи\"\n"
" Или МестоИспользования.КлючЗамены = \"РегистрСведений\" Тогда\n"
" \n"
" Информация = ИнформацияОТипе(МестоИспользования.Метаданные, ПараметрыВыполнения);\n"
" ТипДубля = МестоИспользования.ТипСсылки;\n"
" ТипОригинала = ТипЗнч(МестоИспользования.ЦелеваяСсылка);\n"
" \n"
" Для Каждого КлючЗначение Из Информация.Измерения Цикл\n"
" ТипИзмерения = КлючЗначение.Значение.Тип;\n"
" Если ТипИзмерения.СодержитТип(ТипДубля) Тогда\n"
" БлокировкаПоИзмерению = Блокировка.Добавить(Информация.ПолноеИмя);\n"
" БлокировкаПоИзмерению.УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.Ссылка);\n"
" КонецЕсли;\n"
" Если ТипИзмерения.СодержитТип(ТипОригинала) Тогда\n"
" БлокировкаПоИзмерению = Блокировка.Добавить(Информация.ПолноеИмя);\n"
" БлокировкаПоИзмерению.УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.ЦелеваяСсылка);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ОтключитьОбновлениеКлючейДоступа(Значение)\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.УправлениеДоступом\") Тогда\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" МодульУправлениеДоступом = ОбщийМодуль(\"УправлениеДоступом\");\n"
" МодульУправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Значение);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры \n\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных\n"
"// \n"
"// Возвращаемое значение:\n"
"// Массив из Структура:\n"
"// * СписокПолей - Структура\n"
"// * СтруктураИзмерений - Структура\n"
"// * СписокВедущих - Структура\n"
"// * НаборЗаписей - РегистрСведенийНаборЗаписей\n"
"// * ПространствоБлокировки - Строка\n"
"//\n"
"Функция ОписаниеДвижений(Знач ОбъектМетаданных)\n"
" \n"
" ОписаниеДвижений = Новый Массив;\n"
" Если Не Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда\n"
" Возврат ОписаниеДвижений;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого Движение Из ОбъектМетаданных.Движения Цикл\n"
" \n"
" Если Метаданные.РегистрыНакопления.Содержит(Движение) Тогда\n"
" НаборЗаписей = РегистрыНакопления[Движение.Имя].СоздатьНаборЗаписей();\n"
" ИсключатьПоля = \"Активность, НомерСтроки, Период, Регистратор\"; \n"
" \n"
" ИначеЕсли Метаданные.РегистрыСведений.Содержит(Движение) Тогда\n"
" НаборЗаписей = РегистрыСведений[Движение.Имя].СоздатьНаборЗаписей();\n"
" ИсключатьПоля = \"Активность, ВидДвижения, НомерСтроки, Период, Регистратор\"; \n"
" \n"
" ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Движение) Тогда\n"
" НаборЗаписей = РегистрыБухгалтерии[Движение.Имя].СоздатьНаборЗаписей();\n"
" ИсключатьПоля = \"Активность, ВидДвижения, НомерСтроки, Период, Регистратор\"; \n"
" \n"
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движение) Тогда\n"
" НаборЗаписей = РегистрыРасчета[Движение.Имя].СоздатьНаборЗаписей();\n"
" ИсключатьПоля = \"Активность, БазовыйПериодКонец, БазовыйПериодНачало, НомерСтроки, ПериодДействия,\n"
" |ПериодДействияКонец, ПериодДействияНачало, ПериодРегистрации, Регистратор, Сторно,\n"
" |ФактическийПериодДействия\";\n"
" Иначе\n"
" // Неизвестный тип\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" // Поля ссылочного типа и измерения - кандидаты.\n"
" // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы.\n"
" Описание = СпискиПолейОбъекта(НаборЗаписей, Движение.Измерения, ИсключатьПоля);\n"
" Если Описание.СписокПолей.Количество() = 0 Тогда\n"
" // Незачем обрабатывать\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" Описание.Вставить(\"НаборЗаписей\", НаборЗаписей);\n"
" Описание.Вставить(\"ПространствоБлокировки\", Движение.ПолноеИмя() );\n"
" \n"
" ОписаниеДвижений.Добавить(Описание);\n"
" КонецЦикла;\n"
" \n"
" Возврат ОписаниеДвижений;\n"
"КонецФункции\n\n"
"// Параметры:\n"
"// Мета - ОбъектМетаданных\n"
"// \n"
"// Возвращаемое значение:\n"
"// Массив из Структура:\n"
"// * НаборЗаписей - ПоследовательностьНаборЗаписей\n"
"// * ПространствоБлокировки - Строка\n"
"// * Измерения - Структура\n"
"// \n"
"Функция ОписаниеПоследовательностей(Знач Мета)\n"
" \n"
" ОписаниеПоследовательностей = Новый Массив;\n"
" Если Не Метаданные.Документы.Содержит(Мета) Тогда\n"
" Возврат ОписаниеПоследовательностей;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого Последовательность Из Метаданные.Последовательности Цикл\n"
" Если Не Последовательность.Документы.Содержит(Мета) Тогда\n"
" Продолжить;\n"
" КонецЕсли;\n"
" \n"
" ИмяТаблицы = Последовательность.ПолноеИмя();\n"
" \n"
" // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы.\n"
" Описание = СпискиПолейОбъекта(ИмяТаблицы, Последовательность.Измерения, \"Регистратор\");\n"
" Если Описание.СписокПолей.Количество() > 0 Тогда\n"
" \n"
" Описание.Вставить(\"НаборЗаписей\", Последовательности[Последовательность.Имя].СоздатьНаборЗаписей());\n"
" Описание.Вставить(\"ПространствоБлокировки\", ИмяТаблицы + \".Записи\");\n"
" Описание.Вставить(\"Измерения\", Новый Структура);\n"
" \n"
" ОписаниеПоследовательностей.Добавить(Описание);\n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат ОписаниеПоследовательностей;\n"
"КонецФункции\n\n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * СтандартныеРеквизиты - Структура\n"
"// * РеквизитыАдресации - Структура\n"
"// * Реквизиты - Структура\n"
"// * СтандартныеТабличныеЧасти - Массив из Структура:\n"
"// ** Имя - Строка\n"
"// ** СписокПолей - Структура\n"
"// * ТабличныеЧасти - Массив из Структура:\n"
"// ** Имя - Строка\n"
"// ** СписокПолей - Структура\n"
"// * МожетБытьПроведен - Булево\n"
"//\n"
"Функция ОписаниеОбъекта(Знач ОбъектМетаданных)\n"
" \n"
" ТипВсеСсылки = ОписаниеТипаВсеСсылки();\n"
" \n"
" Кандидаты = Новый Структура(\"Реквизиты, СтандартныеРеквизиты, ТабличныеЧасти, СтандартныеТабличныеЧасти, РеквизитыАдресации\");\n"
" ЗаполнитьЗначенияСвойств(Кандидаты, ОбъектМетаданных);\n"
" \n"
" ОписаниеОбъекта = Новый Структура;\n"
" \n"
" ОписаниеОбъекта.Вставить(\"Реквизиты\", Новый Структура);\n"
" Если Кандидаты.Реквизиты <> Неопределено Тогда\n"
" Для Каждого МетаРеквизит Из Кандидаты.Реквизиты Цикл\n"
" Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда\n"
" ОписаниеОбъекта.Реквизиты.Вставить(МетаРеквизит.Имя);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеОбъекта.Вставить(\"СтандартныеРеквизиты\", Новый Структура);\n"
" Если Кандидаты.СтандартныеРеквизиты <> Неопределено Тогда\n"
" Исключаемые = Новый Структура(\"Ссылка\");\n"
" \n"
" Для Каждого МетаРеквизит Из Кандидаты.СтандартныеРеквизиты Цикл\n"
" Имя = МетаРеквизит.Имя;\n"
" Если Не Исключаемые.Свойство(Имя) И ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда\n"
" ОписаниеОбъекта.Реквизиты.Вставить(МетаРеквизит.Имя);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеОбъекта.Вставить(\"ТабличныеЧасти\", Новый Массив);\n"
" Если Кандидаты.ТабличныеЧасти <> Неопределено Тогда\n"
" Для Каждого МетаТаблица Из Кандидаты.ТабличныеЧасти Цикл\n"
" \n"
" СписокПолей = Новый Структура;\n"
" Для Каждого МетаРеквизит Из МетаТаблица.Реквизиты Цикл\n"
" Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда\n"
" СписокПолей.Вставить(МетаРеквизит.Имя);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если СписокПолей.Количество() > 0 Тогда\n"
" ОписаниеОбъекта.ТабличныеЧасти.Добавить(Новый Структура(\"Имя, СписокПолей\", МетаТаблица.Имя, СписокПолей));\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеОбъекта.Вставить(\"СтандартныеТабличныеЧасти\", Новый Массив);\n"
" Если Кандидаты.СтандартныеТабличныеЧасти <> Неопределено Тогда\n"
" Для Каждого МетаТаблица Из Кандидаты.СтандартныеТабличныеЧасти Цикл\n"
" \n"
" СписокПолей = Новый Структура;\n"
" Для Каждого МетаРеквизит Из МетаТаблица.СтандартныеРеквизиты Цикл\n"
" Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда\n"
" СписокПолей.Вставить(МетаРеквизит.Имя);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если СписокПолей.Количество() > 0 Тогда\n"
" ОписаниеОбъекта.СтандартныеТабличныеЧасти.Добавить(Новый Структура(\"Имя, СписокПолей\", МетаТаблица.Имя, СписокПолей));\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеОбъекта.Вставить(\"РеквизитыАдресации\", Новый Структура);\n"
" Если Кандидаты.РеквизитыАдресации <> Неопределено Тогда\n"
" Для Каждого Реквизит Из Кандидаты.РеквизитыАдресации Цикл\n"
" Если ОписанияТиповПересекаются(Реквизит.Тип, ТипВсеСсылки) Тогда\n"
" ОписаниеОбъекта.РеквизитыАдресации.Вставить(Реквизит.Имя);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеОбъекта.Вставить(\"МожетБытьПроведен\", Метаданные.Документы.Содержит(ОбъектМетаданных));\n"
" Возврат ОписаниеОбъекта;\n"
"КонецФункции\n\n"
"// Параметры:\n"
"// ОбъектМетаданных - ОбъектМетаданных\n"
"// \n"
"// Возвращаемое значение:\n"
"// Массив из Структура:\n"
"// * СписокПолей - Структура\n"
"// * СтруктураИзмерений - Структура\n"
"// * СписокВедущих - Структура\n"
"// * НаборЗаписей - РегистрСведенийНаборЗаписей\n"
"// * ПространствоБлокировки - Строка\n"
"//\n"
"Функция ОписаниеЗадач(Знач Мета)\n\n"
" ОписаниеЗадач = Неопределено;\n"
" Если НЕ Метаданные.БизнесПроцессы.Содержит(Мета) Тогда\n"
" Возврат ОписаниеЗадач;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеЗадач = ОписаниеОбъекта(Мета.Задача);\n"
" ОписаниеЗадач.Вставить(\"ПространствоБлокировки\", Мета.Задача.ПолноеИмя());\n"
" \n"
" Возврат ОписаниеЗадач;\n\n"
"КонецФункции\n\n"
"Функция ОписаниеКлючаЗаписи(Знач МетаданныеТаблицы)\n"
" \n"
" ИмяТаблицы = МетаданныеТаблицы.ПолноеИмя();\n"
" \n"
" // Поля ссылочного типа - кандидаты и набор измерений.\n"
" // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы.\n"
" ОписаниеКлюча = СпискиПолейОбъекта(ИмяТаблицы, МетаданныеТаблицы.Измерения, \"Период, Регистратор\");\n"
" \n"
" Если Метаданные.РегистрыСведений.Содержит(МетаданныеТаблицы) Тогда\n"
" НаборЗаписей = РегистрыСведений[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();\n"
" ИначеЕсли Метаданные.РегистрыНакопления.Содержит(МетаданныеТаблицы) Тогда\n"
" НаборЗаписей = РегистрыНакопления[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();\n"
" ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(МетаданныеТаблицы) Тогда\n"
" НаборЗаписей = РегистрыБухгалтерии[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();\n"
" ИначеЕсли Метаданные.РегистрыРасчета.Содержит(МетаданныеТаблицы) Тогда\n"
" НаборЗаписей = РегистрыРасчета[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();\n"
" ИначеЕсли Метаданные.Последовательности.Содержит(МетаданныеТаблицы) Тогда\n"
" НаборЗаписей = Последовательности[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей();\n"
" Иначе\n"
" НаборЗаписей = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" ОписаниеКлюча.Вставить(\"НаборЗаписей\", НаборЗаписей);\n"
" ОписаниеКлюча.Вставить(\"ПространствоБлокировки\", ИмяТаблицы);\n"
" \n"
" Возврат ОписаниеКлюча;\n"
"КонецФункции\n\n"
"Функция ОписанияТиповПересекаются(Знач Описание1, Знач Описание2)\n"
" \n"
" Для Каждого Тип Из Описание1.Типы() Цикл\n"
" Если Описание2.СодержитТип(Тип) Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Ложь;\n"
"КонецФункции\n\n"
"// Возвращает описание по имени таблицы или по набору записей.\n"
"Функция СпискиПолейОбъекта(Знач ИсточникДанных, Знач МетаданныеИзмеренийРегистра, Знач ИсключатьПоля)\n"
" \n"
" Описание = Новый Структура;\n"
" Описание.Вставить(\"СписокПолей\", Новый Структура);\n"
" Описание.Вставить(\"СтруктураИзмерений\", Новый Структура);\n"
" Описание.Вставить(\"СписокВедущих\", Новый Структура);\n"
" \n"
" ТипКонтроля = ОписаниеТипаВсеСсылки();\n"
" Исключаемые = Новый Структура(ИсключатьПоля);\n"
" \n"
" ТипИсточникаДанных = ТипЗнч(ИсточникДанных);\n"
" \n"
" Если ТипИсточникаДанных = Тип(\"Строка\") Тогда\n"
" // Источник - имя таблицы, получаем поля запросом.\n"
" ТекстЗапроса = \"ВЫБРАТЬ * ИЗ &ИмяТаблицы ГДЕ ЛОЖЬ\";\n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"&ИмяТаблицы\", ИсточникДанных);\n"
" Запрос = Новый Запрос(ТекстЗапроса);\n"
" ИсточникПолей = Запрос.Выполнить();\n"
" Иначе\n"
" // Источник - набор записей\n"
" ИсточникПолей = ИсточникДанных.ВыгрузитьКолонки();\n"
" КонецЕсли;\n"
" \n"
" Для Каждого Колонка Из ИсточникПолей.Колонки Цикл\n"
" Имя = Колонка.Имя;\n"
" Если Не Исключаемые.Свойство(Имя) И ОписанияТиповПересекаются(Колонка.ТипЗначения, ТипКонтроля) Тогда\n"
" Описание.СписокПолей.Вставить(Имя);\n"
" \n"
" // И проверка на ведущее измерение.\n"
" Мета = МетаданныеИзмеренийРегистра.Найти(Имя);\n"
" Если Мета <> Неопределено Тогда\n"
" Описание.СтруктураИзмерений.Вставить(Имя, Мета.Тип);\n"
" Тест = Новый Структура(\"Ведущее\", Ложь);\n"
" ЗаполнитьЗначенияСвойств(Тест, Мета);\n"
" Если Тест.Ведущее Тогда\n"
" Описание.СписокВедущих.Вставить(Имя, Мета.Тип);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Возврат Описание;\n"
"КонецФункции\n\n\n"
"Процедура ЗаменитьВКоллекцииСтрок(ВидКоллекции, ИмяКоллекции, Объект, Коллекция, Знач СписокПолей, Знач ПарыЗамен)\n"
" \n"
" ИзмененнаяКоллекция = Коллекция.Выгрузить();\n"
" Модифицировано = Ложь;\n"
" ИменаИзмененныхРеквизитов = Новый Массив;\n"
" \n"
" Для Каждого Строка Из ИзмененнаяКоллекция Цикл\n"
" \n"
" Для Каждого КлючЗначение Из СписокПолей Цикл\n"
" ИмяРеквизита = КлючЗначение.Ключ;\n"
" ЦелеваяСсылка = ПарыЗамен[ Строка[ИмяРеквизита] ];\n"
" Если ЦелеваяСсылка <> Неопределено Тогда\n"
" ЗарегистрироватьФактЗамены(Объект, Строка[ИмяРеквизита], ЦелеваяСсылка, ВидКоллекции, ИмяКоллекции, \n"
" ИзмененнаяКоллекция.Индекс(Строка), ИмяРеквизита);\n"
" Строка[ИмяРеквизита] = ЦелеваяСсылка;\n"
" Модифицировано = Истина;\n"
" ИменаИзмененныхРеквизитов.Добавить(ИмяРеквизита);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" КонецЦикла;\n"
" \n"
" Если Модифицировано Тогда\n"
" ЭтоРегистрБухгалтерии = ВидКоллекции = \"Движения\" И ЭтоРегистрБухгалтерии(Коллекция.Метаданные());\n"
" Если ЭтоРегистрБухгалтерии Тогда\n"
" ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(Коллекция, ИзмененнаяКоллекция, ИменаИзмененныхРеквизитов);\n"
" Иначе \n"
" Коллекция.Загрузить(ИзмененнаяКоллекция);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
"КонецПроцедуры\n\n"
"Процедура ЗагрузитьИзмененныйНаборВРегистрБухгалтерии(НаборЗаписей, ИзмененнаяКоллекция, ИменаИзмененныхРеквизитов)\n"
" НеизмененныеИзмерения = Новый Соответствие;\n"
" ИзмененныеИзмерения = Новый Соответствие;\n"
" МетаданныеРегистра = НаборЗаписей.Метаданные();\n"
" \n"
" Для каждого Измерение Из МетаданныеРегистра.Измерения Цикл\n"
" ИменаИзмерений = Новый Массив;\n"
" \n"
" Если Измерение.Балансовый ИЛИ НЕ МетаданныеРегистра.Корреспонденция Тогда\n"
" ИменаИзмерений.Добавить(Измерение.Имя); \n"
" Иначе \n"
" ИменаИзмерений.Добавить(Измерение.Имя + \"Дт\");\n"
" ИменаИзмерений.Добавить(Измерение.Имя + \"Кт\"); \n"
" КонецЕсли;\n"
" \n"
" Для каждого ИмяИзмерения Из ИменаИзмерений Цикл\n"
" Если ИменаИзмененныхРеквизитов.Найти(ИмяИзмерения) = Неопределено Тогда\n"
" НеизмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения));\n"
" Иначе\n"
" ИзмененныеИзмерения.Вставить(ИмяИзмерения, НаборЗаписей.ВыгрузитьКолонку(ИмяИзмерения));\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЦикла;\n"
" \n"
" Для Сч = 0 По НаборЗаписей.Количество()-1 Цикл\n"
" \n"
" Для каждого ИмяИзмеренияЗначения Из ИзмененныеИзмерения Цикл\n"
" Если НаборЗаписей[Сч][ИмяИзмеренияЗначения.Ключ] = NULL Тогда\n"
" ИмяИзмеренияЗначения.Значение[Сч] = NULL;\n"
" Иначе\n"
" ИмяИзмеренияЗначения.Значение[Сч] = ИзмененнаяКоллекция[Сч][ИмяИзмеренияЗначения.Ключ];\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" КонецЦикла;\n"
" \n"
" НаборЗаписей.Загрузить(ИзмененнаяКоллекция);\n"
" \n"
" Для каждого ИзмеренияЗначенияВКолонке Из НеизмененныеИзмерения Цикл\n"
" НаборЗаписей.ЗагрузитьКолонку(ИзмеренияЗначенияВКолонке.Значение, ИзмеренияЗначенияВКолонке.Ключ);\n"
" КонецЦикла;\n"
" \n"
" Для каждого ИзмеренияЗначенияВКолонке Из ИзмененныеИзмерения Цикл\n"
" НаборЗаписей.ЗагрузитьКолонку(ИзмеренияЗначенияВКолонке.Значение, ИзмеренияЗначенияВКолонке.Ключ);\n"
" КонецЦикла;\n"
"КонецПроцедуры\n\n"
"Процедура ОбработатьОбъектСПерехватомСообщений(Знач Объект, Знач Действие, Знач РежимЗаписи, Знач ПараметрыЗаписи)\n"
" \n"
" // Текущие сообщения до исключения запоминаем.\n"
" ПредыдущиеСообщения = ПолучитьСообщенияПользователю(Истина);\n"
" СообщатьПовторно = ТекущийРежимЗапуска() <> Неопределено;\n"
" \n"
" Попытка\n"
" \n"
" Если Действие = \"Запись\" Тогда\n"
" \n"
" Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику;\n"
" \n"
" Если РежимЗаписи = Неопределено Тогда\n"
" Объект.Записать();\n"
" Иначе\n"
" Объект.Записать(РежимЗаписи);\n"
" КонецЕсли;\n"
" \n"
" ИначеЕсли Действие = \"ПометкаУдаления\" Тогда\n"
" \n"
" МетаданныеОбъекта = Объект.Метаданные();\n"
" Если ЭтоСправочник(МетаданныеОбъекта)\n"
" Или ЭтоПланВидовХарактеристик(МетаданныеОбъекта)\n"
" Или ЭтоПланСчетов(МетаданныеОбъекта) Тогда \n"
" \n"
" Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику;\n"
" Объект.УстановитьПометкуУдаления(Истина, Ложь);\n"
" ИначеЕсли ЭтоДокумент(МетаданныеОбъекта) \n"
" И МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда\n"
" \n"
" Объект.УстановитьПометкуУдаления(Истина);\n"
" Иначе\n"
" Объект.ОбменДанными.Загрузка = Не ПараметрыЗаписи.ВключатьБизнесЛогику;\n"
" Объект.УстановитьПометкуУдаления(Истина);\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" Исключение\n"
" // Перехватываем все сообщенное при ошибке и добавляем их в одно исключение.\n"
" ТекстИсключения = \"\";\n"
" Для Каждого Сообщение Из ПолучитьСообщенияПользователю(Ложь) Цикл\n"
" ТекстИсключения = ТекстИсключения + Символы.ПС + Сообщение.Текст;\n"
" КонецЦикла;\n"
" \n"
" // Сообщаем предыдущие\n"
" Если СообщатьПовторно Тогда\n"
" СообщитьОтложенныеСообщения(ПредыдущиеСообщения);\n"
" КонецЕсли;\n"
" \n"
" Если ТекстИсключения = \"\" Тогда\n"
" ВызватьИсключение;\n"
" КонецЕсли;\n"
" ВызватьИсключение СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + СокрЛП(ТекстИсключения));\n"
" КонецПопытки;\n"
" \n"
" Если СообщатьПовторно Тогда\n"
" СообщитьОтложенныеСообщения(ПредыдущиеСообщения);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура СообщитьОтложенныеСообщения(Знач Сообщения)\n"
" \n"
" Для Каждого Сообщение Из Сообщения Цикл\n"
" Сообщение.Сообщить();\n"
" КонецЦикла;\n"
" \n"
"КонецПроцедуры\n\n"
"Процедура ЗаписатьОбъект(Знач Объект, Знач ПараметрыЗаписи)\n"
" \n"
" МетаданныеОбъекта = Объект.Метаданные();\n"
" \n"
" Если ЭтоДокумент(МетаданныеОбъекта) Тогда\n"
" ОбработатьОбъектСПерехватомСообщений(Объект, \"Запись\", РежимЗаписиДокумента.Запись, ПараметрыЗаписи);\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" // Проверка на возможные циклические ссылки.\n"
" СвойстваОбъекта = Новый Структура(\"Иерархический, ВидыСубконто, Владельцы\", Ложь, Неопределено, Новый Массив);\n"
" ЗаполнитьЗначенияСвойств(СвойстваОбъекта, МетаданныеОбъекта);\n"
" \n"
" // По родителю\n"
" Если СвойстваОбъекта.Иерархический Или СвойстваОбъекта.ВидыСубконто <> Неопределено Тогда \n"
" \n"
" Если Объект.Родитель = Объект.Ссылка Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'При записи \"\"%1\"\" возникает циклическая ссылка в иерархии.'\"),\n"
" Строка(Объект));\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" // По владельцу\n"
" Если СвойстваОбъекта.Владельцы.Количество() > 1 И Объект.Владелец = Объект.Ссылка Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'При записи \"\"%1\"\" возникает циклическая ссылка в подчинении.'\"),\n"
" Строка(Объект));\n"
" КонецЕсли;\n"
" \n"
" // Для последовательностей право \"Изменение\" может отсутствовать даже у роли \"АдминистраторСистемы\".\n"
" Если ЭтоПоследовательность(МетаданныеОбъекта)\n"
" И Не ПравоДоступа(\"Изменение\", МетаданныеОбъекта)\n"
" И Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда\n"
" \n"
" УстановитьПривилегированныйРежим(Истина);\n"
" КонецЕсли;\n"
" \n"
" // Просто запись\n"
" ОбработатьОбъектСПерехватомСообщений(Объект, \"Запись\", Неопределено, ПараметрыЗаписи);\n"
"КонецПроцедуры\n\n"
"Функция СобытиеЖурналаРегистрацииЗаменыСсылок()\n"
" \n"
" Возврат НСтр(\"ru = 'Поиск и удаление ссылок'\", КодОсновногоЯзыка());\n"
" \n"
"КонецФункции\n\n"
"// Параметры:\n"
"// Результат - см. РезультатЗаменыСсылок \n"
"// Ссылка - ЛюбаяСсылка\n"
"// ОписаниеОшибки - см. ОписаниеОшибкиЗамены\n"
"//\n"
"Процедура ЗарегистрироватьОшибкуЗамены(Результат, Знач Ссылка, Знач ОписаниеОшибки)\n"
" \n"
" Результат.ЕстьОшибки = Истина;\n"
" \n"
" Строка = Результат.Ошибки.Добавить();\n"
" Строка.Ссылка = Ссылка;\n"
" Строка.ПредставлениеОбъектаОшибки = ОписаниеОшибки.ПредставлениеОбъектаОшибки;\n"
" Строка.ОбъектОшибки = ОписаниеОшибки.ОбъектОшибки;\n"
" Строка.ТекстОшибки = ОписаниеОшибки.ТекстОшибки;\n"
" Строка.ТипОшибки = ОписаниеОшибки.ТипОшибки;\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * ТипОшибки - Строка\n"
"// * ОбъектОшибки - ЛюбаяСсылка\n"
"// * ПредставлениеОбъектаОшибки - Строка\n"
"// * ТекстОшибки - Строка\n"
"//\n"
"Функция ОписаниеОшибкиЗамены(Знач ТипОшибки, Знач ОбъектОшибки, Знач ПредставлениеОбъектаОшибки, Знач ТекстОшибки)\n"
" Результат = Новый Структура;\n"
" \n"
" Результат.Вставить(\"ТипОшибки\", ТипОшибки);\n"
" Результат.Вставить(\"ОбъектОшибки\", ОбъектОшибки);\n"
" Результат.Вставить(\"ПредставлениеОбъектаОшибки\", ПредставлениеОбъектаОшибки);\n"
" Результат.Вставить(\"ТекстОшибки\", ТекстОшибки);\n"
" \n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"// Возвращаемое значение:\n"
"// Структура:\n"
"// * ЕстьОшибки - Булево\n"
"// * ОчередьКНепосредственномуУдалению - Массив\n"
"// * Ошибки - см. ОбщегоНазначения.ЗаменитьСсылки\n"
"//\n"
"Функция РезультатЗаменыСсылок(Знач ОшибкиЗамены)\n\n"
" Результат = Новый Структура;\n"
" Результат.Вставить(\"ЕстьОшибки\", Ложь);\n"
" Результат.Вставить(\"ОчередьКНепосредственномуУдалению\", Новый Массив);\n"
" Результат.Вставить(\"Ошибки\", ОшибкиЗамены);\n"
" Возврат Результат\n"
" \n"
"КонецФункции\n\n"
"Процедура ЗарегистрироватьОшибкуВТаблицу(Результат, Дубль, Оригинал, Данные, Информация, ТипОшибки, ИнформацияОбОшибке)\n"
" Результат.ЕстьОшибки = Истина;\n"
" \n"
" ЗаписьЖурналаРегистрации(\n"
" СобытиеЖурналаРегистрацииЗаменыСсылок(),\n"
" УровеньЖурналаРегистрации.Ошибка,\n"
" ,\n"
" ,\n"
" ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));\n"
" \n"
" ПолноеПредставлениеДанных = Строка(Данные) + \" (\" + Информация.ПредставлениеЭлемента + \")\";\n"
" \n"
" Ошибка = Результат.Ошибки.Добавить();\n"
" Ошибка.Ссылка = Дубль;\n"
" Ошибка.ОбъектОшибки = Данные;\n"
" Ошибка.ПредставлениеОбъектаОшибки = ПолноеПредставлениеДанных;\n"
" \n"
" Если ТипОшибки = \"БлокировкаДляРегистра\" Тогда\n"
" НовыйШаблон = НСтр(\"ru = 'Не удалось начать редактирование %1: %2'\");\n"
" Ошибка.ТипОшибки = \"ОшибкаБлокировки\";\n"
" ИначеЕсли ТипОшибки = \"БлокировкаДляУдаленияДубля\" Тогда\n"
" НовыйШаблон = НСтр(\"ru = 'Не удалось начать удаление: %2'\");\n"
" Ошибка.ТипОшибки = \"ОшибкаБлокировки\";\n"
" ИначеЕсли ТипОшибки = \"УдалитьНаборДубля\" Тогда\n"
" НовыйШаблон = НСтр(\"ru = 'Не удалось очистить сведения о дубле в %1: %2'\");\n"
" Ошибка.ТипОшибки = \"ОшибкаЗаписи\";\n"
" ИначеЕсли ТипОшибки = \"ЗаписатьНаборОригинала\" Тогда\n"
" НовыйШаблон = НСтр(\"ru = 'Не удалось обновить сведения в %1: %2'\");\n"
" Ошибка.ТипОшибки = \"ОшибкаЗаписи\";\n"
" Иначе\n"
" НовыйШаблон = ТипОшибки + \" (%1): %2\";\n"
" Ошибка.ТипОшибки = ТипОшибки;\n"
" КонецЕсли;\n"
" \n"
" НовыйШаблон = НовыйШаблон + Символы.ПС + Символы.ПС + НСтр(\"ru = 'Подробности в журнале регистрации.'\");\n"
" \n"
" КраткоеПредставление = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);\n"
" Ошибка.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НовыйШаблон, ПолноеПредставлениеДанных, КраткоеПредставление);\n"
" \n"
"КонецПроцедуры\n\n"
"// Формирует информацию о типе объекта метаданных: полное имя, представления, вид и т.п.\n"
"Функция ИнформацияОТипе(ПолноеИмяИлиМетаданныеИлиТип, Кэш)\n"
" ТипПервогоПараметра = ТипЗнч(ПолноеИмяИлиМетаданныеИлиТип);\n"
" Если ТипПервогоПараметра = Тип(\"Строка\") Тогда\n"
" ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяИлиМетаданныеИлиТип);\n"
" Иначе\n"
" Если ТипПервогоПараметра = Тип(\"Тип\") Тогда // Поиск объекта метаданных.\n"
" ОбъектМетаданных = Метаданные.НайтиПоТипу(ПолноеИмяИлиМетаданныеИлиТип);\n"
" Иначе\n"
" ОбъектМетаданных = ПолноеИмяИлиМетаданныеИлиТип;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" ПолноеИмя = ВРег(ОбъектМетаданных.ПолноеИмя());\n"
" \n"
" ИнформацияОТипах = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Кэш, \"ИнформацияОТипах\");\n"
" Если ИнформацияОТипах = Неопределено Тогда\n"
" ИнформацияОТипах = Новый Соответствие;\n"
" Кэш.Вставить(\"ИнформацияОТипах\", ИнформацияОТипах);\n"
" Иначе\n"
" Информация = ИнформацияОТипах.Получить(ПолноеИмя);\n"
" Если Информация <> Неопределено Тогда\n"
" Возврат Информация;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Информация = Новый Структура(\"ПолноеИмя, ПредставлениеЭлемента, \n"
" |Вид, Ссылочный, Технический, Разделенный,\n"
" |Иерархический,\n"
" |ЕстьПодчиненные, ИменаПодчиненных,\n"
" |Измерения, Реквизиты, Ресурсы\");\n"
" ИнформацияОТипах.Вставить(ПолноеИмя, Информация);\n"
" \n"
" // Заполнение базовой информации.\n"
" Информация.ПолноеИмя = ПолноеИмя;\n"
" \n"
" // Представление элемента.\n"
" Информация.ПредставлениеЭлемента = ПредставлениеОбъекта(ОбъектМетаданных);\n"
" \n"
" // Вид и его свойства.\n"
" Информация.Вид = Лев(Информация.ПолноеИмя, СтрНайти(Информация.ПолноеИмя, \".\")-1);\n"
" Если Информация.Вид = \"СПРАВОЧНИК\"\n"
" Или Информация.Вид = \"ДОКУМЕНТ\"\n"
" Или Информация.Вид = \"ПЕРЕЧИСЛЕНИЕ\"\n"
" Или Информация.Вид = \"ПЛАНВИДОВХАРАКТЕРИСТИК\"\n"
" Или Информация.Вид = \"ПЛАНСЧЕТОВ\"\n"
" Или Информация.Вид = \"ПЛАНВИДОВРАСЧЕТА\"\n"
" Или Информация.Вид = \"БИЗНЕСПРОЦЕСС\"\n"
" Или Информация.Вид = \"ЗАДАЧА\"\n"
" Или Информация.Вид = \"ПЛАНОБМЕНА\" Тогда\n"
" Информация.Ссылочный = Истина;\n"
" Иначе\n"
" Информация.Ссылочный = Ложь;\n"
" КонецЕсли;\n"
" \n"
" Если Информация.Вид = \"СПРАВОЧНИК\"\n"
" Или Информация.Вид = \"ПЛАНВИДОВХАРАКТЕРИСТИК\" Тогда\n"
" Информация.Иерархический = ОбъектМетаданных.Иерархический;\n"
" ИначеЕсли Информация.Вид = \"ПЛАНСЧЕТОВ\" Тогда\n"
" Информация.Иерархический = Истина;\n"
" Иначе\n"
" Информация.Иерархический = Ложь;\n"
" КонецЕсли;\n"
" \n"
" Информация.ЕстьПодчиненные = Ложь;\n"
" Если Информация.Вид = \"СПРАВОЧНИК\"\n"
" Или Информация.Вид = \"ПЛАНВИДОВХАРАКТЕРИСТИК\"\n"
" Или Информация.Вид = \"ПЛАНОБМЕНА\"\n"
" Или Информация.Вид = \"ПЛАНСЧЕТОВ\"\n"
" Или Информация.Вид = \"ПЛАНВИДОВРАСЧЕТА\" Тогда\n"
" Для Каждого Справочник Из Метаданные.Справочники Цикл\n"
" Если Справочник.Владельцы.Содержит(ОбъектМетаданных) Тогда\n"
" Если Информация.ЕстьПодчиненные = Ложь Тогда\n"
" Информация.ЕстьПодчиненные = Истина;\n"
" Информация.ИменаПодчиненных = Новый Массив;\n"
" КонецЕсли;\n"
" ИменаПодчиненных = Информация.ИменаПодчиненных; // Массив - \n"
" ИменаПодчиненных.Добавить(Справочник.ПолноеИмя());\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" Если Информация.ПолноеИмя = \"СПРАВОЧНИК.ИДЕНТИФИКАТОРЫОБЪЕКТОВМЕТАДАННЫХ\"\n"
" Или Информация.ПолноеИмя = \"СПРАВОЧНИК.ПРЕДОПРЕДЕЛЕННЫЕВАРИАНТЫОТЧЕТОВ\" Тогда\n"
" Информация.Технический = Истина;\n"
" Информация.Разделенный = Ложь;\n"
" Иначе\n"
" Информация.Технический = Ложь;\n"
" Если Не Кэш.Свойство(\"МодельСервиса\") Тогда\n"
" Кэш.Вставить(\"МодельСервиса\", РазделениеВключено());\n"
" Если Кэш.МодельСервиса Тогда\n"
" \n"
" Если ПодсистемаСуществует(\"ТехнологияСервиса.БазоваяФункциональность\") Тогда\n"
" МодульРаботаВМоделиСервиса = ОбщийМодуль(\"РаботаВМоделиСервиса\");\n"
" РазделительОсновныхДанных = МодульРаботаВМоделиСервиса.РазделительОсновныхДанных();\n"
" РазделительВспомогательныхДанных = МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных();\n"
" Иначе\n"
" РазделительОсновныхДанных = Неопределено;\n"
" РазделительВспомогательныхДанных = Неопределено;\n"
" КонецЕсли;\n"
" \n"
" Кэш.Вставить(\"ВОбластиДанных\", РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных());\n"
" Кэш.Вставить(\"РазделительОсновныхДанных\", РазделительОсновныхДанных);\n"
" Кэш.Вставить(\"РазделительВспомогательныхДанных\", РазделительВспомогательныхДанных);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" Если Кэш.МодельСервиса Тогда\n"
" Если ПодсистемаСуществует(\"ТехнологияСервиса.БазоваяФункциональность\") Тогда\n"
" МодульРаботаВМоделиСервиса = ОбщийМодуль(\"РаботаВМоделиСервиса\");\n"
" ЭтоРазделенныйОбъектМетаданных = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ОбъектМетаданных);\n"
" Иначе\n"
" ЭтоРазделенныйОбъектМетаданных = Истина;\n"
" КонецЕсли;\n"
" Информация.Разделенный = ЭтоРазделенныйОбъектМетаданных;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Информация.Измерения = Новый Структура;\n"
" Информация.Реквизиты = Новый Структура;\n"
" Информация.Ресурсы = Новый Структура;\n"
" \n"
" ВидыРеквизитов = Новый Структура(\"СтандартныеРеквизиты, Реквизиты, Измерения, Ресурсы\");\n"
" ЗаполнитьЗначенияСвойств(ВидыРеквизитов, ОбъектМетаданных);\n"
" Для Каждого КлючИЗначение Из ВидыРеквизитов Цикл\n"
" Коллекция = КлючИЗначение.Значение; // КоллекцияОбъектовМетаданных\n"
" Если ТипЗнч(Коллекция) = Тип(\"КоллекцияОбъектовМетаданных\") Тогда\n"
" КудаПишем = ?(Информация.Свойство(КлючИЗначение.Ключ), Информация[КлючИЗначение.Ключ], Информация.Реквизиты);\n"
" Для Каждого Реквизит Из Коллекция Цикл\n"
" КудаПишем.Вставить(Реквизит.Имя, ИнформацияПоРеквизиту(Реквизит));\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Если Информация.Вид = \"РЕГИСТРСВЕДЕНИЙ\"\n"
" И ОбъектМетаданных.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда\n"
" ИнформацияПоРеквизиту = Новый Структура(\"Ведущее, Представление, Формат, Тип, ЗначениеПоУмолчанию, ЗаполнятьИзДанныхЗаполнения\");\n"
" ИнформацияПоРеквизиту.Ведущее = Ложь;\n"
" ИнформацияПоРеквизиту.ЗаполнятьИзДанныхЗаполнения = Ложь;\n"
" Если ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора Тогда\n"
" ИнформацияПоРеквизиту.Тип = Новый ОписаниеТипов(\"МоментВремени\");\n"
" ИначеЕсли ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Секунда Тогда\n"
" ИнформацияПоРеквизиту.Тип = Новый ОписаниеТипов(\"Дата\", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));\n"
" Иначе\n"
" ИнформацияПоРеквизиту.Тип = Новый ОписаниеТипов(\"Дата\", , , Новый КвалификаторыДаты(ЧастиДаты.Дата));\n"
" КонецЕсли;\n"
" Информация.Измерения.Вставить(\"Период\", ИнформацияПоРеквизиту);\n"
" КонецЕсли;\n"
" \n"
" Возврат Информация;\n"
"КонецФункции\n\n"
"// Параметры:\n"
"// МетаданныеРеквизита - ОбъектМетаданныхРеквизит\n"
"// \n"
"Функция ИнформацияПоРеквизиту(МетаданныеРеквизита)\n"
" // ОписаниеСтандартногоРеквизита\n"
" // ОбъектМетаданных: Измерение\n"
" // ОбъектМетаданных: Ресурс\n"
" // ОбъектМетаданных: Реквизит\n"
" Информация = Новый Структура(\"Ведущее, Представление, Формат, Тип, ЗначениеПоУмолчанию, ЗаполнятьИзДанныхЗаполнения\");\n"
" ЗаполнитьЗначенияСвойств(Информация, МетаданныеРеквизита);\n"
" Информация.Представление = МетаданныеРеквизита.Представление();\n"
" Если Информация.ЗаполнятьИзДанныхЗаполнения = Истина Тогда\n"
" Информация.ЗначениеПоУмолчанию = МетаданныеРеквизита.ЗначениеЗаполнения;\n"
" Иначе\n"
" Информация.ЗначениеПоУмолчанию = МетаданныеРеквизита.Тип.ПривестиЗначение();\n"
" КонецЕсли;\n"
" Возврат Информация;\n"
"КонецФункции\n\n"
"Процедура ДобавитьВСтатистикуЗаменыСсылок(Статистика, Дубль, ЕстьОшибки)\n\n"
" КлючДубля = Дубль.Метаданные().ПолноеИмя();\n"
" ЭлементСтатистики = Статистика[КлючДубля];\n"
" Если ЭлементСтатистики = Неопределено Тогда\n"
" ЭлементСтатистики = Новый Структура(\"КоличествоЭлементов, КоличествоОшибок\",0,0);\n"
" Статистика.Вставить(КлючДубля, ЭлементСтатистики);\n"
" КонецЕсли;\n"
" \n"
" ЭлементСтатистики.КоличествоЭлементов = ЭлементСтатистики.КоличествоЭлементов + 1;\n"
" ЭлементСтатистики.КоличествоОшибок = ЭлементСтатистики.КоличествоОшибок + ?(ЕстьОшибки, 1,0);\n\n"
"КонецПроцедуры\n\n"
"Процедура ОтправитьСтатистикуЗаменыСсылок(Статистика)\n\n"
" Если НЕ ПодсистемаСуществует(\"СтандартныеПодсистемы.ЦентрМониторинга\") Тогда\n"
" Возврат;\n"
" КонецЕсли; \n"
" \n"
" МодульЦентрМониторинга = ОбщийМодуль(\"ЦентрМониторинга\");\n"
" Для каждого ЭлементСтатистики Из Статистика Цикл\n"
" МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики(\n"
" \"БазоваяФункциональность.ЗаменаСсылок.\" + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоЭлементов);\n"
" МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики(\n"
" \"БазоваяФункциональность.ЗаменаСсылокКоличествоОшибок.\" + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоОшибок);\n"
" КонецЦикла;\n\n"
"КонецПроцедуры\n\n"
"Процедура ДополнитьИсключенияПоискаСсылокПодчиненнымиОбъектами(Знач ИсключенияПоискаСсылок)\n"
" \n"
" Для каждого ОписаниеПодчиненногоОбъекта Из ПодчиненныеОбъекты() Цикл\n"
" \n"
" ПоляСвязи = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(\n"
" ОписаниеПодчиненногоОбъекта.ПоляСвязей, \",\",, Истина);\n"
" ЗначениеИсключенияПоискаСсылок = Новый Массив;\n"
" Для каждого ПолеСвязи Из ПоляСвязи Цикл\n"
" ЗначениеИсключенияПоискаСсылок.Добавить(ПолеСвязи);\n"
" КонецЦикла;\n"
" ИсключенияПоискаСсылок.Вставить(ОписаниеПодчиненногоОбъекта.ПодчиненныйОбъект, ЗначениеИсключенияПоискаСсылок);\n"
" \n"
" КонецЦикла;\n\n"
"КонецПроцедуры\n\n"
"Процедура ЗарегистрироватьОшибкиУдаления(Результат, ПрепятствующиеУдалению)\n\n"
" ПредставленияСсылок = ПредметыСтрокой(ПрепятствующиеУдалению.ВыгрузитьКолонку(\"МестоИспользования\")); \n"
" Для каждого ПрепятствующиеУдалению Из ПрепятствующиеУдалению Цикл\n"
" ТекстОшибки = НСтр(\"ru = 'Элемент не удален, т.к. на него есть ссылки'\");\n"
" ОписаниеОшибки = ОписаниеОшибкиЗамены(\"ОшибкаУдаления\", ПрепятствующиеУдалению.МестоИспользования, \n"
" ПредставленияСсылок[ПрепятствующиеУдалению.МестоИспользования], ТекстОшибки);\n"
" ЗарегистрироватьОшибкуЗамены(Результат, ПрепятствующиеУдалению.УдаляемыйСсылка, ОписаниеОшибки);\n"
" КонецЦикла;\n\n"
"КонецПроцедуры\n\n"
"Функция СформироватьДубли(ПараметрыВыполнения, ПараметрыЗамены, ПарыЗамен, Результат)\n"
" \n"
" Дубли = Новый Массив;\n"
" Для Каждого КлючЗначение Из ПарыЗамен Цикл\n"
" Дубль = КлючЗначение.Ключ;\n"
" Оригинал = КлючЗначение.Значение;\n"
" Если Дубль = Оригинал Или Дубль.Пустая() Тогда\n"
" Продолжить; // Самого на себя и пустые ссылки не заменяем.\n"
" КонецЕсли;\n"
" Дубли.Добавить(Дубль);\n"
" // Пропускаем промежуточные замены, чтобы не строить граф (если A->B и B->C то вместо A->B производится замена A->C).\n"
" ОригиналОригинала = ПарыЗамен[Оригинал];\n"
" ЕстьОригиналОригинала = (ОригиналОригинала <> Неопределено И ОригиналОригинала <> Дубль И ОригиналОригинала <> Оригинал);\n"
" Если ЕстьОригиналОригинала Тогда\n"
" Пока ЕстьОригиналОригинала Цикл\n"
" Оригинал = ОригиналОригинала;\n"
" ОригиналОригинала = ПарыЗамен[Оригинал];\n"
" ЕстьОригиналОригинала = (ОригиналОригинала <> Неопределено И ОригиналОригинала <> Дубль И ОригиналОригинала <> Оригинал);\n"
" КонецЦикла;\n"
" ПарыЗамен.Вставить(Дубль, Оригинал);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Если ПараметрыВыполнения.УчитыватьПрикладныеПравила И ПодсистемаСуществует(\"СтандартныеПодсистемы.ПоискИУдалениеДублей\") Тогда\n"
" МодульПоискИУдалениеДублей = ОбщийМодуль(\"ПоискИУдалениеДублей\");\n"
" Ошибки = МодульПоискИУдалениеДублей.ПроверитьВозможностьЗаменыЭлементов(ПарыЗамен, ПараметрыЗамены);\n"
" \n"
" ОригиналыОбъектов = Новый Массив;\n"
" Для Каждого КлючЗначение Из Ошибки Цикл\n"
" Дубль = КлючЗначение.Ключ;\n"
" ОригиналыОбъектов.Добавить(ПарыЗамен[Дубль]);\n\n"
" Индекс = Дубли.Найти(Дубль);\n"
" Если Индекс <> Неопределено Тогда\n"
" Дубли.Удалить(Индекс); // пропускаем проблемный элемент.\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" ПредставленияОбъектов = ПредметыСтрокой(ОригиналыОбъектов);\n"
" Для Каждого КлючЗначение Из Ошибки Цикл\n"
" Дубль = КлючЗначение.Ключ;\n"
" Оригинал = ПарыЗамен[Дубль];\n"
" ТекстОшибки = КлючЗначение.Значение;\n"
" Причина = ОписаниеОшибкиЗамены(\"ОшибкаЗаписи\", Оригинал, ПредставленияОбъектов[Оригинал], ТекстОшибки);\n"
" ЗарегистрироватьОшибкуЗамены(Результат, Дубль, Причина);\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" Возврат Дубли;\n\n"
"КонецФункции\n\n"
"Функция НовыйПараметрыВыполненияЗаменыСсылок(Знач ПараметрыЗамены)\n"
" \n"
" ПараметрыПоУмолчанию = ПараметрыЗаменыСсылок();\n"
" ПараметрыВыполнения = Новый Структура;\n"
" ПараметрыВыполнения.Вставить(\"УдалятьНепосредственно\", ПараметрыПоУмолчанию.СпособУдаления = \"Непосредственно\");\n"
" ПараметрыВыполнения.Вставить(\"ПомечатьНаУдаление\", ПараметрыПоУмолчанию.СпособУдаления = \"Пометка\");\n"
" ПараметрыВыполнения.Вставить(\"ВключатьБизнесЛогику\", ПараметрыПоУмолчанию.ВключатьБизнесЛогику);\n"
" ПараметрыВыполнения.Вставить(\"ПривилегированнаяЗапись\", ПараметрыПоУмолчанию.ПривилегированнаяЗапись);\n"
" ПараметрыВыполнения.Вставить(\"УчитыватьПрикладныеПравила\", ПараметрыПоУмолчанию.УчитыватьПрикладныеПравила);\n"
" ПараметрыВыполнения.Вставить(\"МестаЗамены\", Новый Массив);\n"
" \n"
" // Переданные параметры обрабатываются условно для обратной совместимости.\n"
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, \"СпособУдаления\");\n"
" Если ЗначениеПараметра = \"Непосредственно\" Тогда\n"
" ПараметрыВыполнения.УдалятьНепосредственно = Истина;\n"
" ПараметрыВыполнения.ПомечатьНаУдаление = Ложь;\n"
" ИначеЕсли ЗначениеПараметра = \"Пометка\" Тогда\n"
" ПараметрыВыполнения.УдалятьНепосредственно = Ложь;\n"
" ПараметрыВыполнения.ПомечатьНаУдаление = Истина;\n"
" КонецЕсли;\n"
" \n"
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, \"ВключатьБизнесЛогику\");\n"
" Если ТипЗнч(ЗначениеПараметра) = Тип(\"Булево\") Тогда\n"
" ПараметрыВыполнения.ВключатьБизнесЛогику = ЗначениеПараметра;\n"
" КонецЕсли;\n"
" \n"
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, \"ПривилегированнаяЗапись\");\n"
" Если ТипЗнч(ЗначениеПараметра) = Тип(\"Булево\") Тогда\n"
" ПараметрыВыполнения.ПривилегированнаяЗапись = ЗначениеПараметра;\n"
" КонецЕсли;\n"
" \n"
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, \"УчитыватьПрикладныеПравила\");\n"
" Если ТипЗнч(ЗначениеПараметра) = Тип(\"Булево\") Тогда\n"
" ПараметрыВыполнения.УчитыватьПрикладныеПравила = ЗначениеПараметра;\n"
" КонецЕсли;\n"
" \n"
" ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, \"МестаЗамены\", Новый Массив);\n"
" Если (ЗначениеПараметра.Количество() > 0) Тогда\n"
" ПараметрыВыполнения.МестаЗамены = Новый Массив(Новый ФиксированныйМассив(ЗначениеПараметра));\n"
" КонецЕсли;\n"
" \n"
" Возврат ПараметрыВыполнения;\n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область МестаИспользования\n\n"
"Функция ОписаниеТипаКлючиЗаписей()\n"
" \n"
" ДобавляемыеТипы = Новый Массив;\n"
" Для Каждого Мета Из Метаданные.РегистрыСведений Цикл\n"
" ДобавляемыеТипы.Добавить(Тип(\"РегистрСведенийКлючЗаписи.\" + Мета.Имя));\n"
" КонецЦикла;\n"
" Для Каждого Мета Из Метаданные.РегистрыНакопления Цикл\n"
" ДобавляемыеТипы.Добавить(Тип(\"РегистрНакопленияКлючЗаписи.\" + Мета.Имя));\n"
" КонецЦикла;\n"
" Для Каждого Мета Из Метаданные.РегистрыБухгалтерии Цикл\n"
" ДобавляемыеТипы.Добавить(Тип(\"РегистрБухгалтерииКлючЗаписи.\" + Мета.Имя));\n"
" КонецЦикла;\n"
" Для Каждого Мета Из Метаданные.РегистрыРасчета Цикл\n"
" ДобавляемыеТипы.Добавить(Тип(\"РегистрРасчетаКлючЗаписи.\" + Мета.Имя));\n"
" КонецЦикла;\n"
" \n"
" Возврат Новый ОписаниеТипов(ДобавляемыеТипы); \n"
"КонецФункции\n\n"
"Функция ОписаниеИзмеренийНабора(Знач МетаданныеРегистра, КэшИзмеренийРегистров)\n"
" \n"
" ОписаниеИзмерений = КэшИзмеренийРегистров[МетаданныеРегистра];\n"
" Если ОписаниеИзмерений <> Неопределено Тогда\n"
" Возврат ОписаниеИзмерений;\n"
" КонецЕсли;\n"
" \n"
" // Период и регистратор, если есть.\n"
" ОписаниеИзмерений = Новый Структура;\n"
" \n"
" ДанныеИзмерения = Новый Структура(\"Ведущее, Представление, Формат, Тип\", Ложь);\n"
" \n"
" Если Метаданные.РегистрыСведений.Содержит(МетаданныеРегистра) Тогда\n"
" // Возможно есть период\n"
" МетаПериод = МетаданныеРегистра.ПериодичностьРегистраСведений; \n"
" Периодичность = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений;\n"
" \n"
" Если МетаПериод = Периодичность.ПозицияРегистратора Тогда\n"
" ДанныеИзмерения.Тип = Документы.ТипВсеСсылки();\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Регистратор'\");\n"
" ДанныеИзмерения.Ведущее = Истина;\n"
" ОписаниеИзмерений.Вставить(\"Регистратор\", ДанныеИзмерения);\n"
" \n"
" ИначеЕсли МетаПериод = Периодичность.Год Тогда\n"
" ДанныеИзмерения.Тип = Новый ОписаниеТипов(\"Дата\");\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Период'\");\n"
" ДанныеИзмерения.Формат = НСтр(\"ru = 'ДФ=''yyyy \"\"г.\"\"''; ДП=''Дата не задана'''\");\n"
" ОписаниеИзмерений.Вставить(\"Период\", ДанныеИзмерения);\n"
" \n"
" ИначеЕсли МетаПериод = Периодичность.День Тогда\n"
" ДанныеИзмерения.Тип = Новый ОписаниеТипов(\"Дата\");\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Период'\");\n"
" ДанныеИзмерения.Формат = НСтр(\"ru = 'ДЛФ=D; ДП=''Дата не задана'''\");\n"
" ОписаниеИзмерений.Вставить(\"Период\", ДанныеИзмерения);\n"
" \n"
" ИначеЕсли МетаПериод = Периодичность.Квартал Тогда\n"
" ДанныеИзмерения.Тип = Новый ОписаниеТипов(\"Дата\");\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Период'\");\n"
" ДанныеИзмерения.Формат = НСтр(\"ru = 'ДФ=''к \"\"\"\"квартал \"\"\"\"yyyy \"\"\"\"г.\"\"\"\"''; ДП=''Дата не задана'''\");\n"
" ОписаниеИзмерений.Вставить(\"Период\", ДанныеИзмерения);\n"
" \n"
" ИначеЕсли МетаПериод = Периодичность.Месяц Тогда\n"
" ДанныеИзмерения.Тип = Новый ОписаниеТипов(\"Дата\");\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Период'\");\n"
" ДанныеИзмерения.Формат = НСтр(\"ru = 'ДФ=''ММММ yyyy \"\"\"\"г.\"\"\"\"''; ДП=''Дата не задана'''\");\n"
" ОписаниеИзмерений.Вставить(\"Период\", ДанныеИзмерения);\n"
" \n"
" ИначеЕсли МетаПериод = Периодичность.Секунда Тогда\n"
" ДанныеИзмерения.Тип = Новый ОписаниеТипов(\"Дата\");\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Период'\");\n"
" ДанныеИзмерения.Формат = НСтр(\"ru = 'ДЛФ=DT; ДП=''Дата не задана'''\");\n"
" ОписаниеИзмерений.Вставить(\"Период\", ДанныеИзмерения);\n"
" \n"
" КонецЕсли;\n"
" \n"
" Иначе\n"
" ДанныеИзмерения.Тип = Документы.ТипВсеСсылки();\n"
" ДанныеИзмерения.Представление = НСтр(\"ru = 'Регистратор'\");\n"
" ДанныеИзмерения.Ведущее = Истина;\n"
" ОписаниеИзмерений.Вставить(\"Регистратор\", ДанныеИзмерения);\n"
" \n"
" КонецЕсли;\n"
" \n"
" // Все измерения\n"
" Для Каждого МетаИзмерение Из МетаданныеРегистра.Измерения Цикл\n"
" ДанныеИзмерения = Новый Структура(\"Ведущее, Представление, Формат, Тип\");\n"
" ДанныеИзмерения.Тип = МетаИзмерение.Тип;\n"
" ДанныеИзмерения.Представление = МетаИзмерение.Представление();\n"
" ДанныеИзмерения.Ведущее = МетаИзмерение.Ведущее;\n"
" ОписаниеИзмерений.Вставить(МетаИзмерение.Имя, ДанныеИзмерения);\n"
" КонецЦикла;\n"
" \n"
" КэшИзмеренийРегистров[МетаданныеРегистра] = ОписаниеИзмерений;\n"
" Возврат ОписаниеИзмерений;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#КонецОбласти\n\n"
"#Область УсловныеВызовы\n\n"
"// Возвращает серверный модуль менеджера по имени объекта.\n"
"Функция СерверныйМодульМенеджера(Имя)\n"
" ОбъектНайден = Ложь;\n"
" \n"
" ЧастиИмени = СтрРазделить(Имя, \".\");\n"
" Если ЧастиИмени.Количество() = 2 Тогда\n"
" \n"
" ИмяВида = ВРег(ЧастиИмени[0]);\n"
" ИмяОбъекта = ЧастиИмени[1];\n"
" \n"
" Если ИмяВида = ВРег(\"Константы\") Тогда\n"
" Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"РегистрыСведений\") Тогда\n"
" Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"РегистрыНакопления\") Тогда\n"
" Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"РегистрыБухгалтерии\") Тогда\n"
" Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"РегистрыРасчета\") Тогда\n"
" Если Метаданные.РегистрыРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"Справочники\") Тогда\n"
" Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"Документы\") Тогда\n"
" Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"Отчеты\") Тогда\n"
" Если Метаданные.Отчеты.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"Обработки\") Тогда\n"
" Если Метаданные.Обработки.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"БизнесПроцессы\") Тогда\n"
" Если Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"ЖурналыДокументов\") Тогда\n"
" Если Метаданные.ЖурналыДокументов.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"Задачи\") Тогда\n"
" Если Метаданные.Задачи.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"ПланыСчетов\") Тогда\n"
" Если Метаданные.ПланыСчетов.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"ПланыОбмена\") Тогда\n"
" Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"ПланыВидовХарактеристик\") Тогда\n"
" Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" ИначеЕсли ИмяВида = ВРег(\"ПланыВидовРасчета\") Тогда\n"
" Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда\n"
" ОбъектНайден = Истина;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" Если Не ОбъектНайден Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Объект метаданных \"\"%1\"\" не существует.'\"), Имя);\n"
" КонецЕсли;\n"
" \n"
" // АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно.\n"
" УстановитьБезопасныйРежим(Истина);\n"
" Модуль = Вычислить(Имя);\n"
" // АПК:488-вкл\n"
" \n"
" Возврат Модуль;\n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область Данные\n\n"
"Функция СравниваемыеКолонки(Знач КоллекцияСтрок, Знач ИменаКолонок, Знач ИсключаяКолонки)\n"
" \n"
" Если ПустаяСтрока(ИменаКолонок) Тогда\n"
" \n"
" ТипКоллекции = ТипЗнч(КоллекцияСтрок);\n"
" ЭтоСписокЗначений = (ТипКоллекции = Тип(\"СписокЗначений\"));\n"
" ЭтоТаблицаЗначений = (ТипКоллекции = Тип(\"ТаблицаЗначений\"));\n"
" ЭтоКоллекцияКлючИЗначение = (ТипКоллекции = Тип(\"Соответствие\"))\n"
" Или (ТипКоллекции = Тип(\"Структура\"))\n"
" Или (ТипКоллекции = Тип(\"ФиксированноеСоответствие\"))\n"
" Или (ТипКоллекции = Тип(\"ФиксированнаяСтруктура\"));\n"
" \n"
" СравниваемыеКолонки = Новый Массив;\n"
" Если ЭтоТаблицаЗначений Тогда\n"
" Для Каждого Колонка Из КоллекцияСтрок.Колонки Цикл\n"
" СравниваемыеКолонки.Добавить(Колонка.Имя);\n"
" КонецЦикла;\n"
" ИначеЕсли ЭтоСписокЗначений Тогда\n"
" СравниваемыеКолонки.Добавить(\"Значение\");\n"
" СравниваемыеКолонки.Добавить(\"Картинка\");\n"
" СравниваемыеКолонки.Добавить(\"Пометка\");\n"
" СравниваемыеКолонки.Добавить(\"Представление\");\n"
" ИначеЕсли ЭтоКоллекцияКлючИЗначение Тогда\n"
" СравниваемыеКолонки.Добавить(\"Ключ\");\n"
" СравниваемыеКолонки.Добавить(\"Значение\");\n"
" Иначе \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Для коллекции типа %1 укажите имена полей, по которым производится сравнение в %2.'\"),\n"
" ТипКоллекции, \"ОбщегоНазначения.КоллекцииИдентичны\");\n"
" КонецЕсли;\n"
" Иначе\n"
" СравниваемыеКолонки = СтрРазделить(СтрЗаменить(ИменаКолонок, \" \", \"\"), \",\");\n"
" КонецЕсли;\n"
" \n"
" // Вычитаем исключаемые поля\n"
" Если Не ПустаяСтрока(ИсключаяКолонки) Тогда\n"
" ИсключаяКолонки = СтрРазделить(СтрЗаменить(ИсключаяКолонки, \" \", \"\"), \",\");\n"
" СравниваемыеКолонки = ОбщегоНазначенияКлиентСервер.РазностьМассивов(СравниваемыеКолонки, ИсключаяКолонки);\n"
" КонецЕсли; \n"
" Возврат СравниваемыеКолонки;\n\n"
"КонецФункции\n\n"
"Функция СравнитьСУчетомПоследовательности(Знач КоллекцияСтрок1, Знач КоллекцияСтрок2, Знач СравниваемыеКолонки)\n"
" \n"
" ТипКоллекции = ТипЗнч(КоллекцияСтрок1);\n"
" СравниваютсяМассивы = (ТипКоллекции = Тип(\"Массив\") Или ТипКоллекции = Тип(\"ФиксированныйМассив\"));\n"
" \n"
" // Параллельный обход обеих коллекций.\n"
" НомерСтрокиКоллекции1 = 0;\n"
" Для Каждого СтрокаКоллекции1 Из КоллекцияСтрок1 Цикл\n"
" // Спозиционируемся на аналогичную строку второй коллекции.\n"
" НомерСтрокиКоллекции2 = 0;\n"
" ЕстьСтрокиКоллекции2 = Ложь;\n"
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл\n"
" ЕстьСтрокиКоллекции2 = Истина;\n"
" Если НомерСтрокиКоллекции2 = НомерСтрокиКоллекции1 Тогда\n"
" Прервать;\n"
" КонецЕсли;\n"
" НомерСтрокиКоллекции2 = НомерСтрокиКоллекции2 + 1;\n"
" КонецЦикла;\n"
" Если Не ЕстьСтрокиКоллекции2 Тогда\n"
" // Во второй коллекции вообще нет строк.\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" // Сравниваем значения полей двух строк.\n"
" Если СравниваютсяМассивы Тогда\n"
" Если СтрокаКоллекции1 <> СтрокаКоллекции2 Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" Иначе\n"
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл\n"
" Если СтрокаКоллекции1[ИмяКолонки] <> СтрокаКоллекции2[ИмяКолонки] Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" НомерСтрокиКоллекции1 = НомерСтрокиКоллекции1 + 1;\n"
" КонецЦикла;\n"
" \n"
" КоличествоСтрокКоллекции1 = НомерСтрокиКоллекции1;\n"
" \n"
" // Отдельно подсчитаем количество строк второй коллекции.\n"
" КоличествоСтрокКоллекции2 = 0;\n"
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл\n"
" КоличествоСтрокКоллекции2 = КоличествоСтрокКоллекции2 + 1;\n"
" КонецЦикла;\n"
" \n"
" // Если в первой коллекции не оказалось строк, \n"
" // то их не должно быть и во второй.\n"
" Если КоличествоСтрокКоллекции1 = 0 Тогда\n"
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл\n"
" Возврат Ложь;\n"
" КонецЦикла;\n"
" КоличествоСтрокКоллекции2 = 0;\n"
" КонецЕсли;\n"
" \n"
" // Количество строк не должно отличаться.\n"
" Если КоличествоСтрокКоллекции1 <> КоличествоСтрокКоллекции2 Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Возврат Истина;\n"
" \n"
"КонецФункции\n\n"
"Функция СравнитьБезУчетаПоследовательности(Знач КоллекцияСтрок1, Знач КоллекцияСтрок2, Знач СравниваемыеКолонки)\n"
" \n"
" // Строки отбора накапливаем по первой коллекции для того, чтобы:\n"
" // - повторно не искать одинаковые строки,\n"
" // - убедиться, что во второй коллекции ни одной такой строки, которой нет в накопленных.\n"
" \n"
" СтрокиОтбора = Новый ТаблицаЗначений;\n"
" ПараметрыОтбора = Новый Структура;\n"
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл\n"
" СтрокиОтбора.Колонки.Добавить(ИмяКолонки);\n"
" ПараметрыОтбора.Вставить(ИмяКолонки);\n"
" КонецЦикла;\n"
" \n"
" ЕстьСтрокиКоллекции1 = Ложь;\n"
" Для Каждого СтрокаОтбора Из КоллекцияСтрок1 Цикл\n"
" \n"
" ЗаполнитьЗначенияСвойств(ПараметрыОтбора, СтрокаОтбора);\n"
" Если СтрокиОтбора.НайтиСтроки(ПараметрыОтбора).Количество() > 0 Тогда\n"
" // Строку с такими полями уже искали.\n"
" Продолжить;\n"
" КонецЕсли;\n"
" ЗаполнитьЗначенияСвойств(СтрокиОтбора.Добавить(), СтрокаОтбора);\n"
" \n"
" // Подсчитаем количество таких строк в первой коллекции.\n"
" НайденоСтрокКоллекции1 = 0;\n"
" Для Каждого СтрокаКоллекции1 Из КоллекцияСтрок1 Цикл\n"
" СтрокаПодходит = Истина;\n"
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл\n"
" Если СтрокаКоллекции1[ИмяКолонки] <> СтрокаОтбора[ИмяКолонки] Тогда\n"
" СтрокаПодходит = Ложь;\n"
" Прервать;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Если СтрокаПодходит Тогда\n"
" НайденоСтрокКоллекции1 = НайденоСтрокКоллекции1 + 1;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" // Подсчитаем количество таких строк во второй коллекции.\n"
" НайденоСтрокКоллекции2 = 0;\n"
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл\n"
" СтрокаПодходит = Истина;\n"
" Для Каждого ИмяКолонки Из СравниваемыеКолонки Цикл\n"
" Если СтрокаКоллекции2[ИмяКолонки] <> СтрокаОтбора[ИмяКолонки] Тогда\n"
" СтрокаПодходит = Ложь;\n"
" Прервать;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Если СтрокаПодходит Тогда\n"
" НайденоСтрокКоллекции2 = НайденоСтрокКоллекции2 + 1;\n"
" // Если количество таких строк во второй коллекции превысило количество в первой, \n"
" // то уже можно сделать вывод, что коллекции не идентичны.\n"
" Если НайденоСтрокКоллекции2 > НайденоСтрокКоллекции1 Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" // Количество таких строк не должно отличаться.\n"
" Если НайденоСтрокКоллекции1 <> НайденоСтрокКоллекции2 Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" ЕстьСтрокиКоллекции1 = Истина;\n"
" \n"
" КонецЦикла;\n"
" \n"
" // Если в первой коллекции не оказалось строк, \n"
" // то их не должно быть и во второй.\n"
" Если Не ЕстьСтрокиКоллекции1 Тогда\n"
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл\n"
" Возврат Ложь;\n"
" КонецЦикла;\n"
" КонецЕсли;\n"
" \n"
" // Проверим, что во второй коллекции нет ни одной такой строки, которой нет в накопленных.\n"
" Для Каждого СтрокаКоллекции2 Из КоллекцияСтрок2 Цикл\n"
" ЗаполнитьЗначенияСвойств(ПараметрыОтбора, СтрокаКоллекции2);\n"
" Если СтрокиОтбора.НайтиСтроки(ПараметрыОтбора).Количество() = 0 Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" Возврат Истина;\n"
" \n"
"КонецФункции \n\n"
"Функция СравнитьМассивы(Знач Массив1, Знач Массив2)\n"
" \n"
" Если Массив1.Количество() <> Массив2.Количество() Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" \n"
" Для Каждого Элемент Из Массив1 Цикл\n"
" Если Массив2.Найти(Элемент) = Неопределено Тогда\n"
" Возврат Ложь;\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Истина;\n"
" \n"
"КонецФункции \n\n"
"Процедура ПроверкаФиксированностиДанных(Данные, ДанныеВЗначенииФиксированныхТипов = Ложь)\n"
" \n"
" ТипДанных = ТипЗнч(Данные);\n"
" СоставТипов = Новый ОписаниеТипов(\n"
" \"ХранилищеЗначения,\n"
" |ФиксированныйМассив,\n"
" |ФиксированнаяСтруктура,\n"
" |ФиксированноеСоответствие\");\n"
" \n"
" Если СоставТипов.СодержитТип(ТипДанных) Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Если ДанныеВЗначенииФиксированныхТипов Тогда\n"
" \n"
" СоставТипов = Новый ОписаниеТипов(\n"
" \"Булево,Строка,Число,Дата,\n"
" |Неопределено,УникальныйИдентификатор,Null,Тип,\n"
" |ХранилищеЗначения,ОбщийМодуль,ОбъектМетаданных,\n"
" |ТипЗначенияXDTO,ТипОбъектаXDTO,\n"
" |ИдентификаторОбсужденияСистемыВзаимодействия\");\n"
" \n"
" Если СоставТипов.СодержитТип(ТипДанных)\n"
" Или ЭтоСсылка(ТипДанных) Тогда\n"
" \n"
" Возврат;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Данные типа %1 не могут быть зафиксированы в функции %2.'\"),\n"
" Строка(ТипДанных), \"ОбщегоНазначения.ФиксированныеДанные\");\n"
" \n"
"КонецПроцедуры\n\n"
"Функция РазмерСтрокиВБайтах(Знач Строка)\n"
" \n"
" Возврат ПолучитьДвоичныеДанныеИзСтроки(Строка, \"UTF-8\").Размер();\n\n"
"КонецФункции\n\n"
"#Область СкопироватьРекурсивно\n\n"
"Функция СкопироватьСтруктуру(СтруктураИсточник, ФиксироватьДанные)\n"
" \n"
" СтруктураРезультат = Новый Структура;\n"
" \n"
" Для Каждого КлючИЗначение Из СтруктураИсточник Цикл\n"
" СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксироватьДанные));\n"
" КонецЦикла;\n"
" \n"
" Если ФиксироватьДанные = Истина \n"
" Или ФиксироватьДанные = Неопределено\n"
" И ТипЗнч(СтруктураИсточник) = Тип(\"ФиксированнаяСтруктура\") Тогда \n"
" \n"
" Возврат Новый ФиксированнаяСтруктура(СтруктураРезультат);\n"
" КонецЕсли;\n"
" \n"
" Возврат СтруктураРезультат;\n"
" \n"
"КонецФункции\n\n"
"Функция СкопироватьСоответствие(СоответствиеИсточник, ФиксироватьДанные)\n"
" \n"
" СоответствиеРезультат = Новый Соответствие;\n"
" \n"
" Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл\n"
" СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксироватьДанные));\n"
" КонецЦикла;\n"
" \n"
" Если ФиксироватьДанные = Истина \n"
" Или ФиксироватьДанные = Неопределено\n"
" И ТипЗнч(СоответствиеИсточник) = Тип(\"ФиксированноеСоответствие\") Тогда \n"
" Возврат Новый ФиксированноеСоответствие(СоответствиеРезультат);\n"
" КонецЕсли;\n"
" \n"
" Возврат СоответствиеРезультат;\n"
" \n"
"КонецФункции\n\n"
"Функция СкопироватьМассив(МассивИсточник, ФиксироватьДанные)\n"
" \n"
" МассивРезультат = Новый Массив;\n"
" \n"
" Для Каждого Элемент Из МассивИсточник Цикл\n"
" МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент, ФиксироватьДанные));\n"
" КонецЦикла;\n"
" \n"
" Если ФиксироватьДанные = Истина \n"
" Или ФиксироватьДанные = Неопределено\n"
" И ТипЗнч(МассивИсточник) = Тип(\"ФиксированныйМассив\") Тогда \n"
" Возврат Новый ФиксированныйМассив(МассивРезультат);\n"
" КонецЕсли;\n"
" \n"
" Возврат МассивРезультат;\n"
" \n"
"КонецФункции\n\n"
"Функция СкопироватьСписокЗначений(СписокИсточник, ФиксироватьДанные)\n"
" \n"
" СписокРезультат = Новый СписокЗначений;\n"
" \n"
" Для Каждого ЭлементСписка Из СписокИсточник Цикл\n"
" СписокРезультат.Добавить(\n"
" СкопироватьРекурсивно(ЭлементСписка.Значение, ФиксироватьДанные), \n"
" ЭлементСписка.Представление, \n"
" ЭлементСписка.Пометка, \n"
" ЭлементСписка.Картинка);\n"
" КонецЦикла;\n"
" \n"
" Возврат СписокРезультат;\n"
" \n"
"КонецФункции\n\n"
"Процедура СкопироватьЗначенияТаблицыЗначений(ТаблицаЗначений, ФиксироватьДанные)\n"
" Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл\n"
" Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл\n"
" СтрокаТаблицыЗначений[Колонка.Имя] = СкопироватьРекурсивно(СтрокаТаблицыЗначений[Колонка.Имя], ФиксироватьДанные);\n"
" КонецЦикла;\n"
" КонецЦикла;\n"
"КонецПроцедуры\n\n"
"Процедура СкопироватьЗначенияСтрокиДереваЗначений(СтрокиДереваЗначений, ФиксироватьДанные);\n"
" Для Каждого СтрокаДереваЗначений Из СтрокиДереваЗначений Цикл\n"
" Для Каждого Колонка Из СтрокаДереваЗначений.Владелец().Колонки Цикл\n"
" СтрокаДереваЗначений[Колонка.Имя] = СкопироватьРекурсивно(СтрокаДереваЗначений[Колонка.Имя], ФиксироватьДанные);\n"
" КонецЦикла;\n"
" СкопироватьЗначенияСтрокиДереваЗначений(СтрокаДереваЗначений.Строки, ФиксироватьДанные);\n"
" КонецЦикла;\n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#КонецОбласти\n\n"
"#Область Метаданные\n\n"
"Процедура ПроверитьОбъектМетаданныхСуществует(ПолноеИмя)\n"
" \n"
" Если ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) = Неопределено Тогда \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неизвестный тип объекта метаданных \"\"%1\"\".'\"), ПолноеИмя);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"#КонецОбласти\n\n"
"#Область ХранилищеНастроек\n\n"
"Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Настройки,\n"
" ОписаниеНастроек, ИмяПользователя, ОбновитьПовторноИспользуемыеЗначения)\n"
" \n"
" Если Не ПравоДоступа(\"СохранениеДанныхПользователя\", Метаданные) Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Настройки,\n"
" ОписаниеНастроек, ИмяПользователя);\n"
" \n"
" Если ОбновитьПовторноИспользуемыеЗначения Тогда\n"
" ОбновитьПовторноИспользуемыеЗначения();\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию,\n"
" ОписаниеНастроек, ИмяПользователя)\n"
" \n"
" Результат = Неопределено;\n"
" \n"
" Если ПравоДоступа(\"СохранениеДанныхПользователя\", Метаданные) Тогда\n"
" Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек),\n"
" ОписаниеНастроек, ИмяПользователя);\n"
" КонецЕсли;\n"
" \n"
" Если Результат = Неопределено Тогда\n"
" Результат = ЗначениеПоУмолчанию;\n"
" Иначе\n"
" УстановитьПривилегированныйРежим(Истина);\n"
" Если ОчиститьНесуществующиеСсылки(Результат) Тогда\n"
" Результат = ЗначениеПоУмолчанию;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n"
"// Удаляет из переданной коллекции ссылки, ссылающиеся на несуществующие данные в информационной базе.\n"
"// Не очищает переданное значение, если в нем передана несуществующая ссылка, а возвращает Ложь. \n"
"//\n"
"// Параметры:\n"
"// Значение - ЛюбаяСсылка\n"
"// - Произвольный - проверяемое значение или коллекция.\n"
"//\n"
"// Возвращаемое значение: \n"
"// Булево - Истина, если Значение ссылочного типа и объект не существует в информационной базе.\n"
"// Ложь, если Значение не ссылочного типа или объект существует.\n"
"//\n"
"Функция ОчиститьНесуществующиеСсылки(Значение)\n"
" \n"
" Тип = ТипЗнч(Значение);\n"
" Если Тип = Тип(\"Неопределено\")\n"
" Или Тип = Тип(\"Булево\")\n"
" Или Тип = Тип(\"Строка\")\n"
" Или Тип = Тип(\"Число\")\n"
" Или Тип = Тип(\"Дата\") Тогда // Оптимизация - часто используемые примитивные типы.\n"
" \n"
" Возврат Ложь; // Не ссылка.\n"
" \n"
" ИначеЕсли Тип = Тип(\"Массив\") Тогда\n"
" \n"
" Количество = Значение.Количество();\n"
" Для Номер = 1 По Количество Цикл\n"
" ОбратныйИндекс = Количество - Номер;\n"
" // @skip-check query-in-loop - выборка ссылок из разных таблиц.\n"
" Если ОчиститьНесуществующиеСсылки(Значение[ОбратныйИндекс]) Тогда\n"
" Значение.Удалить(ОбратныйИндекс);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Ложь; // Не ссылка.\n"
" \n"
" ИначеЕсли Тип = Тип(\"Структура\")\n"
" Или Тип = Тип(\"Соответствие\") Тогда\n"
" \n"
" Для Каждого КлючИЗначение Из Значение Цикл\n"
" // @skip-check query-in-loop - выборка ссылок из разных таблиц.\n"
" Если ОчиститьНесуществующиеСсылки(КлючИЗначение.Значение) Тогда\n"
" Значение.Вставить(КлючИЗначение.Ключ, Неопределено);\n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Ложь; // Не ссылка.\n"
" \n"
" ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или Справочники.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или Перечисления.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип)\n"
" Или Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда\n"
" // Ссылочный тип, исключая ТочкаМаршрутаБизнесПроцессаСсылка.\n"
" \n"
" Если Значение.Пустая() Тогда\n"
" Возврат Ложь; // Ссылка пустая.\n"
" КонецЕсли;\n"
" Возврат ЗначениеРеквизитаОбъекта(Значение, \"Ссылка\") = Неопределено;\n"
" \n"
" Иначе\n"
" Возврат Ложь; // Не ссылка.\n"
" КонецЕсли;\n"
" \n"
"КонецФункции\n\n"
"Процедура ХранилищеУдалить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ИмяПользователя)\n"
" \n"
" Если ПравоДоступа(\"СохранениеДанныхПользователя\", Метаданные) Тогда\n"
" МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек(КлючНастроек), ИмяПользователя);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращает строку ключа настроек, не превышающую допустимую длину 128 символов.\n"
"// Если указанная строка превышает 128, тогда вместо символов сверх 96 символов\n"
"// добавляется их хеш-сумма по алгоритму MD5 размером 32 символа.\n"
"//\n"
"// Параметры:\n"
"// Строка - Строка - строка произвольной длины.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Строка - не более 128 символов.\n"
"//\n"
"Функция КлючНастроек(Знач Строка)\n"
" Возврат СократитьСтрокуКонтрольнойСуммой(Строка, 128);\n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область БезопасноеХранилище\n\n"
"Функция ДанныеИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные)\n"
" \n"
" ИмяБезопасногоХранилищаДанных = \"РегистрСведений.БезопасноеХранилищеДанных\";\n"
" Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() И ОбщиеДанные <> Истина Тогда\n"
" ИмяБезопасногоХранилищаДанных = \"РегистрСведений.БезопасноеХранилищеДанныхОбластейДанных\";\n"
" КонецЕсли;\n"
" \n"
" ТекстЗапроса =\n"
" \"ВЫБРАТЬ\n"
" | БезопасноеХранилищеДанных.Владелец КАК ВладелецДанных,\n"
" | БезопасноеХранилищеДанных.Данные КАК Данные\n"
" |ИЗ\n"
" | #ИмяБезопасногоХранилищаДанных КАК БезопасноеХранилищеДанных\n"
" |ГДЕ\n"
" | БезопасноеХранилищеДанных.Владелец В (&Владельцы)\";\n"
" \n"
" ТекстЗапроса = СтрЗаменить(ТекстЗапроса, \"#ИмяБезопасногоХранилищаДанных\", ИмяБезопасногоХранилищаДанных);\n"
" Запрос = Новый Запрос(ТекстЗапроса);\n"
" Запрос.УстановитьПараметр(\"Владельцы\", Владельцы);\n"
" РезультатЗапроса = Запрос.Выполнить().Выбрать();\n"
" \n"
" Результат = Новый Соответствие(); \n"
" \n"
" НаборДанныхКлюча = ?(ЗначениеЗаполнено(Ключи) И СтрНайти(Ключи, \",\"), Новый Структура(Ключи), Неопределено);\n"
" Для Каждого ВладелецДанных Из Владельцы Цикл\n"
" Результат.Вставить(ВладелецДанных, НаборДанныхКлюча);\n"
" КонецЦикла;\n"
" \n"
" Пока РезультатЗапроса.Следующий() Цикл\n"
" \n"
" ДанныеВладельца = Новый Структура(Ключи);\n"
" \n"
" Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда\n"
" \n"
" СохраненныеДанные = РезультатЗапроса.Данные.Получить();\n"
" Если ЗначениеЗаполнено(СохраненныеДанные) Тогда\n"
" \n"
" Если ЗначениеЗаполнено(Ключи) Тогда\n"
" ВладелецДанных = Результат[РезультатЗапроса.ВладелецДанных];\n"
" ЗаполнитьЗначенияСвойств(ДанныеВладельца, СохраненныеДанные);\n"
" Иначе\n"
" ДанныеВладельца = СохраненныеДанные;\n"
" КонецЕсли;\n"
" \n"
" Если Ключи <> Неопределено\n"
" И ДанныеВладельца <> Неопределено\n"
" И ДанныеВладельца.Количество() = 1 Тогда\n"
" ЗначениеПоКлючу = ?(ДанныеВладельца.Свойство(Ключи), ДанныеВладельца[Ключи], Неопределено);\n"
" Результат.Вставить(РезультатЗапроса.ВладелецДанных, ЗначениеПоКлючу);\n"
" Иначе\n"
" Результат.Вставить(РезультатЗапроса.ВладелецДанных, ДанныеВладельца);\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" КонецЦикла;\n"
" \n"
" Возврат Результат;\n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область БезопасноеВыполнениеВнешнегоКода\n\n"
"// Проверяет, что переданное имя ИмяПроцедуры является именем экспортной процедуры конфигурации.\n"
"// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма\n"
"// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить и Вычислить\n"
"// при их использовании для динамического вызова методов код конфигурации.\n"
"//\n"
"// В случае если переданная строка не является именем процедуры конфигурации, генерируется исключение.\n"
"//\n"
"// Предназначена для вызова из см. процедуру ВыполнитьМетодКонфигурации.\n"
"//\n"
"// Параметры:\n"
"// ИмяПроцедуры - Строка - проверяемое имя экспортной процедуры.\n"
"//\n"
"Процедура ПроверитьИмяПроцедурыКонфигурации(Знач ИмяПроцедуры)\n"
" \n"
" ЧастиИмени = СтрРазделить(ИмяПроцедуры, \".\");\n"
" Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неправильный формат параметра %1 (передано значение: \"\"%2\"\") в %3.'\"), \n"
" \"ИмяПроцедуры\", ИмяПроцедуры, \"ОбщегоНазначения.ВыполнитьМетодКонфигурации\");\n"
" КонецЕсли;\n"
" \n"
" ИмяОбъекта = ЧастиИмени[0];\n"
" Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неправильный формат параметра %1 (передано значение: \"\"%2\"\") в %3:\n"
" |Не существует общий модуль \"\"%4\"\".'\"),\n"
" \"ИмяПроцедуры\", ИмяПроцедуры, \"ОбщегоНазначения.ВыполнитьМетодКонфигурации\", ИмяОбъекта);\n"
" КонецЕсли;\n"
" \n"
" Если ЧастиИмени.Количество() = 3 Тогда\n"
" ПолноеИмяОбъекта = ЧастиИмени[0] + \".\" + ЧастиИмени[1];\n"
" Попытка\n"
" Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта);\n"
" Исключение\n"
" Менеджер = Неопределено;\n"
" КонецПопытки;\n"
" Если Менеджер = Неопределено Тогда\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неправильный формат параметра %1 (передано значение: \"\"%2\"\") в %3:\n"
" |Не существует менеджер объекта \"\"%4\"\".'\"),\n"
" \"ИмяПроцедуры\", ИмяПроцедуры, \"ОбщегоНазначения.ВыполнитьМетодКонфигурации\", ПолноеИмяОбъекта);\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()];\n"
" ВременнаяСтруктура = Новый Структура;\n"
" Попытка\n"
" // Проверка того, что ИмяПроцедуры является допустимым идентификатором.\n"
" // Например: МояПроцедура.\n"
" ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта);\n"
" Исключение\n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Безопасное выполнение метода'\", КодОсновногоЯзыка()),\n"
" УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Неправильный формат параметра %1 (передано значение: \"\"%2\"\") в %3:\n"
" |Имя метода \"\"%4\"\" не соответствует требованиям образования имен процедур и функций.'\"),\n"
" \"ИмяПроцедуры\", ИмяПроцедуры, \"ОбщегоНазначения.ВыполнитьМетодКонфигурации\", ИмяМетодаОбъекта);\n"
" КонецПопытки;\n"
" \n"
"КонецПроцедуры\n\n"
"// Возвращает менеджер объекта по имени.\n"
"// Ограничение: не обрабатываются точки маршрутов бизнес-процессов.\n"
"//\n"
"// Параметры:\n"
"// Имя - Строка - имя например, \"Справочник\", \"Справочники\", \"Справочник.Организации\".\n"
"//\n"
"// Возвращаемое значение:\n"
"// СправочникиМенеджер\n"
"// СправочникМенеджер\n"
"// ДокументыМенеджер\n"
"// ДокументМенеджер\n"
"// ...\n"
"//\n"
"Функция МенеджерОбъектаПоИмени(Имя)\n"
" Перем КлассОМ, ИмяОМ, Менеджер;\n"
" \n"
" ЧастиИмени = СтрРазделить(Имя, \".\");\n"
" \n"
" Если ЧастиИмени.Количество() > 0 Тогда\n"
" КлассОМ = ВРег(ЧастиИмени[0]);\n"
" КонецЕсли;\n"
" \n"
" Если ЧастиИмени.Количество() > 1 Тогда\n"
" ИмяОМ = ЧастиИмени[1];\n"
" КонецЕсли;\n"
" \n"
" Если КлассОМ = \"ПЛАНОБМЕНА\"\n"
" Или КлассОМ = \"ПЛАНЫОБМЕНА\" Тогда\n"
" Менеджер = ПланыОбмена;\n"
" \n"
" ИначеЕсли КлассОМ = \"СПРАВОЧНИК\"\n"
" Или КлассОМ = \"СПРАВОЧНИКИ\" Тогда\n"
" Менеджер = Справочники;\n"
" \n"
" ИначеЕсли КлассОМ = \"ДОКУМЕНТ\"\n"
" Или КлассОМ = \"ДОКУМЕНТЫ\" Тогда\n"
" Менеджер = Документы;\n"
" \n"
" ИначеЕсли КлассОМ = \"ЖУРНАЛДОКУМЕНТОВ\"\n"
" Или КлассОМ = \"ЖУРНАЛЫДОКУМЕНТОВ\" Тогда\n"
" Менеджер = ЖурналыДокументов;\n"
" \n"
" ИначеЕсли КлассОМ = \"ПЕРЕЧИСЛЕНИЕ\"\n"
" Или КлассОМ = \"ПЕРЕЧИСЛЕНИЯ\" Тогда\n"
" Менеджер = Перечисления;\n"
" \n"
" ИначеЕсли КлассОМ = \"ОБЩИЙМОДУЛЬ\"\n"
" Или КлассОМ = \"ОБЩИЕМОДУЛИ\" Тогда\n"
" \n"
" Возврат ОбщийМодуль(ИмяОМ);\n"
" \n"
" ИначеЕсли КлассОМ = \"ОТЧЕТ\"\n"
" Или КлассОМ = \"ОТЧЕТЫ\" Тогда\n"
" Менеджер = Отчеты;\n"
" \n"
" ИначеЕсли КлассОМ = \"ОБРАБОТКА\"\n"
" Или КлассОМ = \"ОБРАБОТКИ\" Тогда\n"
" Менеджер = Обработки;\n"
" \n"
" ИначеЕсли КлассОМ = \"ПЛАНВИДОВХАРАКТЕРИСТИК\"\n"
" Или КлассОМ = \"ПЛАНЫВИДОВХАРАКТЕРИСТИК\" Тогда\n"
" Менеджер = ПланыВидовХарактеристик;\n"
" \n"
" ИначеЕсли КлассОМ = \"ПЛАНСЧЕТОВ\"\n"
" Или КлассОМ = \"ПЛАНЫСЧЕТОВ\" Тогда\n"
" Менеджер = ПланыСчетов;\n"
" \n"
" ИначеЕсли КлассОМ = \"ПЛАНВИДОВРАСЧЕТА\"\n"
" Или КлассОМ = \"ПЛАНЫВИДОВРАСЧЕТА\" Тогда\n"
" Менеджер = ПланыВидовРасчета;\n"
" \n"
" ИначеЕсли КлассОМ = \"РЕГИСТРСВЕДЕНИЙ\"\n"
" Или КлассОМ = \"РЕГИСТРЫСВЕДЕНИЙ\" Тогда\n"
" Менеджер = РегистрыСведений;\n"
" \n"
" ИначеЕсли КлассОМ = \"РЕГИСТРНАКОПЛЕНИЯ\"\n"
" Или КлассОМ = \"РЕГИСТРЫНАКОПЛЕНИЯ\" Тогда\n"
" Менеджер = РегистрыНакопления;\n"
" \n"
" ИначеЕсли КлассОМ = \"РЕГИСТРБУХГАЛТЕРИИ\"\n"
" Или КлассОМ = \"РЕГИСТРЫБУХГАЛТЕРИИ\" Тогда\n"
" Менеджер = РегистрыБухгалтерии;\n"
" \n"
" ИначеЕсли КлассОМ = \"РЕГИСТРРАСЧЕТА\"\n"
" Или КлассОМ = \"РЕГИСТРЫРАСЧЕТА\" Тогда\n"
" \n"
" Если ЧастиИмени.Количество() < 3 Тогда\n"
" // Регистр расчета\n"
" Менеджер = РегистрыРасчета;\n"
" Иначе\n"
" КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]);\n"
" Если ЧастиИмени.Количество() > 3 Тогда\n"
" ИмяПодчиненногоОМ = ЧастиИмени[3];\n"
" КонецЕсли;\n"
" Если КлассПодчиненногоОМ = \"ПЕРЕРАСЧЕТ\"\n"
" Или КлассПодчиненногоОМ = \"ПЕРЕРАСЧЕТЫ\" Тогда\n"
" // Перерасчет\n"
" Попытка\n"
" Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты;\n"
" ИмяОМ = ИмяПодчиненногоОМ;\n"
" Исключение\n"
" Менеджер = Неопределено;\n"
" КонецПопытки;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ИначеЕсли КлассОМ = \"БИЗНЕСПРОЦЕСС\"\n"
" Или КлассОМ = \"БИЗНЕСПРОЦЕССЫ\" Тогда\n"
" Менеджер = БизнесПроцессы;\n"
" \n"
" ИначеЕсли КлассОМ = \"ЗАДАЧА\"\n"
" Или КлассОМ = \"ЗАДАЧИ\" Тогда\n"
" Менеджер = Задачи;\n"
" \n"
" ИначеЕсли КлассОМ = \"КОНСТАНТА\"\n"
" Или КлассОМ = \"КОНСТАНТЫ\" Тогда\n"
" Менеджер = Константы;\n"
" \n"
" ИначеЕсли КлассОМ = \"ПОСЛЕДОВАТЕЛЬНОСТЬ\"\n"
" Или КлассОМ = \"ПОСЛЕДОВАТЕЛЬНОСТИ\" Тогда\n"
" Менеджер = Последовательности;\n"
" КонецЕсли;\n"
" \n"
" Если Менеджер <> Неопределено Тогда\n"
" Если ЗначениеЗаполнено(ИмяОМ) Тогда\n"
" Попытка\n"
" Возврат Менеджер[ИмяОМ];\n"
" Исключение\n"
" Менеджер = Неопределено;\n"
" КонецПопытки;\n"
" Иначе\n"
" Возврат Менеджер;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(\"ru = 'Не удалось получить менеджер для объекта \"\"%1\"\"'\"), Имя);\n"
" \n"
"КонецФункции\n\n"
"// Вызвать экспортную функцию по имени с уровнем привилегий конфигурации.\n"
"// При включении профилей безопасности для вызова оператора Выполнить() используется\n"
"// переход в безопасный режим с профилем безопасности, используемом для информационной базы\n"
"// (если выше по стеку не был установлен другой безопасный режим).\n"
"//\n"
"// Параметры:\n"
"// ИмяМетода - Строка - имя экспортной функции в формате\n"
"// <имя объекта>.<имя процедуры>, где <имя объекта> - это\n"
"// общий модуль или модуль менеджера объекта.\n"
"// Параметры - Массив - параметры передаются в функцию <ИмяМетода>\n"
"// в порядке расположения элементов массива.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Произвольный - результат вызываемой функции.\n"
"//\n"
"Функция ВызватьФункциюКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт\n"
" \n"
" ПроверитьИмяПроцедурыКонфигурации(ИмяМетода);\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ПрофилиБезопасности\") Тогда\n"
" МодульРаботаВБезопасномРежиме = ОбщийМодуль(\"РаботаВБезопасномРежиме\");\n"
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()\n"
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда\n"
" \n"
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();\n"
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда\n"
" \n"
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);\n"
" Если БезопасныйРежим() = Истина Тогда\n"
" УстановитьБезопасныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ПараметрыСтрока = \"\";\n"
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда\n"
" Для Индекс = 0 По Параметры.ВГраница() Цикл \n"
" ПараметрыСтрока = ПараметрыСтрока + \"Параметры[\" + XMLСтрока(Индекс) + \"],\";\n"
" КонецЦикла;\n"
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);\n"
" КонецЕсли;\n"
" \n"
" Возврат Вычислить(ИмяМетода + \"(\" + ПараметрыСтрока + \")\"); // АПК:488 Исполняемый код безопасен.\n"
" \n"
"КонецФункции\n\n"
"// Вызвать экспортную функцию объекта встроенного языка по имени.\n"
"// При включении профилей безопасности для вызова оператора Выполнить() используется\n"
"// переход в безопасный режим с профилем безопасности, используемом для информационной базы\n"
"// (если выше по стеку не был установлен другой безопасный режим).\n"
"//\n"
"// Параметры:\n"
"// Объект - Произвольный - объект встроенного языка 1С:Предприятия, содержащий методы (например, ОбработкаОбъект).\n"
"// ИмяМетода - Строка - имя экспортной функции модуля объекта обработки.\n"
"// Параметры - Массив - параметры передаются в функцию <ИмяМетода>\n"
"// в порядке расположения элементов массива.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Произвольный - результат вызываемой функции.\n"
"//\n"
"Функция ВызватьФункциюОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт\n"
" \n"
" // Проверка имени метода на корректность.\n"
" Попытка\n"
" Тест = Новый Структура;\n"
" Тест.Вставить(ИмяМетода, ИмяМетода);\n"
" Исключение\n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Некорректное значение параметра %1 (%2) в %3.'\"), \n"
" \"ИмяМетода\", ИмяМетода, \"ОбщегоНазначения.ВыполнитьМетодОбъекта\");\n"
" КонецПопытки;\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ПрофилиБезопасности\") Тогда\n"
" МодульРаботаВБезопасномРежиме = ОбщийМодуль(\"РаботаВБезопасномРежиме\");\n"
" Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()\n"
" И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда\n"
" \n"
" МодульРаботаВБезопасномРежиме = ОбщийМодуль(\"РаботаВБезопасномРежиме\");\n"
" ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();\n"
" \n"
" Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда\n"
" \n"
" УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);\n"
" Если БезопасныйРежим() = Истина Тогда\n"
" УстановитьБезопасныйРежим(Ложь);\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" \n"
" ПараметрыСтрока = \"\";\n"
" Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда\n"
" Для Индекс = 0 По Параметры.ВГраница() Цикл \n"
" ПараметрыСтрока = ПараметрыСтрока + \"Параметры[\" + XMLСтрока(Индекс) + \"],\";\n"
" КонецЦикла;\n"
" ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);\n"
" КонецЕсли;\n"
" \n"
" Возврат Вычислить(\"Объект.\" + ИмяМетода + \"(\" + ПараметрыСтрока + \")\"); // АПК:488 Исполняемый код безопасен.\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ВнешниеКомпоненты\n\n"
"Процедура ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение)\n"
" \n"
" Если МакетСуществует(Местоположение) Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Если ПодсистемаСуществует(\"СтандартныеПодсистемы.ВнешниеКомпоненты\") Тогда\n"
" МодульВнешниеКомпонентыСлужебный = ОбщийМодуль(\"ВнешниеКомпонентыСлужебный\");\n"
" МодульВнешниеКомпонентыСлужебный.ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение);\n"
" Иначе \n"
" ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Указан несуществующий макет \"\"%1\"\" при подключении внешней компоненты \"\"%2\"\".'\"),\n"
" Местоположение, Идентификатор);\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"Функция МакетСуществует(ПолноеИмяМакета)\n"
" \n"
" Макет = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМакета);\n"
" Если ТипЗнч(Макет) = Тип(\"ОбъектМетаданных\") Тогда \n"
" \n"
" Шаблон = Новый Структура(\"ТипМакета\");\n"
" ЗаполнитьЗначенияСвойств(Шаблон, Макет);\n"
" ТипМакета = Неопределено;\n"
" Если Шаблон.Свойство(\"ТипМакета\", ТипМакета) Тогда \n"
" Возврат ТипМакета <> Неопределено;\n"
" КонецЕсли;\n"
" \n"
" КонецЕсли;\n"
" \n"
" Возврат Ложь;\n"
" \n"
"КонецФункции\n\n"
"#КонецОбласти\n\n"
"#Область ТекущееОкружение\n\n"
"Функция НомерСборкиПоТекущейВерсииПлатформы(НомераСборокСтрокой)\n"
" \n"
" НомераСборок = СтрРазделить(НомераСборокСтрокой, \";\", Истина);\n"
" \n"
" СборкиПоВерсиям = Новый Соответствие;\n"
" Для Каждого НомерСборки Из НомераСборок Цикл\n"
" НомерВерсии = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(НомерСборки);\n"
" СборкиПоВерсиям.Вставить(СокрЛП(НомерВерсии), СокрЛП(НомерСборки));\n"
" КонецЦикла;\n"
" \n"
" СистемнаяИнформация = Новый СистемнаяИнформация;\n"
" ТекущаяВерсия = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);\n"
" \n"
" Результат = СборкиПоВерсиям[ТекущаяВерсия];\n"
" Если Не ЗначениеЗаполнено(Результат) Тогда\n"
" Результат = НомераСборок[0];\n"
" КонецЕсли;\n"
" \n"
" Возврат Результат;\n"
" \n"
"КонецФункции\n\n\n"
"// Ниже этой версии БСП может запуститься и показать окно с рекомендациями, если она выше чем в МинимальнаяВерсияПлатформыДляЗапуска.\n"
"Функция МинимальнаяВерсияПлатформы() Экспорт // АПК:581 - экспортная, так как используется при тестировании.\n"
" \n"
" ВерсияРежимаСовместимости = ВерсияРежимаСовместимости();\n"
" ПоддерживаемыеВерсииПлатформы = ПоддерживаемыеВерсииПлатформы();\n"
" НайденнаяВерсия = ПоддерживаемыеВерсииПлатформы.НайтиПоЗначению(ВерсияРежимаСовместимости);\n"
" \n"
" Если НайденнаяВерсия = Неопределено Тогда\n"
" НайденнаяВерсия = ПоддерживаемыеВерсииПлатформы[ПоддерживаемыеВерсииПлатформы.Количество() - 1];\n"
" КонецЕсли;\n"
" \n"
" НомераСборок = НайденнаяВерсия.Представление;\n"
" \n"
" Возврат НомераСборок;\n"
" \n"
"КонецФункции\n\n"
"// Ниже этой версии БСП не может запуститься и показать окно с рекомендациями.\n"
"Функция МинимальнаяВерсияПлатформыДляЗапуска() Экспорт\n"
" \n"
" Возврат \"8.3.21.1622; 8.3.22.1704\";\n"
" \n"
"КонецФункции\n\n"
"// Возвращаемое значение:\n"
"// СписокЗначений:\n"
"// * Значение - Строка - поддерживаемый номер версии (режим совместимости);\n"
"// * Представление - Строка - минимальные номера сборок платформы, разделитель - точка с запятой.\n"
"//\n"
"Функция ПоддерживаемыеВерсииПлатформы() Экспорт\n"
" \n"
" ПоддерживаемыеВерсииПлатформы = Новый СписокЗначений;\n"
" ПоддерживаемыеВерсииПлатформы.Добавить(\"8.3.21\", \"8.3.21.1775; 8.3.22.1923\");\n"
" ПоддерживаемыеВерсииПлатформы.Добавить(\"8.3.22\", \"8.3.22.2355; 8.3.23.2011; 8.3.24.1304\");\n"
" ПоддерживаемыеВерсииПлатформы.Добавить(\"8.3.23\", \"8.3.23.2011; 8.3.24.1304\");\n"
" ПоддерживаемыеВерсииПлатформы.Добавить(\"8.3.24\", \"8.3.24.1304\");\n"
" \n"
" Возврат ПоддерживаемыеВерсииПлатформы;\n"
" \n"
"КонецФункции\n\n"
"Функция ВерсияРежимаСовместимости() Экспорт\n"
" \n"
" СистемнаяИнформация = Новый СистемнаяИнформация();\n"
" РежимСовместимости = Метаданные.РежимСовместимости;\n"
" \n"
" Если РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда\n"
" ВерсияРежимаСовместимости = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);\n"
" Иначе\n"
" ВерсияРежимаСовместимости = СтрСоединить(СтрРазделить(РежимСовместимости, СтрСоединить(СтрРазделить(РежимСовместимости, \"1234567890\", Ложь), \"\"), Ложь), \".\");\n"
" КонецЕсли;\n"
" \n"
" Возврат ВерсияРежимаСовместимости;\n"
" \n"
"КонецФункции\n\n"
"// Выполняет проверку правильности заполнения минимальной и рекомендуемой версии платформы.\n"
"//\n"
"// Параметры:\n"
"// Минимальная - Строка - номер версия платформы.\n"
"// Рекомендуемая - Строка - номер версия платформы.\n"
"//\n"
"// Возвращаемое значение:\n"
"// Булево - Истина, если минимальная и рекомендуемая версия платформы заполнена неправильно.\n"
"//\n"
"Функция МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая)\n"
" \n"
" // Минимальная версия платформы должна быть заполнена.\n"
" Если ПустаяСтрока(Минимальная) Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" \n"
" // Минимальная версия платформы, заданная в конфигурации, не должна быть меньше минимальной версии платформы,\n"
" // заданной в библиотеке.\n"
" МинимальнаяБСП = НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы());\n"
" Если Не ЭтоВерсияЗащищенногоПрограммногоКомплекса(Минимальная)\n"
" И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(МинимальнаяБСП, Минимальная) > 0 Тогда\n"
" Возврат Истина;\n"
" КонецЕсли;\n"
" \n"
" // Минимальная версия платформы не должны быть больше рекомендуемой.\n"
" Возврат Не ПустаяСтрока(Минимальная)\n"
" И Не ПустаяСтрока(Рекомендуемая)\n"
" И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Рекомендуемая) > 0;\n"
" \n"
"КонецФункции\n\n"
"Функция НедопустимыеВерсииПлатформы() Экспорт\n"
" \n"
" Возврат \"\";\n"
" \n"
"КонецФункции\n\n"
"Функция ЭтоВерсияЗащищенногоПрограммногоКомплекса(Версия)\n"
" \n"
" Версии = Новый Массив;\n"
" Версии.Добавить(\"8.3.21.1676\");\n"
" Версии.Добавить(\"8.3.21.1901\");\n"
" Возврат Версии.Найти(Версия) <> Неопределено;\n"
" \n"
"КонецФункции\n\n"
"// Для функции ОбщиеПараметрыБазовойФункциональности.\n"
"Процедура УточнитьВерсиюПлатформы(ОбщиеПараметры)\n"
" \n"
" СистемнаяИнформация = Новый СистемнаяИнформация;\n"
" НоваяСборка = НоваяСборка(СистемнаяИнформация.ВерсияПриложения);\n"
" Если Не ЗначениеЗаполнено(НоваяСборка) Тогда\n"
" НоваяРекомендуемаяСборка = НоваяСборка(ОбщиеПараметры.МинимальнаяВерсияПлатформы);\n"
" Если ЗначениеЗаполнено(НоваяРекомендуемаяСборка) Тогда\n"
" МинимальнаяСборка = НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы());\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = МинимальнаяСборка;\n"
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = МинимальнаяСборка;\n"
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ОбщиеПараметры.РекомендуемаяВерсияПлатформы, НоваяРекомендуемаяСборка) < 0 Тогда\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НоваяРекомендуемаяСборка;\n"
" КонецЕсли;\n"
" КонецЕсли;\n"
" ИначеЕсли ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ОбщиеПараметры.МинимальнаяВерсияПлатформы, НоваяСборка) < 0 Тогда\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НоваяСборка;\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = НоваяСборка;\n"
" ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = НоваяСборка;\n"
" ОбщиеПараметры.РаботаВПрограммеЗапрещена = Истина;\n"
" КонецЕсли;\n"
" \n"
"КонецПроцедуры\n\n"
"// Для процедуры УточнитьВерсиюПлатформы.\n"
"Функция НоваяСборка(ТекущаяСборка)\n"
" \n"
" Если СтрНайти(\"8.3.22.1672,8.3.22.1603\", ТекущаяСборка) Тогда\n"
" Возврат \"8.3.22.1709\";\n"
" \n"
" ИначеЕсли СтрНайти(\"8.3.21.1607,8.3.21.1508,8.3.21.1484\", ТекущаяСборка) Тогда\n"
" Возврат \"8.3.21.1624\";\n"
" \n"
" КонецЕсли;\n"
" \n"
" Возврат \"\";\n"
" \n"
"КонецФункции\n\n"
"// Локализация\n\n"
"// Параметры:\n"
"// ОбщиеПараметры - см. ОбщиеПараметрыБазовойФункциональности\n"
"// \n"
"Процедура УточнитьМинимальнуюВерсиюПлатформыИзСервиса(ОбщиеПараметры)\n\n"
" Если Не ПодсистемаСуществует(\"ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы\") Тогда\n"
" Возврат;\n"
" КонецЕсли;\n\n"
" // Проверка версии БИП начиная с которой появился программный интерфейс\n"
" МодульИнтернетПоддержкаПользователейКлиентСервер = ОбщийМодуль(\"ИнтернетПоддержкаПользователейКлиентСервер\");\n"
" ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки();\n"
" \n"
" Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, \"2.7.1.35\") <= 0 Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Попытка\n"
" МодульПолучениеОбновленийПрограммы = ОбщийМодуль(\"ПолучениеОбновленийПрограммы\");\n"
" ИнформацияОВерсияхПлатформы = МодульПолучениеОбновленийПрограммы.ИнформацияОВерсияхПлатформы();\n"
" \n"
" // Контроль заполнения версий платформы по данным сервиса\n"
" Если ПустаяСтрока(ИнформацияОВерсияхПлатформы.МинимальнаяВерсияПлатформы)\n"
" И ПустаяСтрока(ИнформацияОВерсияхПлатформы.РекомендуемаяВерсияПлатформы) Тогда\n"
" Возврат;\n"
" КонецЕсли;\n"
" \n"
" Минимальная = НомерСборкиПоТекущейВерсииПлатформы(ИнформацияОВерсияхПлатформы.МинимальнаяВерсияПлатформы);\n"
" Рекомендуемая = НомерСборкиПоТекущейВерсииПлатформы(ИнформацияОВерсияхПлатформы.РекомендуемаяВерсияПлатформы);\n"
" \n"
" Если МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) Тогда\n"
" \n"
" МодульПолучениеОбновленийПрограммы.УдалитьИнформациюОВерсияхПлатформы();\n"
" ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Минимальная и рекомендуемая версии платформы \"\"1С:Предприятие\"\", полученные с сервиса обновления программ, не соответствуют следующим требованиям:\n"
" | - минимальная версия должна быть заполнена;\n"
" | - минимальная версия не должна быть меньше минимальной версии БСП (см. %1);\n"
" | - минимальная версия не должна быть меньше рекомендуемой версии.\n"
" |Минимальная версия сервиса обновления программ: %2\n"
" |Минимальная версия БСП: %3\n"
" |Рекомендуемая версия сервиса обновления программ: %4\n"
" |\n"
" |Минимальная и рекомендуемая версия платформы \"\"1С:Предприятие\"\" установлена по данным см. %5.\n"
" |Минимальная версия: %6\n"
" |Рекомендуемая версия: %7'\",\n"
" КодОсновногоЯзыка()),\n"
" \"ОбщегоНазначения.МинимальнаяВерсияПлатформы\", Минимальная, НомерСборкиПоТекущейВерсииПлатформы(МинимальнаяВерсияПлатформы()),\n"
" Рекомендуемая, \"ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности\",\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы, ОбщиеПараметры.РекомендуемаяВерсияПлатформы);\n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Базовая функциональность'\", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, \n"
" ТекстСообщения);\n"
" Возврат;\n"
" КонецЕсли;\n\n"
" ОбщиеПараметры.МинимальнаяВерсияПлатформы = Минимальная;\n"
" ОбщиеПараметры.РекомендуемаяВерсияПлатформы = Рекомендуемая;\n"
" \n"
" Исключение\n"
" ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(\n"
" НСтр(\"ru = 'Не удалось изменить минимальную и рекомендуемую версию платформы \"\"1С:Предприятие\"\", полученную с сервиса обновления программ, по причине:\n"
" |%1'\",\n"
" КодОсновногоЯзыка()), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));\n"
" ЗаписьЖурналаРегистрации(НСтр(\"ru = 'Базовая функциональность'\", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,,\n"
" ТекстСообщения);\n"
" КонецПопытки;\n\n"
"КонецПроцедуры\n"
"// Конец Локализация\n\n"
"#КонецОбласти\n\n"
"#КонецОбласти\n\n"
"#КонецЕсли\n")
matches = re.finditer(regex, test_str, re.MULTILINE | re.IGNORECASE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
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 Python, please visit: https://docs.python.org/3/library/re.html