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

22.03.14

Разработка - Универсальные функции

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4574    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8485    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    56141    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7923    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    70538    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9914    ke.92@mail.ru    17    

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

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