Имя: Пароль:
1C
1С v8
Проверка заполненности ЭЛЕМЕНТА управляемой формы
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
апну. Может сегодня у кого-нибудь будут новые идеи.