gifts2017

Как вывести динамическое представление для пустого значения (в таблице)?

Опубликовал Артем Лабутин (weissfeuer) в раздел Программирование - Практика программирования

Есть таблица. Часть полей в ней заполняется автоматически, а часть - должен заполнить пользователь. Нужно подсказать пользователю, что именно в какую ячейку вводить - для этого выведем серым текст подсказки внутри каждой незаполненной ячейки.
На поиски решения этой задачки я потратил половину субботы. Надеюсь, моя небольшая заметка поможет кому то провести выходные более продуктивно)
Чтобы не изобретать велосипед, для подсистемы печати договоров в отраслевой конфигурации я взял за образец подсистему печати из УНФ -  мне понравилась и "визуальная", и программная реализация.
 
Но я никак не мог понять, каким образом разработчикам удалось решить задачку, описанную выше:
При печати договоров, когда выбираешь бланк, автоматически заполняется таблица параметров. И в этой таблице для пустых значений сереньким отображается наименование параметра (представление). А если заполнен параметр - то соответственно отображается введенное значение. Вот как добиться такого поведения?
 
Таблица параметров
 
 
Я как ни пробовал, у меня всегда это поле пустое, если пустое значение в этой строке. Поиск по интернетам ничего не дал, пришлось задавать вопрос разработчикам. Ниже делюсь решением, на мой взгляд, оно довольно необычное, - я раньше не сталкивался с таким применением условного оформления.
 
 
Признак заполненности параметра (если значение не заполнено, то выводится представление параметра) и его представление (которое отображается серым) лежат в таблице значений РедактируемыеПараметры.
 
Настройка условного оформления
 
 
По умолчанию для поля текст в настройках условного оформления выбран тип Строка. Чтобы выбрать реквизит формы, необходимо:
  1. очистить текущий тип данных
  2. выбрать новый тип (поле компоновки данных)
  3. после этого по кнопке выбора станет возможным выбрать реквизит формы.
 
Редактирование типа поля
 
Вуаля! Все работает) 
 
Публикация основана на ответах разработчика 1С, за что ему огромное спасибо!
 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Антонио (Fragster) 29.03.16 16:34
Есть типовое свойство у поля ввода. Называется "Подсказка ввода".
2. Артем Лабутин (weissfeuer) 29.03.16 16:54
(1) Fragster, верно, есть такое поле. Но если его задать - подсказка будет одинаковой в каждой ячейке.
3. Антонио (Fragster) 29.03.16 18:19
(2) weissfeuer, ну, поскольку все равно в таком случае надо насоздавать реквизитов по количеству различных вариантов текста в условном оформлении, то в случае, который на картинке, ИМХО проще нагенерить элементов управления у них уже задать подсказку ввода (возможно с нужным путем к данным - по номеру строки). В любом случае либо программная генерация реквизитов и условного оформления, либо элементов управления.
4. Артем Лабутин (weissfeuer) 29.03.16 19:44
(3) Fragster, да вроде бы только два реквизита нужно - признак ЗначениеЗаполнено и строковое Представление в табличной части РедактируемыеРеквизиты. Зачем по количеству вариантов то создавать? В таблице же все хранится...
5. ivanov660 ivanov660 (ivanov660) 31.03.16 10:53
На самом деле такой подход к разработке не очень удобен:
- проблематично копирование функционала на большой набор форм
- довольно тяжело редактировать большой набор параметров, занимает много времени
- если настраиваете на типовых формах конфигураций, то можете столкнуться с программной очисткой
Оптимально делать программно, к тому же разработчики типовых конфигураций, прошли этап ручной настройки на формах и вызывают программно. Приведу пример оформления данного кода программно:


...
УсловноеОформление.Элементы.Очистить(); // очищаем все что было ))
...
// 1. Создадим новый элемент
Элемент = УсловноеОформление.Элементы.Добавить();

ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ЭлементФормы.Имя);

// 2. Отбор, критерий по которому будем применять наше оформление
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяЭлемента);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = ПравоеЗначение;

// 3. Свойстваусловного оформления
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт",новый Шрифт(,,Истина));
...

...Показать Скрыть
Glebis; weissfeuer; +2 Ответить 2
6. Антонио (Fragster) 31.03.16 12:01
(5) ivanov660, ну, в стандартах разработки от 1с как раз и рекомендуют условное оформление делать программно http://its.1c.ru/db/v8std#content:2149184359:hdoc:_top . Соответственно, можно написать в общем модуле обработчик для заполнения условного оформления на основе колонки с именем реквизита
weissfeuer; +1 Ответить 1
7. Артем Лабутин (weissfeuer) 31.03.16 15:04
(6) Fragster, хорошая ссылка, спасибо!)

(5) ivanov660, про большое количество одинаково оформляемых форм - как то не думал в этом контексте) У меня оформление обычно как раз всегда разное.

А как мне программно передать в УстановитьЗначениеПараметра реквизит формы?

ПолеПредставления = Новый ПолеКомпоновкиДанных("РедактируемыеПараметры.Представление");
Элементы.Оформление.УстановитьЗначениеПараметра("Текст", ПолеПредставления);


Так?
8. Денис Соломасов (Denis S) 02.04.16 14:33
(7)
Верно, сделать как описано в http://its.1c.ru/db/v8std#content:2149184359:hdoc:_top
и в конце добавить
	ПолеПредставления = Новый ПолеКомпоновкиДанных("РедактируемыеПараметры.Представление");
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ПолеПредставления);
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа