Имя: Пароль:
1C
1С v8
8.2, COM-соединение, C#, dynamic, selectChanges
0 kolobokf
 
02.04.15
18:07
всем привет.
опишу ситуацию:
есть сишарповский код, который тянет изменения определенных объектов из 1с из разных баз. на одной из баз периодически валится ошибка source:System.Dynamic; Object reference not set to an instance of an object.

код:
dynamic obj = null;
dynamic changes = null;
dynamic plans = null;
int num = 0;

string objType = null;
string objTN = obj1c;

try
{
  dynamic planObj = exchangeNode.getObject();
  obj = GetProperty(GetProperty(meta, objType), obj1c);
  plans = v82Base.ExchangePlans;
  num = exchangeNode.SentNo;
  if (isSqlLogSet)
  {
     param.Value = "num - " + num;
     sqlCom.ExecuteNonQuery();
     param.Value = "obj - " + obj;
     sqlCom.ExecuteNonQuery();
     param.Value = "plans - " + plans;
     sqlCom.ExecuteNonQuery();
  }
  changes = plans.SelectChanges(exchangeNode, num, obj);
  if (isSqlLogSet)
  {
    param.Value = "выбрали изменения для объекта в отправляемое сообщение для "+obj1c;
    sqlCom.ExecuteNonQuery();
  }
...

валится на строке, где выбираются изменения - SelectChanges, перед этим я вывожу в лог все задействованные в этой функции аргументы - узел, номер сообщения и фильтр - они не являются null. в качестве фильтра передается объект метаданных. в основном валится на регистре бухгалтерии, но иногда бывает на регистре сведений.

кто-нибудь сталкивался с чем-то подобным? есть какие-то соображения?
1 Serginio1
 
02.04.15
18:21
plans = v82Base.ExchangePlans;
а plans  проверял?
2 kolobokf
 
02.04.15
18:45
да, plans также не null (isSqlLogSet перед SelectChanges как раз записывает в лог объекты). кроме того этим же кодом, вытаскиваются изменения из других объектов этой же базы корректно. грубо говоря, есть планировщик задач, который с определенной периодичностью дергает этот код для выгрузки изменений и иногда появляется эта ошибка.
может ли это быть связано с тем, что, допустим, регистр бухгалтерии в течение дня активно задействован и какая-нибудь внутренняя блокировка 1с не дает выполниться выбратьИзменения(selectChanges)? или блокировка mssql?
3 Рэйв
 
02.04.15
18:48
obj вот тут у тебя затык судя по тексту.
имхо конечно
4 Рэйв
 
02.04.15
18:49
смотри  чего ты туда наприсваивал
5 Dmitry1c
 
02.04.15
19:44
Кстати, там тоже есть отладчик :)
6 kolobokf
 
03.04.15
08:39
(3) objType - РегистрыБухгалтерии, obj1c - наименование регистра, meta - метаданные. получаю не напрямую через v82Base, а через invokeMember, т.к. гружу разные объекты разных типов и соответственно подставляю их наименования.
вчера по этому регистру всё-таки выгрузились изменения, но вечером - днём падала ошибка. сегодня утром упала на РегистрНакопления.УчетЗатратРегл
было бы проще, если она была бы систематической, но пока не могу выявить какую-либо систему в её проявлении
7 kolobokf
 
03.04.15
08:43
(5) если б было так просто, я б сюда не заходил ) у себя на тестовой базе я её не ловлю. а на рабочей базе есть возможность только писать в лог, т.к. этот код завёрнут в dll и стороннее приложение им пользуется
8 kolobokf
 
03.04.15
08:46
видел такую ошибку в v8: 8.2, COM-соединение, C#, dynamic но там, я так понял, дело было в тексте запроса
9 Serginio1
 
06.04.15
11:31
(0) Проще использовать внешние обработки v8: 8.2, COM-соединение, C#, dynamic строки

Проще отладить в среде 1С, а затем просто вызвать нужный метод из C#
10 kolobokf
 
06.04.15
18:27
(9) сделал в c# selectChanges через внешнюю обработку, теперь есть более внятное объяснение:
"Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 10.0: Lock request time out period exceeded.
HRESULT=80040E31, SQLSrvr: SQLSTATE=HYT00, state=33, Severity=10, native=1222, line=1"
то же бывает и при УдалитьРегистрациюИзменений. т.е. лочится таблица изменений. есть какой-то способ это обходить кроме повторных попыток? 1с же не поддерживает sql'евский with(nolock)