Стандартный типовой диалог выбора цвета предлагает выбор из цветов вида: элемент стиля, web-цвет и ввод числовых значений составляющих цвета RGB, при этом нет гарантии каким способом будет выбрано значение цвета пользователем. Составляющие цвета RGB имеются только в абсолютном виде цвета (при вводе составляющих цвета RGB вручную). Есть ряд задач в которых необходимо хранить и передавать именно составляющие цвета RGB, а не сам цвет как тип, для таких целей может пригодиться предлагаемый вариант.
Возможности:
Для быстроты и удобства использования пользователями цвет выбирается мышкой, так же имеется возможность (при необходимости) скопировать значения цвета в HEX и RGB кодировке в буфер обмена. Диалог выбора цвета реализован на управляемых формах, без использования ВК, обработка самодостаточная (в ней присутствует все необходимое для работы).
Возвращаемое значение: тип цвет в абсолютном виде, который можно разложить на составляющие RGB.
P.S.
Пример подстановки текущего изменяемого цвета в диалог выбора цвета при его открытии:
//Процедуры и функции
&НаСервере
Функция ПолучитьЦветHEX(Знач Красный = 0, Знач Зеленый = 0, Знач Синий = 0) Экспорт
ЦветHEX = "";
ЦифрыHEX = "0123456789abcdef";
КрасныйHEX = "";
Если Красный <= 0 Тогда
КрасныйHEX = "00";
Иначе
Пока Красный > 0 Цикл
КрасныйHEX = Сред(ЦифрыHEX, Красный % 16 + 1, 1) + КрасныйHEX;
Красный = Цел(Красный / 16) ;
КонецЦикла;
КонецЕсли;
ЗеленыйHEX = "";
Если Зеленый <= 0 Тогда
ЗеленыйHEX = "00";
Иначе
Пока Зеленый > 0 Цикл
ЗеленыйHEX = Сред(ЦифрыHEX, Зеленый % 16 + 1, 1) + ЗеленыйHEX;
Зеленый = Цел(Зеленый / 16) ;
КонецЦикла;
КонецЕсли;
СинийHEX = "";
Если Синий <= 0 Тогда
СинийHEX = "00";
Иначе
Пока Синий > 0 Цикл
СинийHEX = Сред(ЦифрыHEX, Синий % 16 + 1, 1) + СинийHEX;
Синий = Цел(Синий / 16) ;
КонецЦикла;
КонецЕсли;
ЦветHEX = "#" + ?(СтрДлина(КрасныйHEX) = 1, "0" + КрасныйHEX, КрасныйHEX) + ?(СтрДлина(ЗеленыйHEX) = 1, "0" + ЗеленыйHEX, ЗеленыйHEX) + ?(СтрДлина(СинийHEX) = 1, "0" + СинийHEX, СинийHEX);
Возврат ЦветHEX;
КонецФункции
//Обработчики событий
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекстДиалогаВыбораЦвета = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ТекстДиалогаВыбораЦвета").ПолучитьТекст();
ТекущийЦвет = Неопределено;
Параметры.Свойство("ТекущийЦвет", ТекущийЦвет);
Если Не ТекущийЦвет = Неопределено Тогда
Объект.ВыбранныйЦвет = ТекущийЦвет;
Красный = ТекущийЦвет.Красный;
Зеленый = ТекущийЦвет.Зеленый;
Синий = ТекущийЦвет.Синий;
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name=’color’ value=’#000000’", "name=’color’ value=’" + ПолучитьЦветHEX(Красный, Зеленый, Синий) + "’");
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name=’colorR’ value=’0’", "name=’colorR’ value=’" + Строка(Красный) + "’");
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name=’colorG’ value=’0’", "name=’colorG’ value=’" + Строка(Зеленый) + "’");
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name=’colorB’ value=’0’", "name=’colorB’ value=’" + Строка(Синий) + "’");
КонецЕсли;
Объект.ДиалогВыбораЦвета = ТекстДиалогаВыбораЦвета;
КонецПроцедуры
//Обработчики команд
&НаКлиенте
Процедура ДиалогВыбораЦветаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
СоставляющиеВыбранногоЦвета = Элемент.Документ;
Если СоставляющиеВыбранногоЦвета = Неопределено Тогда Возврат; КонецЕсли;
colorR = СоставляющиеВыбранногоЦвета.getElementById("colorR");
colorG = СоставляющиеВыбранногоЦвета.getElementById("colorG");
colorB = СоставляющиеВыбранногоЦвета.getElementById("colorB");
Красный = ?(colorR = Неопределено, 0, colorR.Value);
Зеленый = ?(colorG = Неопределено, 0, colorG.Value);
Синий = ?(colorB = Неопределено, 0, colorB.Value);
Объект.ВыбранныйЦвет = Новый Цвет(Красный, Зеленый, Синий);
КонецПроцедуры
&НаКлиенте
Процедура КомандаОК(Команда)
Закрыть(Объект.ВыбранныйЦвет);
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтмена(Команда)
Закрыть(Неопределено);
КонецПроцедуры
Пример вызова диалога выбора цвета:
//Процедуры и функции
&НаКлиенте
Процедура УстановитьНовыйЦветКлиент(Элемент, СтандартнаяОбработка)
Элемент_Имя = Элемент.Имя;
ТекущийЦвет = Объект[Элемент_Имя];
ТекПараметры = Новый Структура("ТекущийЦвет", ТекущийЦвет);
ВыбранныйЦвет = ОткрытьФормуМодально("Обработка.ИмяОбработки.Форма.ФормаДиалогаВыбораЦвета", ТекПараметры, ЭтаФорма);
Если Не ВыбранныйЦвет = Неопределено Тогда
Объект[Элемент_Имя] = ВыбранныйЦвет;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
//Обработчики событий
&НаКлиенте
Процедура ИзменяемыйЦветНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
УстановитьНовыйЦветКлиент(Элемент, СтандартнаяОбработка);
КонецПроцедуры
Недавно сталкивался с такой задачей. Нужная вещь. Если кому надо, могу подкинуть функцию преобразования из RGB в 16-ричный.
Афигеть! Супер! Спасибо! Встроил, пользуюсь! С новым годом и Рождеством, Автор!
(2) kondi55,
Спасибо. Всех благ, с новым годом и Рождеством!
P.S. Добавил пример использования.