Мне необходимо из скрипта создать новый счет, новый продукт и прикрепить этот продукт к счету.
Функционал реализовал следующим образом:
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.
Хотя OfferingID я заполняю
Если на карточке выбрать из списка этот созданный продукт, то он прикрепится и его ID попадет в поле OfferingID.
В чем может быть причина того, что изначально в OfferingID попадает null?
Когда я пытаюсь выбрать этот созданный продукт из списка:
получаю сообщение:
продукт прикрепляется и выводится сообщение:
Возможно то, что продукт не прикрепляется сразу связанно с несоответтсвием даты прайс листа?
Нравится
Здравтсвуйте Павел,
Предлагаю, проверить какие запросы идут на 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 попадает пустая строка:
И на событии AfterPost OfferingID = null:
Добрый день, Павел.
При заполнении поля [OfferingID] поле [CustomOffering] обнуляется и наоборот, такова работа стандартного функционала системы. Т.к. Вы записываете поле [CustomOffering] после поля [OfferingID] соответственно [OfferingID] обнуляется.
Георгий,большое спасибо за ответ. Действительно, причина была в этом.