<?xml version="1.0" encoding="windows-1251"?>
<registry>
	<node path="%root%\Ресурсы\Макросы\Слои\ЭкспортИмпортДанных">
		<value type="7" name="ФункцииЭкспортаИмпортаДанных.abl">включить "\библиотеки\libru.lib"; 
включить '\библиотеки\Layers.lib';
включить '\Библиотеки\Documents.lib';
включить "\библиотеки\Reports.lib";
включить "\библиотеки\Base.lib";
включить "\библиотеки\Versions.lib";
включить "\Макросы\Слои\ВспомогательныеФункции.abl";
включить "\Макросы\Слои\ПоддержкаСлойницы.abl";
включить "\Макросы\Слои\ПоддержкаВерсионности.abl";

константы
  кСлой_СправочникФорматов = "Платформа.Слои.ЭкспортИмпорт.Форматы";
  кПутьКПараметрам = "Слои\ЭкспортИмпортДанных";
  
  Алиас_КонфигурацияЭкспорта = "Платформа.Слои.ЭкспортИмпорт.КонфигурацияЭкспорта";
  Алиас_КонфигурацияИмпорта = "Платформа.Слои.ЭкспортИмпорт.КонфигурацияИмпорта";

функция УдалитьПоля(Датасет: СтатическиеДанные; СписокПолей: строка);
переменные
  Поля: Текст;
  Индекс: целое;
начало
  Поля := СоздатьТекст;
  попытка
    Поля.РазделенноеЗначение := СписокПолей;
    от Индекс := 0 до Поля.Количество-1 делать
    начало
      Датасет.ПолеПоИмени(Поля.Стр(Индекс)).Free;
    конец;
  обязательно
    УдалитьОбъект(Поля);
  конец;
конец;

функция ПолучитьСписокСистемныхПолей(Слой: ILayer): строка;
переменные
  ПоляСлоя: ILayerFieldsDescription;
начало
  результат := "";
  ПоляСлоя := Слой.Description.Fields;
  ПоляСлоя.First;
  пока не ПоляСлоя.Eof делать
  начало
    если ПоляСлоя.Params("FieldRole") &lt;= 0 тогда
      результат := результат + ПоляСлоя.Params("FieldName") + ",";
    ПоляСлоя.Next;
  конец;
  если результат &lt;&gt; "" тогда
    результат := Подстрока(результат, 1, Длина(результат)-1); 
конец;

функция КопироватьБезСистемныхПолей(Слой: ILayer): СтатическиеДанные;
переменные
  ДанныеСлоя: СтатическиеДанные;
начало
  ДанныеСлоя := Слой.LayerData;
  результат := СоздатьСтатическиеДанные;
  попытка
    результат.ПрисвоитьПоля(ДанныеСлоя);
    результат.Закрыть;
    УдалитьПоля(результат, ПолучитьСписокСистемныхПолей(Слой));
    результат.Открыть;
    результат.Закачать(ДанныеСлоя, "");
  неудача
    УдалитьОбъект(результат);
    ВызватьОшибку(ПоследняяОшибка);
  конец;
конец;

функция КопироватьСВерсией(Слой: ILayer): СтатическиеДанные;
переменные
  ДанныеСлоя: СтатическиеДанные;
  стр: строка;
начало
  ДанныеСлоя := Слой.LayerData;
  результат := СоздатьСтатическиеДанные;
  попытка
    результат.ПрисвоитьПоля(ДанныеСлоя);
    результат.Закрыть;
    стр := ПолучитьСписокСистемныхПолей(Слой);
    стр := ЗаменитьПодстроку(стр, ",LayerVersion,", ",", нет);
    УдалитьПоля(результат, стр);
    результат.Открыть;
    результат.Закачать(ДанныеСлоя, "");
  неудача
    УдалитьОбъект(результат);
    ВызватьОшибку(ПоследняяОшибка);
  конец;
конец;

функция ПолучитьИмяФайлаИзДиалога(ИмяПараметра: строка): строка;
начало
  результат := "";
  Диалог.Очистить;
  Диалог.Добавить("Имя файла", "ИмяФайла", 0, Файлы,'','');
  Диалог.Параметр("ИмяФайла").Значение := ПолучитьЗначениеПараметра(кПутьКПараметрам , ИмяПараметра); 
  если Диалог.Выполнить тогда
  начало
    если Диалог.Параметр("ИмяФайла").Значение = '' тогда
      ВызватьОшибку("Файл не выбран");
    СохранитьЗначениеПараметра(кПутьКПараметрам , ИмяПараметра, Диалог.Параметр("ИмяФайла").Значение);
    результат := Диалог.Параметр("ИмяФайла").Значение;
  конец;  
конец;

функция ОпределитьИмяФайла(Параметры: IVariables; ИмяПараметра: строка; ИмяПараметраВРеестре: строка): строка;
начало
  результат := Параметры.Values(ИмяПараметра);
  если результат = "" тогда
  начало
    результат := ПолучитьИмяФайлаИзДиалога(ИмяПараметраВРеестре);
    если результат = "" тогда
      ВызватьОшибку("Файл не выбран");
    Параметры.Values(ИмяПараметра) := результат;
  конец;
конец;

функция ПодставитьНазваниеФайла(ПолноеИмя, НовоеИмя: строка): строка;
переменные
  поз: целое;
  имя: строка;
начало
  поз := Длина(ПолноеИмя);
  пока ПолноеИмя[поз] &lt;&gt; '\' делать
    поз := поз - 1;
  имя := Подстрока(ПолноеИмя, поз+1, Длина(ПолноеИмя) - поз);
  результат := ЗаменитьПодстроку(ПолноеИмя, имя, НовоеИмя, нет);
конец;

функция ОпределитьПутьФайлаИВставитьНазвание(Параметры: IVariables; ИмяПараметра: строка; ИмяПараметраВРеестре: строка): строка;
начало
  результат := Параметры.Values(ИмяПараметра);
  если результат = "" тогда
  начало
    Диалог.Очистить;
    Диалог.Добавить("Имя файла", "ИмяФайла", 0, Файлы,'','');
    Диалог.Параметр("ИмяФайла").Значение := ПодставитьНазваниеФайла(ПолучитьЗначениеПараметра(кПутьКПараметрам , ИмяПараметраВРеестре), Параметры.Значение("FileName")); 
    если Диалог.Выполнить тогда
      начало
        если Диалог.Параметр("ИмяФайла").Значение = '' тогда
          ВызватьОшибку("Файл не выбран");
        СохранитьЗначениеПараметра(кПутьКПараметрам , ИмяПараметраВРеестре, Диалог.Параметр("ИмяФайла").Значение);
        результат := Диалог.Параметр("ИмяФайла").Значение;
      конец;
    если результат = "" тогда
      ВызватьОшибку("Файл не выбран");
    Параметры.Values(ИмяПараметра) := результат;
  конец;
конец;

функция ПолучитьИмяМакросаИмпортаЭкспорта(ИмяФормата, ТипМакроса: строка): строка;
переменные
  Слой_СправочникФорматов: ILayer;
  Датасет: СтатическиеДанные;
начало                   
  Слой_СправочникФорматов := ПолучитьМенеджерСлоев.CreateLayerByAlias(кСлой_СправочникФорматов);
  Слой_СправочникФорматов.OpenWithCalculate;
  Датасет := Слой_СправочникФорматов.LayerData;
  если не Датасет.Locate("Формат", ИмяФормата, 0) тогда
    ВызватьОшибку("Неизвестный формат импорта: "+ИмяФормата);
  результат := Датасет.ПолеПоИмени(ТипМакроса).КакСтрока;   
конец;

функция ВставитьДанныеИзНабораДанных(СлойПриемника: ILayer; Приемник, Источник: СтатическиеДанные; ЗадачаИД: Целое; НекопируемыеПоля: Строка);
переменные
  СистемныеПоля: строка;
//  ИмяПоля: строка;
//  Индекс: целое;
//  ПолеИсточника: Поле;
  Prog: IProgress;
  сч: Целое;
  ПолеСтатус: IField;
  ПолеСтароеИД: IField;
начало
  СистемныеПоля := ","+НекопируемыеПоля+",";//","+ПолучитьСписокСистемныхПолей(СлойПриемника)+",";
  Источник.ВНачало;
  Приемник.DisableControls;      
  Prog := Progress;
  попытка
    Если Prog &lt;&gt; nil тогда
    начало
      Prog.BeginProgress;
      Prog.SetMessage('Вставка данных в интерфейс');
      Prog.SetProgress(0);
    конец;    
    сч := 1;    

    если не Источник.НайтиПоле("UPDATESTAUS", ПолеСтатус)   тогда ПолеСтатус   := nil;
    если не Источник.НайтиПоле("OLD_ID"    ,  ПолеСтароеИД) тогда ПолеСтароеИД := nil;

    пока не Источник.ВКонце делать
    начало
      /*
      Приемник.Append;    
      от Индекс := 0 до Приемник.FieldsCount-1 делать
      начало
        ИмяПоля := Приемник.Поля(Индекс).FieldName;
        если Позиция(","+ИмяПоля+",", СистемныеПоля) &lt;= 0 тогда
        начало                           
          если Источник.НайтиПоле(ИмяПоля, ПолеИсточника) тогда
            Приемник.Поля(Индекс).Assign(ПолеИсточника);
        конец;
      конец;   
      */
      
      Приемник.СкопироватьЗапись(нет, Источник, СистемныеПоля);
      
      если ЗадачаИД &lt;&gt; - 1 тогда Приемник.Поле("TaskRef").какЦелое := ЗадачаИД;

      //предусматриваем возможность изменения  
      если (ПолеСтатус &lt;&gt; nil) и (ПолеСтароеИД &lt;&gt; nil) тогда
        если  ПолеСтатус.какЦелое = usModified тогда Приемник.Поле("ID").какЦелое := ПолеСтароеИД.какЦелое;
      
      Если Prog &lt;&gt; nil тогда
        Prog.SetProgress((100*сч)/Источник.RecordCount);
        
//      Приемник.Сохранить;

      если (ПолеСтатус &lt;&gt; nil) тогда Приемник.UpdateStatus := ПолеСтатус.какЦелое;
      
      Источник.Следующая;
      сч := сч + 1;
    конец;
  обязательно
    Приемник.EnableControls;
    Если Prog &lt;&gt; nil тогда    
      prog.EndProgress;
  конец; 
конец;

функция ВставитьДанныеБезСистемныхПолей(СлойПриемника: ILayer; Приемник, Источник: СтатическиеДанные);
переменные
  НекопируемыеПоля: Строка;
начало
  НекопируемыеПоля := ПолучитьСписокСистемныхПолей(СлойПриемника);
  ВставитьДанныеИзНабораДанных(СлойПриемника, Приемник, Источник, -1, НеКопируемыеПоля);
конец;

функция ВставитьДанныеБезСистемныхИЗагПолей(СлойПриемника: ILayer; Приемник, Источник: СтатическиеДанные);
переменные
  НекопируемыеПоля: Строка;
  ОписаниеПолей: СтатическиеДанные;
  СписокИД: Текст;
  ы: целое;
начало
  СписокИД := СоздатьТекст;
  НекопируемыеПоля := ПолучитьСписокСистемныхПолей(СлойПриемника);
  
  ОписаниеПолей := СлойПриемника.Description.Fields.Data;
  // Определяем список полей заголовка и
  // сохраняем в список их ИД, а
  // имена добавляем в некопируемые поля
  ОписаниеПолей.ВНачало;
  Пока не ОписаниеПолей.ВКонце делать
  начало
    Если (ОписаниеПолей.ПолеПоИмени("FIELDTYPE").КакЦелое=13)и(ОписаниеПолей.ПолеПоИмени("AGGREGATIONTYPE").КакЦелое=3) тогда
    начало
      СписокИД.Добавить(ОписаниеПолей.ПолеПоИмени("ID").КакЦелое);
      НекопируемыеПоля := НекопируемыеПоля + "," + ОписаниеПолей.ПолеПоИмени("FIELDNAME").КакСтрока
    конец;  
    ОписаниеПолей.Следующая;  
  конец;
  
  // Зная список ИД полей заголовка
  // нужно добавить в некопируемые имена полей, 
  // у которых они являются главным полем

  от ы:=0 до СписокИД.Количество-1 делать
  начало
    ОписаниеПолей.ВНачало;  
    Пока не ОписаниеПолей.ВКонце делать
    начало
      Если ОписаниеПолей.ПолеПоИмени("LINKEDFIELD").КакСтрока=СписокИД.Стр(ы) тогда
        НекопируемыеПоля := НекопируемыеПоля + "," + ОписаниеПолей.ПолеПоИмени("FIELDNAME").КакСтрока;
      ОписаниеПолей.Следующая;  
    конец;
  конец;
      
  ВставитьДанныеИзНабораДанных(СлойПриемника, Приемник, Источник, -1, НеКопируемыеПоля);
конец;

функция ПолучитьКонфигурацию(АлиасСлояКонфигурации: строка; Код: целое): СтатическиеДанные;
переменные
  Слой_Конфигурация: ILayer;
  Конфигурация: СтатическиеДанные;
начало
  Слой_Конфигурация := ПолучитьМенеджерСлоев.CreateLayerByAlias(АлиасСлояКонфигурации);
  Слой_Конфигурация.OpenWithCalculate;
  Конфигурация := Слой_Конфигурация.LayerData;
  УстановитьФильтр(Конфигурация, "Код="+ЦелоеВСтроку(Код), да);
  результат := СоздатьСтатическиеДанные;
  результат.ПрисвоитьПоля(Конфигурация);
  результат.Открыть;
  результат.Закачать(Конфигурация, "");
конец;

функция ПолучитьКонфигурациюЭкспорта(КодЭкспорта: целое): СтатическиеДанные;
начало
  результат := ПолучитьКонфигурацию(Алиас_КонфигурацияЭкспорта, КодЭкспорта);
конец;

функция ПолучитьКонфигурациюИмпорта(КодИмпорта: целое): СтатическиеДанные;
начало
  результат := ПолучитьКонфигурацию(Алиас_КонфигурацияИмпорта, КодИмпорта);
  результат.IndexFieldNames := "ПорядокИмпорта";
конец; 

Функция ФормироватьИндексДляСлоя(Слой: ILayer): строка;
переменные
  ОписаниеПолей: ILayerFieldsDescription;
начало
  результат := "";
  ОписаниеПолей := Слой.Description.Fields;
  ОписаниеПолей.First;
  пока не ОписаниеПолей.Eof делать
  начало
    если ОписаниеПолей.Params("FieldRole") = 1 тогда
      результат := результат + ОписаниеПолей.Params("FieldName") + ";";
    ОписаниеПолей.Next;
  конец;
  если результат &lt;&gt; "" тогда
    результат := Подстрока(результат, 1, длина(результат)-1);
конец;

// Проверяет наличие слоя с указанным алиасом в сборке версий
функция СлойЕстьВСборкеВерсий(АлиасСлоя: строка; СборкаВерсий: Сборка): целое;
переменные
  ИтераторПоВерсиям: Итератор;
  Вер: ВерсияВСборке;
начало
  результат := нет;
  ИтераторПоВерсиям := СборкаВерсий.Версии.Итератор;
  пока ИтераторПоВерсиям.ЕстьСледующий и не результат делать
  начало
    Вер := ИтераторПоВерсиям.Следующий;
    если Вер.Версия.ИмяОбъекта = АлиасСлоя тогда      
      результат := да; //Нашли слой в сборке
  конец;
конец;

//Возвращает список сборок, которые могут быть использованы для экспорта указанных в конфигурации слоев
функция ПолучитьСборкиДляСлоевЭкспортаИмпорта(Конфигурация: СтатическиеДанные; ИмяПоляАлиаса, ИмяДопПоляАлиаса: строка): Список;
переменные
  ВсеСборки: Итератор;
  ТекСборка: Сборка;
  ЕстьМноговерсионныеСлои, ИсключитьСборку: целое;
  ПолеАлиаса, ДопПолеАлиаса: Поле;
начало
  результат := Версионность.ПолучитьВсеСборки;
  ЕстьМноговерсионныеСлои := да;
  ПолеАлиаса := Конфигурация.ПолеПоИмени(ИмяПоляАлиаса);
  ДопПолеАлиаса := Конфигурация.ПолеПоИмени(ИмяДопПоляАлиаса);
  //Бежим по всем сборкам
  ВсеСборки := результат.Итератор;
  пока ВсеСборки.ЕстьСледующий и ЕстьМноговерсионныеСлои делать
  начало
    ТекСборка := ВсеСборки.Следующий;   
    //Нужно исключить из списка сборку, если хотя бы один многоверсионный слой для экспорта не входит в нее 
    ИсключитьСборку := нет;
    ЕстьМноговерсионныеСлои := нет;
    Конфигурация.ВНачало;
    пока не Конфигурация.ВКонце и не ИсключитьСборку делать
    начало
      //Проверяем экспортируемый слой
      если СлойМноговерсионный(ПолеАлиаса.КакСтрока) тогда
      начало
        ИсключитьСборку := не СлойЕстьВСборкеВерсий(ПолеАлиаса.КакСтрока, ТекСборка);
        ЕстьМноговерсионныеСлои := да;
      конец;  
      //Также нужно проверить слой формата, если он указан
      если не ИсключитьСборку и (ДопПолеАлиаса.КакСтрока &lt;&gt; "") тогда
        если СлойМноговерсионный(ДопПолеАлиаса.КакСтрока) тогда
        начало 
          ИсключитьСборку := не СлойЕстьВСборкеВерсий(ДопПолеАлиаса.КакСтрока, ТекСборка);
          ЕстьМноговерсионныеСлои := да;
        конец;   
      Конфигурация.Следующая;
    конец;
    если ИсключитьСборку тогда
      ВсеСборки.УдалитьТекущий;
  конец;
  если не ЕстьМноговерсионныеСлои тогда
    результат.Очистить;
конец;

// Запрашивает в диалоге сборку версий для экспорта/импорта
функция ЗапроситьСборкуДляЭкспортаИмпорта(Конфигурация: СтатическиеДанные; ИмяПоляАлиаса, ИмяДопПоляАлиаса: строка): целое;
переменные
  СписокСборок: Список;
  СписокСборокИтер: Итератор;
  Сб: Сборка;
  СписокСтрок: Текст;
  Стр: строка;
начало
  СписокСборок := ПолучитьСборкиДляСлоевЭкспортаИмпорта(Конфигурация, ИмяПоляАлиаса, ИмяДопПоляАлиаса);
  если СписокСборок.Размер = 0 тогда
    результат := -1
  иначе если СписокСборок.Размер = 1 тогда
  начало
    Сб := СписокСборок.ВзятьОбъект(0);
    результат := Сб.Код;
  конец
  иначе
  начало
    СписокСтрок := СоздатьТекст;
    попытка
      СписокСборокИтер := СписокСборок.Итератор;
      пока СписокСборокИтер.ЕстьСледующий делать
      начало
        Сб := СписокСборокИтер.Следующий;
        СписокСтрок.Добавить(ФорматироватьКлассификатор(Сб.Код, "00.00.00.000") + " - " + Сб.Примечание);
      конец;
      СписокСтрок.Сортировка;
      Диалог.Очистить;
      Диалог.Добавить("Сборка", "Сборка", 0, Список+ТолькоЧтение, "", СписокСтрок.Значение).Значение := СписокСтрок.Стр(0);
      если не Диалог.Выполнить тогда
        ВызватьОшибку("Действие прервано пользователем.");
      Стр := Диалог.Параметр("Сборка").Значение;
               
      результат := КлассификаторВЧисло(УбратьПробелы(Подстрока(Стр, 1, Позиция("-",Стр)-1)), "00.00.00.000");
    обязательно
      УдалитьОбъект(СписокСтрок);
    конец;  
  конец;      
конец;

// диалог выбора бюджета
функция ЗапроситьБюджет: целое;
переменные
  сБюджеты: ILayer;
  Бюджеты: СтатическиеДанные;
  СписокСтрок: Текст;
  ТекущийБюджет: строка;
начало
  результат := -2;
  сБюджеты := ПолучитьМенеджерСлоев().GetBudgetsList;
  если сБюджеты&lt;&gt;nil тогда
  начало
    Бюджеты := сБюджеты.LayerData;
    если Бюджеты.RecordCount&gt;1 тогда
    начало
      Диалог.Очистить;
      СписокСтрок := СоздатьТекст;
      Бюджеты.ВНачало();
      пока не Бюджеты.ВКонце делать
      начало
        СписокСтрок.Добавить(Бюджеты.ПолеПоИмени("Note").КакСтрока);
        если Бюджеты.ПолеПоИмени("CurrentBudget").КакЦелое тогда
          ТекущийБюджет := Бюджеты.ПолеПоИмени("Note").КакСтрока;
        Бюджеты.Следующий;
      конец;
      если ТекущийБюджет="" тогда
        ТекущийБюджет := СписокСтрок.Стр(0);
      Диалог.Добавить("Бюджет", "Бюджет", 0, Список+ТолькоЧтение, "", СписокСтрок.Значение).Значение := ТекущийБюджет;
      если не Диалог.Выполнить тогда
        ВызватьОшибку("Действие прервано пользователем.");
      ТекущийБюджет := Диалог.Параметр("Бюджет").Значение;
      Бюджеты.Locate("Note",ТекущийБюджет,1);
      результат := Бюджеты.ПолеПоИмени("ID").КакЦелое; 
      УдалитьОбъект(СписокСтрок);
    конец;
  конец;
конец;


функция ЗапроситьСборкуДляЭкспорта(КонфигурацияЭкспорта: СтатическиеДанные): целое;
начало
  результат := ЗапроситьСборкуДляЭкспортаИмпорта(КонфигурацияЭкспорта, "СлойДанных", "СлойФормата");
конец;

функция ЗапроситьСборкуДляИмпорта(КонфигурацияИмпорта: СтатическиеДанные): целое;
начало
  результат := ЗапроситьСборкуДляЭкспортаИмпорта(КонфигурацияИмпорта, "СлойДанных", "СлойПреобразования");
конец;

</value>
		<param value="ФункцииЭкспортаИмпортаДанных.abl" type="1" name="AccessCount">346</param>
		<param value="ФункцииЭкспортаИмпортаДанных.abl" type="2" name="AccessDate">42020.5585983218</param>
		<param value="ФункцииЭкспортаИмпортаДанных.abl" type="3" name="crc32">$CA5233CA</param>
		<param value="ФункцииЭкспортаИмпортаДанных.abl" type="3" name="installversion">1.0</param>
		<param value="ФункцииЭкспортаИмпортаДанных.abl" type="3" name="version">35.058.00</param>
		<param value="ФункцииЭкспортаИмпортаДанных.abl" type="3" name="Export">SKVORTSOVV\skvortsov\16.01.2015 13:43:18</param>
	</node>
</registry>
