Создал новый раздел, иконку сразу добавлять не стал. Теперь не знаю как добавить, по-старому, как описано тут не получается. У меня XRM 3.4.1.101. Знатоки, подскажите.

Нравится

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

Никита Олегович, добавьте изображение в сервисы il_Main и il_Main16 (по аналогии с существующими разделами, например, Accounts). Название изображения должно соответствовать названию созданного раздела + Normal.

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

Добрый день!
Чтобы зарегистрировать страницу в качестве страницы раздела она должна быть отнаследована от базовой страницы раздела или не обязательно? Почему-то при создании раздела не вижу своей страницы в списке.

Нравится

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

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

1)Перейдите в раздел “Конфигурация”.

2)В меню “Добавить” выберите пункт “Страница”.

3)В области “Свойства” для страницы:
a) Заполните свойства “Название” и “Заголовок”.
b) В поле “Родительская страница” выберите значение “Базовая страница раздела”.
После выбора родительского элемента структура страницы будет соответствовать структуре стандартного раздела.

4)В области “Структура” выберите элемент “Grid” (“MainControlLayout” –> “RightControlLayout” –> “GridTabPanel” –> “Вкладки” –> “Данные”).

5)Перейдите на вкладку “Свойства”.

6)В свойстве “Страница” элемента “Grid” выберите из списка страницу реестра раздела.

7)Опубликуйте страницу.

Прим. Для добавления специального блока фильтрации в раздел необходимо в контейнере страниц “CustomSearchContainer” указать страницу фильтрации (“Базовая страница фильтрации по периоду” или “Базовая страница фильтрации по периоду и ответственному”), и переопределить метод “SetCustomFilterDetails” в странице раздела, передав колонку фильтрации по дате и период по умолчанию.

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

Здравствуйте, Алексей.

Да, Вы можете скрыть визуальные элементы (добавленные дизайнером) и добавить свои. В системе сбоев не будет из-за скрытия и добавления.
Главное их не удалять.

Если у Вас возникнут дополнительные вопросы, обращайтесь, всегда с радостью поможем.

Николай, спасибо. Попробую!

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

Добрый день!

TS 3.3.2.211, Оракл

Никак не могу понять в чём проблема. Создал раздел по аналогии с другими. При добавлении группы в раздел возникает ошибка: "null" - есть null или не является объектом в функции ds_ItemGroupOnDatasetAfterPost скрипта ds_ItemGroupScript на строке

Filters.ItemsByCode('RecordID').TestExpression.Field =
                RightsTable.Fields('RecordID');

Если место получения переменной RightsTable

var RightsTable = Select.FromTable.RightsTable;

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

Нравится

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

Ozzy, очистите Cache и профиль. Затем проверьте, появится ли ошибка.

Наталия, все почистил. Проблема осталась.

Значит нужно анализировать реализацию раздела. Вложите, пожалуйста, сервисы раздела.

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

Загрузила сервисы, ошибка воспроизвелась.
Следующие действия привели к ее устранению:
1. Открыла таблицу tbl_PromPurchGroup.
2. Заполнила значение свойства Primary Display Field равным Name:
/system/files/_1_.png
3. Пересохранила таблицу. В результате группы добавляются корректно и без ошибок.

Наталия, мне, к сожалению, Ваш совет не помог. Сделал поле для отображения в таблице, даже в датасете сделал. Почистил кеш и профиль. Удалил полностью все сервисы и создал их заново. Получаю ту же ошибку. Кстати, при попытке посмотреть права данной группы, тоже вылетает ошибка, только в скрипте scr_Access в функции OpenAccessWindow на строке wndAccessRights.Attributes('TableUSI') = Table.RightsTable.USI, т.к. переменная Table null. Хотя если это место пройти под отладчиком, то все отрабатывает правильно. При повторной попытке открыть Права доступа группы в той же сессии - все работает нормально. Могу предоставить удаленное подключение.

В ходе удаленного подключения ошибка устранена пересохранением таблицы групп (tbl_PromPurchGroup).

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

Добрый день!

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

Нравится

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

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

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

pgMapsDetail.IsVisible = GetCanReadData('tbl_Maps');

Спасибо, Анна, помогло.

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

И еще маленький неприятный момент: когда в первый раз обращаешься к этой детали, то она видимая, а при ее выборе исчезает как по-волшебству. С этим можно как-то бороться?

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

В данном случае добавьте ту же проверку в функцию InitializeGridData() в том же скрипте.

Всё работает, спасибо.

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

Добрый день!

TS 3.3.2.211, Оракл

Создал раздел Карты. Раздал права доступа необходимым группам. У группы все пользователи нет прав на этот раздел вообще. В разделе Контакты создал пользовательский фильтр ссылающийся на созданный раздел. Для пользователя, у которого есть права на раздел Карты фильтр работает идеально. Если у пользователя нет прав на этот раздел, то получаем ошибку ORA-00904: "tbl_Card"."ContactID": invalid identifier. При этом на сервер отправляется вот такой вот запрос:

SELECT
        "ID",
        "Name",
        "Communication1",
        "AccountName",
        "AccountID",
        "ContactTypeID",
        "ContactTypeName"
FROM (
SELECT
        "tbl_Contact"."ID" "ID",
        "tbl_Contact"."Name" "Name",
        "tbl_Contact"."Communication1" "Communication1",
        "tbl_Account"."Name" "AccountName",
        "tbl_Contact"."AccountID" "AccountID",
        "tbl_Contact"."ContactTypeID" "ContactTypeID",
        "tbl_ContactType"."Name" "ContactTypeName"
FROM
        "TS"."vw_Contact" "tbl_Contact"
LEFT OUTER JOIN
        "TS"."vw_Account" "tbl_Account" ON "tbl_Account"."ID" = "tbl_Contact"."AccountID"
LEFT OUTER JOIN
        "TS"."tbl_ContactType" "tbl_ContactType" ON "tbl_ContactType"."ID" =
"tbl_Contact"."ContactTypeID"
WHERE (("tbl_Contact"."IsNotActive" > :pIsActive) AND
        (EXISTS
        (SELECT
                NULL "ID"
        FROM
                "TS"."tbl_Empty" "tbl_Card"
        WHERE ("tbl_Contact"."ID" = "tbl_Card"."ContactID" AND
                1 = 0 AND
                1 = 0 AND
                1 = 0 AND
                1 = 0))))
ORDER BY
        2 ASC
)
 WHERE ROWNUM = 40

Что я прописал не так для пользовательского фильтра в запросе? Сервис запроса прилагаю.

Нравится

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

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

В tbl_Empty нет поля ContactID:

SELECT 
                NULL "ID"
        FROM 
                "TS"."tbl_Empty" "tbl_Card"
        WHERE ("tbl_Contact"."ID" = "tbl_Card"."ContactID"

Если у пользователя нет прав на таблицу, то при построении запроса она заменяется на tbl_Empty, поэтому возникает такая ошибка.

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

Сергей, спасибо за помощь. Действительно, в таблице tbl_Empty нет поля ContactID. Но я эту таблицу не подставлял, соответственно это делает ядро, в том случае, когда у пользователя нет доступа к этой таблице. Поэтому мне кажется, что тут в ядре надо что-то менять. Например, одновременно с подстановкой tbl_Empty все поля таблицы, к которой нет доступа, заменять на поле ID. Ваше предложение об отключении фильтра если нет прав на таблицу идеальное, но опять же, это должно делать ядро.

С моей стороны может быть сделано простое решение: добавить в таблицу tbl_Empty поле ContactID. Но тогда такое поле необходимо добавлять фактически для каждого раздела.

Может кто-то еще сталкивался с подобной ситуацией? Как решали данную проблему?

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

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

Дать права на чтение на tbl_Card группе Все пользователи;

Установить для нее признак "Администрируется по записям" и убрать из прав по умолчанию на записи группу Все пользователи.

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

В Вашем случае есть вариант воспользоваться отдельной функциоей получения результата запроса в CustomSqlColumn:

http://www.community.terrasoft.ua/blogs/8267#comment-34549

Анна, спасибо, но как-то неправильно давать права на чтение всем пользователям. Они вообще не должны видеть этот раздел, не говоря о его содержимом. Как Вы говорите можно скрыть раздел в зависимости от прав пользователя? Может все-таки можно в ядре что-то подправить? Ведь попытка обработать такую ситуацию ядром системы есть...

Записей они видеть не будут, только сам раздел.

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

amiCard.IsVisible = Value; //результат проверки

Я всё же настаиваю что это ошибка и вопрос необходимо передать разработчикам для исправления. Например сделать как при отображении детали, на которую нет прав доступа на чтение:

SELECT
	"ID",
	"SalesPointID",
	"SalesPointName",
	"PurchaseDate",
	"PurchaseNumber",
	"ContactID",
	"ContactName",
	"CardID",
	"CardNumber",
	"PromoutionCheckID",
	"CheckNumber",
	"DiscountTypeID",
	"DiscountTypeName",
	"BasicAmountPaid",
	"BasicTotalDiscount",
	"BasicTotalBonus",
	"CashierID",
	"CashierName"
FROM (
SELECT 
	NULL "ID",
	NULL "SalesPointID",
	NULL "SalesPointName",
	NULL "PurchaseDate",
	NULL "PurchaseNumber",
	NULL "ContactID",
	NULL "ContactName",
	NULL "CardID",
	NULL "CardNumber",
	NULL "PromoutionCheckID",
	NULL "CheckNumber",
	NULL "DiscountTypeID",
	NULL "DiscountTypeName",
	NULL "BasicAmountPaid",
	NULL "BasicTotalDiscount",
	NULL "BasicTotalBonus",
	NULL "CashierID",
	NULL "CashierName"
FROM 
	"TS"."tbl_Empty" "tbl_PromoutionPurchase"
LEFT OUTER JOIN
	"TS"."tbl_SalesPoint" "tbl_SalesPoint" ON "tbl_SalesPoint"."ID" = NULL
LEFT OUTER JOIN
	"TS"."vw_Contact" "tbl_Contact" ON "tbl_Contact"."ID" = NULL
LEFT OUTER JOIN
	"TS"."tbl_DiscountType" "tbl_DiscountType" ON "tbl_DiscountType"."ID" = NULL
LEFT OUTER JOIN
	"TS"."vw_Contact" "Cashier" ON "Cashier"."ID" = NULL
WHERE (1 = 0)
)
 WHERE ROWNUM <= 40

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

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

Анна, задача простая: необходимо дать пользователю, у которого есть право на чтение раздела Карты, вывести контакты, у которых есть карта, удовлетворяющая определённым условиям (по номеру, по типу и т.п.). Для этого в сервисе sq_Contacts (прикреплен к первому сообщению) я создал фильтр типа Exist с названием CardsFilter. Пытался сделать его на подобие аналогичных фильтров. Может я что-то перемудрил?

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

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

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

Дмитрий, для меня так и останется загадкой почему конфигурация может определить что при применении пользовательского фильтра у пользователя нет доступа в другой раздел и подставить вместо tbl_Card tbl_Empty, а вместо tbl_Card.ContactID подставить NULL (как в посте №7) она не может.

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

Ozzy, дело в том что эти данные подставляет не конфигурация, а ядро.
А почему Вы не хотите скрыть иконку "Раздела" для тех кому он не должен быть виден, а доступ на чтение на раздел "Карты" выдать?

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

Ozzy, я сообщу в департамент разработки о проблеме. По результатам Вам отпишу в этом топике.

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

Добрый день!

В новой для меня области начинают возникать различные вопросы...
Имеется задача: в разделе используется 5 типов например продуктов. Для двух из них нужно в карточке отобразить дополнительные пару полей.
Если пользоваться базовым функционалом, то мы создаем нужное количество карточек (в данном случае 5) для каждого типа, на основании одной базовой, содержащей все прочие поля. Далее в каждой карточке для каждого типа добавляем индивидуально дополнительные поля.
Далее в настройке Рабочих мест к разделу в деталь "Карточки редактирования" добавляем все 5 карточек для каждого типа отдельно. Все работает.

Нюанс. Мы не можем использовать две карточки - одна с допполями, другая без них, одна для нужных типов, другая для остальных, так как в этом случае получаем обрушение системы на моменте открытия раздела - в нем на кнопке "добавить" генерируются динамически пунктики для создания каждого из типов продукта с именем, включающим в себя id соответствующей страницы редактирования (ну а так как страниц всего две, а типов много - получаем два ActionMenuItem с одинаковы именем и крах...)
Вопрос. Для тонкой настройки множества параметров для разных типов эта схема удобна, а вот если все так, как я описал? Есть ли другой путь?

Нравится

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

Кстати, вдогонку...
Гуру, подскажите для bpm-чайника стоит ли связываться и как проще сделать традиционное скрытие/показ контролов на карточке? Или такой метод будет идеологически совсем неправильным?

Александр, добро пожаловать в BPMonline :) На какой это версии? Думаю, стоит подправить базовую логику, чтобы название пункта меню формировалось как название типа + карточка.
Мы скрываем элементы управления используя метод public virtual void SetVisible(bool visible), он управляет видимостью с помощью выполнения скрипта на клиенте. и это быстрее, чем управлять видимостью меняя свойство public virtual bool Hidden, хотя так тоже можно.

Это версия 5.3.0.332
Базовая логика - с непривычки боязно, я буду бороться с этим страхом, обещаю;) настораживает, что это название потом может использоваться для подъема карточки, передаваясь куда-то. Соответственно править надо и его, почва для исследования есть.

А скрытие идеологически правильно будет, или все же надо стараться уходить от таких методов?

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

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

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

Возникло пару вопросом, по реализации задачи, связанно с цветовым отображением "Документов" в реестре.

Необходимо реализовать цветовое решение для стадий документов:

Открыт - Белый фон, Черный шрифт
Закрыт - Белый фон, Серый шрифт
Отменен - Белый фон Черный Шрифт, перечеркнуто
Ожидает Оплаты/Оплачен частично - зеленый шрифт

Я заметила,что в разделе "Задачи", к справочнику "Состояние задач" есть поле "Цвет". Подумала, что по аналогии можно решить мою задачую.
Создала справочник Стадия документов (BillStatus). Создала для начала поле Color, для того чтобы было можно меня цвет текста:
tbl_BillStatus - целое число - Color
sq_BillStatus - General Column - Color
sq_BillStatus - целочисленное поле - Color

Потом, в реестре документов (wnd_InvoiceGridArea) для grdData в свойствах установила HasCustomDraw - True. После чего в События OnGetRowDrawInfo в скрипте прописала следущие

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
TextColor.Value = GetInvoiceColorByDatasetRecord(BaseGridArea.GridDataset);
}

function GetInvoiceColorByDatasetRecord(Dataset)
{
var DatasetBillStatus = Services.GetNewItemByUSI('ds_BillStatus');
DatasetBillStatus.Open();
var TextColor = DatasetBillStatus.ValAsInt('Color');
DatasetBillStatus.Post();
DatasetBillStatus.Close();
DatasetBillStatus.GoToNext();
}
Ошибок не возникает но текст в реестре не окрашивается. В данном случаи, что может быть не верно.

И еще, для того чтобы окрасить поле в реестре, в справочнике выбрав таким же образом цвет, необходимо проделать те же действия, только в реестре документов (wnd_InvoiceGridArea) для grdData в свойствах установить HasCustomСellDraw - True?

И так подозреваю для того чтобы был перечеркнут текст, для Стадии "Отменен" необходимо программно накладывать отдельное событие. Потому как в справочнике настроить это будет нельзя.

Спасибо, заранее за ответ!

Нравится

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

Добавьте функцию

function GetInvoiceColorByBillStatus(BillStatusID)
{
	var Dataset = Services.GetNewItemByUSI('ds_BillStatus');
	// В датасете ds_BillStatus должен быть фильтр по ID
	ApplyDatasetFilter(Dataset, 'ID', BillStatusID, true);
	Dataset.Open();
	var Color = Dataset('Color');
	Dataset.Close();
	return Color;
}

Получите состояние счета и отправьте у функцию, она вернет цвет

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
	var BillStatusID = BaseGridArea.GridDataset('BillStatusID'); // Поле состояние счета
	TextColor.Value = GetInvoiceColorByBillStatus(BillStatusID);
	//Color.Value = GetInvoiceColorByBillStatus(BillStatusID); // Для цвета фона
}

Добавила функцию function GetInvoiceColorByBillStatus(BillStatusID) в скрипт wnd_InvoiceGridAreaScript.
И function grdDataOnGetRowDrawInfo изменила как вы написали (тоже в скприте wnd_InvoiceGridAreaScript).
"В датасете ds_BillStatus должен быть фильтр по ID" вроде так и есть.
В строке var BillStatusID = BaseGridArea.GridDataset('BillStatusID'); возникает ошибка, что поле Стадия не активно.

Если поле не активно, необходимо воспользоватся функцией GetFieldValueFromDisabledField();

var BillStatusID = GetFieldValueFromDisabledField(BaseGridArea.GridDataset, 'BillStatusID');

Реестр "Документов" вообще не загружается в данном случаи (рис 1.):(
Может я не очень правильно поняла.

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
var BillStatusID = GetFieldValueFromDisabledField(BaseGridArea.GridDataset, 'BillStatusID');//заменила эту строку
TextColor.Value = GetInvoiceColorByBillStatus(BillStatusID);
}

Попробуйте так.

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
	var BillStatusID = GetFieldValueFromDisabledField(BaseGridArea.GridDataset, 'BillStatusID');//заменила эту строку
	if (BillStatusID != null) {
		TextColor.Value = GetInvoiceColorByBillStatus(BillStatusID);
	}
}

О! Вот так все работает! Спасибо огромное!
Сейчас попробую закрасить поле.
Мне еще получается для стадии - "Отменен" нужно чтобы значение было перечеркнуто. Можно ли это сделать тоже через сравочник BillStatus. Допустим, указать что для стадии "Отменен" -полностью значение было зачеркнуто, или это нужно прописывать в коде.

Вот смотрите, я создала новое поле ColorBackground в справочнике BillStatus, таким же образом как и поле Color(я описала в первом посте). Т.е. мне получается нужно сделать так чтобы я могла отдельно задавать цвет текста и цвет поля. В данном случаи мне нужно на событие OnGetCellDrawInfo создавать функцию?

Да нужно создать еще одну функцию для ColorBackground как и для текста.

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

Функция которая возвращает цвета

function GetInvoiceColorsByBillStatus(BillStatusID) {
	var Dataset = Services.GetNewItemByUSI('ds_BillStatus');
	// В датасете ds_BillStatus должен быть фильтр по ID
	ApplyDatasetFilter(Dataset, 'ID', BillStatusID, true);
	Dataset.Open();
	var Color = Dataset('Color');
	var ColorBackground = Dataset('Dataset');
	Dataset.Close();
	return [Color, ColorBackground];
}

И запишем значения в реестр

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
	var BillStatusID = GetFieldValueFromDisabledField(BaseGridArea.GridDataset, 'BillStatusID');
	if (BillStatusID != null) {
		var Colors = GetInvoiceColorsByBillStatus(BillStatusID);
		// Цвет текста
		TextColor.Value = Colors[0];
		// Цвет фона
		Color.Value = Colors[1];
	}
}

Да, спасибо большое. Все работает как надо. Подскажите, а с перечеркнутым отображение, не получится сделать?

Что бы стало перечеркнутым, нужно Font.Strikethrough поставить true

Font.Strikethrough = true;

Кое что неполучается. Вот смотрите. То же цветовое решение, нужно применить для другого типа документа "Сборочный лист"(InvStatus). Добавила два поля ColorText, ColorBackgroundInv.

Изменила/Добавила чуть скрипт:

function GetInvoiceColorByBillStatus(BillStatusID) // new BillStatus
{    
        var Dataset = Services.GetNewItemByUSI('ds_BillStatus');
        ApplyDatasetFilter(Dataset, 'ID', BillStatusID, true);
        Dataset.Open();
        var Color = Dataset('Color');
        var ColorBackground = Dataset('ColorBackground');
        Dataset.Close();
        return [Color,ColorBackground];
}  
function GetInvoiceColorByInvStatus(InvStatusID) //new InvStatus
{  
	var Dataset = Services.GetNewItemByUSI('ds_InvStatus');
	ApplyDatasetFilter(Dataset,'ID', InvStatusID, true);
	Dataset.Open();
	var ColorText = Dataset('ColorText');
	var ColorBackgroundInv = Dataset('ColorBackgroundInv');
	Dataset.Close();
	return [ColorText,ColorBackgroundInv];
}
 
function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) 
{
     var BillStatusID = GetFieldValueFromDisabledField(BaseGridArea.GridDataset, 'BillStatusID');//Цветовое решение для "счетов"(BillStatus)
		if (BillStatusID != null) 
		{
			var	Colors = GetInvoiceColorByBillStatus(BillStatusID); 
				TextColor.Value = Colors[0];  //цвет текста
                Color.Value = Colors[1];                      // Цвет фона
		}	
	var InvStatusID =  GetFieldValueFromDisabledField(BaseGridArea.GridDataset, 'InvStatusID');//Цветовое решение для "счетов"(BillStatus)
		if (InvStatusID != null) 
		{
			 var ColorsInv = GetInvoiceColorByInvStatus(InvStatusID);
			   TextColor.Value = ColorsInv[2]; //цвет текста
			   Color.Value = ColorsInv[3];      // Цвет фона
		}

Но все Сборочные листы почему-то черный шрифт и черный фон для всех состояний. Цвета которые я задаю в справочнике, никак не влияют.

Вы из функции GetInvoiceColorByInvStatus возвращаете массив параметров нумерация который начинается с 0.

Поэтому правильно будет так

if (InvStatusID != null) 
{
    var ColorsInv = GetInvoiceColorByInvStatus(InvStatusID);
    TextColor.Value = ColorsInv[0]; //цвет текста
    Color.Value = ColorsInv[1];      // Цвет фона
}

Да я так и сделала изначально, но возникает ошибка. (рис.Error)

Где то в одном из цветов не указан цвет. Там null и он не может его сконвертировать в число. Можно написать проверку для Null. Или же сделать стандартный цвет если там Null.

Примерно так:

if (InvStatusID != null) 
{
    var ColorsInv = GetInvoiceColorByInvStatus(InvStatusID);
	var ColorsInvText = ColorsInv[0];
	var ColorsInvBackground = ColorsInv[1];
 
	// Цвет текста
    if (ColorsInvText != null) { TextColor.Value = ColorsInvText; }
 
	// Цвет фона
    if (ColorsInvBackground != null) { Color.Value = ColorsInvBackground; }      
}

Для функции статуса счета думаю тоже так нужно сделать. Может возникнуть ситуация когда не указан цвет.

Да, спасибо. Я тоже подумала, что это связано с тем, что не указан цвет.
Решение проблемы с вычеркиванием, я создала системный параметр CanceledBillStatus (Стадия "Отменена" для документа "счета"). И в функции function grdDataOnGetRowDrawInfo прописала следующий код:

var DatasetInv = Services.GetNewItemByUSI('ds_BillStatus');
	var BillStatus = DatasetInv.DataFields.ItemsByName('BillStatusID')
	var CanceledBillStatus = GetSystemParameterValueEx('CanceledBillStatus');
		if (BillStatus.Name == CanceledBillStatus){                     \\возникает тут ошибка
			Font.Strikethrough = true;
	}
Показать все комментарии

Простой, казалось бы, вопрос. Но -- не могу его решить. В чем проблема: при создании раздела мастером написала название раздела в английском варианте. Или: сначала созданый раздел был назван так, но заказчику не очень понравилось и он хочет переименования.

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

В версии 3.3 это сделать просто -- достаточно переименовать ами-меню. Здесь же, насколько я понимаю, это меню формируется динамически -- но откуда берутся названия?? переискала все (по запросу в греп-серче по названию раздела), переименовала все окна и сервисы раздела, переименовывала рабочее место (файл--сервис--рабочие места) -- толку 0.

что не так и куда нужно копать? подскажите, пожалуйста!))

Нравится

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

Редактирование раздела в настройке рабочих мест :)

http://www.community.terrasoft.ua/system/files/10-07-2012_11-11-28.png

Но сначала нужно нажать "Добавить раздел" -- вот это меня и сбило с толку, я даже туда не заглядывала)) Просто щелкала дважды на разделе и переименовывала -- но оно не сохранялось...
Спасибо за ответ!

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

Для того, чтобы добавить новую или изменить существую иконку к разделу , следует сделать следующее (на примере версии 3.4.0):

1. Запустить Terrasoft Administrator
2. Открыть сервис il_MainWorkspace

1

3. В левой части в дереве изображений можно добавить новое изображение либо заменить существующее:

1

4. Для загрузки нового изображения следует воспользоваться иконкой загрузки:

1

Изображения к разделу могут быть четырех типов:
• Hot – активная иконка раздела (при наведении курсора мышки)
• Normal – обычное отображение иконки
• Hot_16 – активная иконка раздела при выборе раздела
• Normal_16 - обычное отображение иконки при выборе раздела

1

Пример иконок для разного типа показан ниже (на примере раздела «Контрагенты»):

1

Стандартный размер иконки раздела – 39х39 пикселей, при выборе раздела – 16х16 пикселей.
Пример отображения иконки выбора раздела Вы можете увидеть при работе с мастером рабочих мест:

1

Нравится

Поделиться

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

Добрый день!

Не совсем понятно, как добавить иконку для нового раздела. К примеру, скопировать иконку другого раздела. подскажите, пожалуйста.

Лена, подготовила для Вас инструкцию по добавлению иконки для раздела (во вложении).

Спасибо большое за инструкцию. Правда, не понятен вот этот пункт:

"Бондарь Наталия" написал:
Затем используя опцию «Открыть» панели инструментов данного элемента сервиса, добавить в Terrasoft созданное ранее изображение.

Не вижу опцию "Открыть", да и саму панель инструментов.

И рисунок обязательно новый создатвать или можно скопировать (не используюя граф. редакторы) рисунок другого раздела?

На скриншоте выделила опцию "Открыть":

/system/files/1_128.png

Чтобы скопировать рисунок другого раздела, необходимо:
- Сохранить изображение другого раздела в файл:
/system/files/2_70.png
- Затем создать новый элемент в il_Main и загрузить сохраненное изображение из предыдущего пункта.

Спасибо. Теперь, всё удалось.

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

Добрый день. Мне поступила задача создание раздела для автоматизации работы по дебиторской задолженности. Получил макет того что хотят от меня руководство но по моим представлениям не вписывается в в интерфейс и стандартные механизмы работы црм. Подскажите стоит ли изменять стандартные расположения вкладок обойтись практически без деталей а все запихать в карточку редактирования как это желает разработчик макета или стоит с ним поспорить и как объяснить что так будет не совсем правильно. Макет карточки в приложенных файлах.

Нравится

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

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

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

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

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

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

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

Решать, конечно, Вам, но видно, что отображенные Вами закладки дублируют детали.
Соответственно - имеет ли смысл их дублировать в ущерб быстродействию?
Что касается удобности заполнения данной карточки - можно создать бизнес-процесс, отвечающий за пошаговое открытие карточек (как основной, так и деталей).
Что касается удобности работы - фактически без разницы - будут ли пользователи переходить по закладкам в карточке или по закладкам в деталях.
Для оптимизации рабочего места можно ограничить посредством TS Admin количество отображаемых по умолчанию деталей.

Или заполнять страницы карточки по необходимости, а не при ее открытии

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

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