Как выполнить экспорт и импорт в справочнике НСИ?

Схемы импорта и экспорта являются дочерними объектами справочника НСИ. Используя язык Fore можно настроить:

Описание примера

Для выполнения примера в репозитории предполагается наличие справочника НСИ и таблицы с идентификаторами D_EXP_IMP и TBL_IMP соответственно и файла «C:\Data_out.txt».

Также требуется форма, на которой расположены:

Добавьте ссылки на системные сборки: Db, Dt, Metabase, Rds.

При нажатии кнопки Button1 в справочник D_EXP_IMP будет добавлена схема экспорта, затем выполнен экспорт элементов справочника в текстовый файл «C:\Data_out.txt». Экспорт производится по следующим параметрам:

При нажатии кнопки Button2 в справочник D_EXP_IMP будет добавлена схема экспорта, затем выполнен импорт данных из таблицы репозитория с идентификатором TBL_IMP в справочник D_EXP_IMP.

Процедура экспорта данных

Sub Button1OnClick(Sender: Object; Args: IMouseEventArgs);
Var
    Mb: IMetabase;
    Dict: IRdsDictionary;
    Export: IMetaRdsExportSchema;
    i: Integer;
    dictAts: IRdsAttributes;
    Attr: IRdsAttribute;
    attrMap: IRdsExportSchemaAttribute;
    dictSort: IRdsSortAttributes;
    dictFilter: IRdsDictionaryFilterConditions;
    Cond: IRdsDictionaryFilterCondition;
    textCons: IDtTextConsumer;
    dictInst: IRdsDictionaryInstance;
Begin
    Mb := MetabaseClass.Active;
    // Получаем справочник НСИ
    Dict := Mb.ItemById("D_EXP_IMP").Edit As IRdsDictionary;
    // Создаем новую схему экспорта
    Export := Dict.ExportSchemas.Add As IMetaRdsExportSchema;
    // Определяем привязку атрибутов справочника к полям приёмника
    dictAts := Dict.Attributes;
    For i := 0 To dictAts.Count - 1 Do
        Attr := dictAts.Item(i);
        attrMap := Export.AddMapping;
        attrMap.Attribute := Attr;
        attrMap.FieldName := Attr.Id;
    End For;
    // Указываем, что перед экспортом необходимо очистить приёмник
    Export.ClearBeforeExport := True;
    // Задаем сортировку по атрибуту "NAME"
    dictSort := Export.SortAttributes;
    Attr := dictAts.FindById("NAME");
    dictSort.Add(Attr, True);
    // Добавляем фильтрацию: экспортировать только элементы 1-го уровня
    dictFilter := Export.Filter;
    Attr := dictAts.FindById("PARENT_KEY");
    Cond := dictFilter.Add(Attr);
    Cond.Value := Null;
    Cond.Operation := RdsConditionOperation.Equal;
    // Настраиваем приёмник данных: текстовый файл
    textCons := New DtTextConsumer.Create;
    textCons.File := "c:\Data_out.txt";
    textCons.WriteHeader := True;
    textCons.RowDelimiter := #13 + #10;
    textCons.DelimitedColumnDelimiter := #9;
    textCons.DelimitedTextQualifier := "'";
    Export.Consumer := textCons;
    // Сохраняем справочник
    (Dict As IMetabaseObject).Save;
    // Выполняем экспорт
    dictInst := Dict.Open(NullAs IRdsDictionaryInstance;
    dictInst.ExportData(Export);
End Sub Button1OnClick;

Процедура импорта данных

Sub Button2OnClick(Sender: Object; Args: IMouseEventArgs);
Var
    MB: IMetabase;
    MObj: IMetabaseObject;
    Dict: IRdsDictionary;
    Import: IRdsImportSchemas;
    SchemaImport: IRdsImportSchema;
    Attrs: IRdsAttributes;
    TableObj: IMetabaseObjectDescriptor;
    Table: ITable;
Begin
    MB := MetabaseClass.Active;
    // Получаем справочник НСИ
    MObj := MB.ItemById("D_EXP_IMP").Edit;
    Dict := MObj As IRdsDictionary;
    Attrs := Dict.Attributes;
    // Создаем новую схему импорта
    Import := Dict.ImportSchemas;
    SchemaImport := Import.Add;
    SchemaImport.Id := "Import1";
    SchemaImport.Name := "Схема импорта №1";
    // Дополнение справочника при импорте
    SchemaImport.Incremental := True;
    // Параметры привязки атрибутов справочника НСИ к полям таблицы
    SchemaImport.Mappings(Attrs.Key).FieldName := "Key";
    SchemaImport.Mappings(Attrs.Name).FieldName := "Name";
    SchemaImport.Mappings(Attrs.Order).FieldName := "Ord";
    SchemaImport.Mappings(Attrs.ParentKey).FieldName := "Parent_key";
    // Таблица для импорта данных
    TableObj := MB.ItemById("TBL_IMP");
    Table := TableObj.Bind As ITable;
    SchemaImport.TableObject := TableObj;
    SchemaImport.TableName := Table.NativeName;
    MObj.Save;
End Sub Button2OnClick;

См. также:

Вопросы и ответы