Имеем форму списка справочника. Пользователь редактирует реквизит. Когда он нажимает Энтер - необходимо программно проверять введенное значение (частный случай - проверить уникальность), и в зависимости от результатов проверки, разрешить или запретить сохранение. Как это по-нормальному сделать? Что-то у меня не придумывается. Отследить нажатие энтера, и устроить проверку - можно в назначенной реквизиту процедуре. Но как в ней сказать, что это значение не годится, и запретить его сохранять?
Красиво, но не совсем то. Потому что реквизит при этом все равно сохраняется - с новым значением, или исправленным. И выходит из редактирования. А надо - чтобы было Сообщить("Вы ввели херню"); - и остаться в режиме редактирования, мол, исправляй. А по нажатию Esc - вернуться к нередактированному.
Можно, конечно, его ре-активизировать программно (прямо нельзя, через ложное закрытие можно), и подставить заранее сохраненное старое значение... Но это некрасиво ) Похоже, нет менее геморройного способа?
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 321 раз
Рейтинг: 0
Victor Skif @ Вчера, 19:51
, Проверку делайте в модуле объекта в процедуре "Перед записью" - выполняете свою проверку, если проверку не прошло пишите Отказ = Истина и ниже сообщение что пользователь ввел херню. Тогда выдаст сообщение и не даст сохранить изменения
P.S. провтыкал что это должно быть на 7-ку, на 7-ке не знаю, я с ней стараюсь не стыкаться
Сообщение отредактировал Bernet - 26.12.17, 11:13
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Пользователи
Сообщений: 96
Спасибо сказали: 8 раз
Рейтинг: 0
В ПриЗаписи делаете следующее 1. создаете объект типа текущего справочника 2. находите текущий элемент 3. сравниваете текущее значение реквизита (оно доступно в контексте формы) со значением из найденной ссылки или с допустимым значением (то что "не херня"). Не прошла проверка - СтатусВозврата(0) и Возврат. И Вы остаетесь в режиме редактирования. а по esc вернете старое значение.
у меня по такому принципу работает моя расширенная система логирования изменений в документах. Система фиксирует старое значение реквизита, новое значение реквизита и позволяет "откатить" назад все изменения внесенные в документ
Зачем так сложно? В свойствах поля ввода на закладке "Дополнительно" в поле "Формула" пишите имя Вашей процедуры, в которой будут происходить проверка введенного значения. Напр. ПроверитьЗначение(). В модуле формы:
Процедура ПроверитьЗначение() Если МойРеквизит <> НужноеЗначение Тогда Возврат; КонецЕсли; КонецПроцедуры
Повністю робочий варіант. В мене таким методом контролюється введення години в текстовий реквізит. І якщо формат години не відповідає 24:60 то по "ентеру" вийти з редагування цього реквізиту неможливо.
Группа: Пользователи
Сообщений: 96
Спасибо сказали: 8 раз
Рейтинг: 0
volodya1122 @ Сегодня, 10:03
,
серьезно? а можно код посмотреть этого чуда прям глаза открыли мне или вы тоже путаете предопределенные процедуры (например ПриЗаписи) в которых срабатывает СтатусВозврата(0) и Возврат() и процедуры срабатывающие при ЗАВЕРШЕНИИ редактирования реквизита? просто "возврат" означает выход из процедуры но никак не возврат в режим редактирования
и как интересно происходит запуск процедуры проверки корректности формата если процедура прописанная в свойствах реквизита формы стартует именно при нажатии ENTER (или потери фокуса реквизита формы - переход например по Tab или мышкой)
Стрелок @ Вчера, 14:20
, Все елементарно, Ватсон. На реквізиті (на формі) вішаємо процедуру (вводГодини()) і прописуємо маску 99:99 - Все в розділі Дополнительно. Сама процедура
Процедура вводГодини() //ГодОпл //Если СтрДлина(СокрЛП(ГодОпл))=3 тогда // ГодОпл="0"+СокрЛП(ГодОпл); Если СтрДлина(СокрЛП(ГодОпл))=4 тогда Симв2=Сред(СокрЛП(ГодОпл),2,1); Если (Симв2="1") или (Симв2="2") или (Симв2="3") или (Симв2="4") или (Симв2="5") или (Симв2="6") или (Симв2="7") или (Симв2="8") или (Симв2="9") или (Симв2="0") тогда иначе ГодОпл="0"+СокрЛП(ГодОпл); // Возврат; КонецЕсли; Иначеесли СтрДлина(СокрЛП(ГодОпл))<4 тогда Предупреждение("Ще не заповнена година розпломбування",0); Возврат; КонецЕсли;
год=Лев(СокрЛП(ГодОпл),2); хв=Прав(СокрЛП(ГодОпл),2); хв2=Лев(хв,1); хв1=Прав(хв,1); Если (хв1="1") или (хв1="2") или (хв1="3") или (хв1="4") или (хв1="5") или (хв1="6") или (хв1="7") или (хв1="8") или (хв1="9") или (хв1="0") тогда иначе Предупреждение("Невірно задано хвилини"); Возврат; КонецЕсли; Если (хв2="1") или (хв2="2") или (хв2="3") или (хв2="4") или (хв2="5") или (хв2="0") тогда иначе Предупреждение("Невірно задано хвилини"); Возврат; КонецЕсли; год1=Прав(год,1); год2=Лев(год,1); Если (год1="1") или (год1="2") или (год1="3") или (год1="4") или (год1="5") или (год1="6") или (год1="7") или (год1="8") или (год1="9") или (год1="0") тогда иначе Предупреждение("Невірно задано годину"); Возврат; КонецЕсли; Если (год2="1") или (год2="2") или (год2="0") тогда иначе Предупреждение("Невірно задано годину"); Возврат; КонецЕсли;
если Число(год)>23 тогда Предупреждение("Невірно задано годину"); Возврат; КонецЕсли;
если Число(хв)>59 тогда Предупреждение("Невірно задано хвилини"); Возврат; КонецЕсли;
ГодОпл=год+":"+хв; ВирахЧасРемонту()
КонецПроцедуры
Хоча код зовсім не ідеальний (писав давно, а переписувати не хочеться). Як все відбувається. Користувач набирає на формі годину (наприклад 12:75) нажимає "ентер" А йому на екран повідомлення"про невірні хвилини. і знову повертається до того самого реквізиту для виправлення години. Тобто при неправильній годині по "єнтер" користувач не зможе перейти до редагування слідуючого реквізиту.
Группа: Пользователи
Сообщений: 96
Спасибо сказали: 8 раз
Рейтинг: 0
volodya1122 @ Вчера, 9:38
,
1. вводим "00:88" 2. тыкаем энтер 3. получаем предупреждение 4. тыкаем мышкой на другой реквизит или Табом и вуаля- попадаем на следующий реквизит без всяких проверок
понятна логика? процедура в "дополнительно" срабатывает ТОЛЬКО если значение реквизита изменено и ТОЛЬКО один раз. Для нового срабатывания нужно чтобы реквизит опять изменился. вот поэтому и "не сработает". Конечно можно в вашей процедуре Холмс поставить ГодОпл="00:00" (эта комбинация не проверяется в коде никак). Но даже если поставить ошибочное значение реквизита то мышкой или табулятором проверка спокойно игнорируется... так что.....
ЗЫ и код не "не идеальный". он ужасный. я бы руки отрывал за такое
процедура в "дополнительно" срабатывает ТОЛЬКО если значение реквизита изменено и ТОЛЬКО один раз. Для нового срабатывания нужно чтобы реквизит опять изменился.
У меня постоянно срабатывает Видимо, какая-то другая 7.7 у меня
Стрелок @ 29.12.17, 21:56
, Спасибо за обсуждение!
Я решил вопрос в итоге следующим способом: проверку реквизита Артикул вешаю на процедуру этого реквизита ИзмАртикул(); перед этим сохраняю старое значение в переменную; если значение плохое - то возвращаю в реквизит сохраненное старое значение, и активизирую. Активизирую ректально - через ложное закрытие, других путей нет. Минус решения - плохое значение в этот момент уже записано. Если пользователь выйдет по эскейпу - оно останется. Это не критично, в целом результат удовлетворительный.
Вот код:
Перем флЛожноеЗакрытие;
// ========================= Процедура ПриЗакрытии() Если флЛожноеЗакрытие = 1 Тогда флЛожноеЗакрытие = 0; Активизировать("Артикул"); СтатусВозврата(0); Возврат; КонецЕсли; КонецПроцедуры
// ========================= Процедура АктивистАртикул() // вот через такую жопу можно активировать отсюда объект флЛожноеЗакрытие = 1; Форма.Закрыть(0); КонецПроцедуры
// ========================= Процедура ИзмАртикул() Арт = Стро(Артикул); Если Арт = "" Тогда Возврат; КонецЕсли; СтарыйАрт = Стро(ТекущийЭлемент().Артикул); // берем старое значение из записанного реквизита! Если СтарыйАрт = Арт Тогда Возврат; // не менялось ничего КонецЕсли; Если УникальностьАртикула(Арт) = 0 Тогда Предупреждение("Артикул " + Арт + " не уникален!"); // СтатусВозврата(0); // - не работает! // сохраняем старое значение // а теперь обратно активизируем Артикул = СтарыйАрт; АктивистАртикул(); КонецЕсли; КонецПроцедуры
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!