RDT1C/DataProcessors/ирИмитаторСсылочныйОбъект/Ext/ObjectModule.bsl
Администратор 5df4dd76c5 Редактор параметров сеанса
*Исправлена ошибка открытия формы при наличии параметров с запретом изменения
    Консоль запросов
        *Исправлено заполнение колонок текущих типов значений параметров при открытии снимка запроса
    Редактор хранилища значения
        *Исправлена невозможность редактировать текст в поле ввода
    Редактор предопределенных
        +При создании объекта теперь запрашивается выбор "элемент или группа"
    Редактор объекта БД
        +Команды "Новый объект" и "Новая группа" теперь предлагают сохранять уникальный идентификатор текущего нового объекта/группы
        *Исправлена свежая потеря ссылки нового при включенном флажке "Запись на сервере"
        *Исправлена свежая ошибка удаления объекта
        +В управляемой форме
            реализована поддержка реквизитов типа ХранилищеЗначения
            сделаны все закладки
            сделаны почти все команды
2017-09-25 00:12:25 +03:00

240 lines
12 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.

//Перем ДополнительныеСвойства Экспорт;
//Перем ОбменДанными Экспорт;
Перем _СчитанныйСнимок Экспорт;
Перем _Тип Экспорт;
Перем _СсылкаНового Экспорт;
Процедура Конструктор(Объект) Экспорт
ЭтотОбъект.ДополнительныеСвойства = Объект.ДополнительныеСвойства;
ЭтотОбъект.ОбменДанными = ирОбщий.СтруктураОбменаДаннымиОбъектаЛкс(Объект);
ЭтотОбъект.Ссылка = Объект.Ссылка;
ЭтотОбъект._Тип = ТипЗнч(Объект);
Если Не Объект.Модифицированность() Тогда
ЭтотОбъект._СчитанныйСнимок = Снимок();
КонецЕсли;
Если Объект.Ссылка.Пустая() Тогда
ЭтотОбъект._СсылкаНового = Объект.ПолучитьСсылкуНового();
КонецЕсли;
ОбъектМД = Объект.Метаданные();
ЕстьЭтоГруппа = ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(ОбъектМД);
ПоляТаблицыБД = ирОбщий.ПолучитьПоляТаблицыМДЛкс(ОбъектМД);
Данные = Новый Структура;
ПоляШапки = Новый Массив;
Для Каждого СтрокаПоля Из ПоляТаблицыБД Цикл
Если Истина
И ЕстьЭтоГруппа
И СтрокаПоля.Метаданные <> Неопределено
И ОбъектМД.Реквизиты.Найти(СтрокаПоля.Метаданные.Имя) <> Неопределено
Тогда
МетаРеквизит = СтрокаПоля.Метаданные;
Если Ложь
Или (Истина
И Не Объект.ЭтоГруппа
И МетаРеквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы)
Или (Истина
И Объект.ЭтоГруппа
И МетаРеквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента)
Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Данные.Вставить(СтрокаПоля.Имя);
Если СтрокаПоля.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда
Данные.Вставить(СтрокаПоля.Имя, Объект[СтрокаПоля.Имя].Выгрузить());
Иначе
ПоляШапки.Добавить(СтрокаПоля.Имя);
КонецЕсли;
КонецЦикла;
ЗаполнитьЗначенияСвойств(Данные, Объект, ирОбщий.ПолучитьСтрокуСРазделителемИзМассиваЛкс(ПоляШапки));
ЭтотОбъект.Данные = Данные;
КонецПроцедуры
Функция Снимок() Экспорт
СтруктураОбъекта = Новый Структура;
СтруктураОбъекта.Вставить("ОбменДанными", ОбменДанными);
СтруктураОбъекта.Вставить("ДополнительныеСвойства", ДополнительныеСвойства);
СтруктураОбъекта.Вставить("Данные", Данные);
СтруктураОбъекта.Вставить("Ссылка", Ссылка);
СтруктураОбъекта.Вставить("_СчитанныйСнимок", _СчитанныйСнимок);
СтруктураОбъекта.Вставить("_Тип", _Тип);
СтруктураОбъекта.Вставить("_СсылкаНового", _СсылкаНового);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СтруктураОбъекта, НазначениеТипаXML.Явное);
Результат = ЗаписьJSON.Закрыть();
Возврат Результат;
КонецФункции
Процедура ЗагрузитьСнимок(Снимок) Экспорт
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Снимок);
СтруктураОбъекта = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
ЗаполнитьЗначенияСвойств(ЭтотОбъект, СтруктураОбъекта);
КонецПроцедуры
Функция КлючОбъекта()
Результат = Данные.Ссылка;
Если Истина
И Не ЗначениеЗаполнено(Результат)
И Данные.Свойство("ЭтоГруппа")
И Данные.ЭтоГруппа
Тогда
Результат = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ОбъектБД(ВосстановитьДанные = Истина) Экспорт
КлючОбъекта = КлючОбъекта();
Результат = ирОбщий.ОбъектБДПоКлючуЛкс(Метаданные.НайтиПоТипу(_Тип).ПолноеИмя(), КлючОбъекта).Данные;
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(ДополнительныеСвойства, Результат.ДополнительныеСвойства);
ирОбщий.ВосстановитьСтруктуруОбменаДаннымиОбъектаЛкс(Результат, ОбменДанными);
Если ВосстановитьДанные Тогда
Если Результат.Ссылка.Пустая() И ЗначениеЗаполнено(_СсылкаНового) Тогда
Результат.УстановитьСсылкуНового(_СсылкаНового);
КонецЕсли;
ЗаполнитьЗначенияСвойств(Результат, Данные);
СтруктураТЧ = ирОбщий.ПолучитьТабличныеЧастиОбъектаЛкс(Результат);
Для Каждого КлючИЗначение Из СтруктураТЧ Цикл
Результат[КлючИЗначение.Ключ].Загрузить(Данные[КлючИЗначение.Ключ]);
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьСсылкуНового() Экспорт
Возврат _СсылкаНового;
КонецФункции
Функция Модифицированность() Экспорт
Результат = _СчитанныйСнимок <> Снимок();
Возврат Результат;
КонецФункции
Функция ЭтоНовый() Экспорт
Результат = Данные.Ссылка.Пустая();
Возврат Результат;
КонецФункции
Функция ПолучитьКартуМаршрута() Экспорт
ОбъектБД = ОбъектБД();
Результат = ОбъектБД.ПолучитьКартуМаршрута();
Возврат Результат;
КонецФункции
Процедура Прочитать(НаСервере = Истина) Экспорт
Если НаСервере Тогда
Снимок = Снимок();
ирСервер.ПрочитатьОбъектЧерезИмитаторЛкс(Снимок, ТипЗнч(ЭтотОбъект));
ЗагрузитьСнимок(Снимок);
Иначе
ОбъектБД = ОбъектБД();
ОбъектБД.Прочитать();
Конструктор(ОбъектБД);
КонецЕсли;
КонецПроцедуры
Функция Скопировать(НаСервере = Истина) Экспорт
Если НаСервере Тогда
Снимок = Снимок();
Снимок = ирСервер.СкопироватьОбъектЧерезИмитаторЛкс(Снимок, ТипЗнч(ЭтотОбъект));
ИмитаторКопия = Новый (ТипЗнч(ЭтотОбъект));
ИмитаторКопия.ЗагрузитьСнимок(Снимок);
Результат = Новый Структура;
Результат.Вставить("Методы", ИмитаторКопия);
Результат.Вставить("Данные", ИмитаторКопия.Данные);
Иначе
ОбъектБД = ОбъектБД();
ОбъектКопия = ОбъектБД.Скопировать();
ИмитаторКопия = Новый (ТипЗнч(ЭтотОбъект));
ИмитаторКопия.Конструктор(ОбъектКопия);
Результат = ИмитаторКопия;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура Записать(РежимЗаписи = Неопределено, РежимПроведения = Неопределено) Экспорт
#Если Не Сервер Тогда
Снимок = Снимок();
ирСервер.ЗаписатьОбъектXMLЛкс(Снимок,, РежимЗаписи, РежимПроведения,,, ТипЗнч(ЭтотОбъект));
ЗагрузитьСнимок(Снимок);
#Иначе
ОбъектБД = ОбъектБД();
Если РежимЗаписи <> Неопределено Тогда
ОбъектБД.Записать(РежимЗаписи, РежимПроведения);
Иначе
ОбъектБД.Записать();
КонецЕсли;
Конструктор(ОбъектБД);
#КонецЕсли
КонецПроцедуры
Процедура УстановитьПометкуУдаления(НоваяПометка) Экспорт
Если НоваяПометка = Данные.ПометкаУдаления Тогда
Возврат;
КонецЕсли;
#Если Не Сервер Тогда
Снимок = Снимок();
ирСервер.ЗаписатьОбъектXMLЛкс(Снимок,, "ПометкаУдаления",,,, ТипЗнч(ЭтотОбъект));
ЗагрузитьСнимок(Снимок);
#Иначе
ОбъектБД = ОбъектБД(Ложь);
//Если ОбъектБД.Модифицированность() Тогда
// ОбъектБД.Прочитать(); // Сделать: Надо найти и убрать установку модифированности
//КонецЕсли;
ОбъектБД.УстановитьПометкуУдаления(НоваяПометка);
Конструктор(ОбъектБД);
#КонецЕсли
КонецПроцедуры
Процедура Удалить() Экспорт
#Если Не Сервер Тогда
Снимок = Снимок();
ирСервер.УдалитьОбъектЛкс(Снимок,, ТипЗнч(ЭтотОбъект));
#Иначе
ОбъектБД = ОбъектБД(Ложь);
ОбъектБД.Удалить();
#КонецЕсли
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ОбъектБД = ОбъектБД();
Отказ = Не ОбъектБД.ПроверитьЗаполнение();
Конструктор(ОбъектБД);
КонецПроцедуры
Функция ЗаменитьИдентификаторОбъекта() Экспорт
КонецФункции