Проект

Общее

Профиль

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

Всеволод Дорофеев, 13.08.2020 12:11

1 1 Всеволод Дорофеев
h1. Управляемые формы 1С
2 1 Всеволод Дорофеев
3 6 Всеволод Дорофеев
h3. 1. Как программно удалить текущую строку из табличной части документа?
4 3 Всеволод Дорофеев
5 1 Всеволод Дорофеев
Для этого следует воспользоваться методом Удалить() того объекта, который является источником данных для табличной части документа. Например, для документа "ПриходнаяНакладная" с табличной частью "Товары" это будет объект ДокументТабличнаяЧасть.ПриходнаяНакладная.Товары. В модуле формы этого документа удаление текущей строки табличной части будет выглядеть следующим образом:
6 1 Всеволод Дорофеев
7 7 Всеволод Дорофеев
<pre>
8 1 Всеволод Дорофеев
ДокументОбъект.Товары.Удалить(ЭлементыФормы.Товары.ТекущаяСтрока);
9 7 Всеволод Дорофеев
</pre>
10 1 Всеволод Дорофеев
11 1 Всеволод Дорофеев
В качестве параметра метода Удалить() передается текущая строка табличной части.
12 1 Всеволод Дорофеев
13 1 Всеволод Дорофеев
Обратите внимание, что для удаления (как и для добавления) строк табличной части документа следует использовать методы табличной части (ДокументОбъект.Товары), а не методы табличного поля, отображающего эту табличную часть (ЭлементыФормы.Товары).
14 1 Всеволод Дорофеев
http://its.1c.ru/db/metod8dev/content/2481/hdoc
15 4 Всеволод Дорофеев
16 6 Всеволод Дорофеев
h3. 2. Замена "Сообщить()"
17 5 Всеволод Дорофеев
18 2 Всеволод Дорофеев
Вариант 1.
19 2 Всеволод Дорофеев
<pre>
20 2 Всеволод Дорофеев
ПоказатьОповещениеПользователя(
21 2 Всеволод Дорофеев
	НСтр("ru = 'Изменения не зарегистрированы.'")
22 2 Всеволод Дорофеев
	,,,
23 2 Всеволод Дорофеев
	БиблиотекаКартинок.Информация32);
24 2 Всеволод Дорофеев
</pre>
25 2 Всеволод Дорофеев
26 2 Всеволод Дорофеев
Вариант 2.
27 2 Всеволод Дорофеев
<pre>
28 2 Всеволод Дорофеев
    Сообщение = Новый СообщениеПользователю();
29 2 Всеволод Дорофеев
    Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает ";
30 2 Всеволод Дорофеев
    Сообщение.Поле = "Номенклатура";
31 2 Всеволод Дорофеев
32 2 Всеволод Дорофеев
    // Привязка объекта к реквизиту формы произойдет за счет
33 2 Всеволод Дорофеев
    // установленного выше по стеку соответствия методом
34 2 Всеволод Дорофеев
    // УстановитьСоответствиеОбъектаИРеквизитаФормы
35 2 Всеволод Дорофеев
    Сообщение.УстановитьДанные(ОбъектДанных);
36 2 Всеволод Дорофеев
    // Теперь у сообщения заполнено поле ПутьКДанным (установлено имя реквизита формы, до этого была пустая строка),
37 2 Всеволод Дорофеев
    // и свойство КлючДанных (установлена ссылка на документ, до этого было Неопределено)
38 2 Всеволод Дорофеев
39 2 Всеволод Дорофеев
    // Сообщение выводится пользователю
40 2 Всеволод Дорофеев
    Сообщение.Сообщить();	
41 5 Всеволод Дорофеев
</pre>
42 8 Всеволод Дорофеев
43 9 Всеволод Дорофеев
h3. 3. Открытие управляемой формы не записанного документа в 1С 8.2/8.3
44 8 Всеволод Дорофеев
45 8 Всеволод Дорофеев
<pre>
46 8 Всеволод Дорофеев
&НаКлиенте
47 8 Всеволод Дорофеев
Процедура КомандаОткрытьФорму(Команда)
48 8 Всеволод Дорофеев
	Форма = ПолучитьФорму("Справочник.Пользователи.ФормаОбъекта");
49 8 Всеволод Дорофеев
	ДанныеФормы = Форма.Объект;
50 8 Всеволод Дорофеев
	ЗаполнитьНаСервере(ДанныеФормы);
51 8 Всеволод Дорофеев
	КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
52 8 Всеволод Дорофеев
	Форма.Открыть();
53 8 Всеволод Дорофеев
КонецПроцедуры
54 8 Всеволод Дорофеев
55 8 Всеволод Дорофеев
&НаСервереБезКонтекста
56 8 Всеволод Дорофеев
Процедура ЗаполнитьНаСервере(НовыйОбъект);
57 8 Всеволод Дорофеев
        НовыйОбъект.Наименование = "Новый элемент";
58 8 Всеволод Дорофеев
	Для К=1 По 100 Цикл
59 8 Всеволод Дорофеев
	 	НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
60 8 Всеволод Дорофеев
		НоваяСтрока.РеквизитТЧ = К;
61 8 Всеволод Дорофеев
	КонецЦикла; 
62 8 Всеволод Дорофеев
КонецПроцедуры
63 8 Всеволод Дорофеев
</pre>
64 10 Всеволод Дорофеев
65 10 Всеволод Дорофеев
h3.  4. Передача параметров в управляемых формах
66 10 Всеволод Дорофеев
67 10 Всеволод Дорофеев
Параметры передаются в виде структуры:
68 10 Всеволод Дорофеев
69 10 Всеволод Дорофеев
<pre>
70 10 Всеволод Дорофеев
Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
71 10 Всеволод Дорофеев
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
72 10 Всеволод Дорофеев
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();
73 10 Всеволод Дорофеев
</pre>
74 10 Всеволод Дорофеев
75 10 Всеволод Дорофеев
Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров.  Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.
76 10 Всеволод Дорофеев
77 10 Всеволод Дорофеев
Также у разработчика появилась возможность определять свои параметры (в конструкторе управляемой формы вкладка «Параметры»). Время жизни параметров ограничено обработчиком ПриСозданииНаСервере, что логично т.к. параметры требуются только при создании формы, но если данный параметр определяет уникальность формы (установлен флаг «ключевой параметр» в свойствах параметра) он будет доступен и в других обработчиках.
78 10 Всеволод Дорофеев
79 10 Всеволод Дорофеев
Для передачи специфического параметра манипуляций требуется сделать немного больше:
80 10 Всеволод Дорофеев
81 10 Всеволод Дорофеев
1. Определить в управляемой форме параметр.
82 10 Всеволод Дорофеев
83 10 Всеволод Дорофеев
В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство «Параметры», имеющее тип ДанныеФормыСтруктура)
84 10 Всеволод Дорофеев
85 10 Всеволод Дорофеев
1. Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.
86 10 Всеволод Дорофеев
87 10 Всеволод Дорофеев
Таким образом код будет иметь вид:
88 10 Всеволод Дорофеев
89 10 Всеволод Дорофеев
В месте получения формы 
90 10 Всеволод Дорофеев
<pre>
91 10 Всеволод Дорофеев
Параметры = Новый Структура("НовыйПараметр",ПоследнийЭлемент);
92 10 Всеволод Дорофеев
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
93 10 Всеволод Дорофеев
</pre>
94 10 Всеволод Дорофеев
95 10 Всеволод Дорофеев
В модуле управляемой формы  
96 10 Всеволод Дорофеев
<pre>
97 10 Всеволод Дорофеев
&НаСервере
98 10 Всеволод Дорофеев
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
99 10 Всеволод Дорофеев
    Если Параметры.Свойство("НовыйПараметр") Тогда
100 10 Всеволод Дорофеев
        // здесь код обработки параметра
101 10 Всеволод Дорофеев
    КонецЕсли;
102 10 Всеволод Дорофеев
КонецПроцедуры
103 10 Всеволод Дорофеев
</pre>
104 11 Всеволод Дорофеев
105 12 Всеволод Дорофеев
h3. 4. Отбор в таблице значений, расположенной на форме 
106 11 Всеволод Дорофеев
107 11 Всеволод Дорофеев
Например, отбор строк в подчиненной таблице при смене "Владельца" в основной таблице
108 11 Всеволод Дорофеев
<pre>
109 11 Всеволод Дорофеев
&НаКлиенте
110 11 Всеволод Дорофеев
Процедура ИсходнаяНоменклатураПриАктивизацииСтроки(Элемент)
111 11 Всеволод Дорофеев
	
112 11 Всеволод Дорофеев
	Структура = Новый Структура("ИсходнаяНоменклатура", Элементы["ИсходнаяНоменклатура"].ТекущиеДанные.Номенклатура);
113 11 Всеволод Дорофеев
	НовыйОтбор = Новый ФиксированнаяСтруктура(Структура);
114 11 Всеволод Дорофеев
	Элементы["НоваяНоменклатура"].ОтборСтрок=НовыйОтбор;
115 11 Всеволод Дорофеев
116 11 Всеволод Дорофеев
КонецПроцедуры
117 11 Всеволод Дорофеев
118 11 Всеволод Дорофеев
</pre>
119 13 Всеволод Дорофеев
120 13 Всеволод Дорофеев
h3. Вопрос в управляемых формах
121 13 Всеволод Дорофеев
122 13 Всеволод Дорофеев
Замена функции "Вопрос(...)"
123 13 Всеволод Дорофеев
124 13 Всеволод Дорофеев
<pre>
125 13 Всеволод Дорофеев
&НаКлиенте
126 13 Всеволод Дорофеев
Процедура ЗадатьВопрос(Команда)
127 13 Всеволод Дорофеев
	
128 13 Всеволод Дорофеев
	ПоказатьВопрос(Новый ОписаниеОповещения("ОбработкаОтветаЗавершение", ЭтотОбъект), "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет);
129 13 Всеволод Дорофеев
130 13 Всеволод Дорофеев
КонецПроцедуры
131 13 Всеволод Дорофеев
132 13 Всеволод Дорофеев
&НаКлиенте
133 13 Всеволод Дорофеев
Процедура ОбработкаОтветаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
134 13 Всеволод Дорофеев
	
135 13 Всеволод Дорофеев
	Ответ = РезультатВопроса;
136 13 Всеволод Дорофеев
	
137 13 Всеволод Дорофеев
	Если Ответ <> КодВозвратаДиалога.Да Тогда
138 13 Всеволод Дорофеев
		
139 13 Всеволод Дорофеев
		Возврат;
140 13 Всеволод Дорофеев
		
141 13 Всеволод Дорофеев
	КонецЕсли;
142 13 Всеволод Дорофеев
	
143 13 Всеволод Дорофеев
	//Выполнение действий на положительный ответ
144 13 Всеволод Дорофеев
	
145 13 Всеволод Дорофеев
КонецПроцедуры
146 13 Всеволод Дорофеев
147 13 Всеволод Дорофеев
</pre>
148 14 Всеволод Дорофеев
149 14 Всеволод Дорофеев
h3. Подключение внешней компоненты из макета внешней обработки
150 14 Всеволод Дорофеев
151 14 Всеволод Дорофеев
Стандартное подключение макета из встроенной обработки:
152 14 Всеволод Дорофеев
<pre>
153 14 Всеволод Дорофеев
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ВстроеннаяОбработка.Макет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
154 14 Всеволод Дорофеев
</pre>
155 14 Всеволод Дорофеев
156 14 Всеволод Дорофеев
Подключение внешней компоненты из макета внешней обработки
157 14 Всеволод Дорофеев
<pre>
158 14 Всеволод Дорофеев
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("КомпонентаПечатиШтрихкодовLinux64")), "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
159 14 Всеволод Дорофеев
</pre>
160 15 Всеволод Дорофеев
161 15 Всеволод Дорофеев
h3. Методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища
162 15 Всеволод Дорофеев
163 15 Всеволод Дорофеев
источник http://catalog.mista.ru/public/198766/
164 15 Всеволод Дорофеев
165 15 Всеволод Дорофеев
Временное хранилище – секретное оружие
166 15 Всеволод Дорофеев
167 15 Всеволод Дорофеев
При работе с управляемыми формами быстро становится ясно, что ограничения клиент-серверного взаимодействия очень сильно сужают возможности разработчика. Поэтому, платформа 1С предоставляет хитрый секретный ход под названием «ВременноеХранилище». Эта сущность позволяет сохранить на сервере некоторое состояние между двумя серверными вызовами. Я слышу возгласы: «А кто сказал, что состояние нельзя хранить!» Справедливое замечание, состояние хранить все-таки можно, но недолго.
168 15 Всеволод Дорофеев
169 15 Всеволод Дорофеев
Временное хранилище позволяет оставить на сервере некоторые данные, а вместо них получить короткую строку – адрес временного хранилища. Этот адрес можно передать на клиента, там он будет спокойно лежать, а когда понадобятся данные из хранилища, то мы по этому адресу сможем их получить.
170 15 Всеволод Дорофеев
171 15 Всеволод Дорофеев
Для работы со временным хранилищем используются методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища.
172 15 Всеволод Дорофеев
173 15 Всеволод Дорофеев
С методом «Получить» все просто, он по заданному адресу возвращает значение, которое лежит в хранилище.
174 15 Всеволод Дорофеев
175 15 Всеволод Дорофеев
С методом «Поместить» несколько сложнее. Дело в том, что помещать можно в 2 разных хранилища – простое и хранилище формы. Хранилище формы живет на сервере столько, сколько живет сама форма. Простое хранилище живет ровно 2 серверных вызова. В синтакс-помощнике об этом написано целых несколько умных строк. Я никогда не понимал, что они означают. Опытным путем было установлено, что срок жизни – 2 серверных вызова.
176 15 Всеволод Дорофеев
177 15 Всеволод Дорофеев
    Первый – мы помещаем что-то в хранилище и возвращаем адрес на клиента.
178 15 Всеволод Дорофеев
    Клиент делает второй вызов и по этому адресу может получить данные.
179 15 Всеволод Дорофеев
    В третьем вызове по этому адресу уже ничего не будет. Платформа очистит хранилище
180 15 Всеволод Дорофеев
181 15 Всеволод Дорофеев
С хранилищем формы ситуация более интересная. Если вторым параметром метода «ПоместитьВоВременноеХранилище» передать идентификатор формы (ЭтаФорма.УникальныйИдентификатор), то данные в хранилище будут привязаны к сроку жизни формы и не будут удалятся ни в первых, ни во вторых, ни во всех прочих вызовах сервера.
182 15 Всеволод Дорофеев
183 15 Всеволод Дорофеев
Таким образом, временное хранилище, это еще одно место, в котором (помимо реквизитов формы) можно сохранять состояние на сервере. Причем, в хранилище можно хранить даже данные, которые на клиенте недоступны, а стало быть, в реквизитах формы их разместить нельзя.
184 16 Всеволод Дорофеев
185 16 Всеволод Дорофеев
186 16 Всеволод Дорофеев
h3. Динамический список? Обработка выделенных строк
187 16 Всеволод Дорофеев
188 16 Всеволод Дорофеев
<pre>
189 16 Всеволод Дорофеев
   Для каждого Эл из Элементы.СписокСпецификаций.ВыделенныеСтроки Цикл
190 16 Всеволод Дорофеев
        Сообщить(Элементы.СписокСпецификаций.ДанныеСтроки(Эл).СпецификацияСсылка);
191 16 Всеволод Дорофеев
    КонецЦикла; 	
192 16 Всеволод Дорофеев
</pre>
193 17 Всеволод Дорофеев
194 17 Всеволод Дорофеев
h3. Выделение строк в таблице на форме
195 17 Всеволод Дорофеев
196 17 Всеволод Дорофеев
<pre>
197 17 Всеволод Дорофеев
	Для каждого стр из ФормаДокумента.Объект.ОбеспечениеМатериаламиИРаботами Цикл
198 17 Всеволод Дорофеев
		ФормаДокумента.Элементы.ОбеспечениеМатериаламиИРаботами.ВыделенныеСтроки.Добавить(стр.Получитьидентификатор());                
199 17 Всеволод Дорофеев
	КонецЦикла;
200 17 Всеволод Дорофеев
</pre>
201 18 Всеволод Дорофеев
202 18 Всеволод Дорофеев
h3. Как при открытии формы определить, что создается новый элемент?
203 18 Всеволод Дорофеев
204 18 Всеволод Дорофеев
Проверять можно в обработчике события *ОбработкаЗаполнения*. Это событие возникает только при создании новых объектов.
205 18 Всеволод Дорофеев
206 18 Всеволод Дорофеев
Или в *ПриСозданииНаСервере*
207 18 Всеволод Дорофеев
208 18 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3545/hdoc
209 18 Всеволод Дорофеев
<pre>
210 18 Всеволод Дорофеев
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
211 18 Всеволод Дорофеев
212 18 Всеволод Дорофеев
    Если Параметры.Ключ.Пустая() Тогда
213 18 Всеволод Дорофеев
214 18 Всеволод Дорофеев
      Сообщить("Создается новый объект");
215 18 Всеволод Дорофеев
216 18 Всеволод Дорофеев
    КонецЕсли;
217 18 Всеволод Дорофеев
218 18 Всеволод Дорофеев
КонецПроцедуры 
219 18 Всеволод Дорофеев
</pre>
220 19 Всеволод Дорофеев
221 19 Всеволод Дорофеев
222 19 Всеволод Дорофеев
h3. Как выполнить экспортируемую процедуру объекта, находясь в его форме
223 19 Всеволод Дорофеев
224 19 Всеволод Дорофеев
{{collapse(Код...)
225 19 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev#content:4146:hdoc
226 19 Всеволод Дорофеев
<pre>
227 19 Всеволод Дорофеев
&НаКлиенте
228 19 Всеволод Дорофеев
Процедура ПересчитатьЦеныДокумента(Команда)
229 19 Всеволод Дорофеев
                
230 19 Всеволод Дорофеев
     ПересчитатьЦеныНаСервере();
231 19 Всеволод Дорофеев
                
232 19 Всеволод Дорофеев
КонецПроцедуры
233 19 Всеволод Дорофеев
234 19 Всеволод Дорофеев
&НаСервере
235 19 Всеволод Дорофеев
Процедура ПересчитатьЦеныНаСервере()
236 19 Всеволод Дорофеев
                
237 19 Всеволод Дорофеев
     ОбъектДокумента = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.Накладная"));
238 19 Всеволод Дорофеев
     ОбъектДокумента.НачислитьСкидку(10);
239 19 Всеволод Дорофеев
     ЗначениеВРеквизитФормы(ОбъектДокумента, "Объект");
240 19 Всеволод Дорофеев
                
241 19 Всеволод Дорофеев
КонецПроцедуры
242 19 Всеволод Дорофеев
243 19 Всеволод Дорофеев
</pre>
244 19 Всеволод Дорофеев
245 19 Всеволод Дорофеев
}}