Files
T
2024-07-24 15:27:00 +03:00

1238 lines
72 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// См. Справочники.ПрофилиГруппДоступа.ПояснениеПоставляемыхПрофилей
Функция ПояснениеПоставляемыхПрофилей() Экспорт
Возврат Справочники.ПрофилиГруппДоступа.ПояснениеПоставляемыхПрофилей();
КонецФункции
// См. УправлениеДоступомСлужебный.ПостоянныеВидыОграниченийПравОбъектовМетаданных
Функция ПостоянныеВидыОграниченийПравОбъектовМетаданных(ДляПроверки = Ложь) Экспорт
Возврат УправлениеДоступомСлужебный.ПостоянныеВидыОграниченийПравОбъектовМетаданных(ДляПроверки);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированнаяСтруктура:
// * СвойстваСеанса - см. УправлениеДоступомСлужебный.СвойстваВидовДоступа
// * ХешСуммы - см. УправлениеДоступомСлужебный.НовыеХешСуммыСвойствВидовДоступа
// * Проверка - Структура:
// ** Дата - Дата
//
Функция ОписаниеСвойствВидовДоступаСеанса() Экспорт
ХешСуммы = УправлениеДоступомСлужебный.НовыеХешСуммыСвойствВидовДоступа();
СвойстваСеанса = УправлениеДоступомСлужебный.ПроверенныеСвойстваВидовДоступаСеанса(ХешСуммы);
Результат = Новый Структура;
Результат.Вставить("СвойстваСеанса", СвойстваСеанса);
Результат.Вставить("ХешСуммы", Новый ФиксированнаяСтруктура(ХешСуммы));
Результат.Вставить("Проверка", Новый Структура("Дата", '00010101'));
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// См. УправлениеДоступомСлужебный.ПредставлениеВидовДоступа
Функция ПредставлениеВидовДоступа() Экспорт
Возврат УправлениеДоступомСлужебный.ПредставлениеВидовДоступа();
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированнаяСтруктура:
// * ВозможныеПраваСеанса - см. УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов
// * ХешСумма - Строка
// * Проверка - Структура:
// ** Дата - Дата
//
Функция ОписаниеВозможныхПравСеансаДляНастройкиПравОбъектов() Экспорт
ХешСумма = "";
ВозможныеПраваСеанса = РегистрыСведений.НастройкиПравОбъектов.ПроверенныеВозможныеПраваСеанса(, ХешСумма);
Результат = Новый Структура;
Результат.Вставить("ВозможныеПраваСеанса", ВозможныеПраваСеанса);
Результат.Вставить("ХешСумма", ХешСумма);
Результат.Вставить("Проверка", Новый Структура("Дата", '00010101'));
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// См. РегистрыСведений.НастройкиПравОбъектов.ПредставлениеВозможныхПрав
Функция ПредставлениеВозможныхПрав() Экспорт
Возврат РегистрыСведений.НастройкиПравОбъектов.ПредставлениеВозможныхПрав();
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированнаяСтруктура:
// * ПоставляемыеПрофилиСеанса - см. УправлениеДоступомСлужебный.ПоставляемыеПрофили
// * ХешСумма - Строка
// * Проверка - Структура:
// ** Дата - Дата
//
Функция ОписаниеПоставляемыхПрофилейСеанса() Экспорт
ХешСумма = "";
ПоставляемыеПрофилиСеанса = Справочники.ПрофилиГруппДоступа.ПроверенныеПоставляемыеПрофилиСеанса(, ХешСумма);
Результат = Новый Структура;
Результат.Вставить("ПоставляемыеПрофилиСеанса", ПоставляемыеПрофилиСеанса);
Результат.Вставить("ХешСумма", ХешСумма);
Результат.Вставить("Проверка", Новый Структура("Дата", '00010101'));
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированнаяСтруктура:
// * РолиСеанса - см. УправлениеДоступомСлужебный.СтандартныеРолиРасширений
// * ХешСумма - Строка
// * Проверка - Структура:
// ** Дата - Дата
//
Функция ОписаниеСтандартныхРолейРасширенийСеанса() Экспорт
ХешСумма = "";
РолиСеанса = Справочники.ПрофилиГруппДоступа.ПодготовленныеСтандартныеРолиРасширенийСеанса(ХешСумма);
Результат = Новый Структура;
Результат.Вставить("РолиСеанса", РолиСеанса);
Результат.Вставить("ХешСумма", ХешСумма);
Результат.Вставить("Проверка", Новый Структура("Дата", '00010101'));
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// Возвращаемое значение:
// Структура:
// * ХешСумма - Строка
// * ИдентификаторыРолей - ФиксированноеСоответствие из КлючИЗначение:
// ** Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных
// - СправочникСсылка.ИдентификаторыОбъектовРасширений
// ** Значение - Булево - Истина
//
Функция ИдентификаторыРолейСеанса() Экспорт
ПолныеИменаРолей = Новый Массив;
Для каждого Роль Из Метаданные.Роли Цикл
ПолныеИменаРолей.Добавить(Роль.ПолноеИмя());
КонецЦикла;
ОписаниеИдентификаторовРолей = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИменаРолей);
Список = Новый СписокЗначений;
ИдентификаторыРолей = Новый Соответствие;
Для Каждого ОписаниеИдентификатораРоли Из ОписаниеИдентификаторовРолей Цикл
Список.Добавить(ОписаниеИдентификатораРоли.Значение.УникальныйИдентификатор());
ИдентификаторыРолей.Вставить(ОписаниеИдентификатораРоли.Значение, Истина);
КонецЦикла;
Список.СортироватьПоЗначению();
ХешСумма = УправлениеДоступомСлужебный.ХешСуммаДанных(Список.ВыгрузитьЗначения());
Результат = Новый Структура;
Результат.Вставить("ХешСумма", ХешСумма);
Результат.Вставить("ИдентификаторыРолей", Новый ФиксированноеСоответствие(ИдентификаторыРолей));
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// Строка
//
Функция ОписаниеКлючаЗаписи(ТипИлиПолноеИмя) Экспорт
ОписаниеКлюча = Новый Структура("МассивПолей, СтрокаПолей", Новый Массив, "");
Если ТипЗнч(ТипИлиПолноеИмя) = Тип("Тип") Тогда
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипИлиПолноеИмя);
Иначе
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ТипИлиПолноеИмя);
КонецЕсли;
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя());
ВсеПоля = Новый Массив;
Для Каждого Колонка Из Менеджер.СоздатьНаборЗаписей().Выгрузить().Колонки Цикл
ВсеПоля.Добавить(Колонка.Имя);
КонецЦикла;
ПустойКлючЗаписи = Менеджер.СоздатьКлючЗаписи(Новый Структура(СтрСоединить(ВсеПоля, ",")));
Для Каждого Поле Из ВсеПоля Цикл
ОдноПоле = Новый Структура(Поле, Null);
ЗаполнитьЗначенияСвойств(ОдноПоле, ПустойКлючЗаписи);
Если ОдноПоле[Поле] = Null Тогда
Продолжить;
КонецЕсли;
ОписаниеКлюча.МассивПолей.Добавить(Поле);
КонецЦикла;
ОписаниеКлюча.СтрокаПолей = СтрСоединить(ОписаниеКлюча.МассивПолей, ",");
Возврат ОбщегоНазначения.ФиксированныеДанные(ОписаниеКлюча);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - Булево - Истина
//
Функция ТипыПоляТаблицы(ПолноеИмяПоля) Экспорт
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяПоля);
МассивТипов = ОбъектМетаданных.Тип.Типы();
ТипИдентификатора = Тип("СправочникОбъект.ИдентификаторыОбъектовМетаданных");
ТипыПоля = Новый Соответствие;
Для каждого Тип Из МассивТипов Цикл
Если Тип = ТипИдентификатора Тогда
Продолжить;
КонецЕсли;
ТипыПоля.Вставить(Тип, Истина);
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(ТипыПоля);
КонецФункции
// Возвращает типы объектов и ссылок в указанных подписках на события.
//
// Параметры:
// ИменаПодписок - Строка - многострочная строка, содержащая
// строки начала имени подписки.
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - Булево
//
Функция ТипыОбъектовВПодпискахНаСобытия(ИменаПодписок) Экспорт
ТипИдентификатора = Тип("СправочникОбъект.ИдентификаторыОбъектовМетаданных");
ТипыОбъектов = Новый Соответствие;
Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
Для НомерСтроки = 1 По СтрЧислоСтрок(ИменаПодписок) Цикл
ИмяПодписки = СтрПолучитьСтроку(ИменаПодписок, НомерСтроки);
Если ВРег(Подписка.Имя) = ВРег(ИмяПодписки) Тогда
Типы = Подписка.Источник.Типы();
Для Каждого Тип Из Типы Цикл
Если Тип = ТипИдентификатора Тогда
Продолжить;
КонецЕсли;
ТипыОбъектов.Вставить(Тип, Истина);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(ТипыОбъектов);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ХранилищеЗначения
//
Функция ТаблицаПустогоНабораЗаписей(ПолноеИмяРегистра) Экспорт
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяРегистра);
Возврат Новый ХранилищеЗначения(Менеджер.СоздатьНаборЗаписей().Выгрузить());
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ХранилищеЗначения - содержит тип ТаблицаЗначений
//
Функция ТаблицаПустыхСсылокУказанныхТипов(ПолноеИмяРеквизита) Экспорт
ОписаниеТипов = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяРеквизита).Тип;
ПустыеСсылки = Новый ТаблицаЗначений;
ПустыеСсылки.Колонки.Добавить("ПустаяСсылка", ОписаниеТипов);
Для каждого ТипЗначения Из ОписаниеТипов.Типы() Цикл
Если ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда
ПустыеСсылки.Добавить().ПустаяСсылка = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(
Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя()).ПустаяСсылка();
КонецЕсли;
КонецЦикла;
Возврат Новый ХранилищеЗначения(ПустыеСсылки);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - ЛюбаяСсылка
//
Функция СоответствиеПустыхСсылокУказаннымТипамСсылок(ПолноеИмяРеквизита) Экспорт
ОписаниеТипов = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяРеквизита).Тип;
ПустыеСсылки = Новый Соответствие;
Для каждого ТипЗначения Из ОписаниеТипов.Типы() Цикл
Если ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда
ПустыеСсылки.Вставить(ТипЗначения, ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(
Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя()).ПустаяСсылка() );
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(ПустыеСсылки);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - Строка
//
Функция КодыТиповСсылок(ПолноеИмяРеквизита) Экспорт
ОписаниеТипов = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяРеквизита).Тип;
ЧисловыеКодыТипов = Новый Соответствие;
ТекущийКод = 0;
Для каждого ТипЗначения Из ОписаниеТипов.Типы() Цикл
Если ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда
ЧисловыеКодыТипов.Вставить(ТипЗначения, ТекущийКод);
КонецЕсли;
ТекущийКод = ТекущийКод + 1;
КонецЦикла;
СтроковыеКодыТипов = Новый Соответствие;
ДлинаСтроковогоКода = СтрДлина(Формат(ТекущийКод-1, "ЧН=0; ЧГ="));
ФорматнаяСтрокаКода = "ЧЦ=" + Формат(ДлинаСтроковогоКода, "ЧН=0; ЧГ=") + "; ЧН=0; ЧВН=; ЧГ=";
Для каждого КлючИЗначение Из ЧисловыеКодыТипов Цикл
СтроковыеКодыТипов.Вставить(
КлючИЗначение.Ключ,
Формат(КлючИЗначение.Значение, ФорматнаяСтрокаКода));
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(СтроковыеКодыТипов);
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - Строка
//
Функция КодыПеречислений() Экспорт
КодыПеречислений = Новый Соответствие;
Для каждого ТипЗначенияДоступа Из Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы() Цикл
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗначенияДоступа); // ОбъектМетаданныхПеречисление
Если МетаданныеТипа = Неопределено ИЛИ НЕ Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Продолжить;
КонецЕсли;
Для каждого ЗначениеПеречисления Из МетаданныеТипа.ЗначенияПеречисления Цикл
ИмяЗначения = ЗначениеПеречисления.Имя;
КодыПеречислений.Вставить(Перечисления[МетаданныеТипа.Имя][ИмяЗначения], ИмяЗначения);
КонецЦикла;
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(КодыПеречислений);
КонецФункции
// См. УправлениеДоступомСлужебный.ТипыГруппИЗначенийВидовДоступа
Функция ТипыГруппИЗначенийВидовДоступа() Экспорт
Возврат УправлениеДоступомСлужебный.ТипыГруппИЗначенийВидовДоступа();
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// ОписаниеТипов
//
Функция ОписаниеТиповЗначенийДоступаИВладельцевНастроекПрав() Экспорт
Типы = Новый Массив;
Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы() Цикл
Типы.Добавить(Тип);
КонецЦикла;
Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ВладелецНастроекПрав.Тип.Типы() Цикл
Если Тип = Тип("Строка") Тогда
Продолжить;
КонецЕсли;
Типы.Добавить(Тип);
КонецЦикла;
Возврат Новый ОписаниеТипов(Типы);
КонецФункции
// Смотри также УправлениеДоступомСлужебный.ТипыЗначенийВидовДоступаИВладельцевНастроекПрав()
//
// Возвращаемое значение:
// ХранилищеЗначения
//
Функция ТипыЗначенийВидовДоступаИВладельцевНастроекПрав() Экспорт
Возврат Новый ХранилищеЗначения(УправлениеДоступомСлужебный.ТипыЗначенийВидовДоступаИВладельцевНастроекПрав());
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// Структура:
// * ДатаОбновления - Дата
// * Таблица - ТаблицаЗначений:
// ** Таблица - СправочникСсылка.ИдентификаторыОбъектовМетаданных
// - СправочникСсылка.ИдентификаторыОбъектовРасширений
// ** Право - Строка - имя права
// ** ВидДоступа - СправочникСсылка
// ** Представление - Строка - представление вида доступа
//
Функция ВидыОграниченийПравОбъектовМетаданных() Экспорт
Возврат Новый Структура("ДатаОбновления, Таблица", '00010101');
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// Булево
//
Функция КонстантаОграничиватьДоступНаУровнеЗаписей() Экспорт
Возврат Константы.ОграничиватьДоступНаУровнеЗаписей.Получить();
КонецФункции
#Область УниверсальноеОграничение
// Возвращаемое значение:
// Булево
//
Функция КонстантаОграничиватьДоступНаУровнеЗаписейУниверсально() Экспорт
Возврат УправлениеДоступомСлужебный.КонстантаОграничиватьДоступНаУровнеЗаписейУниверсально();
КонецФункции
// Параметры:
// Пользователь - СправочникСсылка.Пользователи
// - СправочникСсылка.ВнешниеПользователи
// - Неопределено - проверить для текущего пользователя.
//
// Возвращаемое значение:
// Булево
//
Функция ЭтоПользовательБезОграниченияДоступа(Пользователь = Неопределено) Экспорт
Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнтерфейсOData") Тогда
Возврат Ложь;
КонецЕсли;
МодульИнтерфейсODataСлужебный = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсODataСлужебный");
РольИнтерфейсаOData = МодульИнтерфейсODataСлужебный.РольИнтерфейсаOData();
Если Пользователь = Неопределено
Или Пользователь = Пользователи.АвторизованныйПользователь() Тогда
Возврат ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(РольИнтерфейсаOData);
КонецЕсли;
Если Не ЗначениеЗаполнено(Пользователь)
Или ТипЗнч(Пользователь) <> Тип("СправочникСсылка.Пользователи")
И ТипЗнч(Пользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда
Возврат Ложь;
КонецЕсли;
ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь,
"ИдентификаторПользователяИБ");
Если ТипЗнч(ИдентификаторПользователяИБ) <> Тип("УникальныйИдентификатор") Тогда
Возврат Ложь;
КонецЕсли;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
ИдентификаторПользователяИБ);
Если ПользовательИБ = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Возврат ПользовательИБ.Роли.Содержит(РольИнтерфейсаOData);
КонецФункции
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - Массив из СправочникСсылка
//
Функция ПустыеСсылкиТиповЗначенийДоступаПоТипамГруппИЗначений() Экспорт
СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа();
ПустыеСсылки = Новый Соответствие;
Для Каждого Свойства Из СвойстваВидовДоступа.Массив Цикл
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, Свойства.ТипЗначений, Свойства.ТипЗначений);
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, Свойства.ТипГруппЗначений, Свойства.ТипЗначений);
Для Каждого Описание Из Свойства.ДополнительныеТипы Цикл
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, Описание.ТипЗначений, Описание.ТипЗначений);
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, Описание.ТипГруппЗначений, Описание.ТипЗначений);
КонецЦикла;
КонецЦикла;
ТипГруппПользователей = Тип("СправочникСсылка.ГруппыПользователей");
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, ТипГруппПользователей, ТипГруппПользователей);
ТипГруппВнешнихПользователей = Тип("СправочникСсылка.ГруппыВнешнихПользователей");
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, ТипГруппВнешнихПользователей, ТипГруппВнешнихПользователей);
Свойства = СвойстваВидовДоступа.ПоИменам.Получить("Пользователи");
Для Каждого Описание Из Свойства.ДополнительныеТипы Цикл
ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылки, ТипГруппПользователей, Описание.ТипЗначений);
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(ПустыеСсылки);
КонецФункции
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Тип
// * Значение - Булево
//
Функция ТиповСсылокВедущихОбъектов() Экспорт
Типы = Новый Соответствие;
ДобавитьТипы(Типы, Справочники.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, Документы.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, ПланыВидовХарактеристик.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, ПланыСчетов.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, ПланыВидовРасчета.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, БизнесПроцессы.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, Задачи.ТипВсеСсылки().Типы());
ДобавитьТипы(Типы, ПланыОбмена.ТипВсеСсылки().Типы());
Возврат Новый ФиксированноеСоответствие(Типы);
КонецФункции
// Возвращаемое значение:
// ОписаниеТипов
//
Функция ОписаниеТиповСсылокДопустимыхОбъектов() Экспорт
ОписаниеТипов = Новый ОписаниеТипов(ПланыОбмена.ТипВсеСсылки());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, Справочники.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, Документы.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, ПланыВидовХарактеристик.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, ПланыСчетов.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, ПланыВидовРасчета.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, БизнесПроцессы.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, Задачи.ТипВсеСсылки().Типы());
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов,, "СправочникСсылка.НаборыГруппДоступа");
Возврат ОписаниеТипов;
КонецФункции
// См. УправлениеДоступомСлужебный.НовыйКэшПараметровОграничения
Функция КэшПараметровОграничения(КлючДанныхПовторногоИспользования) Экспорт
Возврат УправлениеДоступомСлужебный.НовыйКэшПараметровОграничения();
КонецФункции
// Возвращаемое значение:
// Структура:
// * ДляПользователей - см. УправлениеДоступомСлужебный.КэшРасчетаПравДляВидаПользователей
// * ДляВнешнихПользователей - см. УправлениеДоступомСлужебный.КэшРасчетаПравДляВидаПользователей
// * ВерсияДанных - см. УправлениеДоступомСлужебный.НоваяВерсияДанныхДляКэшаРасчетаПрав
//
Функция КэшРасчетаПрав(КлючДанныхПовторногоИспользования) Экспорт
Свойства = "ПраваГруппДоступаСписков, ЗначенияГруппДоступа, ПользователиГруппПользователей,
|УчастникиГруппДоступа, ГруппыПользователейГруппДоступа, ГруппыПользователейКакЗначенияДоступа,
|РолиПрофилейГруппДоступа, ГруппыДоступаПрофилей";
ВерсияДанных = УправлениеДоступомСлужебный.НоваяВерсияДанныхДляКэшаРасчетаПрав(
Строка(Новый УникальныйИдентификатор));
Хранилище = Новый Структура;
Хранилище.Вставить("ДляПользователей", Новый Структура(Свойства, Новый Соответствие));
Хранилище.Вставить("ДляВнешнихПользователей", Новый Структура(Свойства, Новый Соответствие));
Хранилище.Вставить("ВерсияДанных", ВерсияДанных);
Возврат Хранилище;
КонецФункции
Функция КэшИзмененныхСписковПриОтключенномОбновленииКлючейДоступа() Экспорт
ОтключениеОбновления = ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа; // См. УправлениеДоступомСлужебный.НовоеОтключениеОбновленияКлючейДоступа
Возврат ОтключениеОбновления.ИзмененныеСписки.Получить();
КонецФункции
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Строка - полное имя списка (таблицы).
// * Значение - Булево - Истина - текст ограничения в модуле менеджера,
// Ложь - текст ограничения в этом переопределяемом
// модуле в процедуре ПриЗаполненииОграниченияДоступа.
//
Функция СпискиСОграничением() Экспорт
Списки = Новый Соответствие;
ИнтеграцияПодсистемБСП.ПриЗаполненииСписковСОграничениемДоступа(Списки);
УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа(Списки);
СвойстваСписков = Новый Соответствие;
Для Каждого Список Из Списки Цикл
ПолноеИмя = Список.Ключ.ПолноеИмя();
СвойстваСписков.Вставить(ПолноеИмя, Список.Значение);
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(СвойстваСписков);
КонецФункции
Функция РазрешенныйКлючДоступа() Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Ссылка = Справочники.КлючиДоступа.ПолучитьСсылку(
Новый УникальныйИдентификатор("8bfeb2d1-08c3-11e8-bcf8-d017c2abb532"));
СсылкаВБазеДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Ссылка");
Если Не ЗначениеЗаполнено(СсылкаВБазеДанных) Тогда
РазрешенныйКлюч = Справочники.КлючиДоступа.СоздатьЭлемент();
РазрешенныйКлюч.УстановитьСсылкуНового(Ссылка);
РазрешенныйКлюч.Наименование = НСтр("ru = 'Разрешенный ключ доступа'");
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.КлючиДоступа");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
СсылкаВБазеДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Ссылка");
Если Не ЗначениеЗаполнено(СсылкаВБазеДанных) Тогда
РазрешенныйКлюч.Записать();
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
Возврат Ссылка;
КонецФункции
Функция РазрешенныйПустойНаборГруппДоступа() Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Ссылка = Справочники.НаборыГруппДоступа.ПолучитьСсылку(
Новый УникальныйИдентификатор("b5bc5b29-a11d-11e8-8787-b06ebfbf08c7"));
СсылкаВБазеДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Ссылка");
Если Не ЗначениеЗаполнено(СсылкаВБазеДанных) Тогда
РазрешенныйПустойНабор = Справочники.НаборыГруппДоступа.СоздатьЭлемент();
РазрешенныйПустойНабор.УстановитьСсылкуНового(Ссылка);
РазрешенныйПустойНабор.Наименование = НСтр("ru = 'Разрешенный пустой набор групп доступа'");
РазрешенныйПустойНабор.ТипЭлементовНабора = Справочники.ГруппыДоступа.ПустаяСсылка();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыГруппДоступа");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
СсылкаВБазеДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Ссылка");
Если Не ЗначениеЗаполнено(СсылкаВБазеДанных) Тогда
РазрешенныйПустойНабор.Записать();
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
Возврат Ссылка;
КонецФункции
Функция РазмерностьКлючаДоступа() Экспорт
МетаданныеКлюча = Метаданные.Справочники.КлючиДоступа;
Если КоличествоПодобныхЭлементовВКоллекции(МетаданныеКлюча.Реквизиты, "Значение") <> 5 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В справочнике %1 должно быть 5 реквизитов %2 и не более.'"),
"КлючиДоступа", "Значение" + "*");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если МетаданныеКлюча.ТабличныеЧасти.Найти("Шапка") = Неопределено
Или КоличествоПодобныхЭлементовВКоллекции(МетаданныеКлюча.ТабличныеЧасти.Шапка.Реквизиты, "Значение", 6) <> 5 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В справочнике %1 должна быть табличная часть %2 с 5 реквизитами %3 и не более.'"),
"КлючиДоступа", "Шапка", "Значение" + "*");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КоличествоТабличныхЧастей = КоличествоПодобныхЭлементовВКоллекции(МетаданныеКлюча.ТабличныеЧасти, "ТабличнаяЧасть");
Если КоличествоТабличныхЧастей < 1 Или КоличествоТабличныхЧастей > 12 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В справочнике %1 должно быть от 1 до 12 табличных частей %2.'"),
"КлючиДоступа", "ТабличнаяЧасть" + "*");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КоличествоТабличныхЧастей = 0;
КоличествоРеквизитовТабличнойЧасти = 0;
Для Каждого ТабличнаяЧасть Из МетаданныеКлюча.ТабличныеЧасти Цикл
Если Не СтрНачинаетсяС(ТабличнаяЧасть.Имя, "ТабличнаяЧасть") Тогда
Продолжить;
КонецЕсли;
КоличествоТабличныхЧастей = КоличествоТабличныхЧастей + 1;
Количество = КоличествоПодобныхЭлементовВКоллекции(ТабличнаяЧасть.Реквизиты, "Значение");
Если Количество < 1 Или Количество > 15 Тогда
КоличествоРеквизитовТабличнойЧасти = 0;
Прервать;
КонецЕсли;
Если КоличествоРеквизитовТабличнойЧасти <> 0
И КоличествоРеквизитовТабличнойЧасти <> Количество Тогда
КоличествоРеквизитовТабличнойЧасти = 0;
Прервать;
КонецЕсли;
КоличествоРеквизитовТабличнойЧасти = Количество;
КонецЦикла;
Если КоличествоРеквизитовТабличнойЧасти = 0 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В справочнике %1 в табличных частях %2
|допустимо только одинаковое количество реквизитов %3 и не более 15.'"),
"КлючиДоступа", "ТабличнаяЧасть" + "*", "Значение" + "*");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Размерность = Новый Структура;
Размерность.Вставить("КоличествоТабличныхЧастей", КоличествоТабличныхЧастей);
Размерность.Вставить("КоличествоРеквизитовТабличнойЧасти", КоличествоРеквизитовТабличнойЧасти);
Возврат Новый ФиксированнаяСтруктура(Размерность);
КонецФункции
Функция КоличествоОпорныхПолейРегистра(Знач ИмяРегистра = "") Экспорт
Если ИмяРегистра = "" Или ИмяРегистра = "КлючиДоступаКРегистрам" Тогда
ИмяРегистра = "КлючиДоступаКРегистрам";
Измерения = Метаданные.РегистрыСведений.КлючиДоступаКРегистрам.Измерения;
Если Измерения.Количество() < 1 Или Измерения[0].Имя <> "Регистр" Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В регистре сведений %1
|первым измерением должно быть %2.'"), ИмяРегистра, "Регистр");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если Измерения.Количество() < 2 Или Измерения[1].Имя <> "ВариантДоступа" Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В регистре сведений %1
|вторым измерением должно быть %2.'"), ИмяРегистра, "ВариантДоступа");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ИндексИзмеренияПоля = 2;
Иначе
Измерения = Метаданные.РегистрыСведений[ИмяРегистра].Измерения;
Если Измерения.Количество() < 1 Или Измерения[0].Имя <> "ВариантДоступа" Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В регистре сведений %1
|первым измерением должно быть %2.'"), ИмяРегистра, "ВариантДоступа");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ИндексИзмеренияПоля = 1;
КонецЕсли;
ВариантДоступаТип = Измерения.ВариантДоступа.Тип;
Если ВариантДоступаТип.Типы().Количество() <> 1
Или Не ВариантДоступаТип.СодержитТип(Тип("Число"))
Или ВариантДоступаТип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
Или ВариантДоступаТип.КвалификаторыЧисла.Разрядность <> 4
Или ВариантДоступаТип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В регистре сведений %1
|измерение %2 должно иметь тип %3.'"),
ИмяРегистра, "ВариантДоступа", "Число(4,0,Неотрицательное)");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если Измерения.Количество() <= ИндексИзмеренияПоля
Или Измерения[ИндексИзмеренияПоля].Имя <> "Поле1" Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В регистре сведений %1
|после измерения %2 должно быть %3.'"), ИмяРегистра, "ВариантДоступа", "Поле1");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ПоследнийНомерПоля = 0;
Для Каждого Измерение Из Измерения Цикл
Если Измерение.Имя = "Регистр" Или Измерение.Имя = "ВариантДоступа" Тогда
Продолжить;
КонецЕсли;
ИмяПоля = "Поле" + XMLСтрока(ПоследнийНомерПоля + 1);
Если Измерение.Имя <> ИмяПоля Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В регистре сведений %1
|измерения вида %2<номер> должны идти по порядку
|а на месте измерения %3 обнаружено %4'"),
ИмяРегистра, "Поле", ИмяПоля, Измерение.Имя);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ПоследнийНомерПоля = ПоследнийНомерПоля + 1;
КонецЦикла;
Возврат ПоследнийНомерПоля;
КонецФункции
Функция МаксимальноеКоличествоОпорныхПолейРегистра() Экспорт
// При изменении нужно синхронно изменить шаблон ограничения доступа ДляРегистра.
Возврат Число(5);
КонецФункции
Функция ПустыеЗначенияОпорныхПолей(Количество) Экспорт
ПустыеЗначения = Новый Структура;
Для Номер = 1 По Количество Цикл
ПустыеЗначения.Вставить("Поле" + Номер, Перечисления.ДополнительныеЗначенияДоступа.Null);
КонецЦикла;
Возврат ПустыеЗначения;
КонецФункции
// Возвращаемое значение:
// ФиксированнаяСтруктура из КлючИЗначение:
// * Ключ - Строка - имя поля
// * Значение - ОписаниеТипов - тип поля
//
Функция ТипыОпорныхПолейРегистра(Знач ИмяРегистра = "") Экспорт
Количество = УправлениеДоступомСлужебныйПовтИсп.КоличествоОпорныхПолейРегистра(ИмяРегистра);
Если ИмяРегистра = "" Или ИмяРегистра = "КлючиДоступаКРегистрам" Тогда
ИмяРегистра = "КлючиДоступаКРегистрам";
КонецЕсли;
Измерения = Метаданные.РегистрыСведений[ИмяРегистра].Измерения;
Результат = Новый Структура;
Для Номер = 1 По Количество Цикл
ИмяПоля = "Поле" + Номер;
Результат.Вставить(ИмяПоля, Измерения[ИмяПоля].Тип);
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Строка - полное имя таблицы
// * Значение - Булево - Истина
//
Функция ТаблицыВПодпискахПроверитьДоступ() Экспорт
Результат = Новый Соответствие;
ДобавитьТаблицыИзОписанияТипов(Результат,
Метаданные.ОпределяемыеТипы.ВладелецЗначенийКлючейДоступаОбъект.Тип);
ДобавитьТаблицыИзОписанияТипов(Результат,
Метаданные.ОпределяемыеТипы.ВладелецЗначенийКлючейДоступаДокумент.Тип);
ДобавитьТаблицыИзОписанияТипов(Результат,
Метаданные.ОпределяемыеТипы.ВладелецЗначенийКлючейДоступаНаборЗаписей.Тип);
ДобавитьТаблицыИзОписанияТипов(Результат,
Метаданные.ОпределяемыеТипы.ВладелецЗначенийКлючейДоступаНаборЗаписейРегистраРасчета.Тип);
Возврат Новый ФиксированноеСоответствие(Результат);
КонецФункции
// Возвращаемое значение:
// см. УправлениеДоступомСлужебный.СинтаксисЯзыка
//
Функция СинтаксисЯзыка() Экспорт
Возврат УправлениеДоступомСлужебный.СинтаксисЯзыка();
КонецФункции
// Возвращаемое значение:
// см. УправлениеДоступомСлужебный.УзлыДляПроверкиДоступности
//
Функция УзлыДляПроверкиДоступности(Список, ЭтоСписокИсключений) Экспорт
Возврат УправлениеДоступомСлужебный.УзлыДляПроверкиДоступности(Список, ЭтоСписокИсключений);
КонецФункции
Функция РазделенныеДанныеНедоступны() Экспорт
Возврат Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
КонецФункции
Функция ОписаниеПредопределенногоИдентификатораОбъектаМетаданных(ПолноеИмяОбъектаМетаданных) Экспорт
Имена = УправлениеДоступомСлужебныйПовтИсп.ИменаПредопределенныхЭлементовСправочника(
"ИдентификаторыОбъектовМетаданных");
Имя = СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");
Если Имена.Найти(Имя) <> Неопределено Тогда
Возврат "ИдентификаторыОбъектовМетаданных." + Имя;
КонецЕсли;
Имена = УправлениеДоступомСлужебныйПовтИсп.ИменаПредопределенныхЭлементовСправочника(
"ИдентификаторыОбъектовРасширений");
Если Имена.Найти(Имя) <> Неопределено Тогда
Возврат "ИдентификаторыОбъектовРасширений." + Имя;
КонецЕсли;
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных);
Если ОбъектМетаданных = Неопределено Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось получить имя предопределенного идентификатора объекта метаданных
|так как не существует указанный объект метаданных:
|""%1"".'"),
ПолноеИмяОбъектаМетаданных);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если ОбъектМетаданных.РасширениеКонфигурации() = Неопределено Тогда
Возврат "ИдентификаторыОбъектовМетаданных." + Имя;
КонецЕсли;
Возврат "ИдентификаторыОбъектовРасширений." + Имя;
КонецФункции
Функция ИменаПредопределенныхЭлементовСправочника(ИмяСправочника) Экспорт
Возврат Метаданные.Справочники[ИмяСправочника].ПолучитьИменаПредопределенных();
КонецФункции
Функция ДопустимыеТипыЗначенийКлючейДоступа() Экспорт
РазмерностьКлюча = РазмерностьКлючаДоступа();
РеквизитыСправочника = Метаданные.Справочники.КлючиДоступа.Реквизиты;
ТабличныеЧастиСправочника = Метаданные.Справочники.КлючиДоступа.ТабличныеЧасти;
ДопустимыеТипы = РеквизитыСправочника.Значение1.Тип.Типы();
Для НомерРеквизита = 2 По 5 Цикл
УточнитьДопустимыеТипы(ДопустимыеТипы, РеквизитыСправочника["Значение" + НомерРеквизита]);
КонецЦикла;
Для НомерРеквизита = 6 По 10 Цикл
УточнитьДопустимыеТипы(ДопустимыеТипы, ТабличныеЧастиСправочника.Шапка.Реквизиты["Значение" + НомерРеквизита]);
КонецЦикла;
Для НомерТабличнойЧасти = 1 По РазмерностьКлюча.КоличествоТабличныхЧастей Цикл
ТабличнаяЧасть = ТабличныеЧастиСправочника["ТабличнаяЧасть" + НомерТабличнойЧасти];
Для НомерРеквизита = 1 По РазмерностьКлюча.КоличествоРеквизитовТабличнойЧасти Цикл
УточнитьДопустимыеТипы(ДопустимыеТипы, ТабличнаяЧасть.Реквизиты["Значение" + НомерРеквизита]);
КонецЦикла;
КонецЦикла;
Возврат Новый ОписаниеТипов(ДопустимыеТипы);
КонецФункции
Функция ПоследняяПроверкаВерсииРазрешенныхНаборов() Экспорт
Возврат Новый Структура("Дата", '00010101');
КонецФункции
Функция ИменаРолейБазовыеПрава(ДляВнешнихПользователей) Экспорт
ИменаРолей = Новый Массив;
НазначениеРолей = ПользователиСлужебныйПовтИсп.НазначениеРолей();
Для Каждого Роль Из Метаданные.Роли Цикл
ИмяРоли = Роль.Имя;
Если Не СтрНачинаетсяС(ВРег(ИмяРоли), ВРег("БазовыеПрава")) Тогда
Продолжить;
КонецЕсли;
РольДляВнешнихПользователей = НазначениеРолей.ТолькоДляВнешнихПользователей.Получить(Роль.Имя) <> Неопределено;
Если НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Получить(Роль.Имя) <> Неопределено
Или РольДляВнешнихПользователей = ДляВнешнихПользователей Тогда
ИменаРолей.Добавить(Роль.Имя);
КонецЕсли;
КонецЦикла;
Возврат ИменаРолей;
КонецФункции
Функция ТребуетсяУточнениеПланаЗапроса() Экспорт
Возврат Не ОбщегоНазначения.ИнформационнаяБазаФайловая();
КонецФункции
// Только для внутреннего использования.
//
// Возвращаемое значение:
// Строка
//
Функция УточнениеПланаЗапроса(Хеш, ДлинаХеша) Экспорт
Биты = Новый Массив;
Для НомерБита = 0 По ДлинаХеша - 1 Цикл
Биты.Вставить(0, ?(ПроверитьБит(Хеш, НомерБита), "ИСТИНА", "ЛОЖЬ"));
КонецЦикла;
Возврат "ИСТИНА В (ИСТИНА," + СтрСоединить(Биты, ",") + ")"; // @query-part-1
КонецФункции
Функция ПоляВРегистреСимволовМетаданных(ПолноеИмя, Поля) Экспорт
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(СтрЗаменить("ВЫБРАТЬ * ИЗ &ИмяТаблицы", "&ИмяТаблицы", ПолноеИмя));
ПоляВМетаданных = Новый Соответствие;
Для Каждого Колонка Из СхемаЗапроса.ПакетЗапросов[0].Колонки Цикл
ПоляВМетаданных.Вставить(ВРег(Колонка.Псевдоним), Колонка.Псевдоним);
КонецЦикла;
ПоляКакУказаны = СтрРазделить(Поля, ",", Ложь);
ПоляКакВМетаданных = Новый Массив;
Для Каждого Поле Из ПоляКакУказаны Цикл
ПоляКакВМетаданных.Добавить(ПоляВМетаданных.Получить(ВРег(Поле)));
КонецЦикла;
Возврат СтрСоединить(ПоляКакВМетаданных, ",");
КонецФункции
// Возвращает строку символов.
//
// Параметры:
// Символ - Строка - строка длиной 1 символ.
// Количество - Число - количество символов, которые требуется вернуть.
//
// Возвращаемое значение:
// Строка
//
Функция СтрокаСимволов(Символ = " ", Количество = 50) Экспорт
Шаблон = " ";
Если Количество > 50 Тогда
Шаблоны = Новый Массив;
Пока Шаблоны.Количество() * 50 < Количество Цикл
Шаблоны.Добавить(Шаблон);
КонецЦикла;
Шаблон = СтрСоединить(Шаблоны, "");
КонецЕсли;
Возврат Лев(СтрЗаменить(Шаблон, " ", Символ), Количество);
КонецФункции
Функция ДоступнаБалансировкаНагрузкиНаДиск() Экспорт
Возврат Не ОбщегоНазначения.ИнформационнаяБазаФайловая();
КонецФункции
#КонецОбласти
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.
Процедура ДобавитьПустуюСсылкуТипаЗначений(ПустыеСсылкиПоТипам, ТипГруппИЗначений, ТипЗначений)
Если ТипГруппИЗначений = Тип("Неопределено") Тогда
Возврат;
КонецЕсли;
ПустыеСсылки = ПустыеСсылкиПоТипам.Получить(ТипГруппИЗначений);
Если ПустыеСсылки = Неопределено Тогда
ПустыеСсылки = Новый Массив;
ПустыеСсылкиПоТипам.Вставить(ТипГруппИЗначений, ПустыеСсылки);
КонецЕсли;
Типы = Новый Массив;
Типы.Добавить(ТипЗначений);
ОписаниеТипов = Новый ОписаниеТипов(Типы);
ПустаяСсылка = ОписаниеТипов.ПривестиЗначение(Неопределено);
ПустыеСсылки.Добавить(ПустаяСсылка);
КонецПроцедуры
#Область УниверсальноеОграничение
Функция КоличествоПодобныхЭлементовВКоллекции(Коллекция, НачалоИмени, НачальныйНомер = 1)
КоличествоПодобных = 0;
МаксимальныйНомер = 0;
Для Каждого ЭлементКоллекции Из Коллекция Цикл
Если Не СтрНачинаетсяС(ЭлементКоллекции.Имя, НачалоИмени) Тогда
Продолжить;
КонецЕсли;
НомерЭлемента = Сред(ЭлементКоллекции.Имя, СтрДлина(НачалоИмени) + 1);
Если СтрДлина(НомерЭлемента) < 1 Или СтрДлина(НомерЭлемента) > 2 Тогда
КоличествоПодобных = 0;
Прервать;
КонецЕсли;
Если Не ( Лев(НомерЭлемента, 1) >= "0" И Лев(НомерЭлемента, 1) <= "9" ) Тогда
КоличествоПодобных = 0;
Прервать;
КонецЕсли;
Если СтрДлина(НомерЭлемента) = 2
И Не ( Лев(НомерЭлемента, 2) >= "0" И Лев(НомерЭлемента, 2) <= "9" ) Тогда
КоличествоПодобных = 0;
Прервать;
КонецЕсли;
НомерЭлемента = Число(НомерЭлемента);
Если НомерЭлемента < НачальныйНомер Тогда
КоличествоПодобных = 0;
Прервать;
КонецЕсли;
КоличествоПодобных = КоличествоПодобных + 1;
МаксимальныйНомер = ?(МаксимальныйНомер > НомерЭлемента, МаксимальныйНомер, НомерЭлемента);
КонецЦикла;
Если МаксимальныйНомер - НачальныйНомер + 1 <> КоличествоПодобных Тогда
КоличествоПодобных = 0;
КонецЕсли;
Возврат КоличествоПодобных;
КонецФункции
// Для функции ДопустимыеТипыЗначенийКлючейДоступа.
Процедура УточнитьДопустимыеТипы(ДопустимыеТипы, Реквизит);
Индекс = ДопустимыеТипы.Количество() - 1;
ОписаниеТипов = Реквизит.Тип;
Пока Индекс >= 0 Цикл
Если Не ОписаниеТипов.СодержитТип(ДопустимыеТипы[Индекс]) Тогда
ДопустимыеТипы.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
// Для функции ТиповСсылокВедущихОбъектов.
Процедура ДобавитьТипы(Типы, ДобавляемыеТипы)
Для Каждого Тип Из ДобавляемыеТипы Цикл
Типы.Вставить(Тип, Истина);
КонецЦикла;
КонецПроцедуры
// Для функции ТаблицыВПодпискахПроверитьДоступ.
Процедура ДобавитьТаблицыИзОписанияТипов(Таблицы, ОписаниеТипов)
Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
Таблицы.Вставить(ОбъектМетаданных.ПолноеИмя(), Истина);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецОбласти