Метод связи системного перечисления с объектом конфигурации Перечисление на примере объекта Цвет (WebЦвета)
В статье описан метод связи системного перечисления Цвет (WebЦвета) с объектом конфигурации Перечисление и получение значения цвета для дальнейшей обработки.
- Описание
- Подробнее
Описание
В организации, где я тружусь программистом, очень много заказов поступает через 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.

