В организации, где я тружусь программистом, очень много заказов поступает через Web - сервисы, причем от разных контрагентов. Иногда, заказы идут сплошным потоком, в них потом разбираются девушки - операторы. Они и пожаловались генеральному, дескать заказов много, путаницы много, нельзя ли их как то выделить в списке, хотя бы цветом.
Начал очень бодро, создал справочник "Цвета" с реквизитами "Контрагент" и "WebЦвет". Теперь нужно было как-то выбирать цвета. Создал новое Перечисление "WebЦвета" и в этот момент понял, что к самому системному перечислению Цвет я подобраться не могу.
Оказалось, решение лежит на поверхности. Нужно создать XML - строку с описанием цвета, а потом эту строку десериализовать посредством Сериализатора XDTO. Ну и просто аккуратно забил значения Перечисления на английском языке, чтобы потом подставить его в строку XML.
Попробовал вначале выгрузить любой WebЦвет в строку XML чтобы посмотреть, как потом эту строку можно вручную пересобрать. Заметил, что строка легко собирается и подставляется английское название цвета.
Посмотрите, что получилось:
Функция ПолучитьЦвет(Контрагент) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цвета.WebЦвет
|ИЗ
| Справочник.Цвета КАК Цвета
|ГДЕ
| Цвета.Контрагент = &Контрагент
| И НЕ Цвета.ПометкаУдаления";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Рез = Запрос.Выполнить();
Если НЕ Рез.Пустой() Тогда
Выборка = Рез.Выбрать();
Выборка.Следующий();
ВыборкаЦвет = ПолучитьИмяПеречисления(Выборка.WebЦвет);
СтрокаЦвет = "<Color" + " xmlns=""http://v8.1c.ru/8.1/data/ui"" xmlns:d1p1=""http://v8.1c.ru/8.1/data/ui/colors/web" +
" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">"
+ "d1p1:" + СокрЛП(ВыборкаЦвет) + " <" + "/Color>";
// Почему то строка в сериализованном виде не хотела правильно отображаться, поэтому пришлось её разобрать на части
// Проверьте сами параметры при сборке строки
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ТипОбъектаXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/ui","Color");
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.УстановитьСтроку(СтрокаЦвет);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
Возврат Сериализатор.ПрочитатьXDTO(ОбъектXDTO);
Исключение
Возврат Неопределено;
КонецПопытки;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Получение строкового значения имени перечисления
Функция ПолучитьИмяПеречисления(Значение) Экспорт
Если Значение.Пустая() Тогда
Возврат "";
КонецЕсли;
//получаем как названо перечисление в конфигураторе
ИмяПеречисления = Значение.Метаданные().Имя;
//теперь получим индекс где хранится то что нам надо
НужныйИндекс = Перечисления[ИмяПеречисления].Индекс(Значение);
//и вот счастье. то что нам надо - идентификатор!!! всего-то четыре строчки кода
Возврат Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[НужныйИндекс].Имя;
КонецФункции
В результате, получаем на выходе настраиваемый цвет. Теперь можно подсветить любое поле для выбранного контрагента в любом журнале, и причем, люди самостоятельно могут настроить цвет без привлечения программиста.
Уверен, что через сериализацию - десериализацию можно получить доступ к абсолютно любому системному объекту.
Огромное спасибо asved.ru, помог получить имя перечисления для подстановки в строку XML.