Единый семинар «1С» для бухгалтеров и руководителей

Подбор в управляемой форме - что может быть проще?

Программирование - Работа с интерфейсом

Технологии модальности сейчас меняются на технологии асинхронности, многопоточности и прочие дивные вещи, что, в свою очередь, заставляет людей еще чаще спрашивать о том, что да как в этой новой нелегкой жизни. Разбираемся!

Добрый день, коллеги!

Сегодня наше радио ведет репортаж из зоны, не входящей в зону комфорта многих жителей местного галактического скопления. Чтобы внести ясность и убрать сумятицу, я решил еще раз коснуться давно известной продвинутым бомбардирам 1С методики асинхронного открытия формы для подбора нужных и полезных данных из различных внешних формочек.

Навела меня на мысль рассказать об этом еще раз некая Анна, создавшая эту вот тему, в которой в очередной раз встречаю я богомерзкие слова "Результат = Форма.ОткрытьМодально()", а нервы то уже не те!!! )))

Итак, приступим к тому, чтобы внести ясность.

СУТЬ ЗАДАЧИ

Есть форма документа, есть справочник, данные из которого нужно поместить в таблицу формы документа (или в реквизит формы, или еще куда - тут это вопрос второй).

Некоторые "программисты" (ну да, назовем так), которые еще не вкусили прелестей нового мира и нового мирового порядка, все еще для подобных действий не находят ничего лучше, чем использовать старый и проверенный "Элементик = ОткрытьФормуМодально(ИмяФормы, ...);", а кое-кто сначала форму получает в переменную и только потом открывает (как в том самом вопросе на форуме, с которого все началось). Ну не на олимпиаде он - за дополнительную переменную балл не снижают (зряплату не понижают).

СУТЬ ВЕЩЕЙ

До сих пор многие матерые кулхацкеры плюются в сторону асинхронности и запрета модальности, но, по-сути, в плане подбора ничего не изменилось. Как была некая асинхронность (т.е. отдельная процедура обработки выбора), так она и осталась. Просто и форму можно открывать теперь асинхронно, выделяя процедуру обработки результата в отдельную процедуру и таким образом объединять все обработчики в одной функции, а не раскидывать их по всему модулю формы. Также никто не мешает вынести обработчики вообще в отдельный модуль.

Давайте ответим на главный вопрос статьи: "как организовать подбор в управляемой форме?" Для этого откроем форму с признаком "ЗакрыватьПриВыборе = ложь"  и "РежимВыбора = истина":

&НаКлиенте
Процедура Подбор(Команда)

	ОткрытьФорму(
		"Справочник.Справочник1.ФормаВыбора", 
		Новый Структура("ЗакрыватьПриВыборе, РежимВыбора", 
			Ложь, Истина), 
			ЭтаФорма
			, , , ,
			Новый ОписаниеОповещения(
				"ПриЗакрытииФормыПодбора", 
				ЭтаФорма, 
				"Подбор"), 
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
	);

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

В приведенном коде открывается форма выбора справочника "Справочник1", также предполагается, что у нас есть экспортная клиентская процедура "ПриЗакрытииФормыПодбора", которая будет вызваться при закрытии формы выбора.

Т.к. у нас параметр "ЗакрыватьПриВыборе" установлен в "ложь", то форма справочника при двойном клике или нажатии клавиши "Энтер" на элементе закрываться не будет. При этом т.к. параметр "РежимВыбора" установлен в "Истина", то каждый даблклик и "Энтер" будет генерировать событие "ОбработкаВыбора" во владельце. Таким образом, если у нас, например, каждый раз, когда выбирают элемент в форме выбора, должна добавиться строка табличной части, код дополнится вот такой процедурой:

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
КонецПроцедуры

Нужно иметь ввиду, что обработка выбора - это не просто функция, а событие формы, соответственно создавать ее лучше через выбор соответствующего события в списке процедур и функций (энтузиасты этого дела могут создать процедуру, а потом выбрать ее в спсике над кодом формы или вообще в событиях формы).

Код, приведенный выше, всего-то добавляет новую строку в табличную часть "ТабличнаяЧасть1" и устанавливает там в реквизит "ФИО" выбранный в форме подбора элемент справочника.

Для красочности картины давайте дополним код процедурой, обрабатывающей закрытие формы выбора:

&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт 
	Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры

В данном случае при закрытии формы владельца просто вывалится сообщение: "Ура, форма подбора закрыта!".

 

РАЗВИТИЕ НАСТУПЛЕНИЯ

Мы можем, конечно, вообще не использовать обработку выбора при выборе единичного значения. Для этого достаточно переписать открытие формы выбора таким образом, чтобы параметр "ЗакрыватьПриВыборе" устанавливался в "Истина". Но и обработку выбора значения нужно будет реализовать в асинхронной процедуре, указанной в описании оповещения:

&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт 
	// если ничего не выбрали, то в рез будет пусто...
	Если НЕ Рез = Неопределено Тогда 
		Объект.ТабличнаяЧасть1.Добавить().ФИО = Рез;
	КонецЕсли;
	//Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры

//&НаКлиенте
//Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
//	Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
//КонецПроцедуры

В этом коде мы убрали процедуру обработки выбора, т.к. если бы мы ее оставили, то у нас создались бы две строки. Почему? Над этим вопросом рекомендую подумать факультативно (в качестве домашнего задания, если кто хочет).

Также в обработке асинхронного оповещения необходимо контролировать возвращенный результат. Если результат пустой, то это говорит о том, что форму просто закрыли, не выбрав никакого значения. Для этого в коде добавлена проверка на "Рез = Неопределено".

Давайте окончательно разберемся с темой и добавим возможность ввода, например, количества "ФИО" в документе. Для этого пропишем еще одну асинхронную процедуру, которая будет обрабатывать ввод числового значения. Для этого вернем "ложь" для параметра формы "ЗакрыватьПриВыборе", раскомментируем процедуру "ОбработкаВыбора" и убурем из процедуры асинхронного оповещения добавление строки:


&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт 
	//если ничего не выбрали, то в рез будет пусто...
	//Если НЕ Рез = Неопределено Тогда 
	//	Объект.ТабличнаяЧасть1.Добавить().ФИО = Рез;
	//КонецЕсли;
	// снова "Уга, товагищи!"
	Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

	ПоказатьВводЧисла(
		Новый ОписаниеОповещения("ПриВводеЧисла",
			ЭтаФорма,
			ВыбранноеЗначение), , // вот тут у нас как раз появился доппараметр
		"Введите количество ФИО",
		10,
		0
	);
	
КонецПроцедуры

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

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

Итак, тут мы помимо прочего не просто добавляем новую строку, а, если такое "ФИО" уже есть, добавляем выбранное количество в него (увеличиваем поле "Колво"). И тут нам как раз пригождается второй аргумент процедуры обработки оповещения - "ДополнительныеПараметры" (для друзей управляемых форм просто "доп"). В этот аргумент мы можем засунуть что угодно, когда создаем описание оповещения - очень, на мой взгляд, удобно. Тут как раз мы сохраняем выбранный элемент (чтобы не плодить никому не нужные переменные).

ЗАКЛЮЧЕНИЕ

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

См. также

Лучшие комментарии
17. Oleg Space (spacecraft) 19.09.17 11:06 Сейчас в теме
Придрались к наименованию переменных. Это больше к рефакторингу относится.
Тут есть программная "ошибка".
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
КонецПроцедуры

Да и в другом примере ОбработкаВыбора. Этот код не всегда будет работать как задумано.
TreeDogNight; pbazeliuk; NSerget; jONES1979; +4 Ответить
Остальные комментарии
1. Денис Харченко (nomadon) 169 19.09.17 07:07 Сейчас в теме
Сначала задается планка где лишняя переменная - это плохо, а потом в, собственном коде, Рез и Доп. Отсюда вывод, даже несколько, но некоторые до конца не ясны:
1. Если обгадил чужой код - самому можно плохокодить
2. Чужой код гадь, а в свой не смотри
3. Даже если знаешь что плохогодить нельзя, но ничего с этим сделать не можешь - посмотри в чужой код и скажи что там еще хуже


Доброе утро;)
kadild; PoZiTiFFF; bulpi; Gorus; TreeDogNight; jONES1979; NN2P; uri1978; awk; Tolpinski; mmoozzgg; +11 Ответить
2. Sergey Andreev (starik-2005) 1224 19.09.17 09:17 Сейчас в теме
(1) рез и доп - обязательные аргументы функции оповещения. Без них она работать не будет. Учим мат.часть.

Ну, как я и говорил, подтянулись "программисты", плохо владеющие механизмами платформы. Но для остальных появилась возможность учиться на чужих ошибках)))
kadild; Anchoret; uri1978; Sheriff1987; KSy; корум; +6 1 Ответить
9. Денис Харченко (nomadon) 169 19.09.17 10:03 Сейчас в теме
(2) я не про наличие параметров в процедуре (кстати это процедура а не функция), а про смысловое наименование переменных
11. Sergey Andreev (starik-2005) 1224 19.09.17 10:08 Сейчас в теме
(9) в С вообще процедур нет - одни функции, но некоторые из них не возвращают значение. Так что разницы между словами "процедура" и "функция" практически нет. Главное, что свою функцию данная процедура выполняет. Помните картинку о всей сути критиков со словами "горизонт завален"? Вот в этом вся суть Вашей критики. Молодежи может даже интересно на этот диалог посмотреть, так что не зря.
14. Денис Харченко (nomadon) 169 19.09.17 10:21 Сейчас в теме
(11) ну тогда можно вообще в нулях и единицах пример писать, функция процедуры тоже будет выполняться)
15. Sergey Andreev (starik-2005) 1224 19.09.17 10:31 Сейчас в теме
(14) ну если заговорили о нулях и единицах, то в ассемблере нет различий в вызове процедур и функций, а машинному коду об именах переменных ничего не известно.

По поводу стандартов, то они предписывают именовать переменные так, чтобы была ясна их суть. С "рез" и "доп" суть ясна. Проблема тут в интерпретации стандартов с Вашей стороны.
16. Денис Харченко (nomadon) 169 19.09.17 10:36 Сейчас в теме
(15) а мы пишем код что бы кому было ясно?
1. машине?
2. тому кто писал это код?
3. тому кто не писал этот код?

Если учитывать последнее, то принимает решение о допустимости кода совсем не тот кто его писал а тот для кого.
Brawler; mvxyz; kuzyara; BlizD; TreeDogNight; +5 Ответить
7. Sergey Andreev (starik-2005) 1224 19.09.17 09:51 Сейчас в теме
(1) если говорить о коде, то, как я понял, Ваша придирка была к поименованию переменных. Т.к. 1с - это чаще всего открытый код и данное замечание справедливо. Моя же придирка была к использованию лишней переменной - за это в олимпиадном программировании снижают балл, ибо это грубая ошибка, влияющая на производительность.
10. Денис Харченко (nomadon) 169 19.09.17 10:05 Сейчас в теме
(7) моя придирка в общем впечатлении, если сами себе поднимаете планку - то приводить дурацкие ошибки в пример - глупо.
12. Sergey Andreev (starik-2005) 1224 19.09.17 10:09 Сейчас в теме
(10) ошибки с именем переменной? Это не ошибки. Но да, горизонт завален)))
13. Денис Харченко (nomadon) 169 19.09.17 10:19 Сейчас в теме
(12) если не считать нарушение стандартов разработки ошибкой то не ошибка)
3. Виталий Попов (Сурикат) 158 19.09.17 09:23 Сейчас в теме
Имелось ввиду, что название переменных не отображает их суть.
Неужели так сложно написать Результат, ДополнительныеПараметры?

А если процедура получиться не маленькая в конце уже и можно запутаться в сокращениях...
kadild; mvxyz; PoZiTiFFF; Gorus; TreeDogNight; Prikum; +6 Ответить
4. Sergey Andreev (starik-2005) 1224 19.09.17 09:25 Сейчас в теме
(3) а смысл обязательные аргументы функции писать полными именами? Я ж написал, что для друзей УФ можно и без фамилии обойтись.)))
5. борян петров (TODD22) 18 19.09.17 09:35 Сейчас в теме
Очень похоже на пример из книги Радченко "Практическое пособие разработчика" из главы "Организация подборов" или нет?

На экзамене на спеца "подбор" заставляют делать через ВременноеХранилище.
6. Sergey Andreev (starik-2005) 1224 19.09.17 09:47 Сейчас в теме
(5) по-разному подбор организовать можно. Радченко? Кто это?
8. борян петров (TODD22) 18 19.09.17 09:54 Сейчас в теме
(6)https://its.1c.ru/db/pubdevguide
по-разному подбор организовать можно.

Для полноты картины можно было и подбор через ВХ привести...
19. Роман Ложкин (webester) 24 20.09.17 08:44 Сейчас в теме
(6)
Радченко? Кто это?

Вот и выросло молодое поколение... "программистов (ну да, назовем так)"(с)кто-то из (0)
21. Sergey Andreev (starik-2005) 1224 20.09.17 10:25 Сейчас в теме
(19) ага, когда мы писали машинный код в тетрадках по русскому языку, их еще и в проекте не было))) И Радченко тоже не было.
22. Роман Ложкин (webester) 24 20.09.17 12:01 Сейчас в теме
(21)Не было конечно,не радченко, ни чуства юмора, ничего не было. Зато ЧСВ было точно.
23. Sergey Andreev (starik-2005) 1224 20.09.17 12:01 Сейчас в теме
(22)
Зато ЧСВ было точно.
Ну как без него-то, родимого. Это как без Радченко современным говнокодерам )))
24. Роман Ложкин (webester) 24 20.09.17 12:07 Сейчас в теме
(23)Это точно. 90% людей считают, что их способности выше средних. Хотя лурк утверждает, что 95% населения — идиоты. Вроде как нонсенс,но на самом деле, все логично.
25. Sergey Andreev (starik-2005) 1224 20.09.17 12:11 Сейчас в теме
(24) ну с учетом того, что в спейсикс и тесла народу работает крайне мало, то ЛУРК сильно завысил цифру.
26. Роман Ложкин (webester) 24 20.09.17 15:16 Сейчас в теме
(25)Скорее занизил, судя по тому, что происходит вокруг.
И я не знаю каков процент
Сумасшедших на данный час,
Но если верить глазам и ушам -
Больше в несколько раз. (с)ИзвестноКто
27. борян петров (TODD22) 18 20.09.17 15:45 Сейчас в теме
(26)
Скорее занизил, судя по тому, что происходит вокруг.

ЧСВ разум затуманил... бывает....
28. Sergey Andreev (starik-2005) 1224 20.09.17 15:46 Сейчас в теме
(26)
Скорее занизил
Занизил одно, завысил второе. Я о количестве умных говорил, а Вы о дураках )))
29. Роман Ложкин (webester) 24 20.09.17 15:47 Сейчас в теме
(27)ну я то себя отношу к тем 95% куда уж нам уж....
(28)кхм )))
30. Sergey Andreev (starik-2005) 1224 20.09.17 15:48 Сейчас в теме
(29)
куда уж нам уж
Я, лично, всегда за левелап. Но, как говорил мудрец, что можно привести верблюда к воде, но заставить его пить не получится. Хочет - будет пить, не хочет - не будет.

Вот, кстати, придумал хорошую задачку для собеседования: есть куб или квадрат с ребром/стороной Х. Какая длина стороны/ребра будет у куба/квадрата с объемом/площадью, в два раза меньше исходного. Сильно сложная? )))
31. Роман Ложкин (webester) 24 20.09.17 15:49 Сейчас в теме
(30)Я пробую. Но вроде как уже напился. Не знаю может влезет еще немного.
>>Сильно сложная.
Что вы хотите выяснить этой задачей? Я тоже ищу, что бы спросить у кандидата в программисты, если он не умеет ничего. От слова вообще.
32. Anatolii Karasev (KapasMordorov) 408 20.09.17 16:39 Сейчас в теме
(30)
Он над нами издевался. Ну сумасшедший, что возьмешь!
18. Петр Базелюк (pbazeliuk) 1380 19.09.17 18:39 Сейчас в теме
(5) На экзамене можно доказать свою позицию, но экзаменаторы могут иметь уровень ниже чем у программиста.
Вариант как в статье и подбор через временное хранилище могут иметь побочные эффекты, и если объяснить экзаменатору их - придирок не должно быть.

Очень давно сдавал специалиста, и решил задачу контроля остатков с помощью "нового" метода проведения и опции "БлокироватьДляИзменения" :) Почти влепили "-1" за решение пока не ткнул носом в литературу и новую на то время конфигурацию УТ 11.
20. борян петров (TODD22) 18 20.09.17 08:48 Сейчас в теме
(18)Речь была не столько о конкретном методе, сколько о том что не плохо было бы рассказать о нескольких методах.
А на экзамене не всегда есть возможность что то доказывать, не все сдают очно и не у всех есть возможность из за экзамена ехать за 5000 км.
17. Oleg Space (spacecraft) 19.09.17 11:06 Сейчас в теме
Придрались к наименованию переменных. Это больше к рефакторингу относится.
Тут есть программная "ошибка".
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
КонецПроцедуры

Да и в другом примере ОбработкаВыбора. Этот код не всегда будет работать как задумано.
TreeDogNight; pbazeliuk; NSerget; jONES1979; +4 Ответить
33. Алексей Сосновый (Labotamy) 20.09.17 20:28 Сейчас в теме
А это точно статья из 2017 года? =)
34. Денис Харченко (nomadon) 169 20.09.17 22:29 Сейчас в теме
(33) нет конечно..
Пока действие происходит в одном месте весь фокус происходит в другом,
Статья про то что нужно все-таки не забывать про пользователей и делать им подбор, тем более это просто, а в комментах батл в стиле мисты)
35. г. Казань Рустем Гумеров (Rustig) 837 22.09.17 08:49 Сейчас в теме
(0)
1) в УТ 10.3, в КА 1.1, которые на обычных формах, до сих пор используется форма подбора, и весь механизм, описанный в данной статье, используется в данной форме подбора. Что было на обычных формах, перешло в управляемые. Ничего нового. :)
Мне кажется, что разобраться с идеей подбора легче на обычных формах, чем на управляемых - нет отвлекающих процедур перехода с клиента на сервер и наоборот (какие переменные передать на сервер и получить обратно на клиенте).
2) У самой популярной методички по изучению 1с от автора Радченко методы организации подбора освещаются в отдельной главе книги.
3) В чем смысл статьи - я не понимаю.
Всякий раз в статьях посвященных управляемым формам замечаю одну и ту же тенденцию - "сложность" - как будто все прекрасное должно быть сложным - уберите из статьи слова "многопоточность", "асинхронность" , "НаКлиенте" - и идея подбора станет чуточку понятнее. :)
Прикрепленные файлы:
36. Sergey Andreev (starik-2005) 1224 22.09.17 10:52 Сейчас в теме
(35)
Всякий раз в статьях посвященных управляемым формам замечаю одну и ту же тенденцию - "сложность"
Статья как раз и говорит о том, что никакой сложности нет. В этом основная ее цель. А причина, по которой она появилась, в статье описана.
37. Jestery Wilson (Jestery) 25.09.17 22:37 Сейчас в теме
Если НЕ Рез = Неопределено Тогда


Сорри за возможно очевидный вопрос, я новичок. А почему не написать
Рез <> Неопределено?
38. Sergey Andreev (starik-2005) 1224 25.09.17 23:12 Сейчас в теме
(37)
А почему не написать
А вломы переключать раскладку.
Оставьте свое сообщение