Программное создание продукта

Мне необходимо из скрипта создать новый счет, новый продукт и прикрепить этот продукт к счету.
Функционал реализовал следующим образом:

        var Dataset = dlData.Dataset;
        var InvoiceDataset = Services.GetNewItemByUSI('ds_Invoice');
        ApplyDatasetFilter(InvoiceDataset,'ID',BaseInvoiceID, true);
        InvoiceDataset.Open();
        var InvoiceNum = InvoiceDataset.Values('InvoiceNumber');
        var FirstID = Connector.GenGUID();
        var SecondID = Connector.GenGUID();
       
        //-----------------------------------------------------
        //Первый счет          
        InvoiceDataset.Append();
        InvoiceDataset.Values('ID') = FirstID;
        InvoiceDataset.Values('ParentInvoiceID') =  BaseInvoiceID;
        InvoiceDataset.Values('ParentInvoiceNum') = BaseInvoiceNum;
        InvoiceDataset.Values('Amount') = fullSum * FirstPayShare / 100;
        InvoiceDataset.Values('InvoiceDate') = Dataset.Values('FirstPayment');
        InvoiceDataset.Values('OwnerID') = Dataset.Values('OwnerID');
        InvoiceDataset.Values('BillStatusID') = '{BA4C8E1A-8C8F-4AD6-A249-4F6B24B21618}';
        InvoiceDataset.Values('CustomerID') =  Dataset.Values('CustomerID');
        InvoiceDataset.Values('OpportunityID') = Dataset.Values('OpportunityID');
        InvoiceDataset.Values('ContractID') = Dataset.Values('ID');
        InvoiceDataset.Post();
   
   
        //Создаем новый продукт
        var OffDataset = Services.GetNewItemByUSI('ds_Offering');
        OffDataset.Append();
        var Offering1ID =  Connector.GenGUID();
        OffDataset.Values('ID') = Offering1ID;
        OffDataset.Values('OfferingName') = FirstPayShare + '% оплаты по договору № ' + InvoiceNum;
        OffDataset.Values('Price') =  fullSum * FirstPayShare / 100;
        OffDataset.Values('IsOfferingForInvoice') = true;
        OffDataset.Post();
       
        //Создаем цену для нового продукта
        var PriceDataset = Services.GetNewItemByUSI('ds_OfferingPrice');
        PriceDataset.Append();
        PriceDataset('ID') = Connector.GenGUID();
        PriceDataset('OfferingID') = Offering1ID;
        PriceDataset('Price') = fullSum * FirstPayShare / 100;
        PriceDataset('BasicPrice') = fullSum * FirstPayShare / 100;
        PriceDataset('PriceCategoryID') = '{66A30457-F823-44A3-9E8D-1CD58FAE2A59}';
        PriceDataset('PriceKindID') = '{5EC1AF89-2B99-4E78-9965-C0DAA8F00B69}';
        PriceDataset('IsMainPriceList') = 0;
        PriceDataset('StartDate') = System.Now();
        PriceDataset('DueDate') = System.Now();
        PriceDataset('Name') = 'Розничный';
        PriceDataset('Discount') = 0;
        PriceDataset('DiscountPercent') = 0;
        PriceDataset('BasicDiscount') = 0;
        PriceDataset.Post();
       
        //Прикрепить продукт = Сумме первой оплаты
        var OffInInvoiceDataset = Services.GetNewItemByUSI('ds_OfferingInInvoice');
       OffInInvoiceDataset.Append();
       OffInInvoiceDataset.Values('ID') = Connector.GenGUID();
       OffInInvoiceDataset.Values('OfferingID') = Offering1ID;
       OffInInvoiceDataset.Values('InvoiceID') = FirstID;
       OffInInvoiceDataset.Values('CustomOffering') = FirstPayShare + '% оплаты по договору № ' + InvoiceNum;
       OffInInvoiceDataset.Values('Price') =  fullSum * FirstPayShare / 100;
       OffInInvoiceDataset.Post();     
        //-----------------------------------------------------

Счет и продукт создаются,продукт в счете также создается, но на карточке редактирования Продукт в счете поле продукт остается не заполненным и в tbl_OfferingInInvoice значение OfferingID = null.
	 /system/files/1_82.jpg
Хотя OfferingID я заполняю

OffInInvoiceDataset.Values('OfferingID') = Offering1ID;

Если на карточке выбрать из списка этот созданный продукт, то он прикрепится и его ID попадет в поле OfferingID.
В чем может быть причина того, что изначально в OfferingID попадает null?

Когда я пытаюсь выбрать этот созданный продукт из списка:
	 /system/files/2_39.jpg
получаю сообщение:
	 /system/files/3_15.jpg
продукт прикрепляется и выводится сообщение:
	 /system/files/4_4.jpg
Возможно то, что продукт не прикрепляется сразу связанно с несоответтсвием даты прайс листа?

Нравится

5 комментариев

Здравтсвуйте Павел,

Предлагаю, проверить какие запросы идут на Post, вставляется ли значение OfferingID в таблицу связки (проверить можно профайлером). Также можно попробовать отключить события датасета - возможно есть некая логика на событие DataCange. Главное проверить какие запросы идут в базу при создании записи. Если значение OfferingID не попадает, следует проверить что происходит на событие Post, на предмет того что поле перезаписывается для датасета ds_OfferingInInvoice

Поставил брейк непосредственно перед Post();

//Прикрепить продукт = Сумме первой оплаты
var OffInInvoiceDataset = Services.GetNewItemByUSI('ds_OfferingInInvoice');
OffInInvoiceDataset.Append();
OffInInvoiceDataset.Values('ID') = Connector.GenGUID();
OffInInvoiceDataset.Values('OfferingID') = Offering1ID;
OffInInvoiceDataset.Values('InvoiceID') = FirstID;
OffInInvoiceDataset.Values('CustomOffering') = FirstPayShare + '% оплаты по договору № ' + InvoiceNum; 
OffInInvoiceDataset.Values('Price') =  fullSum * FirstPayShare / 100;
debugger;
OffInInvoiceDataset.Post();

Профайлер показал слежующий запрос к БД:

exec sp_executesql N'INSERT INTO [dbo].[tbl_OfferingInInvoice] ([ID], [CustomOffering], [Quantity], [DeliveryDate], [CurrencyID], [Amount], [TaxID], [Rate], [UnitID], [Price], [DiscountPercent], [DiscountAmount], [TaxAmount], [BasicPrice], [BasicAmount], [BasicDiscountAmount], [BasicTaxAmount], [InvoiceID], [TotalAmount], [BasicTotalAmount], [OfferingPriceID], [MargPrice], [MargAmount], [MargTotalAmount], [Difference], [CreatedOn], [CreatedByID], [ModifiedOn], [ModifiedByID])
VALUES (@P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15, @P16, @P17, @P18, @P19, @P20, @P21, @P22, @P23, @P24, @P25, getdate(), ''{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}'', getdate(), ''{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}'')',N'@P1 varchar(8000),@P2 nvarchar(4000),@P3 float,@P4 datetime2(7),@P5 varchar(8000),@P6 float,@P7 varchar(8000),@P8 float,@P9 varchar(8000),@P10 float,@P11 float,@P12 float,@P13 float,@P14 float,@P15 float,@P16 float,@P17 float,@P18 varchar(8000),@P19 float,@P20 float,@P21 varchar(8000),@P22 float,@P23 float,@P24 float,@P25 float','{BA12E954-5683-4354-AB9A-875E8B5F1FD6}',N'70% оплаты по договору № 154',1,'2011-10-10 00:00:00','{CC997518-B672-4F0B-AD9B-0668F06AE404}',18558,57,'{37AFB2EB-560C-4666-93AF-CF7D10FAB539}',1,'{421CD95E-109D-4205-A0A8-91BC938B9165}',18558,57,0,0,3093,0999999999999,18558,57,18558,57,0,3093,0999999999999,'{8B71274A-84AD-4BBA-98C8-62B970B39FB7}',18558,57,18558,57,'{47DCF977-37F7-412D-95D0-45DF6BE1F933}',0,0,0,-18558,57

В Insert query нет поля [OfferingID].
Попробую посмотреть нет ли какой логики на DataCange и что происходит в Post();

Дополнительная логика на DataCange была, но она не сбивает значение OfferingID и когда отладчик стоит на строке OffInInvoiceDataset.Post(), в OffInInvoiceDataset.Values('OfferingID') лежит ID необходимого продукта.
Зашел отладчиком в OffInInvoiceDataset.Post();
Прошел в ф-ию

function OfferingDetailBeforePost(Dataset, ScriptObject){
	ScriptObject.IsAppendFlag = (Dataset.State == dstInsert);
	ScriptObject.OfferingID = 
		Dataset.ValAsGUID(ScriptObject.EnteringOfferingFieldName);
}

И вот тут уже в ScriptObject.OfferingID попадает пустая строка:
	 http://www.community.terrasoft.ua/system/files/1_85.jpg
И на событии AfterPost OfferingID = null:
	 http://www.community.terrasoft.ua/system/files/2_41.jpg

Добрый день, Павел.
При заполнении поля [OfferingID] поле [CustomOffering] обнуляется и наоборот, такова работа стандартного функционала системы. Т.к. Вы записываете поле [CustomOffering] после поля [OfferingID] соответственно [OfferingID] обнуляется.

Георгий,большое спасибо за ответ. Действительно, причина была в этом.

Показать все комментарии