Проект

Общее

Профиль

Управляемые формы 1С » История » Версия 16

Версия 15 (Всеволод Дорофеев, 09.06.2017 17:11) → Версия 16/42 (Всеволод Дорофеев, 07.12.2018 07:57)

h1. Управляемые формы 1С

h3. 1. Как программно удалить текущую строку из табличной части документа?

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

<pre>
ДокументОбъект.Товары.Удалить(ЭлементыФормы.Товары.ТекущаяСтрока);
</pre>

В качестве параметра метода Удалить() передается текущая строка табличной части.

Обратите внимание, что для удаления (как и для добавления) строк табличной части документа следует использовать методы табличной части (ДокументОбъект.Товары), а не методы табличного поля, отображающего эту табличную часть (ЭлементыФормы.Товары).
http://its.1c.ru/db/metod8dev/content/2481/hdoc

h3. 2. Замена "Сообщить()"

Вариант 1.
<pre>
ПоказатьОповещениеПользователя(
НСтр("ru = 'Изменения не зарегистрированы.'")
,,,
БиблиотекаКартинок.Информация32);
</pre>

Вариант 2.
<pre>
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает ";
Сообщение.Поле = "Номенклатура";

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

// Сообщение выводится пользователю
Сообщение.Сообщить();
</pre>

h3. 3. Открытие управляемой формы не записанного документа в 1С 8.2/8.3

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

&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(НовыйОбъект);
НовыйОбъект.Наименование = "Новый элемент";
Для К=1 По 100 Цикл
НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
НоваяСтрока.РеквизитТЧ = К;
КонецЦикла;
КонецПроцедуры
</pre>

h3. 4. Передача параметров в управляемых формах

Параметры передаются в виде структуры:

<pre>
Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();
</pre>

Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров. Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.

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

Для передачи специфического параметра манипуляций требуется сделать немного больше:

1. Определить в управляемой форме параметр.

В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство «Параметры», имеющее тип ДанныеФормыСтруктура)

1. Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.

Таким образом код будет иметь вид:

В месте получения формы
<pre>
Параметры = Новый Структура("НовыйПараметр",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
</pre>

В модуле управляемой формы
<pre>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("НовыйПараметр") Тогда
// здесь код обработки параметра
КонецЕсли;
КонецПроцедуры
</pre>

h3. 4. Отбор в таблице значений, расположенной на форме

Например, отбор строк в подчиненной таблице при смене "Владельца" в основной таблице
<pre>
&НаКлиенте
Процедура ИсходнаяНоменклатураПриАктивизацииСтроки(Элемент)

Структура = Новый Структура("ИсходнаяНоменклатура", Элементы["ИсходнаяНоменклатура"].ТекущиеДанные.Номенклатура);
НовыйОтбор = Новый ФиксированнаяСтруктура(Структура);
Элементы["НоваяНоменклатура"].ОтборСтрок=НовыйОтбор;

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

</pre>

h3. Вопрос в управляемых формах

Замена функции "Вопрос(...)"

<pre>
&НаКлиенте
Процедура ЗадатьВопрос(Команда)

ПоказатьВопрос(Новый ОписаниеОповещения("ОбработкаОтветаЗавершение", ЭтотОбъект), "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет);

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

&НаКлиенте
Процедура ОбработкаОтветаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

Ответ = РезультатВопроса;

Если Ответ <> КодВозвратаДиалога.Да Тогда

Возврат;

КонецЕсли;

//Выполнение действий на положительный ответ

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

</pre>

h3. Подключение внешней компоненты из макета внешней обработки

Стандартное подключение макета из встроенной обработки:
<pre>
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ВстроеннаяОбработка.Макет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
</pre>

Подключение внешней компоненты из макета внешней обработки
<pre>
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("КомпонентаПечатиШтрихкодовLinux64")), "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
</pre>

h3. Методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища

источник http://catalog.mista.ru/public/198766/

Временное хранилище – секретное оружие

При работе с управляемыми формами быстро становится ясно, что ограничения клиент-серверного взаимодействия очень сильно сужают возможности разработчика. Поэтому, платформа 1С предоставляет хитрый секретный ход под названием «ВременноеХранилище». Эта сущность позволяет сохранить на сервере некоторое состояние между двумя серверными вызовами. Я слышу возгласы: «А кто сказал, что состояние нельзя хранить!» Справедливое замечание, состояние хранить все-таки можно, но недолго.

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

Для работы со временным хранилищем используются методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища.

С методом «Получить» все просто, он по заданному адресу возвращает значение, которое лежит в хранилище.

С методом «Поместить» несколько сложнее. Дело в том, что помещать можно в 2 разных хранилища – простое и хранилище формы. Хранилище формы живет на сервере столько, сколько живет сама форма. Простое хранилище живет ровно 2 серверных вызова. В синтакс-помощнике об этом написано целых несколько умных строк. Я никогда не понимал, что они означают. Опытным путем было установлено, что срок жизни – 2 серверных вызова.

Первый – мы помещаем что-то в хранилище и возвращаем адрес на клиента.
Клиент делает второй вызов и по этому адресу может получить данные.
В третьем вызове по этому адресу уже ничего не будет. Платформа очистит хранилище

С хранилищем формы ситуация более интересная. Если вторым параметром метода «ПоместитьВоВременноеХранилище» передать идентификатор формы (ЭтаФорма.УникальныйИдентификатор), то данные в хранилище будут привязаны к сроку жизни формы и не будут удалятся ни в первых, ни во вторых, ни во всех прочих вызовах сервера.

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

h3. Динамический список? Обработка выделенных строк

<pre>
Для каждого Эл из Элементы.СписокСпецификаций.ВыделенныеСтроки Цикл
Сообщить(Элементы.СписокСпецификаций.ДанныеСтроки(Эл).СпецификацияСсылка);
КонецЦикла;
</pre>