(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
-
Offline
UnNone
Опытный в 1С- Регистрация:
- 21 мар 2007
- Сообщения:
- 153
- Симпатии:
- 0
- Баллы:
- 26
Возникла необходимость в программном коде получить значение реквизита имея его имя в текстовой переменной. Возможно как-то так получить значение? Через метаданные получал объект метаданных, а значение соответственно не получается вытащить
UnNone,
18 июн 2009
#1 -
Offline
Stack_G
Опытный в 1С- Регистрация:
- 10 дек 2007
- Сообщения:
- 786
- Симпатии:
- 2
- Баллы:
- 29
Если я правильно понял может помочь оператор «Выполнить»:
Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.т.е., если имеем: НаименованиеРеквизита = «Организация»
Код:Выполнить("ОрганизацияДок = Ссылка."+НаименованиеРеквизита);
Stack_G,
18 июн 2009
#2 -
Offline
UnNone
Опытный в 1С- Регистрация:
- 21 мар 2007
- Сообщения:
- 153
- Симпатии:
- 0
- Баллы:
- 26
Спасибо огромное работает.
UnNone,
18 июн 2009
#3 -
Offline
e.kogan
- Регистрация:
- 2 окт 2008
- Сообщения:
- 42
- Симпатии:
- 0
- Баллы:
- 1
ВашОбъект.[НаименованиеРеквизита]
Как и к любой коллекции.
e.kogan,
18 июн 2009
#4 -
Offline
Stack_G
Опытный в 1С- Регистрация:
- 10 дек 2007
- Сообщения:
- 786
- Симпатии:
- 2
- Баллы:
- 29
согласен, поправлю:
Код:ВашОбъект[НаименованиеРеквизита]
без точки
Stack_G,
19 июн 2009
#5 -
Offline
UnNone
Опытный в 1С- Регистрация:
- 21 мар 2007
- Сообщения:
- 153
- Симпатии:
- 0
- Баллы:
- 26
А я блин даже не подумал о таком варианте.
Всем большое спасибо, кто помог
UnNone,
19 июн 2009
#6 -
Offline
e.kogan
- Регистрация:
- 2 окт 2008
- Сообщения:
- 42
- Симпатии:
- 0
- Баллы:
- 1
Да, конечно — задумалась что-то )
e.kogan,
24 июн 2009
#7
- Похожие темы
-
8.х
Доступ к реквизиту справочника по имени, хранимому в переменной
†omynoker,
22 сен 2007, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 2
- Просмотров:
- 2.221
- †omynoker
- 23 сен 2007
-
8.х
Обратится к реквизиту через внешнюю обработку
AleksP,
18 июл 2012, в разделе: Общие вопросы «1С:Предприятие 8»
- Ответов:
- 9
- Просмотров:
- 1.440
- kotlovD
- 19 июл 2012
-
8.х
Обратится к документу.
AlenkaInt,
20 фев 2014, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 3
- Просмотров:
- 809
- AlenkaInt
- 20 фев 2014
-
7.7
Как обратится к реквизиту экранной формы в модуле документа?
id3337668,
17 авг 2016, в разделе: Установка платформы «1С:Предприятие 7.7»
- Ответов:
- 2
- Просмотров:
- 1.439
- id3337668
- 17 авг 2016
-
[РЕШЕНО]
Поскажите как обратится в уф к макету
Raideres,
23 янв 2017, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 2
- Просмотров:
- 1.947
- Raideres
- 23 янв 2017
- Ваше имя или e-mail:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
-
- Искать только в заголовках
- Сообщения пользователя:
-
Имена участников (разделяйте запятой).
- Новее чем:
-
- Искать только в этой теме
- Искать только в этом разделе
- Отображать результаты в виде тем
-
Быстрый поиск
- Последние сообщения
Больше…
Как получить доступ к реквизитам формы?
Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы, который содержит коллекцию элементов формы, сканируя ее в цикле:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму(); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Сообщить(Элемент); КонецЦикла;
Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.
Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.
Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Сообщить(Элемент.Имя); Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда Сообщить(" Это табличное поле! " + Элемент.Имя ); Для Каждого Колонка Из Элемент.Колонки Цикл ИмяКолонки = Колонка.Имя; Сообщить(ИмяКолонки); КонецЦикла; КонецЕсли; КонецЦикла;
Как получить значение отдельного реквизита формы?
Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.
Пример:
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента"); Поставщик = ФормаОбъекта.ЭлементыФормы.Поставщик; Поставщик = ФормаОбъекта.ЭлементыФормы.Получатель; Сообщить(ФормаОбъекта.ЭлементыФормы.ТаблПоле.Колонки.Количество());
Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.
Как получить значение элементов табличной части формы?
Доступ к табличной части формы через объект
Доступ к табличной части формы (например: Товары) можно получить через объект:
ДокОбъект = Док.ПолучитьОбъект(); //здесь Док - ссылка на объект //просканируем построчно таб часть документа Для Каждого Стр из ДокОбъект.Товары Цикл Номенклатура = Стр.Номенклатура; Стр.Коэффициент = 1; КонецЦикла;
Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:
Номенклатура = Стр.Номенклатура;
Доступ к табличной части формы через ЭлементыФормы
Табличная часть объекта и табличная часть формы объекта — это не одно и то же!
Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.
То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы:
Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму(); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда //элемент формы - табличное поле Если Элемент.Имя = "Товары" Тогда Сообщить("Это табличное поле!! " + Элемент.Имя ); //ТабПоле = ФормаОбъекта.ЭлементыФормы.Товары.Значение; ТабПоле = Элемент.Значение; Колво = ТабПоле.Количество(); Сообщить("Количество строк: " + Колво); Для Каждого ТекущаяСтрока Из ТабПоле Цикл Имя = ТекущаяСтрока.Номенклатура; Сообщить(Имя); КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки
Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента"); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда Если Элемент.Имя = "ВыданныеАвансы" Тогда //таб часть объекта Сообщить(" Это табличное поле!! " + Элемент.Имя ); ТабПоле = Элемент.Значение; Индекс = 0; Для Каждого ТекущаяСтрока Из ТабПоле Цикл Сообщить("======================="); Для Каждого Колонка Из Элемент.Колонки Цикл ИмяКолонки = Строка(Колонка.Имя); Сообщить(ИмяКолонки); Имя = ТекущаяСтрока[ИмяКолонки];//сработает только если есть такое поле таб части объекта Сообщить("=== " + Имя); КонецЦикла; Индекс = Индекс + 1; Если Индекс > 0 Тогда break КонецЕсли; //только первая строка КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174
Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.