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

Есть свой раздел в ServiceDesk, который использует поле (IncidentID) стандартного модуля Инциденты.
Возможно, что этот кастомный раздел будет использоваться так же в CRM, где модуль Incidents отсутствует.
Подскажите, пожалуйста, где и как лучше отключать это поле при отсутствии модуля?

Нравится

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

Светлана, для того, чтобы отключить поле Вам необходимо:
1. убрать поле из сервиса карточки редактирования (wnd_хххEdit). Удалить соответствующую колонку из сервиса реестра записей (wnd_хххGridArea);
2. в сервисе набора данных (ds_ххх)отключить поле, сняв галочку возле его названия;
3. в запросе на выборку данных (sq_ххх)отключить колонку, сняв галочку возле ее названия.

Наталия, спасибо за ответ, но мне бы хотелось найти другое решение, желательно экранировать поле в коде.
Чтобы обойтись одной версией раздела, которая будет подходить и к ServiceDesk и в CRM.

Наверняка же такие способы есть.

Такие способы есть, однако они достаточно трудоемки, поскольку необходимо учитывать много особенностей.
Алгоритм примерно такой:
1. Задать системный параметр, в котором будет фиксироваться информация о наличии модуля "Инциденты".
2. В зависимости от значения системного параметра, при инициализации раздела, устанавливать свойства: для поля в карточке IsVisible = false, для поля в датасете IsEnabled = false, и тд.

Наталия, а подскажите пожалуйста раздел, на примере которого я могла бы этот способ посмотреть?

Светлана, в базовой версии отсутствует подобная реализация.
Задать системный параметр можно так: SystemParameterValue = System.SetSystemSettingValue(SystemParameterCode, SystemParameterValue);
Считать его: SystemParameterValue = System.GetSystemSettingValue(SystemParameterCode, False);

А в какой момент задается параметр?

"Светлана_" написал:Чтобы обойтись одной версией раздела, которая будет подходить и к ServiceDesk и в CRM.

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

"Глова Сергей" написал:Рекомендую отказаться от реализации, так как трудозатраты на реализацию будут неоправданными.

Спасибо, так и поступлю :)

Показать все комментарии
Установка и Администрирование
Разработка

Здравствуйте.У пользователя есть раздел продаж, где слева сделаны группы по продажам, фильтры и так далее.Директор высказал желание, чтобы такой же набор групп и фильтров отображался бы и у других пользователей.Как это можно реализовать?
Спасибо...

Нравится

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

Правая кнопка мыши на группе - пункт меню "Права доступа" - добавляете группу "Все пользователи" с правами на чтение

Показать все комментарии
Установка и Администрирование
Разработка

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

На картинке:создал новое поле profit$, но не могу обозначить его в customize columns.Как это сделать?

Спасибо!

Нравится

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

Здравствуйте, уважаемые участники Community!

Возникла следующая проблема в версии 3.2.1.54

В разделе OLAP после создания представления для OLAP-куба и его настройки невозможно к нему вернуться. Возникает parse error при попытке считать XML-данные из Blob-a настройки представления.

Скрипт scr_OLAPUtils, функция GetXMLDataByID(Window, ID)

строка

XMLStorage.LoadFromDataset(XMLDataset, 'XMLData');

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

Ну, и вопрос традиционный: что делать, как побороть ошибку? Боюсь, что само ядро делает что-то неправильное с XML в этот момент.

Очень рассчитываю на вашу помощь.

Нравится

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

Анатолий, судя по всему в XML файле указано что он UTF-8, но реально для UTF-8 у него не хватает двух начальных байт этого формата. Но это не главное. Если открыть этот файл в Chrome, например, то получаем "error on line 236 at column 32: invalid character in attribute value". И действительно, если туда посмотреть, то в этой позиции не все хорошо. Думаю что проблема кроется в сохранении. Скорее всего сказывается то, что UTF-8 при сохранении получился совсем не UTF-8

Анатолий, еще мысль. В узле View в атрибуте PivotData помещен XML. Это плохой знак. Я бы порекомендовал преобразовать значение атрибута в MIME, и положить его. При вычитке, конечно же, делать обратную операцию.

Спасибо, Сергей!
Эту задачу я пока не разрешил, но мыслю в том же направлении, пытаясь преобразовать сохраняемый XML, а потом перед чтением в XMLStorage преобразовать вновь к исходному виду. Если получится ликвидировать ошибку - будет, по крайней мере, частное решение; сейчас оно мне крайне важно. Дальше в спокойной обстановке можно будет проанализировать причины, отчего текст XML так искажается при сохранении.

Решение найдено!
Огромное спасибо всем, кто отозвался, и, главное, Александру Лучкиву! Средство очень простое: поставить OWC11 :smile:

Показать все комментарии
Установка и Администрирование
Разработка

Добрый день
Возник такой вопрос: в террасфоте есть воможность назначения дефолтных прав на например продажи или контакты.Как я понимаю их назначение разграничить доступ например чтобы другие пользователи, кроме самого создателя записи не могли бы стирать эту запись.Я проверил как это работает.Действительо запись другой пользователь стереть не может.Но если он сам же изменить права на доступ к этой записи то может удалить даже те которые созданы супервизором.В чем же тогда смысл этих прав?Спасибо...

Нравится

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

Запретите пользователю изменение прав доступа.

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

"Кулак Олег" написал:

а как запретить пользователю менять права?
"Раловец Ольга" написал:

А скажите пожалуйста как именно это надо настроить?
Спасибо

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

Нет я ошибся не настроилось.....(
Если я создаю запись,то я хочу чтобы другой не мог бы поменять сам права на нее на стирание и стереть...Покажите пожалуйста как это сделать?Спасибо!

"Раловец Ольга" написал:

Такой детали нету, где можно регулировать доступ...

Последняя колонка, на Вашем скрине, регулирует возможность изменения доступа

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

"Алекс Васильев Викторович" написал:Такой детали нету, где можно регулировать доступ...

Это и есть нужная деталь, просто выделите запись, нажмите на кнопки "Delete" и "Grant Access".

Я знал что где то там, получилось отлично.....
Спасибо!

Показать все комментарии
Установка и Администрирование
Разработка

Возник такой вопрос.
В разделе контакты например есть вкладка "my" где отображаются только мои контакты...Можно ли так же сделать с opprtunity?спасибо!

Нравится

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

Можно. Для этого необходимо создать фильтр в соответствующем сервисе запроса (sq_Opportunity). Все остальное по аналогии с разделом контакты (сервисы wnd_ContactGridArea и sq_Contact).

А можно ли подробную инструкцию как это можно сделать? Просто так в обзих чертах совершенно не понятно(
Спасибо.

Создаете в sq_Opportunity фильтр, по которому будут отбираться данные, далее идете в wnd_OpportunitiesGridArea и для элемента grdData создаете новое DataGridView. Указываете для него Caption и в свойстве FilterSetCode указываете название созданного a sq_Opportunity фильтра.

ХМ а как в sq_opportunity создать фильтр?

Необходимо создать новый элемент в блоке Where.

Показать все комментарии
Установка и Администрирование
Разработка

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

Нравится

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

Добавляете поля в сервис tbl_Opportunity, затем выносите его в sq_Opportunity, далее в ds_Opportunity, а после этого размещаете на карточке редактирования wnd_OpportunityEdit. В каждом сервисе, кроме sq_Opportunity, указываете тип данных поля целое число (integer) либо дробное (float).

Для добавления цифрового поля в карточку [Продажа]необходимо:
1. В сервис tbl_Opportunity добавить новое поле. Указать тип данных: целое число или дробное число.
2. В сервис sq_Opportunity добавить основную колонку. Выбрать поле, созданное в tbl_Opportunity на предыдущем шаге.
3. В сервис ds_Opportunity добавить целочисленное поле/поле с дробным значением. Указать колонку, добавленную на 2 шаге.
4. Открыть сервис карточки редактирования продажи - wnd_OpportunityEdit. Добавить IntegerDataControl/FloatDataControl. Заполнить свойства DatasetLink = dlData, DataFieldName = название добавленного Вами поля.

Все отлично получилось спасибо.....

Показать все комментарии
импорт в детали
импорт данных из Exсel
прайс-листы поставщиков
Интеграция и импорт данных
Разработка

Добрый день!
Необходимо импортировать прайс-листы поставщиков в деталь Поставщики карточек записей раздела Продукты.
Вроде все просто, но...
Добавляются (или обновляются) карточки Продуктов, Контрагенты и Валюты, а вот в детали записи никак не попадают (в процессе смены настроек единожды добавилась запись (хоть и не совсем корректно) для первого Продукта, а последующие игнорировались).
Что необходимо сделать для импорта записей именно в детали?

Нравится

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

Выполнить настройку импорта на детали отдельно.

еще бы понять какая таблица должна быть главной!
а то одни и те же закладки в разных местах системы называются по-разному.
при последней итерации удачно осуществился импорт "Импортируются данные в таблицу 'Цена продукта'..... Запись добавлена" - в системе этого найти не удалось....
пробовала и таблицу "Поставщики" (в Продуктах) использовать, которая в Контрагентах называется ""Продукты поставщика".... Вот нельзя их одинаково назвать?!

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

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

Спасибо, Александр - все получилось! :twisted:

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

Есть задача сделать предварительную фильтрацию для LookUpControl'а с MultiSelectWindow. Смысл в том чтоб получить список сотрудников, которые являются инициаторами(owner) по задачам. Подсмотрел подобную технологию в скрипте wnd_ReportFinanceResultScript(причем на датасете, который я использую для фильтрации списка пользователей отобранных в MultiSelectWindow такое включение фильтра IN работет). Написал собственный фильтр OwnerID(см.рисунок) в датасете ds_Contact(для фильтра типа Exists с кодом DocumentFilters) На событии OnPrepareSelectWindow окна пишу код:

var Dataset = dlContact.Dataset;//ds_Contact
var OurOrgn = 'E4FCB451-2010-49E7-8B8A-05AE2E350B9F';
//Получение коллекции фильтров запроса датасета(в данном случае ds_Contacts)
var Filters = Dataset.SelectQuery.Items(0).Filters;
//Получение коллекции фильтров для фильтра типа Exists в запросе датасета
var FiltersContacts =
Filters('DocumentFilters').TestExpression.ExpressionSelectQuery.Items(0).Filters;
// Фильтр по контактам собственного предприятия
// ApplyDatasetFilter(Dataset, 'AccountID', OurOrgn, true);
Dataset.FetchRecordsCount = -1;
// Включение фильтра по имени
Filters('DocumentFilters').IsEnabled = true;
//Отключение фильтра в запросе Exists, который включен по умолчанию
FiltersContacts('DocumentContactID').IsEnabled = false;
//Подключение фильра по "владельцу" задачи
FiltersContacts('OwnerID').IsEnabled = true;
//EnableDatasetFilters(Dataset, true, 'DocumentFilters');
//Dataset.SelectQuery.Items(0).Filters.ItemByCode('DocumentFilters').IsEnabled = true;
//var SelectQuery = Dataset.SelectQuery;
//EnableSelectQueryFilters(SelectQuery, true,'DocumentFilters');
SetControlAttribute(LookupControl, SelectWindow);              

Результат - ошибка отладчик показывает строку var FiltersContacts =
Filters('DocumentFilters').TestExpression.ExpressionSelectQuery.Items(0).Filters; - нулл или не является объектом
попытке обратиться прямо к фильтру в строке:
Filters('DocumentFilters').IsEnabled = true;

та же ошибка...
пробовал
Dataset.SelectQuery.Items(0).Filters.ItemByCode('DocumentFilters').IsEnabled = true;

тоже ошибка.
Попробовал включить в сервисе qs_Contact в фильтре DocumentFilters явно свой фильтр OwnerID и наложить функцией
EnableDatasetFilters(Dataset, true, 'DocumentFilters');
ошибки нет, НО фильтр не срабатывает.
Остановился на фильтрации списка по сотрудникам предприятия функцией

Нравится

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

ApplyDatasetFilter(Dataset, 'AccountID', OurOrgn, true);
Как вариант подходит, но хочется с проблемой разобраться...Помогите, кто чем может...мы сами не местные(с) :-)

Хм.. а попробуйте в дебагере найти свой фильтр путем просмотра
Filters.Items(n)

Такое впечатление, что просто неправильно написанное имя фильтра, хотя со скрином вроде как сходится ..

Для включения compare фильтра используйте ApplydatasetFilter(датасет, название_фильтра, значение, true)
При этом название_фильтра должно обязательно совпадать с названием параметра в запросе.
Для включения exist Вы можете передать параметры Dataset.SelectQuery.Parameters('...').Value = ...; а затем включить его через EnableSelectQueryFilters(Dataset.SelectQuery, true,'...')

Спасибо,Доленко Юрий, научил "....как ходють, как сдают..."(с) а теперь знатокам ВОПРОС
В дебаггере, я получил следующую информацию:
Dataset.USI
"Contacts\General\Main Grid\ds_Contact"
Filters.Count
13
Filters.Items(12).Code
"TeamProjectID"
Filters.Items(14).Code
List index out of bounds (14)
Ну и кто мне скажет ПОЧЕМУ??????
Если в коллекции фильтров запроса sq_Contact визуально их штук 20?

"Стоян Виталий" написал:Для включения compare фильтра используйте ApplydatasetFilter(датасет, название_фильтра, значение, true)
При этом название_фильтра должно обязательно совпадать с названием параметра в запросе.

Наверное название_фильтра совпадать не с названием и не с параметра, а все таки с КОДОМ фильтра в коллекции...
Подобный фильтр я в итоге и использовал, это написано во-втором посте... изначально задача была другой
"Черных Руслан" написал:Смысл в том чтоб получить список сотрудников, которые являются инициаторами(owner) по задачам

"Стоян Виталий" написал:
Для включения exist Вы можете передать параметры Dataset.SelectQuery.Parameters('...').Value = ...; а затем включить его через EnableSelectQueryFilters(Dataset.SelectQuery, true,'...')

А теперь с этого места подробнее, какие параметры я должен использовать для передачи в exists фильтр DocumentFilters в сервисе sq_Contact(рисунок см. выше)?
Как я понимаю я должен
1. Включить этот фильтр
2. Выключить фильтр DocumentContactID в запросе фильтра DocumentFilters
3. Включить собственно написанный фильтр OwnerID в запросе фильтра DocumentFilters.
И все это у меня не получается по тому, что попытка обратиться к коллекции глубже 13(12, если считать с 0 ) приводит к недоумению системы. :-(

Рекомендации на основании своих опытов с фильтрами в SelectQuery:
1) давайте своим фильтрам уникальные коды. В противном случае при включении их через функции типа ApplyDatasetFilter высока вероятность, что включится совсем другой фильтр (эти функции обрабатывают дерево фильтров рекурсивно и включает первый найденный с требуемым кодом. Мне кажется в sq_Contact есть уже фильтр с кодом OwnerID);
2) судя по скриншоту, новый фильтр OwnerID добавлен в Exists фильтр с пользовательскими фильтрами DocumentDate и DocumentState (извиняюсь за столь частое употребление слова "фильтр", по-другому сложно объяснить :) ). Программное включение такого фильтра, по-моему, не сработает - надо сделать свой фильтр, в котором не будет пользовательских;
3) иерархия фильтров в SelectQuery имеет свойство динамически меняться во время работы Террасофт :). Я не исследовал детально причины, но, к примеру, если пользователь, находясь в разделе Контакты, установит в гриде быстрый фильтр по полю ФИО, то в ds_Contact.SelectQuery.Filters структура фильтров несколько меняется :). Поэтому ориентироваться на положение фильтра в иерархии не стоит, обращение типа Filters.ItemsByCode('...') может не сработать, так как в определенный момент времени правильным может оказаться обращение Filters.Items(0).ItemsByCode('...') :)

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

var ExistsFilter = Dataset.SelectQuery.Items(0).Filters.ItemsByCode(Exists_Filter_Code);
var YourFilter = ExistsFilter.TestExpression.ExpressionSelectQuery.
Items(0).Filters.ItemsByCode(Your_Filter_Code);
YourFilter.IsEnabled = true;

Валер, МНЕ не нужен был свой фильтр, я хотел использовать, тот который есть в системе.... то что я создал свой фильтр в подзапросе, который реализует Exists, то обращаясь внутрь этого фильтра там структура имен УНИКАЛЬНА, то что на верхнем уровне в самом запросе может быть такой фильтр, так я ж там его не вызываю, вызов идет уже к фильтру подзапроса - переменная FiltersContacts? Есть человек на форуме со столь глубокими знаниями, который мне объяснит, почему свойство Filters.Count = 13? При вызове датасета из формы окна с LookUpControl? Я проверял до 12 фильтра их порядок соответствует визуальному дереву в конструкторе запроса qs_Contact.

"Валерий Андрусик" написал:Поэтому ориентироваться на положение фильтра в иерархии не стоит, обращение типа Filters.ItemsByCode('...') может не сработать, так как в определенный момент времени правильным может оказаться обращение Filters.Items(0).ItemsByCode('...')

А на что тогда ориентироваться, SDK то же в топку? :-) только собственный опыт и ручная трассировка вызова функций? Шаг в право, шаг влево приводят к непредсказуемым результатам :-)

"Стоян Виталий" написал:Валерий правильно подсказал - прежде всего во избежание проблем нужно название фильтра сделать уникальным

1. Так что пользоваться фильтрами созданными разработчиками Террасофт строго запрещено? :-) Это их ноу-хау и авторские права? Ну давайте все при малейшей необходимости будем "загаживать" датасет своими фильтрами? Как решить эту проблему, чтоб и рыбку, съесть и ... не замочиться я уже сделал, для тех кто "...в танке..."(с) Этот вопрос закрыт!!!!!!!!!!!
Объясните мне поведение датасета при получении коллекции фильтров, которое я описал выше!
2. Виталий ваш код подразумевает добавление фильтра в сервис запроса по -умолчанию в конец списка, а ниже 12 фильтра система их не видит, я (примерно, не проверял) скажу что вызов по коду этого фильтра так же закончиться ошибкой - Требуется объект...

"Черных Руслан" написал:Объясните мне поведение датасета при получении коллекции фильтров, которое я описал выше!

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

Я этому безумно рад :-), а как тогда его включить перед использованием программно? Ведь свойство-то IsEnabled никто не отменял?Ведь не может же быть что такая куча фильтров создана и отключена просто так для отладки, их как-то включают?

Насколько я понимаю, пользовательские фильтры идут через FiltersBuilder и там уже на них ядром кастуется какой-то баф, который дает типа "Включение фильтра" +3.
Хотя... вот сейчас нет возможности посмотреть в Террасофт, но вроде моя визуальная память подсказывает мне, что в базовых скриптах есть слова: ApplyUserFilters или как-то так, а может и нет )

Отписался в службу поддержки всем кому интересно - на данный момент есть проблема:
При получении любого фильтра (не только DocumentFilters), в составе которого есть пользовательский фильтр, получаем null.
Данная проблема была передана в отдел разработки для ее решения на уровне ядра системы. Проблема в ядре, изменения запланированы на конец апреля.

Руслан, добрый день.

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

"Доленко Юрий" написал:моя визуальная память подсказывает мне, что в базовых скриптах есть слова: ApplyUserFilters или как-то так

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

Решение - необходимо сначала вызвать метод запроса LoadUserFilters(). После этого Вы сможете получить по коду любой фильтр запроса, включая пользовательский. Если, как в Вашем случае, необходимо отключить один фильтр в группе и включить другой, сначала включаем всю группу фильтров, а потом отключаем в ней все ненужные фильтры.

Таким образом, для решения задачи Ваш код необходимо привести к виду:

	var Dataset = dlContact.Dataset;
	var OurOrgn = '{E4FCB451-2010-49E7-8B8A-05AE2E350B9F}';
 
	//Получение коллекции фильтров запроса датасета(в данном случае ds_Contacts)
	Dataset.SelectQuery.LoadUserFilters();
	var Filters = Dataset.SelectQuery.Items(0).Filters;
 
	//Получение коллекции фильтров для фильтра типа Exists в запросе датасета
        var FiltersContacts =
Filters.ItemsByCode('DocumentFilters').TestExpression.ExpressionSelectQuery.Items(0).Filters;
 
	// Фильтр по контактам собственного предприятия
	ApplyDatasetFilter(Dataset, 'AccountID', OurOrgn, true);
	Dataset.FetchRecordsCount = -1;
 
	//Отключение фильтра в запросе Exists, который включен по умолчанию
	Filters.ItemsByCode('DocumentFilters').IsEnabled = true;
	FiltersContacts('DocumentContactID').IsEnabled = false;
	FiltersContacts('DocumentDate').IsEnabled = false;
	FiltersContacts('DocumentState').IsEnabled = false;
	//Подключение фильра по "владельцу" задачи
	FiltersContacts('OwnerID').IsEnabled = true;
	Dataset.Open();
	SetControlAttribute(LookupControl, SelectWindow);

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Спасибо, огромное, Олег Ваша консультация, как всегда в точку. Персональная благодарность.:twisted:

вилучив

Продолжение обсуждения в теме http://www.community.terrasoft.ua/forum/topic/7265

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

Добрый день,
Пытаемся внедрить Terrasoft Service Desk.
Есть необходимость добавлять группу контактов в Terrasoft Service Desk напрямую через базу по шедулеру, не создавая им логины.
Для этого написан некий SQL-скрипт для добавления необходимой информации в таблицу tbl_Contact. Администраторы спокойно видят все добавленные скриптом контакты и созданные, но обычные пользователи видят только контакты созданные в ручную. Права на все пока по умолчанию, ничего не меняли.
В чем может быть причина? Еще куда то нужно писать информацию о контактах?

Нравится

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

Необходимо записать информацию о правах на импортированные контакты в таблицу tbl_ContactRight.

Также, вполне возможно, будет необходимо импортировать информацию и на другие детали раздела, такие как: "Средства связи", "Адреса", "Карьера".

"Кулак Олег" написал:Необходимо записать информацию о правах на импортированные контакты в таблицу tbl_ContactRight.
Или настроить права доступа по умолчанию для пользователя, от имени которого выполняется импорт данных.

"Кулак Олег" написал:Необходимо записать информацию о правах на импортированные контакты в таблицу tbl_ContactRight

Спасибо, помогла запись в таблицу tbl_ContactRight

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