//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; Перем мПоследнийПрочитанныйОбъект Экспорт; Перем мСериализатор Экспорт; Процедура ОбработатьИсключениеПоОбъекту(ОбъектБД, ОписаниеОшибки, ВывестиСообщение = Истина) Экспорт СтрокаРезультата = РезультатОбработки.Добавить(); СтрокаРезультата.Порядок = СтрокаРезультата.НомерСтроки; СтрокаРезультата.ОписаниеОшибки = ОписаниеОшибки; Если ТипЗнч(ОбъектБД)= Тип("Строка") Тогда СтрокаРезультата.XML = ОбъектБД; СтрокаРезультата.КлючОбъекта = ОбъектБД; Иначе //СтрокаРезультата.XML = ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(ОбъектБД, Ложь); // На перерасчетах ЗаписьXML ошибку выдает. Видимо ошибка платформы. СтрокаРезультата.XML = ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(ОбъектБД, Истина); СтрокаРезультата.КлючОбъекта = ирОбщий.XMLКлючОбъектаБДЛкс(ОбъектБД, Истина); Если ТипЗнч(ОбъектБД) = Тип("УдалениеОбъекта") Тогда СтрокаРезультата.Таблица = ОбъектБД.Ссылка.Метаданные().ПолноеИмя(); Иначе СтрокаРезультата.Таблица = ОбъектБД.Метаданные().ПолноеИмя(); КонецЕсли; КонецЕсли; Если ВывестиСообщение Тогда ирОбщий.СообщитьЛкс("Ошибка обработки объекта """ + СтрокаРезультата.КлючОбъекта + """: " + ОписаниеОшибки, СтатусСообщения.Внимание); КонецЕсли; КонецПроцедуры Функция ВыполнитьВыгрузку() Экспорт РезультатОбработки.Очистить(); ПараметрыОбработки = Новый Структура; ПередВыгрузкойВсех(ПараметрыОбработки); КоличествоОбъектов = ирОбщий.ПолучитьКоличествоИзмененийПоУзлуЛкс(УзелВыборкиДанных); Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоОбъектов, "Выборка"); ВыборкаОбъектов = ПланыОбмена.ВыбратьИзменения(УзелВыборкиДанных, УзелВыборкиДанных.НомерОтправленного + 1); Пока ВыборкаОбъектов.Следующий() Цикл ирОбщий.ОбработатьИндикаторЛкс(Индикатор); ОбъектБД = ВыборкаОбъектов.Получить(); ВыгрузитьОбъектВыборки(ОбъектБД, ПараметрыОбработки); КонецЦикла; ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина); Результат = ПослеВыгрузкиВсех(ПараметрыОбработки); Возврат Результат; КонецФункции Процедура ВыгрузитьОбъектВыборки(Знач ОбъектБД, Знач Параметры) Экспорт ВыгрузитьОбъектБД(Параметры.ЗаписьXML, ОбъектБД, Параметры.СчетчикВыгруженныхОбъектов); Если Параметры.ВыгружатьДвиженияВместеСДокументами Тогда ОбъектМД = ирОбщий.МетаданныеОбъектаБДЛкс(ОбъектБД); Если ирОбщий.ЛиКорневойТипДокументаЛкс(ирОбщий.ПервыйФрагментЛкс(ОбъектМД.ПолноеИмя())) Тогда ОбъектыМД = ирОбщий.ПолучитьМетаданныеНаборовЗаписейПоРегистраторуЛкс(ОбъектМД); Для Каждого МетаРегистр Из ОбъектыМД Цикл ПолноеИмяМДРегистра = МетаРегистр.ПолноеИмя(); ИмяТаблицыБДРегистра = ирОбщий.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМДРегистра); ИмяПоляОтбора = ирОбщий.ИмяПоляОтбораПодчиненногоНабораЗаписейЛкс(ИмяТаблицыБДРегистра); НаборЗаписей = ирОбщий.ОбъектБДПоКлючуЛкс(ПолноеИмяМДРегистра, Новый Структура(ИмяПоляОтбора, ОбъектБД.Ссылка)); ВыгрузитьОбъектБД(Параметры.ЗаписьXML, НаборЗаписей.Методы, Параметры.СчетчикВыгруженныхОбъектов); КонецЦикла; КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ВыгрузитьОбъектБД(Знач ЗаписьXML, Знач ОбъектБД, СчетчикВыгруженныхОбъектов) Попытка Успех = Истина; ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(ОбъектБД, ИспользоватьXDTO,,, ЗаписьXML, мСериализатор); Исключение Успех = Ложь; ОбработатьИсключениеПоОбъекту(ОбъектБД, ОписаниеОшибки()); Если Не ПропускатьОшибки Тогда ВызватьИсключение; КонецЕсли; КонецПопытки; Если Успех Тогда СчетчикВыгруженныхОбъектов = СчетчикВыгруженныхОбъектов + 1; КонецЕсли; КонецПроцедуры // ВыполнитьВыгрузку() Функция ВыполнитьЗагрузку() Экспорт Если ЭтоАдресВременногоХранилища(ИмяФайла) Тогда ИмяФайлаИсточника = ПолучитьИмяВременногоФайла("zip"); ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИмяФайла); #Если Сервер И Не Сервер Тогда ДвоичныеДанные = Новый ДвоичныеДанные; #КонецЕсли ДвоичныеДанные.Записать(ИмяФайлаИсточника); Иначе ИмяФайлаИсточника = ИмяФайла; КонецЕсли; Попытка РезультатОбработки.Очистить(); ИмяВременногоКаталога = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяВременногоКаталога); ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайлаИсточника); ЧтениеZip.ИзвлечьВсе(ИмяВременногоКаталога); ФайлИнфо = Новый файл(ИмяВременногоКаталога + "\Info.xml"); Если Не ФайлИнфо.Существует() Тогда Если ИмяФайлаИсточника <> ИмяФайла Тогда УдалитьФайлы(ИмяФайлаИсточника); КонецЕсли; Возврат "Неверный формат файла данных!"; КонецЕсли; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ФайлИнфо.ПолноеИмя); ИнфоДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); #Если Сервер И Не Сервер Тогда ИнфоДанных = Новый Структура; #КонецЕсли ИмяФайлаДанных = ИмяВременногоКаталога + "\Data.xml"; Если ИнфоДанных.ИспользоватьXDTO Тогда Если ИнфоДанных.Свойство("ПредопределенныеДанные") И ирКэш.НомерРежимаСовместимостиЛкс() >= 803003 Тогда ПредопределенныеДанные = ИнфоДанных.ПредопределенныеДанные; #Если Сервер И Не Сервер Тогда ПредопределенныеДанные = Новый ТаблицаЗначений; #КонецЕсли СоответствиеЗаменыСсылок = ЗагрузитьТаблицуПредопределенных(ПредопределенныеДанные); СсылкиДляПодмены = ПредопределенныеДанные.НайтиСтроки(Новый Структура("ТребуетЗамены", Истина)); ирОбщий.СообщитьЛкс("В файле присутствуют ссылки на " + ПредопределенныеДанные.Количество() + " предопределенных элементов источника. Из них " + СсылкиДляПодмены.Количество() + " имеют сопоставление (остальные совпадают)."); Если СсылкиДляПодмены.Количество() > 0 Тогда Если СопоставлятьПредопределенные Тогда ирОбщий.СообщитьЛкс("При загрузке будет выполнена подмена ссылок сопоставленных предопределенных элементов."); ОбработатьСсылкиПредопределенных(ИмяФайлаДанных, СоответствиеЗаменыСсылок); Иначе ирОбщий.СообщитьЛкс("При загрузке НЕ будет выполнена подмена ссылок сопоставленных предопределенных элементов."); КонецЕсли; КонецЕсли; КонецЕсли; Иначе Если СопоставлятьПредопределенные Тогда ирОбщий.СообщитьЛкс("Файл был выгружен без использования XDTO. Поэтому в нем отсутствует информация для сопоставления предопределенных элементов."); КонецЕсли; КонецЕсли; ФайлДанных = Новый файл(ИмяФайлаДанных); Если Не ФайлИнфо.Существует() Тогда Если ИмяФайлаИсточника <> ИмяФайла Тогда УдалитьФайлы(ИмяФайлаИсточника); КонецЕсли; Возврат "Неверный формат файла данных!"; КонецЕсли; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ФайлДанных.ПолноеИмя); ЧтениеXML.Прочитать(); Если ЧтениеXML.ЛокальноеИмя <> "IRData" Тогда ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяВременногоКаталога); Если ИмяФайлаИсточника <> ИмяФайла Тогда УдалитьФайлы(ИмяФайлаИсточника); КонецЕсли; Возврат "Неверный формат файла данных!"; КонецЕсли; ЧтениеXML.Прочитать(); ирОбщий.СообщитьЛкс("В файле данных заявлено " + ИнфоДанных.КоличествоОбъектов + " объектов"); Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ИнфоДанных.КоличествоОбъектов, "Загрузка"); СчетчикСчитанныхОбъектов = 0; Пока Истина Цикл ирОбщий.ОбработатьИндикаторЛкс(Индикатор, СчетчикСчитанныхОбъектов); Если ИнфоДанных.ИспользоватьXDTO Тогда Если Не СериализаторXDTO.ВозможностьЧтенияXML(ЧтениеXML) Тогда Прервать; КонецЕсли; ОбъектБД = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); Иначе Если Не ВозможностьЧтенияXML(ЧтениеXML) Тогда Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ОписаниеОшибки = "Неизвестный тип элемента XML: " + ЧтениеXML.Имя; Если Не ПропускатьОшибки Тогда ВызватьИсключение ОписаниеОшибки; Иначе ОбработатьИсключениеПоОбъекту(ЧтениеXML.Имя, ОписаниеОшибки); ЧтениеXML.Пропустить(); Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда ЧтениеXML.Прочитать(); КонецЕсли; Продолжить; КонецЕсли; Иначе Прервать; КонецЕсли; КонецЕсли; ОбъектБД = ПрочитатьXML(ЧтениеXML); КонецЕсли; СчетчикСчитанныхОбъектов = СчетчикСчитанныхОбъектов + 1; #Если Сервер И Не Сервер Тогда ОбъектБД = Справочники.ирАлгоритмы.СоздатьЭлемент(); #КонецЕсли Попытка Отправитель = ОбъектБД.ОбменДанными.Отправитель; Исключение // Элемент плана обмена в 8.3.5+ Отправитель = Неопределено; КонецПопытки; Если Отправитель <> Неопределено Тогда ОбъектБД.ОбменДанными.Отправитель = УзелОтправитель; КонецЕсли; ЭтотОбъект.мПоследнийПрочитанныйОбъект = ОбъектБД; Попытка ирОбщий.ЗаписатьОбъектЛкс(ОбъектБД,,,, Истина); Успех = Истина; Исключение Успех = Ложь; ОбработатьИсключениеПоОбъекту(ОбъектБД, ОписаниеОшибки()); Если Не ПропускатьОшибки Тогда ВызватьИсключение; КонецЕсли; КонецПопытки; КонецЦикла; ЧтениеXML.Закрыть(); ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина); УдалитьФайлы(ИмяВременногоКаталога); ЭтотОбъект.мПоследнийПрочитанныйОбъект = Неопределено; Если СчетчикСчитанныхОбъектов <> ИнфоДанных.КоличествоОбъектов Тогда Если ИмяФайлаИсточника <> ИмяФайла Тогда УдалитьФайлы(ИмяФайлаИсточника); КонецЕсли; Возврат "Считано объектов " + XMLСтрока(СчетчикСчитанныхОбъектов) + " из " + XMLСтрока(ИнфоДанных.КоличествоОбъектов) + " заявленных!"; КонецЕсли; Исключение Если ИмяФайлаИсточника <> ИмяФайла Тогда УдалитьФайлы(ИмяФайлаИсточника); КонецЕсли; ВызватьИсключение; КонецПопытки; Возврат Истина; КонецФункции // ВыполнитьВыгрузку() Процедура ПередВыгрузкойВсех(Параметры) Экспорт #Если Сервер И Не Сервер Тогда Параметры = Новый Структура; #КонецЕсли мСериализатор = Неопределено; Если ИспользоватьXDTO И ирКэш.НомерРежимаСовместимостиЛкс() >= 803003 Тогда ИнициализироватьСериализаторXDTOСАннотациейТипов(); КонецЕсли; ИмяВременногоКаталога = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяВременногоКаталога); ФайлДанных = Новый файл(ИмяВременногоКаталога + "\Data.xml"); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ФайлДанных.ПолноеИмя, "UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента("IRData"); //ЗаписьXML.ЗаписатьНачалоЭлемента("_1CV8DtUD", "http://www.1c.ru/V8/1CV8DtUD/"); //ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("V8Exch", "http://www.1c.ru/V8/1CV8DtUD/"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("core", "http://v8.1c.ru/data"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); СчетчикВыгруженныхОбъектов = 0; Если Не Параметры.Свойство("ИмяФайла") Тогда Параметры.Вставить("ИмяФайла", ИмяФайла); КонецЕсли; Если Не Параметры.Свойство("ЗаписьXML") Тогда Параметры.Вставить("ЗаписьXML", ЗаписьXML); КонецЕсли; Если Не Параметры.Свойство("ФайлДанных") Тогда Параметры.Вставить("ФайлДанных", ФайлДанных); КонецЕсли; Если Не Параметры.Свойство("ВыгружатьДвиженияВместеСДокументами") Тогда Параметры.Вставить("ВыгружатьДвиженияВместеСДокументами", ВыгружатьДвиженияВместеСДокументами); КонецЕсли; Если Не Параметры.Свойство("ИмяВременногоКаталога") Тогда Параметры.Вставить("ИмяВременногоКаталога", ИмяВременногоКаталога); КонецЕсли; Если Не Параметры.Свойство("СчетчикВыгруженныхОбъектов") Тогда Параметры.Вставить("СчетчикВыгруженныхОбъектов", СчетчикВыгруженныхОбъектов); КонецЕсли; Если Не Параметры.Свойство("мСериализатор") Тогда Параметры.Вставить("мСериализатор", мСериализатор); КонецЕсли; #Если Клиент Тогда Пустышка = Новый ЗаписьТекста(Параметры.ИмяФайла); #КонецЕсли КонецПроцедуры Функция ПослеВыгрузкиВсех(Параметры) Экспорт #Если Сервер И Не Сервер Тогда Параметры = Новый Структура; #КонецЕсли ИнфоДанных = Новый Структура; ИнфоДанных.Вставить("КоличествоОбъектов", Параметры.СчетчикВыгруженныхОбъектов); ИнфоДанных.Вставить("ИспользоватьXDTO", ИспользоватьXDTO); ирОбщий.СообщитьЛкс("Выгружено объектов " + XMLСтрока(Параметры.СчетчикВыгруженныхОбъектов)); Параметры.ЗаписьXML.ЗаписатьКонецЭлемента(); Параметры.ЗаписьXML.Закрыть(); Если ИспользоватьXDTO И ирКэш.НомерРежимаСовместимостиЛкс() >= 803003 Тогда ТаблицаПредопределенных = ИнициализироватьТаблицуПредопределенных(); #Если Сервер И Не Сервер Тогда ТаблицаПредопределенных = Новый ТаблицаЗначений; #КонецЕсли ОбработатьСсылкиПредопределенных(Параметры.ФайлДанных.ПолноеИмя,, ТаблицаПредопределенных); ТаблицаПредопределенных.Сортировать("ИмяТаблицы, ИмяПредопределенныхДанных"); ТаблицаПредопределенных.Колонки.Удалить("Ссылка"); ИнфоДанных.Вставить("ПредопределенныеДанные", ТаблицаПредопределенных); КонецЕсли; ФайлИнфо = Новый файл(Параметры.ИмяВременногоКаталога + "\Info.xml"); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ФайлИнфо.ПолноеИмя); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ИнфоДанных); ЗаписьXML.Закрыть(); #Если Клиент Тогда ИмяФайлаРезультата = Параметры.ИмяФайла; #Иначе ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("zip"); #КонецЕсли ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайлаРезультата); ЗаписьZIP.Добавить(Параметры.ФайлДанных.ПолноеИмя); ЗаписьZIP.Добавить(ФайлИнфо.ПолноеИмя); ЗаписьZIP.Записать(); УдалитьФайлы(Параметры.ИмяВременногоКаталога); ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаРезультата); УдалитьФайлы(ИмяФайлаРезультата); Возврат ДвоичныеДанные; КонецФункции // Возвращает СериализаторXDTO с аннотацией типов. // // Возвращаемое значение: // СериализаторXDTO - сериализатор. // Процедура ИнициализироватьСериализаторXDTOСАннотациейТипов() ТипыСАннотациейСсылок = ПредопределенныеТипыПриВыгрузке(); Если ТипыСАннотациейСсылок.Количество() > 0 Тогда Фабрика = ПолучитьФабрикуСУказаниемТипов(ТипыСАннотациейСсылок); мСериализатор = Новый СериализаторXDTO(Фабрика); КонецЕсли; КонецПроцедуры Функция ПредопределенныеТипыПриВыгрузке() Типы = Новый Массив; Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл Типы.Добавить(ОбъектМетаданных); КонецЦикла; Для Каждого ОбъектМетаданных Из Метаданные.ПланыСчетов Цикл Типы.Добавить(ОбъектМетаданных); КонецЦикла; Для Каждого ОбъектМетаданных Из Метаданные.ПланыВидовХарактеристик Цикл Типы.Добавить(ОбъектМетаданных); КонецЦикла; Для Каждого ОбъектМетаданных Из Метаданные.ПланыВидовРасчета Цикл Типы.Добавить(ОбъектМетаданных); КонецЦикла; Возврат Типы; КонецФункции // Возвращает фабрику с указанием типов. // // Параметры: // Типы - ФиксированныйМассив (Метаданные) - массив типов. // // Возвращаемое значение: // ФабрикаXDTO - фабрика. // Функция ПолучитьФабрикуСУказаниемТипов(Знач Типы) НаборСхем = ФабрикаXDTO.ЭкспортСхемыXML("http://v8.1c.ru/8.1/data/enterprise/current-config"); Схема = НаборСхем[0]; Схема.ОбновитьЭлементDOM(); УказанныеТипы = Новый Соответствие; Для каждого Тип Из Типы Цикл УказанныеТипы.Вставить(ирОбщий.XMLТипСсылкиЛкс(Тип), Истина); КонецЦикла; ПространствоИмен = Новый Соответствие; ПространствоИмен.Вставить("xs", "http://www.w3.org/2001/XMLSchema"); РазыменовательПространствИменDOM = Новый РазыменовательПространствИменDOM(ПространствоИмен); ТекстXPath = "/xs:schema/xs:complexType/xs:sequence/xs:element[starts-with(@type,'tns:')]"; Запрос = Схема.ДокументDOM.СоздатьВыражениеXPath(ТекстXPath, РазыменовательПространствИменDOM); Результат = Запрос.Вычислить(Схема.ДокументDOM); Пока Истина Цикл УзелПоля = Результат.ПолучитьСледующий(); Если УзелПоля = Неопределено Тогда Прервать; КонецЕсли; АтрибутТип = УзелПоля.Атрибуты.ПолучитьИменованныйЭлемент("type"); ТипБезNSПрефикса = Сред(АтрибутТип.ТекстовоеСодержимое, СтрДлина("tns:") + 1); Если УказанныеТипы.Получить(ТипБезNSПрефикса) = Неопределено Тогда Продолжить; КонецЕсли; УзелПоля.УстановитьАтрибут("nillable", "true"); УзелПоля.УдалитьАтрибут("type"); КонецЦикла; ЗаписьXML = Новый ЗаписьXML; ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("xsd"); ЗаписьXML.ОткрытьФайл(ИмяФайлаСхемы); ЗаписьDOM = Новый ЗаписьDOM; ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXML); ЗаписьXML.Закрыть(); Фабрика = СоздатьФабрикуXDTO(ИмяФайлаСхемы); Попытка УдалитьФайлы(ИмяФайлаСхемы); Исключение КонецПопытки; Возврат Фабрика; КонецФункции Функция ИнициализироватьТаблицуПредопределенных() ТаблицаПредопределенных = Новый ТаблицаЗначений; ТаблицаПредопределенных.Колонки.Добавить("ИмяТаблицы"); ТаблицаПредопределенных.Колонки.Добавить("Ссылка"); ТаблицаПредопределенных.Колонки.Добавить("УИД", Новый ОписаниеТипов("Строка")); ТаблицаПредопределенных.Колонки.Добавить("ИмяПредопределенныхДанных"); ТаблицаПредопределенных.Индексы.Добавить("Ссылка"); Возврат ТаблицаПредопределенных; КонецФункции Функция ЗагрузитьТаблицуПредопределенных(ТаблицаПредопределенных) #Если Сервер И Не Сервер Тогда ТаблицаПредопределенных = Новый ТаблицаЗначений; #КонецЕсли СоответствиеЗаменыСсылок = Новый Соответствие; ИменаТаблицСсылок = ТаблицаПредопределенных.Скопировать(, "ИмяТаблицы"); ИменаТаблицСсылок.Свернуть("ИмяТаблицы"); ИменаТаблицСсылок = ИменаТаблицСсылок.ВыгрузитьКолонку(0); ТаблицаПредопределенных.Колонки.Добавить("ТребуетЗамены", Новый ОписаниеТипов("Булево")); Для Каждого ИмяТаблицы Из ИменаТаблицСсылок Цикл СтрокиСсылок = ТаблицаПредопределенных.НайтиСтроки(Новый Структура("ИмяТаблицы", ИмяТаблицы)); ИменаПредопределенныхДанных = ТаблицаПредопределенных.Скопировать(СтрокиСсылок, "ИмяПредопределенныхДанных").ВыгрузитьКолонку(0); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Т.Ссылка, Т.ИмяПредопределенныхДанных ИЗ " + ИмяТаблицы + " КАК Т ГДЕ Т.ИмяПредопределенныхДанных в (&ИменаПредопределенныхДанных) И Т.Предопределенный"; Запрос.УстановитьПараметр("ИменаПредопределенныхДанных", ИменаПредопределенныхДанных); ПредопределенныеСсылки = Запрос.Выполнить().Выгрузить(); Для Каждого СтрокаСсылки Из СтрокиСсылок Цикл СтрокаПредопределенного = ПредопределенныеСсылки.Найти(СтрокаСсылки.ИмяПредопределенныхДанных, "ИмяПредопределенныхДанных"); Если СтрокаПредопределенного = Неопределено Тогда Продолжить; КонецЕсли; УИДНовый = "" + СтрокаПредопределенного.Ссылка.УникальныйИдентификатор(); Если СтрокаСсылки.УИД <> УИДНовый Тогда СтрокаСсылки.ТребуетЗамены = Истина; XMLТип = ирОбщий.XMLТипСсылкиЛкс(СтрокаПредопределенного.Ссылка); СоответствиеТипа = СоответствиеЗаменыСсылок.Получить(XMLТип); Если СоответствиеТипа = Неопределено Тогда СоответствиеТипа = Новый Соответствие; СоответствиеТипа.Вставить(СтрокаСсылки.УИД, УИДНовый); СоответствиеЗаменыСсылок.Вставить(XMLТип, СоответствиеТипа); Иначе СоответствиеТипа.Вставить(СтрокаСсылки.УИД, УИДНовый); КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; Возврат СоответствиеЗаменыСсылок; КонецФункции Процедура ОбработатьСсылкиПредопределенных(ИмяФайла, СоответствиеЗаменыСсылок = Неопределено, ТаблицаПредопределенных = Неопределено) #Если Сервер И Не Сервер Тогда ТаблицаПредопределенных = Новый ТаблицаЗначений; СоответствиеЗаменыСсылок = Новый Соответствие; #КонецЕсли ПотокЧтения = Новый ЧтениеТекста(ИмяФайла); РежимЗаполненияТаблицы = СоответствиеЗаменыСсылок = Неопределено; Если Не РежимЗаполненияТаблицы Тогда ВременныйФайл = ПолучитьИмяВременногоФайла("xml"); ПотокЗаписи = Новый ЗаписьТекста(ВременныйФайл); КонецЕсли; НачалоТипа = "xsi:type=""v8:"; ДлинаНачалаТипа = СтрДлина(НачалоТипа); КонецТипа = """>"; ДлинаКонцаТипа = СтрДлина(КонецТипа); ИсходнаяСтрока = ПотокЧтения.ПрочитатьСтроку(); Пока ИсходнаяСтрока <> Неопределено Цикл ОстатокСтроки = Неопределено; ТекущаяПозиция = 1; ПозицияТипа = Найти(ИсходнаяСтрока, НачалоТипа); Пока ПозицияТипа > 0 Цикл Если Не РежимЗаполненияТаблицы Тогда ПотокЗаписи.Записать(Сред(ИсходнаяСтрока, ТекущаяПозиция, ПозицияТипа - 1 + ДлинаНачалаТипа)); КонецЕсли; ОстатокСтроки = Сред(ИсходнаяСтрока, ТекущаяПозиция + ПозицияТипа + ДлинаНачалаТипа - 1); ТекущаяПозиция = ТекущаяПозиция + ПозицияТипа + ДлинаНачалаТипа - 1; ПозицияКонцаТипа = Найти(ОстатокСтроки, КонецТипа); Если ПозицияКонцаТипа = 0 Тогда Прервать; КонецЕсли; ИмяТипа = Лев(ОстатокСтроки, ПозицияКонцаТипа - 1); Если Не ирОбщий.ЛиКорневойТипОбъектаСПредопределеннымЛкс(ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(Тип(ИмяТипа))) Тогда Прервать; КонецЕсли; ИсходнаяСсылкаXML = Сред(ОстатокСтроки, ПозицияКонцаТипа + ДлинаКонцаТипа, 36); Если РежимЗаполненияТаблицы Тогда Ссылка = СериализаторXDTO.XMLЗначение(Тип(ИмяТипа), ИсходнаяСсылкаXML); Если ЗначениеЗаполнено(Ссылка) И ТаблицаПредопределенных.Найти(Ссылка, "Ссылка") = Неопределено Тогда СтрокаПредопределенного = ТаблицаПредопределенных.Добавить(); СтрокаПредопределенного.ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя(); СтрокаПредопределенного.Ссылка = Ссылка; КонецЕсли; Иначе СоответствиеЗамены = СоответствиеЗаменыСсылок.Получить(ИмяТипа); Если СоответствиеЗамены = Неопределено Тогда ПозицияТипа = Найти(ОстатокСтроки, НачалоТипа); Продолжить; КонецЕсли; ПотокЗаписи.Записать(ИмяТипа); ПотокЗаписи.Записать(КонецТипа); НайденнаяСсылкаXML = СоответствиеЗамены.Получить(ИсходнаяСсылкаXML); Если НайденнаяСсылкаXML = Неопределено Тогда ПотокЗаписи.Записать(ИсходнаяСсылкаXML); Иначе ПотокЗаписи.Записать(НайденнаяСсылкаXML); КонецЕсли; КонецЕсли; ТекущаяПозиция = ТекущаяПозиция + ПозицияКонцаТипа - 1 + ДлинаКонцаТипа + 36; ОстатокСтроки = Сред(ОстатокСтроки, ПозицияКонцаТипа + ДлинаКонцаТипа + 36); ПозицияТипа = Найти(ОстатокСтроки, НачалоТипа); КонецЦикла; Если Не РежимЗаполненияТаблицы Тогда Если ОстатокСтроки <> Неопределено Тогда ПотокЗаписи.ЗаписатьСтроку(ОстатокСтроки); Иначе ПотокЗаписи.ЗаписатьСтроку(ИсходнаяСтрока); КонецЕсли; КонецЕсли; ИсходнаяСтрока = ПотокЧтения.ПрочитатьСтроку(); КонецЦикла; ПотокЧтения.Закрыть(); Если РежимЗаполненияТаблицы Тогда ИменаТаблицСсылок = ТаблицаПредопределенных.Скопировать(, "ИмяТаблицы"); ИменаТаблицСсылок.Свернуть("ИмяТаблицы"); ИменаТаблицСсылок = ИменаТаблицСсылок.ВыгрузитьКолонку(0); Для Каждого ИмяТаблицы Из ИменаТаблицСсылок Цикл СтрокиСсылок = ТаблицаПредопределенных.НайтиСтроки(Новый Структура("ИмяТаблицы", ИмяТаблицы)); СсылкиВТаблице = ТаблицаПредопределенных.Скопировать(СтрокиСсылок, "Ссылка").ВыгрузитьКолонку(0); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Т.Ссылка, Т.ИмяПредопределенныхДанных ИЗ " + ИмяТаблицы + " КАК Т ГДЕ Т.Ссылка в (&Ссылки) И Т.Предопределенный"; Запрос.УстановитьПараметр("Ссылки", СсылкиВТаблице); ПредопределенныеСсылки = Запрос.Выполнить().Выгрузить(); Для Каждого СтрокаСсылки Из СтрокиСсылок Цикл СтрокаПредопределенного = ПредопределенныеСсылки.Найти(СтрокаСсылки.Ссылка, "Ссылка"); Если СтрокаПредопределенного = Неопределено Тогда ТаблицаПредопределенных.Удалить(СтрокаСсылки); Иначе СтрокаСсылки.ИмяПредопределенныхДанных = СтрокаПредопределенного.ИмяПредопределенныхДанных; СтрокаСсылки.УИД = СтрокаСсылки.Ссылка.УникальныйИдентификатор(); КонецЕсли; КонецЦикла; КонецЦикла; Иначе ПотокЗаписи.Закрыть(); ИмяФайла = ВременныйФайл; КонецЕсли; КонецПроцедуры //ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла); //ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf"; //ирПортативный #Если Клиент Тогда //ирПортативный Контейнер = Новый Структура(); //ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер); //ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда //ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля); //ирПортативный ирПортативный.Открыть(); //ирПортативный КонецЕсли; //ирПортативный #Иначе //ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта //ирПортативный #КонецЕсли //ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий"); //ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш"); //ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер"); //ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный"); ЭтотОбъект.ВыполнятьНаСервере = ирОбщий.ПолучитьРежимОбъектыНаСервереПоУмолчаниюЛкс(Ложь); ЭтотОбъект.ИспользоватьXDTO = Истина;