Проект

Общее

Профиль

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

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

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 36 Всеволод Дорофеев
#ОткрытьФорму, #ПолучитьФорму
71 36 Всеволод Дорофеев
72 35 Всеволод Дорофеев
<pre>
73 35 Всеволод Дорофеев
СсылкаНаЭлементСправочника = Элементы.Список.ТекущаяСтрока;
74 1 Всеволод Дорофеев
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
75 36 Всеволод Дорофеев
ОткрытьФорму("Справочник.Организации.Форма.УниверсальнаяФормаОбъекта", ПараметрыФормы);
76 35 Всеволод Дорофеев
</pre>
77 35 Всеволод Дорофеев
78 35 Всеволод Дорофеев
h3.  5. Передача параметров в управляемых формах
79 10 Всеволод Дорофеев
80 10 Всеволод Дорофеев
Параметры передаются в виде структуры:
81 10 Всеволод Дорофеев
82 10 Всеволод Дорофеев
<pre>
83 10 Всеволод Дорофеев
Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
84 10 Всеволод Дорофеев
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
85 10 Всеволод Дорофеев
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();
86 10 Всеволод Дорофеев
</pre>
87 10 Всеволод Дорофеев
88 10 Всеволод Дорофеев
Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров.  Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.
89 10 Всеволод Дорофеев
90 10 Всеволод Дорофеев
Также у разработчика появилась возможность определять свои параметры (в конструкторе управляемой формы вкладка «Параметры»). Время жизни параметров ограничено обработчиком ПриСозданииНаСервере, что логично т.к. параметры требуются только при создании формы, но если данный параметр определяет уникальность формы (установлен флаг «ключевой параметр» в свойствах параметра) он будет доступен и в других обработчиках.
91 10 Всеволод Дорофеев
92 10 Всеволод Дорофеев
Для передачи специфического параметра манипуляций требуется сделать немного больше:
93 10 Всеволод Дорофеев
94 10 Всеволод Дорофеев
1. Определить в управляемой форме параметр.
95 10 Всеволод Дорофеев
96 10 Всеволод Дорофеев
В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство «Параметры», имеющее тип ДанныеФормыСтруктура)
97 10 Всеволод Дорофеев
98 10 Всеволод Дорофеев
1. Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.
99 10 Всеволод Дорофеев
100 10 Всеволод Дорофеев
Таким образом код будет иметь вид:
101 10 Всеволод Дорофеев
102 10 Всеволод Дорофеев
В месте получения формы 
103 10 Всеволод Дорофеев
<pre>
104 10 Всеволод Дорофеев
Параметры = Новый Структура("НовыйПараметр",ПоследнийЭлемент);
105 10 Всеволод Дорофеев
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
106 10 Всеволод Дорофеев
</pre>
107 10 Всеволод Дорофеев
108 10 Всеволод Дорофеев
В модуле управляемой формы  
109 10 Всеволод Дорофеев
<pre>
110 10 Всеволод Дорофеев
&НаСервере
111 10 Всеволод Дорофеев
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
112 10 Всеволод Дорофеев
    Если Параметры.Свойство("НовыйПараметр") Тогда
113 10 Всеволод Дорофеев
        // здесь код обработки параметра
114 10 Всеволод Дорофеев
    КонецЕсли;
115 10 Всеволод Дорофеев
КонецПроцедуры
116 10 Всеволод Дорофеев
</pre>
117 11 Всеволод Дорофеев
118 12 Всеволод Дорофеев
h3. 4. Отбор в таблице значений, расположенной на форме 
119 11 Всеволод Дорофеев
120 11 Всеволод Дорофеев
Например, отбор строк в подчиненной таблице при смене "Владельца" в основной таблице
121 11 Всеволод Дорофеев
<pre>
122 11 Всеволод Дорофеев
&НаКлиенте
123 11 Всеволод Дорофеев
Процедура ИсходнаяНоменклатураПриАктивизацииСтроки(Элемент)
124 11 Всеволод Дорофеев
	
125 11 Всеволод Дорофеев
	Структура = Новый Структура("ИсходнаяНоменклатура", Элементы["ИсходнаяНоменклатура"].ТекущиеДанные.Номенклатура);
126 11 Всеволод Дорофеев
	НовыйОтбор = Новый ФиксированнаяСтруктура(Структура);
127 11 Всеволод Дорофеев
	Элементы["НоваяНоменклатура"].ОтборСтрок=НовыйОтбор;
128 11 Всеволод Дорофеев
129 11 Всеволод Дорофеев
КонецПроцедуры
130 11 Всеволод Дорофеев
131 11 Всеволод Дорофеев
</pre>
132 13 Всеволод Дорофеев
133 13 Всеволод Дорофеев
h3. Вопрос в управляемых формах
134 13 Всеволод Дорофеев
135 13 Всеволод Дорофеев
Замена функции "Вопрос(...)"
136 13 Всеволод Дорофеев
137 13 Всеволод Дорофеев
<pre>
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 Всеволод Дорофеев
КонецПроцедуры
159 13 Всеволод Дорофеев
160 13 Всеволод Дорофеев
</pre>
161 14 Всеволод Дорофеев
162 14 Всеволод Дорофеев
h3. Подключение внешней компоненты из макета внешней обработки
163 14 Всеволод Дорофеев
164 14 Всеволод Дорофеев
Стандартное подключение макета из встроенной обработки:
165 14 Всеволод Дорофеев
<pre>
166 14 Всеволод Дорофеев
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ВстроеннаяОбработка.Макет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
167 14 Всеволод Дорофеев
</pre>
168 14 Всеволод Дорофеев
169 14 Всеволод Дорофеев
Подключение внешней компоненты из макета внешней обработки
170 14 Всеволод Дорофеев
<pre>
171 14 Всеволод Дорофеев
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("КомпонентаПечатиШтрихкодовLinux64")), "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
172 14 Всеволод Дорофеев
</pre>
173 15 Всеволод Дорофеев
174 15 Всеволод Дорофеев
h3. Методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища
175 15 Всеволод Дорофеев
176 15 Всеволод Дорофеев
источник http://catalog.mista.ru/public/198766/
177 15 Всеволод Дорофеев
178 15 Всеволод Дорофеев
Временное хранилище – секретное оружие
179 15 Всеволод Дорофеев
180 15 Всеволод Дорофеев
При работе с управляемыми формами быстро становится ясно, что ограничения клиент-серверного взаимодействия очень сильно сужают возможности разработчика. Поэтому, платформа 1С предоставляет хитрый секретный ход под названием «ВременноеХранилище». Эта сущность позволяет сохранить на сервере некоторое состояние между двумя серверными вызовами. Я слышу возгласы: «А кто сказал, что состояние нельзя хранить!» Справедливое замечание, состояние хранить все-таки можно, но недолго.
181 15 Всеволод Дорофеев
182 15 Всеволод Дорофеев
Временное хранилище позволяет оставить на сервере некоторые данные, а вместо них получить короткую строку – адрес временного хранилища. Этот адрес можно передать на клиента, там он будет спокойно лежать, а когда понадобятся данные из хранилища, то мы по этому адресу сможем их получить.
183 15 Всеволод Дорофеев
184 15 Всеволод Дорофеев
Для работы со временным хранилищем используются методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища.
185 15 Всеволод Дорофеев
186 15 Всеволод Дорофеев
С методом «Получить» все просто, он по заданному адресу возвращает значение, которое лежит в хранилище.
187 15 Всеволод Дорофеев
188 15 Всеволод Дорофеев
С методом «Поместить» несколько сложнее. Дело в том, что помещать можно в 2 разных хранилища – простое и хранилище формы. Хранилище формы живет на сервере столько, сколько живет сама форма. Простое хранилище живет ровно 2 серверных вызова. В синтакс-помощнике об этом написано целых несколько умных строк. Я никогда не понимал, что они означают. Опытным путем было установлено, что срок жизни – 2 серверных вызова.
189 15 Всеволод Дорофеев
190 15 Всеволод Дорофеев
    Первый – мы помещаем что-то в хранилище и возвращаем адрес на клиента.
191 15 Всеволод Дорофеев
    Клиент делает второй вызов и по этому адресу может получить данные.
192 15 Всеволод Дорофеев
    В третьем вызове по этому адресу уже ничего не будет. Платформа очистит хранилище
193 15 Всеволод Дорофеев
194 15 Всеволод Дорофеев
С хранилищем формы ситуация более интересная. Если вторым параметром метода «ПоместитьВоВременноеХранилище» передать идентификатор формы (ЭтаФорма.УникальныйИдентификатор), то данные в хранилище будут привязаны к сроку жизни формы и не будут удалятся ни в первых, ни во вторых, ни во всех прочих вызовах сервера.
195 15 Всеволод Дорофеев
196 15 Всеволод Дорофеев
Таким образом, временное хранилище, это еще одно место, в котором (помимо реквизитов формы) можно сохранять состояние на сервере. Причем, в хранилище можно хранить даже данные, которые на клиенте недоступны, а стало быть, в реквизитах формы их разместить нельзя.
197 16 Всеволод Дорофеев
198 27 Всеволод Дорофеев
h3. Динамический список. Обработка выделенных строк
199 16 Всеволод Дорофеев
200 16 Всеволод Дорофеев
<pre>
201 16 Всеволод Дорофеев
   Для каждого Эл из Элементы.СписокСпецификаций.ВыделенныеСтроки Цикл
202 16 Всеволод Дорофеев
        Сообщить(Элементы.СписокСпецификаций.ДанныеСтроки(Эл).СпецификацияСсылка);
203 1 Всеволод Дорофеев
    КонецЦикла; 	
204 20 Всеволод Дорофеев
</pre>
205 20 Всеволод Дорофеев
206 20 Всеволод Дорофеев
<pre>
207 20 Всеволод Дорофеев
	МассивСтрок = Новый Массив;
208 20 Всеволод Дорофеев
	Для Каждого Строка Из Элементы.Товары.ВыделенныеСтроки Цикл
209 20 Всеволод Дорофеев
		МассивСтрок.Добавить(Объект.Товары.НайтиПоИдентификатору(Строка));
210 1 Всеволод Дорофеев
	КонецЦикла;
211 27 Всеволод Дорофеев
212 27 Всеволод Дорофеев
</pre>
213 27 Всеволод Дорофеев
214 27 Всеволод Дорофеев
h3. Динамический список. Отбор в динамическом списке при открытии.
215 27 Всеволод Дорофеев
216 27 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3557/hdoc
217 27 Всеволод Дорофеев
218 27 Всеволод Дорофеев
<pre>
219 27 Всеволод Дорофеев
220 27 Всеволод Дорофеев
&НаКлиенте
221 27 Всеволод Дорофеев
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
222 27 Всеволод Дорофеев
223 27 Всеволод Дорофеев
	ЗначениеОтбора = Новый Структура("СерияНоменклатуры", ПараметрКоманды);
224 27 Всеволод Дорофеев
	ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора);
225 27 Всеволод Дорофеев
	
226 27 Всеволод Дорофеев
	ОткрытьФорму("РегистрСведений.ксРезультатыПроверкиКачестваСерийНоменклатуры.Форма.ФормаРезультатыПроверкиКачестваСерииНоменклатуры", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
227 27 Всеволод Дорофеев
	
228 27 Всеволод Дорофеев
КонецПроцедуры
229 20 Всеволод Дорофеев
230 16 Всеволод Дорофеев
</pre>
231 17 Всеволод Дорофеев
232 17 Всеволод Дорофеев
h3. Выделение строк в таблице на форме
233 17 Всеволод Дорофеев
234 17 Всеволод Дорофеев
<pre>
235 17 Всеволод Дорофеев
	Для каждого стр из ФормаДокумента.Объект.ОбеспечениеМатериаламиИРаботами Цикл
236 17 Всеволод Дорофеев
		ФормаДокумента.Элементы.ОбеспечениеМатериаламиИРаботами.ВыделенныеСтроки.Добавить(стр.Получитьидентификатор());                
237 17 Всеволод Дорофеев
	КонецЦикла;
238 17 Всеволод Дорофеев
</pre>
239 18 Всеволод Дорофеев
240 18 Всеволод Дорофеев
h3. Как при открытии формы определить, что создается новый элемент?
241 18 Всеволод Дорофеев
242 18 Всеволод Дорофеев
Проверять можно в обработчике события *ОбработкаЗаполнения*. Это событие возникает только при создании новых объектов.
243 18 Всеволод Дорофеев
244 18 Всеволод Дорофеев
Или в *ПриСозданииНаСервере*
245 18 Всеволод Дорофеев
246 18 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3545/hdoc
247 18 Всеволод Дорофеев
<pre>
248 18 Всеволод Дорофеев
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
249 18 Всеволод Дорофеев
250 18 Всеволод Дорофеев
    Если Параметры.Ключ.Пустая() Тогда
251 18 Всеволод Дорофеев
252 18 Всеволод Дорофеев
      Сообщить("Создается новый объект");
253 18 Всеволод Дорофеев
254 18 Всеволод Дорофеев
    КонецЕсли;
255 18 Всеволод Дорофеев
256 18 Всеволод Дорофеев
КонецПроцедуры 
257 18 Всеволод Дорофеев
</pre>
258 19 Всеволод Дорофеев
259 19 Всеволод Дорофеев
260 19 Всеволод Дорофеев
h3. Как выполнить экспортируемую процедуру объекта, находясь в его форме
261 19 Всеволод Дорофеев
262 19 Всеволод Дорофеев
{{collapse(Код...)
263 19 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev#content:4146:hdoc
264 19 Всеволод Дорофеев
<pre>
265 19 Всеволод Дорофеев
&НаКлиенте
266 19 Всеволод Дорофеев
Процедура ПересчитатьЦеныДокумента(Команда)
267 19 Всеволод Дорофеев
                
268 19 Всеволод Дорофеев
     ПересчитатьЦеныНаСервере();
269 19 Всеволод Дорофеев
                
270 19 Всеволод Дорофеев
КонецПроцедуры
271 19 Всеволод Дорофеев
272 19 Всеволод Дорофеев
&НаСервере
273 19 Всеволод Дорофеев
Процедура ПересчитатьЦеныНаСервере()
274 19 Всеволод Дорофеев
                
275 19 Всеволод Дорофеев
     ОбъектДокумента = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.Накладная"));
276 19 Всеволод Дорофеев
     ОбъектДокумента.НачислитьСкидку(10);
277 19 Всеволод Дорофеев
     ЗначениеВРеквизитФормы(ОбъектДокумента, "Объект");
278 19 Всеволод Дорофеев
                
279 19 Всеволод Дорофеев
КонецПроцедуры
280 19 Всеволод Дорофеев
281 19 Всеволод Дорофеев
</pre>
282 19 Всеволод Дорофеев
283 19 Всеволод Дорофеев
}}
284 21 Всеволод Дорофеев
285 21 Всеволод Дорофеев
286 21 Всеволод Дорофеев
h3. Переход на следующую строку в той же колонке при нажатии Enter
287 21 Всеволод Дорофеев
288 21 Всеволод Дорофеев
<pre>
289 21 Всеволод Дорофеев
&НаКлиенте
290 21 Всеволод Дорофеев
Процедура ОсновныеЯчейкиЯчейкаПриИзменении(Элемент)
291 21 Всеволод Дорофеев
	ТекущиеДанные = Элементы.ОсновныеЯчейки.ТекущиеДанные;
292 21 Всеволод Дорофеев
	ОбработатьНазначениеОсновнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка, Ложь);
293 21 Всеволод Дорофеев
	
294 21 Всеволод Дорофеев
 	Стр=Элементы.ОсновныеЯчейки.ТекущиеДанные;
295 21 Всеволод Дорофеев
    Если Стр<>Неопределено Тогда
296 21 Всеволод Дорофеев
        Если Элементы.ОсновныеЯчейки.ТекущийЭлемент.Имя="ОсновныеЯчейкиЯчейка" Тогда
297 21 Всеволод Дорофеев
            НС=Объект.ОсновныеЯчейки.НайтиСтроки(Новый Структура("НомерСтроки",Стр.НомерСтроки+1));
298 21 Всеволод Дорофеев
			Если НС.Количество()>0 Тогда
299 21 Всеволод Дорофеев
	            Элементы.ОсновныеЯчейки.ТекущаяСтрока=НС[0].ПолучитьИдентификатор();
300 21 Всеволод Дорофеев
	            Элементы.ОсновныеЯчейки.ТекущийЭлемент =Элементы.ОсновныеЯчейки.ПодчиненныеЭлементы.ОсновныеЯчейкиЯчейка;
301 21 Всеволод Дорофеев
  				ПодключитьОбработчикОжидания("ИзменитьСтрокуОжидание", 0.1, Истина);
302 21 Всеволод Дорофеев
			КонецЕсли;
303 21 Всеволод Дорофеев
        КонецЕсли;  
304 21 Всеволод Дорофеев
    КонецЕсли; 	
305 21 Всеволод Дорофеев
	
306 21 Всеволод Дорофеев
КонецПроцедуры
307 21 Всеволод Дорофеев
308 21 Всеволод Дорофеев
&НаКлиенте
309 21 Всеволод Дорофеев
Процедура ИзменитьСтрокуОжидание() Экспорт
310 21 Всеволод Дорофеев
    Элементы.ОсновныеЯчейки.ИзменитьСтроку();
311 21 Всеволод Дорофеев
КонецПроцедуры
312 21 Всеволод Дорофеев
313 21 Всеволод Дорофеев
</pre>
314 23 Всеволод Дорофеев
315 23 Всеволод Дорофеев
h3. Проблема обновления реквизитов документа в другой сессии (кэш 1С)
316 23 Всеволод Дорофеев
317 23 Всеволод Дорофеев
В динамическом списке изменения отображаются при обновлении формы. В ТЧ документа - нет.
318 23 Всеволод Дорофеев
Требуется принудительно обновлять на клиенте. Например:
319 23 Всеволод Дорофеев
320 23 Всеволод Дорофеев
<pre>
321 23 Всеволод Дорофеев
	ОповеститьОбИзменении(Тип("СправочникСсылка.СерииНоменклатуры"));
322 23 Всеволод Дорофеев
        Элементы.СПисок.Обновить();
323 23 Всеволод Дорофеев
</pre>
324 24 Всеволод Дорофеев
325 33 Всеволод Дорофеев
h3. Программное создание реквизитов (флаг) формы и расположение на форме
326 24 Всеволод Дорофеев
327 24 Всеволод Дорофеев
Флажок
328 26 Всеволод Дорофеев
https://gee12.space/komanda-flag-na-forme-1s/
329 24 Всеволод Дорофеев
<pre>
330 24 Всеволод Дорофеев
&НаСервере
331 24 Всеволод Дорофеев
Процедура ДобавитьФлажокНаСервере()
332 24 Всеволод Дорофеев
	
333 24 Всеволод Дорофеев
	//Создание реквизита
334 24 Всеволод Дорофеев
	МассивТиповБулево = Новый Массив;
335 24 Всеволод Дорофеев
    МассивТиповБулево.Добавить(Тип("Булево"));
336 24 Всеволод Дорофеев
337 24 Всеволод Дорофеев
    РеквизитФлаг = Новый РеквизитФормы("ФлагФормы",Новый ОписаниеТипов(МассивТиповБулево),,"Флаг");
338 25 Всеволод Дорофеев
    РеквизитФлаг.СохраняемыеДанные = Истина;
339 24 Всеволод Дорофеев
    НовыеРеквизиты = Новый Массив;
340 24 Всеволод Дорофеев
    НовыеРеквизиты.Добавить(РеквизитФлаг);
341 24 Всеволод Дорофеев
342 24 Всеволод Дорофеев
    ИзменитьРеквизиты(НовыеРеквизиты);
343 24 Всеволод Дорофеев
	
344 1 Всеволод Дорофеев
	//Располагаем на форме
345 25 Всеволод Дорофеев
346 25 Всеволод Дорофеев
	НоваяКоманда = Команды.Добавить("ПредварительныйПросмотр");
347 25 Всеволод Дорофеев
	НоваяКоманда.Действие = "УстановитьПредварительныйПросмотр";
348 25 Всеволод Дорофеев
	НоваяКоманда.Заголовок = "Предварительный просмотр";
349 1 Всеволод Дорофеев
	
350 25 Всеволод Дорофеев
	НовыйЭлемент = Элементы.Добавить("ФлагФормы",Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
351 25 Всеволод Дорофеев
	НовыйЭлемент.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
352 25 Всеволод Дорофеев
	НовыйЭлемент.ИмяКоманды = НоваяКоманда.Имя;
353 25 Всеволод Дорофеев
	НовыйЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
354 25 Всеволод Дорофеев
	НовыйЭлемент.ТолькоВоВсехДействиях = Истина;
355 25 Всеволод Дорофеев
	НовыйЭлемент.Пометка = ЭтаФорма["ФлагФормы"];
356 25 Всеволод Дорофеев
	
357 1 Всеволод Дорофеев
КонецПроцедуры
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 25 Всеволод Дорофеев
КонецПроцедуры
371 25 Всеволод Дорофеев
372 1 Всеволод Дорофеев
</pre>
373 33 Всеволод Дорофеев
374 33 Всеволод Дорофеев
h3. Программное создание кнопки на форме
375 33 Всеволод Дорофеев
376 33 Всеволод Дорофеев
<pre>
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 Всеволод Дорофеев
КонецПроцедуры
406 33 Всеволод Дорофеев
407 33 Всеволод Дорофеев
</pre>
408 33 Всеволод Дорофеев
409 34 Всеволод Дорофеев
Передвинуть элемент
410 34 Всеволод Дорофеев
<pre>
411 34 Всеволод Дорофеев
Элементы.Переместить(Элт,Элементы.ГруппаШапка,Элементы.ГруппаВидаОплаты);
412 34 Всеволод Дорофеев
413 34 Всеволод Дорофеев
//Элт - вновь созданный элемент,
414 34 Всеволод Дорофеев
// переместили в ГруппуШапка, перед Группой Вида оплаты 
415 34 Всеволод Дорофеев
</pre>
416 28 Всеволод Дорофеев
417 28 Всеволод Дорофеев
h3. Программный ввод на основании
418 28 Всеволод Дорофеев
419 28 Всеволод Дорофеев
https://its.1c.ru/db/content/metod8dev/src/developers/platform/qanda/form/applied/i8103562.htm
420 28 Всеволод Дорофеев
421 28 Всеволод Дорофеев
<pre>
422 28 Всеволод Дорофеев
	ПараметрыФормы = Новый Структура("Основание", Объект.Ссылка);
423 28 Всеволод Дорофеев
	ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
424 28 Всеволод Дорофеев
</pre>
425 29 Всеволод Дорофеев
426 29 Всеволод Дорофеев
h3. Обработка проверки заполнения
427 29 Всеволод Дорофеев
428 29 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3578/hdoc
429 29 Всеволод Дорофеев
Есть два события
430 30 Всеволод Дорофеев
* Обработка проверки заполнения на сервере (ОбработкаПроверкиЗаполненияНаСервере) – можно обработать в модуле формы. Предназначено *для проверки заполнения реквизитов формы*, не объекта. Для документов вызов зависит от того, установлено ли у формы документа проведение при записи. Если установлено, то вызов  при проведении, иначе при записи
431 30 Всеволод Дорофеев
* Обработка проверки заполнения (ОбработкаПроверкиЗаполнения) – можно обработать в модуле прикладного объекта.
432 31 Всеволод Дорофеев
433 31 Всеволод Дорофеев
434 31 Всеволод Дорофеев
h3. Форма выбора. Как из формы списка сделать форму выбора?
435 31 Всеволод Дорофеев
436 31 Всеволод Дорофеев
Варианты:
437 31 Всеволод Дорофеев
1.  Использовать сгенерированную платформой форму и не указывать в реквизите форму для выбора.
438 31 Всеволод Дорофеев
2. В форме списка списку назначаем РежимВыбора, на событие вешаем оповещение о выборе...
439 31 Всеволод Дорофеев
440 31 Всеволод Дорофеев
<pre>
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 Всеволод Дорофеев
454 31 Всеволод Дорофеев
КонецПроцедуры
455 31 Всеволод Дорофеев
</pre>
456 31 Всеволод Дорофеев
457 31 Всеволод Дорофеев
458 31 Всеволод Дорофеев
459 31 Всеволод Дорофеев
https://infostart.ru/1c/articles/549160/
460 31 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/2222/hdoc@208c875c
461 32 Всеволод Дорофеев
462 32 Всеволод Дорофеев
463 32 Всеволод Дорофеев
h3. Реализация ввода на основании в расширении
464 32 Всеволод Дорофеев
465 32 Всеволод Дорофеев
1. Создать общую команду, например:
466 32 Всеволод Дорофеев
"СоздатьПеремещениеСырьяНаОснованииСборкиТоваров"
467 32 Всеволод Дорофеев
Группа = Командная панель формы.Создать на основании
468 32 Всеволод Дорофеев
ТипПараметраКоманды = ДокументСсылка.СборкаТоваров
469 32 Всеволод Дорофеев
470 32 Всеволод Дорофеев
Модуль команды:
471 32 Всеволод Дорофеев
<pre>
472 32 Всеволод Дорофеев
&НаКлиенте
473 32 Всеволод Дорофеев
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
474 32 Всеволод Дорофеев
	
475 32 Всеволод Дорофеев
    СтруктураДанных	= Новый Структура("ОснованиеСборка", ПараметрКоманды);
476 32 Всеволод Дорофеев
    ПараметрыФормы 	= Новый Структура("ЗначенияЗаполнения", СтруктураДанных);
477 32 Всеволод Дорофеев
    
478 32 Всеволод Дорофеев
    ОткрытьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник,
479 32 Всеволод Дорофеев
		ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
480 32 Всеволод Дорофеев
	
481 32 Всеволод Дорофеев
КонецПроцедуры
482 32 Всеволод Дорофеев
</pre>
483 32 Всеволод Дорофеев
484 32 Всеволод Дорофеев
Из модуля документа Перемещение добавляем в расширение процедуру
485 32 Всеволод Дорофеев
486 32 Всеволод Дорофеев
<pre>
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 Всеволод Дорофеев
КонецПроцедуры
514 32 Всеволод Дорофеев
515 32 Всеволод Дорофеев
</pre>
516 32 Всеволод Дорофеев
517 32 Всеволод Дорофеев
https://wiki.programstore.ru/realizaciya-vvoda-na-osnovanii-pri-pomoshhi-rasshireniya-konfiguracii/