Имя: Пароль:
1C
 
кто как решал проблему наличия реквизита?
0 Славко
 
07.02.05
20:08
я понимаю поиск, там архив и т.п., но все же есть 3 варианта у меня сразу в голове:
1. как в типовых, но там просто проверяю наличия объекта а не реквизита объекта:
Если ПустоеЗначение(<Объект.Реквизит>)=1 Тогда
// а нима реквизита то
КонецЕсли
2. Через попытку проверить
3. Вытянуть через метаданные
4. По виду субконто определять (всего 5 справочников у которых этот реквизит есть, но с другой стороны если справочники буду расширяться то переписывать потом неохота, вернее дописывать)

Для желающих понять задачу, в зависимости от типа субконто надать в бухотчеты впиндюрить колонку с каталожным номером, но как бы этот номер не нужон для тех позиций в которых его нет и не всем бухам эта колонка нужна, поэтому хочу сделать нечто универсальное, шобы подошло всем... Кроме того объект с нужным мне реквизитом могет висеть как на 1-м, так и на 2-м, так и на 3-м субконто, так что думаю кроме как проверить наличие этого спецфического реквизита никак
1 Волшебник
 
модератор
07.02.05
20:18
Метод Рупора - через попытку.
2 Славко
 
07.02.05
20:21
хм.....
буду знать шо это метод Рупора, авторство остальных методов будет озвучено?
я так понимаю шо все методы кто то када то давно придумал уже
3 SnarkHunter
 
07.02.05
20:30
3 или 4...
4 Славко
 
07.02.05
20:48
да, но шото мне подсказывает шо способ Рупорта Абсурда займет меньше всего кода, да и наверно по скорости будет бырее...
5 Славко
 
07.02.05
20:52
хотя нет, через метаданные таки наверно луче...
блин, на чем же остановиться то?
6 427
 
07.02.05
20:56
быстрее всего через метаданные - ибо попытка - это построение блока обработки исключения, причем всегда... а если это воткнуть в цикл...

в типовых, кстати, делается через метаданные

функция из ТиС

Функция глЕстьРеквизитШапки(ИмяРеквизита, ВидДокумента) Экспорт    
   
   
   Если ПустоеЗначение(ИмяРеквизита) = 1 Тогда
       Возврат 0;
   
   ИначеЕсли Метаданные.ОбщийРеквизитДокумента(ИмяРеквизита).Выбран() = 1 Тогда
       Возврат 1;
       
   ИначеЕсли ПустоеЗначение(ВидДокумента) = 1 Тогда
       Возврат 0;
   
   ИначеЕсли Метаданные.Документ(ВидДокумента).РеквизитШапки(ИмяРеквизита).Выбран() = 1 Тогда
       Возврат 1;
       
   Иначе
       Возврат 0;
   КонецЕсли;
   
КонецФункции //глЕстьРеквизитШапки()
7 Славко
 
07.02.05
21:02
угу, я просто сначала на в типовых смотрел на глВыбранЛи()
ща подрехтую на глЕстьРеквизит()
на проверку любого объекта и вперед и с пестней...
а а шобы было ваще универсально наверное придется помудрувать с шаблоном, шобы получить:
Метаданные.<НаименованиеОбъекта>.(<ВидОбъекта>).<РеквизитОбъекта>. ...
8 Таня
 
07.02.05
21:06
(6) а это ведь можно использовать для составления списка видов документа в которых есть реквизит договор?
9 Таня
 
07.02.05
21:07
а что надо дописать, чтобы получилось то что я хочу в (8)?
10 Славко
 
07.02.05
21:07
(8) для че хо, для того и юзай...
11 427
 
07.02.05
21:11
(8)

О сколько нам
Открытий чудных
Готовит просвещенья дух...

                                       А.С. Пушкин


P.S. реквизит может называться по другому.... Проверять надо тип реквизита - является ли реквизит справочником типа договора
12 romix
 
07.02.05
21:23
(8) см. metadata.als.
Там прикольные примеры.
Автор тут постом выше, скрывается под ником 427. :-)
13 Славко
 
07.02.05
21:29
о, так то сам Моисеенко...
преклоняю голову, гарну штуку написал
14 Guk
 
07.02.05
21:48
(11) Не поминай Пушкина в суе ;)...
15 Славко
 
07.02.05
22:05
общими усилиями родилось 2 функкции, може сгодится кому:
// ===============================
Функция глЕстьРеквизитСправочника(ИмяРеквизита,ВидСправочника) Экспорт
   Перем Реквизит;    
   Если (ПустоеЗначение(ВидСправочника) = 1) ИЛИ
        (ПустоеЗначение(ИмяРеквизита) = 1) Тогда
       Возврат Нет;
   КонецЕсли;
   Реквизит=Метаданные.Справочник(ВидСправочника).Реквизит(ИмяРеквизита);
   Возврат ?(Реквизит.Выбран()=1, Да, Нет );
КонецФункции //глЕстьРеквизитСправочника

// ===============================
Функция глЕстьРеквизит(Объект,Реквизит) Экспорт    
   Реквизит=0;
   Если ТипЗначенияСтр(Объект)="Справочник" Тогда
       Реквизит=Метаданные.Справочник(Объект.Вид()).Реквизит(Реквизит).Выбран();
   ИначеЕсли (ТипЗначенияСтр(Объект)="Документ") или
             (ТипЗначенияСтр(Объект)="ГрупповойКонтекст") Тогда
       Если (Метаданные.Документ(Объект.Вид()).РеквизитШапки(Реквизит).Выбран()=1) или
            (Метаданные.ОбщийРеквизитДокумента(Реквизит).Выбран()=1) Тогда
           Реквизит=1;
       ИначеЕсли Метаданные.Документ(Объект.Вид()).РеквизитТабличнойЧасти(Реквизит).Выбран()=1 Тогда
           Реквизит=1;
       КонецЕсли;
   КонецЕсли;
   Возврат ?(Реквизит=1, Да, Нет );
КонецФункции //глЕстьРеквизит
16 SnarkHunter
 
07.02.05
22:08
(15)Еще бывают реквизиты типа Справочник и Неопределенный...
17 Guk
 
07.02.05
22:09
Я думаю можно дать тебе весомое имя ;). Слава - изобретатель велосипедов! ;)
Хотя ко всему, лучше дойти самому...
18 Славко
 
07.02.05
22:14
(16) не, неопределенный это он в объекте, а када он идет в работу, то он идет туда апосля назначитьтип и назначить вид...
(17) ну как те сказать, я просто слегка подлампичил оригинал, который мне прислали:
Функция ЕстьЛиРеквизит(Объект,Реквизит) Экспорт    
   Если ТипЗначенияСтр(Объект)="Справочник" Тогда
       Возврат Метаданные.Справочник(Объект.Вид()).Реквизит(Реквизит).Выбран();
   ИначеЕсли (ТипЗначенияСтр(Объект)="Документ") или
             (ТипЗначенияСтр(Объект)="ГрупповойКонтекст")
   Тогда
       Если (Метаданные.Документ(Объект.Вид()).РеквизитШапки(Реквизит).Выбран() = 1) или
            (Метаданные.ОбщийРеквизитДокумента(Реквизит).Выбран() = 1) Тогда
           Возврат 1;
       ИначеЕсли Метаданные.Документ(Объект.Вид()).РеквизитТабличнойЧасти(Реквизит).Выбран()=1 Тогда
           Возврат 2;
       КонецЕсли;
   КонецЕсли;
   Возврат 0;
КонецФункции
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс