Караул!!!
Несколько дней назад синка сломалась, писало "Out of memory". Долго бился в стенку пока не проверил историю синхронизаций, там было 1 645 624 записей!!!! я сократил до 13 000. теперь при экспорте контрагентов пишет "List index out of bounds". Ошибка вываливается в разных местах, иногда при сохранении записи на дели истории, иногда при открытии настроек синки, иногда при открытии настройки соответствия полей. Синка полностью выведена из строя, клиент в бешенстве, я уже не знаю что делать!

Вот одно из мест ошибки

function GetFullObjectParam(ObjectID, Obj1C, SynType, ErrorsIsNotAcepted,
        Version, DataflowID, Dataset1CObject) {
        if (!Assigned(Dataset1CObject)) {
                Dataset1CObject = GetSingleItemByCode('ds_1CObject', 'GetFullObjectParam');
                EnableDatasetFilters(Dataset1CObject, false);
                ApplyDatasetFilter(Dataset1CObject, 'ID', ObjectID, true);
                Dataset1CObject.Open();

в строке Dataset1CObject.Open(); выбивает ошибку, посмотрел SQLText и проверил его в скл менеджере - работает нормально, выбрало нужную запись, в коде - ошибка.
кеш чистил, СКЛ сервер перезагружал. какие есть идеи? Нужно срочно это исправить
версия: xrm 3.4.0.130

Нравится

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

Я бы начал с анализа сервиса ds_1CObject и сервиса его запроса (sq_), может какая колонка слетела.
Плюс избавился бы для эксперимента от GetSingleItemByCode, заменив на Services.GetNewItemByUSI, хотя бы временно

только что в новом месте ошибка выскочила:

function GetAreRemindingsExist() {
	Main.RemindingsDataset.Close();
	var SelectQuery = Main.RemindingsDataset.SelectQuery;
	var PrimarySelect = GetSelectQueryPrimarySelect(SelectQuery);
	EnableFilter(PrimarySelect.Filters, 'ContactID', true);
	var ContactParameter = SelectQuery.Parameters.ItemsByName('ContactID');
	ContactParameter.ValAsGUID = Connector.CurrentUser.ContactID;
	EnableFilter(PrimarySelect.Filters, 'RemindTime', true);
	var RemindTimeParameter = SelectQuery.Parameters.ItemsByName('RemindTime');
	var today = new Date(System.Now());
	RemindTimeParameter.Value = today.getVarDate();
	Main.RemindingsDataset.Open();

вот тут: Main.RemindingsDataset.Open();
Как может вот так в разных местах все слететь???

вот еще одна ошибка:
Ошибка экспорта. Возникла при попытке открытия источника данных Контрагент. Ошибка открытия источника данных "ds_Account".
Оригинальное сообщение об ошибке: List capacity out of bounds (32)

Здравствуйте, Виталий!

А какие запросы идут в базу данных проверяли?
Также рекомендую проверить работает ли синхронизация хотя бы для одной записи.

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

Нечто новое. Делается бекап БД каждый день, я сделал новую бд, залил туда бекап от 1 июля и запустил на других бинарниках:confused:таже ошибка:confused:... Это что за прикол такой!!!
вот такую ошибку мне показало при попытке экспорта контрагентов:

Main.RemindingsDataset.Open()	List index out of bounds (3)

Здесь ошибка в напоминаниях, но бывает и при открытии ds_Account

Виталий,

Эта проблема наблюдается только на одной машине или на других тоже воспроизводится?

Попробуйте очистить кеш и профиль пользователя Terrasoft.

"Савельева Алла" написал:

Здравствуйте, Виталий!

А какие запросы идут в базу данных проверяли?

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

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


записи проверял - нормальние, в скл работают
даже длня лной не работает

тут дело в том что ошибка вылетает независимо от версии базы(свежая или 2 недели назад) и бинарников. Проблема кроется гдето на компе, что же может выдавать такую ошибку?

Сегодня создал новую настройку в интеграциях, взял раздел счета, выбило первоначальную ошибку Out Of Memory!!! в чем же может быть ошибка? А еще иногда после появления ошибки клиент закривается

То есть проблема наблюдается в разных местах системы, на разных бинарниках и базах, но на одном ПК?
Может, на этом компьютере памяти не хватает или она битая?

"Зверев Александр" написал:Может, на этом компьютере памяти не хватает или она битая?

перенесли. Теперь ошибка "list index of bounds(0)" выбивает в разделах контрагенты и контакты при сохранении карток... Какие у кого еще идеи есть??? везде выбивает на моменте сохранение Dataset

Это решил, прописал sp_change_users_login 'update_one', 'fkeys', 'fkeys' и ошибка пропала.
Еще вопрос. Сделал импорт одного контрагента и очень долго думало, гдето 2-3 мин а потом предложило загрузить метаданные, я нажал нет и оно опять 1-2 минуты подумало, сказало что недостаточно памяти и выбило ТС.
Как сократить это время "думания" ТС??? Для одной записи слишком долго думает...

Проанализируйте запросы к БД, которые выполняются в рамках синхронизации одной записи.

Также не лишним будет отладить конфигурацию TS в том месте, где вызывается синхронизация и посмотреть, что и где подвисает.

Возможно, что Ваша таблица контрагентов достаточно большая и запросы к ней отрабатывают длительное время, в таком случае нужно оптимизировать её работу на уровне БД.

Контрагентов всего 6 тысяч, много раз просматривал отладчиком код, ТС просто закрывается без предупреждения в разных местах кода... Раньше ошибки выскакивали о недостатках памяти при открытии какого-то Dataset. Востанавливались разные бекапы на разних системах и ПК и везде одинаковые ошибки в ТС. И тут сделал синку с очень старой базой 1С и о чудо ошибок нет...
Оперативы стоит 16 гигов, в диспетчере она полностью она не задействуется, но выбивает ошибку о недостаче памяти...

Здравствуйте, Виталий!

Ответьте, пожалуйста, на следующие вопросы.

1. Выполнялся ли анализ запросов, которые поступают в базу данных?

2. Выполнялись ли накануне возникновения проблемы какие-то доработки в конфигурации 1С или Terrasoft до того, как произошел сбой?

3. Базы данных Terrasoft и 1С находятся на одном сервере?

4. Выполнялись ли накануне возникновения проблемы какие-то работы на серверах, где находятся 1С и Terrasoft?

5. Синхронизация выполняется под пользователем с правами администратора Terrasoft или под обычным пользователем?

6. Сбой происходит при попытке затянуть данные из 1C в Terrasoft или в обе стороны?

7. Нет ли проблем с работой другой функциональности в Terrasoft?

Также рекоммендую Вам попробовать обновить бинарные файлы Terrasoft до последней версии.

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

В карточку звонка добавил два LookupDataControl. В зависимости от того, какое значение выбрано в LookupDataControl1, значения в LookupDataControl2 меняются. Фильтрацию делал в с помощью:

function edtTypeOnPrepareSelectWindow(LookupDataControl, SelectWindow) {

var TypeID = dlData.Dataset('TypeID');
var LookupDataset = edtResult.DataField.LookupDataset;
ApplyDatasetFilter(LookupDataset, 'CallTypeID', TypeID,
!IsEmptyGUID(TypeID));
}

а обновлял с помощью:

function dlDataOnDatasetDataChange(DataField) {

edtResult.UnprepareDropDownList();
edtPrichina.UnprepareDropDownList();
}

Но при выборе значений LookupDataControl2 вылетает ошибка List index out of bounds (разные числа)

В чем может быть проблема? Заранее спасибо.

Нравится

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

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

Уточните, пожалуйста, продукт и его версию.

Забыл сразу написать. XRM 3.3.2.

А если фильтр убрать, выбирает нормально?
Дело именно в наложенном фильтре, или в Unprepare?

Фильтр работает нормально. Без Unprepare работает тоже нормально. Может ли это быть от частого запуска "edtResult.UnprepareDropDownList()"? Просто когда убрал строки edtResult.UnprepareDropDownList() из функции dlDataOnDatasetDataChange, отрабатывает без ошибок.

Может, дело в том, что у Вас dlDataOnDatasetDataChange(DataField) срабатывает при изменении любого поля, а не только поля «Тип», по которому фильтруется? А если добавить дополнительную проверку и делить Unprepare только когда действительно нужно?

Да, срабатывает не только когда фильтрую по данному полю. А как можно отловить изменение именно этого поля? Добавил в функцию function edtTypeOnEnter(Control) стало отрабатывать нормально, без ошибок, но хотелось бы узнать, как можно отловить изменение именно в dlDataOnDatasetDataChange(DataField)?

У Вас в функцию dlDataOnDatasetDataChange передаётся параметр DataField. Это и есть то поле, что поменялось. Смотрите у него значение Name.

function dlDataOnDatasetDataChange(DataField) {
	var DataFieldName = DataField.Name;
	switch (DataFieldName){
		case ('TypeID'):
			edtResult.UnprepareDropDownList();
			break;
 
	}	
}

Спасибо. Вы очень помогли, Александр.

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

Добрый день!
Понадобилось реализовать такую задачу:
В DataControlы карточки добавить появляющуюся при появлении значения в поле кнопку(за лупой, если это LookupDataControl), нажатие на которую очистит это значение и после этого кнопка снова исчезнет.
Данную задачу реализовываю при помощи ActionMenu, привязывая ее к DataField.Buttons динамически в событии OnDatasetDataChange и затем при удалении значения поля делаю DataField.Buttons = System.EmptyValue.
Так вот, все работает нормально, если удаляю значение кнопкой Delete с клавиатуры, кнопка появляется и исчезает нормально, но если значение удалять из события ActionMenuItemOnExecute (Sender.DataField.Value = null), вываливается ошибка List index out of bounds(2).
В чем может быть проблема?
Заранее благодарен!

Нравится

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

Просто интересно, а чем Backspace не устраивал?

Вопрос к клиенту, наверное боятся мышь отпускать :wink:

Иван, реализуйте задачу немного иначе:
1. В функции dlDataOnDatasetDataChange пропишите логику скрытия amiActionMenuItem, например:

	if (FieldName == 'OwnerID') {
		if (IsEmptyValue (DataField.Value)){
	    amiActionMenuItem.IsVisible = false; 	
		}else{
		amiActionMenuItem.IsVisible = true;
		}
	}

2. В функцию обработки события OnExecute компонента amiActionMenuItem никаких изменений вносить не нужно.

Ошибка вызвана тем, что Вы находясь в уже вызванном обработчике события amiActionMenuItem, связанном с компонентом LookupDataField окна, пытаетесь сделать отвязку .

Спасибо Наталия, ситуация с ошибкой прояснилась.
Но проблема в том, что если сделать amiActionMenuItem.IsVisible = false, то он будет скрыт для всех DataField, которых очень много. А нужно это делать только для тех, в которых Value = null.

Вопрос решил обнулением Value по таймеру. Спасибо за наводку!

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