Проект

Общее

Профиль

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

Всеволод Дорофеев, 13.04.2023 12:43

1 1 Всеволод Дорофеев
h1. Управляемые формы 1С
2 1 Всеволод Дорофеев
3 22 Всеволод Дорофеев
{{TOC}}
4 22 Всеволод Дорофеев
5 6 Всеволод Дорофеев
h3. 1. Как программно удалить текущую строку из табличной части документа?
6 3 Всеволод Дорофеев
7 1 Всеволод Дорофеев
Для этого следует воспользоваться методом Удалить() того объекта, который является источником данных для табличной части документа. Например, для документа "ПриходнаяНакладная" с табличной частью "Товары" это будет объект ДокументТабличнаяЧасть.ПриходнаяНакладная.Товары. В модуле формы этого документа удаление текущей строки табличной части будет выглядеть следующим образом:
8 1 Всеволод Дорофеев
9 7 Всеволод Дорофеев
<pre>
10 1 Всеволод Дорофеев
ДокументОбъект.Товары.Удалить(ЭлементыФормы.Товары.ТекущаяСтрока);
11 7 Всеволод Дорофеев
</pre>
12 1 Всеволод Дорофеев
13 1 Всеволод Дорофеев
В качестве параметра метода Удалить() передается текущая строка табличной части.
14 1 Всеволод Дорофеев
15 1 Всеволод Дорофеев
Обратите внимание, что для удаления (как и для добавления) строк табличной части документа следует использовать методы табличной части (ДокументОбъект.Товары), а не методы табличного поля, отображающего эту табличную часть (ЭлементыФормы.Товары).
16 1 Всеволод Дорофеев
http://its.1c.ru/db/metod8dev/content/2481/hdoc
17 4 Всеволод Дорофеев
18 6 Всеволод Дорофеев
h3. 2. Замена "Сообщить()"
19 5 Всеволод Дорофеев
20 2 Всеволод Дорофеев
Вариант 1.
21 2 Всеволод Дорофеев
<pre>
22 2 Всеволод Дорофеев
ПоказатьОповещениеПользователя(
23 2 Всеволод Дорофеев
	НСтр("ru = 'Изменения не зарегистрированы.'")
24 2 Всеволод Дорофеев
	,,,
25 2 Всеволод Дорофеев
	БиблиотекаКартинок.Информация32);
26 2 Всеволод Дорофеев
</pre>
27 2 Всеволод Дорофеев
28 2 Всеволод Дорофеев
Вариант 2.
29 2 Всеволод Дорофеев
<pre>
30 2 Всеволод Дорофеев
    Сообщение = Новый СообщениеПользователю();
31 2 Всеволод Дорофеев
    Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает ";
32 2 Всеволод Дорофеев
    Сообщение.Поле = "Номенклатура";
33 2 Всеволод Дорофеев
34 2 Всеволод Дорофеев
    // Привязка объекта к реквизиту формы произойдет за счет
35 2 Всеволод Дорофеев
    // установленного выше по стеку соответствия методом
36 2 Всеволод Дорофеев
    // УстановитьСоответствиеОбъектаИРеквизитаФормы
37 2 Всеволод Дорофеев
    Сообщение.УстановитьДанные(ОбъектДанных);
38 2 Всеволод Дорофеев
    // Теперь у сообщения заполнено поле ПутьКДанным (установлено имя реквизита формы, до этого была пустая строка),
39 2 Всеволод Дорофеев
    // и свойство КлючДанных (установлена ссылка на документ, до этого было Неопределено)
40 2 Всеволод Дорофеев
41 2 Всеволод Дорофеев
    // Сообщение выводится пользователю
42 2 Всеволод Дорофеев
    Сообщение.Сообщить();	
43 5 Всеволод Дорофеев
</pre>
44 8 Всеволод Дорофеев
45 9 Всеволод Дорофеев
h3. 3. Открытие управляемой формы не записанного документа в 1С 8.2/8.3
46 8 Всеволод Дорофеев
47 8 Всеволод Дорофеев
<pre>
48 8 Всеволод Дорофеев
&НаКлиенте
49 8 Всеволод Дорофеев
Процедура КомандаОткрытьФорму(Команда)
50 8 Всеволод Дорофеев
	Форма = ПолучитьФорму("Справочник.Пользователи.ФормаОбъекта");
51 8 Всеволод Дорофеев
	ДанныеФормы = Форма.Объект;
52 8 Всеволод Дорофеев
	ЗаполнитьНаСервере(ДанныеФормы);
53 8 Всеволод Дорофеев
	КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
54 8 Всеволод Дорофеев
	Форма.Открыть();
55 8 Всеволод Дорофеев
КонецПроцедуры
56 8 Всеволод Дорофеев
57 8 Всеволод Дорофеев
&НаСервереБезКонтекста
58 8 Всеволод Дорофеев
Процедура ЗаполнитьНаСервере(НовыйОбъект);
59 8 Всеволод Дорофеев
        НовыйОбъект.Наименование = "Новый элемент";
60 8 Всеволод Дорофеев
	Для К=1 По 100 Цикл
61 8 Всеволод Дорофеев
	 	НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
62 8 Всеволод Дорофеев
		НоваяСтрока.РеквизитТЧ = К;
63 8 Всеволод Дорофеев
	КонецЦикла; 
64 8 Всеволод Дорофеев
КонецПроцедуры
65 8 Всеволод Дорофеев
</pre>
66 10 Всеволод Дорофеев
67 35 Всеволод Дорофеев
68 35 Всеволод Дорофеев
h3. 5. Открытие управляемой формы объекта в 1С 8.2/8.3
69 35 Всеволод Дорофеев
70 35 Всеволод Дорофеев
<pre>
71 35 Всеволод Дорофеев
СсылкаНаЭлементСправочника = Элементы.Список.ТекущаяСтрока;
72 35 Всеволод Дорофеев
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
73 35 Всеволод Дорофеев
> ОткрытьФорму("Справочник.Организации.Форма.УниверсальнаяФормаОбъекта", ПараметрыФормы);
74 35 Всеволод Дорофеев
</pre>
75 35 Всеволод Дорофеев
76 35 Всеволод Дорофеев
h3.  5. Передача параметров в управляемых формах
77 10 Всеволод Дорофеев
78 10 Всеволод Дорофеев
Параметры передаются в виде структуры:
79 10 Всеволод Дорофеев
80 10 Всеволод Дорофеев
<pre>
81 10 Всеволод Дорофеев
Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
82 10 Всеволод Дорофеев
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
83 10 Всеволод Дорофеев
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();
84 10 Всеволод Дорофеев
</pre>
85 10 Всеволод Дорофеев
86 10 Всеволод Дорофеев
Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров.  Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.
87 10 Всеволод Дорофеев
88 10 Всеволод Дорофеев
Также у разработчика появилась возможность определять свои параметры (в конструкторе управляемой формы вкладка «Параметры»). Время жизни параметров ограничено обработчиком ПриСозданииНаСервере, что логично т.к. параметры требуются только при создании формы, но если данный параметр определяет уникальность формы (установлен флаг «ключевой параметр» в свойствах параметра) он будет доступен и в других обработчиках.
89 10 Всеволод Дорофеев
90 10 Всеволод Дорофеев
Для передачи специфического параметра манипуляций требуется сделать немного больше:
91 10 Всеволод Дорофеев
92 10 Всеволод Дорофеев
1. Определить в управляемой форме параметр.
93 10 Всеволод Дорофеев
94 10 Всеволод Дорофеев
В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство «Параметры», имеющее тип ДанныеФормыСтруктура)
95 10 Всеволод Дорофеев
96 10 Всеволод Дорофеев
1. Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.
97 10 Всеволод Дорофеев
98 10 Всеволод Дорофеев
Таким образом код будет иметь вид:
99 10 Всеволод Дорофеев
100 10 Всеволод Дорофеев
В месте получения формы 
101 10 Всеволод Дорофеев
<pre>
102 10 Всеволод Дорофеев
Параметры = Новый Структура("НовыйПараметр",ПоследнийЭлемент);
103 10 Всеволод Дорофеев
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
104 10 Всеволод Дорофеев
</pre>
105 10 Всеволод Дорофеев
106 10 Всеволод Дорофеев
В модуле управляемой формы  
107 10 Всеволод Дорофеев
<pre>
108 10 Всеволод Дорофеев
&НаСервере
109 10 Всеволод Дорофеев
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
110 10 Всеволод Дорофеев
    Если Параметры.Свойство("НовыйПараметр") Тогда
111 10 Всеволод Дорофеев
        // здесь код обработки параметра
112 10 Всеволод Дорофеев
    КонецЕсли;
113 10 Всеволод Дорофеев
КонецПроцедуры
114 10 Всеволод Дорофеев
</pre>
115 11 Всеволод Дорофеев
116 12 Всеволод Дорофеев
h3. 4. Отбор в таблице значений, расположенной на форме 
117 11 Всеволод Дорофеев
118 11 Всеволод Дорофеев
Например, отбор строк в подчиненной таблице при смене "Владельца" в основной таблице
119 11 Всеволод Дорофеев
<pre>
120 11 Всеволод Дорофеев
&НаКлиенте
121 11 Всеволод Дорофеев
Процедура ИсходнаяНоменклатураПриАктивизацииСтроки(Элемент)
122 11 Всеволод Дорофеев
	
123 11 Всеволод Дорофеев
	Структура = Новый Структура("ИсходнаяНоменклатура", Элементы["ИсходнаяНоменклатура"].ТекущиеДанные.Номенклатура);
124 11 Всеволод Дорофеев
	НовыйОтбор = Новый ФиксированнаяСтруктура(Структура);
125 11 Всеволод Дорофеев
	Элементы["НоваяНоменклатура"].ОтборСтрок=НовыйОтбор;
126 11 Всеволод Дорофеев
127 11 Всеволод Дорофеев
КонецПроцедуры
128 11 Всеволод Дорофеев
129 11 Всеволод Дорофеев
</pre>
130 13 Всеволод Дорофеев
131 13 Всеволод Дорофеев
h3. Вопрос в управляемых формах
132 13 Всеволод Дорофеев
133 13 Всеволод Дорофеев
Замена функции "Вопрос(...)"
134 13 Всеволод Дорофеев
135 13 Всеволод Дорофеев
<pre>
136 13 Всеволод Дорофеев
&НаКлиенте
137 13 Всеволод Дорофеев
Процедура ЗадатьВопрос(Команда)
138 13 Всеволод Дорофеев
	
139 13 Всеволод Дорофеев
	ПоказатьВопрос(Новый ОписаниеОповещения("ОбработкаОтветаЗавершение", ЭтотОбъект), "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет);
140 13 Всеволод Дорофеев
141 13 Всеволод Дорофеев
КонецПроцедуры
142 13 Всеволод Дорофеев
143 13 Всеволод Дорофеев
&НаКлиенте
144 13 Всеволод Дорофеев
Процедура ОбработкаОтветаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
145 13 Всеволод Дорофеев
	
146 13 Всеволод Дорофеев
	Ответ = РезультатВопроса;
147 13 Всеволод Дорофеев
	
148 13 Всеволод Дорофеев
	Если Ответ <> КодВозвратаДиалога.Да Тогда
149 13 Всеволод Дорофеев
		
150 13 Всеволод Дорофеев
		Возврат;
151 13 Всеволод Дорофеев
		
152 13 Всеволод Дорофеев
	КонецЕсли;
153 13 Всеволод Дорофеев
	
154 13 Всеволод Дорофеев
	//Выполнение действий на положительный ответ
155 13 Всеволод Дорофеев
	
156 13 Всеволод Дорофеев
КонецПроцедуры
157 13 Всеволод Дорофеев
158 13 Всеволод Дорофеев
</pre>
159 14 Всеволод Дорофеев
160 14 Всеволод Дорофеев
h3. Подключение внешней компоненты из макета внешней обработки
161 14 Всеволод Дорофеев
162 14 Всеволод Дорофеев
Стандартное подключение макета из встроенной обработки:
163 14 Всеволод Дорофеев
<pre>
164 14 Всеволод Дорофеев
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ВстроеннаяОбработка.Макет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
165 14 Всеволод Дорофеев
</pre>
166 14 Всеволод Дорофеев
167 14 Всеволод Дорофеев
Подключение внешней компоненты из макета внешней обработки
168 14 Всеволод Дорофеев
<pre>
169 14 Всеволод Дорофеев
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("КомпонентаПечатиШтрихкодовLinux64")), "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
170 14 Всеволод Дорофеев
</pre>
171 15 Всеволод Дорофеев
172 15 Всеволод Дорофеев
h3. Методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища
173 15 Всеволод Дорофеев
174 15 Всеволод Дорофеев
источник http://catalog.mista.ru/public/198766/
175 15 Всеволод Дорофеев
176 15 Всеволод Дорофеев
Временное хранилище – секретное оружие
177 15 Всеволод Дорофеев
178 15 Всеволод Дорофеев
При работе с управляемыми формами быстро становится ясно, что ограничения клиент-серверного взаимодействия очень сильно сужают возможности разработчика. Поэтому, платформа 1С предоставляет хитрый секретный ход под названием «ВременноеХранилище». Эта сущность позволяет сохранить на сервере некоторое состояние между двумя серверными вызовами. Я слышу возгласы: «А кто сказал, что состояние нельзя хранить!» Справедливое замечание, состояние хранить все-таки можно, но недолго.
179 15 Всеволод Дорофеев
180 15 Всеволод Дорофеев
Временное хранилище позволяет оставить на сервере некоторые данные, а вместо них получить короткую строку – адрес временного хранилища. Этот адрес можно передать на клиента, там он будет спокойно лежать, а когда понадобятся данные из хранилища, то мы по этому адресу сможем их получить.
181 15 Всеволод Дорофеев
182 15 Всеволод Дорофеев
Для работы со временным хранилищем используются методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища.
183 15 Всеволод Дорофеев
184 15 Всеволод Дорофеев
С методом «Получить» все просто, он по заданному адресу возвращает значение, которое лежит в хранилище.
185 15 Всеволод Дорофеев
186 15 Всеволод Дорофеев
С методом «Поместить» несколько сложнее. Дело в том, что помещать можно в 2 разных хранилища – простое и хранилище формы. Хранилище формы живет на сервере столько, сколько живет сама форма. Простое хранилище живет ровно 2 серверных вызова. В синтакс-помощнике об этом написано целых несколько умных строк. Я никогда не понимал, что они означают. Опытным путем было установлено, что срок жизни – 2 серверных вызова.
187 15 Всеволод Дорофеев
188 15 Всеволод Дорофеев
    Первый – мы помещаем что-то в хранилище и возвращаем адрес на клиента.
189 15 Всеволод Дорофеев
    Клиент делает второй вызов и по этому адресу может получить данные.
190 15 Всеволод Дорофеев
    В третьем вызове по этому адресу уже ничего не будет. Платформа очистит хранилище
191 15 Всеволод Дорофеев
192 15 Всеволод Дорофеев
С хранилищем формы ситуация более интересная. Если вторым параметром метода «ПоместитьВоВременноеХранилище» передать идентификатор формы (ЭтаФорма.УникальныйИдентификатор), то данные в хранилище будут привязаны к сроку жизни формы и не будут удалятся ни в первых, ни во вторых, ни во всех прочих вызовах сервера.
193 15 Всеволод Дорофеев
194 15 Всеволод Дорофеев
Таким образом, временное хранилище, это еще одно место, в котором (помимо реквизитов формы) можно сохранять состояние на сервере. Причем, в хранилище можно хранить даже данные, которые на клиенте недоступны, а стало быть, в реквизитах формы их разместить нельзя.
195 16 Всеволод Дорофеев
196 27 Всеволод Дорофеев
h3. Динамический список. Обработка выделенных строк
197 16 Всеволод Дорофеев
198 16 Всеволод Дорофеев
<pre>
199 16 Всеволод Дорофеев
   Для каждого Эл из Элементы.СписокСпецификаций.ВыделенныеСтроки Цикл
200 16 Всеволод Дорофеев
        Сообщить(Элементы.СписокСпецификаций.ДанныеСтроки(Эл).СпецификацияСсылка);
201 1 Всеволод Дорофеев
    КонецЦикла; 	
202 20 Всеволод Дорофеев
</pre>
203 20 Всеволод Дорофеев
204 20 Всеволод Дорофеев
<pre>
205 20 Всеволод Дорофеев
	МассивСтрок = Новый Массив;
206 20 Всеволод Дорофеев
	Для Каждого Строка Из Элементы.Товары.ВыделенныеСтроки Цикл
207 20 Всеволод Дорофеев
		МассивСтрок.Добавить(Объект.Товары.НайтиПоИдентификатору(Строка));
208 1 Всеволод Дорофеев
	КонецЦикла;
209 27 Всеволод Дорофеев
210 27 Всеволод Дорофеев
</pre>
211 27 Всеволод Дорофеев
212 27 Всеволод Дорофеев
h3. Динамический список. Отбор в динамическом списке при открытии.
213 27 Всеволод Дорофеев
214 27 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3557/hdoc
215 27 Всеволод Дорофеев
216 27 Всеволод Дорофеев
<pre>
217 27 Всеволод Дорофеев
218 27 Всеволод Дорофеев
&НаКлиенте
219 27 Всеволод Дорофеев
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
220 27 Всеволод Дорофеев
221 27 Всеволод Дорофеев
	ЗначениеОтбора = Новый Структура("СерияНоменклатуры", ПараметрКоманды);
222 27 Всеволод Дорофеев
	ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора);
223 27 Всеволод Дорофеев
	
224 27 Всеволод Дорофеев
	ОткрытьФорму("РегистрСведений.ксРезультатыПроверкиКачестваСерийНоменклатуры.Форма.ФормаРезультатыПроверкиКачестваСерииНоменклатуры", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
225 27 Всеволод Дорофеев
	
226 27 Всеволод Дорофеев
КонецПроцедуры
227 20 Всеволод Дорофеев
228 16 Всеволод Дорофеев
</pre>
229 17 Всеволод Дорофеев
230 17 Всеволод Дорофеев
h3. Выделение строк в таблице на форме
231 17 Всеволод Дорофеев
232 17 Всеволод Дорофеев
<pre>
233 17 Всеволод Дорофеев
	Для каждого стр из ФормаДокумента.Объект.ОбеспечениеМатериаламиИРаботами Цикл
234 17 Всеволод Дорофеев
		ФормаДокумента.Элементы.ОбеспечениеМатериаламиИРаботами.ВыделенныеСтроки.Добавить(стр.Получитьидентификатор());                
235 17 Всеволод Дорофеев
	КонецЦикла;
236 17 Всеволод Дорофеев
</pre>
237 18 Всеволод Дорофеев
238 18 Всеволод Дорофеев
h3. Как при открытии формы определить, что создается новый элемент?
239 18 Всеволод Дорофеев
240 18 Всеволод Дорофеев
Проверять можно в обработчике события *ОбработкаЗаполнения*. Это событие возникает только при создании новых объектов.
241 18 Всеволод Дорофеев
242 18 Всеволод Дорофеев
Или в *ПриСозданииНаСервере*
243 18 Всеволод Дорофеев
244 18 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3545/hdoc
245 18 Всеволод Дорофеев
<pre>
246 18 Всеволод Дорофеев
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
247 18 Всеволод Дорофеев
248 18 Всеволод Дорофеев
    Если Параметры.Ключ.Пустая() Тогда
249 18 Всеволод Дорофеев
250 18 Всеволод Дорофеев
      Сообщить("Создается новый объект");
251 18 Всеволод Дорофеев
252 18 Всеволод Дорофеев
    КонецЕсли;
253 18 Всеволод Дорофеев
254 18 Всеволод Дорофеев
КонецПроцедуры 
255 18 Всеволод Дорофеев
</pre>
256 19 Всеволод Дорофеев
257 19 Всеволод Дорофеев
258 19 Всеволод Дорофеев
h3. Как выполнить экспортируемую процедуру объекта, находясь в его форме
259 19 Всеволод Дорофеев
260 19 Всеволод Дорофеев
{{collapse(Код...)
261 19 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev#content:4146:hdoc
262 19 Всеволод Дорофеев
<pre>
263 19 Всеволод Дорофеев
&НаКлиенте
264 19 Всеволод Дорофеев
Процедура ПересчитатьЦеныДокумента(Команда)
265 19 Всеволод Дорофеев
                
266 19 Всеволод Дорофеев
     ПересчитатьЦеныНаСервере();
267 19 Всеволод Дорофеев
                
268 19 Всеволод Дорофеев
КонецПроцедуры
269 19 Всеволод Дорофеев
270 19 Всеволод Дорофеев
&НаСервере
271 19 Всеволод Дорофеев
Процедура ПересчитатьЦеныНаСервере()
272 19 Всеволод Дорофеев
                
273 19 Всеволод Дорофеев
     ОбъектДокумента = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.Накладная"));
274 19 Всеволод Дорофеев
     ОбъектДокумента.НачислитьСкидку(10);
275 19 Всеволод Дорофеев
     ЗначениеВРеквизитФормы(ОбъектДокумента, "Объект");
276 19 Всеволод Дорофеев
                
277 19 Всеволод Дорофеев
КонецПроцедуры
278 19 Всеволод Дорофеев
279 19 Всеволод Дорофеев
</pre>
280 19 Всеволод Дорофеев
281 19 Всеволод Дорофеев
}}
282 21 Всеволод Дорофеев
283 21 Всеволод Дорофеев
284 21 Всеволод Дорофеев
h3. Переход на следующую строку в той же колонке при нажатии Enter
285 21 Всеволод Дорофеев
286 21 Всеволод Дорофеев
<pre>
287 21 Всеволод Дорофеев
&НаКлиенте
288 21 Всеволод Дорофеев
Процедура ОсновныеЯчейкиЯчейкаПриИзменении(Элемент)
289 21 Всеволод Дорофеев
	ТекущиеДанные = Элементы.ОсновныеЯчейки.ТекущиеДанные;
290 21 Всеволод Дорофеев
	ОбработатьНазначениеОсновнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка, Ложь);
291 21 Всеволод Дорофеев
	
292 21 Всеволод Дорофеев
 	Стр=Элементы.ОсновныеЯчейки.ТекущиеДанные;
293 21 Всеволод Дорофеев
    Если Стр<>Неопределено Тогда
294 21 Всеволод Дорофеев
        Если Элементы.ОсновныеЯчейки.ТекущийЭлемент.Имя="ОсновныеЯчейкиЯчейка" Тогда
295 21 Всеволод Дорофеев
            НС=Объект.ОсновныеЯчейки.НайтиСтроки(Новый Структура("НомерСтроки",Стр.НомерСтроки+1));
296 21 Всеволод Дорофеев
			Если НС.Количество()>0 Тогда
297 21 Всеволод Дорофеев
	            Элементы.ОсновныеЯчейки.ТекущаяСтрока=НС[0].ПолучитьИдентификатор();
298 21 Всеволод Дорофеев
	            Элементы.ОсновныеЯчейки.ТекущийЭлемент =Элементы.ОсновныеЯчейки.ПодчиненныеЭлементы.ОсновныеЯчейкиЯчейка;
299 21 Всеволод Дорофеев
  				ПодключитьОбработчикОжидания("ИзменитьСтрокуОжидание", 0.1, Истина);
300 21 Всеволод Дорофеев
			КонецЕсли;
301 21 Всеволод Дорофеев
        КонецЕсли;  
302 21 Всеволод Дорофеев
    КонецЕсли; 	
303 21 Всеволод Дорофеев
	
304 21 Всеволод Дорофеев
КонецПроцедуры
305 21 Всеволод Дорофеев
306 21 Всеволод Дорофеев
&НаКлиенте
307 21 Всеволод Дорофеев
Процедура ИзменитьСтрокуОжидание() Экспорт
308 21 Всеволод Дорофеев
    Элементы.ОсновныеЯчейки.ИзменитьСтроку();
309 21 Всеволод Дорофеев
КонецПроцедуры
310 21 Всеволод Дорофеев
311 21 Всеволод Дорофеев
</pre>
312 23 Всеволод Дорофеев
313 23 Всеволод Дорофеев
h3. Проблема обновления реквизитов документа в другой сессии (кэш 1С)
314 23 Всеволод Дорофеев
315 23 Всеволод Дорофеев
В динамическом списке изменения отображаются при обновлении формы. В ТЧ документа - нет.
316 23 Всеволод Дорофеев
Требуется принудительно обновлять на клиенте. Например:
317 23 Всеволод Дорофеев
318 23 Всеволод Дорофеев
<pre>
319 23 Всеволод Дорофеев
	ОповеститьОбИзменении(Тип("СправочникСсылка.СерииНоменклатуры"));
320 23 Всеволод Дорофеев
        Элементы.СПисок.Обновить();
321 23 Всеволод Дорофеев
</pre>
322 24 Всеволод Дорофеев
323 33 Всеволод Дорофеев
h3. Программное создание реквизитов (флаг) формы и расположение на форме
324 24 Всеволод Дорофеев
325 24 Всеволод Дорофеев
Флажок
326 26 Всеволод Дорофеев
https://gee12.space/komanda-flag-na-forme-1s/
327 24 Всеволод Дорофеев
<pre>
328 24 Всеволод Дорофеев
&НаСервере
329 24 Всеволод Дорофеев
Процедура ДобавитьФлажокНаСервере()
330 24 Всеволод Дорофеев
	
331 24 Всеволод Дорофеев
	//Создание реквизита
332 24 Всеволод Дорофеев
	МассивТиповБулево = Новый Массив;
333 24 Всеволод Дорофеев
    МассивТиповБулево.Добавить(Тип("Булево"));
334 24 Всеволод Дорофеев
335 24 Всеволод Дорофеев
    РеквизитФлаг = Новый РеквизитФормы("ФлагФормы",Новый ОписаниеТипов(МассивТиповБулево),,"Флаг");
336 25 Всеволод Дорофеев
    РеквизитФлаг.СохраняемыеДанные = Истина;
337 24 Всеволод Дорофеев
    НовыеРеквизиты = Новый Массив;
338 24 Всеволод Дорофеев
    НовыеРеквизиты.Добавить(РеквизитФлаг);
339 24 Всеволод Дорофеев
340 24 Всеволод Дорофеев
    ИзменитьРеквизиты(НовыеРеквизиты);
341 24 Всеволод Дорофеев
	
342 1 Всеволод Дорофеев
	//Располагаем на форме
343 25 Всеволод Дорофеев
344 25 Всеволод Дорофеев
	НоваяКоманда = Команды.Добавить("ПредварительныйПросмотр");
345 25 Всеволод Дорофеев
	НоваяКоманда.Действие = "УстановитьПредварительныйПросмотр";
346 25 Всеволод Дорофеев
	НоваяКоманда.Заголовок = "Предварительный просмотр";
347 1 Всеволод Дорофеев
	
348 25 Всеволод Дорофеев
	НовыйЭлемент = Элементы.Добавить("ФлагФормы",Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
349 25 Всеволод Дорофеев
	НовыйЭлемент.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
350 25 Всеволод Дорофеев
	НовыйЭлемент.ИмяКоманды = НоваяКоманда.Имя;
351 25 Всеволод Дорофеев
	НовыйЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
352 25 Всеволод Дорофеев
	НовыйЭлемент.ТолькоВоВсехДействиях = Истина;
353 25 Всеволод Дорофеев
	НовыйЭлемент.Пометка = ЭтаФорма["ФлагФормы"];
354 25 Всеволод Дорофеев
	
355 1 Всеволод Дорофеев
КонецПроцедуры
356 25 Всеволод Дорофеев
357 25 Всеволод Дорофеев
&НаКлиенте
358 25 Всеволод Дорофеев
Процедура ДобавитьФлажок(Команда)
359 25 Всеволод Дорофеев
	ДобавитьФлажокНаСервере();
360 25 Всеволод Дорофеев
КонецПроцедуры
361 25 Всеволод Дорофеев
362 25 Всеволод Дорофеев
&НаКлиенте
363 25 Всеволод Дорофеев
Процедура УстановитьПредварительныйПросмотр(Команда)
364 25 Всеволод Дорофеев
365 25 Всеволод Дорофеев
	ЭтаФорма["ФлагФормы"] = не ЭтаФорма["ФлагФормы"];
366 25 Всеволод Дорофеев
	Элементы.ФлагФормы.Пометка = ЭтаФорма["ФлагФормы"];
367 25 Всеволод Дорофеев
368 25 Всеволод Дорофеев
КонецПроцедуры
369 25 Всеволод Дорофеев
370 1 Всеволод Дорофеев
</pre>
371 33 Всеволод Дорофеев
372 33 Всеволод Дорофеев
h3. Программное создание кнопки на форме
373 33 Всеволод Дорофеев
374 33 Всеволод Дорофеев
<pre>
375 33 Всеволод Дорофеев
&НаСервере
376 33 Всеволод Дорофеев
Процедура КСФормы_ксУведомитьОКОПоступленииПослеНаСервере()
377 33 Всеволод Дорофеев
	// Вставить содержимое обработчика.
378 33 Всеволод Дорофеев
КонецПроцедуры
379 33 Всеволод Дорофеев
380 33 Всеволод Дорофеев
&НаКлиенте
381 33 Всеволод Дорофеев
Процедура КСФормы_ксУведомитьОКОПоступленииПосле(Команда)
382 33 Всеволод Дорофеев
383 33 Всеволод Дорофеев
	КСФормы_ксУведомитьОКОПоступленииПослеНаСервере();
384 33 Всеволод Дорофеев
385 33 Всеволод Дорофеев
КонецПроцедуры
386 33 Всеволод Дорофеев
387 33 Всеволод Дорофеев
&НаСервере
388 33 Всеволод Дорофеев
Процедура КСФормы_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
389 33 Всеволод Дорофеев
	
390 33 Всеволод Дорофеев
	// Новая команда
391 33 Всеволод Дорофеев
	ИмяКоманды = "ксУведомитьОКОПоступленииПосле";
392 33 Всеволод Дорофеев
    Команда		= ЭтотОбъект.Команды.Добавить(ИмяКоманды);
393 33 Всеволод Дорофеев
    Команда.Действие	= "КСФормы_ксУведомитьОКОПоступленииПосле";
394 33 Всеволод Дорофеев
	Команда.Заголовок = "Уведомить ОК о поступлении";
395 33 Всеволод Дорофеев
	Команда.Подсказка = "Уведомить Отдел Качества о поступлении";
396 33 Всеволод Дорофеев
	Команда.Картинка = БиблиотекаКартинок.ОтправитьСообщение;
397 33 Всеволод Дорофеев
    Команда.Отображение = ОтображениеКнопки.КартинкаИТекст;
398 33 Всеволод Дорофеев
	
399 33 Всеволод Дорофеев
    // Кнопка с привязкой команды
400 33 Всеволод Дорофеев
    Кнопка		= ЭтотОбъект.Элементы.Добавить("ксСписокУведомитьОКОПоступленииПосле", Тип("КнопкаФормы"), ЭтотОбъект.Элементы.СписокКоманднаяПанель);
401 33 Всеволод Дорофеев
    Кнопка.ИмяКоманды	= ИмяКоманды;
402 33 Всеволод Дорофеев
403 33 Всеволод Дорофеев
КонецПроцедуры
404 33 Всеволод Дорофеев
405 33 Всеволод Дорофеев
</pre>
406 33 Всеволод Дорофеев
407 34 Всеволод Дорофеев
Передвинуть элемент
408 34 Всеволод Дорофеев
<pre>
409 34 Всеволод Дорофеев
Элементы.Переместить(Элт,Элементы.ГруппаШапка,Элементы.ГруппаВидаОплаты);
410 34 Всеволод Дорофеев
411 34 Всеволод Дорофеев
//Элт - вновь созданный элемент,
412 34 Всеволод Дорофеев
// переместили в ГруппуШапка, перед Группой Вида оплаты 
413 34 Всеволод Дорофеев
</pre>
414 28 Всеволод Дорофеев
415 28 Всеволод Дорофеев
h3. Программный ввод на основании
416 28 Всеволод Дорофеев
417 28 Всеволод Дорофеев
https://its.1c.ru/db/content/metod8dev/src/developers/platform/qanda/form/applied/i8103562.htm
418 28 Всеволод Дорофеев
419 28 Всеволод Дорофеев
<pre>
420 28 Всеволод Дорофеев
	ПараметрыФормы = Новый Структура("Основание", Объект.Ссылка);
421 28 Всеволод Дорофеев
	ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
422 28 Всеволод Дорофеев
</pre>
423 29 Всеволод Дорофеев
424 29 Всеволод Дорофеев
h3. Обработка проверки заполнения
425 29 Всеволод Дорофеев
426 29 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3578/hdoc
427 29 Всеволод Дорофеев
Есть два события
428 30 Всеволод Дорофеев
* Обработка проверки заполнения на сервере (ОбработкаПроверкиЗаполненияНаСервере) – можно обработать в модуле формы. Предназначено *для проверки заполнения реквизитов формы*, не объекта. Для документов вызов зависит от того, установлено ли у формы документа проведение при записи. Если установлено, то вызов  при проведении, иначе при записи
429 30 Всеволод Дорофеев
* Обработка проверки заполнения (ОбработкаПроверкиЗаполнения) – можно обработать в модуле прикладного объекта.
430 31 Всеволод Дорофеев
431 31 Всеволод Дорофеев
432 31 Всеволод Дорофеев
h3. Форма выбора. Как из формы списка сделать форму выбора?
433 31 Всеволод Дорофеев
434 31 Всеволод Дорофеев
Варианты:
435 31 Всеволод Дорофеев
1.  Использовать сгенерированную платформой форму и не указывать в реквизите форму для выбора.
436 31 Всеволод Дорофеев
2. В форме списка списку назначаем РежимВыбора, на событие вешаем оповещение о выборе...
437 31 Всеволод Дорофеев
438 31 Всеволод Дорофеев
<pre>
439 31 Всеволод Дорофеев
Процедура ФормаСпискаВыбораПриСозданииНаСервере(Знач Список, Знач ЭлементФормыСписок, Знач Параметры, Знач АвтоматическоеСохранениеПользовательскихНастроек = Ложь) Экспорт
440 31 Всеволод Дорофеев
    
441 31 Всеволод Дорофеев
    // Элементы.Список - основной реквизит с динамическим списком
442 31 Всеволод Дорофеев
    ЭлементФормыСписок.РежимВыбора = Параметры.РежимВыбора;
443 31 Всеволод Дорофеев
    Если Параметры.МножественныйВыбор <> Неопределено Тогда
444 31 Всеволод Дорофеев
        ЭлементФормыСписок.МножественныйВыбор = Параметры.МножественныйВыбор;
445 31 Всеволод Дорофеев
    КонецЕсли;
446 31 Всеволод Дорофеев
    // обход автоматического сохранения пользовательских настроек для разных режимов
447 31 Всеволод Дорофеев
    Если Параметры.РежимВыбора И Не ЗначениеЗаполнено(Параметры.КлючПользовательскихНастроек) Тогда
448 31 Всеволод Дорофеев
        Параметры.КлючПользовательскихНастроек = "РежимВыбора";
449 31 Всеволод Дорофеев
        Список.АвтоматическоеСохранениеПользовательскихНастроек = АвтоматическоеСохранениеПользовательскихНастроек;
450 31 Всеволод Дорофеев
    КонецЕсли;
451 31 Всеволод Дорофеев
452 31 Всеволод Дорофеев
КонецПроцедуры
453 31 Всеволод Дорофеев
</pre>
454 31 Всеволод Дорофеев
455 31 Всеволод Дорофеев
456 31 Всеволод Дорофеев
457 31 Всеволод Дорофеев
https://infostart.ru/1c/articles/549160/
458 31 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/2222/hdoc@208c875c
459 32 Всеволод Дорофеев
460 32 Всеволод Дорофеев
461 32 Всеволод Дорофеев
h3. Реализация ввода на основании в расширении
462 32 Всеволод Дорофеев
463 32 Всеволод Дорофеев
1. Создать общую команду, например:
464 32 Всеволод Дорофеев
"СоздатьПеремещениеСырьяНаОснованииСборкиТоваров"
465 32 Всеволод Дорофеев
Группа = Командная панель формы.Создать на основании
466 32 Всеволод Дорофеев
ТипПараметраКоманды = ДокументСсылка.СборкаТоваров
467 32 Всеволод Дорофеев
468 32 Всеволод Дорофеев
Модуль команды:
469 32 Всеволод Дорофеев
<pre>
470 32 Всеволод Дорофеев
&НаКлиенте
471 32 Всеволод Дорофеев
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
472 32 Всеволод Дорофеев
	
473 32 Всеволод Дорофеев
    СтруктураДанных	= Новый Структура("ОснованиеСборка", ПараметрКоманды);
474 32 Всеволод Дорофеев
    ПараметрыФормы 	= Новый Структура("ЗначенияЗаполнения", СтруктураДанных);
475 32 Всеволод Дорофеев
    
476 32 Всеволод Дорофеев
    ОткрытьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник,
477 32 Всеволод Дорофеев
		ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
478 32 Всеволод Дорофеев
	
479 32 Всеволод Дорофеев
КонецПроцедуры
480 32 Всеволод Дорофеев
</pre>
481 32 Всеволод Дорофеев
482 32 Всеволод Дорофеев
Из модуля документа Перемещение добавляем в расширение процедуру
483 32 Всеволод Дорофеев
484 32 Всеволод Дорофеев
<pre>
485 32 Всеволод Дорофеев
486 32 Всеволод Дорофеев
&После("ОбработкаЗаполнения")
487 32 Всеволод Дорофеев
Процедура Расш_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
488 32 Всеволод Дорофеев
489 32 Всеволод Дорофеев
	Перем ОснованиеСборка;
490 32 Всеволод Дорофеев
	
491 32 Всеволод Дорофеев
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
492 32 Всеволод Дорофеев
 
493 32 Всеволод Дорофеев
		Если ДанныеЗаполнения.Свойство("ОснованиеСборка", ОснованиеСборка) Тогда
494 32 Всеволод Дорофеев
 
495 32 Всеволод Дорофеев
			Если ТипЗнч(ОснованиеСборка) = Тип("ДокументСсылка.СборкаТоваров") Тогда
496 32 Всеволод Дорофеев
497 32 Всеволод Дорофеев
				ЗаполнитьЗначенияСвойств(ЭтотОбъект, ОснованиеСборка);
498 32 Всеволод Дорофеев
499 32 Всеволод Дорофеев
				Для Каждого СтрокаОснование Из ОснованиеСборка.Товары Цикл 
500 32 Всеволод Дорофеев
501 32 Всеволод Дорофеев
					НовСтр = Товары.Добавить();
502 32 Всеволод Дорофеев
					ЗаполнитьЗначенияСвойств(НовСтр, СтрокаОснование);
503 32 Всеволод Дорофеев
504 32 Всеволод Дорофеев
				КонецЦикла;
505 32 Всеволод Дорофеев
506 32 Всеволод Дорофеев
			КонецЕсли;
507 32 Всеволод Дорофеев
	
508 32 Всеволод Дорофеев
		КонецЕсли;
509 32 Всеволод Дорофеев
	КонецЕсли;
510 32 Всеволод Дорофеев
511 32 Всеволод Дорофеев
КонецПроцедуры
512 32 Всеволод Дорофеев
513 32 Всеволод Дорофеев
</pre>
514 32 Всеволод Дорофеев
515 32 Всеволод Дорофеев
https://wiki.programstore.ru/realizaciya-vvoda-na-osnovanii-pri-pomoshhi-rasshireniya-konfiguracii/