Добрый день!

Суть такова. В системе есть справочник в который занесены номера недель и соответствующие им календарные даты. (Например: Номер недели: 3; Дата: 14.01.2019 - 18.01.2019). 



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

Нравится

6 комментариев
Лучший ответ

Возможность есть 

1 БП запускайте по расписанию

2 С помощью элемента формула можно получить номер текущей неделе дальше обновить или что вам нужно сделать с этой записью

По работе в формуле с датами более подробно смотри тут

Возможность есть 

1 БП запускайте по расписанию

2 С помощью элемента формула можно получить номер текущей неделе дальше обновить или что вам нужно сделать с этой записью

По работе в формуле с датами более подробно смотри тут

Накидал на C# скрипт, который выдает список с данными (неделя, начало, конец, год). осталось вызывать раз в год

var data = WeekWorker.GetYearWeekData(2019);

и данные парсить в справочник

using System;
using System.Collections.Generic;
using System.Globalization;
 
namespace TestApp
{
    public class WeekData
    {
        public int year { get; set; }
        public int week { get; set; }
        public DateTime weekStart { get; set; }
        public DateTime weekEnd { get; set; }
    }
 
    public class WeekWorker
    {
        public static List<WeekData> GetYearWeekData(int year)
        {
            var weeksdata = new List<WeekData>();
 
            int weeks = GetWeeksInYear(year);
            for (int i = 1; i <= weeks; i++)
            {
                var firstDay = FirstDateOfWeekISO8601(year, i);
                var lastDay = firstDay.AddDays(6);
 
                weeksdata.Add(new WeekData() { year = year, week = i, weekStart = firstDay, weekEnd = lastDay });
            }
 
            return weeksdata;
        }
        public static int GetWeeksInYear(int year)
        {
            DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
            DateTime date1 = new DateTime(year, 12, 31);
            Calendar cal = dfi.Calendar;
            int weeks = cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
            return weeks;
        }
 
        public static DateTime FirstDateOfWeekISO8601(int year, int weekOfYear)
        {
            DateTime jan1 = new DateTime(year, 1, 1);
            int daysOffset = DayOfWeek.Thursday - jan1.DayOfWeek;
 
            // Use first Thursday in January to get first week of the year as
            // it will never be in Week 52/53
            DateTime firstThursday = jan1.AddDays(daysOffset);
            var cal = CultureInfo.CurrentCulture.Calendar;
            int firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
 
            var weekNum = weekOfYear;
            // As we're adding days to a date in Week 1,
            // we need to subtract 1 in order to get the right date for week #1
            if (firstWeek == 1)
            {
                weekNum -= 1;
            }
 
            // Using the first Thursday as starting week ensures that we are starting in the right year
            // then we add number of weeks multiplied with days
            var result = firstThursday.AddDays(weekNum * 7);
 
            // Subtract 3 days from Thursday to get Monday, which is the first weekday in ISO8601
            return result.AddDays(-3);
        }
    }
 
}

 

Григорий Чех пишет:

Возможность есть 

1 БП запускайте по расписанию

2 С помощью элемента формула можно получить номер текущей неделе дальше обновить или что вам нужно сделать с этой записью

По работе в формуле с датами более подробно смотри тут

Расскажите, пожалуйста, подробнее про то как построить такой БП, а то я не понимаю какие элементы там должны присутствовать.

Все доступные в дизайнере элементы процесса описаны в руководстве.

Если Вы хотите заказать разработку такой логики полностью «под ключ», лучше будет заказать её у одной из компаний, зарегистрированных в маркете в каталоге услуг

Добавить комментарий

Зверев Александр пишет:

Все доступные в дизайнере элементы процесса описаны в руководстве.

Если Вы хотите заказать разработку такой логики полностью «под ключ», лучше будет заказать её у одной из компаний, зарегистрированных в маркете в каталоге услуг

Мало ли кто-то из комьюнити уже реализовывал схожий процесс и поделится опытом на безвозмездной основе. За деньги вообще, мне кажется, все связанное с CRM можно решить.

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

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

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

Добрый день. Я меня в каждой карточке прописаны (а кое-где так и было в системе изначально) действия по автоматическому заполнению других полей при изменении связей. Это происходит для любого датасета ХХХ на событие OnDatasetDataChange в функциях SelfOnDatasetDataChange скрипта ds_ХХХScript. Все хорошо и правильно работает, скорость заполнения карточек возрастает в несколько раз.
Но есть проблема. Скрипт не отрабатывает, если создавать новые записи в деталях. Работает какой-то другой скрипт, который только заполняет одно поле, по которому деталь привязана к разделу. И все.
Те есть я например создаю Операцию из раздела Продажи, то поле Продажа будет заполнено автоматически, а другие поля, которые должны заполняться в этой связи (допустим Клиент, Воздействие) останутся пустыми. При этом как бы получается, что заполнение поля Продажа не есть в этом случае событие OnDatasetDataChange.

Какой скрипт работает при создании карточки в детали? Как после заполнения связи "заставить" систему считать это изменением Dataseta?

Нравится

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

Здравствутйе, Виктория!
Для деталей обычно используются другие датасеты, не те, что в разделах:

Думаю, все дело в этом.

Но такие дополнительные датасеты есть не для всех деталей. Кроме того, в них нет ничего, кроме только ID самой связи, это не полноценный набор данных. И скриптов к таким датасетам нет, хотя бы те, которые отвечают за заполнение этой одной связи в созданной карточке. Где происходит это заполнение?
При этом , например, заполнение значений по умолчанию работает корректно. И в создаваемых карточках эти поля заполнены верно.

"Тихенко Виктория" написал:Где происходит это заполнение?

В функции AppendRecord скрипта scr_BaseDBEditUtils заполняется ссылка на раздел (там, где BaseDBEdit.ParentItemID) и значения по умолчанию:

function AppendRecord(BaseDBEdit, Window) {
	var Dataset = BaseDBEdit.Dataset;
	var Attributes = Window.Attributes;
	var DoDisableEvents = !Attributes('DoNotDisableEvents');
	BaseDBEdit.RecordID = Connector.GenGUID();
	Dataset.DisableGettingDisplayValues();
	try {
	Dataset.Append();
	if (DoDisableEvents) {
		Dataset.DisableEvents();
	}
	try {
		Dataset.ValAsGUID('ID') = BaseDBEdit.RecordID;
		Window.Attributes('RecordID') = BaseDBEdit.RecordID;
		if ((!IsEmptyValue(BaseDBEdit.ParentItemID)) &&
			(!IsEmptyValue(BaseDBEdit.ParentItemFieldName))) {
			var DataField = Dataset.DataFields(BaseDBEdit.ParentItemFieldName);
			if (Assigned(DataField)) {
				DataField.Value = BaseDBEdit.ParentItemID;
			}
		}
		SetDefaultValues(BaseDBEdit);
		Window.Attributes('IsNewRecordAppend') = true;
	} finally {
		if (DoDisableEvents) {
			Dataset.EnableEvents();
		}
	}
	} finally {
		Dataset.EnableGettingDisplayValues();
	}
	if (!Attributes('DontSetWindowCaption')) {
		SetEditWindowCaption(BaseDBEdit, Window);
	}
}

Эта функция срабатывает при отытии любой карточки с новой записью.

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

Чтобы их оставить включенными, надо в GridArea вашей детали сделать свой обработчик кнопки «Добавить» аналогично, например, wnd_ContractsDetailGridAreaScript. Примерно так:

function btnAddOnClick(Control) {
	var Attributes = GetNewDictionary();
	Attributes('DoNotDisableEvents') = true;
	AddGridAreaData(Self, Self, BaseGridArea, Attributes);
}

Если в большинстве случаев , в деталях идет ссылка на на специально созданное DetailGridArea для отражения связанных данных, а на основное (например сразу на wnd_OpportunitiesGridArea), то там тоже можно так прописать?
или это повлечет какие-то неприятные последствия в разделе (в данном случае в разделеOpportunity)?

Лучше добавить проверку.
Вроде такого, тут проверяется на деталь в конкретном разделе:

function btnAddOnClick(Control) {
	if (IsWindowProjectDetaill(Self)) {
		var Attributes = GetNewDictionary();
		Attributes('DoNotDisableEvents') = true;
		AddGridAreaData(Self, Self, BaseGridArea, Attributes);
	} else {
		scr_BaseGridArea.btnAddOnClick(Control);
	}
}
 
 
function IsWindowProjectDetail(Window) {
	try {
		var Result =
			Window.ParentContainer.ParentWindow.Name == 'wnd_ProjectWorkspace';
		return Result;
	} catch (E){
		return false;
	}
}

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

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

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

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

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

Задача:
При изменении статуса (с Open на Closed) если возможный Результат задачи только один, автоматически заполнять поле Результат задачи.
Как все работает без доработки:
scr1

Вносим изменения:
1.scr_TaskEdit:

function wnd_TaskEditOnPrepare(Window) {
        Initialize(Window);
       
        //24.10
        var AllowedResultIDs = GetAttribute(Self, 'AllowedResultIDs'); 
        dlData.Dataset.Attributes('AllowedResultIDs') = AllowedResultIDs;
        //24.10
....
}

2.ds_TaskScript
function UpdateDataByStatusID(Dataset) {
....
       
        //24.10
        var StatusID = Dataset('StatusID');
        var TaskTypeID = Dataset('TypeID');
        var ResultDataset = Services.GetNewItemByUSI('ds_TaskResult');
       
        ApplyDatasetFilter(ResultDataset, 'TaskTypeID', TaskTypeID, true);
        ApplyDatasetFilter(ResultDataset, 'StatusID', StatusID, true);
        var AllowedResultIDs = Dataset.Attributes('AllowedResultIDs');//GetAttribute(Self, 'AllowedResultIDs');
        var IsResultIDsFilterEnabled = Assigned(AllowedResultIDs);
        ApplyDatasetIncludeFilter(ResultDataset, 'IncludeID',
        AllowedResultIDs, IsResultIDsFilterEnabled);
        ResultDataset.Open();
        if (ResultDataset.RecordsCount == 1)
                Dataset('ResultID') = ResultDataset('ID');
//24.10
}

Нравится

Поделиться

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

Не нашел у себя функции UpdateDataByStatusID(Dataset)

Скрипт ds_TaskScript версии 3.3.2.197 XRM, а у вас какая версия?
UpdateDataByStatusID(Dataset) происходит по событию DataChage датасета ds_Task. Найдите аналог в Вашей версии.

В новой версии ф-ия наз. UpdateControlsAndDataByStatusID

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