RDT1C/DataProcessors/ирИмитаторСсылочныйОбъект/Ext/ObjectModule.bsl
Администратор 43c8f7dc73 Редактор объекта БД
*Исправлено несколько свежих ошибок
    Редактор констант
        *Исправлена ошибка нажатия кнопки "Функциональные опции"
    Консоль заданий
        +В форме регламентного задания реализована корректная работа с любыми типами значений параметров и для большинства типов редактирование
    Консоль запросов
        *Исправлена свежая ошибка выполнения запроса на создание временной таблицы
    Удаление объектов с контролем ссылок
        *Исправлена редкая ошибка поиска ссылок в таблице субконто
2017-09-11 22:47:24 +03:00

239 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Лкс(Снимок,, "ПометкаУдаления",,,, ТипЗнч(ЭтотОбъект));
ЗагрузитьСнимок(Снимок);
#Иначе
ОбъектБД = ОбъектБД(Ложь);
//Если ОбъектБД.Модифицированность() Тогда
// ОбъектБД.Прочитать(); // Сделать: Надо найти и убрать установку модифированности
//КонецЕсли;
ОбъектБД.УстановитьПометкуУдаления(НоваяПометка);
Конструктор(ОбъектБД);
#КонецЕсли
КонецПроцедуры
Процедура Удалить() Экспорт
#Если Не Сервер Тогда
Снимок = Снимок();
ирСервер.УдалитьОбъектЛкс(Снимок,, ТипЗнч(ЭтотОбъект));
#Иначе
ОбъектБД = ОбъектБД(Ложь);
ОбъектБД.Удалить();
#КонецЕсли
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ОбъектБД = ОбъектБД();
Отказ = Не ОбъектБД.ПроверитьЗаполнение();
Конструктор(ОбъектБД);
КонецПроцедуры
Функция ЗаменитьИдентификаторОбъекта() Экспорт
КонецФункции