Проблема при обновлении контрагента

Добрый день! У меня следующая проблема. Мне нужно скриптом обновить поля "Вид деятельности" и "Отрасль" контрагента. Делаю Следуюшим образом:

function UpdateAccount(AccountID, ActivityName, FieldName) {
        var AccountDS = Services.GetNewItemByUSI('ds_Account');// или
               //GetSingleItemByCode('ds_Account', 'ContactIntegration');
        ApplyDatasetIDFilter(AccountDS, AccountID, true);
        AccountDS.Open();
        var NewActivityID = GetAccountActivityID(ActivityName);
        var NewFieldID = GetAccountFieldID(FieldName);
        AccountDS.Edit();
        if (AccountDS('ActivityID') != NewActivityID) {
                var Message = FormatStr(ConfirmActivityChangeMessage, AccountDS.ValAsStr('ActivityName'), ActivityName, AccountDS('Name'));
                if (ShowConfirmationDialog(Message) == wmrYes) {
                        AccountDS('ActivityID') = NewActivityID;
                }
        }
        if (AccountDS('FieldID') != NewFieldID) {
                var Message = FormatStr(ConfirmFieldChangeMessage, AccountDS.ValAsStr('FieldName'), FieldName, AccountDS('Name'));
                if (ShowConfirmationDialog(Message) == wmrYes) {
                        AccountDS('FieldID') = NewFieldID;
                }
        }
        AccountDS.Post();
        AccountDS.Close();
}

На строке  AccountDS.Post() У меня следующая ошибка:
Ошибка сохранения записи. Оригинальное сообщение об ошибке: The statement has been terminated.
Cannot insert the value NULL into column 'Name', table 'CRM.dbo.tbl_Account'; column does not allow nulls. UPDATE fails.

Посмотрел в профайлере, и, действительно, на сервер посылается запрос на обновление почему то всех полей таблици tbl_Account, а параметры заданы только двух полей, это FieldID и ActivityID.

В чем может быть проблема?

Нравится

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

Михаил, у Вас переменная AccountID содержит значение? После открытия датасет AccountDS содержит записи, или он пустой? Хорошо бы эти вещи проверять перед выполнением. Можете выложить тексты функций GetAccountActivityID и GetAccountFieldID?

Если AccountID пуст, то эта функция даже не выполняется (стоит проверка IsEmptyGUID(AccountID)). Датасет содержит одну запись, как и должно быть (проверял).
Вот тексты функций:

function GetAccountActivityID(ActivityName) {
	if (IsEmptyValue(ActivityName)) {
		return null;
	}
	var ActivityID = GetDatasetIDByFieldValue('ds_Activity', 'Name', ActivityName);
	if (IsEmptyGUID(ActivityID)) {
		var ActivityDS = GetSingleItemByCode('ds_Activity', 'ContactIntegration');
		ActivityDS.Append();
		ActivityID = Connector.GenGUID();
		ActivityDS('ID') = ActivityID;
		ActivityDS('Name') = ActivityName;
		ActivityDS.Post();
	}
	return ActivityID;
}
function GetAccountFieldID(FieldName) {
	if (IsEmptyValue(FieldName)) {
		return null;
	}
	var FieldID = GetDatasetIDByFieldValue('ds_Field', 'Name', FieldName);
	if (IsEmptyGUID(FieldID)) {
		var FieldDS = GetSingleItemByCode('ds_Field', 'ContactIntegration');
		FieldDS.Append();
		FieldID = Connector.GenGUID();
		FieldDS('ID') = FieldID;
		FieldDS('Name') = FieldName;
		FieldDS.Post();
	}
	return ActivityID;
}

Они выполняются нормально и возвращают значения.

Уточните, пожалуйста, версию конфигурации (с точностью до сборки).

P.S. Я так понимаю, в последней функции должно быть return FieldID?

Да, FieldID:smile:. Версия 3.3.0.72.

Михаил, протестировал на Вашей версии. Видимо, Вы вызываете данную функцию в Terrasoft Administrator. Попробуйте выполнять её по какому-то действию из клиентского приложения, должно работать корректно. Данная проблема связана с тем, что во время сохранения сервис датасета находится в режиме редактирования, и в этом состоянии ведёт себя не так, как в рабочем режиме.

Если Вам необходимо обновлять записи именно через Terrasoft Administrator, используйте сервис UpdateQuery.

Да, именно так, я тестирую в Terrasoft Administrator. Спасибо за помощь. Сейчас попробую.

Из клиента все работает. Еще раз спасибо за помощ.

Вот такие неудобные вещи порой приводят в ступор. :confused: И думаешь, ты ли дурак или программа.
Бились два дня пока не нашли этот пост. :smile:

Спасибо участникам в этом посте. :wink:

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