Технические вопросы
Разработка

Добрый вечер!
При удалении адреса контрагента вылезает ошибка:
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)

в карточке контрагента связей с адресом нет.
Никто не сталкивался с подобным?

Нравится

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

Где-то возникает рекурсия вызова хранимки или триггера. Нужно посмотреть профайлером на SQL-запрос, после которого это происходит.

Спасибо.
Убрал галочку "Каскадная связь" в таблице "Адреса контрагента" для поля "AccountID". Теперь удаляется нормально.

Показать все комментарии
Технические вопросы
5.x

В Журнале процессов на детали Элементы процесса, можно отобразить поле Ответственный, что в данном случае оно означает, и как его заполнить в самом процессе

Нравится

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

И второй вопрос вдогонку, как можно определить запущен ли уже процесс с идентичными входными параметрами

Ольга, поле "Ответственен" показывает владельца процесса (контакт пользователя, под которым выполняется БП).

А что по поводу второго вопроса

Что Вы подразумеваете под входными параметрами, приведите, пожалуйста, пример?

Показать все комментарии
7.x
бизнес-процесс
Технические вопросы

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

подскажите как я могу изменить процесс объекта, например Лид при событии "После сохранения записи".

Когда создается замещающий объект, бизнес процесс у него отсутствует (редактор пустой) и нет возможности добавить элементы.

Нравится

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

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

Показать все комментарии
Технические вопросы
7.x

Добры день, скажите пожалуйста как в продаже из детали продукт, добавление продукты подтягивать таблицой в печатную форму MS Word?
Создал печатную форму MS Word , указал связь продуктов с продажей, заполнил все как полагается, в продаже скачал форму, открыл и видно что все поля кроме продукты работают коректно, а вот продук из детали продукт в продаже отображается единично(первый продукт в продаже).
Как зделать так что бы в печатную форму переносились все продукты из продажи?

Нравится

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

Присоединяюсь к вопросу.

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

Необходимо просто настроить поля табличной части:

Сделал как показано на скрине, продукт оно и ранше подтягивало, но проблема в том что нужно не 1 в списке(а оно подтягивает только 1), а нужно все что прекреплены к продаже!
Как сделать так что бы в независимости от кол-ва продуктов 5,10,15 в печатную форму добавлялись все?

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

Где-то скорее всего у Вас ошибка.
Можете написать нам на support@terrasoft.ru - запланируем удаленное подключение.

Дмитрий, у меня в карточке продажи есть деталь Продукты, которая напрямую связана с объектом Product, то есть это не "Продукт в продаже". Сейчас в поле Объект нет объекта Продукт:

Значит ли это, что для переноса в печатную форму табличных данных по продуктам нужно использовать исключительно "Продукт в продаже"? Или как-то можно вывести и Product?

Да, нужно использовать "Продукт в продаже", которая в свою очередь связана с "Продукт", т.е. через нее можно "достучаться" ко всем полям таблицы "Продукт".
Что-то вроде "Продукт.Название" - см. скриншот в моем первом ответе в этой теме.

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

И ещё один вопрос - как можно в печатную форму подтягивать значение не из карточки, а из системной настройки, например? Скажем, текущую дату или номер документа (если печатная форма договора находится в разделе Продаж, а не в документах, например)

Для маленьких компаний реализация Продажа -> Продукт в продаже -> Продукт не оптимальна, слишком много действий что бы завести продажу. Поэтому мы всегда делаем прямую связь Продажа -> Продукт. Так же бывают внедрения где надо 40+ карточек продуктов добавлять с подробными техническими параметрами и соответственно генерировать печатные формы продуктов в связке с продажей, если перенос тех параметров реализовать в Продукте в продаже то это будет настоящий кошмар для разработчика. Поэтому предлагаю добавить в коробочную версию возможность использования собственных объектов для формирования табличной части печатных форм.

Не согласен с Вами, Вохид.
Связь Продажа-ПродуктВПродаже-Продукт обязательна.

У Вас есть база продуктов - это совершенно отдельная таблица, просто каталог всех продуктов,которые Вы продаете (к примеру).

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

Я могу сказать ваш подход хорошо работает для типизированных продуктов т.е. для продуктов при продаже которых свойства продуктов почти не меняются. А в отраслях где продукты уникальны для каждого клиента можно тоже самое количество продукта или скидку указывать в самой карточки продукта а от раздела счетов вообще отказаться и просто добавить необходимые поля в карточку продажи. Все зависит от подхода и желания заказчика, а так же немаловажную роль играет менталитет сотрудников. Заказчик сам выбирает как ему удобнее работать, в 90% случаях у нас заказчики выбирают схему Продажа -> Продукт и вполне осознанно понимая что при этом теряется часть встроенного функционала.

Вохид, разумеется, можно поступить и так. Я говорил о том, как это работает в "коробке".

Показать все комментарии
консоль
ошибка
Технические вопросы
7.x

Здравствуйте.
Постоянно появляется ошибка в консоли на страницах нового раздела.
Не могу понять, в чем её суть.

Uncaught SyntaxError: Unexpected token ViewModule.aspx:3
user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: http://83.221.177.90:70/0/Nui/ViewModule.aspx
line: 3
message: Uncaught SyntaxError: Unexpected token
date: Thu Oct 24 2013 16:28:33 GMT+0500 (Западная Азия (зима)) core.js:538
(anonymous function) core.js:538
context.execCb require.js:1597
Module.check require.js:845
Module.enable require.js:1113
Module.init require.js:758
(anonymous function) require.js:1379

Нравится

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

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

Акмаль, добрый день!

Можете предоставить копию БД, на которой воспроизводится ошибка?

Арсений, здравствуйте! Базу я высылал Дмитрию Олейнику и Максиму Гриценко в рамках обращений 0162047 и 0161965. Если те бекапы утеряны - могу выслать заново.

Добрый день!

База находится в работе, крайний срок предоставления решения - 18.12.2013.

Акмаль, для решения необходимо обновить ядро до 363+ сборки.

Показать все комментарии
Открыть страницу
Технические вопросы
5.x

Добрый день!
При попытке заменить элемент "Карточка редактирования" на действие "открыть страницу" возникло два вопроса. (вызвано отсутствием у элемента "Карточка редактирования" события о закрытии окна)
1. как действием "открыть страницу" открыть существующий элемент?
2. как привязать существующий документ к процессу?

создал тестовый процесс

Хотелось сделать это: добавляю документ, привязываю к процессу и открываю в карточке.

По факту получается следующее:
документ создается, привязка не происходит, в карточке открывается новый документ.

открываю страницу так:

DocumentId = Guid.NewGuid();
DocumentId = AddDataUserTask1.RecordId;
string DefValuesKey = Guid.NewGuid().ToString();
var defValues = new Dictionary string, object>();
var parameters = new Dictionarystring, string>();

string nowDate = UserConnection.CurrentUser.GetCurrentDateTime().ToString("dd.MM.yyyy");
                       
string DocumentDefaultTitle = "asdfasdfasd " +  " " + nowDate;
var DocumentPlaneDate = DateTime.Now.AddDays(5);

//System.Guid SpecialistSKA;
//if(SpecialistSKA == Guid.Empty){
var             SpecialistSKA = Terrasoft.Configuration.ProcessUtils.DefaultContactId;
//}

System.Guid AccountId = Guid.Empty;
System.Guid Opportunity = Guid.Empty;

var opportunity = new Terrasoft.Configuration.Opportunity(UserConnection);
bool currentOpportunitySpecified = opportunity.ExistInDB(ActiveTreeGridCurrentRowId);
bool opportunityNotSpecified = (Opportunity == Guid.Empty);
if(opportunityNotSpecified && currentOpportunitySpecified){
        Opportunity = ActiveTreeGridCurrentRowId;
        bool res = opportunity.FetchFromDB(Opportunity);
        Guid accountId = res ? opportunity.GetTypedColumnValueGuid>("AccountId") : Guid.Empty;
        if (accountId != Guid.Empty){
                AccountId = accountId;
        }
}


parameters.Add("defValuesId", DefValuesKey);
defValues.Add("Id", DocumentId);
defValues.Add("recordId", DocumentId);
defValues.Add("AgreementStatus", new Guid("FDA64288-F36B-1410-2296-002618DB6C97")); //Подготовка
defValues.Add("AgreementType", new Guid("3B7F427E-F36B-1410-FC9B-002618DB6C97")); //Типовой

//new
defValues.Add("Name", DocumentDefaultTitle);
defValues.Add("Type", new Guid("4E8B76A3-182B-E111-BD99-00155D040C1F")); //Заключение СКА
defValues.Add("Status", new Guid("FD9F327A-F36B-1410-0D8B-002618DB6C97")); //Ожидается проверка
defValues.Add("Owner", SpecialistSKA); //Ответственный
defValues.Add("Account", AccountId); //Account
defValues.Add("Opportunity", Opportunity); //Opportunity
defValues.Add("PlanEndDate", DocumentPlaneDate); //Opportunity

UserConnection.UserContext.Add(DefValuesKey, defValues);
parameters.Add("createWithUId", DocumentId.ToString());

UserTask1.OpenerInstanceId = InstanceUId;
UserTask1.PageParameters = parameters;
UserTask1.PageUId = new Guid("E201DACB-F6E5-46BD-978B-0E743398AB4B"); //FinallyCKAEditPage
UserTask1.UseOpenerRegisterScript = true;
UserTask1.CloseMessage= "AgreementeditPageClose";

return true;

Нравится

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

Здравствуйте, Илья!

А зачем эта строка?

parameters.Add("createWithUId", DocumentId.ToString());

Ведь запись Вам не нужно создавать, она уже создана. Для того, чтобы ее открыть, достаточно передать идентификатор в DefValues, что Вы и делаете вот тут:

defValues.Add("RecordId", DocumentId);

Обратите внимание, название параметра чувствительно к регистру.

Здравствуйте, Анна!

К сожалению ничего не получается.
Прикладываю тестовый процесс.
moduleprocess3.zip

Здравствуйте, Илья!
Процесс импортировать не получится, так как в нем используются элементы не из базовой конфигурации, то есть Вам также нужно предоставить страницы и объекты, используемые в процессе.
Либо создайте простой процесс, в котором просто будет открываться какая-нибудь базовая страница, чтобы локализировать проблему.
Также настораживает то, что начальное событие "AgreementedPageClose" находится в событийном подпроцессе, а обработчик - нет. Это, конечно, не влияет на открытие страницы, но лучше так не делать.
И еще, какое действие указано в элементе "Создать документ 'Проверка СКА'"?

Андрей, вот процесс на стандартных элементах.
moduleprocess31.zip

Илья, сейчас потестирую и отпишусь.

Илья, как правильно писала Анна для открытия созданной задачи нужно писать

parameters.Add("recordId", DocumentId);

и удалить строку

defValues.Add("RecordId", DocumentId);

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

Показать все комментарии
события датасета
триггер
Технические вопросы
Разработка

3.4.0 XRM
Ситуация следующая:

При сохранении карточки (добавление\обновление) надо было создавать и обновлять, если уже было создано, заранее неизвестное количество операций (одна или две или три - в зависимости от значения поля). Я решил эти так:
сделал триггер After Update на tbl_Task, который удаляет все связанные с задачей (и "созданные автоматически" - поле в tbl_Cashflow) операции, а на AfterPost датасета задач добавил функцию добавления операций.
Все работает нормально, но есть 1-10% записей для которых операции отсутствуют. То ли не создаются, то ли удаляются - т.е. такое ощущение, что сначала отрабатывает AfterPost датасета - создает операции, а потом отрабатывает триггер (из-за каких-нибудь гипотетических тормозов сервера) - удаляет операции.
Нагрузка на сервер маленькая, если не минимальная.

Вопросы:
1) Возможна ли ситуация когда триггер After Update отрабатывает после AfterPost датасета?
2) если да, то есть ли еще варианты, как это решить, кроме как создавать доп. поля в задаче для записи ИД созданных операций или обновления\удаления записей по ним

Нравится

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

Там еще такой важный момент был, что задачу мог изменять, например, директор и тогда операции создавались от его имени и с урезанными для менеджеров правами - в результате чего менеджеры их не видели и у них создавались дубликаты этих операций. Именно поэтому я перенес логику на БД

1. Такого быть не может. Скорее всего ошибка в самом триггере (в запросе на удаление). По умолчанию триггер работает в рамках одной транзакции, т.е. или он отрабатывает полностью или не отрабатывает вообще (вываливается с ошибкой). Смотрите в тело триггера.

"Евгений Либин" написал:триггер работает в рамках одной транзакции

да, действительно, что это я :lol:

однако в триггере "ничего такого":

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER TRIGGER [dbo].[tr_tbl_Task_AU] ON  [dbo].[tbl_Task] 
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
declare @TaskID uniqueidentifier
select @TaskID = [INSERTED].[ID]
from [INSERTED]
 
DELETE FROM [dbo].[tbl_Cashflow]
WHERE([tbl_Cashflow].[TaskID] = @TaskID AND
	[tbl_Cashflow].[AutoCreated] = 1)
 
END

в карточке редактирования тоже все предельно просто:

function dlDataOnDatasetAfterPost(Dataset) {
	CopyContactInTasksIfNeed(Dataset);
	//ProcessSendMailMessageForTask(Dataset); //отключено
	CreateContactsInTask(Self, Dataset);
 
	CreateCashflowByTask(dlData.Dataset); // вот это
}

Не знаю, почему там используется даталинк - наверно, просто как следствие копипаста). Вряд ли это могло вызвать эту проблему, исправил.

в самой функции, если убрать все лишнее и заполнение значений тоже все довольно просто:

function CreateCashflowByTask(TaskDataset) {  // на апдейт задачи стоит tr_tbl_Task_AU (удаляет старые операции)
	var TaskCode = GetTaskTypeCodeByID(TaskDataset.ValAsGUID('TypeID'));
	var CashflowDataset = Services.GetNewItemByUSI('ds_Cashflow'); // сюда наверно лучше поставить GetSingleItemByCode()
 
	CashflowDataset.DataFields.ItemsByName('DebtorCreditorID').IsRequired = false;
	CashflowDataset.Append();
	FillCashFlowDatasetValuesByTask(CashflowDataset, TaskDataset, false, TaskCode);
 
	CashflowDataset.Post();
	CashflowDataset.Close();
}

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

А что внутри FillCashFlowDatasetValuesByTask?
Похоже что туда надо смотреть, т.е. триггер отработал а FillCashFlowDatasetValuesByTask нет.

если прочитаете, то вот ))
если коротко - там просто заполняются значения, все действия происходят вне функции

function FillCashFlowDatasetValuesByTask(CashflowDataset, TaskDataset, HeadPhones, TaskCode) {
	var ClauseID = GetCashflowClauseIDByCode(TaskCode);
	var ExpenseTypeID;
	if ((TaskCode == 'Bus') /*&& IsEmptyGUID(TaskDataset.ValAsGUID('OpportunityID'))*/) {
		ExpenseTypeID = GetCashflowExpenseTypeIDByCode(TaskCode);
	} else 
	/*if (TaskDataset.ValAsBool('OrderByGuide')){
		ExpenseTypeID = GetCashflowExpenseTypeIDByCode('drugoe');
	} else*/ {
		ExpenseTypeID = GetCashflowExpenseTypeIDByCode('Tour');
	}
	if (TaskDataset.ValAsBool('IsCash') || TaskCode == 'Bus' || HeadPhones) {
		CashflowDataset.ValAsGUID('CashAccountID') = '{4FAFDE39-D5EB-4309-BAFD-9C3DA1FCF0EB}'; // наличная касса
	} else {
		CashflowDataset.ValAsGUID('CashAccountID') = '{ADEC1E41-17EE-4B02-B04E-D677DEA48D39}'; // расчетный счет
	}
 
	if (TaskDataset.ValAsGUID('OpportunityID')) {
		CashflowDataset.ValAsGUID('OpportunityID') = TaskDataset.ValAsGUID('OpportunityID');
	}CashflowDataset.ValAsGUID('StatusID') = '{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}'; // выполнена
	if (!HeadPhones) {
		CashflowDataset.ValAsStr('Subject') = TaskDataset.ValAsStr('Title');
	} else {
		CashflowDataset.ValAsStr('Subject') = TaskDataset.ValAsStr('Title') + ' наушники';
	}
	//var IsTop = GetIsUserInGroup(Connector.CurrentUser.Name, 'УЧРЕДИТЕЛИ');
	CashflowDataset.ValAsBool('UseAsCashflow') = false;
	CashflowDataset.ValAsBool('UseAsPandL') = true;
	CashflowDataset.ValAsBool('AutoCreated') = true;
	CashflowDataset.ValAsBool('ForFlow') = true;
	CashflowDataset.ValAsGUID('ClauseID') = ClauseID;
	CashflowDataset.ValAsGUID('ExpenseTypeID') = ExpenseTypeID; // группы
	CashflowDataset.ValAsGUID('CurrencyID') = TaskDataset.ValAsGUID('CurrencyID');
	if (!HeadPhones) {
		CashflowDataset.ValAsFloat('Amount') = TaskDataset.ValAsFloat('FullAmount');
	} else {
		CashflowDataset.ValAsFloat('Amount') = TaskDataset.ValAsFloat('HeadphonesAmount');
	}
	CashflowDataset.ValAsGUID('PayerID') = Connector.CurrentUser.AccountID;
	CashflowDataset.ValAsFloat('AutocalcAmount') = true;
	if (!HeadPhones) {
		CashflowDataset.Values('RecipientID') //= CashflowDataset.Values('DebtorCreditorID') 
			= TaskDataset.Values('SupplierID');
	} else {
		CashflowDataset.Values('RecipientID') //= CashflowDataset.Values('DebtorCreditorID') 
			= TaskDataset.Values('Supplier2ID');
	}
	//SetBasicPriceInDataset(CashflowDataset, 'BasicAmount', 'Amount', 'CurrencyID', 'CurrencyRate');		
	CashflowDataset.ValAsGUID('TaskID') = TaskDataset.ValAsGUID('ID');
	CashflowDataset.DisableEvents();
	CashflowDataset.ValAsDateTime('ActualDate') = CashflowDataset.ValAsDateTime('EstimatedDate') = TaskDataset.ValAsDateTime('StartDate');
	CashflowDataset.EnableEvents();
	return CashflowDataset;
}

на всякий случай вот полный текст функций
createcashflowbytask.txt

На первый взгляд всё ОК.
Проверьте 2 пункта
1. Посмотрите напрямую из базы

 Select * from tbl_CashFlow Where TaskID = 'Нужный ID задачи'

2. Если вышеуказанный запрос вернет данные, то посмотрите на sq_CashFlow возможно где-то inner join или в where доп. условия.

"Евгений Либин" написал:Проверьте 2 пункта

1. нет
2. нет(

А где CashflowDataset.Open(); ?

"Евгений Либин" написал:А где CashflowDataset.Open(); ?

мне его читать не надо - есть только Append() в CreateCashflowByTask
"SQK" написал:Если набор данных не находится в состоянии добавления записи (значение свойства IDataset::State не равно "dstInsert"), и у текущего пользователя есть права на добавление записи (значение свойства IDataset::CanInsert равно "True"), то вызывает событие IDatasetEvents::OnDatasetBeforeAppend. Иначе метод завершает работу.

Я бы рекомендовал всегда перед добавление делать открытие датасета, тем более есть такая строка

CashflowDataset.DataFields.ItemsByName('DebtorCreditorID').IsRequired = false;

.
Для ускорения можно делать фильтр по любому левому ID

ApplyDatasetFilter(CashflowDataset, 'ID', GUID_NULL, true);

Обращения по ID моментальное, набор данных будет пустой и датасет будет проинициализирован.

Спасибо, Евгений, воспользуюсь Вашими советами, хотя и не понимаю, для чего мне открывать датасет (на Before\After Open ничего нет)

Тут смысл не в отработке событий, а в инициализации самого датасета.

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

"Андрей Каспаревич" написал:Помогли ли советы Евгения по открытию DataSet'а?

Пока не знаю. Я дописал открытие с фильтрацией. Через какое-то время посмотрим, будет ли повторяться ситуация.

"Андрей Каспаревич" написал:операции создаются, но не привязываются к записям

почему? Не вижу причин, почему ИД задач и продаж могли бы не подставляться в скрипте. Кроме того я бы видел разницу между результатами запросов в SQL и в Террасофт

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

Так и сделал))

Через 2 недели - месяц отпишусь, что все ок, либо раньше - что нет

А делать DELETE FROM [dbo].[tbl_Cashflow] можно под всеми пользователями?

"Борисов Михаил Евгеньевич" написал:

А делать DELETE FROM [dbo].[tbl_Cashflow] можно под всеми пользователями?


триггеру можно)

"Андросов Дмитрий" написал:
Борисов Михаил Евгеньевич пишет:

А делать DELETE FROM [dbo].[tbl_Cashflow] можно под всеми пользователями?

триггеру можно)


Не понял, как? Тригер срабатывает в рамках транзакции где пошел update. Он будет обращаться к таблицам от имени того пользователя от которого пошел update.

"Борисов Михаил Евгеньевич" написал:Он будет обращаться к таблицам от имени того пользователя от которого пошел update

вот только пользователи работают с представлениями (и их триггерами), а я сделал на таблицу

"Андросов Дмитрий" написал:
Борисов Михаил Евгеньевич пишет:

Он будет обращаться к таблицам от имени того пользователя от которого пошел update

вот только пользователи работают с представлениями (и их триггерами), а я сделал на таблицу


У меня только один вопрос: от имени какого пользователя открыта транзакция в тригере таблицы? Что возращает suser_name(): supervisor, vasay или еще что то? Я подозреваю, что vasay и прав у него ровно столько сколько дали через grant.

На сколько я понял - проблем с удалением записей нет. Вопрос только с созданием новых. Если речь идет о контексте выполнения триггера, то нужно для начала уточнить версию СУБД. Разные СУБД и даже разные версии СУБД по разному используют (не используют) контекст.

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

зато заглавный вопрос прояснил :wink:

Показать все комментарии
Технические вопросы
5.x

Есть ли у БП, созданного в конфигурации журналирование, по аналогии с БП созданным в разделе, чем они отличаются, и можно ли переннести БП из конфигурации в данный раздел

Нравится

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

Здравствуйте, Ольга!
Процессы, созданные из раздела "Конфигурация" отличаются от созданных из раздела "Дизайн процессов" только свойством "Тег".
У БП из раздела "Дизайн процессов" это свойство имеет значение "Business Process" и такие процессы имеют журналирование и отображаются в разделе "Дизайн процессов":

У других БП это свойство не заполнено, и они считаются служебными, но его можно заполнить и они появятся в разделе "Дизайн процессов".

Показать все комментарии
Технические вопросы
Разработка

Здравствуйте. Имеется поле, в него вводится лот товара, после проверки он попадает в грид, который отображает корзину клиента. Необходимо сделать так, чтобы если цена лота составляет "0" руб, он не добавлялся. Функция проверки на данный момент:

function btnAddPartTableOnClick(Control) {
        Control.IsEnabled = false;
        try{
                var SaveResult = DoSaveEditDatasetByChildGrid(BaseDBEdit, Self, null, SaveChanges);
                Self.BringToFront();
                if (SaveResult) {
                        AddToPartable();
                }
        } finally {
                Control.IsEnabled = true;
        }      
}

Цена хранится в датасете ds_Orders, целочисленном поле TotalAmount. Я понимаю, что нужно изменить условие примерно так if(SaveResult && "Цена" !== 0), но как обратиться к значению датасета с нужным условием по синтаксису - в этом мой вопрос.
На всякий случай, ещё функция, малоли нужна будет.

function DoSaveEditDatasetByChildGrid(BaseDBEdit, EditWindow, GridWindow, SaveChangeFunc) {
        var Dataset = BaseDBEdit.Dataset;
        if(Dataset.State == dstInsert){
                if (System.MessageDialog(RecordMustBeSavedBeforeContinueSave,
                        mdtWarning,     (mdbYes + mdbNo), 0) != wmrYes) {
                        EditWindow.BringToFront();
                        return false;
                }
                var Data = {};
                var Succesfull = true;
                EditWindow.Notify(GridWindow, 'CHECK_DATA', Data);
                if (Data.Result == undefined){
                        if (!CheckSetRequiredField(Dataset)) {
                                MessageBox('Необходимо заполнить обязательные поля');
                                Succesfull = false;                            
                        }
                } else if (!Data.Result){
                        Succesfull = false;                            
                        EditWindow.BringToFront();
                        return false;
                }
                if (!Succesfull){
                        EditWindow.BringToFront();
                        return false;
                }              
                SaveChangeFunc(BaseDBEdit, EditWindow);
                Dataset.Edit();
                SendNotify(EditWindow, MSG_OK);
        }
        if (GridWindow) {
                GridWindow.Notify(EditWindow, MSG_SAVED, null);
        }
        return true;
}

Нравится

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

"Нестеров Артем Валерьевич" написал:но как обратиться к значению датасета с нужным условием по синтаксису - в этом мой вопрос.

Ваш вопрос не понятен.
Напишу так как понял, может верно, может нет, тогда давайте больше объяснений.
Чтобы обратится к датасету карточки, нужно посмотреть, как он у вас в ней называется в невизуальных параметрах (у меня на картинке это dlData, скорее всего и у вас)

Обращаемся к нему, и вытаскиваем поле, которое связывает ваш датасет с ds_Order (наверное OrderID)
тогда обращаться к цене примерно так:

var OrderID = dlData.Dataset('OrderID');
var TotalAmount = GetDatasetFieldValueByID('ds_Order', OrderID, 'TotalAmount');

Не забудьте подключить скрипт scr_DB

"Сазанов Александр Владимирович" написал:Нестеров Артем Валерьевич пишет:

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

Ваш вопрос не понятен.
Напишу так как понял, может верно, может нет, тогда давайте больше объяснений.
Чтобы обратится к датасету карточки, нужно посмотреть, как он у вас в ней называется в невизуальных параметрах (у меня на картинке это dlData, скорее всего и у вас)

Обращаемся к нему, и вытаскиваем поле, которое связывает ваш датасет с ds_Order (наверное OrderID)
тогда обращаться к цене примерно так:

var OrderID = dlData.Dataset('OrderID');
var TotalAmount = GetDatasetFieldValueByID('ds_Order', OrderID, 'TotalAmount');
Не забудьте подключить скрипт scr_DB

Так более ясно?

Добавление лота в корзину происходит на AddToPartable();?
Раз там вы добавляете, то там должна быть прямая связь с датасетом, а проверку на цену там не выполнить?

Здравствуйте, Артем!
Александр прав, в данном случае можно воспользоваться функцией

GetDatasetFieldValueByID(DatasetUSI, IDValue, FieldName)

DatasetUSI - название DataSet`a ('ds_Orders');
IDValue - ID лота (можно получить, зная номер);
FieldName - имя поля ('TotalAmount').
Функция вернет значение поля FieldName.

Андрей, Артем хотел сделать проверку на той же строке, что и

if (SaveResult) 

что, наверное, возможно, но лучше не пытаться.
Артем, в итоге я предлагаю выполнить проверку на цену не тут, а именно там где у вас стоит Append() Post() (или какая-то функция добавления), куда вы передаете параметры лота (его ID или сразу цену, не знаю как там у вас)
Если цена, то пишите условие, если ID, то функцию как получить цену по известному ID выше.

Большое спасибо за идеи, направившие в правильном направлении! Задача решена немного другим способом, относительно моего кода.

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

Где осуществляется привязка процесса к объекту, чтобы можно было выбрать процесс из меню.
Хочется сделать также как например в карточке контрагента происходит вызов процесса импорта при нажатии на "Импортировать контрагенты"

Нравится

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

Ольга, для решения задачи Вам нужно создать действие. Для этого в разделе перейти в режим настройки, вызвать пункт контекстного меню "Настроить":

/system/files/18-10-2013_14-23-43.png

Добавить новое действие (логика работы действия определяется БП):

/system/files/18-10-2013_14-23-59.png

В разделе теперь действие отображается, а в карточке аналогичная кнопка не появилась

Ольга, чтобы действие отобразилось в карточке нужно очистить Redis и кеш браузера.

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