Вопрос

Коллеги, добрый день.

Подскажите, пожалуйста, существует ли какое-нибудь описание как можно добавить деталь "Продукты в "?

Я сейчас пробую добавить такую деталь в Проекты, даже нашёл в пакете Project Объект ProjectProduct, но детали "Продукт в Проекте" нет. А если я её создаю на базе объекта ProjectProduct, то при попытке сохранить простую связь Проект - Продукт ловлю ошибку типа "Неизвестная колонка PriceListId". Нашёл, что эта ошибка идёт из "Базового вхождения продукта", но вот побороть её не получилось...

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

У меня такой же вопрос

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

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

Проблема в том, что поле PriceList добавляется в пакете ProductCatalogue, от которого не наследуется пакет Project, в котором создан объект ProjectProduct.

Решение: заместить объект ProjectProduct в пакете Custom. В результате колонка PriceList будет подтянута.

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

Добрый вечер.
Задача , которую сейчас решаю: необходимо сделать возможным автоматическую замену связей во вложенных элементах Проекта. Можно считать, что уровень вложенности работ в проект только 1. Т.е. у меня есть Проект, я захожу в него, заполняю поля Клиент, Контакт, Поставщик, Продажа. Потом, стоя на этом проекте, выбираю в меню действия созданное мной действие "Расставить связи в проекте".
После этого срабатывает скрипт:

function amiProcessRelationsOnExecute(ActionMenuItem, Sender) {
        var ProjectID = null;
        if (BaseWorkspace.GridDataset.IsActive) {
                ProjectID = BaseWorkspace.GridDataset.Values('ID');
        }      
        if (ProjectID) {
                ProcessRelations(ProjectID);           
                ShowInformationDialog("Расставлены связи во всех вложенных элементах");
        } else {
                ShowWarningDialog("Проект не выбран");
        }      

}

function ProcessRelations(ProjectID, ProjectDataset) {
        var Relations = new Object();
        Relations.Opportunity = new Object();
        Relations.ObjectOpportunity = new Object();
        Relations.Client = new Object();
        Relations.Contact = new Object();
        Relations.Supplier = new Object();

        if (!Assigned(ProjectDataset)) {
                ProjectDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
                ApplyDatasetFilter(ProjectDataset, 'ID', ProjectID, true);
                RefreshDataset(ProjectDataset);
        }      
   
        Relations.Opportunity = ProjectDataset.ValAsGUID('OpportunityID') ;
        Relations.ObjectOpportunity = ProjectDataset.ValAsGUID('object_projectID');
        Relations.Client = ProjectDataset.ValAsGUID('ClientID');
        Relations.Contact = ProjectDataset.ValAsGUID('ContactID');
        Relations.Supplier = ProjectDataset.ValAsGUID('SupplierID');
     
    ProjectDataset.DisableEvents();
   
        if (!Assigned(ChildDataset)) {
    var ChildDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
        ApplyDatasetFilter(ChildDataset, 'ParentID', ProjectID, true);

  }
   ChildDataset.Open();
   ChildDataset.Edit();
        try {
                while (!ChildDataset.IsEOF) {
        ChildDataset.Values('OpportunityID') = Relations.Opportunity;
        ChildDataset.Values('object_projectID') = Relations.ObjectOpportunity;
        ChildDataset.Values('ClientID') = Relations.Client;
        ChildDataset.Values('ContactID') = Relations.Contact;
        ChildDataset.Values('SupplierID') = Relations.Supplier;
           
                ChildDataset.Post();    
                ChildDataset.GotoNext();
                }
        } finally {
       
            ChildDataset.Close();
                ApplyDatasetFilter(ChildDataset, 'ParentID', null, false);
                ChildDataset.EnableEvents();   
        }
       
 
        return true;
}

У меня получается правильно определить все ID необходимых мне связей, скрипт завершается без ошибки, выдается сообщение, что связи успешно проставлены, но связи не расставляются.
Где же искать ошибку?

У меня такой же вопрос

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

Может я и глупость сморожу, но разве ChildDataset.Edit(); не должен стоять под while?
И зачем try? Наверное, из-за него и не выводит ошибку.

Убрала try, с замиранием сердца :smile: ожидала ошибку, но увы ее нет.

Ничего не написали про результат, видимо отрицательный.
А ChildDataset.Edit(); остался на своем месте? Задаю этот вопрос потому что в вашем случаи у меня выдавал ошибку если подчиненных несколько (либо вы его переставили, либо только один подчиненный)
Но и в том, и в другом случаи я не вижу причину почему не работает.
Наверное, надо пошагово через дебагер смотреть.

ChildDataset.Edit(); переставила.
И не ошибки, ни результата заполнения.

Пока думала над указанной выше задачей, написала функцию , которая в выбранном проекте расставляет крайние сроки во вложенных элементах. Надо было сделать так, чтобы к дате завершения каждой работы прибавлялся один день, и сохранятся в поле Крайний срок этой работы.
Так вот эта фукнция работает на ура!

function ProcessDeadline(ProjectID, ProjectDataset) {
 
    var ChildDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
	ApplyDatasetFilter(ChildDataset, 'ParentID', ProjectID, true);
 
   ChildDataset.Open();
 
	try {
		while (!ChildDataset.IsEOF) {
		ChildDataset.Edit();
		var DueDate = ChildDataset.DataFields.ItemsByName('EstimatedDueDate').ValAsDateTime;
		var NewDate= new Date(DueDate);
		var Deadline  = AddDateDays(NewDate, 1).getVarDate();
		ChildDataset.Values('Deadline') = Deadline;
		ChildDataset.Post(); 	
		ChildDataset.GotoNext();
		}
	} finally {
 
	    ChildDataset.Close();
		ApplyDatasetFilter(ChildDataset, 'ParentID', null, false);
		ChildDataset.EnableEvents();	
	}
 
 
	return true;
}

Повторюсь, не знаю причин, по которым не отрабатывается.
Можно упростить код и обойтись без этих посредников:

var Relations = new Object();
Relations.Opportunity = new Object();
Relations.ObjectOpportunity = new Object();
Relations.Client = new Object();
Relations.Contact = new Object();
Relations.Supplier = new Object();

И писать на прямую

ChildDataset.Values('OpportunityID') = ProjectDataset.Values('OpportunityID');
//и т.д.

Но опять же советую, пошагово в дебагере посмотреть, что происходит.

Так на мой взгляд будет дольше работать скрипт, особенно если там 25 работ вложенных.
Я бы хотела сначала из проекта получить все необходимые мне связи, а потом присваивать эти значения в необходимом месте.
У вас может и не отрабатываться, потому, что object_projectID это мое поле.

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

Виктория, в отладчике после строки

        ChildDataset.Values('OpportunityID') = Relations.Opportunity;

проверьте, что записано в ChildDataset.Values('OpportunityID').
Будет хотя бы ясно, где именно проблема.

Нашла в чем проблема. В отсутствии строки ApplyDatasetFilter(ProjectDataset, 'ID', null, false);

Окончательный вариант

function amiProcessRelationsOnExecute(ActionMenuItem, Sender) {
        var ProjectID = null;
        if (BaseWorkspace.GridDataset.IsActive) {
                ProjectID = BaseWorkspace.GridDataset.Values('ID');
        }      
        if (ProjectID) {
                ProcessRelations(ProjectID);           
                ShowInformationDialog("Расставлены связи во всех вложенных элементах");
        } else {
                ShowWarningDialog("Проект не выбран");
        }      
 
}
 
function ProcessRelations(ProjectID, ProjectDataset) {
        var Relations = new Object();
        Relations.Opportunity = new Object();
        Relations.ObjectOpportunity = new Object();
        Relations.Client = new Object();
        Relations.Contact = new Object();
        Relations.Supplier = new Object();
 
        if (!Assigned(ProjectDataset)) {
                ProjectDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
                ApplyDatasetFilter(ProjectDataset, 'ID', ProjectID, true);
                RefreshDataset(ProjectDataset);
        }      
 
        Relations.Opportunity = ProjectDataset.ValAsGUID('OpportunityID') ;
        Relations.ObjectOpportunity = ProjectDataset.ValAsGUID('object_projectID');
        Relations.Client = ProjectDataset.ValAsGUID('ClientID');
        Relations.Contact = ProjectDataset.ValAsGUID('ContactID');
        Relations.Supplier = ProjectDataset.ValAsGUID('SupplierID');
 
   ApplyDatasetFilter(ProjectDataset, 'ID', null, false);
 
        if (!Assigned(ChildDataset)) {
    var ChildDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
        ApplyDatasetFilter(ChildDataset, 'ParentID', ProjectID, true);
 
  }
   ChildDataset.Open();
 
        try {
                while (!ChildDataset.IsEOF) {
        ChildDataset.Edit();
        ChildDataset.Values('OpportunityID') = Relations.Opportunity;
        ChildDataset.Values('object_projectID') = Relations.ObjectOpportunity;
        ChildDataset.Values('ClientID') = Relations.Client;
        ChildDataset.Values('ContactID') = Relations.Contact;
        ChildDataset.Values('SupplierID') = Relations.Supplier;
 
                ChildDataset.Post();    
                ChildDataset.GotoNext();
                }
        } finally {
 
            ChildDataset.Close();
                ApplyDatasetFilter(ChildDataset, 'ParentID', null, false);
                ChildDataset.EnableEvents();   
        }
 
 
        return true;
}

Виктория, рад, что проблема решилась.

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

При открытии карточки проекта А выводятся данные предыдущего проекта Б, при том что заголовок пишется проекта А, а данные проекта Б.
После этого случая при открытии какого либо проекта выводятся данные прроекта Б. Помогает только выход из Террасофта. Может кто знает как с этим бороться?

У меня такой же вопрос

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

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

А что происходит, когда Вы редактируете карточку? Данные меняются в текущем проекте, чей заголовок отображается, или в предыдущем, данные которого подтягиваются?

Вероятнее всего, проблема в запросе sq_Project. Производилось ли редактирование запроса незадолго до того, как проблема впервые появилась?

Есть ли у Вас возможность предоставить скриншоты?

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

Давайте попробуем посмотреть, что у Вас в конфигурации. Пожалуйста, выгрузите сервисы раздела проект:
ds_Project
ds_ProjectScript
sq_Project
tbl_Project
wnd_ProjectEdit
wnd_ProjectEditScript
wnd_ProjectGridArea
wnd_ProjectGridAreaScript
wnd_ProjectWorkspace
scr_ProjectWorkspace

Здравствуйте, Сергей Юрьевич!

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

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

Здравствуйте, Анна.
А нельзя ли узнать (из целого множества) пару-тройку обнаруженных вами проблем.
И ответьте пожалуйста на такой вопрос - вы смогли воспроизвести данную ошибку открытия проекта?

Серьезной проблемой является организация данных. Не рекомендуется помещать такое количество полей в пределах одной карточки/окна, поскольку пользователь может держать в поле зрения не более 7-ми объектов одновременно.

В данном случае следует организовать бизнес-процесс с последовательным автоматизированным заполнением информации.

Также желательно устранить присвоение идентификаторов записей напрямую в коде. В сулчае, если это ID пользователей, рекомендую создать отдельное перечисление enm_, где все эти значения будут храниться в виде констант.

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

Причиной может быть отсутствие закрытия датасета dlData.Dataset.Close(). Обратите внимание, что при отключенных событиях датасета закрытие не происходит. Убедитесь, что перед закрытием датасета карточки Dataset.AreEventsEnabled == true;

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

Для небольшого, но интересного внедрения нужен программист. Что-то на Фрилансе найти программистов шарящих в Terraosft не удалось.

Подробности по электронной почте khoroshilovei@gmail.com

Поделиться

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

Так Вы же сами на фрилансе светитесь как разработчик flash/flex.

Т.е. получается субподряд?

PS
А по запросу Terrasoft поиск находит 12 человек.

Причем тут вообще flash/flex? Ищите информацию по логину kei_emp.
Никаких субподрядов.
Проект внедрения в садоводческое общество. На подходе еще несколько подобных проектов. Оплата поэтапная - по завершению каждого из этапов.

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

Коллеги!
Подскажите примерный код функции автоматического связывания элементов проекта (аналог кнопки установить связь между элементами проекта). При этом нужно автоматически пересчитать даты стадий и связанные с проектом задачи?
Возможно есть готовая функция или несколько функций для этого?
Заранее спасибо!

У меня такой же вопрос

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

Вот часть скрипта, которая выполняется по кнопке "Связать элементы" (обработчик действия amiConnectElementsOnExecute в скрипте wnd_ProjectGanttAreaScript):

	var SelectedIDsArray = GetSelectedItemsIDsArray();
	if (SelectedIDsArray.length == 0) {
		ShowWarningDialog("Элементы не выбраны");
		return;
	}
	ConnectProjectElementsArray(Self, SelectedIDsArray, AreaObject);
	RefreshDataset(dlData.Dataset);

Основная функция связки - ConnectProjectElementsArray, которая вызывает AddProjectDependence из скрипта scr_ProjectDependenceUtils.

Пересчёт элементов выполняется функцией DoElementCalculation скрипта scr_ProjectElementLibrary. Посмотрите её реализацию, а также реализацию функций DoChildElementsCalculation и DoParentElementCalculation.

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

Коллеги!

Хотим поделиться радостной новостью: в конкурсе на поставку CRM-системы для всеми любимой поисковой системы Яндекс победила компания Terrasoft. К участию в конкурсе были приглашены достойные «соперники» - Яндекс выбирал лучшее решение среди таких систем как Naumen CRM, CRM-система Microsoft, SAP, CRM-система Siebel, CRM-система SalesLogix и Terrasoft CRM.

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

Поздравляем команду Terrasoft со взятием очередной «вершины». Уверены, Яндекс сделал правильный выбор!:smile:

Поделиться

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

Возникла такая проблема при попытке выбора "проект/стадия/работа" в счете, договоре, операции возникает исключение: "несоответствие типа".
Версия: 3.3.2.116 XRM Professional Services + обновления сервисов для интеграции с 1С (131010)

У меня такой же вопрос

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

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

// wnd_ProjectDictionaryScript
 
function InitializeGridButtons() {
	var ProjectsfrmButtons = Projects.Window.ComponentsByName('frmButtons');
	ProjectsfrmButtons.IsVisible = Self.Attributes('ShowEditButtons'); // в этой стороке

Self.Attributes('ShowEditButtons') значение дебаггером посмотрите наверняка undefined или null попадает

Замените эту строчку на такую:

ProjectsfrmButtons.IsVisible = !!Self.Attributes('ShowEditButtons');
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!
Есть бизнес-процесс, который стартует в разделе "Проекты" по кнопке "Запустить процесс" следующим образом:

var Dataset = dlData.Dataset;
var ParamNames = new Array();
ParamNames[0] = 'OpportunityID';
var ParamValues = new Array();
ParamValues[0] = Dataset.Values('ID');
WFStartByID("{96A6BC55-B2F9-499C-A2E0-66FD2DF13B32}", ParamNames, ParamValues);

Запускается задача ( 1 шаг бизнес-процесса). Необходимо, чтобы в эту задачу ( только в эту) в качестве даты начала и даты завершения брались значения из специальных полей в проекте.
Подскажите, пожалуйста как можно это сделать ( пробовали передавать эти значения аналогично ParamNames[0] = 'OpportunityID' - не получилось)
Версия Террасофта 3.0.4.118 Х25

У меня такой же вопрос

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

Дарья, попробуйте передавать эти значения в параметры, как и OpportunityID (например, с названиями StartDate и DueDate), а при обработке события OnExecute элемента wa_TaskAction проверять название элемента и в зависимости от него устанавливать даты начала и завершения задач:

function wa_TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset,
		IsComplete, ResultLinkCodes) {
	.........
	var DefaultValues = GetNewDictionary();
	DefaultValues.Add('Title', ActionItem.Caption);
	DefaultValues.Add('WorkflowItemID', ItemID);
	if (ActionItem.Name == '<Название задачи - первого элемента БП>') {
		var Diagram = GetDiagramByItem(ActionItem);
		var ExecuteDate = WFGetParamValue(Diagram, 'StartDate');
		var DueDate = WFGetParamValue(Diagram, 'DueDate');
		DefaultValues.Add('StartDate', ExecuteDate);
		DefaultValues.Add('DueDate', DueDate);
	} else {
		var ExecuteDate = ItemDataset.ValAsDateTime('ExecuteDate');
		var ExecuteAfterTimeTypeID = 
			WFGetParamsMapItemValue(ActionItem, 'ExecuteAfterTimeTypeID');
		var ExecuteAfterTimeValue = 
			parseInt(WFGetParamsMapItemValue(ActionItem, 'ExecuteAfterTimeValue'));
		ExecuteDate = WFCalcExecuteTime(ExecuteDate, ExecuteAfterTimeTypeID, 
			ExecuteAfterTimeValue);
		ExecuteDate = ExecuteDate.getVarDate();
		DefaultValues.Add('StartDate', ExecuteDate);
		var ExecuteTimeTypeID = 
			WFGetParamsMapItemValue(ActionItem, 'ExecuteTimeTypeID');
		var ExecuteTimeValue = 
			parseInt(WFGetParamsMapItemValue(ActionItem, 'ExecuteTimeValue'));
		var DueDate = WFCalcExecuteTime(ExecuteDate, ExecuteTimeTypeID, 
			ExecuteTimeValue);
		DefaultValues.Add('DueDate', DueDate.getVarDate());
	}
	..........
}

Спасибо.
Скажите, пожалуйста, надо ли подключать дополнительные скрипты?
Сейчас возникает ошибка
на строчке var Diagram = GetDiagramByItem(ActionItem);
"Предполагается наличие объекта"

Должен быть подключен скрипт scr_WorkflowUtils.

Возможно, в версии 3.0.4 ещё не было этой функции. В этом случае Вы можете её добавить самостоятельно в скрипт scr_WorkflowUtils. Её текст такой:

function GetDiagramByItem(DiagramItem) {
	return DiagramItem.ParentItems.ParentDiagram;
}

Либо вместо вызова var Diagram = GetDiagramByItem(ActionItem); вставьте такую строчку:

var Diagram = ActionItem.ParentItems.ParentDiagram;
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Продолжая заниматься правами доступа в проекте (http://community.terrasoft.ua/forum/topic/4743) заметил следующее:

1. Если в проекте изменить права доступа (на детали Доступ), то права доступа меняются и у всех подчиненных элементов (Стадия, Работа). И это удобно.

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

У меня такой же вопрос

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

Владимир, спасибо за замечание.

Постараемся учесть его в следующих версиях продукта.

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

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

Иногда возникает необходимость возможности печати диаграммы Ганта из раздела [Проекты].
В прикреплённом файле находится полная инструкция по реализации данного функционала.

Приятной работы!

Поделиться

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

Круто!
И скриншот делать не надо :)

--
Cogito, ergo sum

А теперь расскажи как это все показать клиенту на презентации !!!

"Виталий Ковалишин aka samael" написал:И скриншот делать не надо :)

Да! Чтото мне это напомнило, про скриншот, не напомнишь? :)

Войдите или зарегистрируйтесь, чтобы комментировать