Имя: Пароль:
1C
1С v8
где правильно в УФ проверять реквизиты на заполнение?
0 lanc2233
 
05.03.12
21:17
в элементе справочника нужно проверять на заполнение реквизит в зависимости от значений других реквизитов.

в каком событии (или модуле) это наиболее правильно делать в УФ?
1 DrShad
 
05.03.12
21:18
а в каком ты делаешь?
2 lanc2233
 
05.03.12
21:19
Пока ни в каком, собираюсь ПередЗаписью
3 Asmody
 
05.03.12
21:20
(0) это зависит от.  Но начинать нужно с ПередЗаписью объекта
4 DrShad
 
05.03.12
21:20
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

читайте книжки молодой человек
5 vmv
 
05.03.12
21:22
ОбработкаПроверкиЗаполнения() или как-то так в модуле объектов для этого служит, ПередЗаписью() тоже можно, но зачем, если уже сделал специальный стандарный обработчик, в котором, можно перереопределять жесткие правила заполнения в конфигураторе
6 ShoGUN
 
05.03.12
21:22
(2) ПередЗаписью выполняется на клиенте, там по идее только простейшие вещи можно сделать, в противном случае придётся обращаться к серверу, так что (4) в большинстве случаев правильней(при записи данные на сервер всё равно уходят, зачем ещё обращения к серверу плодить?)
7 Maxus43
 
05.03.12
21:22
ваще то в книжках написано - ОбработкаПроверкиЗаполнения процедура специальная. на сервере и на форме, там можно рулить параметрами проверки
8 vmv
 
05.03.12
21:24
тырено с СП,

Пример:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

// Проверим заполненность реквизита "Покупатель"
Если Не ЗначениеЗаполнено(Покупатель) Тогда
   
   // Если он не заполнен, сообщим об этом пользователю
   Сообщение = Новый СообщениеПользователю();
   Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!";
   Сообщение.Поле = "Покупатель";
   Сообщение.УстановитьДанные(ЭтотОбъект);
   Сообщение.Сообщить();
       
   // Сообщим платформе, что мы сами обработали проверку заполнения реквизита "Поставщик"
   ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Покупатель"));
   // Так как информация в документе не консистентна, то продолжать работу дальше смысла нет
   Отказ = Истина;
       
КонецЕсли;

// Сообщим платформе, что мы сами обрабатываем проверку реквизита Товар в табличной части Товары
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар"));

// Обходим строки и проверяем заполнение реквизита
Для Индекс = 0 по Товары.Количество()-1 Цикл
   СтрокаТовар = Товары.Получить(Индекс);
   Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда
       Сообщение = Новый СообщениеПользователю();
       Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара";
       Сообщение.Поле = "Товары[" + Индекс + "].Товар";
       Сообщение.УстановитьДанные(ЭтотОбъект);
       Сообщение.Сообщить();
       Отказ = Истина;
   КонецЕсли;
КонецЦикла;
   
КонецПроцедуры


"Старые обработчики" исользуемые по традиции НЕ УМЕЮТ менять правила проверки заложенные в конфе, а в этом можно ужесточить или ослабить проверку
9 vmv
 
05.03.12
21:25
(6) чушь писать не надо да)
10 ShoGUN
 
05.03.12
21:32
(9) Не чушь, но за пример спасибо. Мне до сих пор хватало штатного свойства проверки заполнения, без написания кода.
11 vmv
 
05.03.12
21:36
(10) я имел ввиду что есть и ПередЗаписью() и передзаписьюнасервере()
12 Maxus43
 
05.03.12
21:37
(10) ето просто новое в 8.2, щас видно что кодеры 8.1 юзают старые методы, как в свое время с клюшек на снеговика переходили) более гибкий механизм проверки
13 ShoGUN
 
05.03.12
21:45
(11) Я об этом и сказал.
ПередЗаписью() исполняется на клиенте, ПередЗаписьюНаСервере() - на сервере(спасибо, КО).
Что я не так сказал?
14 lanc2233
 
05.03.12
21:46
{Справочник.Номенклатура.Форма.ФормаЭлемента(188)}: Ошибка при вызове метода контекста (Удалить)
           ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("МетодПартионногоУчета"));
Несоответствие типов (параметр номер '1')
15 vmv
 
05.03.12
21:50
(14) перед входом в обработчик ставим точку и смотрим в отладчике состав "чистой" коллекции до модификации и наверняка там нет этого реквизита.

почему - думаем сами, 82 это просто)
16 Maxus43
 
05.03.12
21:51
(14) автоматом туда добавляются реквизиты у которых стоит свойство такое
17 lanc2233
 
05.03.12
21:54
Свойство стоит.

ПроверяемыеРеквизиты - тип "массив", в нем единственный элемент, со значением "Объект"
18 lanc2233
 
05.03.12
21:55
(+17) в смысле "Выдавать ошибку" стоит, это-же оно?
19 vmv
 
05.03.12
22:00
<ПроверяемыеРеквизиты>

Тип: Массив.
Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым

1. Ищем элемент данных формы, там наименование элемента может быть абы каким
2. смотрим свойство "Путь к данным" - это оно, ибо на форме может быть сколько угодно экземпляров одного и того же источника данных, а проверяються ДАННЫЕ.
20 vmv
 
05.03.12
22:03
да и свойство "Проверять" лучше задавать сразу в свойствах объекта в дереве метаданных, если это свойство объекта или в наборе реквизитов формы - справа на УФ, а не в самих элементах
21 Garkin
 
05.03.12
22:22
(0) На ИТС есть статья с картинками, называется "Где разместить собственный алгоритм, проверяющий заполнены реквизиты формы или нет?"
22 Гот
 
05.03.12
23:41
Предупреждать пользователя нужно не в момент записи, а до нее. Заранее. Выделить, звездочку поставить на форме, текст "заполни" тут в поле ввода вписать.
Порочная практика уведомления о небходимости заполнения реквизита в момент записи / проведения - одна из главных ошибок разработчиков 1С. Будьте дружелюбными, делайте дружелюбные интерфейсы.
Вы когда на страницах регистрации в интернетах видите кучу полей для заполнения - вспомните, как вас бесит, когда информация о том, что у вас не заполнен какой-нибудь address line 4 появляется после нажатия Confirm.

Так что делай сразу в форме, динамически меняя внешний вид элементов формы. Это - правильно.

И, сразу хочу сказать - при написании программ для людей отмаза "так лучше себя будет чувствовать сервер/клинт" - не катит. Уважайте пользователей.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший