Задача:
При изменении статуса (с 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

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

Исходные данные:
Есть два справочника обычных справочника:
tbl_TypeContact с полями ID, Name, Description
tbl_TableCategory с полями ID, Name, Description

В таблицу целевой аудитории (ЦА) и в окно редактирования ЦА добавил тип и категорию ЦА.

Задача: для каждого воздействия создавать свой ЦА. Для этого необходимо окно редактирования связанного списка, как реализовано Opportunities\Dictionaries\Stages\wnd_StageDictionary (Стадии продаж по типам). А так же необходимо в форме редактирования ЦА из выпадающих списков типов ЦА и категорий ЦА отображать только те, которые соответствуют данному воздействию.

Окно, которое надо реализовать состоит из трех вложенных окошек:
1. верхнее - список воздействий. Здесь можно использовать не редактируемый список.
2. слева внизу - типы ЦА, соответствующие этому воздействию. Возможность добавлять и удалять из списка.
3. справа внизу - категории ЦА, соответствующие этому воздействию. Возможность добавлять и удалять из списка.
При выборе воздействия в списке воздействий в списках типов и категорий отображаются только те строки, которые соответствуют этому воздействию.

Смотрел реализацию wnd_StageDictionary. Пробовал воспроизвести для моей ситуации. Не выходит. Не нашел готовой инструкции по созданию связанных справочников.

Подскажите пожалуйста шаги по реализации моей задачи.

Нравится

Поделиться

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

для связи воздействия, типа и категории ЦА создал таблицу
tbl_TableTypeCategory с полями ID, TypeContactID, CategoryContactID, CampaignID

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

Доброго времени суток, коллеги!

Возникла недавно задача, добавить новый справочник в раздел "Задачи", именуемый как "Причины неудач", по аналогии как это сделано со справочником "Результаты задач": Причины неудач должны быть зависимы от типов задач.

Первым делом создал новый справочник: "Причины неудач". Его сервисы создались мастером автоматически:

  • Tasks\Dictionaries\TaskFail\ds_TaskFail
  • Tasks\Dictionaries\TaskFail\sq_TaskFail
  • Tasks\Dictionaries\TaskFail\tbl_TaskFail

Далее будьте внимательны! Необходимо очень тщательно проверить все события, функции и их вызовы в следующих вновь созданных сервисах:

  • Tasks\Dictionaries\TaskFail\wnd_TaskFailDictionary
  • Tasks\Dictionaries\TaskFail\wnd_TaskFailDictionaryScript
  • Tasks\Dictionaries\TaskFail\wnd_TaskFailGridArea
  • Tasks\Dictionaries\TaskFail\wnd_TaskFailGridAreaScript

Также пришлось несколько доработать базовые сервисы:
Tasks\Dictionaries\TypeStatus\wnd_TypeStatusGridAreaScript – изменения в

function Initialize(Window)

function Initialize(Window) {
        if (Assigned(Window.ParentContainer)) {
                var ParentDictionaryWindow = Window.ParentContainer.ParentWindow;
                if (ParentDictionaryWindow.Name == 'wnd_TaskFailDictionary') {
                        SetAttribute(Window, 'ParentItemFieldName', 'FailID');
                } else
                if (ParentDictionaryWindow.Name == 'wnd_TaskResultDictionary') {
                        SetAttribute(Window, 'ParentItemFieldName', 'ResultID');
                }
        }
        SetAttribute(Window, 'EditWindowUSI', 'wnd_TypeStatusEdit');
}

добавлено поле FailID в сервисы:

  • Tasks\Dictionaries\TypeStatus\tbl_TypeStatus
  • Tasks\Dictionaries\TypeStatus\ds_TypeStatus
  • Tasks\Dictionaries\TypeStatus\sq_TypeStatus

в sq_TypeStatus также добавлен Параметр и Фильтр сравнения FailID.

После правильного применения всех изменений, в настройках справочников указываем окно реестра справочника "Причины неудач" как: Tasks\Dictionaries\TaskFail\wnd_TaskFailDictionary

Проверяем работу: TaskFail_3.png
taskfail_3.png

Сервисы и скриншоты также прилагаются.

Нравится

Поделиться

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

Эх, на пару дней бы раньше, а то мы велосипед изобретали :)

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

Добрый день.

Подскажите, как можно реализовать такую функциональность:

Я создал подраздел "Заметки", , который состоит из названия и текст заметки в формате RTF (отображается в виде RichDataControl)

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

Я подключил поле типа BLOB (RichDataControl). Если я ввожу ее в карточке, то работает ввод, но как это сделать в реестре - не могу найти. В самом реестре введенное значение сохраняется, но теряется после ввода.

Я сделал это через MemoControl - т.е запись в MemoControl.Value при событии DataGridOnSelectionChange в реестре и запись в Dataset при событии mmNoteBodyOnExit в MemoControl, такой подход работает. Но после замены MemoControl на RichDataControl запись в свойство Value выдает ошибку "Обьект не поддерживает это свойство или метод"

Прошу вашей помощи

Нравится

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

Дмитрий, почему не использовать для внесения и отображения текста заметок отдельный WindowContainer с окном wnd_Description (аналогично детали [Описание]). Во вложении прилагаю набор модифицированных сервисов. Ознакомьтесь с вариантом решения.

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

В карточке редактирования добавлено поле справочника и поле описаия значеия выбранного значения справочника. Но описание отображается только после сохранения данных в карточке.
Как заставить отображать систему отображать поля связанного справочника после выбора нового значения в карточке редактирования?

Нравится

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

Добрый день, Станислав!
Насколько мы поняли из предоставленного Вами описания проблемы: у Вас есть два поля, соответствующие двум связанным справочникам, в зависимости от выбранного значения в одном поле, значения другого варьируются и зависят от выбранного значения в первом справочнике.
Аналогичная функциональность реализована в карточке раздела "Задачи" (зависимость справочника "Результат" от справочника "Состояния"). Для реализации необходимой Вам функциональности Вы можете просмотреть реализацию стандартного функционала и сделать это по аналогии (сервис scr_TaskEdit). Для того, чтобы второй справочник открывался в карточке без пересохранения ее, Вам необходимо сперва объявить переменные, соответствующие ключам обоих справочников, а затем "наложить" фильтр. Как например, это реализовано в разделе задач:

function edtResultOnPrepareSelectWindow(LookupDataControl) {
var Dataset = dlData.Dataset;
var LookupDataset = LookupDataControl.DataField.LookupDataset;
var StatusID = Dataset.Values('StatusID');
var TaskTypeID = Dataset.Values('TypeID');
ApplyDatasetFilter(LookupDataset, 'TaskTypeID', TaskTypeID, true);
ApplyDatasetFilter(LookupDataset, 'StatusID', StatusID, true);
var AllowedResultIDs = GetAttribute(Self, 'AllowedResultIDs');
var IsResultIDsFilterEnabled = Assigned(AllowedResultIDs);
ApplyDatasetIncludeFilter(LookupDataset, 'IncludeID',
AllowedResultIDs, IsResultIDsFilterEnabled);
}

Желаем удачи!

Нет. Немного не то. Есть в карточке задачи, например, поле "Контрагент" и есть поле, которое отображает, например, численность из карточки контрагента (отображение, недоступное для изменения. Поле "Численность" взято только для примера). Так вот численность отобразится в карточке задачи только после сохранения самой карточки, а при создании новой карточки при выборе контрагента у меня отображается пустое поле "Численность". Как мне отобразить значение? Нужен общий подход без привязки к конкретному полю. При этом может быть ситуация, когда мне нужно отобразить значение из справочника более глубокого вложения, т.е.: в задаче есть контрагент, у котрагента есть ссылка на id определенного справочника, из этого справочника нужно отобразить определенное поле.

Попробую объяснить на примере который Вы привели.
Нужно на событие изменения поля "Контрагент" датасета карточки задачи, делать запрос на получение значения поля "Численность" из датасета контрагентов.
Затем это значение присваивать контролу в котором нужно отобразить значение.
Можно использовать функцию GetDatasetFieldValueByID(DatasetUSI, ID, FieldName) из scr_DB.
Код будет выглядеть примерно следующим образом.

...................
function dlDataOnDatasetDataChange(DataField) {
	if (!Assigned(DataField)) {
		return;
	}
	var DataFieldName = DataField.Name;
	var Dataset = DataField.ParentDataFields.ParentDataset;
	switch (DataFieldName){
		case ('AccountID'):
			edtQuantity.Value = GetDatasetFieldValueByID('ds_Account', DataField.Value, 'Quantity');
			break;
...............................
Показать все комментарии