|
|
|
Проверка заполненности ЭЛЕМЕНТА управляемой формы | ☑ | ||
|---|---|---|---|---|
|
0
sbabay
03.05.11
✎
10:54
|
Управляемое приложение.
Есть ОбщийМодуль, где должна происходить проверка заполненности элементов формы (ПолеВвода, Полевыбора). Т.е. по нажатию некоторой кнопки в форме должна вызваться функция общего модуля, которая вернет Истина, если все элементы заполнены. Как это сделать? Как вообще можно достать значение Элемента? |
|||
|
1
Defender aka LINN
модератор
03.05.11
✎
10:55
|
В Элементах, если что, указаны РЕКВИЗИТЫ.
|
|||
|
2
Stepa86
03.05.11
✎
10:58
|
Курим ПроверитьЗаполнение, Обработку проверки заполнения и различные свойства на реквизитах
|
|||
|
3
sbabay
03.05.11
✎
11:00
|
Ну вот, например, у меня есть два реквизита формы: Контрагент (справочник.Контрагенты) и Примечание (Строка 100)
И на форме два элемента: ИмяКонтрагента (ПутькДанным = Контрагент.Наименование) и Примечание (ПутьКДанным = Примечание). В общий модуль я могу форму (ЭтаФорма). Как поступать дальше? Что я там смогу с этим сделать? |
|||
|
4
sbabay
03.05.11
✎
11:03
|
(2) Хочется сделать универсально, т.е. чтобы это работало для любой формы, просто добавив вызов функции общего модуля. А так придется писать "ОбработкаПроверкиЗаполнения" в каждой форме
|
|||
|
5
unf13
03.05.11
✎
11:13
|
(4) а зачем писать "в каждой форме" ? у тебя какая-то нестандартная обработка проверки заполнения? Просто протыкал в конфигураторе нужные реквизиты, свойство "проверка заполнения - выдавать ошибку", и все.
|
|||
|
6
sbabay
03.05.11
✎
11:16
|
(5) Тут немного другой механизм предполагается.
Один СуперПользователь (Администратор, например). Заполняет отмечает галочками те элементы формы и сохраняет эти настройки. Далее остальные пользователи работают уже на основе этих данных. Если какому-то элементу формы админ проставил обязательность заполнения, то они должны его заполнить. |
|||
|
7
bsd2008
03.05.11
✎
11:23
|
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
|
|||
|
8
Defender aka LINN
модератор
03.05.11
✎
11:25
|
(6) и чО? Для проверки заполнения событие имеется.
|
|||
|
9
sbabay
03.05.11
✎
11:36
|
(8) по примеру из (3) я должен буду написать примерно такое:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Если Не ЗначениеЗаполнено(Контрагент.Наименование) Тогда Сообщить("Не заполнено имя контра!"); КонецЕсли Если Не ЗначениеЗаполнено(Примечание) Тогда Сообщить("Не заполнено примечание!"); КонецЕсли КонецПроцедуры Так? Я же не хочу писать один и тот же код во всех формах, а хочу вызвать так: МойОбщийМодуль.ПроверитьЗаполненностьРеквизитов( ПроверяемаяФорма, СписокПроверяемыхПолей); |
|||
|
10
sbabay
03.05.11
✎
11:36
|
(7) это к чему?
|
|||
|
11
Defender aka LINN
модератор
03.05.11
✎
11:42
|
(9) Нет. Такого писать не надо.
"Я же не хочу писать один и тот же код во всех формах, а хочу вызвать так" - покажи пальцем - кто тебе мешает? |
|||
|
12
sbabay
03.05.11
✎
11:51
|
(11)
В этом общем модуле пишем: &НаКлиенте Функция ПроверитьЗаполненностьРеквизитов( ПроверяемаяФорма, СписокПроверяемыхПолей) Для каждого текИмяПроверяемогоЭлемента Из СписокПроверяемыхПолей Цикл текЭлемент = ПроверяемаяФорма.Элементы[текИмяПроверяемогоЭлемента.Значение]; //!!! КАК кот тут проверить заполненность? КонецЦикла; КонецФункции |
|||
|
13
Вовчик
03.05.11
✎
11:59
|
(12)
а НЕ ЗначениеЗаполнено(текЭлемент) не канает? |
|||
|
14
sbabay
03.05.11
✎
12:02
|
текЭлемент - это Элемент (не реквизит) формы, поэтому нет, не канает.
|
|||
|
15
Defender aka LINN
модератор
03.05.11
✎
12:03
|
(12) "СписокПроверяемыхПолей" - тебя ни на какие мысли не наводит?
И в общих модулях &НаКлиенте, &НаСервере и прочее - не используется. |
|||
|
16
Вовчик
03.05.11
✎
12:06
|
(14) а ты пробовал? сейчас лень проверять, но вроде как этот метод проверяет любое не мутабельное значение.
|
|||
|
17
Defender aka LINN
03.05.11
✎
12:07
|
(16) ЗначениеЗаполнено(ПолеВвода)? И что ж оно должно сообщить?
|
|||
|
18
sbabay
03.05.11
✎
12:07
|
(15) а на что может натолкнуть "СписокПроверяемыхПолей"? Честно, не понимаю. Там хранятся строки - имена элементов формы. И все.
А НаСервере и НаКлиенте в общих модулях используется, если стоят галки "Клиент" и "Сервер" (у меня именно такой) |
|||
|
19
sbabay
03.05.11
✎
12:08
|
(16) а это как раз-таки и есть мутабельное значение. Сейчас попробовал.
|
|||
|
20
Defender aka LINN
модератор
03.05.11
✎
12:24
|
(18) ЗАБУДЬ, пеляйт, про элементы формы. Нет их, не существует, пеляйт. Там хранятся имена РЕКВИЗИТОВ (еще раз обрати, пеляйт, внимание - НЕ ЭЛЕМЕНТОВ, а РЕКВИЗИТОВ) для проверки. Есть элемент в этом массиве - реквизит (не элемент формы, ты помнишь, да?) будет проверяться. нет элемента - не будет. Дальше сам додумаешься?
|
|||
|
21
Вовчик
03.05.11
✎
12:30
|
(20) не так он не поймет надо носом ткнуть)))
sbabay убери в (12) точку и слово "Элементы" |
|||
|
22
sbabay
03.05.11
✎
12:57
|
Давайте еще раз.
Есть обработка, в которой должно происходить проверка заполнения. У этой формы есть два реквизита: Контрагент (справочник.Контрагенты) и Примечание (Строка 100) И на форме два элемента: ИмяКонтрагента (ПутькДанным = Контрагент.Наименование) и Примечание (ПутьКДанным = Примечание). После того как админ установил обязательность заполнения элементов, сохранился СписокПроверяемыхПолей, который состоит из 2-х элементов-строк: "ИмяКонтрагента" и "Примечание" Теперь в общем модуле вы советуете сделать проверку вот так: &НаКлиенте Функция ПроверитьЗаполненностьРеквизитов( ПроверяемаяФорма, СписокПроверяемыхПолей) Для каждого текИмяПроверяемогоЭлемента Из СписокПроверяемыхПолей Цикл Если НЕ ЗначениеЗаполнено(пФорма[текЭлемент.текИмяПроверяемогоЭлемента.Значение]) Тогда Сообщить("Не заполнено!") КонецЕсли; КонецЦикла; КонецФункции Но такое пройдет только для "Примечания", для элемента "ИмяКонтрагента" такое не пройдет, т.к. данные хранятся в реквизите "Контрагент.Наименование" |
|||
|
23
sbabay
03.05.11
✎
13:09
|
(20) Я кажется понял, что ты имеешь ввиду.
Если я буду использовать: Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) то про "ПроверяемыеРеквизиты" откуда у меня возьмутся? У меня есть только то, что заполнил СуперПользователь - а он отметил те ЭЛЕМЕНТЫ формы, которые должны быть заполнены. |
|||
|
24
sbabay
03.05.11
✎
13:10
|
(21) Да, ткни, пожалуйста.
|
|||
|
25
Вовчик
03.05.11
✎
13:39
|
(24) данные храняться в реквизите Контрагент, а если у тебя элемент формы ИмяКонтрагента связан с Контрагент.Наименование то пользователь все равно его ввести не может.
Короче тыкаю пальцем. В модуле формы &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) МассивРеквизитов = Новый Массив; МассивРеквизитов.Добавить(Реквизит1); МассивРеквизитов.Добавить(Объект.Клиент); РаботаСДокументами.ПроверкаЗаполнения(МассивРеквизитов,Отказ); КонецПроцедуры В общем модуле Процедура ПроверкаЗаполнения СтруктураРеквизитов,Отказ)Экспорт Для каждого элемент из Структурареквизитов Цикл Если НЕ ЗначениеЗаполнено(элемент) тогда Отказ = Истина; КонецЕсли; КонецЦикла КонецПроцедуры Короче форму даже передавать не надо, простопередаешь список реквизитов |
|||
|
26
sbabay
03.05.11
✎
13:49
|
(25) Почему это не сможет ввести ИмяКонтрагента?
Контрагент - основной реквизит обработки. Я раскрываю это дерево и перетаскиваю в элементы формы "Контрагент.Наименование" и обзываю его "ИмяКонтрагента" Про твой код. И где тут универсальность? Я ж говорил, что у меня есть только список Имен элементов. Как на основе этого напишу: МассивРеквизитов.Добавить(Объект.Клиент); ? |
|||
|
27
Вовчик
03.05.11
✎
13:58
|
(26) ты пробовар редактировать ИмяКонтрагента в режиме предприятия? только убедись что в свойствах, путь к данным у тебя именно Объект.Контрагент.наименование.
Я твоей структуры не знаю, в каком виде у тебя храниться список? Но блин неужли не сообразишь, да хотя бы если у тебя хранится только наименование реквизита, то используй Выполнить("МассивРеквизитов.Добавить("+ИмяТвоегоРеквизита+");" |
|||
|
28
Вовчик
03.05.11
✎
14:00
|
+ (27)в конце еще );
|
|||
|
29
acsent
03.05.11
✎
14:08
|
Я так и не понял зачем САМОМУ проверять заполнение реквизитов.
УправляемаяФорма (ManagedForm) ПроверитьЗаполнение (FillCheck) Синтаксис: ПроверитьЗаполнение() Возвращаемое значение: Тип: Булево. Истина - ошибок не обнаружено, Ложь - в противном случае. Описание: Проверяет заполнение реквизитов. Для реквизитов, у которых свойство "Проверка заполнения" установлено в значение "Показывать ошибку" и реквизит не заполнен, будет сформировано сообщение об ошибке. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент. Вызов метода выполняет обращение к серверу. Примечание: Выполнение метода приводит к возникновению события ОбработкаПроверкиЗаполненияНаСервере. |
|||
|
30
acsent
03.05.11
✎
14:10
|
Но правильнее вызывать проверку объекта, а не формы
|
|||
|
31
sbabay
03.05.11
✎
14:17
|
(29) для этого надо в конфигураторе проставлять "Показывать ошибку" в реквизитах формы. К тому же к полю, путь к данным которого = "Контрагент.Наименование" так не подступишься, не залазея в справочник "Контрагенты".
Вот сделал обработку для УТ 11 с 3 реквизитами на форме и парой строк кода. http://webfile.ru/5298763 Как проверить хотя бы в этой форме, зная только имена элементов? |
|||
|
32
sbabay
03.05.11
✎
14:18
|
+(29) обязательный реквизит или нет будут решать СуперПользователи в режиме предприятия
|
|||
|
33
acsent
03.05.11
✎
14:18
|
(31) В чем проблема програмно проставить флаг у реквизитов?
|
|||
|
34
sbabay
03.05.11
✎
14:20
|
(33) Как для элемента "ИмяКонтрагента" это сделать? (путьКДанным = "Контрагент.Наименование")
|
|||
|
35
Axel2009
03.05.11
✎
14:21
|
(33) и гендира обучать как эти флажки ставить-снимать?
|
|||
|
36
Axel2009
03.05.11
✎
14:22
|
(34) а не проще в контрагенте проверять заполненность этого поля?
|
|||
|
37
sbabay
03.05.11
✎
14:24
|
(35) ну не ген. дир, а админ
(36) нет. Некоторым обязательные поля - одни, другим - другие. |
|||
|
38
Sarmen
03.05.11
✎
14:26
|
Почему бы не заполнять 'СписокПроверяемыхПолей' не именами полей, а строковыми представлениями данных?
Например поле: 'Наименование' (Путь к данным: "Контрагент.Наименование"). Тогда проверять что-то типа: Если ЗначениеЗаполнено("Контрагент.Наименование") Тогда .... |
|||
|
39
Вовчик
03.05.11
✎
14:29
|
(38) не трать силы, ему это твердят почти с самого начала.
|
|||
|
40
sbabay
03.05.11
✎
14:39
|
(39) в посте (31) я положил обработку для УТ. там 6 строчек кода. Можешь подсказать как и что мне надо поменять? Крайне желательно делать всё без "Выполнить".
|
|||
|
41
Вовчик
03.05.11
✎
14:58
|
&НаКлиенте
Процедура Проверить(Команда) МассивПроверяемыхЭлементов = Новый Массив; МассивПроверяемыхЭлементов.Добавить("Примечание"); МассивПроверяемыхЭлементов.Добавить("Контрагент.Наименование"); ПроверитьСервер(МассивПроверяемыхЭлементов); КонецПроцедуры &НаСервере Процедура ПроверитьСервер(МассивПроверяемыхЭлементов) Для каждого элПроверки Из МассивПроверяемыхЭлементов Цикл Если НЕ ЗначениеЗаполнено(ЭлПроверки) тогда Сообщить("Не заполнено поле!!!"); КонецЕсли; КонецЦикла; КонецПроцедуры //ПроверитьСервер |
|||
|
42
Axel2009
03.05.11
✎
14:59
|
(41) порадовал =)
|
|||
|
43
acsent
03.05.11
✎
14:59
|
(41) Брехня
|
|||
|
44
Вовчик
03.05.11
✎
15:02
|
мляяяяя в массив передавать без кавычек
|
|||
|
45
sbabay
03.05.11
✎
15:03
|
(41) И при каких условиях у тебя выйдет сообщение?
|
|||
|
46
Вовчик
03.05.11
✎
15:04
|
(42) (43) ошибка не моя, просто не проверил сразу
|
|||
|
47
Вовчик
03.05.11
✎
15:05
|
(45) возьми да попробуй, сообщение выходит если тыоставишь пустым ИмяКонтрагента и Примечание
|
|||
|
48
Вовчик
03.05.11
✎
15:09
|
+(47) или только пробелами заполнишь
|
|||
|
49
Axel2009
03.05.11
✎
15:10
|
(46) у вас там разделение обязанностей? =) один форум читает, другой ответы ищет? =))
|
|||
|
50
sbabay
03.05.11
✎
15:13
|
(44), (46)
Да, если передавать не строки, то всё пройдет нормально. Но я не знаю как их достать именно в таком виде. Как происходит установка СуперПользователем обязательных реквизитов. Открывается элемент справочника "НастройкаФормы", там сканируется целевая форма, подтягиваются все элементы формы (ПоляВвода). И Админ напротив каждого ставит галку обязательный или нет. Потом на основе этих данных и происходит проверка. Т.е. в целевой форме я могу поиметь только ИмяЭлемента и ПутьКДанным - а это строки |
|||
|
51
sbabay
03.05.11
✎
15:14
|
(47) В том виде как ты ответил и пробовать не надо. Поэтому и спросил
|
|||
|
52
sbabay
03.05.11
✎
15:17
|
+ Изначально я так и описывал свою проблему. На входе имею только имена проверяемых элементов и Форму. Выполняется всё в общем модуле.
Как проверить реквизиты на заполненность я знаю. |
|||
|
53
Вовчик
03.05.11
✎
15:26
|
Поясни зачем тебе нужно вводить имя контрагент, почему его нельзя выбирать из справочника? Ну мне очень интересно это.
|
|||
|
54
acsent
03.05.11
✎
15:27
|
(53) Он типа хочет супер мега универсальную хрень сделать
|
|||
|
55
acsent
03.05.11
✎
15:27
|
Которая нах никому не нужна
|
|||
|
56
Вовчик
03.05.11
✎
15:32
|
Что то сомневаюсь я в ее универсальности. Она таки как раз будет совсем не универсальна.
|
|||
|
57
sbabay
03.05.11
✎
15:33
|
(53) Будет создаваться новый элемент справочника "контрагенты"
|
|||
|
58
Вовчик
03.05.11
✎
15:38
|
Ну так создай новый реквизит ИмяКонтрагента, именно реквизит и присваивай потом Контрагент.Наименование = ИмяКонтрагента. И без проблем проверяй потом Форма["ИмяКонтрагента"].
тебе по любому так делать придется если контрагент у тебя не основной реквизит формы. |
|||
|
59
sbabay
03.05.11
✎
15:46
|
У меня как раз-таки Контрагент - основной реквизит формы
|
|||
|
60
sbabay
03.05.11
✎
16:36
|
Мегаумные модераторы чё-т притихли.
На этом форуме даже у модераторов цель - обос-ать вопрошающего? |
|||
|
61
Axel2009
03.05.11
✎
16:40
|
(60) у фсех
|
|||
|
62
sbabay
04.05.11
✎
09:09
|
апну. Может сегодня у кого-нибудь будут новые идеи.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |