На данный момент у нас Terrasoft 3.3.2.307 SQL сервер 2008 10.0.6000.29 SP4 Standard Edition (64-bit).
Планируем обновить SQL-сервер до версии 2014.

Вопрос: для приложения\баз Terrasoft надо какие-нибудь манипуляции делать, может какие то подводные камни есть и нужна определенная последовательность действий?

Нравится

1 комментарий

Подскажите пожалусйта как и где можно использовать функцию GetDBValue?

Нравится

1 комментарий

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

В базовой конфигурации функции GetDBValue нет.

Вероятно, она была реализована в рамках Вашего проектного решения.

К сожалению, без кода самой функции нельзя ответить на Ваш вопрос относительно того, как и где её можно использовать :sad:

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

Создан справочник. Открываю справочник, выбираю данные, сохраняю "ОК". После повторного открытия справочника-открывается только прежний выбранный продукт. Приходится перезагружать TS.
Что нужно прописать в function dlDataOnDatasetDataChange(DataField), чтобы не происходило "залипание"?

Нравится

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

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

Уточните, пожалуйста, каким образом Вы создавали справочник?

Какая версия, используемого приложения Terrasoft CRM?

Если можете, предоставьте сервисы справочника.

Добрый день!Версия 3.4.1.142
В разделе "Продажи" (я переименовал в Накладные), созданы стандартные луповидные справочники Продукт и Документ. При первом открытии всё подгружается, при повторном - открывается только ранее открываемый. В файле на 10 листе отмечен алгоритм синим цветом

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

Конечно, сложно дать точные рекомендации по одному только коду, однако по тому, что Вы предоставили есть такое замечание.

В обработчике OnDatasetDataChange для поля 'OfferingID' Вы написали такой код:

if (!IsEmptyValue(Dataset('OfferingID'))) {
var LookupDataset = Dataset.DataFields('OfferingID').LookupDataset;
var Price = edtBasicPriceValue.Value; // Цена, руб
ApplyDatasetIDFilter(LookupDataset, Dataset('OfferingID'), true);
LookupDataset.Open();

var PriceSR = GetFieldValueFromDisabledField(LookupDataset, 'Price'); // Цена, руб
var Customer = GetFieldValueFromDisabledField(LookupDataset, 'SupplierID');
LookupDataset.Close();

dlData.Dataset.Values('PriceSR')= PriceSR;
dlData.Dataset.Values('CustomerID')= Customer;
}

Если Вам нужно получить значения из датасета ds_Offering по полю ID, то делать это нужно по-другому - брать нужно не LookupDataset, а отдельный экземпляр датасета, который можно получить следующим образом:
var Dataset = GetSingleItemByCode('ds_Offering', 'OfferingDataset')
Для него и нужно применять фильтры и получать нужные значения.

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

Доброе время суток, Алла! Большое спасибо, что написали.
Вы мне очень помогли!!!
Я "чайник" в программировании, но методом тыка, проб и ошибок - немного получается. Обычно копирую уже созданные алгоритмы и подставляю в разные разделы.
Есть ещё один вопрос!
-На основании Инцидента создаю Документ.
-При открытии Инцидента в полях справочника Документ и справочника Состояние Документа дублируются значения созданного Документа.
-При изменении состояния Документа, автоматически меняется показатели в Инциденте scr_DocumentEdit :
//-------------------------//-----------------------//------------------------
function btnOKOnClick(Control) {
var Dataset = BaseDBEdit.Dataset;
if (CheckItemNumberDuplicate('Document', Dataset, 'DocumentNumber', "Документ")) {
//-------------------------------Подгрузка данных Документа в Инцидент !!!
var IncNumber = Dataset.Values('IncidentID');
var DocumentID = Dataset.Values('ID');
var DocumentStateID = Dataset.Values('StateID');
}
var IncDataset = Services.GetNewItemByUSI('ds_Incident');
if (!IsEmptyValue(IncNumber)){
ApplyDatasetFilter(IncDataset, 'ID', IncNumber, true);
IncDataset.Open();
IncDataset.Edit();

IncDataset.Values('DocumentID') = DocumentID;
IncDataset.Values('DocumentStateID') = DocumentStateID;
IncDataset.Post();
IncDataset.Close();
}
//---------------------------------------------------------------------------------------------------------

-Повторил данный код в wnd_IncidentEditScript :
//------------------------//-------------------------//------------- //1
function btnOKOnClick(Control) {
var Dataset = BaseDBEdit.Dataset;
if (CheckItemNumberDuplicate('Incident', Dataset, 'IncidentNumber', "Инцидент")){ // !!!

//------------------------Подгрузка данных Инцидента в Документ !!!
var DocNumber = Dataset.Values('DocumentID');
var Incident = Dataset.Values('ID');
var IncidentStatus = Dataset.Values('StatusID');
}
var DocDataset = Services.GetNewItemByUSI('ds_Document');
if (!IsEmptyValue(DocNumber)){
ApplyDatasetFilter(DocDataset, 'ID', DocNumber, true);
DocDataset.Open();
DocDataset.Edit();

DocDataset.Values('IncidentID') = Incident;
DocDataset.Values('IncidentStatusID') = IncidentStatus;
DocDataset.Post();
DocDataset.Close();
}
//------------------------------------------------------------
- но действий не происходит...

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

Мне не совсем понятно, какую именно задачу Вы хотите решить такой реализацией.

Если нужно, чтобы при изменении состояния документа изменялись значения в карточке редактирования инцидента, то реализовывать ничего специально не нужно. В запросе на выборку в таблице tbl_Incident нужно указать, что поле состояние документа, выбирается из той же таблицы, что и сам документ.
После сохранения карточки документа значения автоматически подтянутся при открытии карточки инцидента.

Аналогично для инцидента.

Получается, что вы неправильно построили запросы на выборку.

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

Добрый день! На протяжении примерно пары лет у нас наблюдаются зависания системы с последующей необходимостью "убивать" процесс, ранее ваши коллеги советовали чистить кэш - проблема стала проявляться реже, но все же осталась (не критично), но последнее время стала снова проявляться чаще, а так же увеличилось время обработки процессов системы именно клиентом у некоторых пользователей (прямую зависимость найти не удалось). Может ли быть связана эта проблема с переходом пользователей на Win 7 64x с Win 7 32x? Возможно у вас появились обновленные бинарные файлы после 3.3.2.307, которые могли бы помочь, или же имеются другие версии, которые объективно лучше работают на Windows 7 64x?
Спасибо!

Нравится

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

Добрый день, Антон!

Причины возникновения проблемы могут быть самые разные. Для генерации решения нужно определить её источник (база данных, аппаратное обеспечение сервера или клиентские места). В момент возникновения замедлений проверить у всех ли пользователей это происходит одновременно. Если «да», то обратить внимание на сервер, в частности, на загрузку ЦП и оперативной памяти. Если там всё в порядке, тогда нужно моделировать ситуацию и в это время с помощью утилиты «SQL Server Profiler» пробовать отследить проблемные запросы к базе для возможности их оптимизации. Следующий этап – это проанализировать зависит ли замедление от пользователя, админ\не админ (играют ли роль права доступа). На скорость работы (время отклика системы), также, может влиять количество колонок, которые отображаются в реестре записей (желательно лишние спрятать), наличие сортировки по каким-то из полей реестра (убрать сортировку можно зажав Ctrl и кликнув по полю).

Со временем может быть нарушена структура индексов базы данных (создаются для ускорения выборки данных). Их можно перестроить при помощи скрипта Reindex.rar (во вложении). Рекомендации по выполнению скрипта – во вложении. После выполнения скрипта создаётся хранимая процедура «sp_reindex_all_tables». Её нужно запустить на выполнение. В зависимости от количества индексов, размера базы данных и ресурсов сервера выполнение данной процедуры может занять достаточно продолжительное время при этом нагружая сервер. В связи с этим, если вы будете пересоздавать индексы, рекомендую запускать процесс, когда пользователи не работают с системой. Перед этим обязательно создайте резервную копию базы данных.

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

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

Добрый день Антон!!!

Алла сказала верно, что причины возникновения могут быть самые разные. Но раз вы пользуетесь Клиент-Серверным приложением, версии 3.3.2, то я бы обратил внимание в каких именно бизнес-процессах происходит зависание, в каких именно разделах происходит зависание, в каких именно деталях происходит зависание. И уже после этого стал анализировать в первую очередь SQL запросы, что работают в разделе, деталях, карточках редактирования в бизнес-процессах. ведь неправильно составленные и оптимизированный SQL запросы дают в первую очередь такой эффект. В бизнес-процессах я бы чтобы найти ошибку или зависание в первую очередь произвел бы оптимизацию, путем деления больших процессов на более мелкие, чтобы именно в каждой маленькой сущности искать уже проблемы. Если нужна помощь советом более подробно пишите, буду рад вам помочь.

Причины действительно могут быть разные, но в данной ситуации у нас следующие факты и на большинстве рабочих мест кейсы отрабатывают в два раза дольше:
При сравнении рабочего места быстрого и медленного был проведен следующий анализ:
- Запросы на сервере отрабатывают быстро
- Время обработки запросов на сервер в одних и тех же кейсах для разных рабочих мест примерно одинаковое и не зависит от конкретного времени (очень редко зависит от определенного времени в течении дня)
- Сервер мониторили - ЦП оперативки с большим запасом
- Для надежности кэш почистили на всех рабочих местах
- Проверяли под одним и тем же пользователем Terrasoft на разных рабочих местах, давали пользователю права локального админа на рабочее место, запускали Terrasoft от имени администратора.
- Проводили полную установку Terrasoft и пользовательскую.
- Рабочие места где происходит разница во времени не зависят от места расположения комнаты в офисе, сети и операционной системы (у нас либо Win 7 64 либо 32)
- Не зависит от железа компьютера, на более медленных машинках (на пример 4 гб, в место 8 Гб) наблюдались более длительное время выполнение, причем не зависело от количества запущенных в дополнении приложений.
- Самое главное, при всех сравнения и экспериментах время выполнения кейсов не менялось (на разных рабочих местах) например на одном 4 сек сохранение проекта, под другим 8 сек. И чтобы мы не делали значения там где медленее не менялось в лучшую сторону. Мы разбили даже код на куски и производили логирование по частям исполняемого кода, в результате мы не нашли конкретных проблемных мест в основном мы наблюдали пропорциональное возрастание времени исполнения кода на клиенте на разных рабочих местах, при этом сервер обрабатывал запросы одинаково.
- У нас проектное решение

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

на ваш вопрос ответил в рамках обращения в службу поддержки.

А профайлер на sql сервере в самих запросах не помог выявить проблемные запросы с длительным выполнением?
Проблема то в коде скорее всего... либо тяжелые запросы, либо неаккуратные скрипты при сохранении записей, в любом случае это надо брать базу и тестировать.

Добрый день!
Проблема зависаний действительно есть и с ней я столкнулся опять совсем недавно.
Нужно было в карточке проставить связанные продажи. Попросили пользователей создавать продажи и потом выбирать их в карточке.
Значения для поля продажа в карточке фильтруются OnPrepareSelectWindow. Заполнить надо было около 800 карточек.

Так вот после 40-50 заполнений система зависала или вываливалась ошибка, не связанная с конкретным кодом. Анализ показал, что клиентское приложение так себя ведет когда начинает использовать память больше определенного значения. А занимаемая память увеличивается после открытия каждой карточки или датасета. И не освобождается.

Подчеркиваю. Проблема не с сервером, а именно на клиентских машинах. Самое смешное, что физической памяти на компах еще много в этот момент, но клиент выше определенного предела видимо использует ее некорректно. И это не зависит от x64. Я повторил такую же проблему у себя на ноуте, где x32.

Уважаемые разработчики! Можно ли это как то исправить? Это сильно мешает работать и портит впечатление от в целом неплохой системы. Могу попробовать помочь симулировать ситуацию на базовой конфигурации.

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

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

Вероятно, Вы пользуетесь не самой последней версией приложения Terrasoft.

На сегодняшний день последней версией Terrasoft является версия 3.4.1.186.

Добрый день, Алла.
Мы как и автор темы используем конфигурацию версии 3.3.2. и насколько я знаю использовать клиента 3.4.1 несколько невозможно. Или я ошибаюсь?
Для 3.3.2. последние бинарники вчера получил.

"Гетманенко Виктор" написал:использовать клиента 3.4.1 несколько невозможно. Или я ошибаюсь?

Денежку за использование лицензий 3.4.1 заплатите и используйте просто новые бинарники, без перевода конфигурации на новую версию.

Про переполнение памяти на клиенте - либо проблема бинарников, либо что более вероятно криво написанный код в том месте, использование которого вызывает переполнение...

Здравствуйте, Виктор.

Как выше написал Александр, утечка памяти может происходит в коде, например, при открытии карточки редактирования мы создаем глобальный объект, который не уничтожаем по закрытию карточки редактирования.

В версии 3.4.1 не наблюдал утечки памяти.

"Александр Кудряшов" написал:без перевода конфигурации на новую версию

ну с 3.5 это точно не прокатит. А вот про 3.4 не проверял.
"Александр Кудряшов" написал:либо что более вероятно криво написанный код в том месте, использование которого вызывает переполнение

этот "криво написанный код" обычно является стандартной функцией scr_DB и называется AppendRecordInDataset

"Гетманенко Виктор" написал:AppendRecordInDataset

это безобидная функция добавления записи... и вызывается она в коробке вроде только из scr_Access функции AddAccessRecord... т.е добавление прав доступа.
Внутри у нее Append, Post - вот видимо они память и жрут... ну в любом случае тут надо предметно отладкой заниматься :)

Добрый день, Павел.

"Терещук Павел" написал:например, при открытии карточки редактирования мы создаем глобальный объект, который не уничтожаем по закрытию

Я пробовал уничтожать объекты. Эффекта нет. Возможно, конечно, неправильно это делаю.
Присваиваю объекту null и делаю delete для ActiveX объектов?

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

Добрый день, коллеги! Выявили одну, по нашим догадкам, из основных проблем. Проблема с сортировкой - стандартный функционал позволяет сортировать разделы, но в трейсе (преобразовав в запрос) четко видно, что основное время затрачивается на сортировку (например по типовому полю «дата начало» - 1 мин 30 сек (при этом мы закомментили из запроса большинство полей (иначе еще дольше) оставив - ID, Название , номер и дату старта). Без сортировки меньше секунды.
Подскажите, в чем может быть проблема сортировки?

Если при сортировке по полю происходит замедление, можно попробовать добавить в таблице БД индекс по этому полю.

На этих колонках есть индексы

Антон, судя по тексту запроса,дата начала — это не просто поле, она вычисляется отдельным подзапросом с достаточно сложным условием из EXISTS и NOT EXISTS. И при сортировке по ней запрос будет выполняться долго в любом случае, хоть его запустить из Terrasoft, хоть напрямую запустить этот код из Management Studio.

Если нужно понять узкие места в запросе, можно воспользоваться инструментами анализа плана выполнения запросов.

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

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

Доброго времени суток.
Столкнулся со следующей задачей:
При копировании операции в разделе продажи, чтобы менялась "дата От:" на текущую, а также копировались права доступа.
У меня совсем нет опыта в работе с Terrasoft, поэтому прошу помощи профессионалов.

Нравится

3 комментария

Здравствуйте, Дмитрий!

1. Для того, чтобы при копировании поменялось значение поля, нужно в обработчике события OnDatasetAfterAppend датасета даталинка прописать такой код:
if (BaseDBEdit.IsCopy) {
//TO DO присвоение нужного значения полю
}

2. Для копирования прав доступа нужно в обработчике кнопки OK прописать вызов функции копирования прав доступа CopyRight:
function btnOKOnClick(Control) {
scr_BaseDBEdit.btnOKOnClick(Control);
if (Self.Attributes('IsCopy')) {
var RecordID = Self.Attributes('RecordID');
CopyRight(Self.Attributes('SourceRecordID'), RecordID);
}
}

function CopyRight(OldRecordID, NewRecordID) {
var InsertSelectQuery = GetSingleItemByCode('isq_CopyRight');
var Columns = InsertSelectQuery.SelectQuery.Columns;
var ConstColumn = Columns.ItemsByAlias('NewRecordID');
ConstColumn.ColumnValue = NewRecordID;
SetParameterValue(InsertSelectQuery.Parameters, 'OldRecordID', OldRecordID);
SetParameterValue(InsertSelectQuery.Parameters, 'MyAdminUnitID',
Connector.CurrentUser.ID);
try {
InsertSelectQuery.Execute();
}
catch(e) {
CatchException(e);
}
}

где isq_CopyRight - сервис InsertSelect Query, который Вы можете реализовать самостоятельно по аналогии с подобным сервисом, структуру которого можно увидеть на скриншоте в прикрепленном к данному посту файлу.

Я не совсем верно задал вопрос, прошу прощения.
При нажатии на кнопку "Копировать", которая находится в CashFlowGridArea.

В обработчике нашел метод, который копирует, но не знаю как реализовать подстановку текущей даты в определенные поля.
wnd_CashflowGridAreaScript

function btnCopyOnClick(Control) {
	var AdditionalAttributes = GetNewDictionary();
	AdditionalAttributes('OldRecordID') = dlData.Dataset.Values('ID');
	var WorkspaceDataset = Self.Attributes('WorkspaceDataset');   
	if (Assigned(WorkspaceDataset)) {
		AdditionalAttributes('IsDetailCopy') = true;
	}
	CopyGridAreaData(Self, BaseGridArea, AdditionalAttributes);
 
}   

scr_BaseGridAreaUtils

function CopyGridAreaData(Window, BaseGridArea, AdditionalAttributes) {
	if (!GetCanCopyData(BaseGridArea.GridDataset)) {
		return;
	}
	CheckAttributes(Window, 'EditWindowUSI');	
	var Attributes = GetCopyDataAttributes(Window, BaseGridArea);	
	if (Assigned(AdditionalAttributes)) {
		CopyAttributes(AdditionalAttributes, Attributes);
	}	
	if (IsAttributeExists(Window, 'EditWindowDatasetUSI')) {
		Attributes('DatasetUSI') = Window.Attributes('EditWindowDatasetUSI');
	}
	Attributes('WorkspaceDataset') = BaseGridArea.WorkspaceDataset;
	Attributes('EditWindowCaption') = Window.Attributes('EditWindowCaption');
 	ShowEditWindowEx(BaseGridArea.EditWindowUSI, Attributes);	
}

C копированием дат разобрался :)
В свойствах датасета убрал галочку "копирование поля"

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

При попытке зайти в систему Terrasoft 3.4 нам выдается ошибка вида :

При этом с компьютера проблемного пользователя заходит в систему без проблем под другими учетными записями.

Как разрешить эту проблему?

Нравится

1 комментарий

Добрый день! у меня проблема с программой, я создаю файл dataset для своего fast report, но при добавлении полей справочника программа закрывается, Microsoft Script Debugger у меня установлен, данную ошибку не отслеживает, клиентская часть работает вроде нормально, помогите решить данную проблему.

Нравится

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

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

Не понятно, что, как и куда вы добавляете. Постарайтесь, пожалуйста, более детально описать проблему (желательно со скриншотами).

Программа закрывается с каким-то сообщением? С каким?

Получается ли запустить тот отчет, который Вы модифицируете, из TSClient?

я пытаюсь сделать свой fastreport с нуля, но при добавлении полей справочников в dataset, программа вылетает, в чем моя ошибка?

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

К сожалению, по предоставленным Вами сервисам ничего конкретного сказать нельзя.

Уточните, пожалуйста, при добавлении каких именно полей справочников возникает ошибка, на каком шаге (опишите последовательность действий)?

создаю сервис dataset, и добавляю в нем поля типа справочник, у справочнику указываю источник из другого dataset, родительського, тот, который нужен, он добавляется, затем программа вылетает ((, но потом зайти на dataset невозможно, программа вылетает при попытке зайти на dataset ((.

1) Вы добавляете поля в тот датасет, который находится в архиве?
2) Какие именно поля Вы добавлете, что указываете в качестве источника?
3) Возникает ли эта ошибка, если Вы пытаетесь добавить такое же поле в другой датасет или только в этот?

Эта информация нужна, чтобы установить причину ошибки.

1) нет, у свой созданый датасет
2) добавляю поле customer, типу справочника, указиваю в нем источник ds_Account, дальше сохраняю, пробую вернуться и выбивает ошибку
3) да, возникает, уже все перепробовал

1) Сервис в архиве тоже назвается ds_TestReport и содержит те же поля. Он у меня открывается без ошибок.
2) Для анализа проблемы выложите ещё сервис отчета fr_TestReport (также, если, как Вы утвержаете, select query и dataset отличаются от тех, которые находятся в предыдущем комментарии в архиве, добавьте и их).

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

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

Добрый день!

Подскажите, как можно добавить и настроить виджеты в Раздели Аналитики, например виджет курса валют? Что для этого необходимо?

Спасибо!

Нравится

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

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

Если Вы планируете выводить данные по курсу валют или погоде, полученные с других сайтов, можно использовать блок итогов web-страница. При ее настройке Вам достаточно указать ссылку на страницу, с интересующей Вас информацией и она будет выведена в разделе "Итоги"

Блок итогов “Виджет” отображает дополнительные виджеты, настраиваемые разработчиком, например, виджет курсов валют, виджет погоды.
Как мне поэтапно создать виджет, например курса валют, но задача построить таблицу, хотел разобраться как использовать виджеты? На сколько я понимаю нужно создать свой модуль и в настройка вызвать его, но что для этого нужно и что необходимо писать в параметрах модуля?

Алгоритм добавления виджета такой:

1) Создаёте свой виджет в конфигурации, создать модуль
2) Переходите в раздел [Итоги]
3) Через меню «Изменить», выбираете добавить виджет
4) В открывшихся настройках модуля, выбираете свой модуль
5) При необходимости указываете параметры и сообщение

Что касается самих модулей, добавляю информацию по ним во вложение. Также, достаточно подробная информация доступна в SDK.

Примеров готовых виджетов погоды и курса валют предоставить не смогу. Однако, тут и вот тут доступна полезная информация по их созданию.

"Павел Баштовой" написал:

Алгоритм добавления виджета такой:

1) Создаёте свой виджет в конфигурации, создать модуль

2) Переходите в раздел [Итоги]

3) Через меню «Изменить», выбираете добавить виджет

4) В открывшихся настройках модуля, выбираете свой модуль

5) При необходимости указываете параметры и сообщение

Что касается самих модулей, добавляю информацию по ним во вложение. Также, достаточно подробная информация доступна в SDK.

Примеров готовых виджетов погоды и курса валют предоставить не смогу. Однако, тут и вот тут доступна полезная информация по их созданию.

Спасибо

Владимир, видео добавлено в модуле SectionDesigner, блок SystemDesignerVideo. Можно попробовать заместить модуль и добавить вместо видео необходимый виджет.

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

Добрый день! помогите сделать в карточке контакты следующую вещь, при выборе приветствие чтобы сразу выпадал пол согласно приветствие, так как показано на скриншоте.

Нравится

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

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

Для реализации такой функциональности нужно в обработчике OnDatasetDataChange Datalink карточки редактирования контакта выполнять проверку:

if (DataField.Name == 'SalutationID') {
// TO DO
}

А в теле if делаете проверку:

if (DataField.Value == [ID значения госпожа]) {
dlData.Dataset('GenderID') = [ID значения Женский];
} else
if... // по аналогии прописываете проверку для Мужской

Посмотреть значения для поля [Приветствие] можно в таблице tbl_Salutation, а для поля [Пол] - в перечислении enm_Gender.

Зашел в OnDatasetDataChange, у меня получилась такая проверка, ID подставил правильно, не понимаю почему не работает?

	if (DataField.Name == 'SalutationID') {
if (DataField.Value == '1F87FD97-A663-4C02-8530-48951F912C6B') {
dlData.Dataset('GenderID') = '8CB0B216-3E35-47CE-8C31-8DFAA3C1548D';
} else
if
    (DataField.Value == 'E285E1C6-841C-45CE-B5CD-B256C445DFFB') {
dlData.Dataset('GenderID') = '264EF705-6CC4-4E2F-9611-45531D04CBE7';
} 
}

Покажите весь код обработчика OnDatasetDataChange.

Для понимания того, почему код не работает, попробуйте выполнить пошаговую проверку и посмотреть, что происходит в данном куске кода.

function dlDataOnDatasetDataChange(DataField) {
	var Dataset = DataField.ParentDataFields.ParentDataset;
	var DataFieldName = DataField.Name;
 
 
 
	if (DataFieldName.indexOf('Communication') == 0) {
		var Index = DataFieldName.substr(13, 1);
		var CommTypeDataControl =
			Self.ComponentsByName('edtCommunication' + Index + 'Type');
		var CommDataControl =
			Self.ComponentsByName('edtCommunication' + Index);
		RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl,
			(DataFieldName.indexOf('Type') > -1));
	}
	if (!ContactEdit.IsUpdating){
		switch (DataFieldName) {
			case ('AccountID'):
				if (!IsEmptyStr(DataField.DisplayValue)) {
					ContactEdit.IsUpdating = true;
					try {
						FillInformationBySelectedItem(Dataset, DataField.Value, 
							DoYouWantToFillContactEntriesMessage);
					} finally {
						ContactEdit.IsUpdating = false;
					}
				}
				break;
		}
	}
 
	if (DataField.Name == 'SalutationID') {
if (DataField.Value == '1F87FD97-A663-4C02-8530-48951F912C6B') {
dlData.Dataset('GenderID') = '8CB0B216-3E35-47CE-8C31-8DFAA3C1548D';
} else
if
    (DataField.Value == 'E285E1C6-841C-45CE-B5CD-B256C445DFFB') {
dlData.Dataset('GenderID') = '264EF705-6CC4-4E2F-9611-45531D04CBE7';
} 
}
 
}
 

Если бы Вы запустили debugger, то сразу бы поняли причину, почему не срабатывает этот код.
Попробуйте добавить Ваш код в начало обработчика.

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

Есть такой элемент добавления.

есть таблица А в которую нужно вставить некоторое количество записей из таблицы Б
Нужно в А.Поле1 записать значение (Если Б.Поле1==1 то Параметр1*Б.Поле2 Иначе 0)
-------------------------------------
Также интересует как с помощью БП можно увеличить значение поля в конкретной записи(нипример контакта), например увеличить числовое поле год на 5.

Нравится

2 комментария

Виталий,
1. При работе с массивом в элементе добавление данных выполнить дополнительные арифметические действия не получится. Задачу можно решить в 2 этапа.
- Добавлять выборку из таблицы Б в таблицу А.
- Создать второй процесс по стартовому сигналу добавления записи в объекте А. Выполнять интересующие проверки, манипуляции и т.д.
2. Увеличить значение поля в определенной записи:
- элемент читать данные. По заданному условию найти интересующую запись.
- элемент изменить данные.
Если интересующее поле с типом Целое – [Читать данные. Первый элемент коллекции. Название поля] + 5
Если тип поля DateTime - [Читать данные. Первый элемент коллекции. Название поля].AddYears(5)

Получилось, спасибо

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