Имя: Пароль:
1C
1С v8
как узнать наименование реквизита по типу данных?
0 napagokc
 
07.08.12
08:48
решил выделить в отдельную функцию проверку заполненности реквизитов на форме. В функцию планирую передавать массив из реквизитов, а в функции определять заполнен этот реквизит или нет.
Так вот, если реквизит не заполнен, то элемент массива будет содержать пустую ссылку на справочник, например. Эта информация мало пригодна для вывода сообщения, показывающего, какой реквизит не заполнен. Реквизиты имеют говорящее название, а название справочников толком ни о чем не говорит.
Можно ли как-то в моей функции достучаться до наименования передаваемого реквизита? Массив одномерный.

Пример:

Функция ПроверкаЗаполненностиРеквизитов(М)
   Если ТипЗнч(М) <> Тип("Массив") Тогда
       Сообщить("Не верный тип данных передаваемого параметра: " + ТипЗнч(М), СтатусСообщения.Информация);
       Возврат Ложь;
   КонецЕсли;
   
   Для каждого тек Из М Цикл
       Если обЗначениеНеЗаполнено(тек) Тогда // Функция общего модуля, проверяет заполненность любого типа данных
           Сообщить("Не выбран " + тек + "!", СтатусСообщения.Информация);
           Возврат Ложь;
       КонецЕсли;
   КонецЦикла;
   
   Возврат Истина;
КонецФункции

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   //...
   М = Новый Массив;
   М.Добавить(Товар);
   М.Добавить(Склад);
   М.Добавить(ЦФУ);
   
   Отказ = ПроверкаЗаполненностиРеквизитов(М);
   //...
КонецПроцедуры


Повторюсь, интересно именно наименование реквизита. То есть, если реквизит содержит пустое значение, то наименование у значения этого реквизита будет пустая строка. Например, если реквизит "Склад" не заполнен, то в мою функцию для этого реквизита попадет пустая ссылка на элемент справочника Склады. Вытаскивать что-либо из этого справочника не имеет смысла, т.к. в документе есть ссылка на этот справочник и в шапке, и в табличной части, и подобная инфа не даст никакой информации где именно не заполнен склад. Хочу достучаться именно до наименования передаваемого реквизита. Можно это как-то сделать, не усложняя в дальнейшем работу с моей функцией? К примеру, можно, конечно, передавать двумерный массив - ссылу и наименование реквизита. Но, ИМХО, это начисто уберет всю прелесть использования подобной функции...
1 butterbean
 
07.08.12
08:50
передавай структуру с именами и значениями
2 Steel_Wheel
 
07.08.12
08:51
в массив имена передавай, значения получай в функции Объект[ИмяРеквизита]
3 butterbean
 
07.08.12
08:51
что можно сказать по типу строка например?? или если в форме будет два реквизита с одинаковым типом??
4 aleks-id
 
07.08.12
08:54
не взлетит. у тебя логика функции совершенно противоположна
5 Rovan
 
гуру
07.08.12
08:55
(+2) согласен
6 napagokc
 
07.08.12
08:55
(1), (2), спасибо за идею, сейчас попробую. Скорее всего всё получится. ;)
7 aleks-id
 
07.08.12
08:56
(6) не получится. твоя функция работает неправильно
8 napagokc
 
07.08.12
09:06
В общем, подправил:

Функция ПроверкаЗаполненностиРеквизитов(М)
   Если ТипЗнч(М) <> Тип("Массив") Тогда
       Сообщить("Не верный тип данных передаваемого параметра: " + ТипЗнч(М), СтатусСообщения.Информация);
       Возврат Ложь;
   КонецЕсли;
   
   Для каждого тек Из М Цикл
   Об = ЭтотОбъект[тек];
       Если обЗначениеНеЗаполнено(Об) Тогда // Функция общего модуля, проверяет заполненность любого типа данных

           Сообщить("Не выбран " + тек + "!", СтатусСообщения.Информация);
           Возврат Ложь;
       КонецЕсли;
   КонецЦикла;
   
   Возврат Истина;
КонецФункции

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   //...

   М = Новый Массив;
   М.Добавить("Товар");
   М.Добавить("Склад");
   М.Добавить("ЦФУ");
   
   Отказ = ПроверкаЗаполненностиРеквизитов(М);
   //...

КонецПроцедуры

Для "шапки" все работает корректно, думаю, как теперь проверить заполненность реквизитов табличной части...
9 aleks-id
 
07.08.12
09:15
твоя функция работает наоборот. если заполнить все реквизиты то она не даст провести докумень
10 aleks-id
 
07.08.12
09:16
+(9) и если хоть один реквизит не заполнен, то даст его провести
11 napagokc
 
07.08.12
09:21
(9), (10), А, ну, да. Но не суть ))) Возврат из функции исправить не сложно
12 Serg_1960
 
07.08.12
09:24
(имхо) в типовых конфигурациях есть нужный ТС функционал проверки заполнения обязательных реквизитов - велосипедостроение не требуется :)
13 Maxus43
 
07.08.12
09:30
велогонка чтоли?)
14 Maxus43
 
07.08.12
09:33
// Процедура проверяет реквизиты на заполненность
   // Если хотя бы один из них не заполнен то Отказ становится Истина и в сообщении
   // пишется о незаполненном реквизите
   // Паремтры:
   // ОбъектПроверки - тот объект реквизиты которого нужно проверить на заполненность
   // СписокИменРеквизитов - список реквизитов для проверки (В значении - Имя реквизиты,
   //                                        в представлении - строковое название реквизита)
   // Отказ - есть ли незаполненный реквизит или нет
   // ЖесткаяПроверка - Булевский параметр. В случае Ложь пишется только информация о незаполненных реквизитах, а Отказ не изменяется
   Процедура ПроверитьЗаполнениеРеквизитов(ОбъектПроверки, СписокИменРеквизитов, Отказ, ЖесткаяПроверка = Истина) Экспорт
15 napagokc
 
07.08.12
10:09
омг... У нас конфа собственной разработки, с нуля. Может кто-нить кинуть тело функции, если не сложно?
16 Maxus43
 
07.08.12
10:10
БСП нет?
17 patapum
 
07.08.12
10:13
а просто поставить у реквизита объекта свойство Проверка заполнения слабо? писать ничего не надо...
18 Defender aka LINN
 
07.08.12
10:13
(16) В БСП такой куйни нет, т.к. она на 8.2, а там это в платформу встроено.
19 Maxus43
 
07.08.12
10:14
(18) в древней БСП есть)
20 Reset
 
07.08.12
10:23
Тело там такое тело..
Для каждого СписсокРекв
 Если Не Заполнено(Объект[.имя])(
   сообщить( Ахтунг в .Значение!
   Отказ=Истина
21 Reset
 
07.08.12
10:24
.Ключ а не имя точнее
22 Reset
 
07.08.12
10:24
А, там список. Значит Значение и представление
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.