Имя: Пароль:
1C
1С v8
УФ. Проверка заполнения данных регистра сведений
,
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) нет, я выводил картинку мужика в черном костюме и черных очках, который грозил пальцем после системного сообщения.

девочки стали думать и бояться вводить чушь в данных, правда иногда это делали и когда я спрашивал "зачем?" олтвечали - на мужика посмотреть)
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс