//////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ МОДУЛЯ //////////////////////////////////////////////////////////////////////////////// Перем мЧтениеXML; Перем Параметры; Перем мТаблицаПравилВыгрузки, мТаблицаПравилКонвертацииОбъектов; Перем мИд, мНаименование, мДатаВремяСоздания, мКонфигурацияИсточник, мКонфигурацияПриемник, мВерсияФормата; Перем ВерсияПлатформыПриемника; Перем мКонвертацияПередВыгрузкойДанных; Перем мКонвертацияПередВыгрузкойОбъекта; Перем мКонвертацияПередКонвертациейОбъекта; Перем мКонвертацияПослеВыгрузкиОбъекта; Перем мКонвертацияПослеВыгрузкиДанных; Перем мКонвертацияПослеЗагрузкиПравилОбмена; Перем мКонвертацияПередЗагрузкойДанных; Перем мКонвертацияПередЗагрузкойОбъекта; Перем мКонвертацияПослеЗагрузкиОбъекта; Перем мКонвертацияПослеЗагрузкиДанных; Перем мПустоеЗначение; Перем мСчетчикВыгруженныхОбъектов; Перем мXMLАнализатор; Перем DOMDocument, rootNode; Перем мНачалоНовогоЭлемента, мИнструкцияОбработки, мКонецУровня, мКонецДокумента; Перем ТаблицаПараметровДляЗагрузки; Перем ТипыУсловийДляСтрок, ТипыУсловийДляЧисел, ТипыУсловийДляСправочников; Перем ТипОбъектаДляНастройкиОтбора; Перем ОбъектДляНастройкиОтбора; Перем КодПВДДляНастройкиОтбора; Перем ИмяПВДДляНастройкиОтбора; Перем СписокОшибок; Перем мИспользуемыеПравилаВыгрузки; // Список разделенных запятыми правил выгрузки данных, для которых необходимо включить пометку Перем ЗначенияДляОтбора[100]; // массив для хранения значений, используется для настройки отбора данных Перем ТаблицаРеквизитов; // таблица для хранения реквизитов, используется для настройки отбора данных //////////////////////////////////////////////////////////////////////////////// // ПРЕДВАРИТЕЛЬНОЕ ОПИСАНИЕ ПРОЦЕДУР И ФУНКЦИЙ //////////////////////////////////////////////////////////////////////////////// Функция ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО = "", УзелСсылки = "", ТолькоПолучитьУзелСсылки = 0, НомерПКО = 0) Далее Процедура ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, КоллекцияПКС, УзелКоллекцииСвойств = 0, ОбъектКоллекции = 0, ПравилоРодитель = "", ИмяПредопределенногоЭлемента = "", Знач ВыгрузитьТолькоСсылку = 0) Далее Функция НайтиПравило(Объект, ИмяПравила = "") Далее Функция ПривестиНомерКДлине(Знач Стр, Длина) Далее Функция ДобавитьКПрефиксу(Знач Стр, Добавок = "", Длина = "", Режим = "Слева") Далее Функция ПолучитьЗначение(Объект, Имя) Далее Функция ПолучитьДатуV8(ЧастьДата, ЧастьВремя = "00:00:00") Далее Функция СоздатьЗапрос(ОбъектВыборки, ТабОтбор) Далее Процедура СохранитьНастройкиОтбора() Далее Процедура ЗафиксироватьОшибку(ТекстОшибки) Далее Процедура УстановитьЗначениеПараметраКонвертации(ИмяПараметра, ЗначениеПараметра) Далее Процедура ЗагрузитьПравилаОбмена() Далее Процедура Выгрузить() Далее Функция СоздатьУзел(name) Далее Процедура УстановитьАтрибут(element, name, value) Далее Процедура ЗаписатьЭлемент(node, name, value = "") Далее Процедура ДобавитьПодчиненный(parentNode, childNode) Далее //////////////////////////////////////////////////////////////////////////////// // НАЧАЛО ОБРАБОТЧИКОВ //////////////////////////////////////////////////////////////////////////////// Функция Конвертация_ПередВыгрузкойДанных( ) Отказ = 0; Попытка спрФирмы = СоздатьОбъект("Справочник.Фирмы"); Параметры = СоздатьОбъект("СписокЗначений"); спрФирмы.НайтиПоКоду(9); Параметры.ДобавитьЗначение(спрФирмы.ТекущийЭлемент(), "ФирмаФОРУМ"); спрФирмы.НайтиПоКоду(10); Параметры.ДобавитьЗначение(спрФирмы.ТекущийЭлемент(), "ФирмаУКРСИББАНК"); спрФирмы.НайтиПоКоду(11); Параметры.ДобавитьЗначение(спрФирмы.ТекущийЭлемент(), "ФирмаОТПБАНК"); Исключение Сообщить("Ошибка исполнения обработчика: Конвертация_ПередВыгрузкойДанных", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: Конвертация_ПередВыгрузкойДанных" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // Конвертация_ПередВыгрузкойДанных() Функция Конвертация_ПередВыгрузкойОбъекта( ИмяПКО, Правило, Объект, ИсходящиеДанные, ВходящиеДанные) Отказ = 0; Попытка Если ТипЗначения(Объект) = 12 Тогда Если Параметры.НайтиЗначение(Объект.Фирма) = 0 Тогда Отказ = 1; КонецЕсли; КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: Конвертация_ПередВыгрузкойОбъекта", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: Конвертация_ПередВыгрузкойОбъекта" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // Конвертация_ПередВыгрузкойОбъекта() Функция ПКС_ПриВыгрузке_БанковскаяВыписка_РСчет_Реквизит7( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Значение = Источник.Фирма.Код; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_БанковскаяВыписка_РСчет_Реквизит7", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_БанковскаяВыписка_РСчет_Реквизит7" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_БанковскаяВыписка_РСчет_Реквизит7() Функция ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Заказ_Реквизит15( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Если (ТипЗначения(Источник.Заказ) = 11) Или (ТипЗначения(Источник.Заказ) = 12) Тогда ИмяПКО = Источник.Заказ.Вид(); КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Заказ_Реквизит15", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Заказ_Реквизит15" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Заказ_Реквизит15() Функция ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Субконто_Реквизит22( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Если (ТипЗначения(Источник.Субконто) = 11) Или (ТипЗначения(Источник.Субконто) = 12) Тогда ИмяПКО = Источник.Субконто.Вид(); КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Субконто_Реквизит22", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Субконто_Реквизит22" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_БанковскаяВыписка_ТабличнаяЧасть_Субконто_Реквизит22() Функция ПКС_ПриВыгрузке_ПриходныйКассовый_Заказ_Реквизит7( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Если (ТипЗначения(Источник.Заказ) = 11) Или (ТипЗначения(Источник.Заказ) = 12) Тогда ИмяПКО = Источник.Заказ.Вид(); КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_ПриходныйКассовый_Заказ_Реквизит7", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_ПриходныйКассовый_Заказ_Реквизит7" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_ПриходныйКассовый_Заказ_Реквизит7() Функция ПКС_ПриВыгрузке_ПриходныйКассовый_Субконто_Реквизит22( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Если (ТипЗначения(Источник.Субконто) = 11) Или (ТипЗначения(Источник.Субконто) = 12) Тогда ИмяПКО = Источник.Субконто.Вид(); КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_ПриходныйКассовый_Субконто_Реквизит22", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_ПриходныйКассовый_Субконто_Реквизит22" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_ПриходныйКассовый_Субконто_Реквизит22() Функция ПКС_ПриВыгрузке_РасходныйКассовый_Заказ_Реквизит7( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Если (ТипЗначения(Источник.Заказ) = 11) Или (ТипЗначения(Источник.Заказ) = 12) Тогда ИмяПКО = Источник.Заказ.Вид(); КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_РасходныйКассовый_Заказ_Реквизит7", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_РасходныйКассовый_Заказ_Реквизит7" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_РасходныйКассовый_Заказ_Реквизит7() Функция ПКС_ПриВыгрузке_РасходныйКассовый_Субконто_Реквизит22( Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства) Отказ = 0; Попытка Если (ТипЗначения(Источник.Субконто) = 11) Или (ТипЗначения(Источник.Субконто) = 12) Тогда ИмяПКО = Источник.Субконто.Вид(); КонецЕсли; Исключение Сообщить("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_РасходныйКассовый_Субконто_Реквизит22", "!!!"); Сообщить(" - " + ОписаниеОшибки()); ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПриВыгрузке_РасходныйКассовый_Субконто_Реквизит22" + ": " + ОписаниеОшибки()); КонецПопытки; Возврат Отказ; КонецФункции // ПКС_ПриВыгрузке_РасходныйКассовый_Субконто_Реквизит22() //////////////////////////////////////////////////////////////////////////////// // ОКОНЧАНИЕ ОБРАБОТЧИКОВ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ ЗАПИСИ "Msxml2.DOMDocument.4.0" //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция СоздатьУзел(name) newNode = DOMDocument.createNode(1, name, ""); Возврат newNode; КонецФункции // СоздатьУзел() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура УстановитьАтрибут(element, name, value) element.setAttribute(name, Строка(value)); КонецПроцедуры // УстановитьАтрибут() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗаписатьЭлемент(node, name, value = "") childNode = DOMDocument.createNode(1, name, ""); Попытка childNode.text = Строка(value); Исключение Сообщить("Не удалось записать элемент: "+name+", со значением: "+value); childNode.text = ""; КонецПопытки; node.appendChild(childNode); КонецПроцедуры // одЗаписатьЭлемент() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ДобавитьПодчиненный(parentNode, childNode) parentNode.appendChild(childNode); КонецПроцедуры // ДобавитьПодчиненный() //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // // Описание: // Процедура УстановитьЗначениеПараметраКонвертации(ИмяПараметра, ЗначениеПараметра) НомерСтроки = 0; Если ТаблицаНастройкиПараметров.НайтиЗначение(ИмяПараметра, НомерСтроки, "Имя") = 1 Тогда ТаблицаНастройкиПараметров.УстановитьЗначение(НомерСтроки, "Значение", ЗначениеПараметра) Иначе Сообщить("Значение параметра """ + ИмяПараметра + """ не установлено! Возможно, имя параметра указано не верно или параметр не редактируется в диалоге.", "!"); КонецЕсли; КонецПроцедуры //УстановитьЗначениеПараметраКонвертации() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВывестиСообщение(ТекстСообщения, СтатусСообщения = " ") Сообщить(ТекстСообщения, СтатусСообщения); КонецПроцедуры // ВывестиСообщение() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПривестиБулевоКЗначению(Булево) Если Врег(Булево) = "TRUE" Тогда Возврат 1; ИначеЕсли Врег(Булево) = "FALSE" Тогда Возврат 0; Иначе Возврат 0; КонецЕсли; КонецФункции // ПривестиБулевоКЗначению() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПривестиЗначениеКБулево(Значение) Если Число(Значение) > 0 Тогда Возврат "true"; Иначе Возврат "false"; КонецЕсли; КонецФункции // ПривестиЗначениеКБулево() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПроверитьИмяТипУзла(Узел, ПроверяемоеИмя = "", ТипТега = "", ПроверяемыйТип = "") Если (ТипТега <> "") И (ПроверяемыйТип <> "") Тогда Если ТипТега = ПроверяемыйТип Тогда Если ПроверяемоеИмя <> "" Тогда Если Узел.СвойстваТекущегоУзла.Имя = ПроверяемоеИмя Тогда Возврат 1; Иначе Возврат 0; КонецЕсли; Иначе Возврат 1; КонецЕсли; Иначе Возврат 0; КонецЕсли; Иначе Если ПроверяемоеИмя <> "" Тогда Если Узел.СвойстваТекущегоУзла.Имя = ПроверяемоеИмя Тогда Возврат 1; Иначе Возврат 0; КонецЕсли; Иначе ВывестиСообщение("Неверно переданы параметры в функцию ""ПроверитьИмяТипУзла"".", "!!!"); Возврат 0; КонецЕсли; КонецЕсли; КонецФункции // ПроверитьИмяТипУзла() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПолучитьДатуV8(ЧастьДата, ЧастьВремя = "00:00:00") Если (ПустоеЗначение(ЧастьДата) = 1) ИЛИ (ЧастьДата = Дата(1,1,1)) Тогда Возврат "0001-01-01T" + ЧастьВремя; Иначе // Год может быть введен неверно Год = ДатаГод(ЧастьДата); // Возможно случайно ошиблись и не доввели дату Если Год < 30 Тогда Год = 2000 + Год; ИначеЕсли Год < 100 Тогда Год = 1900 + Год; ИначеЕсли Год < 1000 Тогда Год = 1000 + Год; КонецЕсли; // Если исправления не помогли, тогда вернем пустой год // Иначе данные просто не загрузятся Если Год < 1900 Тогда Возврат "0001-01-01T" + ЧастьВремя; КонецЕсли; Возврат "" + Год + "-" + Формат(ДатаМесяц(ЧастьДата),"Ч(0)2") + "-" + Формат(ДатаЧисло(ЧастьДата),"Ч(0)2") + "T" + ЧастьВремя; КонецЕсли; КонецФункции // ПолучитьДатуV8() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПолучитьПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть = "", Режим = "") Стр = СокрЛП(Стр); Префикс = Стр; Длина = СтрДлина(Стр); Для Сч = 1 По Длина Цикл ЧисловаяЧасть = Число(Стр); Если (ЧисловаяЧасть > 0) И (СтрДлина(ЧисловаяЧасть) = Длина - Сч + 1) Тогда Префикс = Лев(Префикс, Сч - 1); Пока Прав(Префикс, 1) = "0" Цикл Префикс = Лев(Префикс, СтрДлина(Префикс)-1); КонецЦикла; Прервать; Иначе Стр = Прав(Стр, Длина - Сч); КонецЕсли; Если ЧисловаяЧасть < 0 Тогда ЧисловаяЧасть = - ЧисловаяЧасть; КонецЕсли; КонецЦикла; Если Режим = "Число" Тогда Возврат(ЧисловаяЧасть); Иначе Возврат(Префикс); КонецЕсли; КонецФункции // ПолучитьПрефиксЧислоНомера() // Добавляет к префиксу номера или кода подстроку // // Параметры: // Стр - Строка. Номер или код; // Добавок - добаляемая к префиксу подстрока; // Длина - требуемая результрирующая длина строки; // Режим - "Слева" - подстрока добавляется слева к префиксу, иначе - справа. // // Возвращаемое значение: // Строка - номер или код, к префиксу которого добавлена указанная подстрока. // Функция ДобавитьКПрефиксу(Знач Стр, Добавок = "", Длина = "", Режим = "Слева") Стр = СтрЗаменить(СокрЛП(Стр)," ",""); Если ПустаяСтрока(Длина) = 1 Тогда Длина = СтрДлина(Стр); КонецЕсли; ЧисловаяЧасть = ""; Префикс = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); Если Режим = "Слева" Тогда Результат = СокрЛП(Добавок) + Префикс; Иначе Результат = Префикс + СокрЛП(Добавок); КонецЕсли; Пока Длина - СтрДлина(Результат) - СтрДлина(СтрЗаменить(СокрЛП(ЧисловаяЧасть)," ","")) > 0 Цикл Результат = Результат + "0"; КонецЦикла; Результат = Результат + СтрЗаменить(СокрЛП(ЧисловаяЧасть)," ",""); Возврат(Результат); КонецФункции // ДобавитьКПрефиксу() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПривестиНомерКДлине(Знач Стр, Длина) Стр = СокрЛП(Стр); ЧисловаяЧасть = ""; Результат = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); Пока Длина - СтрДлина(Результат) - СтрДлина(ЧисловаяЧасть) > 0 Цикл Результат = Результат + "0"; КонецЦикла; Результат = Результат + ЧисловаяЧасть; Возврат(Результат); КонецФункции // ПривестиНомерКДлине() //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ПРАВИЛАМИ //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ИнициализацияПравилВыгрузки() мТаблицаПравилВыгрузки = СоздатьОбъект("ТаблицаЗначений"); мТаблицаПравилВыгрузки.НоваяКолонка("Отключить"); мТаблицаПравилВыгрузки.НоваяКолонка("ЭтоГруппа"); мТаблицаПравилВыгрузки.НоваяКолонка("Родитель"); мТаблицаПравилВыгрузки.НоваяКолонка("Уровень"); мТаблицаПравилВыгрузки.НоваяКолонка("Код"); мТаблицаПравилВыгрузки.НоваяКолонка("Наименование"); мТаблицаПравилВыгрузки.НоваяКолонка("Порядок", "Число", 10, 0); мТаблицаПравилВыгрузки.НоваяКолонка("КодПравилаКонвертации"); мТаблицаПравилВыгрузки.НоваяКолонка("СпособОтбораДанных"); мТаблицаПравилВыгрузки.НоваяКолонка("ОбъектВыборки"); мТаблицаПравилВыгрузки.НоваяКолонка("ПередОбработкойПравила", "Число", 1, 0); мТаблицаПравилВыгрузки.НоваяКолонка("ПередВыгрузкойОбъекта", "Число", 1, 0); мТаблицаПравилВыгрузки.НоваяКолонка("ПослеВыгрузкиОбъекта", "Число", 1, 0); мТаблицаПравилВыгрузки.НоваяКолонка("ПослеОбработкиПравила", "Число", 1, 0); мТаблицаПравилВыгрузки.НоваяКолонка("НомерГруппы", "Число", 5, 0); мТаблицаПравилВыгрузки.НоваяКолонка("Отбор"); КонецПроцедуры // ИнициализацияПравилВыгрузки() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ИнициализацияПравилКонвертацииОбъектов() мТаблицаПравилКонвертацииОбъектов = СоздатьОбъект("ТаблицаЗначений"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Код"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Наименование"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Порядок", "Число", 10, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("СинхронизироватьПоИдентификатору", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Источник"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Приемник"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПередВыгрузкой", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПриВыгрузке", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПослеВыгрузки", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПослеВыгрузкиВФайл", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПередЗагрузкой"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПриЗагрузке"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПослеЗагрузки"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("СвойстваПоиска"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Свойства"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Значения"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Выгруженные"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("НеЗамещать", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("НеЗапоминатьВыгруженные", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("НеВыгружатьОбъектыСвойствПоСсылкам", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ВсеОбъектыВыгружены", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПоследовательностьПолейПоиска"); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("ГенерироватьНовыйНомерИлиКодЕслиНеУказан", "Число", 1, 0); мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("НеСоздаватьЕслиНеНайден", "Число", 1, 0); КонецПроцедуры // ИнициализацияПравилКонвертацииОбъектов() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ИнициализацияПравилКонвертацииСвойств() ТаблицаПравилКонвертацииСвойств = СоздатьОбъект("ТаблицаЗначений"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("Код"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("Наименование"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("Порядок", "Число", 10, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ЭтоГруппа", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("СвойстваГруппы"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("Источник"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ВидИсточника"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ТипИсточника"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("Приемник"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ВидПриемника"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ТипПриемника"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("КодПравилаКонвертации"); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ПолучитьИзВходящихДанных", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("НеЗамещать", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ПередОбработкойВыгрузки", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ПередВыгрузкой", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ПриВыгрузке", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ПослеВыгрузки", "Число", 1, 0); ТаблицаПравилКонвертацииСвойств.НоваяКолонка("ПослеОбработкиВыгрузки", "Число", 1, 0); Возврат ТаблицаПравилКонвертацииСвойств; КонецФункции // ИнициализацияПравилКонвертацииСвойств() //****************************************************************************** // // Инициализирует колонки таблицы настройки параметров // // Параметры: // Нет. // Процедура ИнициализацияТаблицыНастройкиПараметров() //ТаблицаНастройкиПараметров = СоздатьОбъект("ТаблицаЗначений"); //ТаблицаНастройкиПараметров.НоваяКолонка("Имя"); //ТаблицаНастройкиПараметров.НоваяКолонка("Наименование"); //ТаблицаНастройкиПараметров.НоваяКолонка("Значение"); // //ТаблицаНастройкиПараметров.ВидимостьКолонки("Имя",0,); КонецПроцедуры // ИнициализацияТаблицыПравилОчистки() Функция ПолучитьЗначениеУзлаИзXML() Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = Узел.Значение; ПозицияПоиска = Найти(Значение, РазделительСтрок); Если (ПозицияПоиска > 0) Тогда Возврат Значение; Иначе Значение = СтрЗаменить(Значение, Симв(10),РазделительСтрок); Возврат Значение; КонецЕсли; КонецФункции //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПВД(Родитель, Уровень, НомерГруппы) мТаблицаПравилВыгрузки.НоваяСтрока(); мТаблицаПравилВыгрузки.ТекущаяСтрока(мТаблицаПравилВыгрузки.КоличествоСтрок()); Для Индекс = 0 По мЧтениеXML.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), мЧтениеXML.СвойстваТекущегоУзла.НаименованиеАтрибута(Индекс), ПривестиБулевоКЗначению(мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс))); КонецЦикла; мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "ЭтоГруппа", 0); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "Уровень", Уровень); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "Родитель", Родитель); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "НомерГруппы", НомерГруппы); ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Имя = мЧтениеXML.СвойстваТекущегоУзла.Имя; Если (Имя = "ПередОбработкойПравила") ИЛИ (Имя = "ПередВыгрузкойОбъекта") ИЛИ (Имя = "ПослеВыгрузкиОбъекта") ИЛИ (Имя = "ПослеОбработкиПравила") Тогда Значение = 1; ИначеЕсли (Имя = "Комментарий") ИЛИ (Имя = "Описание") ИЛИ (Имя = "ИмяТипаПриемника") Тогда ТипТега = мЧтениеXML.Следующий(); Продолжить; Иначе Значение = ПолучитьЗначениеУзлаИзXML(); КонецЕсли; мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), Имя, Значение); ТипТега = мЧтениеXML.Следующий(); КонецЦикла; КонецПроцедуры // ЗагрузитьПВД() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьГруппуПВД(Родитель, Уровень, НомерГруппы) НомерГруппы = НомерГруппы + 1; ТекущийРодитель = ""; мТаблицаПравилВыгрузки.НоваяСтрока(); мТаблицаПравилВыгрузки.ТекущаяСтрока(мТаблицаПравилВыгрузки.КоличествоСтрок()); Для Индекс = 0 По мЧтениеXML.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), мЧтениеXML.СвойстваТекущегоУзла.НаименованиеАтрибута(Индекс), ПривестиБулевоКЗначению(мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс))); КонецЦикла; мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "ЭтоГруппа", 1); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "Уровень", Уровень); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "Родитель", Родитель); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), "НомерГруппы", НомерГруппы); ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Имя = мЧтениеXML.СвойстваТекущегоУзла.Имя; Если ПроверитьИмяТипУзла(мЧтениеXML, "Группа", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьГруппуПВД(ТекущийРодитель, Уровень + 1, НомерГруппы); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Правило", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПВД(ТекущийРодитель, Уровень + 1, НомерГруппы); Иначе Значение = ПолучитьЗначениеУзлаИзXML(); мТаблицаПравилВыгрузки.УстановитьЗначение(мТаблицаПравилВыгрузки.ТекущаяСтрока(), Имя, Значение); Если Имя = "Код" Тогда ТекущийРодитель = Значение; КонецЕсли; КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; НомерГруппы = НомерГруппы + 1; КонецПроцедуры // ЗагрузитьГруппуПВД() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПравилаВыгрузкиДанных() мТаблицаПравилВыгрузки.УдалитьСтроки(); НомерТекущейГруппы = 1; ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Правило", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПВД("", 0, НомерТекущейГруппы); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Группа", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьГруппуПВД("", 0, НомерТекущейГруппы); КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; мТаблицаПравилВыгрузки.Сортировать("НомерГруппы, ЭтоГруппа -, Порядок"); КонецПроцедуры // ЗагрузитьПравилаВыгрузкиДанных() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПКС(СвойстваГруппы = 0, ЭтоГруппа = 0) Для Индекс = 0 По мЧтениеXML.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл НаименованиеАтрибута = мЧтениеXML.СвойстваТекущегоУзла.НаименованиеАтрибута(Индекс); Если НаименованиеАтрибута = "Отключить" Тогда Если ПривестиБулевоКЗначению(мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс)) = 1 Тогда Возврат; КонецЕсли; ИначеЕсли НаименованиеАтрибута = "Поиск" Тогда Поиск = ПривестиБулевоКЗначению(мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс)); КонецЕсли; КонецЦикла; Если Поиск = 1 Тогда Если СвойстваГруппы = 0 Тогда Свойства = мТаблицаПравилКонвертацииОбъектов.СвойстваПоиска; Иначе Свойства = СвойстваГруппы; КонецЕсли; Иначе Если СвойстваГруппы = 0 Тогда Свойства = мТаблицаПравилКонвертацииОбъектов.Свойства; Иначе Свойства = СвойстваГруппы; КонецЕсли; КонецЕсли; Свойства.НоваяСтрока(); Свойства.ТекущаяСтрока(Свойства.КоличествоСтрок()); Свойства.ЭтоГруппа = ЭтоГруппа; ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Имя = мЧтениеXML.СвойстваТекущегоУзла.Имя; Если (Имя = "ПередОбработкойВыгрузки") ИЛИ (Имя = "ПередВыгрузкой") ИЛИ (Имя = "ПриВыгрузке") ИЛИ (Имя = "ПослеВыгрузки") ИЛИ (Имя = "ПослеОбработкиВыгрузки") Тогда Значение = 1; ИначеЕсли Имя = "ПолучитьИзВходящихДанных" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "НеЗамещать" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "Источник" Тогда Для Индекс = 0 По мЧтениеXML.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл НаименованиеАтрибута = мЧтениеXML.СвойстваТекущегоУзла.НаименованиеАтрибута(Индекс); Если НаименованиеАтрибута = "Имя" Тогда Свойства.Источник = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "Вид" Тогда Свойства.ВидИсточника = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "Тип" Тогда Свойства.ТипИсточника = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); КонецЕсли; КонецЦикла; ТипТега = мЧтениеXML.Следующий(); Продолжить; ИначеЕсли Имя = "Приемник" Тогда Для Индекс = 0 По мЧтениеXML.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл НаименованиеАтрибута = мЧтениеXML.СвойстваТекущегоУзла.НаименованиеАтрибута(Индекс); Если НаименованиеАтрибута = "Имя" Тогда Свойства.Приемник = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "Вид" Тогда Свойства.ВидПриемника = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "Тип" Тогда Свойства.ТипПриемника = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); КонецЕсли; КонецЦикла; ТипТега = мЧтениеXML.Следующий(); Продолжить; ИначеЕсли Имя = "Свойство" Тогда Если ЭтоГруппа = 1 Тогда Если ПустоеЗначение(Свойства.СвойстваГруппы) = 1 Тогда Свойства.СвойстваГруппы = ИнициализацияПравилКонвертацииСвойств(); КонецЕсли; ЗагрузитьПКС(Свойства.СвойстваГруппы); Свойства.СвойстваГруппы.Сортировать("Порядок"); ТипТега = мЧтениеXML.Следующий(); Продолжить; Иначе ЗагрузитьПКС(); мТаблицаПравилКонвертацииОбъектов.Свойства.Сортировать("Порядок"); ТипТега = мЧтениеXML.Следующий(); Продолжить; КонецЕсли; ИначеЕсли Имя = "Группа" Тогда ЗагрузитьПКС(, 1); мТаблицаПравилКонвертацииОбъектов.СвойстваГруппы.Сортировать("Порядок"); ИначеЕсли (Имя = "Комментарий") ИЛИ (Имя = "Описание") Тогда ТипТега = мЧтениеXML.Следующий(); Продолжить; Иначе Значение = ПолучитьЗначениеУзлаИзXML(); КонецЕсли; Свойства.УстановитьЗначение(Свойства.ТекущаяСтрока(), Имя, Значение); ТипТега = мЧтениеXML.Следующий(); КонецЦикла; КонецПроцедуры // ЗагрузитьПКС() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПравилаКонвертацииСвойств() ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Свойство", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПКС(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Группа", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПКС(, 1); КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; мТаблицаПравилКонвертацииОбъектов.Свойства.Сортировать("Порядок"); КонецПроцедуры // ЗагрузитьПравилаКонвертацииСвойств() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПравилаКонвертацииЗначений() ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Значение", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ТипТега = мЧтениеXML.Спуститься(); Источник = ""; Приемник = ""; Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Имя = мЧтениеXML.СвойстваТекущегоУзла.Имя; Если Имя = "Источник" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Источник = Узел.Значение; ИначеЕсли Имя = "Приемник" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Приемник = Узел.Значение; КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; мТаблицаПравилКонвертацииОбъектов.Значения.Установить(СокрЛП(Источник), СокрЛП(Приемник)); КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; КонецПроцедуры // ЗагрузитьПравилаКонвертацииЗначений() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПКО(Знач Порядок = "") мТаблицаПравилКонвертацииОбъектов.НоваяСтрока(); мТаблицаПравилКонвертацииОбъектов.ТекущаяСтрока(мТаблицаПравилКонвертацииОбъектов.КоличествоСтрок()); мТаблицаПравилКонвертацииОбъектов.Выгруженные = СоздатьОбъект("СписокЗначений"); ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Имя = мЧтениеXML.СвойстваТекущегоУзла.Имя; Если (Имя = "Порядок") Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = Число(Узел.Значение); Порядок = СтрЗаменить(Порядок, ",", РазделительСтрок); Для Индекс = 1 ПО СтрКоличествоСтрок(Порядок) Цикл Попытка мТаблицаПравилКонвертацииОбъектов.УстановитьЗначение(мТаблицаПравилКонвертацииОбъектов.ТекущаяСтрока(), "Порядок" + Индекс, Число(СтрПолучитьСтроку(Порядок, Индекс))); Исключение мТаблицаПравилКонвертацииОбъектов.НоваяКолонка("Порядок" + Индекс, "Число", 10, 0); мТаблицаПравилКонвертацииОбъектов.УстановитьЗначение(мТаблицаПравилКонвертацииОбъектов.ТекущаяСтрока(), "Порядок" + Индекс, Число(СтрПолучитьСтроку(Порядок, Индекс))); КонецПопытки; КонецЦикла; ИначеЕсли (Имя = "ПередВыгрузкой") ИЛИ (Имя = "ПриВыгрузке") ИЛИ (Имя = "ПослеВыгрузки") ИЛИ (Имя = "ПослеВыгрузкиВФайл") Тогда Значение = 1; ИначеЕсли Имя = "СинхронизироватьПоИдентификатору" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "НеЗамещать" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "НеЗапоминатьВыгруженные" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "НеВыгружатьОбъектыСвойствПоСсылкам" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "ГенерироватьНовыйНомерИлиКодЕслиНеУказан" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "НеСоздаватьЕслиНеНайден" Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); Значение = ПривестиБулевоКЗначению(Узел.Значение); ИначеЕсли Имя = "Свойства" Тогда мТаблицаПравилКонвертацииОбъектов.СвойстваПоиска = ИнициализацияПравилКонвертацииСвойств(); мТаблицаПравилКонвертацииОбъектов.Свойства = ИнициализацияПравилКонвертацииСвойств(); ЗагрузитьПравилаКонвертацииСвойств(); ТипТега = мЧтениеXML.Следующий(); Продолжить; ИначеЕсли Имя = "Значения" Тогда мТаблицаПравилКонвертацииОбъектов.Значения = СоздатьОбъект("СписокЗначений"); ЗагрузитьПравилаКонвертацииЗначений(); ТипТега = мЧтениеXML.Следующий(); Продолжить; ИначеЕсли (Имя = "Комментарий") ИЛИ (Имя = "Описание") Тогда ТипТега = мЧтениеXML.Следующий(); Продолжить; Иначе Значение = ПолучитьЗначениеУзлаИзXML(); КонецЕсли; мТаблицаПравилКонвертацииОбъектов.УстановитьЗначение(мТаблицаПравилКонвертацииОбъектов.ТекущаяСтрока(), Имя, Значение); ТипТега = мЧтениеXML.Следующий(); КонецЦикла; КонецПроцедуры // ЗагрузитьПКО() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьГруппуПКО(Знач Порядок = "") ПорядокГруппы = 0; // Группы ПКО в таблицу не добавляются ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Порядок", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); ПорядокГруппы = Число(Узел.Значение); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Группа", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьГруппуПКО(?(ПустаяСтрока(Порядок) = 1, Порядок, Порядок + ",") + Строка(ПорядокГруппы)); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Правило", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПКО(?(ПустаяСтрока(Порядок) = 1, Порядок, Порядок + ",") + Строка(ПорядокГруппы)); Иначе Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; КонецПроцедуры // ЗагрузитьГруппуПКО() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПравилаКонвертацииОбъектов() мТаблицаПравилКонвертацииОбъектов.УдалитьСтроки(); ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Правило", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПКО(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Группа", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьГруппуПКО(); КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; Индекс = 1; СтрокаСортировки = ""; Пока (1 = 1) Цикл Попытка мТаблицаПравилКонвертацииОбъектов.ТекущаяКолонка("Порядок" + Индекс); СтрокаСортировки = СтрокаСортировки + "Порядок" + Индекс + ","; Исключение СтрокаСортировки = СтрокаСортировки + "Порядок"; Прервать; КонецПопытки; Индекс = Индекс + 1; КонецЦикла; мТаблицаПравилКонвертацииОбъектов.Сортировать(СтрокаСортировки); КонецПроцедуры // ЗагрузитьПравилаКонвертацииОбъектов() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПараметры() Параметры = СоздатьОбъект("ТаблицаЗначений"); Если мВерсияФормата = "2.01" Тогда ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецУровня) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Параметр", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ИмяПараметра = ""; НаименованиеПараметра = ""; УстанавливатьВДиалоге = 1; ТипЗначенияПараметра = "Строка"; ИспользуетсяПриЗагрузке = 0; Для Индекс = 0 По мЧтениеXML.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл НаименованиеАтрибута = мЧтениеXML.СвойстваТекущегоУзла.НаименованиеАтрибута(Индекс); Если НаименованиеАтрибута = "Имя" Тогда ИмяПараметра = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "Наименование" Тогда НаименованиеПараметра = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "УстанавливатьВДиалоге" Тогда УстанавливатьВДиалоге = ПривестиБулевоКЗначению(мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс)); ИначеЕсли НаименованиеАтрибута = "ТипЗначения" Тогда ТипЗначенияПараметра = мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс); ИначеЕсли НаименованиеАтрибута = "ИспользуетсяПриЗагрузке" Тогда ИспользуетсяПриЗагрузке = ПривестиБулевоКЗначению(мЧтениеXML.СвойстваТекущегоУзла.ЗначениеАтрибута(Индекс)); КонецЕсли; КонецЦикла; Если ПустаяСтрока(ИмяПараметра) = 0 Тогда //Параметры.НоваяКолонка(СокрЛП(ИмяПараметра)); Параметры.ВставитьКолонку(СокрЛП(ИмяПараметра)); Если УстанавливатьВДиалоге = 1 Тогда ТаблицаНастройкиПараметров.НоваяСтрока(); ТаблицаНастройкиПараметров.Имя = СокрЛП(ИмяПараметра); ТаблицаНастройкиПараметров.Наименование = НаименованиеПараметра; Если Найти("Строка, Число, Дата",ТипЗначенияПараметра) > 0 Тогда ТаблицаНастройкиПараметров.ТипЗначения = ТипЗначенияПараметра; ТаблицаНастройкиПараметров.ВидЗначения = ТипЗначенияПараметра; ТаблицаНастройкиПараметров.Значение = ПолучитьПустоеЗначение(ТипЗначенияПараметра); ИначеЕсли Найти(ТипЗначенияПараметра,"ПеречислениеСсылка.") = 1 Тогда ТаблицаНастройкиПараметров.ТипЗначения = "Перечисление"; ТаблицаНастройкиПараметров.ВидЗначения = Сред(ТипЗначенияПараметра, СтрДлина("ПеречислениеСсылка.")+1); ПеречислениеДляПараметра = Перечисление.ПолучитьАтрибут(ТаблицаНастройкиПараметров.ВидЗначения); ТаблицаНастройкиПараметров.Значение = ПеречислениеДляПараметра.ЗначениеПоНомеру(1); ИначеЕсли Найти(ТипЗначенияПараметра,"СправочникСсылка.") = 1 Тогда ТаблицаНастройкиПараметров.ТипЗначения = "Справочник"; ТаблицаНастройкиПараметров.ВидЗначения = Сред(ТипЗначенияПараметра, СтрДлина("СправочникСсылка.")+1); ТаблицаНастройкиПараметров.Значение = ПолучитьПустоеЗначение("Справочник."+ТаблицаНастройкиПараметров.ВидЗначения); ИначеЕсли Найти(ТипЗначенияПараметра,"ДокументСсылка.") = 1 Тогда ТаблицаНастройкиПараметров.ТипЗначения = "Документ"; ТаблицаНастройкиПараметров.ВидЗначения = Сред(ТипЗначенияПараметра, СтрДлина("ДокументСсылка.")+1); ТаблицаНастройкиПараметров.Значение = ПолучитьПустоеЗначение("Документ."+ТаблицаНастройкиПараметров.ВидЗначения); КонецЕсли; КонецЕсли; Если ИспользуетсяПриЗагрузке = 1 Тогда ТаблицаПараметровДляЗагрузки.НоваяСтрока(); ТаблицаПараметровДляЗагрузки.Имя = ИмяПараметра; ТаблицаПараметровДляЗагрузки.Наименование = НаименованиеПараметра; КонецЕсли; КонецЕсли; КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; Иначе Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); СтрокаПараметров = СтрЗаменить(Узел.Значение, ",", РазделительСтрок); Для Индекс = 1 По СтрКоличествоСтрок(СтрокаПараметров) Цикл Параметры.НоваяКолонка(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, Индекс))); КонецЦикла; КонецЕсли; КонецПроцедуры // ЗагрузитьПараметры() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ЗагрузитьПравила() Если ПустаяСтрока(ИмяФайлаПравил) = 1 Тогда Если Форма.МодальныйРежим() = 0 Тогда Предупреждение("Не указано имя файла правил!"); Иначе Сообщить("Не указано имя файла правил!"); КонецЕсли; Возврат 0; КонецЕсли; Состояние("Идет загрузка правил обмена..."); ПравилаВыгрузкиСписок.УдалитьВсе(); мЧтениеXML.СвязатьСФайлом(ИмяФайлаПравил); ТипТега = мЧтениеXML.Спуститься(); Если ПроверитьИмяТипУзла(мЧтениеXML, "ПравилаОбмена", ТипТега, мНачалоНовогоЭлемента) = 0 Тогда ВывестиСообщение("Файл не содержит корневого узла <ПравилаОбмена>!", "!!!"); Возврат 0; КонецЕсли; мИд = ""; мНаименование = ""; мДатаВремяСоздания = ""; мКонфигурацияИсточник = ""; мКонфигурацияПриемник = ""; мВерсияФормата = ""; мКонвертацияПередВыгрузкойДанных = 0; мКонвертацияПередВыгрузкойОбъекта = 0; мКонвертацияПередКонвертациейОбъекта = 0; мКонвертацияПослеВыгрузкиОбъекта = 0; мКонвертацияПослеВыгрузкиДанных = 0; мКонвертацияПослеЗагрузкиПравилОбмена = 0; // Очищаем настройки параметров ТаблицаНастройкиПараметров.УдалитьСтроки(); ТаблицаПараметровДляЗагрузки.УдалитьСтроки(); // Очищаем отборы ТаблицаНастройкиОтбора.УдалитьСтроки(); ИмяПВДДляНастройкиОтбора = ""; ОбъектДляНастройкиОтбора = ""; КодПВДДляНастройкиОтбора = ""; ТипТега = мЧтениеXML.Спуститься(); Пока ПроверитьИмяТипУзла(мЧтениеXML,, ТипТега, мКонецДокумента) = 0 Цикл Если ПроверитьИмяТипУзла(мЧтениеXML, "Ид", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мИд = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ВерсияФормата", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мВерсияФормата = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Наименование", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мНаименование = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ДатаВремяСоздания", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мДатаВремяСоздания = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Источник", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонфигурацияИсточник = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Приемник", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда Узел = мЧтениеXML.ТекущийЭлементВВидеОбъекта(); мКонфигурацияПриемник = Узел.Значение; ВерсияПлатформыПриемника = Узел.ПолучитьАтрибут("ВерсияПлатформы"); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПередВыгрузкойДанных", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПередВыгрузкойДанных = 1; ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПередВыгрузкойОбъекта", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПередВыгрузкойОбъекта = 1; ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПередКонвертациейОбъекта", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПередКонвертациейОбъекта = 1; ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПослеВыгрузкиОбъекта", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПослеВыгрузкиОбъекта = 1; ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПослеВыгрузкиДанных", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПослеВыгрузкиДанных = 1; ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПослеЗагрузкиПравилОбмена", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПослеЗагрузкиПравилОбмена = 1; ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПередЗагрузкойДанных", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПередЗагрузкойДанных = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПередЗагрузкойОбъекта", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПередЗагрузкойОбъекта = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПослеЗагрузкиОбъекта", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПослеЗагрузкиОбъекта = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПослеЗагрузкиДанных", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда мКонвертацияПослеЗагрузкиДанных = ПолучитьЗначениеУзлаИзXML(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПравилаКонвертацииОбъектов", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПравилаКонвертацииОбъектов(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "ПравилаВыгрузкиДанных", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПравилаВыгрузкиДанных(); ИначеЕсли ПроверитьИмяТипУзла(мЧтениеXML, "Параметры", ТипТега, мНачалоНовогоЭлемента) = 1 Тогда ЗагрузитьПараметры(); КонецЕсли; ТипТега = мЧтениеXML.Следующий(); КонецЦикла; Состояние("Загрузка правил обмена завершена."); // Глобальный обработчик "ПослеЗагрузкиПравилОбмена" Если мКонвертацияПослеЗагрузкиПравилОбмена = 1 Тогда Отказ = Шаблон("[Конвертация_ПослеЗагрузкиПравилОбмена()]"); Если Число(Отказ) = 1 Тогда ВывестиСообщение("Ошибка в обработчике ПослеЗагрузкиПравилОбмена!", "!!!"); Возврат 0; КонецЕсли; КонецЕсли; мТаблицаПравилВыгрузки.ВыбратьСтроки(); Пока мТаблицаПравилВыгрузки.ПолучитьСтроку() > 0 Цикл Префикс = ""; Если мТаблицаПравилВыгрузки.ЭтоГруппа = 1 Тогда Наименование = "[ " + СокрЛП(мТаблицаПравилВыгрузки.Наименование) + " ]"; Иначе Наименование = "-" + СокрЛП(мТаблицаПравилВыгрузки.Наименование); КонецЕсли; Для Индекс = 0 По мТаблицаПравилВыгрузки.Уровень - 1 Цикл Префикс = Префикс + " "; КонецЦикла; Наименование = Префикс + Наименование; ПравилаВыгрузкиСписок.ДобавитьЗначение(мТаблицаПравилВыгрузки.Код, Наименование); // Если в обработку был передан список кодов правил выгрузки, будем выгружать // именно их, а не те, которые установлены в правилах выгрузки по умолчанию Если ПустоеЗначение(мИспользуемыеПравилаВыгрузки) = 0 Тогда Если Найти(мИспользуемыеПравилаВыгрузки, мТаблицаПравилВыгрузки.Код) = 0 Тогда Пометка = 0; Иначе Пометка = ?(мТаблицаПравилВыгрузки.Отключить = 1, 0, 1); КонецЕсли; Иначе Пометка = ?(мТаблицаПравилВыгрузки.Отключить = 1, 0, 1); КонецЕсли; ПравилаВыгрузкиСписок.Пометка(ПравилаВыгрузкиСписок.РазмерСписка(), Пометка); КонецЦикла; Возврат 1; КонецФункции // ЗагрузитьПравила() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция НайтиПравило(Объект, ИмяПравила = "") Перем НомерСтроки; Если ПустаяСтрока(СокрЛП(ИмяПравила)) = 0 Тогда мТаблицаПравилКонвертацииОбъектов.НайтиЗначение(СокрЛП(ИмяПравила), НомерСтроки, "Код"); ИначеЕсли ТипЗначения(Объект) < 4 Тогда мТаблицаПравилКонвертацииОбъектов.НайтиЗначение(ТипЗначенияСтр(Объект), НомерСтроки, "Код"); ИначеЕсли ТипЗначения(Объект) < 100 Тогда мТаблицаПравилКонвертацииОбъектов.НайтиЗначение(ТипЗначенияСтр(Объект) + "Ссылка." + Объект.Вид(), НомерСтроки, "Источник"); Иначе НомерСтроки = 0; КонецЕсли; Возврат НомерСтроки; КонецФункции // НайтиПравило() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПолучитьРеквизитПКО(НомерПКО, Реквизит) Возврат мТаблицаПравилКонвертацииОбъектов.ПолучитьЗначение(НомерПКО, Реквизит); КонецФункции // ПолучитьРеквизитПКО() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, Реквизит) Возврат КоллекцияПКС.ПолучитьЗначение(НомерПКС, Реквизит); КонецФункции // ПолучитьРеквизитПКС() //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ ДОСТУПА К ДАННЫМ //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ПолучитьЗначение(Объект, Имя) Значение = мПустоеЗначение; Если ТипЗначенияСтр(Объект) = "СписокЗначений" Тогда Значение = Объект.Получить(Имя); ИначеЕсли ТипЗначенияСтр(Объект) = "ТаблицаЗначений" Тогда Значение = Объект.ПолучитьЗначение(Объект.НомерСтроки, Имя); ИначеЕсли ТипЗначенияСтр(Объект) = "Справочник" Тогда Если Имя = "ПометкаУдаления" Тогда Значение = Объект.ПометкаУдаления(); ИначеЕсли Имя = "Код" Тогда Значение = Объект.Код; ИначеЕсли Имя = "Наименование" Тогда Значение = Объект.Наименование; ИначеЕсли Имя = "ЭтоГруппа" Тогда Значение = Объект.ЭтоГруппа(); ИначеЕсли Имя = "Родитель" Тогда Значение = Объект.Родитель; Иначе Попытка Значение = Объект.ПолучитьАтрибут(Имя); Исключение ВывестиСообщение("Ошибка получения значения свойства объекта", "!!!"); ВывестиСообщение(СимволТабуляции + "Объект: " + Строка(Объект) + ", свойство: " + Имя + "."); КонецПопытки; Если ТипЗначенияСтр(Значение) = "НеизвестныйОбъект" Тогда Значение = мПустоеЗначение; КонецЕсли; КонецЕсли; ИначеЕсли ТипЗначенияСтр(Объект) = "Документ" Тогда Если Имя = "ПометкаУдаления" Тогда Значение = Объект.ПометкаУдаления(); ИначеЕсли Имя = "НомерДок" Тогда Значение = Объект.НомерДок; ИначеЕсли Имя = "ДатаДок" Тогда Значение = ПолучитьДатуV8(Объект.ДатаДок, Объект.ПолучитьВремя()); ИначеЕсли Имя = "Проведен" Тогда Значение = Объект.Проведен(); ИначеЕсли Имя = "ТабличнаяЧасть" Тогда Объект.ВыгрузитьТабличнуюЧасть(Значение); Иначе Значение = Объект.ПолучитьАтрибут(Имя); КонецЕсли; ИначеЕсли ТипЗначенияСтр(Объект) = "НеизвестныйОбъект" Тогда // Например, константы Попытка Значение = Объект.ПолучитьАтрибут(Имя); Исключение ВывестиСообщение("Ошибка получения значения свойства объекта", "!!!"); ВывестиСообщение(СимволТабуляции + "Объект: " + Строка(Объект) + ", свойство: " + Имя + "."); КонецПопытки; // Возможно это периодическая константа Если ТипЗначенияСтр(Значение) = "НеизвестныйОбъект" Тогда Попытка Значение = Объект.ПолучитьАтрибут(Имя).Получить(ДатаОкончания); Исключение ВывестиСообщение("Ошибка получения значения свойства объекта", "!!!"); ВывестиСообщение(СимволТабуляции + "Объект: " + Строка(Объект) + ", свойство: " + Имя + "."); КонецПопытки; КонецЕсли; // Тогда уж точно что-то еще нам неизвестное... Если ТипЗначенияСтр(Значение) = "НеизвестныйОбъект" Тогда Значение = мПустоеЗначение; КонецЕсли; КонецЕсли; Возврат Значение; КонецФункции // ПолучитьЗначение() //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ ОБРАБОТКИ ВЫГРУЗКИ ПО ПРАВИЛАМ //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, КоллекцияПКС, НомерПКГС, УзелКоллекцииСвойств, ВыгрузитьТолькоСсылку = 0) КоллекцияОбъектов = мПустоеЗначение; НеЗамещать = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "НеЗамещать"); НеОчищать = 0; // Обработчик "ПередОбработкойВыгрузки" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПередОбработкойВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Код"))); Отказ = Шаблон("[ПКГС_ПередОбработкойВыгрузки_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, КоллекцияОбъектов, НеЗамещать, НеОчищать)]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; ВидИсточника = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидИсточника"); ВидПриемника = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника"); // Создание узла коллекции подчиненных объектов Если ВидПриемника = "ТабличнаяЧасть" Тогда УзелКоллекцииОбъектов = СоздатьУзел("ТабличнаяЧасть"); УстановитьАтрибут(УзелКоллекцииОбъектов, "Имя", ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")); Если НеЗамещать = 1 Тогда УстановитьАтрибут(УзелКоллекцииОбъектов, "НеЗамещать", "true"); КонецЕсли; Если НеОчищать = 1 Тогда УстановитьАтрибут(УзелКоллекцииОбъектов, "НеОчищать", "true"); КонецЕсли; ИначеЕсли Найти(ВидПриемника, "НаборДвижений") > 0 Тогда УзелКоллекцииОбъектов = СоздатьУзел("НаборЗаписей"); УстановитьАтрибут(УзелКоллекцииОбъектов, "Имя", ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")); Если НеЗамещать = 1 Тогда УстановитьАтрибут(УзелКоллекцииОбъектов, "НеЗамещать", "true"); КонецЕсли; Если НеОчищать = 1 Тогда УстановитьАтрибут(УзелКоллекцииОбъектов, "НеОчищать", "true"); КонецЕсли; Иначе // это простая группировка ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "СвойстваГруппы"), УзелКоллекцииСвойств,, СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")), , ВыгрузитьТолькоСсылку); // Обработчик "ПослеОбработкиВыгрузки" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПослеОбработкиВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Код"))); Отказ = Шаблон("[ПКГС_ПослеОбработкиВыгрузки_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, УзелКоллекцииОбъектов)]"); КонецЕсли; Возврат; КонецЕсли; // Получение коллекции подчиненных объектов Если КоллекцияОбъектов <> мПустоеЗначение Тогда // Инициализировали коллекцию в обработчике ПередОбработкой ИначеЕсли ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПолучитьИзВходящихДанных") = 1 Тогда КоллекцияОбъектов = ПолучитьЗначение(ВходящиеДанные, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")); ИначеЕсли ВидИсточника = "ТабличнаяЧасть" Тогда КоллекцияОбъектов = ПолучитьЗначение(Источник, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Источник")); ИначеЕсли ПустаяСтрока(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Источник")) = 1 Тогда КоллекцияОбъектов = ПолучитьЗначение(Источник, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")); КонецЕсли; Попытка КоллекцияОбъектов.ВыбратьСтроки(); Исключение ВывестиСообщение("Ошибка выбора объектов коллекции", "!!!"); Возврат; КонецПопытки; Пока КоллекцияОбъектов.ПолучитьСтроку() > 0 Цикл Индекс = 1 + Индекс; КоллекцияОбъектов.ТекущаяСтрока(Индекс); // Обработчик "ПередВыгрузкой" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПередВыгрузкой") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Код"))); Отказ = Шаблон("[ПКГС_ПередВыгрузкой_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, КоллекцияОбъектов, УзелКоллекцииОбъектов)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; УзелОбъектаКоллекции = СоздатьУзел("Запись"); СтандартнаяОбработка = 1; // Обработчик "ПриВыгрузке" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПриВыгрузке") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Код"))); Отказ = Шаблон("[ПКГС_ПриВыгрузке_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, КоллекцияОбъектов, УзелКоллекцииОбъектов, УзелОбъектаКоллекции, СтандартнаяОбработка)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; // Выгрузка свойств объекта коллекции Если СтандартнаяОбработка = 1 Тогда СвойстваГруппы = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "СвойстваГруппы"); Если СвойстваГруппы.КоличествоСтрок() > 0 Тогда ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, СвойстваГруппы, УзелОбъектаКоллекции, КоллекцияОбъектов, СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")), , ВыгрузитьТолькоСсылку); Иначе // ПО ПРАВИЛУ КонецЕсли; КонецЕсли; // Обработчик "ПослеВыгрузки" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПослеВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Код"))); Отказ = Шаблон("[ПКГС_ПослеВыгрузки_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, КоллекцияОбъектов, УзелКоллекцииОбъектов, УзелОбъектаКоллекции)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; ДобавитьПодчиненный(УзелКоллекцииОбъектов, УзелОбъектаКоллекции); КонецЦикла; // Обработчик "ПослеОбработкиВыгрузки" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ПослеОбработкиВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКГС, "Код"))); Отказ = Шаблон("[ПКГС_ПослеОбработкиВыгрузки_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, УзелКоллекцииОбъектов)]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелКоллекцииОбъектов); КонецПроцедуры // ВыгрузитьГруппуСвойств() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыгрузитьСубконто(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, КоллекцияПКС, НомерПКС, УзелКоллекцииСвойств = 0, ОбъектКоллекции = 0, ПравилоРодитель = "", Знач ВыгрузитьТолькоСсылку = 0) // Инициализация значения Значение = мПустоеЗначение; ИмяПКО = ""; ИмяПКОВидСубконто = ""; НеЗамещать = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "НеЗамещать"); Пусто = 0; Выражение = мПустоеЗначение; ТипПриемника = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ТипПриемника"); // Обработчик "ПередВыгрузкой" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПередВыгрузкой") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + ?(ПустаяСтрока(ПравилоРодитель) = 1, "", ПравилоРодитель + "_") + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Код"))); Отказ = Шаблон("[ПКС_ПередВыгрузкой_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ТипПриемника, ИмяПКО, ИмяПКОВидСубконто, Пусто, Выражение, НеЗамещать)]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; Если Значение = мПустоеЗначение Тогда Если ОбъектКоллекции <> мПустоеЗначение Тогда Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПолучитьИзВходящихДанных") = 1 Тогда Значение = ПолучитьЗначение(ВходящиеДанные, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); ИначеЕсли ПустаяСтрока(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")) = 0 Тогда Значение = ПолучитьЗначение(ВходящиеДанные, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")); Иначе Значение = ПолучитьЗначение(ОбъектКоллекции, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); КонецЕсли; ИначеЕсли ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПолучитьИзВходящихДанных") = 1 Тогда Значение = ПолучитьЗначение(ОбъектКоллекции, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); ИначеЕсли ПустаяСтрока(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")) = 0 Тогда Значение = ПолучитьЗначение(Источник, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")); Иначе Значение = ПолучитьЗначение(Источник, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); КонецЕсли; КонецЕсли; Если ТипЗначенияСтр(Значение) <> "ТаблицаЗначений" Тогда ВывестиСообщение("Коллекция субконто не является таблицей значений", "!!!"); Возврат; КонецЕсли; Значение.ВыбратьСтроки(); Пока Значение.ПолучитьСтроку() > 0 Цикл ВидСубконто = Значение.Ключ; Субконто = Значение.Значение; //Обработчик "ПриВыгрузке" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПриВыгрузке") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + ?(ПустаяСтрока(ПравилоРодитель) = 1, "", ПравилоРодитель + "_") + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Код"))); Отказ = Шаблон("[ПКС_ПриВыгрузке_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; Если ПустоеЗначение(Субконто) = 0 Тогда УзелСубконто = СоздатьУзел(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); // Ключ УзелСвойства = СоздатьУзел("Свойство"); НомерПКОКлюч = НайтиПравило(, ИмяПКОВидСубконто); УстановитьАтрибут(УзелСвойства, "Имя", "Ключ"); УстановитьАтрибут(УзелСвойства, "Тип", ПолучитьРеквизитПКО(НомерПКОКлюч, "Приемник")); УзелСсылки = ВыгрузитьПоПравилу(ВидСубконто,, ИсходящиеДанные,, ИмяПКОВидСубконто,,ВыгрузитьТолькоСсылку, НомерПКОКлюч); ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки); Если УзелСсылки = мПустоеЗначение Тогда Продолжить; ИначеЕсли ТипУзлаСсылки = "Строка" Тогда Если Найти(УзелСсылки, "") > 0 Тогда ДобавитьПодчиненный(УзелСвойства, УзелСсылки); Иначе ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки); КонецЕсли; ИначеЕсли ТипУзлаСсылки = "Число" Тогда ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки); Иначе ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1)); КонецЕсли; ДобавитьПодчиненный(УзелСубконто, УзелСвойства); // Значение УзелСвойства = СоздатьУзел("Свойство"); ТипЗначенияСубконто = ТипЗначенияСтр(Субконто); Если (ИмяПКО = "") И ((ТипЗначенияСубконто = "Строка") ИЛИ (ТипЗначенияСубконто = "Число") ИЛИ (ТипЗначенияСубконто = "Булево") ИЛИ (ТипЗначенияСубконто = "Дата")) Тогда НомерПКОЗначение = 0; ТипПриемника = ТипЗначенияСубконто; Иначе НомерПКОЗначение = НайтиПравило(Субконто, ИмяПКО); ТипПриемника = ПолучитьРеквизитПКО(НомерПКОЗначение, "Приемник"); КонецЕсли; УстановитьАтрибут(УзелСвойства, "Имя", "Значение"); УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ИсходящиеДанные,, ИмяПКО,, ВыгрузитьТолькоСсылку, НомерПКОЗначение); ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки); Если УзелСсылки = мПустоеЗначение Тогда Продолжить; ИначеЕсли ТипУзлаСсылки = "Строка" Тогда Если Найти(УзелСсылки, "") > 0 Тогда ДобавитьПодчиненный(УзелСвойства, УзелСсылки); Иначе ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки); КонецЕсли; ИначеЕсли ТипУзлаСсылки = "Число" Тогда ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки); Иначе ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1)); КонецЕсли; ДобавитьПодчиненный(УзелСубконто, УзелСвойства); // Обработчик "ПослеВыгрузки" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПослеВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + ?(ПустаяСтрока(ПравилоРодитель) = 1, "", ПравилоРодитель + "_") + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Код"))); Отказ = Шаблон("[ПКС_ПослеВыгрузки_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ВидСубконто, Субконто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства, УзелСсылки)]"); КонецЕсли; ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСубконто); КонецЕсли; КонецЦикла; КонецПроцедуры // ВыгрузитьСубконто() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, КоллекцияПКС, УзелКоллекцииСвойств = 0, ОбъектКоллекции = 0, ПравилоРодитель = "", ИмяПредопределенногоЭлемента = "", Знач ВыгрузитьТолькоСсылку = 0) Если УзелКоллекцииСвойств = 0 Тогда УзелКоллекцииСвойств = Приемник; КонецЕсли; // Выгружаем имя предопределенного если оно указано Если ПустаяСтрока(ИмяПредопределенногоЭлемента) = 0 Тогда УзелСвойства = СоздатьУзел("Свойство"); УстановитьАтрибут(УзелСвойства, "Имя", "{ИмяПредопределенногоЭлемента}"); УстановитьАтрибут(УзелСвойства, "Тип", "Строка"); ЗаписатьЭлемент(УзелСвойства, "Значение", ИмяПредопределенногоЭлемента); ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); КонецЕсли; Если ПустоеЗначение(КоллекцияПКС) = 1 Тогда Возврат; КонецЕсли; Для НомерПКС = 1 По КоллекцияПКС.КоличествоСтрок() Цикл Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника") = "ВидыСубконтоСчета" Тогда ВыгрузитьСубконто(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, КоллекцияПКС, НомерПКС, УзелКоллекцииСвойств, ОбъектКоллекции, ПравилоРодитель, ВыгрузитьТолькоСсылку); Продолжить; КонецЕсли; Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ЭтоГруппа") = 1 Тогда ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, КоллекцияПКС, НомерПКС, УзелКоллекцииСвойств, ВыгрузитьТолькоСсылку); Продолжить; КонецЕсли; //Инициализация конвертируемого значения Значение = мПустоеЗначение; ИмяПКО = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "КодПравилаКонвертации"); ИмяПКОВидСубконто = ""; НеЗамещать = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "НеЗамещать"); Пусто = 0; Выражение = мПустоеЗначение; ТипПриемника = ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ТипПриемника"); // Обработчик "ПередВыгрузкой" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПередВыгрузкой") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + ?(ПустаяСтрока(ПравилоРодитель) = 1, "", ПравилоРодитель + "_") + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Код"))); Отказ = Шаблон("[ПКС_ПередВыгрузкой_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ТипПриемника, ИмяПКО, ИмяПКОВидСубконто, Пусто, Выражение, НеЗамещать)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; // Создаем узел свойства УзелСвойства = СоздатьУзел("Свойство"); УстановитьАтрибут(УзелСвойства, "Имя", ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); Если НеЗамещать = 1 Тогда УстановитьАтрибут(УзелСвойства, "НеЗамещать", "true"); КонецЕсли; // Возможно правило конвертации уже определено НомерПКОСвойств = мПустоеЗначение; Если ПустаяСтрока(ИмяПКО) = 0 Тогда НомерПКОСвойств = НайтиПравило(, ИмяПКО); КонецЕсли; // Попытка определить тип свойства приемника Если ПустаяСтрока(ТипПриемника) = 0 Тогда УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); ИначеЕсли НомерПКОСвойств <> мПустоеЗначение Тогда ТипПриемника = ПолучитьРеквизитПКО(НомерПКОСвойств, "Приемник"); УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); КонецЕсли; // Определяем конвертируемое значение Если Выражение <> мПустоеЗначение Тогда ЗаписатьЭлемент(УзелСвойства, "Выражение", Выражение); ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); Продолжить; ИначеЕсли Пусто = 1 Тогда Если ПустаяСтрока(ТипПриемника) = 1 Тогда Продолжить; КонецЕсли; ЗаписатьЭлемент(УзелСвойства, "Пусто"); ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); Продолжить; ИначеЕсли Значение = мПустоеЗначение Тогда Если ОбъектКоллекции <> 0 Тогда Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПолучитьИзВходящихДанных") = 1 Тогда Попытка Значение = ПолучитьЗначение(ВходящиеДанные, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); Исключение ВывестиСообщение("Ошибка получения свойства из входящих данных", "!!!"); КонецПопытки; ИначеЕсли ПустаяСтрока(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")) = 0 Тогда Попытка Значение = ПолучитьЗначение(ОбъектКоллекции, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")); Исключение ВывестиСообщение("Ошибка получения свойства из объекта коллекции. Свойство: "+ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник"), "!!!"); КонецПопытки; Иначе Попытка Значение = ПолучитьЗначение(ОбъектКоллекции, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); Исключение ВывестиСообщение("Ошибка получения свойства из объекта коллекции. Свойство: "+ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник"), "!!!"); КонецПопытки; КонецЕсли; ИначеЕсли ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПолучитьИзВходящихДанных") = 1 Тогда Попытка Значение = ПолучитьЗначение(ВходящиеДанные, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); Исключение КонецПопытки; ИначеЕсли ПустаяСтрока(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")) = 0 Тогда Попытка Значение = ПолучитьЗначение(Источник, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Источник")); Исключение КонецПопытки; Иначе // получаем конвертируемое значение по имени свойства приемника Попытка Значение = ПолучитьЗначение(Источник, ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")); Исключение КонецПопытки; КонецЕсли; КонецЕсли; Пусто = ПустоеЗначение(Значение); //Обработчик "ПриВыгрузке" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПриВыгрузке") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + ?(ПустаяСтрока(ПравилоРодитель) = 1, "", ПравилоРодитель + "_") + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Код"))); Отказ = Шаблон("[ПКС_ПриВыгрузке_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, """", """", Пусто, ИмяПКО, ИмяПКОВидСубконто, УзелСвойства)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; Пусто = ПустоеЗначение(Значение); Если Пусто = 1 Тогда Если ПустаяСтрока(ТипПриемника) = 1 Тогда Продолжить; КонецЕсли; ЗаписатьЭлемент(УзелСвойства, "Пусто"); ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); Продолжить; КонецЕсли; УзелСсылки = мПустоеЗначение; Если (НомерПКОСвойств <> мПустоеЗначение) ИЛИ (ПустаяСтрока(ИмяПКО) = 0) Тогда УзелСсылки = ВыгрузитьПоПравилу(Значение,, ИсходящиеДанные,, ИмяПКО,, ВыгрузитьТолькоСсылку, НомерПКОСвойств); ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки); Если ПустаяСтрока(ТипПриемника) = 1 Тогда ТипПриемника = ПолучитьРеквизитПКО(НомерПКОСвойств, "Приемник"); УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); КонецЕсли; Если УзелСсылки = мПустоеЗначение Тогда Продолжить; ИначеЕсли ТипУзлаСсылки = "Строка" Тогда Если Найти(УзелСсылки, "") > 0 Тогда ДобавитьПодчиненный(УзелСвойства, УзелСсылки); Иначе ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки); КонецЕсли; ИначеЕсли ТипУзлаСсылки = "Число" Тогда ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки); Иначе ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1)); КонецЕсли; Иначе ТипЗнач = ТипЗначенияСтр(Значение); Если ТипЗнач = "Строка" Тогда Если ТипПриемника = "Строка" Тогда ИначеЕсли ТипПриемника = "Число" Тогда Значение = Число(Значение); ИначеЕсли ТипПриемника = "Булево" Тогда Значение = Значение; ИначеЕсли ТипПриемника = "Дата" Тогда Значение = Значение; ИначеЕсли ПустаяСтрока(ТипПриемника) = 1 Тогда УстановитьАтрибут(УзелСвойства, "Тип", "Строка"); Иначе КонецЕсли; ЗаписатьЭлемент(УзелСвойства, "Значение", Значение); ИначеЕсли ТипЗнач = "Число" Тогда Если ТипПриемника = "Число" Тогда ИначеЕсли ТипПриемника = "Булево" Тогда Значение = ПривестиЗначениеКБулево(Значение); ИначеЕсли ТипПриемника = "Строка" Тогда ИначеЕсли ПустаяСтрока(ТипПриемника) = 1 Тогда УстановитьАтрибут(УзелСвойства, "Тип", "Число"); Иначе Продолжить; КонецЕсли; ЗаписатьЭлемент(УзелСвойства, "Значение", Значение); ИначеЕсли ТипЗнач = "Дата" Тогда Если ТипПриемника = "Дата" Тогда Значение = ПолучитьДатуV8(Значение); ИначеЕсли ТипПриемника = "Строка" Тогда Значение = Строка(Значение); ИначеЕсли ПустаяСтрока(ТипПриемника) = 1 Тогда УстановитьАтрибут(УзелСвойства, "Тип", "Дата"); Иначе Продолжить; КонецЕсли; ЗаписатьЭлемент(УзелСвойства, "Значение", Значение); Иначе НомерПКОСвойств = НайтиПравило(Значение, ""); Если НомерПКОСвойств > 0 Тогда ИмяПКО = ПолучитьРеквизитПКО(НомерПКОСвойств, "Код"); Если ПустаяСтрока(ТипПриемника) = 1 Тогда ТипПриемника = ПолучитьРеквизитПКО(НомерПКОСвойств, "Приемник"); УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); КонецЕсли; УзелСсылки = ВыгрузитьПоПравилу(Значение,, ИсходящиеДанные,, ИмяПКО,, ВыгрузитьТолькоСсылку, НомерПКОСвойств); ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки); Если УзелСсылки = мПустоеЗначение Тогда Продолжить; ИначеЕсли ТипУзлаСсылки = "Строка" Тогда Если Найти(УзелСсылки, "") > 0 Тогда ДобавитьПодчиненный(УзелСвойства, УзелСсылки); Иначе ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки); КонецЕсли; ИначеЕсли ТипУзлаСсылки = "Число" Тогда ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки); Иначе ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1)); КонецЕсли; Иначе Продолжить; КонецЕсли; КонецЕсли; КонецЕсли; // Обработчик "ПослеВыгрузки" Если ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ПослеВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")) + "_" + ?(ПустаяСтрока(ПравилоРодитель) = 1, "", ПравилоРодитель + "_") + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Приемник")) + "_" + СокрЛП(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "ВидПриемника")) + СокрЛП(Строка(ПолучитьРеквизитПКС(КоллекцияПКС, НомерПКС, "Код"))); Отказ = Шаблон("[ПКС_ПослеВыгрузки_" + КодПравила + "(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, """", """", ИмяПКО, ИмяПКОВидСубконто, УзелСвойства, УзелСсылки)]"); Если Число(Отказ) = 1 Тогда Продолжить; КонецЕсли; КонецЕсли; ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); КонецЦикла; // по ПКС КонецПроцедуры // ВыгрузитьСвойства() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО = "", УзелСсылки = "", ТолькоПолучитьУзелСсылки = 0, НомерПКО = 0) // Поиск ПКО Если НомерПКО = 0 Тогда НомерПКО = НайтиПравило(Источник, ИмяПКО); Если НомерПКО = 0 Тогда ВывестиСообщение("Не найдено правило конвертации объекта: " + Строка(Источник), "!!!"); Возврат мПустоеЗначение; КонецЕсли; ИначеЕсли ПустаяСтрока(ИмяПКО) = 0 Тогда НомерПКО = НайтиПравило(Источник, ИмяПКО); Если НомерПКО = 0 Тогда ВывестиСообщение("Не найдено правило конвертации объекта: " + ИмяПКО, "!!!"); Возврат мПустоеЗначение; КонецЕсли; КонецЕсли; Если КомментироватьВыгрузкуОбъектов = 1 Тогда ВывестиСообщение("Конвертация объекта или получение ссылки: " + Строка(Источник) + " (" + ТипЗначенияСтр(Источник) + ")"); КонецЕсли; НеЗапоминатьВыгруженные = ПолучитьРеквизитПКО(НомерПКО, "НеЗапоминатьВыгруженные"); НеВыгружатьОбъектыСвойствПоСсылкам = ПолучитьРеквизитПКО(НомерПКО, "НеВыгружатьОбъектыСвойствПоСсылкам"); ВыгруженныеОбъекты = ПолучитьРеквизитПКО(НомерПКО, "Выгруженные"); ВсеОбъектыВыгружены = ПолучитьРеквизитПКО(НомерПКО, "ВсеОбъектыВыгружены"); НеЗамещатьОбъектПриЗагрузке = ПолучитьРеквизитПКО(НомерПКО, "НеЗамещать"); НеСоздаватьЕслиНеНайден = ПолучитьРеквизитПКО(НомерПКО, "НеСоздаватьЕслиНеНайден"); РежимЗаписи = ""; РежимПроведения = ""; // Ключ выгружаемых данных Если (ПустоеЗначение(Источник) = 0) И (НеЗапоминатьВыгруженные = 0) Тогда КлючВыгружаемыхДанных = ЗначениеВСтрокуВнутр(Источник); Иначе КлючВыгружаемыхДанных = НомерПКО; НеЗапоминатьВыгруженные = 1; КонецЕсли; // Переменная для хранения имени предопределенного элемента ИмяПредопределенногоЭлемента = ""; // Глобальный обработчик "ПередКонвертациейОбъекта" Если мКонвертацияПередКонвертациейОбъекта = 1 Тогда Отказ = Шаблон("[Конвертация_ПередКонвертациейОбъекта(Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, КлючВыгружаемыхДанных, НеЗапоминатьВыгруженные, НеЗамещатьОбъектПриЗагрузке, НеСоздаватьЕслиНеНайден, ВсеОбъектыВыгружены, ТолькоПолучитьУзелСсылки, Приемник, РежимЗаписи, РежимПроведения)]"); Если Число(Отказ) = 1 Тогда Возврат мПустоеЗначение; КонецЕсли; КонецЕсли; // Обработчик "ПередВыгрузкой" Если ПолучитьРеквизитПКО(НомерПКО, "ПередВыгрузкой") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")); Отказ = Шаблон("[ПКО_ПередВыгрузкой_" + КодПравила + "(Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, КлючВыгружаемыхДанных, НеЗапоминатьВыгруженные, НеЗамещатьОбъектПриЗагрузке, НеСоздаватьЕслиНеНайден, ВсеОбъектыВыгружены, ТолькоПолучитьУзелСсылки, Приемник, РежимЗаписи, РежимПроведения)]"); Если Число(Отказ) = 1 Тогда Возврат мПустоеЗначение; КонецЕсли; КонецЕсли; // Возможно, такие данные уже выгружались Если ВсеОбъектыВыгружены = 0 Тогда Если НеЗапоминатьВыгруженные = 0 Тогда УзелСсылки = ВыгруженныеОбъекты.Получить(КлючВыгружаемыхДанных); Если ПустоеЗначение(УзелСсылки) = 0 Тогда Возврат УзелСсылки; КонецЕсли; КонецЕсли; Состояние("Выгружено объектов: " + мСчетчикВыгруженныхОбъектов); мСчетчикВыгруженныхОбъектов = 1 + мСчетчикВыгруженныхОбъектов; Нпп = мСчетчикВыгруженныхОбъектов; // Это позволит избежать циклических ссылок Если НеЗапоминатьВыгруженные = 0 Тогда ВыгруженныеОбъекты.Установить(КлючВыгружаемыхДанных, Нпп); КонецЕсли; КонецЕсли; СписокЗначенийВрем = ПолучитьРеквизитПКО(НомерПКО, "Значения"); СписокЗначений = СоздатьОбъект("СписокЗначений"); СписокЗначенийВрем.выгрузить(СписокЗначений); Если (ВерсияПлатформыПриемника = "8.0") Или (ВерсияПлатформыПриемника = "УП") Тогда Если ТипЗначения(Источник) <> 10 Тогда // Поиск в списке значений Если (ТипЗначения(Источник) = 16) Тогда //вид субконто ИмяПредопределенногоЭлемента = СписокЗначений.Получить(Строка(Источник.Идентификатор())); ИначеЕсли (ТипЗначения(Источник) = 14) Тогда //вид расчета ИмяПредопределенногоЭлемента = СписокЗначений.Получить(Строка(Источник.Код)); Иначе ИмяПредопределенногоЭлемента = СписокЗначений.Получить(Строка(Источник)); КонецЕсли; СписокЗначений.УдалитьВсе(); Иначе ИмяПредопределенногоЭлемента = ""; КонецЕсли; КонецЕсли; Если СписокЗначений.РазмерСписка() = 0 Тогда СвойстваПоиска = ПолучитьРеквизитПКО(НомерПКО, "СвойстваПоиска"); Если (СвойстваПоиска.КоличествоСтрок() > 0) ИЛИ (ПустаяСтрока(ИмяПредопределенногоЭлемента) = 0) Тогда Если (НеВыгружатьОбъектыСвойствПоСсылкам = 1) ИЛИ (ТолькоПолучитьУзелСсылки = 1) Тогда ВыгрузитьТолькоСсылку = 1; Иначе ВыгрузитьТолькоСсылку = 0; КонецЕсли; // Формируем узел ссылки УзелСсылки = СоздатьУзел("Ссылка"); Если (НеЗапоминатьВыгруженные = 0) И (ВсеОбъектыВыгружены = 0) Тогда УстановитьАтрибут(УзелСсылки, "Нпп", Нпп); Если НеСоздаватьЕслиНеНайден = 1 Тогда УстановитьАтрибут(УзелСсылки, "НеСоздаватьЕслиНеНайден", "true"); КонецЕсли; ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, ПолучитьРеквизитПКО(НомерПКО, "СвойстваПоиска"), УзелСсылки, , , ИмяПредопределенногоЭлемента, ВыгрузитьТолькоСсылку); ВыгруженныеОбъекты.Установить(КлючВыгружаемыхДанных, УзелСсылки); Иначе ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, ПолучитьРеквизитПКО(НомерПКО, "СвойстваПоиска"), УзелСсылки, , , ИмяПредопределенногоЭлемента, ВыгрузитьТолькоСсылку); КонецЕсли; Иначе УзелСсылки = Нпп; КонецЕсли; Иначе // Поиск в списке значений Если (ТипЗначения(Источник) = 10) ИЛИ (ТипЗначения(Источник) = 16) Тогда //Перечисление или вид субконто УзелСсылки = СписокЗначений.Получить(Строка(Источник.Идентификатор())); Иначе УзелСсылки = СписокЗначений.Получить(Строка(Источник)); КонецЕсли; Если УзелСсылки = мПустоеЗначение Тогда ВывестиСообщение("Значение не найдено: " + Строка(Источник), "!!!"); Возврат мПустоеЗначение; КонецЕсли; Если НеЗапоминатьВыгруженные = 0 Тогда ВыгруженныеОбъекты.Установить(КлючВыгружаемыхДанных, УзелСсылки); КонецЕсли; Возврат УзелСсылки; КонецЕсли; Если (ТолькоПолучитьУзелСсылки = 1) ИЛИ (ВсеОбъектыВыгружены = 1) Тогда Возврат УзелСсылки; КонецЕсли; Если Приемник = мПустоеЗначение Тогда Приемник = СоздатьУзел("Объект"); УстановитьАтрибут(Приемник, "Нпп", Нпп); УстановитьАтрибут(Приемник, "Тип", ПолучитьРеквизитПКО(НомерПКО, "Приемник")); УстановитьАтрибут(Приемник, "ИмяПравила", ПолучитьРеквизитПКО(НомерПКО, "Код")); Если НеЗамещатьОбъектПриЗагрузке = 1 Тогда УстановитьАтрибут(Приемник, "НеЗамещать", "true"); КонецЕсли; Если ПустаяСтрока(РежимЗаписи) = 0 Тогда УстановитьАтрибут(Приемник, "РежимЗаписи", РежимЗаписи); Если ПустаяСтрока(РежимПроведения) = 0 Тогда УстановитьАтрибут(Приемник, "РежимПроведения", РежимПроведения); КонецЕсли; КонецЕсли; Если ТипЗначенияСтр(УзелСсылки) <> "Число" Тогда ДобавитьПодчиненный(Приемник, УзелСсылки.cloneNode(1)); КонецЕсли; КонецЕсли; СтандартнаяОбработка = 1; // Обработчик "ПриВыгрузке" Если ПолучитьРеквизитПКО(НомерПКО, "ПриВыгрузке") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")); Отказ = Шаблон("[ПКО_ПриВыгрузке_" + КодПравила + "(Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, СтандартнаяОбработка, Приемник, УзелСсылки)]"); КонецЕсли; // Выгрузка свойств Если СтандартнаяОбработка = 1 Тогда Если (НеВыгружатьОбъектыСвойствПоСсылкам = 1) ИЛИ (ТолькоПолучитьУзелСсылки = 1) Тогда ВыгрузитьТолькоСсылку = 1; Иначе ВыгрузитьТолькоСсылку = 0; КонецЕсли; ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКО, ПолучитьРеквизитПКО(НомерПКО, "Свойства"), , , , , ВыгрузитьТолькоСсылку); КонецЕсли; // Обработчик ПослеВыгрузки Если ПолучитьРеквизитПКО(НомерПКО, "ПослеВыгрузки") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")); Отказ = Шаблон("[ПКО_ПослеВыгрузки_" + КодПравила + "(Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, Приемник, УзелСсылки)]"); Если Число(Отказ) = 1 Тогда Возврат УзелСсылки; КонецЕсли; КонецЕсли; // Запись объекта ДобавитьПодчиненный(rootNode, Приемник); // Обработчик ПослеВыгрузкиВФайлОбмена Если ПолучитьРеквизитПКО(НомерПКО, "ПослеВыгрузкиВФайл") = 1 Тогда КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код")); Отказ = Шаблон("[ПКО_ПослеВыгрузкиВФайлОбмена_" + КодПравила + "(Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, Приемник, УзелСсылки)]"); Если Число(Отказ) = 1 Тогда Возврат УзелСсылки; КонецЕсли; КонецЕсли; Возврат УзелСсылки; КонецФункции // ВыгрузитьПоПравилу() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыгрузкаОбъектаВыборки(Объект, Правило, ВходящиеДанные) Перем ИсходящиеДанные; Если КомментироватьВыгрузкуОбъектов = 1 Тогда Попытка ПредставлениеОбъекта = Строка(Объект) + " (" + ТипЗначенияСтр(Объект) + ")"; ВывестиСообщение("Выгрузка объекта выборки: " + ПредставлениеОбъекта); Исключение ВывестиСообщение("Выгрузка объекта выборки: " + ТипЗначенияСтр(Объект)); КонецПопытки; КонецЕсли; ИмяПКО = ""; НомерПКО = НайтиПравило(, Правило.КодПравилаКонвертации); // Глобальный обработчик "ПередВыгрузкойОбъекта" Если мКонвертацияПередВыгрузкойОбъекта = 1 Тогда Отказ = Шаблон("[Конвертация_ПередВыгрузкойОбъекта(ИмяПКО, Правило, Объект, ИсходящиеДанные, ВходящиеДанные)]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; // Обработчик "ПередВыгрузкойОбъекта" Если Правило.ПередВыгрузкойОбъекта = 1 Тогда Отказ = Шаблон("[ПВД_ПередВыгрузкойОбъекта_" + СокрЛП(Правило.Код) + "(ИмяПКО, Правило, Объект, ИсходящиеДанные, ВходящиеДанные)]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; УзелСсылки = мПустоеЗначение; ВыгрузитьПоПравилу(Объект,, ИсходящиеДанные,, ИмяПКО, УзелСсылки,, НомерПКО); // Глобальный обработчик "ПослеВыгрузкиОбъекта" Если мКонвертацияПослеВыгрузкиОбъекта = 1 Тогда Отказ = Шаблон("[Конвертация_ПослеВыгрузкиОбъекта(ИмяПКО, Правило, Объект, ИсходящиеДанные, ВходящиеДанные, УзелСсылки)]"); КонецЕсли; // Обработчик "ПослеВыгрузкиОбъекта" Если Правило.ПослеВыгрузкиОбъекта = 1 Тогда Отказ = Шаблон("[ПВД_ПослеВыгрузкиОбъекта_" + СокрЛП(Правило.Код) + "(ИмяПКО, Правило, Объект, ИсходящиеДанные, ВходящиеДанные, УзелСсылки)]"); КонецЕсли; КонецПроцедуры // ВыгрузкаОбъектаВыборки() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыгрузитьДанныеПоПравилу(ИмяПравилаВыгрузки) Перем ИсходящиеДанные, ВыборкаДанных; Перем Индекс; мТаблицаПравилВыгрузки.НайтиЗначение(ИмяПравилаВыгрузки, Индекс, "Код"); Если Индекс = 0 Тогда ВывестиСообщение("Не найдено правило выгрузки: " + ИмяПравилаВыгрузки, "!!"); Возврат; КонецЕсли; Правило = мТаблицаПравилВыгрузки; ИмяПКО = мТаблицаПравилВыгрузки.КодПравилаКонвертации; Если КомментироватьВыгрузкуОбъектов = 1 Тогда ВывестиСообщение("Начало обработки правила выгрузки данных: " + ИмяПравилаВыгрузки); КонецЕсли; // Обработчик "ПередОбработкойПравила" Если Правило.ПередОбработкойПравила = 1 Тогда Отказ = Шаблон("[ПВД_ПередОбработкойПравила_" + СокрЛП(Правило.Код) + "(ИмяПКО, Правило, ИсходящиеДанные, ВыборкаДанных)]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; // Выборка данных Если Правило.СпособОтбораДанных = "СтандартнаяВыборка" Тогда ЕстьОтбор = 0; Если ТипЗначенияСтр(мТаблицаПравилВыгрузки.Отбор) = "ТаблицаЗначений" Тогда мТаблицаПравилВыгрузки.Отбор.ВыбратьСтроки(); Пока мТаблицаПравилВыгрузки.Отбор.ПолучитьСтроку() = 1 Цикл Если (мТаблицаПравилВыгрузки.Отбор.Использовать = 2) И (ПустаяСтрока(мТаблицаПравилВыгрузки.Отбор.ПолеОтбора)=0) Тогда ЕстьОтбор = 1; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; ОбъектВыборки = СтрЗаменить(Правило.ОбъектВыборки, "Ссылка", ""); ИмяТипа = Лев(ОбъектВыборки, Найти(ОбъектВыборки, ".") - 1); Если ЕстьОтбор = 1 Тогда Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = СоздатьЗапрос(ОбъектВыборки, мТаблицаПравилВыгрузки.Отбор); Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Сообщить("Ошибка при выполнении запроса для отбора данных по правилу " + мТаблицаПравилВыгрузки.Наименование,"!"); Сообщить("Выгрузка данных по этому правилу не проведена!","!"); Возврат; КонецЕсли; Пока Запрос.Группировка("ПеремОбъект") = 1 Цикл ВыгрузкаОбъектаВыборки(Запрос.ПеремОбъект, Правило, ИсходящиеДанные); КонецЦикла; Иначе Если ИмяТипа = "Справочник" Тогда Выборка = СоздатьОбъект(ОбъектВыборки); Выборка.ВыбратьЭлементы(0); Пока Выборка.ПолучитьЭлемент() > 0 Цикл ВыгрузкаОбъектаВыборки(Выборка.ТекущийЭлемент(), Правило, ИсходящиеДанные); КонецЦикла; ИначеЕсли ИмяТипа = "Документ" Тогда Выборка = СоздатьОбъект(ОбъектВыборки); Выборка.ВыбратьДокументы(ДатаНачала, ДатаОкончания); Пока Выборка.ПолучитьДокумент() > 0 Цикл ВыгрузкаОбъектаВыборки(Выборка.ТекущийДокумент(), Правило, ИсходящиеДанные); КонецЦикла; ИначеЕсли ОбъектВыборки = "КонстантыНабор" Тогда ВыгрузкаОбъектаВыборки(Константа, Правило, ИсходящиеДанные); ИначеЕсли ИмяТипа = "ПланСчетов" Тогда Возврат; Иначе Возврат; КонецЕсли; КонецЕсли; ИначеЕсли Правило.СпособОтбораДанных = "ПроизвольныйАлгоритм" Тогда Если ПустоеЗначение(ВыборкаДанных) = 0 Тогда Если ТипЗначенияСтр(ВыборкаДанных) = "ТаблицаЗначений" Тогда ВыборкаДанных.ВыбратьСтроки(); Пока ВыборкаДанных.ПолучитьСтроку() > 0 Цикл ВыборкаДанных.ТекущаяСтрока(ВыборкаДанных.НомерСтроки); ВыгрузкаОбъектаВыборки(ВыборкаДанных, Правило, ИсходящиеДанные); КонецЦикла; ИначеЕсли ТипЗначенияСтр(ВыборкаДанных) = "СписокЗначений" Тогда СчетчикЦикла = 0; Для СчетчикЦикла = 1 По ВыборкаДанных.РазмерСписка() Цикл ОбъектДляВыгрузки = ВыборкаДанных.ПолучитьЗначение(СчетчикЦикла); ВыгрузкаОбъектаВыборки(ОбъектДляВыгрузки, Правило, ИсходящиеДанные); КонецЦикла; Иначе Возврат; КонецЕсли; Иначе Возврат; КонецЕсли; КонецЕсли; // Обработчик "ПослеОбработкиПравила" Если Правило.ПослеОбработкиПравила = 1 Тогда Отказ = Шаблон("[ПВД_ПослеОбработкиПравила_" + СокрЛП(Правило.Код) + "(ИмяПКО, Правило, ИсходящиеДанные)]"); КонецЕсли; КонецПроцедуры // ВыгрузитьДанныеПоПравилу() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВывестиОбрабатываемоеПравило(ИмяПравила) Форма.ВывестиОбрабатываемоеПравило.Заголовок(ИмяПравила); КонецПроцедуры // ВывестиОбрабатываемоеПравило(ИмяПравила) //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ОбработатьПравилаВыгрузки() мТаблицаПравилВыгрузки.ВыбратьСтроки(); Пока мТаблицаПравилВыгрузки.ПолучитьСтроку() = 1 Цикл Отключено = 0; Позиция = ПравилаВыгрузкиСписок.НайтиЗначение(мТаблицаПравилВыгрузки.Код); Если Позиция > 0 Тогда Отключено = ?(ПравилаВыгрузкиСписок.Пометка(Позиция) = 1, 0, 1); Иначе Отключено = мТаблицаПравилВыгрузки.Отключить; КонецЕсли; Если Отключено = 1 Тогда Продолжить; КонецЕсли; ВывестиОбрабатываемоеПравило(?(ПустоеЗначение(мТаблицаПравилВыгрузки.Наименование) = 1, мТаблицаПравилВыгрузки.Код, мТаблицаПравилВыгрузки.Наименование)); ВыгрузитьДанныеПоПравилу(мТаблицаПравилВыгрузки.Код); КонецЦикла; КонецПроцедуры // ОбработатьПравилаВыгрузки() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ИнициализацияФайлаОбмена() УстановитьАтрибут(rootNode, "ВерсияФормата", "2.0"); УстановитьАтрибут(rootNode, "ДатаВыгрузки", ПолучитьДатуV8(ТекущаяДата(), ТекущееВремя())); УстановитьАтрибут(rootNode, "НачалоПериодаВыгрузки", ПолучитьДатуV8(ДатаНачала)); УстановитьАтрибут(rootNode, "ОкончаниеПериодаВыгрузки", ПолучитьДатуV8(ДатаОкончания)); УстановитьАтрибут(rootNode, "ИмяКонфигурацииИсточника", мКонфигурацияИсточник); УстановитьАтрибут(rootNode, "ИмяКонфигурацииПриемника", мКонфигурацияПриемник); УстановитьАтрибут(rootNode, "ИдПравилКонвертации", мИд); УстановитьАтрибут(rootNode, "Комментарий", ""); // Правила обмена УзелПравилаОбмена = СоздатьУзел("ПравилаОбмена"); УстановитьАтрибут(УзелПравилаОбмена, "ВерсияФормата", мВерсияФормата); УстановитьАтрибут(УзелПравилаОбмена, "Ид", мИд); УстановитьАтрибут(УзелПравилаОбмена, "Наименование", мНаименование); УстановитьАтрибут(УзелПравилаОбмена, "ДатаВремяСоздания", мДатаВремяСоздания); УстановитьАтрибут(УзелПравилаОбмена, "Источник", мКонфигурацияИсточник); УстановитьАтрибут(УзелПравилаОбмена, "Приемник", мКонфигурацияПриемник); // Обработчики Если ПустоеЗначение(мКонвертацияПередЗагрузкойДанных) = 0 Тогда ЗаписатьЭлемент(УзелПравилаОбмена, "ПередЗагрузкойДанных", мКонвертацияПередЗагрузкойДанных); КонецЕсли; Если ПустоеЗначение(мКонвертацияПередЗагрузкойОбъекта) = 0 Тогда ЗаписатьЭлемент(УзелПравилаОбмена, "ПередЗагрузкойОбъекта", мКонвертацияПередЗагрузкойОбъекта); КонецЕсли; Если ПустоеЗначение(мКонвертацияПослеЗагрузкиОбъекта) = 0 Тогда ЗаписатьЭлемент(УзелПравилаОбмена, "ПослеЗагрузкиОбъекта", мКонвертацияПослеЗагрузкиОбъекта); КонецЕсли; Если ПустоеЗначение(мКонвертацияПослеЗагрузкиДанных) = 0 Тогда ЗаписатьЭлемент(УзелПравилаОбмена, "ПослеЗагрузкиДанных", мКонвертацияПослеЗагрузкиДанных); КонецЕсли; // ПКО УзелПКО = СоздатьУзел("ПравилаКонвертацииОбъектов"); мТаблицаПравилКонвертацииОбъектов.ВыбратьСтроки(); Пока мТаблицаПравилКонвертацииОбъектов.ПолучитьСтроку() > 0 Цикл УзелПравило = СоздатьУзел("Правило"); ЗаписатьЭлемент(УзелПравило, "Код", мТаблицаПравилКонвертацииОбъектов.Код); ЗаписатьЭлемент(УзелПравило, "Источник", мТаблицаПравилКонвертацииОбъектов.Источник); ЗаписатьЭлемент(УзелПравило, "Приемник", мТаблицаПравилКонвертацииОбъектов.Приемник); Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.НеЗамещать) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "НеЗамещать", мТаблицаПравилКонвертацииОбъектов.НеЗамещать); КонецЕсли; Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли", мТаблицаПравилКонвертацииОбъектов.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли); КонецЕсли; Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.ГенерироватьНовыйНомерИлиКодЕслиНеУказан) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "ГенерироватьНовыйНомерИлиКодЕслиНеУказан", мТаблицаПравилКонвертацииОбъектов.ГенерироватьНовыйНомерИлиКодЕслиНеУказан); КонецЕсли; Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.ПередЗагрузкой) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "ПередЗагрузкой", мТаблицаПравилКонвертацииОбъектов.ПередЗагрузкой); КонецЕсли; Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.ПриЗагрузке) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "ПриЗагрузке", мТаблицаПравилКонвертацииОбъектов.ПриЗагрузке); КонецЕсли; Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.ПослеЗагрузки) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "ПослеЗагрузки", мТаблицаПравилКонвертацииОбъектов.ПослеЗагрузки); КонецЕсли; Если ПустоеЗначение(мТаблицаПравилКонвертацииОбъектов.ПоследовательностьПолейПоиска) = 0 Тогда ЗаписатьЭлемент(УзелПравило, "ПоследовательностьПолейПоиска", мТаблицаПравилКонвертацииОбъектов.ПоследовательностьПолейПоиска); КонецЕсли; ДобавитьПодчиненный(УзелПКО, УзелПравило); КонецЦикла; ДобавитьПодчиненный(УзелПравилаОбмена, УзелПКО); Если ТаблицаПараметровДляЗагрузки.КоличествоСтрок() > 0 Тогда УзелПараметры = СоздатьУзел("Параметры"); ТаблицаПараметровДляЗагрузки.ВыбратьСтроки(); Пока ТаблицаПараметровДляЗагрузки.ПолучитьСтроку() = 1 Цикл УзелПараметр = СоздатьУзел("Параметр"); УстановитьАтрибут(УзелПараметр, "Имя", ТаблицаПараметровДляЗагрузки.Имя); УстановитьАтрибут(УзелПараметр, "Наименование", ТаблицаПараметровДляЗагрузки.Наименование); ДобавитьПодчиненный(УзелПараметры, УзелПараметр); КонецЦикла; ДобавитьПодчиненный(УзелПравилаОбмена, УзелПараметры); КонецЕсли; // ПОД Попытка _DOMDocument = CreateObject("Msxml2.DOMDocument.4.0"); Исключение _DOMDocument = CreateObject("Msxml2.DOMDocument"); КонецПопытки; _DOMDocument.load(ИмяФайлаПравил); УзелПОД = _DOMDocument.selectSingleNode("ПравилаОбмена/ПравилаОчисткиДанных"); ДобавитьПодчиненный(УзелПравилаОбмена, УзелПОД); УзелАлгоритмы = _DOMDocument.selectSingleNode("ПравилаОбмена/Алгоритмы"); ДобавитьПодчиненный(УзелПравилаОбмена, УзелАлгоритмы); УзелЗапросы = _DOMDocument.selectSingleNode("ПравилаОбмена/Запросы"); ДобавитьПодчиненный(УзелПравилаОбмена, УзелЗапросы); ДобавитьПодчиненный(rootNode, УзелПравилаОбмена) КонецПроцедуры // ИнициализацияФайлаОбмена() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыполнитьВыгрузку() мСчетчикВыгруженныхОбъектов = 0; Если ПустаяСтрока(ИмяФайлаДанных) = 1 Тогда Если Форма.МодальныйРежим() = 0 Тогда Предупреждение("Не указано имя файла данных!"); Иначе Сообщить("Не указано имя файла данных!"); КонецЕсли; Возврат; КонецЕсли; // Загрузка правил Если мТаблицаПравилВыгрузки.КоличествоСтрок() = 0 Тогда Если ЗагрузитьПравила() = 0 Тогда Возврат; КонецЕсли; Иначе мТаблицаПравилКонвертацииОбъектов.Заполнить(0,,, "ВсеОбъектыВыгружены"); мТаблицаПравилКонвертацииОбъектов.ВыбратьСтроки(); Пока мТаблицаПравилКонвертацииОбъектов.ПолучитьСтроку() > 0 Цикл мТаблицаПравилКонвертацииОбъектов.Выгруженные.УдалитьВсе(); КонецЦикла; КонецЕсли; ВывестиСообщение("Начало выгрузки: " + ТекущаяДата() + " " + ТекущееВремя()); Если ТипЗначенияСтр(Параметры) = "ТаблицаЗначений" Тогда Параметры.УдалитьСтроки(); Параметры.НоваяСтрока(); Параметры.ТекущаяСтрока(Параметры.КоличествоСтрок()); КонецЕсли; Попытка DOMDocument = CreateObject("Msxml2.DOMDocument.4.0"); Исключение DOMDocument = CreateObject("Msxml2.DOMDocument"); КонецПопытки; rootNode = DOMDocument.createNode(1, "ФайлОбмена", ""); ИнициализацияФайлаОбмена(); // Сохраняем текущие настройки отбора СохранитьНастройкиОтбора(); // Устанавливат значения парамтров в структуре Параметры // по таблице ТаблицаНастройкиПараметров ТаблицаНастройкиПараметров.ВыбратьСтроки(); Пока ТаблицаНастройкиПараметров.ПолучитьСтроку() = 1 Цикл Параметры.УстановитьЗначение(1, СокрЛП(ТаблицаНастройкиПараметров.Имя), ТаблицаНастройкиПараметров.Значение); КонецЦикла; // Глобальный обработчик "ПередВыгрузкойДанных" Если мКонвертацияПередВыгрузкойДанных = 1 Тогда Отказ = Шаблон("[Конвертация_ПередВыгрузкойДанных()]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; ОбработатьПравилаВыгрузки(); // Глобальный обработчик "ПослеВыгрузкиДанных" Если мКонвертацияПослеВыгрузкиДанных = 1 Тогда Отказ = Шаблон("[Конвертация_ПослеВыгрузкиДанных()]"); Если Число(Отказ) = 1 Тогда Возврат; КонецЕсли; КонецЕсли; DOMDocument.appendChild(rootNode); DOMDocument.save(ИмяФайлаДанных); ВывестиСообщение("Выгружено объектов: " + мСчетчикВыгруженныхОбъектов); ВывестиСообщение("Окончание выгрузки: " + ТекущаяДата() + " " + ТекущееВремя()); КонецПроцедуры // ВыполнитьВыгрузку() //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТКА НАСТРОЙКИ ОТБОРА ДАННЫХ //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ДобавитьУсловие() Если ПустоеЗначение(КодПВДДляНастройкиОтбора) = 0 Тогда ТаблицаНастройкиОтбора.НоваяСтрока(); ТаблицаНастройкиОтбора.Использовать = 2; ТаблицаНастройкиОтбора.Условие = "="; ТаблицаНастройкиОтбора.ТипОбъекта = ""; ТаблицаНастройкиОтбора.Объект = ""; ТаблицаНастройкиОтбора.ТекущаяСтрока(ТаблицаНастройкиОтбора.КоличествоСтрок()); КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура УдалитьУсловие() Если НЕ (ТаблицаНастройкиОтбора.ТекущаяСтрока()=0) Тогда Если ТаблицаНастройкиОтбора.НомерСтроки = ТаблицаНастройкиОтбора.КоличествоСтрок() Тогда Номер = ТаблицаНастройкиОтбора.КоличествоСтрок() - 1; Иначе Номер = ТаблицаНастройкиОтбора.НомерСтроки; КонецЕсли; ТаблицаНастройкиОтбора.УдалитьСтроку(); ТаблицаНастройкиОтбора.ТекущаяСтрока(Номер); КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗаполнитьТаблицуРеквизитов(ТипОбъекта, ВидОбъекта, Префикс = "") Если ТипОбъекта = "Справочник" Тогда Если ПустаяСтрока(Префикс) = 1 Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = "ТекущийЭлемент"; ТаблицаРеквизитов.Наименование = "Текущий элемент"; ТаблицаРеквизитов.Тип = "Справочник"; ТаблицаРеквизитов.Вид = ВидОбъекта; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "ПометкаУдаления"; ТаблицаРеквизитов.Наименование = "Пометка удаления"; ТаблицаРеквизитов.Тип = "Число"; ТаблицаРеквизитов.Длина = 1; КонецЕсли; Если НЕ (Метаданные.Справочник(ВидОбъекта).КоличествоУровней = 0) Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "Родитель"; ТаблицаРеквизитов.Наименование = "Родитель"; ТаблицаРеквизитов.Тип = "Справочник"; ТаблицаРеквизитов.Вид = ВидОбъекта; //ТаблицаРеквизитов.НоваяСтрока(); //ТаблицаРеквизитов.Ид = Префикс + "ЭтоГруппа"; //ТаблицаРеквизитов.Наименование = "Это группа"; //ТаблицаРеквизитов.Тип = "Число"; //ТаблицаРеквизитов.Длина = 1; КонецЕсли; ВладелецСтр = Метаданные.Справочник(ВидОбъекта).Владелец; Если НЕ (СокрЛП(ВладелецСтр) = "Метаданные") Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "Владелец"; ТаблицаРеквизитов.Наименование = "Владелец"; ТаблицаРеквизитов.Тип = "Справочник"; ТаблицаРеквизитов.Вид = Строка(ВладелецСтр); КонецЕсли; ДлинаМД = Метаданные.Справочник(ВидОбъекта).ДлинаКода; Если НЕ (ДлинаМД = 0) Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "Код"; ТаблицаРеквизитов.Наименование = "Код"; Если Метаданные.Справочник(ВидОбъекта).ТипКода = "Текстовый" Тогда ТаблицаРеквизитов.Тип = "Строка"; Иначе ТаблицаРеквизитов.Тип = "Число"; КонецЕсли; ТаблицаРеквизитов.Длина = ДлинаМД; КонецЕсли; ДлинаМД = Метаданные.Справочник(ВидОбъекта).ДлинаНаименования; Если НЕ (ДлинаМД = 0) Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "Наименование"; ТаблицаРеквизитов.Наименование = "Наименование"; ТаблицаРеквизитов.Тип = "Строка"; ТаблицаРеквизитов.Длина = ДлинаМД; КонецЕсли; Для Сч = 1 По Метаданные.Справочник(ВидОбъекта).Реквизит() Цикл ТипМД = Метаданные.Справочник(ВидОбъекта).Реквизит(Сч).Тип; ДлинаМД = Метаданные.Справочник(ВидОбъекта).Реквизит(Сч).Длина; Если (ТипМД = "Строка") И (ДлинаМД = 0) Тогда Продолжить; КонецЕсли; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + Метаданные.Справочник(ВидОбъекта).Реквизит(Сч).Идентификатор; ТаблицаРеквизитов.Наименование = Метаданные.Справочник(ВидОбъекта).Реквизит(Сч).Представление(); ТаблицаРеквизитов.Тип = ТипМД; ТаблицаРеквизитов.Вид = Метаданные.Справочник(ВидОбъекта).Реквизит(Сч).Вид; ТаблицаРеквизитов.Длина = ДлинаМД; ТаблицаРеквизитов.Точность = Метаданные.Справочник(ВидОбъекта).Реквизит(Сч).Точность; КонецЦикла; ИначеЕсли ТипОбъекта = "Документ" Тогда Если ПустаяСтрока(Префикс) = 1 Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = "ТекущийДокумент"; ТаблицаРеквизитов.Наименование = "Текущий документ"; ТаблицаРеквизитов.Тип = "Документ"; ТаблицаРеквизитов.Вид = ОбъектДляНастройкиОтбора; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "ПометкаУдаления"; ТаблицаРеквизитов.Наименование = "Пометка удаления"; ТаблицаРеквизитов.Тип = "Число"; ТаблицаРеквизитов.Длина = 1; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "Проведен"; ТаблицаРеквизитов.Наименование = "Проведен"; ТаблицаРеквизитов.Тип = "Число"; ТаблицаРеквизитов.Длина = 1; КонецЕсли; ДлинаМД = Метаданные.Документ(ВидОбъекта).ДлинаНомера; Если НЕ (ДлинаМД = 0) Тогда ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + "НомерДок"; ТаблицаРеквизитов.Наименование = "Номер"; Если Метаданные.Документ(ВидОбъекта).ТипНомера = "Текстовый" Тогда ТаблицаРеквизитов.Тип = "Строка"; Иначе ТаблицаРеквизитов.Тип = "Число"; КонецЕсли; ТаблицаРеквизитов.Длина = ДлинаМД; КонецЕсли; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = "ДатаДок"; ТаблицаРеквизитов.Наименование = "Дата"; ТаблицаРеквизитов.Тип = "Дата"; Для Сч = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл ТипМД = Метаданные.ОбщийРеквизитДокумента(Сч).Тип; ДлинаМД = Метаданные.ОбщийРеквизитДокумента(Сч).Длина; Если (ТипМД = "Строка") И (ДлинаМД = 0) Тогда Продолжить; КонецЕсли; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + Метаданные.ОбщийРеквизитДокумента(Сч).Идентификатор; ТаблицаРеквизитов.Наименование = Метаданные.ОбщийРеквизитДокумента(Сч).Представление(); ТаблицаРеквизитов.Тип = ТипМД; ТаблицаРеквизитов.Вид = Метаданные.ОбщийРеквизитДокумента(Сч).Вид; ТаблицаРеквизитов.Длина = ДлинаМД; ТаблицаРеквизитов.Точность = Метаданные.ОбщийРеквизитДокумента(Сч).Точность; КонецЦикла; Для Сч = 1 По Метаданные.Документ(ВидОбъекта).РеквизитШапки() Цикл ТипМД = Метаданные.Документ(ВидОбъекта).РеквизитШапки(Сч).Тип; ДлинаМД = Метаданные.Документ(ВидОбъекта).РеквизитШапки(Сч).Длина; Если (ТипМД = "Строка") И (ДлинаМД = 0) Тогда Продолжить; КонецЕсли; ТаблицаРеквизитов.НоваяСтрока(); ТаблицаРеквизитов.Ид = Префикс + Метаданные.Документ(ВидОбъекта).РеквизитШапки(Сч).Идентификатор; ТаблицаРеквизитов.Наименование = Метаданные.Документ(ВидОбъекта).РеквизитШапки(Сч).Представление(); ТаблицаРеквизитов.Тип = ТипМД; ТаблицаРеквизитов.Вид = Метаданные.Документ(ВидОбъекта).РеквизитШапки(Сч).Вид; ТаблицаРеквизитов.Длина = ДлинаМД; ТаблицаРеквизитов.Точность = Метаданные.Документ(ВидОбъекта).РеквизитШапки(Сч).Точность; КонецЦикла; КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура РедактироватьУсловие() Если ТаблицаНастройкиОтбора.ТекущаяСтрока()=0 Тогда Возврат; КонецЕсли; Если ТаблицаНастройкиОтбора.ТекущаяКолонка() = "Использовать" Тогда Если ТаблицаНастройкиОтбора.Использовать = 1 Тогда ТаблицаНастройкиОтбора.Использовать = 2; Иначе ТаблицаНастройкиОтбора.Использовать = 1; КонецЕсли; ИначеЕсли ТаблицаНастройкиОтбора.ТекущаяКолонка() = "Условие" Тогда НовоеЗначение = ТаблицаНастройкиОтбора.Условие; Если ТаблицаНастройкиОтбора.ТипОбъекта = "Справочник" Тогда Если ТипыУсловийДляСправочников.ВыбратьЗначение(НовоеЗначение, "Выбор типа условия",ТипыУсловийДляСправочников.НайтиЗначение(ТаблицаНастройкиОтбора.Условие),,2) = 1 Тогда ТаблицаНастройкиОтбора.Условие = НовоеЗначение; КонецЕсли; ИначеЕсли (ТаблицаНастройкиОтбора.ТипОбъекта = "Число") ИЛИ (ТаблицаНастройкиОтбора.ТипОбъекта = "Дата") Тогда Если ТипыУсловийДляЧисел.ВыбратьЗначение(НовоеЗначение, "Выбор типа условия",ТипыУсловийДляЧисел.НайтиЗначение(ТаблицаНастройкиОтбора.Условие),,2) = 1 Тогда ТаблицаНастройкиОтбора.Условие = НовоеЗначение; КонецЕсли; Иначе Если ТипыУсловийДляСтрок.ВыбратьЗначение(НовоеЗначение, "Выбор типа условия",ТипыУсловийДляСтрок.НайтиЗначение(ТаблицаНастройкиОтбора.Условие),,2) = 1 Тогда ТаблицаНастройкиОтбора.Условие = НовоеЗначение; КонецЕсли; КонецЕсли; ИначеЕсли ТаблицаНастройкиОтбора.ТекущаяКолонка() = "ПолеОтбора" Тогда ТаблицаРеквизитов.УдалитьСтроки(); ЗаполнитьТаблицуРеквизитов(ТипОбъектаДляНастройкиОтбора, ОбъектДляНастройкиОтбора); Если (ТаблицаНастройкиОтбора.ТипОбъекта = "Справочник") ИЛИ (ТаблицаНастройкиОтбора.ТипОбъекта = "Документа") Тогда ЗаполнитьТаблицуРеквизитов(ТаблицаНастройкиОтбора.ТипОбъекта, ТаблицаНастройкиОтбора.Объект, ТаблицаНастройкиОтбора.ПолеОтбора + "."); КонецЕсли; Если ТаблицаРеквизитов.КоличествоСтрок()=0 Тогда Возврат; КонецЕсли; СтрокаРеквизита = 0; Если ТаблицаРеквизитов.ВыбратьСтроку(СтрокаРеквизита,"Выбор реквизита отбора") = 1 Тогда ТаблицаРеквизитов.ПолучитьСтрокуПоНомеру(СтрокаРеквизита); ТаблицаНастройкиОтбора.ПолеОтбора = ТаблицаРеквизитов.Ид; ТаблицаНастройкиОтбора.ТипОбъекта = ТаблицаРеквизитов.Тип; ТаблицаНастройкиОтбора.Объект = ТаблицаРеквизитов.Вид; ТаблицаНастройкиОтбора.Длина = ТаблицаРеквизитов.Длина; ТаблицаНастройкиОтбора.Точность = ТаблицаРеквизитов.Точность; ТаблицаНастройкиОтбора.Условие = "="; Если ПустаяСтрока(ТаблицаНастройкиОтбора.Объект) = 1 Тогда ТаблицаНастройкиОтбора.Значение = ПолучитьПустоеЗначение(ТаблицаНастройкиОтбора.Объект); Иначе ТаблицаНастройкиОтбора.Значение = ПолучитьПустоеЗначение(СокрЛП(ТаблицаНастройкиОтбора.ТипОбъекта) + "." + ТаблицаНастройкиОтбора.Объект); КонецЕсли; КонецЕсли; ИначеЕсли ТаблицаНастройкиОтбора.ТекущаяКолонка() = "Значение" Тогда НовоеЗначение = ТаблицаНастройкиОтбора.Значение; Если ПустаяСтрока(ТаблицаНастройкиОтбора.Объект) = 1 Тогда Если ВвестиЗначение(НовоеЗначение, "Новое значение отбора", ТаблицаНастройкиОтбора.ТипОбъекта, ТаблицаНастройкиОтбора.Длина, ТаблицаНастройкиОтбора.Точность) = 1 тогда ТаблицаНастройкиОтбора.Значение = НовоеЗначение; КонецЕсли; Иначе Если ВвестиЗначение(НовоеЗначение, "Новое значение отбора", СокрЛП(ТаблицаНастройкиОтбора.ТипОбъекта) + "." + ТаблицаНастройкиОтбора.Объект) = 1 тогда ТаблицаНастройкиОтбора.Значение = НовоеЗначение; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура СохранитьНастройкиОтбора() Если НЕ (ПустоеЗначение(КодПВДДляНастройкиОтбора) = 1) Тогда НомерСтроки = 0; Если мТаблицаПравилВыгрузки.НайтиЗначение(КодПВДДляНастройкиОтбора, НомерСтроки, "Код") = 1 Тогда мТаблицаПравилВыгрузки.ПолучитьСтрокуПоНомеру(НомерСтроки); Если НЕ (ТипЗначенияСтр(мТаблицаПравилВыгрузки.Отбор) = "ТаблицаЗначений") Тогда мТаблицаПравилВыгрузки.Отбор = СоздатьОбъект("ТаблицаЗначений"); КонецЕсли; ТаблицаНастройкиОтбора.Выгрузить(мТаблицаПравилВыгрузки.Отбор); НомерВСписке = ПравилаВыгрузкиСписок.НайтиЗначение(КодПВДДляНастройкиОтбора); НаименованиеПВД = ""; Зн = ПравилаВыгрузкиСписок.ПолучитьЗначение(НомерВСписке,НаименованиеПВД); ЕстьПометка = ПравилаВыгрузкиСписок.Пометка(НомерВСписке); НаименованиеПВД = СтрЗаменить(НаименованиеПВД, " [ОТБОР]", ""); Если НЕ (ТаблицаНастройкиОтбора.КоличествоСтрок() = 0) Тогда ПравилаВыгрузкиСписок.УстановитьЗначение(НомерВСписке, Зн, НаименованиеПВД + " [ОТБОР]"); Если ЕстьПометка = 1 Тогда ПравилаВыгрузкиСписок.Пометка(НомерВСписке, ЕстьПометка); КонецЕсли; Иначе ПравилаВыгрузкиСписок.УстановитьЗначение(НомерВСписке, Зн, НаименованиеПВД); Если ЕстьПометка = 1 Тогда ПравилаВыгрузкиСписок.Пометка(НомерВСписке, ЕстьПометка); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура УстановитьПВДДляНастройкиОтбора() Если ПравилаВыгрузкиСписок.ТекущаяСтрока() = 0 Тогда Возврат КонецЕсли; СохранитьНастройкиОтбора(); Если ПравилаВыгрузкиСписок.ТекущаяСтрока() = 0 Тогда Возврат КонецЕсли; НомерСтроки = 0; Если мТаблицаПравилВыгрузки.НайтиЗначение(ПравилаВыгрузкиСписок.ПолучитьЗначение(ПравилаВыгрузкиСписок.ТекущаяСтрока()), НомерСтроки, "Код") = 1 Тогда мТаблицаПравилВыгрузки.ПолучитьСтрокуПоНомеру(НомерСтроки); Если мТаблицаПравилВыгрузки.ЭтоГруппа = 1 Тогда Возврат; КонецЕсли; Если НЕ (мТаблицаПравилВыгрузки.СпособОтбораДанных = "СтандартнаяВыборка") Тогда Возврат; КонецЕсли; Если Найти(мТаблицаПравилВыгрузки.ОбъектВыборки, "СправочникСсылка.") = 1 Тогда ТипОбъектаДляНастройкиОтбора = "Справочник"; ОбъектДляНастройкиОтбора = Сред(мТаблицаПравилВыгрузки.ОбъектВыборки, СтрДлина("СправочникСсылка.")+1); ИмяПВДДляНастройкиОтбора = мТаблицаПравилВыгрузки.Наименование; КодПВДДляНастройкиОтбора = мТаблицаПравилВыгрузки.Код; ИначеЕсли Найти(мТаблицаПравилВыгрузки.ОбъектВыборки, "ДокументСсылка.") = 1 Тогда ТипОбъектаДляНастройкиОтбора = "Документ"; ОбъектДляНастройкиОтбора = Сред(мТаблицаПравилВыгрузки.ОбъектВыборки, СтрДлина("ДокументСсылка.")+1); ИмяПВДДляНастройкиОтбора = мТаблицаПравилВыгрузки.Наименование; КодПВДДляНастройкиОтбора = мТаблицаПравилВыгрузки.Код; Иначе Возврат; КонецЕсли; Если ТипЗначенияСтр(мТаблицаПравилВыгрузки.Отбор) = "ТаблицаЗначений" Тогда мТаблицаПравилВыгрузки.Отбор.Выгрузить(ТаблицаНастройкиОтбора); ТаблицаНастройкиОтбора.ВыводитьПиктограммы("Использовать"); ТаблицаНастройкиОтбора.ВидимостьКолонки("ТипОбъекта", 0); ТаблицаНастройкиОтбора.ВидимостьКолонки("Объект", 0); ТаблицаНастройкиОтбора.ВидимостьКолонки("Длина", 0); ТаблицаНастройкиОтбора.ВидимостьКолонки("Точность", 0); ТаблицаНастройкиОтбора.ТекущаяСтрока(1); Иначе ТаблицаНастройкиОтбора.УдалитьСтроки(); КонецЕсли; КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция СоздатьЗапрос(ОбъектВыборки, ТабОтбор) ПрефиксЗапроса = "Обрабатывать Все; "; ПрефиксЗапросаДок = "ОбрабатыватьДокументы Все; "; Если Найти(ОбъектВыборки, "Справочник.") = 1 Тогда стрТекущий = ".ТекущийЭлемент"; Иначе стрТекущий = ".ТекущийДокумент"; КонецЕсли; ТекстЗапроса = "ПеремОбъект = " + ОбъектВыборки + стрТекущий + ";"; ТабОтбор.ВыбратьСтроки(); Пока ТабОтбор.ПолучитьСтроку() = 1 Цикл Если (ТабОтбор.ПолеОтбора = "ТекущийЭлемент") ИЛИ (ТабОтбор.ПолеОтбора = "ТекущийДокумент") Тогда Продолжить; КонецЕсли; Если (ТабОтбор.Использовать = 1) ИЛИ (ПустаяСтрока(ТабОтбор.ПолеОтбора) = 1) Тогда Продолжить; КонецЕсли; Если (ТабОтбор.Объект = "ПометкаУдаления") Тогда Если ТабОтбор.Значение = 0 Тогда ПрефиксЗапроса = "Обрабатывать НеПомеченныеНаУдаление; "; Иначе ПрефиксЗапроса = "Обрабатывать ПомеченныеНаУдаление; "; КонецЕсли; Продолжить; КонецЕсли; Если (ТабОтбор.Объект = "Проведен") Тогда Если ТабОтбор.Значение = 0 Тогда ПрефиксЗапросаДок = "ОбрабатыватьДокументы Непроведенные; "; Иначе ПрефиксЗапросаДок = "ОбрабатыватьДокументы Проведенные; "; КонецЕсли; Продолжить; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " Перем" + ТабОтбор.НомерСтроки +" = " + ОбъектВыборки + "." + ТабОтбор.ПолеОтбора + ";";//" Группировка ПеремОбъект; Без Итогов;"; КонецЦикла; ТекстЗапроса = ТекстЗапроса + " Группировка ПеремОбъект;"; ТабОтбор.ВыбратьСтроки(); Пока ТабОтбор.ПолучитьСтроку() = 1 Цикл ЗначенияДляОтбора[ТабОтбор.НомерСтроки] = ТабОтбор.Значение; Если (ТабОтбор.Использовать = 1) ИЛИ (ПустаяСтрока(ТабОтбор.ПолеОтбора) = 1) Тогда Продолжить; КонецЕсли; Если (ТабОтбор.ПолеОтбора = "ТекущийЭлемент") ИЛИ (ТабОтбор.ПолеОтбора = "ТекущийДокумент") Тогда ИмяПеременной = "ПеремОбъект"; ИначеЕсли (ТабОтбор.Объект = "ПометкаУдаления") ИЛИ (ТабОтбор.Объект = "Проведен") Тогда Продолжить; Иначе ИмяПеременной = "Перем" + ТабОтбор.НомерСтроки; КонецЕсли; Если ТабОтбор.Условие = "НЕ В" Тогда ТекстЗапроса = ТекстЗапроса + "Условие (НЕ (" + ИмяПеременной + " В ЗначенияДляОтбора[" + ТабОтбор.НомерСтроки + "]));"; Иначе ТекстЗапроса = ТекстЗапроса + "Условие (" + ИмяПеременной + " "+ ТабОтбор.Условие + " ЗначенияДляОтбора[" + ТабОтбор.НомерСтроки + "]);"; КонецЕсли; КонецЦикла; Если Найти(ОбъектВыборки, "Документ.") = 1 Тогда ТекстЗапроса = ПрефиксЗапроса + ПрефиксЗапросаДок + ТекстЗапроса; Иначе ТекстЗапроса = ПрефиксЗапроса + ТекстЗапроса; КонецЕсли; Возврат ТекстЗапроса; КонецФункции //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВключитьПометкиТаблицыОтбора(Режим) ТаблицаНастройкиОтбора.ВыбратьСтроки(); Пока ТаблицаНастройкиОтбора.ПолучитьСтроку() = 1 Цикл ТаблицаНастройкиОтбора.Использовать = Режим; КонецЦикла; КонецПроцедуры // ВключитьПометки() //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ПриОткрытии() ИмяКоманды = ""; СписокПараметров = Форма.Параметр; Если ПустоеЗначение(СписокПараметров) = 0 Тогда ИмяФайлаПравил = СписокПараметров.Получить("ИмяФайлаПравил"); ИмяФайлаДанных = СписокПараметров.Получить("ИмяФайлаДанных"); ДатаНачала = СписокПараметров.Получить("ДатаНачала"); ДатаОкончания = СписокПараметров.Получить("ДатаОкончания"); ИмяКоманды = СписокПараметров.Получить("ИмяКоманды"); ЗнТаблицаНастройкиПараметров = СписокПараметров.Получить("ТаблицаНастройкиПараметров"); КомментироватьВыгрузкуОбъектов = СписокПараметров.Получить("КомментироватьВыгрузкуОбъектов"); мИспользуемыеПравилаВыгрузки = СписокПараметров.Получить("ИспользуемыеПравилаВыгрузки"); ИмяАлгоритма = СписокПараметров.Получить("ИмяАлгоритма"); КонецЕсли; // Обрабатываем закладки Форма.ИспользоватьЗакладки(1); Форма.Закладки.ДобавитьЗначение("Правила выгрузки"); Форма.Закладки.ДобавитьЗначение("Параметры"); Форма.Закладки.ТекущаяСтрока(1); Форма.ИспользоватьСлой("Основной,ПравилаВыгрузки"); Попытка FSO = СоздатьОбъект("Scripting.FileSystemObject"); Исключение КонецПопытки; Компоненты = СоздатьОбъект("ТаблицаЗначений"); Компоненты.НоваяКолонка("Путь"); Компоненты.НоваяКолонка("МожноЗагружать"); Компоненты.НоваяСтрока(); Компоненты.Путь = КаталогПрограммы() + "v7plus.dll"; Компоненты.МожноЗагружать = 0; Компоненты.НоваяСтрока(); Компоненты.Путь = КаталогИБ() + "v7plus.dll"; Компоненты.МожноЗагружать = 0; Компоненты.НоваяСтрока(); Компоненты.Путь = КаталогИБ() + "ExtForms\" + "v7plus.dll"; Компоненты.МожноЗагружать = 0; МожноПроверятьВерсию = Найти(ТипЗначенияСтр(FSO), "OLE.IFileSystem"); Компоненты.ВыбратьСтроки(); Пока Компоненты.ПолучитьСтроку() = 1 Цикл Если МожноПроверятьВерсию = 1 Тогда Если FSO.FileExists(Компоненты.Путь) <> 0 Тогда Если FSO.GetFileVersion(Компоненты.Путь) = "7.70.0.11" Тогда Компоненты.МожноЗагружать = 1; КонецЕсли; КонецЕсли; Иначе Компоненты.МожноЗагружать = ФС.СуществуетФайл(Компоненты.Путь); КонецЕсли; КонецЦикла; Если Компоненты.Итог("МожноЗагружать") = 0 Тогда ТекстОшибки = "Компонента v7plus.dll версии 7.70.0.11 не найдена!"; Если Форма.МодальныйРежим() = 0 Тогда Предупреждение(ТекстОшибки, 60); Иначе Сообщить(ТекстОшибки); Если ПустаяСтрока(ИмяКоманды) = 0 Тогда ЗафиксироватьОшибку(ТекстОшибки); Форма.Параметр = СписокОшибок; СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; Возврат; КонецЕсли; КомпонентаУспешноЗагружена = 0; Компоненты.ВыбратьСтроки(); Пока Компоненты.ПолучитьСтроку() = 1 Цикл Если Компоненты.МожноЗагружать = 0 Тогда Продолжить; КонецЕсли; КомпонентаУспешноЗагружена = ЗагрузитьВнешнююКомпоненту(Компоненты.Путь); Если КомпонентаУспешноЗагружена = 1 Тогда Прервать; КонецЕсли; КонецЦикла; Если КомпонентаУспешноЗагружена = 0 Тогда ТекстОшибки = "Компонента v7plus.dll не найдена!"; Если Форма.МодальныйРежим() = 0 Тогда Предупреждение(ТекстОшибки, 60); Иначе Сообщить(ТекстОшибки); Если ПустаяСтрока(ИмяКоманды) = 0 Тогда ЗафиксироватьОшибку(ТекстОшибки); Форма.Параметр = СписокОшибок; СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; Возврат; КонецЕсли; мXMLАнализатор = СоздатьОбъект("AddIn.XMLParser"); мЧтениеXML = мXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент(); // Инициализация правил ИнициализацияПравилВыгрузки(); ИнициализацияПравилКонвертацииОбъектов(); // Инициализация таблицы настройки параметров ИнициализацияТаблицыНастройкиПараметров(); Если ПустоеЗначение(СписокПараметров) = 0 Тогда ЗагрузитьПравилаОбмена(); // Если в правилах нет ни одного параметра, который необходимо настраивать, // то в обработку могли ничего и не передать Если ПустоеЗначение(ЗнТаблицаНастройкиПараметров) = 0 Тогда ПредставлениеЗначения = ""; Для НомерСтрокиСписка = 1 По ЗнТаблицаНастройкиПараметров.РазмерСписка() Цикл ЗнТаблицаНастройкиПараметров.ПолучитьЗначение(НомерСтрокиСписка, ПредставлениеЗначения); СтрокаТаблицы = ""; Если ТаблицаНастройкиПараметров.НайтиЗначение(ПредставлениеЗначения,СтрокаТаблицы,1) = 1 Тогда ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(СтрокаТаблицы); ТаблицаНастройкиПараметров.Значение = ЗнТаблицаНастройкиПараметров.Получить(ПредставлениеЗначения); КонецЕсли; КонецЦикла; КонецЕсли; Если ИмяКоманды = "Выгрузить" Тогда Выгрузить(); СтатусВозврата(0); Возврат; ИначеЕсли ИмяКоманды = "ВыполнитьАлгоритм" Тогда // Выполним алгоритм правил обмена и вернем результат в параметр формы Форма.Параметр = ЗначениеИзСтрокиВнутр(Шаблон("[" + ИмяАлгоритма + "()]")); СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; КонецПроцедуры // ПриОткрытии() //****************************************************************************** // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки) Если НомерЗакладки = 1 Тогда Форма.ИспользоватьСлой("Основной, ПравилаВыгрузки"); ИначеЕсли НомерЗакладки = 2 Тогда Форма.ИспользоватьСлой("Основной, Параметры"); КонецЕсли; КонецПроцедуры // ПриВыбореЗакладки() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура УправлениеПометками(Пометка, КодПравила) Для Индекс = 1 По мТаблицаПравилВыгрузки.КоличествоСтрок() Цикл Если мТаблицаПравилВыгрузки.ПолучитьЗначение(Индекс, "Родитель") = КодПравила Тогда ПравилаВыгрузкиСписок.Пометка(ПравилаВыгрузкиСписок.НайтиЗначение(мТаблицаПравилВыгрузки.ПолучитьЗначение(Индекс, "Код")), Пометка); УправлениеПометками(Пометка, мТаблицаПравилВыгрузки.ПолучитьЗначение(Индекс, "Код")); КонецЕсли; КонецЦикла; КонецПроцедуры // УправлениеПометками() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Функция УправлениеПометкамиПравилаВыгрузкиСписок() ТекущаяСтрокаПравилаВыгрузкиСписок = ПравилаВыгрузкиСписок.ТекущаяСтрока(); Если ТекущаяСтрокаПравилаВыгрузкиСписок = 0 Тогда Возврат ""; КонецЕсли; НомерСтроки = 0; Если мТаблицаПравилВыгрузки.НайтиЗначение(ПравилаВыгрузкиСписок.ПолучитьЗначение(ТекущаяСтрокаПравилаВыгрузкиСписок, ""), НомерСтроки, "Код") = 1 Тогда Если мТаблицаПравилВыгрузки.ЭтоГруппа = 0 Тогда Возврат ""; КонецЕсли; Пометка = ПравилаВыгрузкиСписок.Пометка(ТекущаяСтрокаПравилаВыгрузкиСписок); КодПравила = мТаблицаПравилВыгрузки.ПолучитьЗначение(НомерСтроки, "Код"); УправлениеПометками(Пометка, КодПравила); КонецЕсли; КонецФункции // УправлениеПометкамиПравилаВыгрузкиСписок() //****************************************************************************** // ВыборФайла(ИмяФайла, Фильтр = "xml") // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВыборФайла(ТипДиалога = 0, ИмяФайла, ИмяФильтра = "", Фильтр = "xml") Каталог = ""; Стр = ИмяФильтра + " (*." + Фильтр + ")|*." + Фильтр + ""; Если ФС.ВыбратьФайл(ТипДиалога, ИмяФайла, Каталог, "Выберите файл", Стр, , ) = 1 Тогда ИмяФайла = Каталог + ИмяФайла; КонецЕсли; КонецПроцедуры // ВыборФайла() //****************************************************************************** // ОткрытьФайлДляПросмотра(ИмяФайла) // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ОткрытьФайлДляПросмотра(ИмяФайла) Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда ЗапуститьПриложение(ИмяФайла); Иначе Если Форма.МодальныйРежим() = 0 Тогда Предупреждение("Файл с таким именем не существует!"); Иначе Сообщить("Файл с таким именем не существует!"); КонецЕсли; КонецЕсли; КонецПроцедуры // ОткрытьФайлДляПросмотра(ИмяФайла) //****************************************************************************** // ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр) // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр) Если ИдентЭлемДиалога = "ИмяФайлаПравил" Тогда ВыборФайла(, ИмяФайлаПравил, "Файл правил"); ИначеЕсли ИдентЭлемДиалога = "ИмяФайлаДанных" Тогда ВыборФайла(1, ИмяФайлаДанных, "Файл данных"); КонецЕсли; КонецПроцедуры // ПриНачалеВыбораЗначения() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ВключитьПометки(Режим) Для Индекс = 1 По ПравилаВыгрузкиСписок.РазмерСписка() Цикл ПравилаВыгрузкиСписок.Пометка(Индекс, Режим); КонецЦикла; КонецПроцедуры // ВключитьПометки() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура УстановитьЗначенияПараметра() ТекПозиция = ТаблицаНастройкиПараметров.ТекущаяСтрока(); ТекКолонка = ТаблицаНастройкиПараметров.ТекущаяКолонка(); Если ТекПозиция = 0 Тогда Возврат; КонецЕсли; Если НЕ (ТекКолонка = "Значение") Тогда Возврат; КонецЕсли; ТипЗнач = ТаблицаНастройкиПараметров.ТипЗначения; ВидЗнач = ТаблицаНастройкиПараметров.ВидЗначения; Значение = ТаблицаНастройкиПараметров.Значение; Если ТипЗнач = "Строка" Тогда Если ВвестиЗначение(Значение,"Введите значение параметра " + ТаблицаНастройкиПараметров.Наименование, "Строка", 100) = 1 Тогда ТаблицаНастройкиПараметров.Значение = Значение; КонецЕсли; ИначеЕсли ТипЗнач = "Число" Тогда Если ВвестиЗначение(Значение,"Введите значение параметра " + ТаблицаНастройкиПараметров.Наименование, "Число", 15) = 1 Тогда ТаблицаНастройкиПараметров.Значение = Значение; КонецЕсли; ИначеЕсли ТипЗнач = "Дата" Тогда Если ВвестиЗначение(Значение,"Введите значение параметра " + ТаблицаНастройкиПараметров.Наименование, "Дата") = 1 Тогда ТаблицаНастройкиПараметров.Значение = Значение; КонецЕсли; ИначеЕсли ТипЗнач = "Перечисление" Тогда Если ВвестиПеречисление(Значение,"Введите значение параметра " + ТаблицаНастройкиПараметров.Наименование) = 1 Тогда ТаблицаНастройкиПараметров.Значение = Значение; КонецЕсли; ИначеЕсли ТипЗнач = "Справочник" Тогда Если ВвестиЗначение(Значение,"Введите значение параметра " + ТаблицаНастройкиПараметров.Наименование, "Справочник."+ ТаблицаНастройкиПараметров.ВидЗначения) = 1 Тогда ТаблицаНастройкиПараметров.Значение = Значение; КонецЕсли; ИначеЕсли ТипЗнач = "Документ" Тогда Если ВвестиЗначение(Значение,"Введите значение параметра " + ТаблицаНастройкиПараметров.Наименование, "Документ."+ ТаблицаНастройкиПараметров.ВидЗначения) = 1 Тогда ТаблицаНастройкиПараметров.Значение = Значение; КонецЕсли; КонецЕсли; КонецПроцедуры //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗагрузитьПравилаОбмена() ЗагрузитьПравила(); КонецПроцедуры // ЗагрузитьПравилаОбмена() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура Выгрузить() ВыполнитьВыгрузку(); Если Форма.МодальныйРежим() = 0 Тогда Предупреждение("Выгрузка данных завершена."); Иначе Сообщить("Выгрузка данных завершена."); КонецЕсли; Форма.Параметр = СписокОшибок; КонецПроцедуры // Выгрузить() //****************************************************************************** // // // Параметры: // // Возвращаемое значение: // // Описание: // Процедура ЗафиксироватьОшибку(ТекстОшибки) СписокОшибок.ДобавитьЗначение(ТекстОшибки); КонецПроцедуры // ЗафиксироватьОшибку() //////////////////////////////////////////////////////////////////////////////// // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ //////////////////////////////////////////////////////////////////////////////// мНачалоНовогоЭлемента = 1; мИнструкцияОбработки = 2; мКонецУровня = 3; мКонецДокумента = 4; мКонвертацияПередВыгрузкойДанных = 0; мКонвертацияПередВыгрузкойОбъекта = 0; мКонвертацияПередКонвертациейОбъекта = 0; мКонвертацияПослеВыгрузкиОбъекта = 0; мКонвертацияПослеВыгрузкиДанных = 0; мПустоеЗначение = ПолучитьПустоеЗначение(); ТаблицаНастройкиПараметров.НоваяКолонка("Имя"); ТаблицаНастройкиПараметров.НоваяКолонка("Наименование",,,,"Наименование параметра"); ТаблицаНастройкиПараметров.НоваяКолонка("Значение",,,,"Значение параметра"); ТаблицаНастройкиПараметров.НоваяКолонка("ТипЗначения"); ТаблицаНастройкиПараметров.НоваяКолонка("ВидЗначения"); ТаблицаНастройкиПараметров.ВидимостьКолонки("Имя",0,); ТаблицаНастройкиПараметров.ВидимостьКолонки("ТипЗначения",0,); ТаблицаНастройкиПараметров.ВидимостьКолонки("ВидЗначения",0,); ТаблицаПараметровДляЗагрузки = СоздатьОбъект("ТаблицаЗначений"); ТаблицаПараметровДляЗагрузки.НоваяКолонка("Имя"); ТаблицаПараметровДляЗагрузки.НоваяКолонка("Наименование"); ТаблицаНастройкиОтбора.НоваяКолонка("Использовать", "Число",,, "", 5); ТаблицаНастройкиОтбора.НоваяКолонка("ПолеОтбора", "Строка",,,"Реквизит отбора"); ТаблицаНастройкиОтбора.НоваяКолонка("Условие", "Строка",,, "", 5); ТаблицаНастройкиОтбора.НоваяКолонка("Значение"); ТаблицаНастройкиОтбора.НоваяКолонка("ТипОбъекта", "Строка"); ТаблицаНастройкиОтбора.НоваяКолонка("Объект", "Строка"); ТаблицаНастройкиОтбора.НоваяКолонка("Длина", "Число"); ТаблицаНастройкиОтбора.НоваяКолонка("Точность", "Число"); ТаблицаНастройкиОтбора.ВыводитьПиктограммы("Использовать"); ТаблицаНастройкиОтбора.ВидимостьКолонки("ТипОбъекта", 0); ТаблицаНастройкиОтбора.ВидимостьКолонки("Объект", 0); ТаблицаНастройкиОтбора.ВидимостьКолонки("Длина", 0); ТаблицаНастройкиОтбора.ВидимостьКолонки("Точность", 0); ТипыУсловийДляСтрок = СоздатьОбъект("СписокЗначений"); ТипыУсловийДляСтрок.ДобавитьЗначение("="); ТипыУсловийДляСтрок.ДобавитьЗначение("<>"); ТипыУсловийДляЧисел = СоздатьОбъект("СписокЗначений"); ТипыУсловийДляЧисел.ДобавитьЗначение("="); ТипыУсловийДляЧисел.ДобавитьЗначение(">"); ТипыУсловийДляЧисел.ДобавитьЗначение("<"); ТипыУсловийДляЧисел.ДобавитьЗначение("<="); ТипыУсловийДляЧисел.ДобавитьЗначение(">="); ТипыУсловийДляЧисел.ДобавитьЗначение("<>"); ТипыУсловийДляСправочников = СоздатьОбъект("СписокЗначений"); ТипыУсловийДляСправочников.ДобавитьЗначение("="); ТипыУсловийДляСправочников.ДобавитьЗначение("<>"); ТипыУсловийДляСправочников.ДобавитьЗначение("В"); ТипыУсловийДляСправочников.ДобавитьЗначение("НЕ В"); ТаблицаРеквизитов = СоздатьОбъект("ТаблицаЗначений"); ТаблицаРеквизитов.НоваяКолонка("Ид", "Строка"); ТаблицаРеквизитов.НоваяКолонка("Наименование", "Строка"); ТаблицаРеквизитов.НоваяКолонка("Тип", "Строка"); ТаблицаРеквизитов.НоваяКолонка("Вид", "Строка"); ТаблицаРеквизитов.НоваяКолонка("Длина", "Строка"); ТаблицаРеквизитов.НоваяКолонка("Точность", "Строка"); СписокОшибок = СоздатьОбъект("СписокЗначений");