RDT1C/DataProcessors/ирИмитаторСсылочныйОбъект/Ext/ObjectModule.bsl
Администратор e3d52e53a4 Общее
*Во внутреннем описании платформы исправлен тип для свойства "РегистрРасчетаМенеджер.<Имя регистра расчета>.Перерасчеты"
        *Исправлены ошибки открытия управляемых форм в клиент-серверном режиме
    Подбор и обработка объектов
        *Исправлена ошибка в обработке "Выгрузка данных" при включенном флажке "Запись на сервере"
    Конструктор запроса
        *Исправлена некорректная расстановка отступов в многострочных параметрах виртуальных таблиц
        *Исправлено удаление выражения выбора всех полей таблицы (*) при неизвестном составе ее доступных полей
    Загрузка табличных данных
        *Исправлена ошибка выполнения обработчика конвертации значения колонки
    Удаление объектов с контролем ссылок
        *Ускорен этап чтения пометок удаления
    Консоль запросов
        *При выполнении запроса компоновки с настройками теперь выбрасывается исключение, если наложенный отбор не позволяет размаскировать временные таблицы запроса
    Редактор объекта БД
        *Исправлена ошибка команды "Передать для обработки" записи независимого регистра
        *Исправлена ошибка активизации страницы "Изменения на узлах" для регистров
2017-12-24 23:16:38 +03:00

297 lines
15 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.

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