Вопрос

Цветовое решение для раздела "Документы"

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

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

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

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

Я заметила,что в разделе "Задачи", к справочнику "Состояние задач" есть поле "Цвет". Подумала, что по аналогии можно решить мою задачую.
Создала справочник Стадия документов (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;
	}
Показать все комментарии