Программное создание формы. Не понимаю пары моментов
Задание следующее:
Итоговое задание
1. Сделать внешнюю обработку с формой, на которой будет строковое поле "Базовое значение" и таблица с 2 колонками (одна строковая "Значения" и одна типа Булево "Выбрано"). Все элементы на форме разместить кодом.(ГОТОВО)
2. поле "Базовое значение" подсветить светло голубым цветом и добавить подсказку ввода "Укажите базовый текст".
(Готово)
3. Рядом с полем "Базовое значение" разместить кнопку "Заполнить таблицу" (должна быть доступна только когда в
поле есть текст)
4. Строковую колонку "Значения" в таблице сделать нередактируемой.
5. По кнопке "Заполнить таблицу" выдавать окно ввода числа с вопросом "Сколько строк добавить?" и после указания количества добавить в таблицу заданное число строк и для каждой колонку "Значения" заполнить как текст введенный в поле "Базовое значение" + номер строки (Текст 1, Текст 2 и
т.д.). Если в таблице уже есть строки, не очищать.
6. В таблице только для одной строки можно установить флаг "Выбрано". Добавить проверку и когда пользователь пытается установить флаг, например, в строке 3, а для строки 1 уже установлено значение Истина, тогда выдавать предупреждение "В строке 1 уже установлено значение "Выбрано". Оно будет очищено. Продолжить?", варианты ответа да/нет. Если да, то очищаем значение в строке 1 и устанавливаем в строке 3. Если нет, то наоборот.
7. под таблице добавить надпись "Основной текст в строке ..." (номер строки для которой установлен флаг Выбрано). Если таких строк нет, надпись не выводить.
Все элементы формы создать программно. Обработка должна работать в режиме модальности не использовать или использовать с предупреждением.
Соответственно у меня возникла трудность с реализацией третьего пункта,а именно применение условия о доступности кнопки Заполнения,в случае,когда в поле ввода есть текст. Думал применять методы ПроверятьЗаполнение(); Но такого нет для Поля Ввода,как можно проверить значение внутри поля ввода,и обыграть условие верно? (Код формы будет в комментариях под тредом).
И ещё вопрос какие есть варианты реализации передачи значения из поля ввода в таблицу? Я себе представляю это в виде передачи значения из поля ввода в переменную,а затем использование её как параметра для заполнения таблицы(именно логичекси,я представляю,как это должно быть,но в виде кода изобразить не могу)
Буду рад любой помощи и подсказкам!
Итоговое задание
1. Сделать внешнюю обработку с формой, на которой будет строковое поле "Базовое значение" и таблица с 2 колонками (одна строковая "Значения" и одна типа Булево "Выбрано"). Все элементы на форме разместить кодом.(ГОТОВО)
2. поле "Базовое значение" подсветить светло голубым цветом и добавить подсказку ввода "Укажите базовый текст".
(Готово)
3. Рядом с полем "Базовое значение" разместить кнопку "Заполнить таблицу" (должна быть доступна только когда в
поле есть текст)
4. Строковую колонку "Значения" в таблице сделать нередактируемой.
5. По кнопке "Заполнить таблицу" выдавать окно ввода числа с вопросом "Сколько строк добавить?" и после указания количества добавить в таблицу заданное число строк и для каждой колонку "Значения" заполнить как текст введенный в поле "Базовое значение" + номер строки (Текст 1, Текст 2 и
т.д.). Если в таблице уже есть строки, не очищать.
6. В таблице только для одной строки можно установить флаг "Выбрано". Добавить проверку и когда пользователь пытается установить флаг, например, в строке 3, а для строки 1 уже установлено значение Истина, тогда выдавать предупреждение "В строке 1 уже установлено значение "Выбрано". Оно будет очищено. Продолжить?", варианты ответа да/нет. Если да, то очищаем значение в строке 1 и устанавливаем в строке 3. Если нет, то наоборот.
7. под таблице добавить надпись "Основной текст в строке ..." (номер строки для которой установлен флаг Выбрано). Если таких строк нет, надпись не выводить.
Все элементы формы создать программно. Обработка должна работать в режиме модальности не использовать или использовать с предупреждением.
Соответственно у меня возникла трудность с реализацией третьего пункта,а именно применение условия о доступности кнопки Заполнения,в случае,когда в поле ввода есть текст. Думал применять методы ПроверятьЗаполнение(); Но такого нет для Поля Ввода,как можно проверить значение внутри поля ввода,и обыграть условие верно? (Код формы будет в комментариях под тредом).
И ещё вопрос какие есть варианты реализации передачи значения из поля ввода в таблицу? Я себе представляю это в виде передачи значения из поля ввода в переменную,а затем использование её как параметра для заполнения таблицы(именно логичекси,я представляю,как это должно быть,но в виде кода изобразить не могу)
Буду рад любой помощи и подсказкам!
Прикрепленные файлы:
По теме из базы знаний
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Автоматическое распознавание сканов документов и не только. История одной жизни...
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика
- Улучшайзер - как одна внешняя обработка может улучшать другие внешние обработки
Найденные решения
Вот это не нужно.
Можно использовать событие поля ИзменениеТекстаРедактирования
И обработчик события:
Если же использовать при изменении, то в параметрах передается элемент поля ввода, а не текст
ПолеВвода=" " ;
Если ЗначениеЗаполнено(ПолеВвода) Тогда
КнопкаЗаполнения.Доступность = Истина;
Иначе
КнопкаЗаполнения.Доступность = Ложь;
КонецЕсли;
Можно использовать событие поля ИзменениеТекстаРедактирования
ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "ПолеВводаИзменениеТекстаРедактирования");
И обработчик события:
&НаКлиенте
Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
Элементы.ЗаполнениеТаблицы.Доступность = ЗначениеЗаполнено(Текст);
КонецПроцедуры
Если же использовать при изменении, то в параметрах передается элемент поля ввода, а не текст
(9)
Данные хранятся в реквизите БазовоеЗначение
Данные хранятся в реквизите БазовоеЗначение
&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
Оп = Новый ОписаниеОповещения("ОбработатьВводЗначения", ЭтотОбъект);
ПоказатьВводЗначения(Оп, 1, "Сколько строк добавить?");
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВводЗначения(РезультатВвода, ДополнительныеПараметры) Экспорт
Если РезультатВвода = Неопределено Тогда
Возврат;
КонецЕсли;
Для Инд = 1 По РезультатВвода Цикл
НоваяСтрока = ЭтаФорма.ТаблицаЗнач.Добавить();
НоваяСтрока.Значение = ЭтаФорма.БазовоеЗначение + Формат(Инд, "ЧГ=0");
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Создание реквизитов
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
РеквизитПоляВвода = Новый РеквизитФормы("БазовоеЗначение",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
ДобавляемыеРеквизиты.Добавить(РеквизитПоляВвода);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применение реквизитов для формы
//Получение поля ввода БазовогоЗначения и изменение его свойств.
ПолеВвода = ЭтаФорма.Элементы.Добавить("БазовоеЗначение", Тип("ПолеФормы"));
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "БазовоеЗначение";
ЦветЗначения= Новый Цвет(148, 248, 255);
ПолеВвода.ЦветФона=ЦветЗначения;
ПолеВвода.ПодсказкаВвода="Укажите базовый текст";
ПолеВвода=" " ;
//Создание кнопки
КомандаЗаполнения = ЭтаФорма.Команды.Добавить("ЗаполнитьТаблицу");
КомандаЗаполнения.Заголовок = "Заполнить таблицу";
КомандаЗаполнения.Действие = "ЗаполнитьТаблицу";
КнопкаЗаполнения = ЭтаФорма.Элементы.Добавить("ЗаполнениеТаблицы", Тип("КнопкаФормы"), );
КнопкаЗаполнения.Заголовок = "Заполнить таблицу";
КнопкаЗаполнения.ИмяКоманды = "ЗаполнитьТаблицу";
//КнопкаЗаполнения.Доступность=Ложь;
Если ЗначениеЗаполнено(ПолеВвода) Тогда
КнопкаЗаполнения.Доступность = Истина;
Иначе
КнопкаЗаполнения.Доступность = Ложь;
КонецЕсли;
//ДОБАВЛЕНИЕ ТАБЛИЦЫ
// Описание таблицы значений как реквизита
МассивТипа = Новый Массив;
МассивТипа.Добавить(Тип("ТаблицаЗначений"));
// Добавление ТаблицыЗначений в массив реквизитов
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
МассивРеквизитовФормы = Новый Массив;
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТаблицаЗнач", ОписаниеТипа, "", "ТЗЗнач"));
// Создание ТаблицыЗначений с описанием колонок
КвалификаторыСтроки = Новый КвалификаторыСтроки(150);
ОписаниеЗначения = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ОписаниеВыбрано = Новый ОписаниеТипов("Булево");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Значение", ОписаниеЗначения);
ТЗ.Колонки.Добавить("Выбрано", ОписаниеВыбрано);
// ТЗ.Колонки.Добавить - можно и в цикле
// Добавление в массив реквизитов колонок ТаблицыЗначений
Для Каждого Колонка Из ТЗ.Колонки Цикл
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаЗнач"));
КонецЦикла;
// Удаление - если таблица существует
ЭлементТаблица = Элементы.Найти("ТаблицаЗнач");
Если ЭлементТаблица <> Неопределено Тогда
Элементы.Удалить(ЭлементТаблица);
Иначе
ИзменитьРеквизиты(МассивРеквизитовФормы);
КонецЕсли;
// Добавление ТаблицыЗначений на форму
ТаблицаПолейВыбора = Элементы.Добавить("ТЗЗнач", Тип("ТаблицаФормы"));
ТаблицаПолейВыбора.ПутьКДанным = "ТаблицаЗнач";
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панели
Для Каждого Колонка Из ТЗ.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ТаблицаЗнач." + Колонка.Имя;
НовыйЭлемент.Ширина = 10;
КонецЦикла;
КонецПроцедуры
Показать
Предполагаю,что можно воспользоваться дополнительной процедурой ПриИзменении,где в параметрах передать значение из ПоляВвода,и уже тут обыграть условие. В противном случае,при применении метода ПроверитьЗначение(); выдает ошибку. ЗначениеЗаполненно(); тоже не подходит,так как выдает ошибку о мутабельных переменных.
Прикрепленные файлы:
(1) Само поле ввода - это просто элемент управления, в нем нет никакого значения. Значение у вас - это реквизит формы БазовоеЗначение, его и проверяйте на заполненность при изменении поля ввода.
Для этого программно привяжите действие для поля ввода "ПриИзменении". В этом событии устанавливайте свойство доступность кнопки в зависимости от заполненности реквизита БазовоеЗначение.
Для этого программно привяжите действие для поля ввода "ПриИзменении". В этом событии устанавливайте свойство доступность кнопки в зависимости от заполненности реквизита БазовоеЗначение.
Вот это не нужно.
Можно использовать событие поля ИзменениеТекстаРедактирования
И обработчик события:
Если же использовать при изменении, то в параметрах передается элемент поля ввода, а не текст
ПолеВвода=" " ;
Если ЗначениеЗаполнено(ПолеВвода) Тогда
КнопкаЗаполнения.Доступность = Истина;
Иначе
КнопкаЗаполнения.Доступность = Ложь;
КонецЕсли;
Можно использовать событие поля ИзменениеТекстаРедактирования
ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "ПолеВводаИзменениеТекстаРедактирования");
И обработчик события:
&НаКлиенте
Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
Элементы.ЗаполнениеТаблицы.Доступность = ЗначениеЗаполнено(Текст);
КонецПроцедуры
Если же использовать при изменении, то в параметрах передается элемент поля ввода, а не текст
(9)
Данные хранятся в реквизите БазовоеЗначение
Данные хранятся в реквизите БазовоеЗначение
&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
Оп = Новый ОписаниеОповещения("ОбработатьВводЗначения", ЭтотОбъект);
ПоказатьВводЗначения(Оп, 1, "Сколько строк добавить?");
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВводЗначения(РезультатВвода, ДополнительныеПараметры) Экспорт
Если РезультатВвода = Неопределено Тогда
Возврат;
КонецЕсли;
Для Инд = 1 По РезультатВвода Цикл
НоваяСтрока = ЭтаФорма.ТаблицаЗнач.Добавить();
НоваяСтрока.Значение = ЭтаФорма.БазовоеЗначение + Формат(Инд, "ЧГ=0");
КонецЦикла;
КонецПроцедуры
Показать
Дружище,слушай,еще момент,я не могу понять как мне описывать свойство для колонки Значения,чтобы она была нередактируемой. Я полагаю,что за это отвечает свойство "ТолькоПросмотр",но когда,Я пытаюсь его дать данной колонке,мне выдаёт ошибку о том,что ПолеОбъектаНеОбнаружено. Почему методы,которые я пытаюсь применять к элементам формы,воспринимаются за объекты,можешь примерно объяснить,что я делаю не так,ибо это уже не первый случай.
(10)Я нашел нужное свойство,пока вроде все получается,но у меня теперь трудность следующего характера,я сделал так,чтобы булево представлялось в виде флага,как будет грамотнее описать условие из пункта 6?
Вот пока код,который получился:
Вот пока код,который получился:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Создание реквизитов
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
РеквизитПоляВвода = Новый РеквизитФормы("БазовоеЗначение",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
ДобавляемыеРеквизиты.Добавить(РеквизитПоляВвода);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применение реквизитов для формы
//Получение поля ввода БазовогоЗначения и изменение его свойств.
ПолеВвода = ЭтаФорма.Элементы.Добавить("БазовоеЗначение", Тип("ПолеФормы"));
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "БазовоеЗначение";
ЦветЗначения = Новый Цвет(148, 248, 255);
ПолеВвода.ЦветФона=ЦветЗначения;
ПолеВвода.ПодсказкаВвода="Укажите базовый текст";
//Создание кнопки
КомандаЗаполнения = ЭтаФорма.Команды.Добавить("ЗаполнитьТаблицу");
КомандаЗаполнения.Заголовок = "Заполнить таблицу";
КомандаЗаполнения.Действие = "ЗаполнитьТаблицу";
КнопкаЗаполнения = ЭтаФорма.Элементы.Добавить("ЗаполнениеТаблицы", Тип("КнопкаФормы"), );
КнопкаЗаполнения.Заголовок = "Заполнить таблицу";
КнопкаЗаполнения.ИмяКоманды = "ЗаполнитьТаблицу";
КнопкаЗаполнения.Доступность = Ложь;
//Добавление фукнции доступности кнопки
ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "ПолеВводаИзменениеТекстаРедактирования");
//ДОБАВЛЕНИЕ ТАБЛИЦЫ
// Описание таблицы значений как реквизита
МассивТипа = Новый Массив;
МассивТипа.Добавить(Тип("ТаблицаЗначений"));
// Добавление ТаблицыЗначений в массив реквизитов
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
МассивРеквизитовФормы = Новый Массив;
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТаблицаЗнач", ОписаниеТипа, "", "ТЗЗнач"));
// Создание ТаблицыЗначений с описанием колонок
КвалификаторыСтроки = Новый КвалификаторыСтроки(150);
ОписаниеЗначения = Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(150));
ОписаниеВыбрано = Новый ОписаниеТипов("Булево");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Значение", ОписаниеЗначения);
ТЗ.Колонки.Добавить("Выбрано", ОписаниеВыбрано);
// ТЗ.Колонки.Добавить - можно и в цикле
//Если ЭтаФорма.Элементы.ТЗ.ТекущаяКолонка.Имя = "Значение" Тогда
// Предупреждение = ("Колонка защищена от изменений !");
// Отказ=Истина;
//КонецЕсли;
// Добавление в массив реквизитов колонок ТаблицыЗначений
Для Каждого Колонка Из ТЗ.Колонки Цикл
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаЗнач"));
КонецЦикла;
// Удаление - если таблица существует
ЭлементТаблица = Элементы.Найти("ТаблицаЗнач");
Если ЭлементТаблица <> Неопределено Тогда
Элементы.Удалить(ЭлементТаблица);
Иначе
ИзменитьРеквизиты(МассивРеквизитовФормы);
КонецЕсли;
// Добавление ТаблицыЗначений на форму
ТаблицаПолейВыбора = Элементы.Добавить("ТЗЗнач", Тип("ТаблицаФормы"));
ТаблицаПолейВыбора.ПутьКДанным = "ТаблицаЗнач";
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панели
Для Каждого Колонка Из ТЗ.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора );
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ТаблицаЗнач." + Колонка.Имя;
НовыйЭлемент.Ширина = 10;
Если НовыйЭлемент.Имя = "Значение" Тогда
НовыйЭлемент.ТолькоПросмотр = Истина;
Иначе НовыйЭлемент.ТолькоПросмотр = Ложь;
КонецЕсли;
Если НовыйЭлемент.Имя = "Выбрано" Тогда
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
КонецЕсли;
////Если НовыйЭлемент.Вид.ПолеФлажка = Истина Тогда
//КонецЕсли;
КонецЦикла;
КонецПроцедуры
//Обработчик события доступности кнопки
&НаКлиенте
Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
Элементы.ЗаполнениеТаблицы.Доступность = ЗначениеЗаполнено(Текст);
КонецПроцедуры
//Обработчик нажатия на кнопку
&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
Оп = Новый ОписаниеОповещения("ОбработатьВводЗначения", ЭтотОбъект);
ПоказатьВводЗначения(Оп, 1, "Сколько строк добавить?");
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВводЗначения(РезультатВвода, ДополнительныеПараметры) Экспорт
Если РезультатВвода = Неопределено Тогда
Возврат;
КонецЕсли;
Для Инд = 1 По РезультатВвода Цикл
НоваяСтрока = ЭтаФорма.ТаблицаЗнач.Добавить();
НоваяСтрока.Значение = ЭтаФорма.БазовоеЗначение + Формат(Инд, "ЧГ=0");
КонецЦикла;
КонецПроцедуры
ПоказатьПрикрепленные файлы:
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот