0
Голосовать

Копирование продуктов при копировании счета

Создано:

Добрый день!
Подскажите пожалуйста как модифицировать функцию копирования продуктов при копировании счета таким образом чтобы не копировались определенные поля продукта(например стоимость).
Если я правильно понимаю следует модифицировать след. ф-цию, добавив проверку на имя поля:

function CopyTreeDetail(SourceDataset, DestinationDataset,
        SourceParentItemIDFieldName, DestinationParentItemIDFieldName,
        DestinationParentItemID) {
        SourceDataset.Open();
        if (IsDatasetEmpty(SourceDataset)) {
            SourceDataset.Close();
            return;
        }
        var ParentIDFieldName = 'ParentID';
        var DestinationID;
        var DestinationIDs = GetNewDictionary();
        var SourceID;
        var SourceParentID;
        var DestinationParentID;
        var SourceIDDataField = SourceDataset.DataFields('ID');
        var DestinationIDDataField = DestinationDataset.DataFields('ID');
        var SourceParentIDDataField = SourceDataset.DataFields(ParentIDFieldName);
        var DestinationParentIDDataField = DestinationDataset.DataFields(ParentIDFieldName);
        var DestinationParentItemIDDataField = DestinationDataset.DataFields(DestinationParentItemIDFieldName);
        var SourceParentIDs = GetNewDictionary();
        var ExcludedFieldsList = GetNewDictionary();
        ExcludedFieldsList('ID') = true;
        ExcludedFieldsList(SourceParentItemIDFieldName) = true;
        ExcludedFieldsList(ParentIDFieldName) = true;
        while (!SourceDataset.IsEOF) {
                SourceID = SourceIDDataField.Value;
                DestinationID = Connector.GenGUID();
                DestinationIDs(SourceID) = DestinationID;
                SourceParentID = SourceParentIDDataField.Value;
                SourceParentIDs(DestinationID) = SourceParentID;
                DestinationDataset.Append();
                CopyRowDataEx(SourceDataset, DestinationDataset, ExcludedFieldsList);
                DestinationIDDataField.Value = DestinationID;
                DestinationParentItemIDDataField.Value = DestinationParentItemID;
                DestinationDataset.Post();
                SourceDataset.GotoNext();
        }
        SourceDataset.Close();
        DestinationDataset.Close();
        ApplyDatasetFilter(DestinationDataset, DestinationParentItemIDFieldName,
                DestinationParentItemID, true);
    DestinationDataset.Open();
        while (!DestinationDataset.IsEOF) {
            DestinationID = DestinationIDDataField.Value;
                SourceParentID = SourceParentIDs(DestinationID);
                if (SourceParentID != null) {
                        DestinationParentID = DestinationIDs(SourceParentID);
                        DestinationDataset.Edit();
                        debugger;
                        DestinationParentIDDataField.Value = DestinationParentID;
                        DestinationDataset.Post();
                }
                DestinationDataset.GotoNext();
        }
        DestinationDataset.Close();
}

Но не могу разобрать где именно.
Версия 3.1.0.23
Заранее спасибо!

Комментарии

Лабьяк Олег Игоревич

Добавьте после блока

        ExcludedFieldsList('ID') = true;
        ExcludedFieldsList(SourceParentItemIDFieldName) = true;
        ExcludedFieldsList(ParentIDFieldName) = true;

такой код:

if (SourceDataset.USI.indexOf('ds_OfferingInInvoice') != -1) {
        ExcludedFieldsList(<Название поля1>) = true;
        ...
        ExcludedFieldsList(<Название поляN>) = true;
}

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Serega

Спасибо!
А как запретить копирование поля в самом счете, например состояние счета, пробовал:

 if (SourceDataset.USI.indexOf('ds_Invoice') != -1) {
        ExcludedFieldsList('BillStatusID') = true;
     }

не прошло.
заранее спасибо!

Serega

Пробую в срипте scr_DB в функции:

function SetDefaultValuesByDataset(Dictionary, Dataset) {
        var DatasetCopy = Services.GetNewItemByUSI(Dataset.USI);
        ApplyDatasetFilter(DatasetCopy, 'ID', Dataset.ValAsStr('ID'), true);
        DatasetCopy.Open();
        for (var i = 0; i < DatasetCopy.DataFields.Count; i++) {
        var DataField = DatasetCopy.DataFields.Items(i);

        var Name = DataField.Name;
        if (!IsSystemField(Name) && (DataField.FieldType != dftCalc) && (DataField.Value != null)) {
        var Key = Name;
        Dictionary.Add(Key, DataField.Value);
                        }

        }
        DatasetCopy.Close();
}

заменить
        if (!IsSystemField(Name) && (DataField.FieldType != dftCalc) && (DataField.Value != null))

на
        if (!IsSystemField(Name) && (DataField.FieldType != dftCalc) && (DataField.Value != null) && (DataField.Name != 'BillStatusID'))

но тоже не помогает (

Serega

Отвечу себе сам, нашел решение:

if (Name == 'BillStatusID'){
   Dictionary.Add(Key, null);
}
else{
   Dictionary.Add(Key, DataField.Value);
}