Программное создание формы. Не понимаю пары моментов

1. HarkonLord 06.02.24 17:37 Сейчас в теме
Задание следующее:
Итоговое задание
1. Сделать внешнюю обработку с формой, на которой будет строковое поле "Базовое значение" и таблица с 2 колонками (одна строковая "Значения" и одна типа Булево "Выбрано"). Все элементы на форме разместить кодом.(ГОТОВО)

2. поле "Базовое значение" подсветить светло голубым цветом и добавить подсказку ввода "Укажите базовый текст".
(Готово)

3. Рядом с полем "Базовое значение" разместить кнопку "Заполнить таблицу" (должна быть доступна только когда в
поле есть текст)
4. Строковую колонку "Значения" в таблице сделать нередактируемой.
5. По кнопке "Заполнить таблицу" выдавать окно ввода числа с вопросом "Сколько строк добавить?" и после указания количества добавить в таблицу заданное число строк и для каждой колонку "Значения" заполнить как текст введенный в поле "Базовое значение" + номер строки (Текст 1, Текст 2 и
т.д.). Если в таблице уже есть строки, не очищать.
6. В таблице только для одной строки можно установить флаг "Выбрано". Добавить проверку и когда пользователь пытается установить флаг, например, в строке 3, а для строки 1 уже установлено значение Истина, тогда выдавать предупреждение "В строке 1 уже установлено значение "Выбрано". Оно будет очищено. Продолжить?", варианты ответа да/нет. Если да, то очищаем значение в строке 1 и устанавливаем в строке 3. Если нет, то наоборот.
7. под таблице добавить надпись "Основной текст в строке ..." (номер строки для которой установлен флаг Выбрано). Если таких строк нет, надпись не выводить.
Все элементы формы создать программно. Обработка должна работать в режиме модальности не использовать или использовать с предупреждением.

Соответственно у меня возникла трудность с реализацией третьего пункта,а именно применение условия о доступности кнопки Заполнения,в случае,когда в поле ввода есть текст. Думал применять методы ПроверятьЗаполнение(); Но такого нет для Поля Ввода,как можно проверить значение внутри поля ввода,и обыграть условие верно? (Код формы будет в комментариях под тредом).

И ещё вопрос какие есть варианты реализации передачи значения из поля ввода в таблицу? Я себе представляю это в виде передачи значения из поля ввода в переменную,а затем использование её как параметра для заполнения таблицы(именно логичекси,я представляю,как это должно быть,но в виде кода изобразить не могу)

Буду рад любой помощи и подсказкам!
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
6. anton13m 2 07.02.24 08:56 Сейчас в теме
Вот это не нужно.
ПолеВвода=" " ;
Если ЗначениеЗаполнено(ПолеВвода) Тогда
    КнопкаЗаполнения.Доступность = Истина;
Иначе
    КнопкаЗаполнения.Доступность = Ложь;
КонецЕсли;

Можно использовать событие поля ИзменениеТекстаРедактирования
ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "ПолеВводаИзменениеТекстаРедактирования");

И обработчик события:
&НаКлиенте
Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	
	Элементы.ЗаполнениеТаблицы.Доступность = ЗначениеЗаполнено(Текст);

КонецПроцедуры


Если же использовать при изменении, то в параметрах передается элемент поля ввода, а не текст
10. anton13m 2 12.02.24 16:20 Сейчас в теме
(9)
Данные хранятся в реквизите БазовоеЗначение
&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
	
	Оп = Новый ОписаниеОповещения("ОбработатьВводЗначения", ЭтотОбъект);
	
	ПоказатьВводЗначения(Оп, 1, "Сколько строк добавить?");

КонецПроцедуры 

&НаКлиенте
Процедура ОбработатьВводЗначения(РезультатВвода, ДополнительныеПараметры) Экспорт
	
	Если РезультатВвода = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Инд = 1 По РезультатВвода Цикл
		
		НоваяСтрока = ЭтаФорма.ТаблицаЗнач.Добавить();
		НоваяСтрока.Значение = ЭтаФорма.БазовоеЗначение + Формат(Инд, "ЧГ=0");
		
	КонецЦикла;
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. HarkonLord 06.02.24 17:38 Сейчас в теме
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	           	
	
	//Создание реквизитов
		ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
		РеквизитПоляВвода = Новый РеквизитФормы("БазовоеЗначение",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150))); 
		ДобавляемыеРеквизиты.Добавить(РеквизитПоляВвода);
		ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применение реквизитов для формы   
	//Получение поля ввода БазовогоЗначения и изменение его свойств.
		ПолеВвода = ЭтаФорма.Элементы.Добавить("БазовоеЗначение", Тип("ПолеФормы"));
		ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
		ПолеВвода.ПутьКДанным = "БазовоеЗначение";    
		ЦветЗначения= Новый Цвет(148, 248, 255);
		ПолеВвода.ЦветФона=ЦветЗначения;    
		ПолеВвода.ПодсказкаВвода="Укажите базовый текст";                                   
		ПолеВвода=" " ;
    //Создание кнопки 
	  	КомандаЗаполнения = ЭтаФорма.Команды.Добавить("ЗаполнитьТаблицу");
		КомандаЗаполнения.Заголовок = "Заполнить таблицу";
		КомандаЗаполнения.Действие = "ЗаполнитьТаблицу";
		КнопкаЗаполнения = ЭтаФорма.Элементы.Добавить("ЗаполнениеТаблицы", Тип("КнопкаФормы"), );
		КнопкаЗаполнения.Заголовок = "Заполнить таблицу";
		КнопкаЗаполнения.ИмяКоманды = "ЗаполнитьТаблицу";
	    //КнопкаЗаполнения.Доступность=Ложь;
	Если ЗначениеЗаполнено(ПолеВвода) Тогда
		КнопкаЗаполнения.Доступность = Истина;
	Иначе
		КнопкаЗаполнения.Доступность = Ложь;
	КонецЕсли;	
	

	//ДОБАВЛЕНИЕ ТАБЛИЦЫ
    // Описание таблицы значений как реквизита
    	МассивТипа = Новый Массив;
    	МассивТипа.Добавить(Тип("ТаблицаЗначений"));

    // Добавление ТаблицыЗначений в массив реквизитов
    	ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
    	МассивРеквизитовФормы = Новый Массив;
    	МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТаблицаЗнач", ОписаниеТипа, "", "ТЗЗнач"));

    // Создание ТаблицыЗначений с описанием колонок
    	КвалификаторыСтроки = Новый КвалификаторыСтроки(150);
    	ОписаниеЗначения = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);

    	ОписаниеВыбрано = Новый ОписаниеТипов("Булево");

    	ТЗ = Новый ТаблицаЗначений;
    	ТЗ.Колонки.Добавить("Значение", ОписаниеЗначения);
    	ТЗ.Колонки.Добавить("Выбрано", ОписаниеВыбрано);
    // ТЗ.Колонки.Добавить - можно и в цикле

    // Добавление в массив реквизитов колонок ТаблицыЗначений
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаЗнач"));
    КонецЦикла;

    // Удаление - если таблица существует
    ЭлементТаблица = Элементы.Найти("ТаблицаЗнач");
    Если ЭлементТаблица <> Неопределено Тогда
        Элементы.Удалить(ЭлементТаблица);
    Иначе
        ИзменитьРеквизиты(МассивРеквизитовФормы);
    КонецЕсли;

    // Добавление ТаблицыЗначений на форму
    ТаблицаПолейВыбора = Элементы.Добавить("ТЗЗнач", Тип("ТаблицаФормы"));
    ТаблицаПолейВыбора.ПутьКДанным = "ТаблицаЗнач";
    ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
    ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панели

    Для Каждого Колонка Из ТЗ.Колонки Цикл

        НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "ТаблицаЗнач." + Колонка.Имя;
        НовыйЭлемент.Ширина = 10;

	КонецЦикла;
	
КонецПроцедуры
Показать
3. HarkonLord 06.02.24 17:39 Сейчас в теме
Предполагаю,что можно воспользоваться дополнительной процедурой ПриИзменении,где в параметрах передать значение из ПоляВвода,и уже тут обыграть условие. В противном случае,при применении метода ПроверитьЗначение(); выдает ошибку. ЗначениеЗаполненно(); тоже не подходит,так как выдает ошибку о мутабельных переменных.
Прикрепленные файлы:
4. user2033930 06.02.24 17:54 Сейчас в теме
(3) Очень важный прикрепленный файл!
8. HarkonLord 07.02.24 11:48 Сейчас в теме
(4)Очень важный комментарий!
5. SlavaKron 07.02.24 08:55 Сейчас в теме
(1) Само поле ввода - это просто элемент управления, в нем нет никакого значения. Значение у вас - это реквизит формы БазовоеЗначение, его и проверяйте на заполненность при изменении поля ввода.
Для этого программно привяжите действие для поля ввода "ПриИзменении". В этом событии устанавливайте свойство доступность кнопки в зависимости от заполненности реквизита БазовоеЗначение.
6. anton13m 2 07.02.24 08:56 Сейчас в теме
Вот это не нужно.
ПолеВвода=" " ;
Если ЗначениеЗаполнено(ПолеВвода) Тогда
    КнопкаЗаполнения.Доступность = Истина;
Иначе
    КнопкаЗаполнения.Доступность = Ложь;
КонецЕсли;

Можно использовать событие поля ИзменениеТекстаРедактирования
ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "ПолеВводаИзменениеТекстаРедактирования");

И обработчик события:
&НаКлиенте
Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	
	Элементы.ЗаполнениеТаблицы.Доступность = ЗначениеЗаполнено(Текст);

КонецПроцедуры


Если же использовать при изменении, то в параметрах передается элемент поля ввода, а не текст
9. HarkonLord 12.02.24 15:34 Сейчас в теме
(6)а по поводу передачи параметра из ПоляВвода в таблицу значений? Это лучше совершать через цикл?
10. anton13m 2 12.02.24 16:20 Сейчас в теме
(9)
Данные хранятся в реквизите БазовоеЗначение
&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
	
	Оп = Новый ОписаниеОповещения("ОбработатьВводЗначения", ЭтотОбъект);
	
	ПоказатьВводЗначения(Оп, 1, "Сколько строк добавить?");

КонецПроцедуры 

&НаКлиенте
Процедура ОбработатьВводЗначения(РезультатВвода, ДополнительныеПараметры) Экспорт
	
	Если РезультатВвода = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Инд = 1 По РезультатВвода Цикл
		
		НоваяСтрока = ЭтаФорма.ТаблицаЗнач.Добавить();
		НоваяСтрока.Значение = ЭтаФорма.БазовоеЗначение + Формат(Инд, "ЧГ=0");
		
	КонецЦикла;
	
КонецПроцедуры
Показать
11. HarkonLord 12.02.24 16:48 Сейчас в теме
(10)
Оп = Новый ОписаниеОповещения

а где можно об этом прочитать в синтаксис-помощнике?
12. HarkonLord 12.02.24 16:51 Сейчас в теме
13. HarkonLord 12.02.24 21:13 Сейчас в теме
Дружище,слушай,еще момент,я не могу понять как мне описывать свойство для колонки Значения,чтобы она была нередактируемой. Я полагаю,что за это отвечает свойство "ТолькоПросмотр",но когда,Я пытаюсь его дать данной колонке,мне выдаёт ошибку о том,что ПолеОбъектаНеОбнаружено. Почему методы,которые я пытаюсь применять к элементам формы,воспринимаются за объекты,можешь примерно объяснить,что я делаю не так,ибо это уже не первый случай.
14. HarkonLord 16.02.24 17:02 Сейчас в теме
(10)Я нашел нужное свойство,пока вроде все получается,но у меня теперь трудность следующего характера,я сделал так,чтобы булево представлялось в виде флага,как будет грамотнее описать условие из пункта 6?

Вот пока код,который получился:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	           	
	
	//Создание реквизитов
		ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
		РеквизитПоляВвода = Новый РеквизитФормы("БазовоеЗначение",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150))); 
		ДобавляемыеРеквизиты.Добавить(РеквизитПоляВвода);
		ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применение реквизитов для формы   
	//Получение поля ввода БазовогоЗначения и изменение его свойств.
		ПолеВвода = ЭтаФорма.Элементы.Добавить("БазовоеЗначение", Тип("ПолеФормы"));
		ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
		ПолеВвода.ПутьКДанным = "БазовоеЗначение";    
		ЦветЗначения = Новый Цвет(148, 248, 255);
		ПолеВвода.ЦветФона=ЦветЗначения;    
		ПолеВвода.ПодсказкаВвода="Укажите базовый текст";                                   
	    //Создание кнопки 
	  	КомандаЗаполнения = ЭтаФорма.Команды.Добавить("ЗаполнитьТаблицу");
		КомандаЗаполнения.Заголовок = "Заполнить таблицу";
		КомандаЗаполнения.Действие = "ЗаполнитьТаблицу";
		КнопкаЗаполнения = ЭтаФорма.Элементы.Добавить("ЗаполнениеТаблицы", Тип("КнопкаФормы"), );
		КнопкаЗаполнения.Заголовок = "Заполнить таблицу";
		КнопкаЗаполнения.ИмяКоманды = "ЗаполнитьТаблицу";
		КнопкаЗаполнения.Доступность = Ложь;
		//Добавление фукнции доступности кнопки
	   	ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "ПолеВводаИзменениеТекстаРедактирования");

//ДОБАВЛЕНИЕ ТАБЛИЦЫ
    // Описание таблицы значений как реквизита
    	МассивТипа = Новый Массив;
    	МассивТипа.Добавить(Тип("ТаблицаЗначений"));

    // Добавление ТаблицыЗначений в массив реквизитов
    	ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
    	МассивРеквизитовФормы = Новый Массив;
    	МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТаблицаЗнач", ОписаниеТипа, "", "ТЗЗнач"));

    // Создание ТаблицыЗначений с описанием колонок
    	КвалификаторыСтроки = Новый КвалификаторыСтроки(150);
    	ОписаниеЗначения = Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(150));
    	ОписаниеВыбрано = Новый ОписаниеТипов("Булево");

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

    // Добавление в массив реквизитов колонок ТаблицыЗначений
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаЗнач"));
    КонецЦикла;

    // Удаление - если таблица существует
    ЭлементТаблица = Элементы.Найти("ТаблицаЗнач");
    Если ЭлементТаблица <> Неопределено Тогда
        Элементы.Удалить(ЭлементТаблица);
    Иначе
        ИзменитьРеквизиты(МассивРеквизитовФормы);
    КонецЕсли;

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

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

//Обработчик события доступности кнопки
&НаКлиенте                              
Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
    
    Элементы.ЗаполнениеТаблицы.Доступность = ЗначениеЗаполнено(Текст);

КонецПроцедуры  
 //Обработчик нажатия на кнопку
&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
    
    Оп = Новый ОписаниеОповещения("ОбработатьВводЗначения", ЭтотОбъект);
    
    ПоказатьВводЗначения(Оп, 1, "Сколько строк добавить?");

КонецПроцедуры 

&НаКлиенте
Процедура ОбработатьВводЗначения(РезультатВвода, ДополнительныеПараметры) Экспорт
    
    Если РезультатВвода = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Для Инд = 1 По РезультатВвода Цикл
        
        НоваяСтрока = ЭтаФорма.ТаблицаЗнач.Добавить();
        НоваяСтрока.Значение = ЭтаФорма.БазовоеЗначение + Формат(Инд, "ЧГ=0");
    
    КонецЦикла;
КонецПроцедуры
Показать
Прикрепленные файлы:
7. SlavaKron 07.02.24 08:56 Сейчас в теме
Хорошее задание – затрагивает множество вопросов работы с пользовательским интерфейсом.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот