Добрый день, коллеги!
Сегодня наше радио ведет репортаж из зоны, не входящей в зону комфорта многих жителей местного галактического скопления. Чтобы внести ясность и убрать сумятицу, я решил еще раз коснуться давно известной продвинутым бомбардирам 1С методики асинхронного открытия формы для подбора нужных и полезных данных из различных внешних формочек.
Навела меня на мысль рассказать об этом еще раз некая Анна, создавшая эту вот тему, в которой в очередной раз встречаю я богомерзкие слова "Результат = Форма.ОткрытьМодально()", а нервы то уже не те!!! )))
Итак, приступим к тому, чтобы внести ясность.
СУТЬ ЗАДАЧИ
Есть форма документа, есть справочник, данные из которого нужно поместить в таблицу формы документа (или в реквизит формы, или еще куда — тут это вопрос второй).
Некоторые "программисты" (ну да, назовем так), которые еще не вкусили прелестей нового мира и нового мирового порядка, все еще для подобных действий не находят ничего лучше, чем использовать старый и проверенный "Элементик = ОткрытьФормуМодально(ИмяФормы, …);", а кое-кто сначала форму получает в переменную и только потом открывает (как в том самом вопросе на форуме, с которого все началось). Ну не на олимпиаде он — за дополнительную переменную балл не снижают (зряплату не понижают).
СУТЬ ВЕЩЕЙ
До сих пор многие матерые кулхацкеры плюются в сторону асинхронности и запрета модальности, но, по-сути, в плане подбора ничего не изменилось. Как была некая асинхронность (т.е. отдельная процедура обработки выбора), так она и осталась. Просто и форму можно открывать теперь асинхронно, выделяя процедуру обработки результата в отдельную процедуру и таким образом объединять все обработчики в одной функции, а не раскидывать их по всему модулю формы. Также никто не мешает вынести обработчики вообще в отдельный модуль.
Давайте ответим на главный вопрос статьи: "как организовать подбор в управляемой форме?" Для этого откроем форму с признаком "ЗакрыватьПриВыборе = ложь" и "РежимВыбора = истина":
&НаКлиенте
Процедура Подбор(Команда)
ОткрытьФорму(
"Справочник.Справочник1.ФормаВыбора",
Новый Структура("ЗакрыватьПриВыборе, РежимВыбора",
Ложь, Истина),
ЭтаФорма
, , , ,
Новый ОписаниеОповещения(
"ПриЗакрытииФормыПодбора",
ЭтаФорма,
"Подбор"),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
);
КонецПроцедуры
В приведенном коде открывается форма выбора справочника "Справочник1", также предполагается, что у нас есть экспортная клиентская процедура "ПриЗакрытииФормыПодбора", которая будет вызваться при закрытии формы выбора.
Т.к. у нас параметр "ЗакрыватьПриВыборе" установлен в "ложь", то форма справочника при двойном клике или нажатии клавиши "Энтер" на элементе закрываться не будет. При этом т.к. параметр "РежимВыбора" установлен в "Истина", то каждый даблклик и "Энтер" будет генерировать событие "ОбработкаВыбора" во владельце. Таким образом, если у нас, например, каждый раз, когда выбирают элемент в форме выбора, должна добавиться строка табличной части, код дополнится вот такой процедурой:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
КонецПроцедуры
Нужно иметь ввиду, что обработка выбора — это не просто функция, а событие формы, соответственно создавать ее лучше через выбор соответствующего события в списке процедур и функций (энтузиасты этого дела могут создать процедуру, а потом выбрать ее в спсике над кодом формы или вообще в событиях формы).
Код, приведенный выше, всего-то добавляет новую строку в табличную часть "ТабличнаяЧасть1" и устанавливает там в реквизит "ФИО" выбранный в форме подбора элемент справочника.
Для красочности картины давайте дополним код процедурой, обрабатывающей закрытие формы выбора:
&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт
Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры
В данном случае при закрытии формы владельца просто вывалится сообщение: "Ура, форма подбора закрыта!".
РАЗВИТИЕ НАСТУПЛЕНИЯ
Мы можем, конечно, вообще не использовать обработку выбора при выборе единичного значения. Для этого достаточно переписать открытие формы выбора таким образом, чтобы параметр "ЗакрыватьПриВыборе" устанавливался в "Истина". Но и обработку выбора значения нужно будет реализовать в асинхронной процедуре, указанной в описании оповещения:
&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт
// если ничего не выбрали, то в рез будет пусто...
Если НЕ Рез = Неопределено Тогда
Объект.ТабличнаяЧасть1.Добавить().ФИО = Рез;
КонецЕсли;
//Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры
//&НаКлиенте
//Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
// Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
//КонецПроцедуры
В этом коде мы убрали процедуру обработки выбора, т.к. если бы мы ее оставили, то у нас создались бы две строки. Почему? Над этим вопросом рекомендую подумать факультативно (в качестве домашнего задания, если кто хочет).
Также в обработке асинхронного оповещения необходимо контролировать возвращенный результат. Если результат пустой, то это говорит о том, что форму просто закрыли, не выбрав никакого значения. Для этого в коде добавлена проверка на "Рез = Неопределено".
Давайте окончательно разберемся с темой и добавим возможность ввода, например, количества "ФИО" в документе. Для этого пропишем еще одну асинхронную процедуру, которая будет обрабатывать ввод числового значения. Для этого вернем "ложь" для параметра формы "ЗакрыватьПриВыборе", раскомментируем процедуру "ОбработкаВыбора" и убурем из процедуры асинхронного оповещения добавление строки:
&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт
//если ничего не выбрали, то в рез будет пусто...
//Если НЕ Рез = Неопределено Тогда
// Объект.ТабличнаяЧасть1.Добавить().ФИО = Рез;
//КонецЕсли;
// снова "Уга, товагищи!"
Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
ПоказатьВводЧисла(
Новый ОписаниеОповещения("ПриВводеЧисла",
ЭтаФорма,
ВыбранноеЗначение), , // вот тут у нас как раз появился доппараметр
"Введите количество ФИО",
10,
0
);
КонецПроцедуры
&НаКлиенте
Процедура ПриВводеЧисла(Рез, Доп) Экспорт
// найдем строки с этим "ФИО"
НайденныеСтроки = Объект.ТабличнаяЧасть1.НайтиСтроки(Новый Структура("ФИО", Доп));
// если не нащли - добавим
Если НайденныеСтроки.Количество() = 0 Тогда
Ст = Объект.ТабличнаяЧасть1.Добавить();
Ст.ФИО = Доп;
Ст.Колво = рез;
Иначе
// если нашли - увеличим колчество
НайденныеСтроки[0].Колво = НайденныеСтроки[0].Колво + рез;
КонецЕсли;
КонецПроцедуры
Итак, тут мы помимо прочего не просто добавляем новую строку, а, если такое "ФИО" уже есть, добавляем выбранное количество в него (увеличиваем поле "Колво"). И тут нам как раз пригождается второй аргумент процедуры обработки оповещения — "ДополнительныеПараметры" (для друзей управляемых форм просто "доп"). В этот аргумент мы можем засунуть что угодно, когда создаем описание оповещения — очень, на мой взгляд, удобно. Тут как раз мы сохраняем выбранный элемент (чтобы не плодить никому не нужные переменные).
ЗАКЛЮЧЕНИЕ
В действительности у управляемых форм есть масса преимуществ перед формами обычными. И асинхронность — это еще не самый интересный механизм. Вот, например, статья о том, как передавать параметры отбора (фильтр) в форму выбора, чтобы показывать пользователю не весь справочник, а только нужную его часть (даже если эта часть определяется значением строки табличной части).
Сначала задается планка где лишняя переменная — это плохо, а потом в, собственном коде, Рез и Доп. Отсюда вывод, даже несколько, но некоторые до конца не ясны:
1. Если обгадил чужой код — самому можно плохокодить
2. Чужой код гадь, а в свой не смотри
3. Даже если знаешь что плохогодить нельзя, но ничего с этим сделать не можешь — посмотри в чужой код и скажи что там еще хуже
Доброе утро;)
(1) рез и доп — обязательные аргументы функции оповещения. Без них она работать не будет. Учим мат.часть.
Ну, как я и говорил, подтянулись «программисты», плохо владеющие механизмами платформы. Но для остальных появилась возможность учиться на чужих ошибках)))
Имелось ввиду, что название переменных не отображает их суть.
Неужели так сложно написать Результат, ДополнительныеПараметры?
А если процедура получиться не маленькая в конце уже и можно запутаться в сокращениях…
Очень похоже на пример из книги Радченко «Практическое пособие разработчика» из главы «Организация подборов» или нет?
На экзамене на спеца «подбор» заставляют делать через ВременноеХранилище.
(5) по-разному подбор организовать можно. Радченко? Кто это?
(1) если говорить о коде, то, как я понял, Ваша придирка была к поименованию переменных. Т.к. 1с — это чаще всего открытый код и данное замечание справедливо. Моя же придирка была к использованию лишней переменной — за это в олимпиадном программировании снижают балл, ибо это грубая ошибка, влияющая на производительность.
(6)https://its.1c.ru/db/pubdevguide
Для полноты картины можно было и подбор через ВХ привести…
(2) я не про наличие параметров в процедуре (кстати это процедура а не функция), а про смысловое наименование переменных
(7) моя придирка в общем впечатлении, если сами себе поднимаете планку — то приводить дурацкие ошибки в пример — глупо.
(9) в С вообще процедур нет — одни функции, но некоторые из них не возвращают значение. Так что разницы между словами «процедура» и «функция» практически нет. Главное, что свою функцию данная процедура выполняет. Помните картинку о всей сути критиков со словами «горизонт завален»? Вот в этом вся суть Вашей критики. Молодежи может даже интересно на этот диалог посмотреть, так что не зря.
(10) ошибки с именем переменной? Это не ошибки. Но да, горизонт завален)))
(12) если не считать нарушение стандартов разработки ошибкой то не ошибка)
(11) ну тогда можно вообще в нулях и единицах пример писать, функция процедуры тоже будет выполняться)
(14) ну если заговорили о нулях и единицах, то в ассемблере нет различий в вызове процедур и функций, а машинному коду об именах переменных ничего не известно.
По поводу стандартов, то они предписывают именовать переменные так, чтобы была ясна их суть. С «рез» и «доп» суть ясна. Проблема тут в интерпретации стандартов с Вашей стороны.
(15) а мы пишем код что бы кому было ясно?
1. машине?
2. тому кто писал это код?
3. тому кто не писал этот код?
Если учитывать последнее, то принимает решение о допустимости кода совсем не тот кто его писал а тот для кого.
(5) На экзамене можно доказать свою позицию, но экзаменаторы могут иметь уровень ниже чем у программиста.
Вариант как в статье и подбор через временное хранилище могут иметь побочные эффекты, и если объяснить экзаменатору их — придирок не должно быть.
Очень давно сдавал специалиста, и решил задачу контроля остатков с помощью «нового» метода проведения и опции «БлокироватьДляИзменения» 🙂 Почти влепили «-1» за решение пока не ткнул носом в литературу и новую на то время конфигурацию УТ 11.
(6)
Вот и выросло молодое поколение… «программистов (ну да, назовем так)»(с)кто-то из (0)
(18)Речь была не столько о конкретном методе, сколько о том что не плохо было бы рассказать о нескольких методах.
А на экзамене не всегда есть возможность что то доказывать, не все сдают очно и не у всех есть возможность из за экзамена ехать за 5000 км.
(19) ага, когда мы писали машинный код в тетрадках по русскому языку, их еще и в проекте не было))) И Радченко тоже не было.
(21)Не было конечно,не радченко, ни чуства юмора, ничего не было. Зато ЧСВ было точно.
(22)
Ну как без него-то, родимого. Это как без Радченко современным говнокодерам )))
(23)Это точно. 90% людей считают, что их способности выше средних. Хотя лурк утверждает, что 95% населения — идиоты. Вроде как нонсенс,но на самом деле, все логично.
(24) ну с учетом того, что в спейсикс и тесла народу работает крайне мало, то ЛУРК сильно завысил цифру.
(25)Скорее занизил, судя по тому, что происходит вокруг.
И я не знаю каков процент
Сумасшедших на данный час,
Но если верить глазам и ушам —
Больше в несколько раз. (с)ИзвестноКто
(26)
ЧСВ разум затуманил… бывает….
(26)
Занизил одно, завысил второе. Я о количестве умных говорил, а Вы о дураках )))
(27)ну я то себя отношу к тем 95% куда уж нам уж….
(28)кхм )))
(29)
Я, лично, всегда за левелап. Но, как говорил мудрец, что можно привести верблюда к воде, но заставить его пить не получится. Хочет — будет пить, не хочет — не будет.
Вот, кстати, придумал хорошую задачку для собеседования: есть куб или квадрат с ребром/стороной Х. Какая длина стороны/ребра будет у куба/квадрата с объемом/площадью, в два раза меньше исходного. Сильно сложная? )))
(30)Я пробую. Но вроде как уже напился. Не знаю может влезет еще немного.
>>Сильно сложная.
Что вы хотите выяснить этой задачей? Я тоже ищу, что бы спросить у кандидата в программисты, если он не умеет ничего. От слова вообще.
(30)
А это точно статья из 2017 года? =)
(33) нет конечно..
Пока действие происходит в одном месте весь фокус происходит в другом,
Статья про то что нужно все-таки не забывать про пользователей и делать им подбор, тем более это просто, а в комментах батл в стиле мисты)
(0)
1) в УТ 10.3, в КА 1.1, которые на обычных формах, до сих пор используется форма подбора, и весь механизм, описанный в данной статье, используется в данной форме подбора. Что было на обычных формах, перешло в управляемые. Ничего нового. 🙂
Мне кажется, что разобраться с идеей подбора легче на обычных формах, чем на управляемых — нет отвлекающих процедур перехода с клиента на сервер и наоборот (какие переменные передать на сервер и получить обратно на клиенте).
2) У самой популярной методички по изучению 1с от автора Радченко методы организации подбора освещаются в отдельной главе книги.
3) В чем смысл статьи — я не понимаю.
Всякий раз в статьях посвященных управляемым формам замечаю одну и ту же тенденцию — «сложность» — как будто все прекрасное должно быть сложным — уберите из статьи слова «многопоточность», «асинхронность» , «НаКлиенте» — и идея подбора станет чуточку понятнее. 🙂
(35)
Статья как раз и говорит о том, что никакой сложности нет. В этом основная ее цель. А причина, по которой она появилась, в статье описана.
Сорри за возможно очевидный вопрос, я новичок. А почему не написать
Рез <> Неопределено?
(37)
А вломы переключать раскладку.
(37) Потому что начинающие программисты всегда гнут пальцы знаниями «крутых» языков. Вот когда автор поймёт, что программирование в бизнесе, это работа с объектами этого самого бизнеса, а не методами сортировки пузырьком, тогда будет писать код грамотный и может даже профессиональный.
Каюсь, 20 лет назад я тоже считал единственным настоящим языком программирования ассемблер.
(39)
Ну когда автор этого сообщения поймет, что решение задач бизнеса в программировании — это применение актуальных методов и приемов, последних технологических достижений и разработок в области алгоритмов и обработки данных, тогда он немножко будет думать перед тем, как ляпнуть какую-то ерунду )))
(40) Хм, спорное утверждение. Во многих российских компаниях используется семёрка, а в западных компаниях даже попадаются системы, работающие на алгоритмах, написанных в прошлом тысячелетии. При этом большинство из этих примеров — успешные зарабатывания денег и программисты в этих компаниях зачастую в совершенстве владеют всякими современными средствами разработки!
(40) Всё. Нигде не нашёл в рекомендациях по программированию на 1С хоть какое-то упоминание про запутывание читаемости. И вообще, трудночитаемый код применяется только в некоторых случаях. Например, при создании защищённых модулей или для попытки зарабатывания дополнительных денег с невезучего клиента. В других случаях «трудный» код только вредит и значит гордое «А вломы переключать раскладку.» является показателем не совсем высокого профессионализма.
(42) Вы даже не представляете, на сколько смешным может быть Ваш комментарий. Но точно могу сказать одно — комплексы вполне себе лечатся. Обратитесь к специалисту, ибо кроме как нарушением психики мне сложно объяснить проидирки к логическому оператору НЕ или к сокращению наименования переменных. Но, повторюсь, это лечится, при том весьма успешно.
(43) В единичном случае всё прекрасно понятно и без разницы как написано. А вот когда блок большой и его трудно анализировать, то такие мелочи вносят ещё большую сумятицу. Что часто приводит к мысли (часто тоже непрофессиональной) — «да я лучше тут всё перепишу». Именно поэтому код должен быть правильным во всём, в т.ч. и в мелочах.
Вообще мне удивительно, что Вы, адепт всяких сей, так позорите свой клан. Ведь и сишники и ассемблеристы (и все остальные) стремятся к понятному коду, а не к пальцегнутому.
Примечание: придирка не к конкретно сокращению переменных, а именно к ошибочному понимаю по поводу культуры программирования.
(44)
С этим утверждением легко спорить исходя из тезиса, что лучше работающий прототип, чем теоретическая идеальная модель. Но я рад, что разговор вернулся в зону конструктива — это прогресс.
(44)
Подобный аргумент говорит о том, что Вы не особо разбираетесь в проблемматике. Фактически С++ и Asm (сейчас в крайних случаях) используются для достижения скорости, а скорость — это плоский код, с низким уровнем абстракции и высокой плотностью полезной нагрузки. К понятному же коду стремятся за счет повышения уровня абстракции, декларативности, замыканий. Но все эти механизмы понятны тем, кто в курсе, как они работают, начинающим же кодерам данный уровень заведомо недоступен и вызывает шок.
(44)
Я так начал писать после того, как увидел однажды в коде подобную конструкцию (типа «Если НЕ а = 5»), а для меня логика, как совокупность булевых преобразований, проста и понятна, какой бы уровень вложенности условий бы ни был. Да, вложенность условий (та же логическая инверсия НЕ) повышает цикломатическую сложность кода, но в одном условии на «НЕ (РАВНО)» эта сложность повышается на единицу всего, что в рамках даже функции величина несущественная.
(45)
Очень сильно не соглашусь. И в СССР и в Западном мире давно уже доказано, что для человека максимальное количество анализируемых сущностей от 5 до 8. Всё что больше, это резкое повышение вероятных ошибок и как следствие, ухудшение во всём. Именно поэтому при декомпозиции любого процесса принято за один раз анализировать только 5-8 сущностей. В том числе это применимо и при анализе кода.
Проще говоря, когда всего одна строка кода, всё понятно и красиво. Но как только получаем большой модуль, состоящий из кучи противоречивых и/или непонятных кусков, то упираемся в стену «КАРАУЛ!». Кому это выгодно? Как писал выше, только тем, кто не хочет что бы его код читали или тем, кто зарабатывает таким образом.
И да, хорошая работа — оплачиваемая работа. Ну а ковыряние даже в своём коде с важным лицом, мало кому нравится.
Скажем так — если Ваши утверждения верны и имеют право жить, тогда большинство поддержит данные тезисы и, уверяю, 1С-вцы издадут целую главу рекомендаций, на тему как надо сокращать переменные. Ну а пока этого нет….
А про культуру программирования на ассемблере тоже много всего написано. Например, общепринятое обнуление регистра (против майкрософтовского).
(46)
А которого регистра не подскажите? В Ассемблере x86 этих регистров до чертиков, при том регистр указателя стека, регистр указателя команды, регистры сегментов и некоторые другие регистры обнулять — это в принципе нонсенс. А SUB (E/X)AX,(E/X)AX или XOR (E/X)AX,(E/X)AX, как обнуление аккумулятора в соответствующей архитектуре (Х — 64 бита, Е — 32 бита, без них — 16 бит) — это все-же потребность, а не «культура».
Ну и уж если просто на Вашем уровне придираться к последнему Вашему сообщению, то вот знаками препинания вы, увы, пользоваться не умеете, а тексты читают куда большее количество людей, чем код. Удачи Вам и добра )))
(47) Да, это позор, когда делаешь элементарные ошибки в переписках и я этого стыжусь, а не горжусь этим)))
(48)
Ну так учитесь не делать их, ведь процитированная мной часть Вашего сообщения — это второе простое предложение, связанное с первым союзом «и», перед которым, как всемизвестно (не, ну правда всем, ибо оное в школе проходят), ставится запятая.
(46)
Вообще-то есть. Давно. Может не в полной мере, но все же.
https://its.1c.ru/db/v8std#content:-2145783193:hdoc
По аллегории Лукьяненко Иные — это аутисты, которые объединились и нашли себя в нашем мире, а сумрак — депрессия/неспособность вести себя как все. Короче, всем выйти из сумрака.