Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хранение цвета в реквизите справочника
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bizisoft
Здравствуйте.
1С:Предприятие 8.2 (8.2.19.130) "Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.14.01)

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

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

Благодарю.
podcast
bizisoft @ Сегодня, 12:58 необходимо зарегистрироваться для просмотра ссылки ,
Выберите тип Цвет.
Flexy
Цитата(bizisoft @ 01.03.17, 12:58) необходимо зарегистрироваться для просмотра ссылки
Как можно к реквизиту цвет прикрепить кнопку для выбора цвета из палитры

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

Цитата(bizisoft @ 01.03.17, 12:58) необходимо зарегистрироваться для просмотра ссылки
как можно хранить выбор в реквизите?

Реквизит для цвета с типом ХранилищеЗначения
bizisoft
podcast @ Сегодня, 15:07 необходимо зарегистрироваться для просмотра ссылки ,
Это я сделал первым делом, но к сожалению не нашел такой тип.

Цитата(Flexy @ 01.03.17, 15:28) необходимо зарегистрироваться для просмотра ссылки
ДиалогВыбораЦвета (ColorChooseDialog)

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

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

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


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

Как-то так.



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

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

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


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

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

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

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

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


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

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

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


Спасибо, что помогли разобраться.
logist
Цитата(bizisoft @ 02.03.17, 21:46) необходимо зарегистрироваться для просмотра ссылки
   Пока Выборка.Следующий() Цикл

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

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

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

и зачем используете попытки? если ПриОткрытии переменные не заполняются, то перенесите код в ПередОткрытием
bizisoft
logist @ 03.03.17, 10:35 необходимо зарегистрироваться для просмотра ссылки ,
По Пока-Если понял свою ошибку и учел.

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

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


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

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