Версия для печати темы (https://pro1c.org.ua/index.php?s=9cd2192a6383c5f3a225db38f376f2ab&showtopic=35619)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Хранение цвета в реквизите справочника

Автор: bizisoft 01.03.17, 12:58

Здравствуйте.
1С:Предприятие 8.2 (8.2.19.130) "Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.14.01)

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

Создал справочник в котором есть реквизит, пользователь, склад, цвет.
Цвет пока просто строка и не используется.
Как можно к реквизиту цвет прикрепить кнопку для выбора цвета из палитры и как можно хранить выбор в реквизите?

Благодарю.

Автор: podcast 01.03.17, 14:07

bizisoft @ Сегодня, 12:58 * ,
Выберите тип Цвет.

Автор: Flexy 01.03.17, 14:28

Цитата(bizisoft @ 01.03.17, 12:58) *
Как можно к реквизиту цвет прикрепить кнопку для выбора цвета из палитры

ДиалогВыбораЦвета (ColorChooseDialog)

Цитата(bizisoft @ 01.03.17, 12:58) *
как можно хранить выбор в реквизите?

Реквизит для цвета с типом ХранилищеЗначения

Автор: bizisoft 01.03.17, 15:36

podcast @ Сегодня, 15:07 * ,
Это я сделал первым делом, но к сожалению не нашел такой тип.

Цитата(Flexy @ 01.03.17, 15:28) *
ДиалогВыбораЦвета (ColorChooseDialog)

Благодарю с этим получилось.
Цитата(Flexy @ 01.03.17, 15:28) *
Реквизит для цвета с типом ХранилищеЗначения

Выбор в типе ХранилищеЗначения будет достаточно или потребуются дополнительные операции по созданию метаданных?

Автор: Flexy 01.03.17, 15:53

Цитата(bizisoft @ 01.03.17, 15:36) *
Выбор в типе ХранилищеЗначения будет достаточно или потребуются дополнительные операции по созданию метаданных?

Пишем в реквизит выбранный цвет:
ВыборЦвета = Новый ДиалогВыбораЦвета;
  Если ВыборЦвета.Выбрать() Тогда
        ВыбранныйЦвет = ВыборЦвета.Цвет;
  Спр.ЦветПользователя = Новый ХранилищеЗначения(ВыбранныйЦвет);
  Спр.Записать();
  КонецЕсли;


Читаем и устанавливаем для строки ТЧ:
Процедура ТабличнаяЧасть1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
ОформлениеСтроки.ЦветФона = ДанныеСтроки.Ссылка.ЦветПользователя.Получить();
КонецПроцедуры

Как-то так.




Автор: bizisoft 02.03.17, 11:54

Flexy @ Вчера, 16:53 * ,
Я правильно понимаю данный реквизит должен быть типа ХранилищеЗначенй?

Установка цвета строки производится ПриПолученииДанных

Если ОформлениеСтроки.ДанныеСтроки.Ссылка.СкладКомпании.Код = СкладКод Тогда                
    ОформлениеСтроки.ЦветФона = ЦветСтрок; //делал так WebЦвета.БледноБирюзовый;                                     
КонецЕсли;


Считываю данные по пользователю в процедуре ПриОткрытии
Выборка = Результат.Выбрать();  
Пока Выборка.Следующий() Цикл
    СкладКод = Выборка.КодСклада;
    ЦветСтрок.ЦветФона = Выборка.Цвет.Получить(); // Так правильно будет получать значение из ХЗ?
КонецЦикла;


Автор: Flexy 02.03.17, 12:04

Цитата(bizisoft @ 02.03.17, 11:54) *
Я правильно понимаю данный реквизит должен быть типа ХранилищеЗначенй?

Правильно.

Автор: bizisoft 02.03.17, 20:46

Все получилось как и хотел.
Добавил следующий код в форму списка документа РеализацияТоваров

Перем СкладКод, ЦветСтрок;          
...
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ...
        Попытка
            Если ОформлениеСтроки.ДанныеСтроки.Ссылка.СкладКомпании.Код = СкладКод Тогда                
                ОформлениеСтроки.ЦветФона = ЦветСтрок;
            КонецЕсли;
        Исключение
        КонецПопытки;
    КонецЦикла;        
КонецПроцедуры //СписокПриПолученииДанных()

...
Процедура ПриОткрытии()
    ...
    ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    СпрТекПольз = Справочники.Пользователи.НайтиПоКоду(ТекПользователь.Имя);       
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    НастройкиПользователей.Пользователь,
        |    НастройкиПользователей.Назначение,
        |    НастройкиПользователей.Склад,
        |    НастройкиПользователей.Цвет,
        |    НастройкиПользователей.Склад.Код КАК КодСклада
        |ИЗ
        |    Справочник.НастройкиПользователей КАК НастройкиПользователей
        |ГДЕ
        |    НастройкиПользователей.Пользователь = &Пользователь";    
    Запрос.УстановитьПараметр("Пользователь", СпрТекПольз);  
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();  
    Пока Выборка.Следующий() Цикл
        СкладКод = Выборка.КодСклада;
        ЦветСтрок = Выборка.Цвет.Получить();
    КонецЦикла;
КонецПроцедуры // ПриОткрытии()


В справочнике настроек форма элемента так

Процедура кнВыбратьЦветНажатие(Элемент)
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ВыбранныйЦвет = Диалог.Цвет;
        Цвет = Новый ХранилищеЗначения(ВыбранныйЦвет);
        ЭлементыФормы.ПримерЦвета.ЦветФонаПоля = ВыбранныйЦвет; //подсвечиваем чтобы пользователь мог видеть как выглядит
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()    
    ЭлементыФормы.ПримерЦвета.Значение = "Это пример отображения";
    Попытка
        ЭлементыФормы.ПримерЦвета.ЦветФонаПоля = Цвет.Получить(); // чтобы было видно какой цвет установлен
    Исключение
    КонецПопытки;
КонецПроцедуры


Спасибо, что помогли разобраться.

Автор: logist 03.03.17, 9:35

Цитата(bizisoft @ 02.03.17, 21:46) *
   Пока Выборка.Следующий() Цикл

Правильней вместо Пока - Если

Цитата(bizisoft @ 02.03.17, 21:46) *
    ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    СпрТекПольз = Справочники.Пользователи.НайтиПоКоду(ТекПользователь.Имя);       

Сто пудова должна быть функция которая сразу вернет нужный элемент справочника.

и зачем используете попытки? если ПриОткрытии переменные не заполняются, то перенесите код в ПередОткрытием

Автор: bizisoft 07.03.17, 9:06

logist @ 03.03.17, 10:35 * ,
По Пока-Если понял свою ошибку и учел.

А "Попытка" использую как страховку от вылета ошибки, если вдруг реквизит Цвет (ХранилищеЗначений) будет не заполнен, а то пользователи шибко пугливые на ошибки 433.gif .

Автор: logist 07.03.17, 9:28

Цитата(bizisoft @ 07.03.17, 10:06) *
А "Попытка" использую как страховку от вылета ошибки, если вдруг реквизит Цвет (ХранилищеЗначений) будет не заполнен, а то пользователи шибко пугливые на ошибки

В таком случае надо проверять реквизит на заполненность, дело в том, что если реквизит не будет заполнен то попытка не вызовет исключение а вернет Неопределено.
Цвет = Цвет.Получить();
Если Не Цвет = Неопределено Тогда
ЭлементыФормы.ПримерЦвета.ЦветФонаПоля = Цвет;
КонецЕсли


Так же и при оформлении строки, обыграйте условие так, что бы не использовать попытку, при большом списке это будет очень нагружать систему.

Автор: bizisoft 25.05.17, 14:41

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

Подскажите пожалуйста, как такую неприятность можно исправить, или это никак поправить нельзя?

Автор: logist 28.05.17, 14:31

Учитывая что платформа 8.2, списал бы это на неё, потому, что она хранит пользовательские настройки в файлах, и возможно окрашивание не происходит потому что по какой-то причине не прочитался файл. Плюс - это Рарус, а там могут быть какие-то свои приколы, например при открытии формы выполняется какая-то внешняя компонента, которая, при каких-то условиях, чхала на вашу раскраску smile.gif

Автор: Bernet 29.05.17, 8:39

- это Рарус
как же часто я слышал объяснение багов этой фразой =))

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua