1с как найти реквизит формы по имени

(3) + Уже сам порылся :

ВсеЭлементыФормы.Найти (FormAllItems.Find)

ВсеЭлементыФормы (FormAllItems)

Найти (Find)

Синтаксис:

Найти(<Имя>)

Параметры:

<Имя> (обязательный)

Тип: Строка.

Имя элемента формы.

Возвращаемое значение:

Тип: Элемент управления; Неопределено.

Элемент управления в форме. Если элемент не найден, то возвращается значение Неопределено.

Описание:

Осуществляет поиск элемента управления с заданным именем.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.

Пример:

Процедура АктивизироватьРеквизитВФорме(ФормаДокумента) Экспорт

   // Структура — порядок активизации реквизитов.

   // Активизируется первый не заполненный.

   СтруктураРеквизитов = Новый Структура;

   СтруктураРеквизитов.Вставить(«Дата»);

   СтруктураРеквизитов.Вставить(«Номер»);

   СтруктураРеквизитов.Вставить(«Организация»);

   СтруктураРеквизитов.Вставить(«Касса»);

   СтруктураРеквизитов.Вставить(«БанковскийСчет»);

   СтруктураРеквизитов.Вставить(«Склад»);

   СтруктураРеквизитов.Вставить(«Контрагент»);

   СтруктураРеквизитов.Вставить(«Получатель»);

   СтруктураРеквизитов.Вставить(«Плательщик»);

   СтруктураРеквизитов.Вставить(«ФизЛицо»);

   Для каждого Элемент Из СтруктураРеквизитов Цикл

       // Определим, есть ли ЭУ с таким именем.

       ЭУ = ВсеЭлементыФормы.Найти(Элемент.Ключ);

       Если ЭУ  <> Неопределено Тогда

           // есть такой элемент

           Если Не ЗначениеЗаполнено(ЭУ.Значение) Тогда

               // Нашли не заполненный ЭУ.

               // Делаем его текущим и прекращаем цикл.

               ФормаДокумента.ТекущийЭлемент = ЭУ;

               Прервать;

           КонецЕсли;

       КонецЕсли;

   КонецЦикла;

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

Перейти в раздел примеры кода 1С 8.3:

При наличии в конфигурации БСП, желательно использовать метод ЕстьРеквизитИлиСвойствоОбъекта (ссылка выше). Но что делать если конфигурация нетиповая? Вариантов (в зависимости от поставленной задачи) несколько: скопировать метод из БСП, проверить на свойство объекта, проверить через поиск, использовать попытку (не рекомендуется, только как временная заплатка).

Проверка реквизита через свойство объекта в 1С 8.3:

Функция ПроверкаНаСвойствоОбъекта(Объект, ИмяСвойстваОбъекта) Экспорт

   ЕстьСвойство = Ложь;
   СтруктураОбъекта = Новый Структура(ИмяСвойстваОбъекта, Неопределено);
   ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);

   Если СтруктураОбъекта[ИмяСвойстваОбъекта] = Неопределено Тогда
       СтруктураОбъекта[ИмяСвойстваОбъекта] = Ложь;
       ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);
       Если СтруктураОбъекта[ИмяСвойстваОбъекта] <> Ложь Тогда
           ЕстьСвойство = Истина;
       КонецЕсли;
   Иначе
       ЕстьСвойство = Истина;
   КонецЕсли;

   Возврат ЕстьСвойство;// Булево

КонецФункции

Проверка реквизита через Найти в 1С 8.3:

Функция ПроверитьНаРеквизит(ИмяРеквизита, МетаданныеДок) // универсальная функция

   // Например ИмяРеквизита=»ДрагМеталлы»;
   Если МетаданныеДок.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
       Возврат Ложь;
   Иначе
       Возврат Истина;
   КонецЕсли;

КонецФункции

Функция НайтиДрагМеталлы(Номенклатура, Материал, ОсновноеСредство) // пример использования в универсальной обработке

   // если реквизит шапки
   ИмяРеквизита=«ДрагМеталлы»;
   Если Метаданные.Справочники.Товары.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
       Возврат Номенклатура.ДрагМеталлы;
   ИначеЕсли Метаданные.Справочники.Материалы.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
       Возврат Материал.ДрагМеталлы;
   ИначеЕсли Метаданные.Справочники.ОсновныеСредства.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
       Возврат ОсновноеСредство.ДрагМеталлы;
   Иначе
       Возврат Ложь;
   КонецЕсли;

   // если реквизит таб.части
   //Если НЕ ТекущаяСтрока.Свойство(ИмяРеквизита) ИЛИ НЕ ТекущаяСтрока.ДрагМеталлы Тогда
   //    ЗаполнитьЗначенияСвойств(ТаблицаДок.Добавить(), ТекущаяСтрока); // приёмник, источник
   //КонецЕсли;

КонецФункции

Проверка реквизита через Попытка (&НаКлиенте) в 1С 8.3:

&НаКлиенте
Функция ПроверитьНаНаличиеРеквизитаЧерезПопытку(ИмяРеквизита)

   Попытка
       РеквизитФормыПоИмени = ЭтаФорма[ИмяРеквизита];
       ЕстьРеквизитНаФорме = Истина;
   Исключение
       ЕстьРеквизитНаФорме = Ложь;
   КонецПопытки;

   Возврат ЕстьРеквизитНаФорме;

КонецФункции

В определенных задачах можно использовать метод в 1С 8.3:

ПолучитьРеквизиты(GetAttributes)

Синтаксис:

ПолучитьРеквизиты(<Путь>)

Параметры:

<Путь> (необязательный)

Тип: Строка.

Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Возвращаемое значение:

Тип: Массив.

Массив объектов РеквизитФормы.

Описание:

Получает описание реквизитов формы.

Copyright©, «Программист 1С в г.Минске», 06.11.2021

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

При попытке разобраться с другим вопросом, изобрел велосипед:

&НаСервере
Функция  НайтиВозможныйРеквизитформыНаСервере(ИскомыйЭлементНаСервере)
Если Не ИскомыйЭлементНаСервере="" Тогда
Для Каждого Рек из ЭтаФорма.Элементы  Цикл
Если рек.Имя=ИскомыйЭлементНаСервере
Или Рек.Заголовок=ИскомыйЭлементНаСервере
Тогда
Возврат рек.ПутьКДанным;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Истина;
КонецФункции  //НайтиЭлементыНаСервере

&НаКлиенте
Процедура НайтиРеквизит(Команда)
ИмяОбъекта = НайтиВозможныйРеквизитформыНаСервере(ЭлементДляПоиска);
Если ИмяОбъекта=Истина Тогда
Предупреждение("Не найдено");
Иначе
ЭтотОбъект[ИмяОбъекта]=НовоеЗначение;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭлементДляПоиска="Реквизит1"; НовоеЗначение="Текст нового значения";
КонецПроцедуры

Позволяет найти нужный реквизит, используя обработчик события, например:

Регулирование(Элемент, Направление, СтандартнаяОбработка)А точнее:

Элемент.Имя

Войти или зарегистрироваться

8.х Как обратится к реквизиту по имени

Тема в разделе «Конфигурирование на платформе «1С:Предприятие 8″», создана пользователем UnNone, 18 июн 2009.




0/5,
Голосов: 0
  1. TopicStarter Overlay

    UnNone

    Offline

    UnNone
    Опытный в 1С

    Регистрация:
    21 мар 2007
    Сообщения:
    153
    Симпатии:
    0
    Баллы:
    26

    Возникла необходимость в программном коде получить значение реквизита имея его имя в текстовой переменной. Возможно как-то так получить значение? Через метаданные получал объект метаданных, а значение соответственно не получается вытащить :(


    UnNone,
    18 июн 2009
    #1

  2. Stack_G

    Offline

    Stack_G
    Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    29

    Если я правильно понял может помочь оператор «Выполнить»:
    Выполнить (Execute)
    Синтаксис:
    Выполнить(<Строка>)
    Параметры:
    <Строка>
    Строка, содержащая текст исполняемого кода.
    Описание:
    Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.

    т.е., если имеем: НаименованиеРеквизита = «Организация»

    Код:
    Выполнить("ОрганизацияДок = Ссылка."+НаименованиеРеквизита);
    
    

    Stack_G,
    18 июн 2009
    #2
  3. TopicStarter Overlay

    UnNone

    Offline

    UnNone
    Опытный в 1С

    Регистрация:
    21 мар 2007
    Сообщения:
    153
    Симпатии:
    0
    Баллы:
    26

    Спасибо огромное работает. :)


    UnNone,
    18 июн 2009
    #3

  4. e.kogan

    Offline

    e.kogan

    Регистрация:
    2 окт 2008
    Сообщения:
    42
    Симпатии:
    0
    Баллы:
    1

    ВашОбъект.[НаименованиеРеквизита]
    Как и к любой коллекции.


    e.kogan,
    18 июн 2009
    #4

  5. Stack_G

    Offline

    Stack_G
    Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    29

    согласен, поправлю:

    Код:
    ВашОбъект[НаименованиеРеквизита]
    
    

    без точки


    Stack_G,
    19 июн 2009
    #5
  6. TopicStarter Overlay

    UnNone

    Offline

    UnNone
    Опытный в 1С

    Регистрация:
    21 мар 2007
    Сообщения:
    153
    Симпатии:
    0
    Баллы:
    26

    А я блин даже не подумал о таком варианте.
    Всем большое спасибо, кто помог :)


    UnNone,
    19 июн 2009
    #6

  7. e.kogan

    Offline

    e.kogan

    Регистрация:
    2 окт 2008
    Сообщения:
    42
    Симпатии:
    0
    Баллы:
    1

    Да, конечно — задумалась что-то )


    e.kogan,
    24 июн 2009
    #7
(Вы должны войти или зарегистрироваться, чтобы ответить.)
Показать игнорируемое содержимое
Похожие темы

  1. †omynoker

    8.х
    Доступ к реквизиту справочника по имени, хранимому в переменной

    †omynoker,
    22 сен 2007
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    2
    Просмотров:
    2.221
    †omynoker
    23 сен 2007

  2. AleksP

    8.х
    Обратится к реквизиту через внешнюю обработку

    AleksP,
    18 июл 2012
    , в разделе: Общие вопросы «1С:Предприятие 8»
    Ответов:
    9
    Просмотров:
    1.440
    kotlovD
    19 июл 2012

  3. AlenkaInt

    8.х
    Обратится к документу.

    AlenkaInt,
    20 фев 2014
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    3
    Просмотров:
    809
    AlenkaInt
    20 фев 2014

  4. id3337668

    7.7
    Как обратится к реквизиту экранной формы в модуле документа?

    id3337668,
    17 авг 2016
    , в разделе: Установка платформы «1С:Предприятие 7.7»
    Ответов:
    2
    Просмотров:
    1.439
    id3337668
    17 авг 2016

  5. Raideres

    [РЕШЕНО]
    Поскажите как обратится в уф к макету

    Raideres,
    23 янв 2017
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    2
    Просмотров:
    1.947
    Raideres
    23 янв 2017

Загрузка…
Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Поиск

  • Искать только в заголовках
Сообщения пользователя:

Имена участников (разделяйте запятой).

Новее чем:
  • Искать только в этой теме
  • Искать только в этом разделе
    • Отображать результаты в виде тем

Быстрый поиск

  • Последние сообщения

Больше…

 Как получить доступ к реквизитам формы?

Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы, который содержит коллекцию элементов формы, сканируя ее в цикле:

ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
ДокОбъект = ДокСсылка.ПолучитьОбъект();
 
ФормаОбъекта = ДокОбъект.ПолучитьФорму();
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
        Сообщить(Элемент);
КонецЦикла;     
 

Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.

Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.

Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:

 
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
        Сообщить(Элемент.Имя);
        Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда
                Сообщить(" Это табличное поле! "  + Элемент.Имя );
                Для Каждого Колонка Из Элемент.Колонки Цикл
                        ИмяКолонки = Колонка.Имя;
                        Сообщить(ИмяКолонки);
                КонецЦикла;
        КонецЕсли;      
КонецЦикла;     
 

Как получить значение отдельного реквизита формы?

Чаще требуется получать не массив реквизитов формы,  а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.

Пример:

 
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента");
Поставщик = ФормаОбъекта.ЭлементыФормы.Поставщик;
Поставщик = ФормаОбъекта.ЭлементыФормы.Получатель;
Сообщить(ФормаОбъекта.ЭлементыФормы.ТаблПоле.Колонки.Количество());
 

Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.

Как получить значение элементов табличной части формы?

Доступ к табличной части формы через объект

Доступ к табличной части формы (например: Товары) можно получить через объект:

 
  ДокОбъект = Док.ПолучитьОбъект(); //здесь Док - ссылка на объект
  //просканируем построчно таб часть документа
  Для Каждого Стр из ДокОбъект.Товары Цикл
      Номенклатура = Стр.Номенклатура;
      Стр.Коэффициент = 1;
  КонецЦикла;
 

Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:

      Номенклатура = Стр.Номенклатура;

Доступ к табличной части формы через ЭлементыФормы

Табличная часть объекта и табличная часть формы объекта — это не одно и то же!

Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.

То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы:

Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.

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

Результат для документа Авансовый отчет:

Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки       

Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:

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

Результат для документа Авансовый отчет:

Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174

 Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как составить предложение на тему моя улица
  • Как найти компанию для похода в клуб
  • Вов как найти 100
  • Как найти детские книжки
  • Как найти мои заказы в 21 веке

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии