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