Имя: Пароль:
1C
1С v8
Как получить цифровое значение цвета из стиля?
0 Nzzzz
 
14.08.20
08:06
Нужно сделать так, чтобы пользователи по нажатию кнопки появлялся диалог с выбором цвета.
Вроде подходит этот вариант:

Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ВыбранныйЦвет = Диалог.Цвет;
    КонецЕсли;

НО есть большое НО!
Мне нужно получить выбранный цвет в формате значение: "200,0,0"
Но с помощью метода выше у меня выбранный пользователем цвет получаю в формате стиля "стиль: Отрицательное число".
(Кстати, если в этом диалоге я выбираю цвет не из списка, а снизу в полях "Зеленый", "Красный", "Синий" пишу цифры, то возвращаются цифры, а не стиль в случае когда я выбираю из списка)
1 Гипервизор
 
14.08.20
08:28
2 Волшебник
 
14.08.20
08:28
Цвет.Красный
Цвет.Зеленый
Цвет.Синий
3 Nzzzz
 
14.08.20
08:30
(2)
-1
-1
-1
4 Nzzzz
 
14.08.20
08:31
Сделала так:

&НаКлиенте
Процедура Команда1(Команда)
    
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ВыбранныйЦвет = Диалог.Цвет;
    КонецЕсли;
    Если Диалог.Цвет.Вид = ВидЦвета.ЭлементСтиля Тогда
        Команда1НаСервере(ВыбранныйЦвет);
     КонецЕсли;    
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере(ВыбранныйЦвет)
        ОбъектМетаданныхСтиля = Метаданные.ЭлементыСтиля.Найти(Сред(Строка(ВыбранныйЦвет), 8));
        Если ОбъектМетаданныхСтиля <> Неопределено Тогда
            Цвет = ОбъектМетаданныхСтиля.Значение;
        КонецЕсли;
КонецПроцедуры

НО
вот здесь не находит ничего:
"ОбъектМетаданныхСтиля = Метаданные.ЭлементыСтиля.Найти(Сред(Строка(ВыбранныйЦвет), 8));"
5 Гипервизор
 
14.08.20
08:31
(2) Если бы ((
"Если цвет задан не абсолютным, то содержит -1"
6 Волшебник
 
14.08.20
08:32
Надо проверить ВидЦвета и если там АвтоЦвет или ЭлементСтиля, то лезть в метаданные
7 Nzzzz
 
14.08.20
08:33
(6) ЭлементСтиля
8 Nzzzz
 
14.08.20
08:33
(5) Вот вот((
9 Волшебник
 
14.08.20
08:35
А это работает? Взято из (1)


//
// Add_ComM_ОАС_КС.ПолучитьАбсолютныйЦвет(ИсходныйЦвет);
//
Функция ПолучитьАбсолютныйЦвет(ИсходныйЦвет) Экспорт
    
    Если ИсходныйЦвет.Вид = ВидЦвета.Абсолютный Тогда
        Возврат ИсходныйЦвет;
    КонецЕсли;
    
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Область("R1C1").ЦветФона = ИсходныйЦвет;
    ТабДок.Записать("ПреобразованиеЦвета.mxl", ТипФайлаТабличногоДокумента.MXL7);
    ТабДок.Прочитать("ПреобразованиеЦвета.mxl");
    
    АЦвет = ТабДок.Область("R1C1").ЦветФона;
    
    Возврат АЦвет;
    
КонецФункции

//
// Add_ComM_ОАС_КС.ПолучитьСтроку10АбсолютногоЦвета(АЦвет);
//
Функция ПолучитьСтроку10АбсолютногоЦвета(АЦвет) Экспорт
    
    // Форматная строка составляющей цвета
    ФсСц = "ЧЦ=3; ЧН=; ЧВН=; ЧГ=";
    
    // Допустим, что АЦвет равен (0, 0, 0) или (24, 15, 255). Где составляющие цвета - это числа
    
    RGB10 =
    Формат(АЦвет.Красный, ФсСц) + "," +
    Формат(АЦвет.Зеленый, ФсСц) + "," +
    Формат(АЦвет.Синий  , ФсСц);
    
    // Для примера выше получим строки "000,000,000" или "024,015,255", т.е. строго фиксированные строки.
    
    Возврат RGB10;
    
КонецФункции
10 Nzzzz
 
14.08.20
08:38
(9) Попробую сейчас
11 Nzzzz
 
14.08.20
08:41
(9)     
Ошибка при вызове метода контекста (Записать)
    ТабДок.Записать("ПреобразованиеЦвета.mxl", ТипФайлаТабличногоДокумента.MXL7);
по причине:
Ошибка доступа к файлу 'ПреобразованиеЦвета.mxl'
12 Nzzzz
 
14.08.20
08:50
(11) Куда мне этот файл надо? что с ним сделать?
13 youalex
 
14.08.20
08:53
(12) без разницы. Идея в том, что при записи табдока цвет стиля в его ячейке становится абсолютным.
14 Nzzzz
 
14.08.20
08:57
(13) ну это понятно, что при записи становится абсолютным)
Но от ошибки то как избавиться?)
15 youalex
 
14.08.20
09:01
(14) например:

ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL7)

ну или в Поток можно попробовать записать/прочитать
16 Nzzzz
 
14.08.20
09:05
Получииилось!!!
Спасибо каждому!!)))
17 lucbak
 
14.08.20
09:08
&НаСервере
Функция АбсолютныйЦвет(Цвет) Экспорт
    Если Цвет.Вид=ВидЦвета.Абсолютный Тогда Возврат Цвет; КонецЕсли;

    Поток=Новый ПотокВПамяти;

    ТабличныйДокумент=Новый ТабличныйДокумент;
    ТабличныйДокумент.Область("R1C1").ЦветФона=Цвет;
    ТабличныйДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL7);    
    ТабличныйДокумент.Прочитать(Поток.ЗакрытьИПолучитьДвоичныеДанные().ОткрытьПотокДляЧтения(), СпособЧтенияЗначенийТабличногоДокумента.Значение);

    Возврат ТабличныйДокумент.Область("R1C1").ЦветФона;
КонецФункции
18 Nzzzz
 
14.08.20
09:16
(17) Спасибо)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.