|
УФ. Проверка заполнения данных регистра сведений | ☑ | ||
---|---|---|---|---|
0
Humandra
12.03.12
✎
10:47
|
А что, я что-то не догоняю, или придется код в двух местах писать?
Проблема следующая: надо гарантировать, что в регистр сведений не попадут "неправильные" данные, как интерактивно, так и программно. У модуля набора записей есть метод "ОбработкаПроверкиЗаполнения". Но похоже, что он вызывается только в том случае, если пользователь вводит данные в форме регистра. У меня же пользователь вводит данные в форме совсем другого объекта, а из него программно идет запись в регистр. Хочется следующего: 1) чтобы пользователю в обоих формах (и регистра, и другого объекта) как в штатном метода - подсказывало, в каком именно поле ошибка 2) если другой программист сделает свою обработку, и в ней не пропишет защиту - чтобы регистр не дал в себя записать некорректные данные Т.е. было бы хорошо, если бы в модуле объекта был "ОбработкаПроверкиЗаполнения", которая вызывалась и интерактивно, и программно. А в модуле формы было бы событие, которое позволило бы связать реквизит формы и реквизит объекта, в котором ошибка. Такой возможности нет? Сейчас приходит в голову только такой способ: Процедура МояПроцедураПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты, ИсточникВызова) // Код проверки Если Неверно Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) МояПроцедураПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты, "ОбработкаПроверкиЗаполнения"); КонецПроцедуры Процедура ПередЗаписью(Отказ) МояПроцедураПроверкиЗаполнения(Отказ, , "ПередЗаписью"); КонецПроцедуры Но при таком подходе будет лезть системное сообщение "Не удалось записать: Имя регистра", а не только мое сообщение. Есть идеи лучше? |
|||
1
Humandra
12.03.12
✎
11:10
|
Много букв?
|
|||
2
vmv
12.03.12
✎
11:14
|
ага 8-марта поскриптум так сказать, можно повторить (0), но сократив суть в 5 раз?
|
|||
3
vmv
12.03.12
✎
11:17
|
что мешает вызывать метод ПроверитьЗаполнение() при интерактивных действиях, который и вызовет ваш ОбработкаПроверкиЗаполнения
|
|||
4
vmv
12.03.12
✎
11:20
|
код в (0) уничтожить и сжечь, зачем портить мне вкус!
|
|||
5
Humandra
12.03.12
✎
11:23
|
(2) Попробую.
Есть несколько форм, из которых ведется запись в один и тот же регистр. Часть форм - формы регистра, часть форм - формы других объектов, в т.ч. обработок. Надо: 1) обеспечить проверку корректности заполнения данных 2) указать пользователю в формах на реквизиты, в которых ошибка заполнения 3) не дублировать код Предлагается как вариант код в (0), но в этом случае лезет системная ошибка "Не удалось записать: Имя регистра", чего бы не хотелось. (3) Не поняла. Предлагаете еще в модуле формы вызывать МояПроцедураПроверкиЗаполнения(), где программно добавляется запись в регистр? (4) А что вы предлагаете? |
|||
6
vmv
12.03.12
✎
11:23
|
ПроверитьЗаполнение() - Это МЕТОД, который можно вызывать как на основе анализа интерактивных действий, так и при любых определенных условиях в МаяПроцедура!
ОбработкаПроверкиЗаполнения - это системное событие объекта, которое возникает при записи его чего-то там и при вызове МЕТОДА ПроверитьЗаполнение() что может быть проще в этой элементарной логике, нет же надо прикрутить рющки, плющки и прочую хрень, ех |
|||
7
Humandra
12.03.12
✎
11:24
|
(6) А! Тьфу, у меня, оказывается, тоже СП украли :(
|
|||
8
Humandra
12.03.12
✎
11:24
|
(6) Не нашла этот метод :)
|
|||
9
Humandra
12.03.12
✎
11:27
|
Хотя стоп. А если мой абстрактный коллега-разява забудет вызвать ПроверитьЗаполнение() в своем коде? Все равно должен быть код как в (0), получается. Но просто вызывав ПроверитьЗаполнение() интерактивно, я избавляюсь от системной ошибки.
|
|||
10
0xFFFFFF
12.03.12
✎
11:30
|
(0)
Если Неверно Тогда Отказ = Истина; КонецЕсли; фи... Отказ = Отказ или Неверно; - так кошернее :) |
|||
11
0xFFFFFF
12.03.12
✎
11:31
|
а если по теме, то надо юзать ПередЗаписью
|
|||
12
vmv
12.03.12
✎
11:32
|
Если Неверно Тогда
Отказ = Истина; КонецЕсли; КонецПроцедуры пока не уточните, как в итоге образуется булевая переменная "Неверно", то дальнейшее обсуждение бесполезно, если оно ввобще имеет смысл далее. Ведь в РС невозможно записать неуникалные измерения вообщее или на дату в случае периодического. Значит ваше "Неверно" контролирует корректность(уникальность) либо периода, либо набора ресурсов. озвучивайте, позовем лошадь - она подумает, у нее голова большая |
|||
13
Humandra
12.03.12
✎
11:35
|
(10) Не фи, а это просто сокращение реального кода.
Было так: Если НеверныйРеквизит() Тогда ДелатьЭто(); КонецЕсли; (12) Неверно - это просто для упрощения примера. На самом деле там идет проверка на заполнение реквизита конкретными значениями в случае, если другой реквизит заполнен каким-то конкретным образом. |
|||
14
vmv
12.03.12
✎
11:37
|
(13) если я буду далее продолжать обсуждении этой темы, то у меня будет нервный срыв.
|
|||
15
Humandra
12.03.12
✎
11:38
|
(14) Сочувствую, и рекомендую не запускать болезни настолько возбудимой психики - это может плохо кончиться.
|
|||
16
Humandra
12.03.12
✎
11:43
|
(14) А теперь по теме: ну что вам опять не понравилось, а? Хотите конкретики? Ну, к примеру, проверка такого условия: "Если контрагент, которому ведется продажа - сам по себе является поставщиком - то тариф может быть только из группы "тарифы для перепродажи". Это не совсем точное условие, потому что если разжевывать - то придется объяснять предметку. Но примерно соответствует.
|
|||
17
vmv
12.03.12
✎
11:44
|
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
просто так называется и не надо понимать ее буквально как она называется. Основное назначение этого обработчика системного события - ПЕРЕОПРЕДЕЛИТЬ стандартно установленные в конфигураторе правила проверки, а НЕ просто ПРОВЕРИТЬ. т.е. в этом обработчике можно отменить проверку реквизита, удалив его из коллекции ПроверяемыеРеквизиты, или назначить добавив туда. Сам обработчик ОбработкаПроверкиЗаполнения не служить для Проверки, а лишь меняет правила и лишь его буквальный вид вводит в заблуждение неокрепшие умы. да для вашей задачи нужно использовать старый добрый обработчик ПередЗаписью(). Хотя если ваше ДелайЭто() означает не действие, а еще изменение првил, то надо его назвать ДелайЭтоПоПравилуТакНадо() или ДелайЭтоПоПравилуТакНеНадо(), тогда код станет потясающе красив и ...бесполезен) |
|||
18
Humandra
12.03.12
✎
11:49
|
(17) О... интересно. "На заборе написано... но это забор, а не ..."! :)
Т.е. если я вообще по каким-то причинам не использую галочки в конфигураторе для стандартной проверки, то я вообще не должна использовать обработчик ОбработкаПроверкиЗаполнения, так что-ли? И всегда писать свой метод, вызывая его из ПередЗаписью? Но как же опять таки то, что ПередЗаписью вызовет системную ошибку, а мне она не нужна, мне нужен мой текст ошибки + позиционирование на реквизитах? |
|||
19
Humandra
12.03.12
✎
11:53
|
(18) ДелайЭто() на самом деле значит в основном это:
Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Мой текст ошибки"; Сообщение.Поле = "МоеПоле"; Сообщение.УстановитьДанные(МоиДанные); Сообщение.Сообщить(); Отказ = Истина; ну иногда еще немного другого |
|||
20
vmv
12.03.12
✎
11:56
|
+(17)
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) - использовать для ужесточения условий проверки, добавляя туда поля(в том числе вложенные) согласно вашим условиям. Если вы не установили "галочки" "выдавать ошибку" или не добавляете в коллекцию ПроверяемыеРеквизиты имена полей, то использовать это событие наивно) вот занчит в чем главная суть - пытаться писать данные в базу и если система справедливо решает что данные не проходят проверку, то система должна молчать. мдя - это задача о двух стульях, как сразу сесть на оба, тут нужен толковый продюссер, а не аналитик) |
|||
21
Humandra
12.03.12
✎
11:57
|
(17) Почему бы мне не использовать ОбработкаПроверкиЗаполнения в любом случае? Чем частный случай ПроверяемыеРеквизиты = "" хуже переопределения уже определенных правил?
|
|||
22
Humandra
12.03.12
✎
12:00
|
(20) Вы меня где-то явно не поняли *здесь у меня должны быть вооот такие глаза*
Или я вас не поняла. Если система справедливо решает, что данные не проходят проверку, система должна не дать записать некорректные данные в регистр, это главное! И сообщить тоже должна, но я должна иметь возможность переопределить текст и метод этого сообщения. |
|||
23
vmv
12.03.12
✎
12:02
|
от системного сообщения при записи РС можно избавиться только одним способом по шагам
1. определяем по вашей МаяПроцедура, что запись некорректна 2. формируем текст сообщения и "смягчаем" проверку в ОбработкаПроверкиЗаполнения, чтобы запись прошла и записалась без системного сообщения о невозможности записи. 3. Удаляем запись 4. выдаем сообщение не слишком ли большая цена за системофобию? |
|||
24
vmv
12.03.12
✎
12:05
|
(22) )
Попытка НаборЗаписей.Записать() Исключение Сообщить("Не пущу " + МаяПроцедураСообщает() + ОписаниеОшибки()); КонецПопытки; |
|||
25
Humandra
12.03.12
✎
12:09
|
>> ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) - использовать для ужесточения условий проверки, добавляя туда поля(в том числе вложенные) согласно вашим условиям.
А я как раз и хочу ужесточить правило. Т.е. умолчательное правило = "ничего не проверять". А я хочу проверить, и если условие нарушается - не дать записать. (23) Подождите. Что-то где-то не то и не так. У меня сейчас вроде бы все работает почти так, как я хочу. ОбработкаПроверкиЗаполнения - не выдает системной ошибки при Отказ = Истина. Только мою. И ничего удалять не надо. А вот ПередЗаписью - выдает. И все же получается, надо делать как в (9). Т.е. код должен быть как в (0), но ваш совет в (6) тоже использовать надо, чтобы не дошло дело до ошибки в ПередЗаписью. Правда, тогда проверка будет выполняться дважды, что тоже плохо. Меня системофобия бы не смущала, если бы ошибка была бы не в виде сообщения с кнопкой ок. Это очень неудобно юзеру. :( |
|||
26
Humandra
12.03.12
✎
12:11
|
(24) Что-то мне так тоже не нравится :) Ибо так я загашу любую ошибку, а может у меня скуль отвалился, и система пишет "Не могу записать данные, потому что нет скуля". Тогда еще придется анализировать в попытке вид ошибки.
|
|||
27
vmv
12.03.12
✎
12:12
|
(25) ввобще-то я не тестировал это методы еще, видел только в коде.
использовал вас как бетта-тестера, зачем делать самому, если если есть человек готовый и озабоченный этой темой. теперь, согласно вашим выкладкам, я приобрел экспиренс в этой теме) |
|||
28
Humandra
12.03.12
✎
12:21
|
(27) Что-что?!!! Издеваетесь... Вот гады мистяне! :)
Я же хочу узнать, как люди пишут! Короче, надо думать дальше, что делать с двойным вызовом. Как-то проверять в ПередЗаписью, была ли уже проверка. Или принять другое решение = "забить". |
|||
29
Humandra
12.03.12
✎
12:27
|
А что, до того момента как появилась ОбработкаПроверкиЗаполнения, народ обычно просто забивал на системное сообщение, вызываемое при Отказ = Истина в ПередЗаписью? Или загашивал в Попытке (вот это, все же, ИМХО, зло)?
Или как-то по другому выкручивались таки? |
|||
30
Humandra
12.03.12
✎
12:28
|
А то я с 8.1 вообще не работала, только с 7.7, очень мало с 8.0 и 8.2 вот. Нужна инфа по практике использования.
|
|||
31
vmv
12.03.12
✎
12:30
|
(29) нет, я выводил картинку мужика в черном костюме и черных очках, который грозил пальцем после системного сообщения.
девочки стали думать и бояться вводить чушь в данных, правда иногда это делали и когда я спрашивал "зачем?" олтвечали - на мужика посмотреть) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |