prod_1c‎ > ‎Заметки 1С: 8.3‎ > ‎

Управляемые формы (примеры)

Программное выполнение стандартной команды из управляемой формы

&НаКлиенте
Процедура Команда1(Команда)
   ПроведениеОплатаОтгрузка();
   ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

&НаСервере
Процедура ПроведениеОплатаОтгрузка()
   док = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЗаказКлиента") );
   док.Записать( РежимЗаписиДокумента.Проведение );
КонецПроцедуры

Связь по типу в выборе документа Управляемая форма

Дано: Документ "РучнаяОперация" по регистру Бухгалтерии
Субконто меняются на разных Счетах.
Выбирается комбинация:
Субконто1 = Контрагент
Субконто2 = Документ (движение по контрагенту)
Задача:Наложить ограничение по выбору субконто2 из списка документов только по Контрагент.
Решение (Настроить параметры отбора ДинамическогоСписка):
создать: ФормаВыбора, объект ДинамическийСписок,
добавить обработку события типа Активация у ДинамическийСписок:

ЭлементыОтбора = ДинамическийСписок.Отбор.Элементы;
Если ЭлементыОтбора.Количество()>0 Тогда
   ЭлементыОтбора.Очистить();
КонецЕсли;

ЭлементОтбора = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ПравоеЗначение = Ссылка;


Связь по типу выбор данных Управляемая форма

Этот механизм используется для работы с полями, значения которых связаны через план видов характеристик или через владельца справочника.
Можно наложить ограничения по типу програмно :
Пример: Взависимости от вида карты выбирается нужный справочник в табличной части.
Код в обработчике ПриИзменении

Если Объект.ВидыКарт = ПредопределенноеЗначение("Перечисление.ВидыКарт.Вид1") Тогда
   Элементы.ТабличнаяЧасть1Карта.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Справочник1");
ИначеЕсли Объект.ВидыКарт = ПредопределенноеЗначение("Перечисление.ВидыКарт.Вид2") Тогда
   Элементы.ТабличнаяЧасть1Карта.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Справочник2");
КонецЕсли;

Передача параметра в запрос объекта ДинамическийСписок Управляемые формы

Дано:
На управляемой форме размещен объект ДвиженияДокумента типа ДинамическийСписок, формирующийся запросом по регистру.
Задача:Фильтровать ДвиженияДокумента по документу регистратору. Установить период.

Решение:
// 1-й способ:
// Управление через параметры запроса. Минус - каждый раз при изменении параметра происходит обращение к БД.
&НаКлиенте
...
Если ЗначениеЗаполнено( СсылкаНаДокумент ) Тогда
   ДвиженияДокумента.Параметры.УстановитьЗначениеПараметра("Регистратор" , СсылкаНаДокумент);
КонецЕсли;

// 2-й способ:
// Управление через настройки отбора компоновки данных формы. Код сложнее, но движок 1с сам решает проблему кеширования данных. Обращений к БД должно быть меньше.
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
   тс = Элемент.ТекущаяСтрока;
   Если ЗначениеЗаполнено(тс) Тогда

      ЭлементыОтбора = ДвиженияДокумента.Отбор.Элементы;
      Если ЭлементыОтбора.Количество()>0 Тогда
         ЭлементыОтбора.Очистить();
      КонецЕсли;

      ЭлементОтбора = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
      ЭлементОтбора.Использование = Истина;
      ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Регистратор");
      ЭлементОтбора.ПравоеЗначение = тс;

   КонецЕсли;
КонецПроцедуры


Отображение изображения (картинка) Управляемые формы

1. Создать реквизит формы КартинаНаФорме тип Строка
2. Перетащить КартинаНаФорме на поле формы и установить свойство Вид "Поле картинки"
3. Связать данные БД и Формы (КартинаНаФорме<->Реквизит справочника КартинаВСправочнике):

&НаКлиенте
КартинаНаФорме = ПолучитьНавигационнуюСсылку( Элемент.ТекушиеДанные.<Ссылка на справочник>, "КартинаВСправочнике");

или

КартинаНаФорме = ПолучитьНавигационнуюСсылку( Объект.Ссылка, "КартинаВСправочнике");
Элементы.КартинаНаФорме.Видимость = Истина;

Чтение файла изображения на клиенте и запись в БД.

&НаКлиенте
Процедура ДобавитьКартинку(Команда)
   ИмяФайлаВФайловойСистеме = "";
   АдресВоВременномХранилище = "";
   ПоместитьФайл(АдресВоВременномХранилище , , ИмяФайлаВФайловойСистеме, Истина);
   КартинаНаФорме = АдресВоВременномХранилище;
   УстановитьКартинку();
КонецПроцедуры

&НаСервере
Процедура УстановитьКартинку()
   сп = РеквизитФормыВЗначение("Объект");// сп - элемент справочника
   сп.КартинаВСправочнике = Новый ХранилищеЗначений( ПолучитьИзВременногоХранилища(КартинаНаФорме) );
   сп.Записать();
КонецПроцедуры


Контроль заполнения полей управляемых форм.

Контроль осуществляется на стороне сервера.

Проверяемый реквизит объекта метаданных свойство "Проверка заполения" установить в состояние "Выдавать ошибку" (по умолчанию "Не проверять"). Это включает обработку "поумолчанию".


Обработку проверки можно изменить в обработке события в модуле Объекта (&НаСервере) ОбработкаПроверкиЗаполнения.



Организация передачи данных между Управляемыми формами

Задача:
Организовать передачу склада (в) и номенклатуры (из) между формами Справочники.Номенклатура.Форма.ФормаПодбораНоменклатуры и Документы.РасходнаяНакладная.ФормаДокумента.

Решение:

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

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

// Привязать обработчик на событие Выбор в Справочники.Номенклатура.Форма.ФормаПодбораНоменклатуры

&НаКлиенте
Процедура ТаблицаПодбораВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
   СтандартнаяОбработка = Ложь;
   ОповеститьОВыборе(Элемент.ТекущиеДанные.Номенклатура);
КонецПроцедуры