NullReferenceExeption в Бизнес-процессе

При выполнении бизнес - процесса возникает ошибка в элементе Задание-сценарий:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired)
в Terrasoft.Core.Process.UsrComingOnOrder.ScriptTask4Execute(ProcessExecutingContext context)
в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Код сценария представляю ниже:

//берем все продукты из прихода

var stringVariable = "";
        EntitySchema ProductInSHOperationschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrProductInSHOperation");// товары в складском документе
        EntitySchemaQuery ProductInSHOperationesq = new EntitySchemaQuery(ProductInSHOperationschema);
        ProductInSHOperationesq.AddAllSchemaColumns();
        ProductInSHOperationesq.Filters.Add(ProductInSHOperationesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrStoreHouseOperation", IdComing));
        EntityCollection ProductInSHOperationentities = ProductInSHOperationesq.GetEntityCollection(UserConnection);
       
        decimal kolvoComing=0.0m;//количество продукта в приходе
       
       
       
                foreach (Entity ProductInSHOpEntity in ProductInSHOperationentities) {
                                       
                        kolvoComing = ProductInSHOpEntity.GetTypedColumnValuedecimal>("UsrQuantity");//количество продукта в приходе
                        var ProductComing = ProductInSHOpEntity.GetTypedColumnValueGuid>("UsrProductId");//продукт в приходе
                         stringVariable = "ИД который получили:" + Convert.ToString(ProductComing)+"\n" + "Заказ который получили:" + Convert.ToString(OrderId);
                        //Получим строки продуктов из нашего заказа
                        Custom.UsrDebug.Utils.SendMessage(UserConnection, "mishutina-julja@rambler.ru", stringVariable);
                       
                        //берем  продукты из заказа поставщика по приходу (номер заказа, по которому создан приход = номеру заказа поставщика, сортипрвка по дате заказа поставщика)-скрытая деталь
                        EntitySchema OrderProvidersProductschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrOrderProvidersProduct");// товары из заказа поставщика
                        EntitySchemaQuery OrderProvidersProductesq = new EntitySchemaQuery(OrderProvidersProductschema);
                       
                        OrderProvidersProductesq.AddColumn("UsrQuantity");
                        OrderProvidersProductesq.AddColumn("UsrProduct");
                        OrderProvidersProductesq.AddColumn("UsrMust");
                        OrderProvidersProductesq.AddColumn("UsrOrderId");
                        OrderProvidersProductesq.AddColumn("UsrShipped");
                        OrderProvidersProductesq.AddColumn("UsrClientsOrderId");
                        OrderProvidersProductesq.AddColumn("UsrClientsOrderId.CreatedOn").OrderByAsc();
                       
                        OrderProvidersProductesq.Filters.Add(OrderProvidersProductesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrOrderId", OrderId));
                        OrderProvidersProductesq.Filters.Add(OrderProvidersProductesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrProduct", ProductComing));
                       
                        EntityCollection OrderProvidersProductentities = OrderProvidersProductesq.GetEntityCollection(UserConnection);
                                       
                        foreach (Entity OrderProvidersProductEntity in OrderProvidersProductentities) {
                                 
                                if (kolvoComing == 0) break;
                               
                                decimal kolvoProvider = OrderProvidersProductEntity.GetTypedColumnValuedecimal>("UsrQuantity");//количество в заказе поставщику
                                var OrderProvidersProduct = OrderProvidersProductEntity.GetTypedColumnValueGuid>("UsrProductId");//продукт в скрытой детали
                               
                                stringVariable = "ИД OrderProvidersProduct который получили:" + Convert.ToString(OrderProvidersProduct);
                                Custom.UsrDebug.Utils.SendMessage(UserConnection, "mishutina-julja@rambler.ru", stringVariable);
                               
                                decimal Must =  OrderProvidersProductEntity.GetTypedColumnValuedecimal>("UsrMust");// надо
                                decimal Shipped = OrderProvidersProductEntity.GetTypedColumnValuedecimal>("UsrShipped");//отгружено
                                decimal kolvoRealNeed = Must - Shipped; //надо - отгружено
                               
                                stringVariable = "Must:  " + Convert.ToString(Must)+"  Shipped:" + Convert.ToString(Shipped)+"  kolvoRealNeed:" + Convert.ToString(kolvoRealNeed);
                                Custom.UsrDebug.Utils.SendMessage(UserConnection, "mishutina-julja@rambler.ru", stringVariable);
                               
                                //распределение количества из прихода в скрытую деталь   
                                        if  (OrderProvidersProduct == Guid.Empty) break;
                                        else {
                                        if (kolvoComing >= kolvoRealNeed) {
                                                OrderProvidersProductEntity.SetColumnValue("UsrShipped", Shipped + kolvoRealNeed);
                                                OrderProvidersProductEntity.Save();
                                                kolvoComing -= kolvoRealNeed;
                                        } else {
                                                OrderProvidersProductEntity.SetColumnValue("UsrShipped", Shipped + kolvoComing);
                                                OrderProvidersProductEntity.Save();
                                                kolvoComing = 0;
                                        }
                                        }//конец else
                        }//цикл по скрытой детали заказ поставщика
                }//цикл по приходу
                return true;

Для проверки используемых данных вставили код, по которому получаем сообщения на почту. Данные не пустые, сообщения приходят. Ошибка вылетает на само сохранение данных в процессе. Подскажите, пожалуйста, в чем может быть причина такой ошибки? Заранее огромное спасибо!!!

Нравится

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

Здравствуйте!

Сообщение "System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта" возникает, если система не может найти какой-то объект.
Здесь два варианта:
Выполните действие "Компилировать все". Если это действие не помогло, значит где-то в коде встречается ссылка на несуществующий объект (проверьте названия объектов, к которым Вы обращаетесь в коде).

Юлия,

также попробуйте выполнить отладку серверного кода в момент выполнения бизнес-процесса.

Когда появится ошибка, у Вас будет возможность понять, какой именно объект не может найти система.

Спасибо большое, разбираемся

Заменили Save на Update...и все данные сохранились))

var update = new Update(userConnection, "UsrOrderProvidersProduct")
.Set("UsrShipped", Column.Parameter((Shipped + kolvoRealNeed)))
.Where("UsrProductId").IsEqual(Column.Parameter(ProductComing))
.And("UsrOrderIdId").IsEqual(Column.Parameter(OrderId));
update.Execute();

Хоть вопрос и решен, но все же отпишусь, вдруг пригодится кому-нибудь.
Была такая же проблема. Ошибка при вызове метода Save() для Entity
Было сделано следующее наблюдение:
Код:

var esqNumeration = new EntitySchemaQuery(userConnection.EntitySchemaManager, "UsrObjectNumeration");
//esqNumeration.AddColumn("UsrNumber");
esqNumeration.AddAllSchemaColumns();
var entitiesNumeration = esqNumeration.GetEntityCollection(userConnection);
number = entitiesNumeration[0].GetTypedColumnValue<int>("UsrNumber") + 1;
entitiesNumeration[0].SetColumnValue("UsrNumber", number);
entitiesNumeration[0].SetColumnValue("UsrNumber", number);
entitiesNumeration[0].Save();

Прошу обратить внимание на строки:

//esqNumeration.AddColumn("UsrNumber");
esqNumeration.AddAllSchemaColumns();

При такой записи ошибки при вызове метода нет.
Но если сделать наоборот, т.е. добавить только одну колонку, без вызова метода AddAllSchemaColumns(), то получим ошибку "Ссылка на объект не указывает на экземпляр объекта" при вызове entitiesNumeration[0].Save()

Эмин, большое спасибо за Ваш комментарий.

Таким образом, получается, что нам нужно было выбрать все колонки в запросе, а не только те, которые нам необходимы были. И тогда Save() бы сработал. Я Вас правильно поняла?

"Юлия Мишутина" написал:

Таким образом, получается, что нам нужно было выбрать все колонки в запросе, а не только те, которые нам необходимы были. И тогда Save() бы сработал. Я Вас правильно поняла?


Да, все верно. Save() работает только если вызвать AddAllSchemaColumns().

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