Цитата(Petre @ 24.11.14, 15:40) необходимо зарегистрироваться для просмотра ссылки
минимизировать переписывание кода
Это самое то, чего хочу, только вот глядя на код конфигурации, понимаю что менять придется 100% того что есть

Процедура ВыгрузкаПоСхеме(ИмяСхемы, НужнаяСтруктура, тбПоказателиШапка,тбПоказателиТело, фОшибка, Схема, ИмяТабличногоПоля, ТаблицаОшибок)
перем ИмяНужнойГруппы, СтруктураНужнойГруппы;
// формируем имя файла
//данные всегда берутся из служебной области
Если Сред (ИмяСхемы,1,4) = "JFSS" Тогда
КодВФонде = СокрЛП(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаОтчетФССУтратаТрудосп.CSTRAX);
ИмяФайла = "Z" + КодВФонде + ".xml";
Иначе
КодНалоговой = ДополнитьСтрокуСимволами(СокрЛП(Формат(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_STI,"ЧЦ=4;ЧГ=0")),"0",4 ,1); // дополним нулями слева
КодФирмы = ДополнитьСтрокуСимволами(СокрЛП(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.TIN),"0",10,1); // ЕДРПОУ
МесяцПериода = ДополнитьСтрокуСимволами(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.PERIOD_MONTH,"0",2 ,1);
ГодПериода = Формат(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.PERIOD_YEAR, "ЧЦ=4;ЧГ=;");
Попытка
СостояниеОтчета = ДополнитьСтрокуСимволами(НужнаяСтруктура.C_DOC_STAN,"0",1 ,1);
Исключение
СостояниеОтчета = ДополнитьСтрокуСимволами(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_DOC_STAN,"0",1 ,1);
КонецПопытки;
Если СостояниеОтчета = "0" Тогда
СостояниеОтчета = "1";
КонецЕсли;
ТипОтчета = ДополнитьСтрокуСимволами(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_DOC_TYPE,"0",2 ,1);
КодНалоговойОриг = "";
Если НЕ спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.Свойство("C_STI_ORIG", КодНалоговойОриг) Тогда
КодНалоговойОриг = КодНалоговой;
КонецЕсли;
КодНалоговойОриг = ДополнитьСтрокуСимволами(СокрЛП(Формат(КодНалоговойОриг,"ЧЦ=4;ЧГ=0")),"0",4 ,1);
// поддержка выгрузки многостраничных отчетов
текC_DOC_CNT = Неопределено;
Если НужнаяСтруктура.Свойство("C_DOC_CNT", текC_DOC_CNT) Тогда
НомерВПериоде = ДополнитьСтрокуСимволами(Строка(текC_DOC_CNT),"0",7 ,1);
Иначе
НомерВПериоде = ДополнитьСтрокуСимволами(Строка(мC_DOC_CNT),"0",7 ,1);
КонецЕсли;
ТипПериода= "";
Если НЕ спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.Свойство("PERIOD_TYPE", ТипПериода) Тогда
ТипПериода = 1;
КонецЕсли;
ТипПериода = СОКРЛП(Лев(ТипПериода,1));
// новый порядок формирования имени файла
ИмяФайла = КодНалоговой + КодФирмы + ИмяСхемы+ СостояниеОтчета + ТипОтчета + НомерВПериоде + ТипПериода + МесяцПериода + ГодПериода + КодНалоговойОриг + ".xml";
КонецЕсли;
Сообщить(НСтр("ru='- Начало выгрузки в файл ';uk='- Початок вивантаження у файл '")+ ИмяФайла);
Попытка
ДокЭкспорт = Новый COMОбъект("Msxml2.DOMDocument.4.0");
Исключение
Попытка
ДокЭкспорт = Новый COMОбъект("Msxml2.DOMDocument.3.0");
Исключение
фОшибка = 1;
Возврат;
КонецПопытки;
КонецПопытки;
pi =ДокЭкспорт.createProcessingInstruction("xml", "version=""1.0"" encoding=""windows-1251""");
ДокЭкспорт.insertBefore(pi, ДокЭкспорт.childNodes.item(0));
Если Сред (ИмяСхемы,1,4) = "JFSS" Тогда //Если это РегламентированныйОтчетФСС тогда
// ДокЭкспорт.createProcessingInstruction("encoding", "'windows-1251'");
//Если это не первый квартал, то открываем уже сформированный файл и дописываем в него
//если открыть не удалось - ошибка.
Если НЕ ЗначениеЗаполнено(ПолучитьИзСтруктуры("P1", НужнаяСтруктура)) Тогда
Если НЕ ДокЭкспорт.Load(КаталогДанныхЭкспорта + "\" + ИмяФайла) Тогда
Сообщить(НСтр("ru='Не удалось открыть файл отчета за первый квартал для добавления данных!"
"Для экспорта нужно создать новый файл!';uk='Не вдалося відкрити файл звіту за перший квартал для додавання даних!"
"Для експорту потрібно створити новий файл!'"), СтатусСообщения.Важное);
//---------------------------
Если Вопрос(НСтр("ru='Создать новый файл?';uk='Створити новий файл?'"), РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
// главный элемент F4
элДокумента = ДокЭкспорт.createElement("F4");
ДокЭкспорт.appendChild(элДокумента);
Для Каждого СтрокаШапки из тбПоказателиШапка Цикл
ВыгрузитьПоказатель(элДокумента, СтрокаШапки.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаШапки.Имя, НужнаяСтруктура),СтрокаШапки.Тип,ИмяСхемы));
Если (СтрокаШапки.Имя = "DATA") Тогда
НовыйЭлемент = ДокЭкспорт.createElement(СтрокаШапки.Имя);
элДокумента.appendChild(НовыйЭлемент);
ЭлементСДанными = НовыйЭлемент;
Для Каждого СтрокаТела Из тбПоказателиТело Цикл
НовыйЭлемент = ДокЭкспорт.createElement(СтрокаТела.Имя);
ЭлементСДанными.appendChild(НовыйЭлемент);
ЭлементНужногоКвартала = НовыйЭлемент;
тбПоказателиТаблицы = СтрокаТела.Таблица;
Если ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура) = "" Тогда
Для Каждого строка Из тбПоказателиТаблицы Цикл
ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
ПреобразоватьТипXML(Неопределено,строка.Тип,ИмяСхемы));
КонецЦикла;
ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя, "0,");
Иначе
Для Каждого строка Из тбПоказателиТаблицы Цикл
ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(строка.Имя, НужнаяСтруктура),строка.Тип,ИмяСхемы));
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ВыгрузитьПоказатель(элДокумента, "DATAF14",);
//---------------------------
Иначе
// Тут нужно разбирать загруженный файл, и писать в него необходимые данные
УзКорень=ДокЭкспорт.DocumentElement;
//УзОтношенияСписок=УзКорень.SelectNodes("//*[name()='Data']");
Для ИндКор=1 По УзКорень.childNodes.Length Цикл
УзОтношение=УзКорень.childNodes.item(ИндКор-1);
Если ВРег(УзОтношение.BaseName)=ВРег("Data") Тогда
//Перебираем закладки P1-P4
Для ИндКор2 = 1 По УзОтношение.childNodes.length Цикл
УзелР = УзОтношение.childNodes.item(ИндКор2-1);
//Теперь мы "внутри" одного из разделов
//выбираем нужный, и пишем в него данные.
Если НЕ ЗначениеЗаполнено(ПолучитьИзСтруктуры(тбПоказателиТело[ИндКор2-1].Имя, НужнаяСтруктура)) Тогда
// сюда прописываем действия производимые с "другими периодами"
Иначе
Для Инд=1 По УзелР.childNodes.length Цикл
УзелР.removechild(УзелР.childNodes.item(0));
КонецЦикла;
тбПоказателиТаблицы = тбПоказателиТело[ИндКор2-1].Таблица;
Для Каждого строка Из тбПоказателиТаблицы Цикл
ВыгрузитьПоказатель(УзелР, строка.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(строка.Имя, НужнаяСтруктура),строка.Тип,ИмяСхемы));
КонецЦикла
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе // Если это первый квартал, то создаём новый файл
// главный элемент F4
элДокумента = ДокЭкспорт.createElement("F4");
ДокЭкспорт.appendChild(элДокумента);
Для Каждого СтрокаШапки из тбПоказателиШапка Цикл
ВыгрузитьПоказатель(элДокумента, СтрокаШапки.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаШапки.Имя, НужнаяСтруктура),СтрокаШапки.Тип,ИмяСхемы));
Если (СтрокаШапки.Имя = "DATA") Тогда
НовыйЭлемент = ДокЭкспорт.createElement(СтрокаШапки.Имя);
элДокумента.appendChild(НовыйЭлемент);
ЭлементСДанными = НовыйЭлемент;
Для Каждого СтрокаТела Из тбПоказателиТело Цикл
НовыйЭлемент = ДокЭкспорт.createElement(СтрокаТела.Имя);
ЭлементСДанными.appendChild(НовыйЭлемент);
ЭлементНужногоКвартала = НовыйЭлемент;
тбПоказателиТаблицы = СтрокаТела.Таблица;
Если ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура) = "" Тогда
Для Каждого строка Из тбПоказателиТаблицы Цикл
ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
ПреобразоватьТипXML(Неопределено,строка.Тип,ИмяСхемы));
КонецЦикла;
ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя, "0,");
Иначе
Для Каждого строка Из тбПоказателиТаблицы Цикл
ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(строка.Имя, НужнаяСтруктура),строка.Тип,ИмяСхемы));
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ВыгрузитьПоказатель(элДокумента, "DATAF14",);
КонецЕсли;
Иначе
//Если это не РегламентированныйОтчетФСС тогда
// Данные, которые зависят от схемы
СлужебнаяСтруктура.Вставить("C_DOC", Сред(ИмяСхемы,1,3));
СлужебнаяСтруктура.Вставить("C_DOC_SUB",Сред(ИмяСхемы,4,3));
СлужебнаяСтруктура.Вставить("C_DOC_VER",Число(Сред(ИмяСхемы,7,2)));
СлужебнаяСтруктура.Вставить("SOFTWARE", "SOFTWARE");
// главный элемент DECLAR
элДокумента = ДокЭкспорт.createElement("DECLAR");
ДокЭкспорт.appendChild(элДокумента);
элДокумента.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
элДокумента.setAttribute("xsi:noNamespaceSchemaLocation",ИмяСхемы+".xsd");
элШапка = ДокЭкспорт.createElement("DECLARHEAD");
элДокумента.appendChild(элШапка);
Для Каждого СтрокаШапки из тбПоказателиШапка Цикл
ОписаниеОшибки = "";
ВыгрузитьПоказатель(элШапка,
СтрокаШапки.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаШапки.Имя, НужнаяСтруктура),СтрокаШапки.Тип,ИмяСхемы,ОписаниеОшибки));
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
СтрокаОшибки = ТаблицаОшибок.Добавить();
СтрокаОшибки.ИмяТабличногоПоля = ?(НужнаяСтруктура.Свойство(СтрокаШапки.Имя),ИмяТабличногоПоля,"ПолеТабличногоДокументаСлужебныеДанные");;
СтрокаОшибки.ИмяПоказателя = СтрокаШапки.Имя;
СтрокаОшибки.ОписаниеОшибки = ОписаниеОшибки;
КонецЕсли;
КонецЦикла;
элТело = ДокЭкспорт.createElement("DECLARBODY");
элДокумента.appendChild(элТело);
СтруктураМногострочныхРазделов = спПараметры.ДанныеМногострочныхРазделов;
Для Каждого СтрокаТела Из тбПоказателиТело Цикл
Если СтрокаТела.Тип = "Таблица" Тогда
ИмяНужнойГруппы = "";
тбПоказателиТаблицы = СтрокаТела.Таблица;
Если Префикс = Неопределено Или Не ЗначениеЗаполнено(Префикс) Тогда
ИмяНужнойГруппы = ПолучитьИзСтруктурыГруппы(тбПоказателиТаблицы[0].Имя);
Иначе
ИмяНужнойГруппы = ПолучитьИзСтруктурыГруппы(тбПоказателиТаблицы[0].Имя);
ИмяНужнойГруппы = Префикс + ИмяНужнойГруппы;
КонецЕсли;
СтруктураМногострочныхРазделов.Свойство(ИмяНужнойГруппы,СтруктураНужнойГруппы);
//здесь будет получение из структуры "ДанныеМногостсрочных разделов"
//строка тела соответствует таблице значений с элементами одной группы
РеальныйИндСтроки = 1;
спСтроки = Новый СписокЗначений;
Для ИндСтроки = 0 По СтруктураНужнойГруппы.Количество() - 1 Цикл // Максимально допустимое число строк
спЗначенияXML = Новый Соответствие;
Для Каждого строка Из тбПоказателиТаблицы Цикл
ИмяПоказателя = ИмяПоказателяВТаблице(строка.Имя,РеальныйИндСтроки);
ИмяКолонки = СтрЗаменить(строка.Имя,"XXXX","");
Данные = СтруктураНужнойГруппы[ИндСтроки][ИмяКолонки];
ОписаниеОшибки = "";
ЗначениеXML = ПреобразоватьТипXML(Данные,строка.Тип,ИмяСхемы,ОписаниеОшибки);
спЗначенияXML.Вставить(строка.Имя,ЗначениеXML);
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
СтрокаОшибки = ТаблицаОшибок.Добавить();
СтрокаОшибки.ИмяТабличногоПоля = ИмяТабличногоПоля;
СтрокаОшибки.ИмяПоказателя = ИмяПоказателя;
СтрокаОшибки.ОписаниеОшибки = ОписаниеОшибки;
КонецЕсли;
КонецЦикла;
Если СтарыйТипВыгрузки Тогда
Для Инд = 0 По спЗначенияXML.Количество() - 1 Цикл
ИмяПоказателя = тбПоказателиТаблицы[Инд].Имя;
ЗначениеXML = спЗначенияXML[ИмяПоказателя];
ВыгрузитьПоказатель(элТело, ИмяПоказателя, ЗначениеXML, Новый Структура("ROWNUM", РеальныйИндСтроки));
КонецЦикла;
РеальныйИндСтроки = РеальныйИндСтроки + 1;
Иначе
// Записываем в список
спСтроки.Добавить(спЗначенияXML);
РеальныйИндСтроки = РеальныйИндСтроки + 1;
КонецЕсли;
КонецЦикла;
Если НЕ СтарыйТипВыгрузки Тогда
// Выгружаем
Для Каждого Показатель Из тбПоказателиТаблицы Цикл
ИмяПоказателя = Показатель.Имя;
Для ИндС = 0 По спСтроки.Количество() - 1 Цикл
спЗначенияXML = спСтроки[ИндС].Значение;
// Выгружаем
ЗначениеXML = спЗначенияXML[ИмяПоказателя];
ВыгрузитьПоказатель(элТело, ИмяПоказателя, ЗначениеXML, Новый Структура("ROWNUM",ИндС+1));
КонецЦикла;
КонецЦикла;
КонецЕсли;
Иначе
Если НЕ (ИмяСхемы = "R1201501" И СтрокаТела.Имя = "INN") Тогда
ОписаниеОшибки = "";
ВыгрузитьПоказатель(элТело, СтрокаТела.Имя,
ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура),
СтрокаТела.Тип,
ИмяСхемы,ОписаниеОшибки));
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
СтрокаОшибки = ТаблицаОшибок.Добавить();
СтрокаОшибки.ИмяТабличногоПоля = ?(НужнаяСтруктура.Свойство(СтрокаТела.Имя),ИмяТабличногоПоля,"ПолеТабличногоДокументаСлужебныеДанные");
СтрокаОшибки.ИмяПоказателя = СтрокаТела.Имя;
СтрокаОшибки.ОписаниеОшибки = ОписаниеОшибки;
КонецЕсли;
Иначе
ТаблицаЗапроса = ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура);
Если НЕ ТипЗнч(ТаблицаЗапроса) = Тип("ТаблицаЗначений")Тогда
Продолжить;
КонецЕсли;
Для каждого СтрокаТаблицы Из ТаблицаЗапроса Цикл
ОписаниеОшибки = "";
Значение = СтрокаТаблицы.T1ZINN;
QDATE = СтрокаТаблицы.T1ZQDATE;
QNUM = СтрокаТаблицы.T1ZQNUM;
RNUM = СтрокаТаблицы.T1ZRNUM;
ROWNUM = ТаблицаЗапроса.Индекс(СтрокаТаблицы) + 1;
//<!--Загальний тип "Індивідуальний податковий номер "-->
Если НЕ ЗначениеЗаполнено(Значение) Тогда
Результат = 0;
ИначеЕсли ТипЗнч(Значение)=Тип("Строка") Тогда
Результат = СтрЗаменить(Значение, " ", "");
Результат = СтрЗаменить(Результат, ",", ".");
ИначеЕсли ТипЗнч(Значение)=Тип("Число") Тогда
Результат = Формат(Значение,"ЧДЦ=0; ЧГ=0");
Иначе
Результат = СокрЛП(Строка(Значение));
КонецЕсли;
Попытка
Контроль = Число(Результат);
Если Найти(Результат, ".") > 0
ИЛИ Контроль < 1000
ИЛИ Контроль > 999999999999
ИЛИ Цел(Контроль) <> Контроль Тогда
ОписаниеОшибки = "Значение не является целым числом от 1000 до 999999999999";
КонецЕсли;
Исключение
ОписаниеОшибки = "Значение не является целым числом от 1000 до 999999999999";
КонецПопытки;
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
СтрокаОшибки = ТаблицаОшибок.Добавить();
СтрокаОшибки.ИмяТабличногоПоля = "ПолеТабличногоДокументаНалоговыйДокумент";
СтрокаОшибки.ИмяПоказателя = "T1Z" + Формат(ТаблицаЗапроса.Индекс(СтрокаТаблицы) + 1,"ЧЦ=4;ЧВН=0;ЧГ=;") + "INN";
СтрокаОшибки.ОписаниеОшибки = ОписаниеОшибки;
КонецЕсли;
// проверка аттрибутов
Если НЕ ЗначениеЗаполнено(QDATE) ИЛИ НЕ ТипЗнч(QDATE) = Тип("Дата") Тогда
СтрокаОшибки = ТаблицаОшибок.Добавить();
СтрокаОшибки.ИмяТабличногоПоля = "ПолеТабличногоДокументаНалоговыйДокумент";
СтрокаОшибки.ИмяПоказателя = "T1Z" + Формат(ROWNUM,"ЧЦ=4;ЧВН=0;ЧГ=;") + "QDATE";
СтрокаОшибки.ОписаниеОшибки = "Не заполнена дата";
КонецЕсли;
Если Не ЗначениеЗаполнено(QNUM) и НЕ ЗначениеЗаполнено(RNUM) Тогда
СтрокаОшибки = ТаблицаОшибок.Добавить();
СтрокаОшибки.ИмяТабличногоПоля = "ПолеТабличногоДокументаНалоговыйДокумент";
СтрокаОшибки.ИмяПоказателя = "T1Z" + Формат(ROWNUM,"ЧЦ=4;ЧВН=0;ЧГ=;") + "QNUM";
СтрокаОшибки.ОписаниеОшибки = "Не указан ни номер налоговой накладной ни номер расчета корретировки";
КонецЕсли;
ВыгрузитьПоказатель(элТело, СтрокаТела.Имя, Результат, Новый Структура("ROWNUM, QDATE, QNUM, RNUM", ROWNUM, QDATE, QNUM, RNUM));
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ДокЭкспорт.Save(КаталогДанныхЭкспорта +"\"+ИмяФайла);
ГлобСтруктФайловВыгрузки.Вставить("FileName" + Лев(ИмяФайла, СтрДлина(ИмяФайла)-4), Новый ДвоичныеДанные(КаталогДанныхЭкспорта +"\" + ИмяФайла));
ТекстВыгрузки = Строка(ТекстВыгрузки) + Символы.ПС + "------------------" + Символы.ПС + ДокЭкспорт.xml;
Сообщить(НСтр("ru='- Отчет выгружен успешно!';uk='- Звіт вивантажений успішно!'"));
Сообщить(НСтр("ru='-- Начало проверки отчета по xsd-схеме.';uk='-- Початок перевірки звіту по xsd-схемі.'"));
Попытка
фОшибка = 0;
Попытка
КэшСхем = Новый COMОбъект("Msxml2.XMLSchemaCache.4.0");
КэшСхем.add("", Схема);
ДокЭкспорт.Schemas = КэшСхем;
Исключение
КонецПопытки;
ДокЭкспорт.validateOnParse = Истина;
ДокЭкспорт.async = Ложь;
ДокЭкспорт.Load(КаталогДанныхЭкспорта +"\"+ИмяФайла);
Error = ДокЭкспорт.parseError;
Если Error.errorCode<>0 Тогда
// есть ошибка
фОшибка = 1;
Сообщить(НСтр("ru = 'Ошибка:'; uk = 'Помилка:'"));
Сообщить(Error.reason);
КонецЕсли;
Исключение
фОшибка = 1;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Сообщить(НСтр("ru='-- Проверка завершена!';uk='-- Перевірка завершена!'"), ?(фОшибка = 1,СтатусСообщения.Важное, СтатусСообщения.Обычное));
КонецПроцедуры
И это только один случай и то не весь, а только шапка (