//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; Перем мПлатформа Экспорт; Перем мОписанияТиповПолей Экспорт; Функция РеквизитыОбработки(Параметры) Экспорт Результат = ирОбщий.РеквизитыОбработкиЛкс(ЭтотОбъект); Возврат Результат; КонецФункции Функция ИсторияДанныхМоя() Экспорт Возврат Вычислить("ИсторияДанных"); КонецФункции Функция ОбновитьИсториюДанных(Параметры) Экспорт ирОбщий.СостояниеЛкс("Обновление истории данных"); ИсторияДанныхМоя = ИсторияДанныхМоя(); #Если Сервер И Не Сервер Тогда ИсторияДанныхМоя = ИсторияДанных; #КонецЕсли ИсторияДанныхМоя.ОбновитьИсторию(); ирОбщий.СостояниеЛкс(""); КонецФункции Процедура ЗаполнитьНастройкиИсторииВСтрокеТипа(Знач НастройкиИстории, ОбъектМД, Знач СтрокаДанных, ВычислятьПоля = Ложь) Экспорт ИспользованиеПолейНастроекИстории = Неопределено; Если НастройкиИстории <> Неопределено Тогда СтрокаДанных.Использование = НастройкиИстории.Использование; ИспользованиеПолейНастроекИстории = НастройкиИстории.ИспользованиеПолей; КонецЕсли; СтрокаДанных.ПоляВключенные = "?"; СтрокаДанных.ПоляВыключенные = "?"; Если Не ВычислятьПоля Тогда Возврат; КонецЕсли; ТаблицаПолей = ИспользованиеПолей(ОбъектМД, ИспользованиеПолейНастроекИстории); СтрокаДанных.ПоляВключенные = ПредставлениеПолей(ТаблицаПолей, Истина); СтрокаДанных.ПоляВыключенные = ПредставлениеПолей(ТаблицаПолей, Ложь); КонецПроцедуры Функция ИспользованиеПолей(ОбъектМД, ИспользованиеПолейНастроекИстории = Неопределено, Подробно = Ложь) Экспорт #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Справочники.ирАлгоритмы; #КонецЕсли Если ИспользованиеПолейНастроекИстории = Неопределено Тогда ИсторияДанныхМоя = ИсторияДанныхМоя(); #Если Сервер И Не Сервер Тогда ИсторияДанныхМоя = ИсторияДанных; #КонецЕсли НастройкиИстории = ИсторияДанныхМоя.ПолучитьНастройки(ОбъектМД); Если НастройкиИстории <> Неопределено Тогда ИспользованиеПолейНастроекИстории = НастройкиИстории.ИспользованиеПолей; КонецЕсли; КонецЕсли; ТаблицаПолей = Поля.ВыгрузитьКолонки(); ИспользованиеИсторииДанныхИспользовать = Метаданные.СвойстваОбъектов.ИспользованиеИсторииДанных.Использовать; Если Метаданные.Константы.Содержит(ОбъектМД) Тогда Возврат ТаблицаПолей; КонецЕсли; #Если Сервер И Не Сервер Тогда ТаблицаПолей = Поля; #КонецЕсли ИмяПоляВерсияДанных = ирОбщий.ПеревестиСтроку("ВерсияДанных"); ИмяПоляНомерСтроки = ирОбщий.ПеревестиСтроку("НомерСтроки"); ИмяПоляСсылка = ирОбщий.ПеревестиСтроку("Ссылка"); Если Подробно Тогда мОписанияТиповПолей = Новый ТаблицаЗначений; мОписанияТиповПолей.Колонки.Добавить("Имя"); мОписанияТиповПолей.Колонки.Добавить("ОписаниеТипов"); КонецЕсли; Для Каждого СтандартныйРеквизит Из ОбъектМД.СтандартныеРеквизиты Цикл Если СтандартныйРеквизит.Имя = ИмяПоляСсылка Тогда Продолжить; КонецЕсли; СтрокаПоля = ТаблицаПолей.Добавить(); СтрокаПоля.ИмяПоля = СтандартныйРеквизит.Имя; СтрокаПоля.ПредставлениеПоля = СтандартныйРеквизит.Представление(); СтрокаПоля.ИспользованиеВМетаданных = СтандартныйРеквизит.ИсторияДанных = ИспользованиеИсторииДанныхИспользовать; СтрокаПоля.Использование = СтрокаПоля.ИспользованиеВМетаданных; СтрокаПоля.ТипПоля = 1; Если ИспользованиеПолейНастроекИстории <> Неопределено И ИспользованиеПолейНастроекИстории[СтрокаПоля.ИмяПоля] <> Неопределено Тогда СтрокаПоля.Использование = ИспользованиеПолейНастроекИстории[СтрокаПоля.ИмяПоля]; КонецЕсли; Если Подробно Тогда СтрокаОписанияТипов = мОписанияТиповПолей.Добавить(); СтрокаОписанияТипов.Имя = СтрокаПоля.ИмяПоля; СтрокаОписанияТипов.ОписаниеТипов = СтандартныйРеквизит.Тип; СтрокаПоля.ОписаниеТипов = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(СтрокаОписанияТипов.ОписаниеТипов); КонецЕсли; КонецЦикла; ТабличныеЧасти = ирОбщий.ТабличныеЧастиОбъектаЛкс(ОбъектМД); #Если Сервер И Не Сервер Тогда ТабличныеЧасти = Новый Структура; #КонецЕсли ТабличныеЧасти.Вставить("_", ОбъектМД); ИмяТаблицыБД = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбъектМД.ПолноеИмя()); Для Каждого ОписаниеТЧ Из ТабличныеЧасти Цикл Если ОписаниеТЧ.Ключ = "_" Тогда ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(ИмяТаблицыБД); Иначе ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(ИмяТаблицыБД + "." + ОписаниеТЧ.Ключ); КонецЕсли; Если ПоляТаблицыБД = Неопределено Тогда Продолжить; КонецЕсли; Для Каждого СтрокаПоляБД Из ПоляТаблицыБД Цикл ИмяПоля = СтрокаПоляБД.Имя; ПредставлениеПоля = СтрокаПоляБД.Заголовок; Если ОписаниеТЧ.Ключ = "_" Тогда Если Ложь Или ТаблицаПолей.Найти(ИмяПоля, "ИмяПоля") <> Неопределено Или ИмяПоля = ИмяПоляСсылка Или ИмяПоля = ИмяПоляВерсияДанных Или СтрокаПоляБД.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда Продолжить; КонецЕсли; ТипПоля = 2; Иначе Если Ложь Или ИмяПоля = ИмяПоляСсылка Или ИмяПоля = ИмяПоляНомерСтроки Тогда Продолжить; КонецЕсли; ИмяПоля = ОписаниеТЧ.Ключ + "." + ИмяПоля; ПредставлениеПоля = ОписаниеТЧ.Значение + "." + ПредставлениеПоля; ТипПоля = 3; КонецЕсли; СтрокаПоля = ТаблицаПолей.Добавить(); СтрокаПоля.ИмяПоля = ИмяПоля; СтрокаПоля.ПредставлениеПоля = ПредставлениеПоля; МетаданныеПоля = СтрокаПоляБД.Метаданные; Если МетаданныеПоля <> Неопределено Тогда СтрокаПоля.ИспользованиеВМетаданных = МетаданныеПоля.ИсторияДанных = ИспользованиеИсторииДанныхИспользовать; КонецЕсли; СтрокаПоля.Использование = СтрокаПоля.ИспользованиеВМетаданных; СтрокаПоля.ТипПоля = ТипПоля; Если ИспользованиеПолейНастроекИстории <> Неопределено И ИспользованиеПолейНастроекИстории[ИмяПоля] <> Неопределено Тогда СтрокаПоля.Использование = ИспользованиеПолейНастроекИстории[ИмяПоля]; КонецЕсли; Если Подробно Тогда СтрокаОписанияТипов = мОписанияТиповПолей.Добавить(); СтрокаОписанияТипов.Имя = СтрокаПоля.ИмяПоля; СтрокаОписанияТипов.ОписаниеТипов = СтрокаПоляБД.ТипЗначения; СтрокаПоля.ОписаниеТипов = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(СтрокаОписанияТипов.ОписаниеТипов); КонецЕсли; КонецЦикла; КонецЦикла; ТаблицаПолей.Сортировать("ТипПоля, ИмяПоля"); Возврат ТаблицаПолей; КонецФункции Функция ПредставлениеПолей(ТаблицаПолей, Использование) #Если Сервер И Не Сервер Тогда ТаблицаПолей = Поля; #КонецЕсли Результат = Новый ЗаписьXML; Результат.УстановитьСтроку(""); ВыбранныеПоля = ТаблицаПолей.НайтиСтроки(Новый Структура("Использование", Использование)); Если ВыбранныеПоля.Количество() > 0 Тогда Результат.ЗаписатьБезОбработки("" + ВыбранныеПоля.Количество() + ": "); ЭтоПервоеПоле = Истина; Для Каждого СтрокаПоля Из ВыбранныеПоля Цикл #Если Сервер И Не Сервер Тогда СтрокаПоля = ТаблицаПолей.Добавить(); #КонецЕсли Если Не ЭтоПервоеПоле Тогда Результат.ЗаписатьБезОбработки(", "); КонецЕсли; Результат.ЗаписатьБезОбработки(СтрокаПоля.ИмяПоля); ЭтоПервоеПоле = Ложь; КонецЦикла; КонецЕсли; Результат = Результат.Закрыть(); Возврат Результат; КонецФункции Функция РассчитатьИтогиИсторииПоТипам(Параметры) Экспорт ОтборВерсий = Параметры.ОтборВерсий; ИсторияДанныхМоя = ИсторияДанныхМоя(); Результат = Новый Структура("Типы, СостояниеСтрокТипы"); Если Параметры.ЭтаФорма <> Неопределено Тогда Результат.Вставить("СостояниеСтрокТипы", ирОбщий.ТабличноеПолеСостояниеСтрокЛкс(Параметры.ЭтаФорма.ЭлементыФормы.Типы, "ПолноеИмяМД")); КонецЕсли; мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда ОтборВерсий = Новый Структура; ИсторияДанныхМоя = ИсторияДанных; мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ИспользованиеИсторииДанныхИспользовать = Метаданные.СвойстваОбъектов.ИспользованиеИсторииДанных.Использовать; СтрокиМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0)); Типы.Очистить(); ИндикаторТипаМетаданных = ирОбщий.ПолучитьИндикаторПроцессаЛкс(СтрокиМетаОбъектов.Количество(), "Типы метаданных"); Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипаМетаданных); Единственное = СтрокаТаблицыМетаОбъектов.Единственное; Если Ложь Или ирОбщий.ЛиКорневойТипСсылкиЛкс(Единственное, Истина) Или ирОбщий.ЛиКорневойТипРегистраСведенийЛкс(Единственное) Или ирОбщий.ЛиКорневойТипКонстантыЛкс(Единственное) Тогда КоллекцияМетаданных = Метаданные[СтрокаТаблицыМетаОбъектов.Множественное]; ИндикаторТипаОбъектов = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаданных.Количество(), Единственное); Для Каждого ОбъектМД Из КоллекцияМетаданных Цикл ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипаОбъектов); #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Справочники.ирАлгоритмы; #КонецЕсли ПолноеИмя = ОбъектМД.ПолноеИмя(); Попытка НастройкиИстории = ИсторияДанныхМоя.ПолучитьНастройки(ОбъектМД); Исключение // В этой версии платформы не поддерживается этот корневой тип метаданных //ОписаниеОшибки = ОписаниеОшибки(); Продолжить; КонецПопытки; СтрокаТипаДанных = Типы.Добавить(); СтрокаТипаДанных.ТипМетаданных = ирОбщий.ПервыйФрагментЛкс(ПолноеИмя); СтрокаТипаДанных.ПолноеИмяМД = ПолноеИмя; СтрокаТипаДанных.ИмяМД = ОбъектМД.Имя; СтрокаТипаДанных.ПредставлениеМД = ОбъектМД.Представление(); СтрокаТипаДанных.ИспользованиеВМетаданных = ОбъектМД.ИсторияДанных = ИспользованиеИсторииДанныхИспользовать; СтрокаТипаДанных.Использование = СтрокаТипаДанных.ИспользованиеВМетаданных; ЗаполнитьНастройкиИсторииВСтрокеТипа(НастройкиИстории, ОбъектМД, СтрокаТипаДанных, ВычислятьПоля); СтрокаТипаДанных.ЕстьДоступ = ПравоДоступа("ЧтениеИсторииДанных", ОбъектМД); Если СтрокаТипаДанных.ЕстьДоступ И ВычислятьКоличествоВерсий Тогда ОтборВерсий.Вставить("Метаданные", ОбъектМД); СтрокаТипаДанных.КоличествоВерсий = ИсторияДанныхМоя.ВыбратьВерсии(ОтборВерсий,,, МаксКоличествоВерсий).Количество(); КонецЕсли; КонецЦикла; ирОбщий.ОсвободитьИндикаторПроцессаЛкс(); КонецЕсли; КонецЦикла; ирОбщий.ОсвободитьИндикаторПроцессаЛкс(); Типы.Сортировать("ПолноеИмяМД"); Если Параметры.ЭтаФорма = Неопределено Тогда Результат.Вставить("Типы", Типы.Выгрузить()); КонецЕсли; Возврат Результат; КонецФункции Функция ВыбратьВерсииПоОбъектуМД(Параметры) Экспорт ПолноеИмяМД = Параметры.ПолноеИмяМД; ОтборВерсий = Параметры.ОтборВерсий; ИсторияДанныхМоя = ИсторияДанныхМоя(); #Если Сервер И Не Сервер Тогда ИсторияДанныхМоя = ИсторияДанных; #КонецЕсли ОтборВерсий.Вставить("Метаданные", ирКэш.ОбъектМДПоПолномуИмениЛкс(ПолноеИмяМД)); ТаблицаВерсий = ИсторияДанныхМоя.ВыбратьВерсии(ОтборВерсий,,, МаксКоличествоВерсий); Результат = Новый Структура; Результат.Вставить("ТаблицаВерсий", ТаблицаВерсий); Возврат Результат; КонецФункции //ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла); //ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf"; //ирПортативный #Если Клиент Тогда //ирПортативный Контейнер = Новый Структура(); //ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер); //ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда //ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля); //ирПортативный ирПортативный.Открыть(); //ирПортативный КонецЕсли; //ирПортативный #Иначе //ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта //ирПортативный #КонецЕсли //ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий"); //ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш"); //ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер"); //ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный"); мПлатформа = ирКэш.Получить();