Как добавить флажки в дерево значений ?
Есть обработка «РегистрацияИзмененийДляОбмена», у нее в ТЧ есть колонка «Имя», она заполняется метаданными, а рядом картинка.
Как сделать чтобы тут же отображалось поле флажок как в обработке «ВыгрузкаЗагрузкаДанныхXML»
Спасибо за внимание. За советы и ответы премного благодарен.
(3) Не обязательно. Если речь о 8.1, то у ячейки табличного поля есть свойства «Флажок» и «Отображать флажок» (управление в ПриВыводеСтроки() и в ПриПолученииДанных()). Для дерева реализация флажка этим способом намного интереснее выглядит, т.к. флажок можно отрисовывать непосредственно перед значениями ветки дерева, а не в фиксированной колонке (наподобие дерева подсистем в конфигураторе). Как в 8.2 такое сделать — не знаю, не рыл.
Пишу:
ОформлениеСтроки.Ячейки.Имя.ОтображатьФлажок = Истина;
ОформлениеСтроки.Ячейки.Имя.ЗначениеФлажка = Истина;
Теперь выводит флажек, только нельзя менять значение. Как его менять ?
И еще рамки у флажка нет
(6) Еще раз читай (1,2)..
У своей колонки выставляешь
ДанныеФлажка=»МояПометка»
РежимРедактирования=»Непосредственно»
(6) Значение флажка, ессно, нужно где-то хранить (и при выводе менять оформление ячейки в соответствии с ним). А менять по событию ПриИзмененииФлажка. Почему у тебя без рамки, навскидку не соображу. У меня с рамкой. Хотя режим редактирования той колонки, где отображается иерархия с флажком, стоит «Вход».
чего то вообще не меняется флажек.
На форме элемент управл.(Реквизит формы «ДеревоОбмена»):
Имя: «ДеревоОбмена»
Данные: «ДеревоОбмена»
ТипЗнч: ДеревоЗначений
У него колонка:
Имя: «Имя»
Данные: «Имя»
ДанныеФлажка = «Выгружать»
Програмно заполняю :
СтрокаДерева = ДеревоОбмена.Строки.Добавить();
СтрокаДерева.Имя = ИмяОтображения;
СтрокаДерева.Данные = ИмяДанных;
СтрокаДерева.Выгружать = Истина;
Выводит дерево, с галками, но не редактируются..
Я как то не правильно прописываю данные на колонку ?
(10) Ты определись, наконец, как ты делаешь. Если стандартно — в отдельной колонке, тогда для этой колонки прописываешь только «ДанныеФлажка» («Выгружать»), а «Данные» очищаешь.
(11)Хочу чтобы в колонке «Имя» отображался флаг, с возможностью редактирования. Уж прощевайте несведущего. Хочется прозреть.
(15) А осознал? Если осознал, то вылилось ли это в какие-то твои действия? И если да, то каковы результаты?
короче не редактируются флажки
вот ссылка на картинку
http://www.pictureshack.ru/images/6750NoName.JPG
режим редактирования — непосредственно написал
что может быть еще
Дошло. Ты всё-таки хочешь вместе со значением, а не в отдельной колонке. Тогда первым делом, нужно разобраться почему рамка не появляется. Когда появится, тогда читай (9). Проверь на всяк пожарный «Доступность» и «ТолькоПросмотр» у табличного поля, колонки и самого поля. «ДанныеФлажка» очисть. Флажок ПриПолученииДанных() рисоваться будет.
Добился таки результата. Вчера уже потерял надежду. Сел на 5 мин., поперетыкал все галки — Заработало.
Однако 1Са-жгет.
Для тех кому необходимо реализовать данную возможность — все здесь описано как нильзя лучше.
Источник
1С 8.3 : Табличное поле ~ Как реализовать в дереве значений флажок с тремя состояниями?
8.2 УП
Необходимо реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме 1С предприятия 8.2, который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. Пример — Скачивать файлы может только зарегистрированный пользователь!
Код 1C v 8.2 УП
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
// который будет отображен на управляемой форме
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
ДеревоОбъект.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Число"));
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
СтрокаУ1.Узел = "Узел"+к1;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1.Строки.Добавить();
СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2.Строки.Добавить();
СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
КонецЦикла;
КонецЦикла;
КонецЦикла;
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево",
Новый ОписаниеТипов("ДеревоЗначений")));
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя,
Колонка.ТипЗначения, "Дерево"));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
ЭлементДерево.ПутьКДанным = "Дерево";
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
ЭлементДерево);
НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
Если НЕ Колонка.Имя = "Пометка" Тогда
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
Иначе
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ТриСостояния = Истина;
НовыйЭлемент.УстановитьДействие("ПриИзменении",
"ФлажокПриИзменении");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
ИДТекущейСтроки = Элементы["Дерево"].ТекущаяСтрока;
Если ИДТекущейСтроки <> Неопределено Тогда
ЭлементКоллекции = ЭтаФорма["Дерево"].НайтиПоИдентификатору(
ИДТекущейСтроки);
Если ЭлементКоллекции.Пометка = 2 Тогда
ЭлементКоллекции.Пометка = 0;
КонецЕсли;
УстановкаФлажков(ЭлементКоллекции, ЭлементКоллекции.Пометка);
Родитель = ЭлементКоллекции.ПолучитьРодителя();
Пока Родитель <> Неопределено Цикл
Родитель.Пометка = ?(УстановленноДляВсех(ЭлементКоллекции),
ЭлементКоллекции.Пометка, 2);
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции.ПолучитьРодителя();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции.ПолучитьЭлементы();
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент.Пометка = ЗначениеПометки;
УстановкаФлажков(ТекЭлемент, ТекЭлемент.Пометка);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции.ПолучитьРодителя().ПолучитьЭлементы();
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент.Пометка <> ЭлементКоллекции.Пометка Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
8.х
На форме имеется табличное поле, источником данных для которого является дерево значений. В одной из колонок расположен элемент управления «Флажок». Необходимо что бы он мог принимать три состояния «Включен», «Выключен» и «Неопределено». При этом состояние «Неопределено» или так называемый «серый флажок», т.е. выбранный частично, устанавливается в том случае, если не у всех подчиненных строк состояние флажка одинаковое. Так же если строка имеет подчиненные строки, то при изменении её флажка, соответствующим образом должны изменяться флажки и всех подчиненных строк.
Во-первых, добавим нашу колонку с флажком в дерево значений:
Код 1C v 8.х
Дерево.Колонки.Добавить("Пометка",Новый ОписаниеТипов("Число"));
ЭлементыФормы.Дерево.СоздатьКолонки();
КолонкиДерева=ЭлементыФормы.Дерево.Колонки;
КолонкиДерева.Пометка.ДанныеФлажка="Пометка";
КолонкиДерева.Пометка.УстановитьЭлементУправления(Тип("Флажок"));
КолонкиДерева.Пометка.РежимРедактирования=РежимРедактированияКолонки.Непосредственно;
КолонкиДерева.Пометка.ТриСостоянияФлажка=Истина;
Во-вторых, при изменении флажка нужно устанавливать соответствующие значения в подчиненных строках и контролировать значение флажка в «строке-родителе»:
Код 1C v 8.х
Процедура ДеревоПриИзмененииФлажка(Элемент, Колонка)
ТекущаяСтрока=Элемент.ТекущаяСтрока;
Если ТекущаяСтрока.Пометка=2 Тогда
ТекущаяСтрока.Пометка=0;
КонецЕсли;
УстановкаФлажков(ТекущаяСтрока,ТекущаяСтрока.Пометка);
Пока ТекущаяСтрока.Родитель<>Неопределено Цикл
ТекущаяСтрока.Родитель.Пометка=?(УстановленноДляВсех(ТекущаяСтрока),ТекущаяСтрока.Пометка,2);
ТекущаяСтрока=ТекущаяСтрока.Родитель;
КонецЦикла;
КонецПроцедуры
Здесь процедура УстановкаФлажков() рекурсивно устанавливает флажки в подчиненных строках:
Код 1C v 8.х
Процедура УстановкаФлажков(ТекущаяСтрока,Значение)
Для Каждого Стр Из ТекущаяСтрока.Строки Цикл
Стр.Пометка=Значение;
УстановкаФлажков(Стр,Стр.Пометка);
КонецЦикла;
КонецПроцедуры
А функция УстановленноДляВсех() проверяет установлено ли одинаковое значение для всех строк на текущем уровне:
Код 1C v 8.х
Функция УстановленноДляВсех(Строка)
Для Каждого Стр Из Строка.Родитель.Строки Цикл
Если Стр.Пометка<>Строка.Пометка Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Источник
Дерево значений, флажок, передача данных между формами.
Из основной формы (обработка, документ, справочник. ) необходимо вызвать форму отбора элементов справочника.
Форма Отбора должна иметь табличное поле, ДеревоЗначений. При открытии, дерево должно заполнится элементами справочника например Спецификации Номенклатуры. Пользователь должен иметь возможность проставить напротив нужных элементов флажок. После выбора элементов, нажать на кнопку Выполнить, в результате форма должна закрыться, а выбранные спецификации вернуться в исходну форму.
Создаем форму выбора, размещаем Табличное поле, в свойствах выбираем тип ДеревоЗначений. Добавляем Поле (СправочникСсылка.СпецификацииНоменклатуры).
Форму надо Окрыть Модально и заполнить данными.
Процедура ПриОткрытии() Дерево.Строки.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЛОЖЬ КАК Флажок, | Спецификации.Ссылка КАК Спецификация |ИЗ | Справочник.СпецификацииНоменклатуры КАК Спецификации | |УПОРЯДОЧИТЬ ПО | Спецификация ИЕРАРХИЯ"; // Выполним запрос и поместим его результат в табличное поле на форме. Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); КонецПроцедуры
Теперь необходимо написать процедуру действия кнопки Выполнить. Надо обойти все дерево и отобрать выделенные элементы но с условием, папки нам не нужны, только их содержимое. Заполнить Таблицу значений для передачи данных в исходну форму и закрыть форму выбора. Для этого используем рекурсивный метод обхода дерева.
Процедура ОсновныеДействияФормыВыполнить(Кнопка) Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Спецификации"); Для Каждого Строка Из Дерево.Строки Цикл Если Не Строка.Спецификация.ЭтоГруппа И Строка.Флажок = Истина Тогда НоваяЗапись = Таблица.Добавить(); НоваяЗапись.Спецификации = Строка.Спецификация; КонецЕсли; ОбойтиДеревоЗначений(Строка, Таблица); КонецЦикла; ЭтаФорма.Закрыть(Таблица); КонецПроцедуры
Процедура ОбойтиДеревоЗначений(Элемент, Таблица) ПодчиненныйЭлемент = Элемент.Строки; Для Каждого Строка из ПодчиненныйЭлемент Цикл Если Не Строка.Спецификация.ЭтоГруппа И Строка.Флажок = Истина Тогда НоваяЗапись = Таблица.Добавить(); НоваяЗапись.Спецификации = Строка.Спецификация; КонецЕсли; ОбойтиДеревоЗначений(Строка, Таблица); КонецЦикла; КонецПроцедуры
Источник