1с как обратиться к реквизиту формы по имени

Добрый день. Вопрос чисто по синтаксису. Платформа 8.2.15, управляемые формы. Форма содержит очень много реквизитов с однотипным названием «Реквизит1», «Реквизит2» и т.д. В процедуре «ПриСозданииНаСервере» хочу заполнить все эти реквизиты. Но мне лень по отдельности заполнять каждый из этих реквизитов, поэтому хочу все это запихнуть в цикл и прогнать его по количеству реквизитов. Внутри цикла поместить что-то типа [«Реквизит»+н] = Истина. Подскажите как по синтаксису правильно записать данное выражение.

«Форма содержит очень много реквизитов с однотипным названием «Реквизит1», «Реквизит2″ и т.д.» — и накуя? А что делать, когда хватать не будет, менять конфигурацию? Почему иаблицу не сделать, тем более, что пользователю до лампочки, как это устроено.

Реквизиты разных типов Спасибо, я уже разобрался. ЭтаФорма[«Реквизит»+н] = ….

Разных типов… Типа Юстас Алексу. Грузите апельсины бочками и всё такое.

Реквизиты разных типов, собранные по группам и находящиеся на разных вкладках формы. Собираю их в структуру, чтобы передать как параметр для дальнейшей обработки. Если есть идеи по более рациональному методу решения данной задачи — я его с удовольствием выслушаю :)

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Как обратиться к реквизиту формы в УФ

Я
   DenisSS

09.04.18 — 08:37

Есть реквизит формы, созданный программно. Как обратиться к этому реквизиты, например, в ПослеЗаписиНаСервере? При отладке значение этого реквизита доступно, но такая строка естественно вызывает ошибку:

Сообщить(РеквизитСозданныйПрограммно)

Переменная не определена (РеквизитСозданныйПрограммно)

  

Партнерская программа EFSOL Oblako

   DmitrO

1 — 09.04.18 — 08:45

ЭтотОбъект[«ИмяРеквизита»]

   DenisSS

2 — 09.04.18 — 08:54

Спасибо работает, но так тоже работает, не ругается: ЭтаФорма.ИмяРеквизита

   Lexey_

3 — 09.04.18 — 08:58

(2) ЭтотОбъект = ЭтаФорма

   DmitrO

4 — 09.04.18 — 10:01

1.ЭтаФорма — оставлено для совместимости.

2.С какого-то релиза (не помню) платформа явно блокирует исключением обращение к программным реквизитам через точку (это уже для совместимости на будущее). Об этом видел официальное заявление в документации.

   ildary

5 — 09.04.18 — 10:15

(4) извините что вмешиваюсь, то есть на сегодня самый правильный способ — это ЭтотОбъект[«ИмяРеквизита»], а ЭтаФорма.ИмяРеквизита — не рекомендуется по причине устаревания?

   Cyberhawk

6 — 09.04.18 — 10:17

(5) Правильнее всего для чтения значения программно созданного реквизита создавать структуру-зонд + ЗаполнитьЗначенияСвойств (т.к. реквизит может быть и удален)

   Cyberhawk

7 — 09.04.18 — 10:24

(ну а для получения реквизита формы как объекта встроенного языка — без точки и без «ЭтаФорма», о чем сказано выше)

   ildary

8 — 09.04.18 — 10:25

(6) извините, я правильно понял: структура-зонд — это структура с именами как у формы, которую (структуру) будем заполнять через ЗаполнитьЗначенияСвойств()? Выглядит рабоче, но вот ради одного поля гонять столько данных — не очень рационально.

   Cyberhawk

9 — 09.04.18 — 10:27

(8) Это структура с именем ключа, совпадающим с именем реквизита, о существовании которого заранее неизвестно (он мог быть уже и удален, т.к. создан программно и для таких это возможно).

Насчет «гонять столько данных» — во-первых, сколько «столько»? А во-вторых это, видимо, единственный способ получить значение без оборачивания в попытку.

  

hhhh

10 — 09.04.18 — 10:28

(8) зачем гонять? в ЗаполнитьЗначенияСвойств() задаете список реквизитов в 3м параметре. Может вы там один реквизит напишете.

TurboConf — расширение возможностей Конфигуратора 1С

Рассмотрим ситуацию, когда мы находимся в форме документа и нам нужно получить какой-либо его реквизит. Например, номер документа или значение реквизита Поставщик.

Данные объекта, которые отображаются в форме (в нашем случае данные документа), находятся всегда в основном реквизите формы. В подавляющем большинстве случаев этот реквизит имеет имя Объект. По крайней мере именно такое имя дает ему платформа, когда с помощью конструктора создает форму объекта. В нашем случае это именно так:


Основной реквизит формы содержит набор подчиненных реквизитов, соответствующих реквизитам прикладного объекта. Поэтому для того, чтобы обратиться, например, к поставщику, указанному в документе, нужно указать имя основного реквизита формы и через точку – имя подчиненного реквизита, хранящего ссылку на поставщика.

В нашем случае, для того чтобы получить ссылку на поставщика, нужно будет выполнить следующий код:

ПоставщикДокумента = Объект.Поставщик; 

Помогите обратиться к реквизиту формы (булево флажок).Управляемая форма

Автор fenlork, 19 мар 2019, 11:27

0 Пользователей и 1 гость просматривают эту тему.

Добрый день.
Управляемые формы.
Помогите обратиться к реквизиту формы (булево флажок), чтобы изменить его значение.

На форме куча этих флажков, суть доработки, при включении одного флажка(истина), со всех других пометка должна сняться(значение ложь)
В процедуре при открытие формы создаю список значений с наименованиями флажков)
Процедура при изменении
&НаСервере
функция ПолучитьТипЗначения(свойство)

Элементик = ЭтаФорма[свойство];
возврат элементик;

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

&НаКлиенте
Процедура ПриВыбореТипаЭтикетки(Элемент)
НазваниеЭтикетки = Элемент.Имя;
//ПолучитьТипЗначения(НазваниеЭтикетки);

Для каждого Тип из ТипыЭтикеток цикл
Если(НазваниеЭтикетки = Тип.Значение) тогда значение = ПолучитьТипЗначения(НазваниеЭтикетки);//здесь полу значение элемента на который нажали
Иначе Значение = Ложь;
КонецЕсли;
ЭлементФормы = этаформа[элементы[тип.значение].Имя];//»как обратиться к элементу формы, чтобы значение поменять
ЭлементФормы = Значение;

КонецЦикла;

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


Цитата: fenlork от 19 мар 2019, 11:27
Добрый день.
Управляемые формы.
Помогите обратиться к реквизиту формы (булево флажок), чтобы изменить его значение.

На форме куча этих флажков, суть доработки, при включении одного флажка(истина), со всех других пометка должна сняться(значение ложь)
В процедуре при открытие формы создаю список значений с наименованиями флажков)
Процедура при изменении
&НаСервере
функция ПолучитьТипЗначения(свойство)

Элементик = ЭтаФорма[свойство];
возврат элементик;

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

&НаКлиенте
Процедура ПриВыбореТипаЭтикетки(Элемент)
НазваниеЭтикетки = Элемент.Имя;
//ПолучитьТипЗначения(НазваниеЭтикетки);

Для каждого Тип из ТипыЭтикеток цикл
Если(НазваниеЭтикетки = Тип.Значение) тогда значение = ПолучитьТипЗначения(НазваниеЭтикетки);//здесь полу значение элемента на который нажали
Иначе Значение = Ложь;
КонецЕсли;
ЭлементФормы = этаформа[элементы[тип.значение].Имя];//»как обратиться к элементу формы, чтобы значение поменять
ЭлементФормы = Значение;

КонецЦикла;

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

Флаг точно реквизит формы? Пишите обработчики конкретно для флага.


К чему такие мучения? Почему бы не использовать переключатель?



[/quote]
Флаг точно реквизит формы? Пишите обработчики конкретно для флага.
[/quote]
Реквизит формы. Хотелось в цикле по списку значений перебрать все реквизиты формы, подставляя значения(имя реквизиты) из списка. Как обратиться к реквизиту по имени и изменить значения в итоге есть варианты? писать обработчик для каждого флажка слишком долго, их более сотни может быть.


Цитировать
А это идея:ooifh:. А сколько всего на переключатель можно положений поставить?

Сколько влезет)


Цитироватьих более сотни может быть.

и что, при установке одного флажка, остальные 99 надо сбросить?

если помогло нажмите: Спасибо!


(0) в процедуре

ПриИзмененииЭлемента(Элемент)
ЭтаФорма[Элемент.Имя]

Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают


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

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

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

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поиск

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

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

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

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

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

Больше…

Я сделал форму, добавил реквизит пользователей из справочника пользователей и создал поле выбора с типом справочника пользователей. Мне нужно получить значение этого реквизита в модуле формы, но в строке, где я его получаю, выходит ошибка:

Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(201)}:РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); //
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(230)}:ТабДокумент                          = СформироватьМакетНаСервере();

по причине:
Недопустимое значение параметра (параметр номер '1')

Как это можно исправить?

Вот сам код:

&НаСервере
Функция СформироватьМакетНаСервере()
    
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); 
    РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); //
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных,  ОтчетОбъект.КомпоновщикНастроек.Настройки, , ,  Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); 
        
    ТабДокумент = Новый ТабличныйДокумент;
    
    ТабДокумент.Очистить();
    Макет = ОтчетОбъект.ПолучитьМакет("Макет");
                                            
    Возврат ТабДокумент;
    
КонецФункции

&НаКлиенте
Процедура СформироватьМакет(Команда)
    
    ТабДокумент                         = СформироватьМакетНаСервере();    
    КоллекцияПечатныхФорм               = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("Макет");
    ПечатнаяФорма                       = УправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, "Макет");
    ПечатнаяФорма.СинонимМакета         = "Макет";
    ПечатнаяФорма.ТабличныйДокумент     = ТабДокумент;
    ПечатнаяФорма.ИмяФайлаПечатнойФормы = "Макет";
    
    ОбластиОбъектов = Новый СписокЗначений;
    УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
    
КонецПроцедуры

Вот форма со свойствами поля:

И свойства реквизита:

Понравилась статья? Поделить с друзьями:
  • Юрист компании курсы повышения квалификации
  • Activision blizzard новости компании сегодня
  • 1с как отсортировать справочник по реквизиту
  • Ярославская лакокрасочная компания директор
  • Юрист компании сервис проверки контрагентов