Добрый день. Вопрос чисто по синтаксису. Платформа 8.2.15, управляемые формы. Форма содержит очень много реквизитов с однотипным названием «Реквизит1», «Реквизит2» и т.д. В процедуре «ПриСозданииНаСервере» хочу заполнить все эти реквизиты. Но мне лень по отдельности заполнять каждый из этих реквизитов, поэтому хочу все это запихнуть в цикл и прогнать его по количеству реквизитов. Внутри цикла поместить что-то типа [«Реквизит»+н] = Истина. Подскажите как по синтаксису правильно записать данное выражение.
«Форма содержит очень много реквизитов с однотипным названием «Реквизит1», «Реквизит2″ и т.д.» — и накуя? А что делать, когда хватать не будет, менять конфигурацию? Почему иаблицу не сделать, тем более, что пользователю до лампочки, как это устроено.
Реквизиты разных типов Спасибо, я уже разобрался. ЭтаФорма[«Реквизит»+н] = ….
Разных типов… Типа Юстас Алексу. Грузите апельсины бочками и всё такое.
Реквизиты разных типов, собранные по группам и находящиеся на разных вкладках формы. Собираю их в структуру, чтобы передать как параметр для дальнейшей обработки. Если есть идеи по более рациональному методу решения данной задачи — я его с удовольствием выслушаю
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
|
|||
DenisSS
09.04.18 — 08:37 |
Есть реквизит формы, созданный программно. Как обратиться к этому реквизиты, например, в ПослеЗаписиНаСервере? При отладке значение этого реквизита доступно, но такая строка естественно вызывает ошибку:
Сообщить(РеквизитСозданныйПрограммно) |
||
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.ЭтаФорма — оставлено для совместимости. |
||
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
-
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:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
-
- Искать только в заголовках
- Сообщения пользователя:
-
Имена участников (разделяйте запятой).
- Новее чем:
-
- Искать только в этой теме
- Искать только в этом разделе
- Отображать результаты в виде тем
-
Быстрый поиск
- Последние сообщения
Больше…
Я сделал форму, добавил реквизит пользователей из справочника пользователей и создал поле выбора с типом справочника пользователей. Мне нужно получить значение этого реквизита в модуле формы, но в строке, где я его получаю, выходит ошибка:
Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(201)}:РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); //
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(230)}:ТабДокумент = СформироватьМакетНаСервере();
по причине:
Недопустимое значение параметра (параметр номер '1')
Как это можно исправить?
Вот сам код:
&НаСервере
Функция СформироватьМакетНаСервере()
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); //
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, ОтчетОбъект.КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаЗначений = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Очистить();
Макет = ОтчетОбъект.ПолучитьМакет("Макет");
Возврат ТабДокумент;
КонецФункции
&НаКлиенте
Процедура СформироватьМакет(Команда)
ТабДокумент = СформироватьМакетНаСервере();
КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("Макет");
ПечатнаяФорма = УправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, "Макет");
ПечатнаяФорма.СинонимМакета = "Макет";
ПечатнаяФорма.ТабличныйДокумент = ТабДокумент;
ПечатнаяФорма.ИмяФайлаПечатнойФормы = "Макет";
ОбластиОбъектов = Новый СписокЗначений;
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
КонецПроцедуры
Вот форма со свойствами поля:
И свойства реквизита: