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