Проверка заполненности ЭЛЕМЕНТА управляемой формы #547691


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

В этой группе 1С