Особенности работы с формами (1Cv8) — различия между версиями

Материал из КинтВики
Перейти к: навигация, поиск
м
м
 
Строка 1: Строка 1:
[[Категория:Программирование в 1Cv8]]
+
[[Категория:Формы 1Cv8]]
 
+
{| align="right"
 +
| __TOC__
 +
|}
 
==Как назначить конкретный тип элементу управления, который связан с реквизитом формы, имеющим составной тип?==
 
==Как назначить конкретный тип элементу управления, который связан с реквизитом формы, имеющим составной тип?==
  

Текущая версия на 16:31, 7 июля 2016

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

Источник: http://v8.1c.ru/predpriyatie/typical_problems_Form.htm#18

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

 ПолеВвода1 = Справочники.ФизическиеЛица.ПустаяСсылка();

Однако если в этом случае в поле ввода нажать кнопку очистки, снова будет предложен выбор типа значения из двух возможных типов. Избежать этого можно двумя способами:

Во-первых, можно запретить выбор типа в поле ввода (свойство ВыбиратьТип). В этом случае нажатие на кнопку очистки не будет приводить к сбросу типа в поле ввода.

Во-вторых, можно использовать свойство поля ввода ОграничениеТипа, задающее возможные типы данных, которые могут быть введены в поле ввода, и приводить значение соответствующего реквизита к нужному типу:

 Массив = Новый Массив();
 Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
 НашеОписание = Новый ОписаниеТипов(Массив);

 ЭлементыФормы.ПолеВвода1.ОграничениеТипа = НашеОписание;
 ПолеВвода1 = НашеОписание.ПривестиЗначение(ПолеВвода1);


Какие существуют особенности работы с составными типами данных?

Источник: http://itland.ru/forum/index.php?showtopic=2577

Вопрос: Какие существуют особенности работы с составными типами данных?

Ответ

Этот вопрос имеет два стороны:

1) Сторона элемента формы.

Для элемента формы мы можем установить только ограничение на типы которые можно выбрать.

Т.е. с помощью кода:

 МассивТипов=Новый Массив();
 МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
 ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);

Мы ограничиваем возможный типы только одним "СправочникСсылка.Контрагенты".

НО это не действует на значение которое хранится в источнике данных.

Поэтому если реквизит который связан с "ПолеВвода1" имеет "составной" тип, например Любая ссылка, он будет неопределенного типа даже после "ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);"

2) Сторона источника данных.

Здесь ограничение на тип накладывается либо в конфигураторе, либо в момент создания этого элемента из языка.

Но если у реквизита установлен "составной" тип значение реквизита будет неопределенно до тех пор, пока ему не будет присвоено значение конкретного типа.

Присвоить конкретное значение можно либо из языка, либо выбрав это значение в форме.

Из выше описанного можно сделать вывод:

  • Если у реквизита установлен "Составной" тип данных, то даже при ограничении возможных типов у элемента формы до одного возможного, у пользователя будет запрошен тип который нужно будет присвоить реквизиту.
  • Если мы хотим оградить пользователя от лишних движений, т.е. выбора единственно возможного типа, нам нужно предварительно установить тип реквизита.

Сделать это можно следующим образом:

//"Значение1" это реквизит связанный с "ПолеВвода1".
Значение1 = ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(Значение1);


Добавление от ezh (особенности при работе с элементами в табличном поле):

1.

Вместо этого:

ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);

Пишем это:

ЭлементыФормы.ИмяТабличнойЧасти.Колонки.ИмяКолонки.ЭлементУправления.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);

2.

Вместо этого:

Значение1 = ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(Значение1);

Пишем это:

ЭлементыФормы.ИмяТабличнойЧасти.ТекущаяСтрока.ИмяКолонки = ПривестиЗначение(ЭлементыФормы.ИмяТабличнойЧасти.ТекущаяСтрока.ИмяКолонки);

// можно так, а можно как в примере ниже...

Вот работающий пример:

 МассивТипов = Новый Массив();
 МассивТипов.Добавить(Тип("ПеречислениеСсылка."+Элемент.Значение));
 ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
 
 ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.ОграничениеТипа = ОписаниеТипов;
 // ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления);
 ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение);

Как организовать выбор значений из списка, открывающегося под элементом формы?

Источник: http://v8.1c.ru/predpriyatie/typical_problems_Form.htm#19

Для этого следует использовать методы формы ВыбратьИзСписка() или ВыбратьИзМеню().

Метод ВыбратьИзСписка() позволяет открыть выпадающий список для интерактивного выбора одного из элементов, причем список будет расположен около переданного элемента формы или около активной области формы (если элемент формы не передан).

Например, следующий код позволяет открыть выпадающий список под полем ввода «ПолеВводаКонтрагент» для выбора одного из контрагентов:

СписокВыбора = Новый СписокЗначений; 

СписокВыбора.Добавить(Справочники.Контрагенты.НайтиПоКоду("Ю0039")); 
СписокВыбора.Добавить(Справочники.Контрагенты.НайтиПоКоду("Ю0040")); 

ВыбранноеЗначение = ВыбратьИзСписка(СписокВыбора, ЭлементыФормы.ПолеВводаКонтрагент); 

Если ВыбранноеЗначение <> Неопределено Тогда 
	ПолеВводаКонтрагент = ВыбранноеЗначение.Значение; 
КонецЕсли;

Метод ВыбратьИзМеню() работает аналогично методу ВыбратьИзСписка() за исключением того, что для выбора открывается не выпадающий список, а меню.

Например, следующий код позволяет открыть меню для интерактивного выбора одного из действий, которые необходимо выполнить для контрагента, выбранного в поле ввода «ПолеВводаКонтрагент»:

СписокВыбора = Новый СписокЗначений; 

СписокВыбора.Добавить("Загрузка", "Загрузить информацию"); 
СписокВыбора.Добавить("Выгрузка", "Выгрузить данные"); 

ВыбранноеЗначение = ВыбратьИзМеню(СписокВыбора, ЭлементыФормы.ПолеВводаКонтрагент); 

Если ВыбранноеЗначение.Значение = "Загрузка" Тогда 
	ЗагрузитьИнформациюКонтрагента(ПолеВводаКонтрагент); 

ИначеЕсли ВыбранноеЗначение.Значение = "Выгрузка" Тогда 
	ВыгрузитьДанныеКонтрагента(ПолеВводаКонтрагент); 
КонецЕсли;

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

ссЭлемент = ...
форма = ссЭлемент.ПолучитьФорму();
форма.Открыть();


Как редактировать записи списка в диалоге и в списке и переключаться между этими способами?

Оказывается, надо

  • в свойствах (alt-enter) объекта метаданных установить "Способ редактирования"="Обоими способами"
  • после этого в в свойствах табличного поля списка появляется флаг "Использование/ИзменятьСпособРедактирования" и выбор "Способ редактирования = В списке/В диалоге"
  • в свойствах табличного поля списка установить появившийся флаг "Использование/ИзменятьСпособРедактирования"
  • после этого появляется команда "Редактировать в диалоге" и ее можно вставить в командную панель
  • если включено автозаполнение командной панели, эта кнопка появится автоматически