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

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

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
Заранее спасибо!

Нравится

4 комментария

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

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

такой код:

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

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

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

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

Пробую в срипте 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'))

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

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

if (Name == 'BillStatusID'){
   Dictionary.Add(Key, null);
}
else{
   Dictionary.Add(Key, DataField.Value);
}
Показать все комментарии