gifts2017

Метод связи системного перечисления с объектом конфигурации Перечисление на примере объекта Цвет (WebЦвета)

Опубликовал Вадим Шворобей (shvo65) в раздел Программирование - Практика программирования

В статье описан метод связи системного перечисления Цвет (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.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей (Alexey_) 24.03.14 22:08
3 вопроса:
1.Зачем создавать перечисление, когда цвет можно выбрать с помощью ДиалогВыбораЦвета?
2.Зачем Сериализатор XDTO? WebЦвета["ИмяЦвета"] слишком просто для Вас?)
3.Почему не хранить сам цвет в реквизите с типом ХранилищеЗначения?
AlexPNov; vsozansky; bulpi; +3 Ответить 1
2. Никита Грызлов (nixel) 26.03.14 10:51
(1) Alexey_,
3 - лично у меня были какие-то проблемы при хранении в ХЗ "именных" цветов. Точнее не в хранении, а в последующей работе с ними (вплоть до краша платформы). Приходилось раскладывать в rgb, тогда все отрабатывало корректно.

а по первому и второму вопросу - согласен.
WebЦвета["ИмяЦвета"] в случае локали, отличной от русской или английской не рухнет? Или можно туда передавать английские значения в любой локали? Никогда не работал с этой коллекцией таким способом. =)
3. Алексей (Alexey_) 26.03.14 12:13
(2) nixel, ну как раз, английские значения и надо использовать, т.к. его проще получить из строкового значения web цвета:
Напр., Голубой со стальным оттенком (LightSteelBlue), заключен в скобки.
В то время как в русском значении придется еще убирать пробелы и дефисы
4. Алексей А (alexei366) 02.04.14 17:45
В чем у тебя крах заключался?
я храню в ХЗ и проблем не наблюдал)
5. Никита Грызлов (nixel) 10.04.14 11:40
(4) alexei366, если я правильно помню, в обычном приложении в клиент-серверном варианте постоянно вылетали ошибки передачи значений между клиентом и сервером, если цвет хранился по имени. после раскладывания в rgb все работало корректно.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа