gifts2017

[ОБУЧАЛОВКА] Как перестать парить себе мозги и не фанить тюльку... - 2

Опубликовал Сергей (Che) Коцюра (CheBurator) в раздел Программирование - Практика программирования

Статья продолжает описание полезностей, которые реализуем штатными средствами - вместо головной боли по написанию корявых доморощенных алгоритмов. ;-) В статье рассматривается расширение функционала по подбору объектов в штатной обработке Отчет.ПодборОбъектов (или внешней Uchoice.ert)
Начало (часть 1) находится здесь: http://infostart.ru/articles/237/ - перед прочтением текущей статьи рекомендуется посмотреть "первую серию"... Продолжим... Практически полным аналогом внешней обработки UCHOICE.ERT является обработка, включенная в состав конфигурации: Обработка.ПодборОбъектов


Местонахождение в конфигурации
Обработка.ПодборОбъектов, как и Uchoice.ert, передает сформированный набор объектов (элементов справочника, набор документов и т.д.) "наружу" - возвращает сформированный набор объектов через список значений в ту форму (отчет/обработка конфигурации, внешний отчет/обработк, и кое-куда еще..), которая вызвала данную Обработку.ПодборОбъектов для формирования некоего набора данных по произвольным условиям. В "родительской" форме мы получаем готовый набор объектов в виде списка значений, который можем "вертеть" как хотим в зависимости от наших нужд...

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


начало работы по подбору номенклатуры
На вышеприведенном рисунке нас интересуют объекты в зеленой рамке. Назначение кнопок (X) и (XX) очевидно, это - удаление текущей строки таблицы номенклатуры и полная очистка таблицы номенклатуры (отмечена красной рамкой). Самое интересное - в кнопке ... Кто активно работает с МФ (множествеными фильтрами) в составе типовой ТиС - тот знает, что эта кнопка предназначена для отбора номенклатуры ПО ПРОИЗВОЛЬНЫМ УСЛОВИЯМ и делается это всего пару строчками кода: на кнопку повешена процедура ВыбратьПоФильтру(), смотрим:


Работаем по кнопке
Состав этой процедуры прост до безобразия:


Код процедуры, предоставляющий доступ к неисчерпаемому богатству возможностей
Особое внимание в вышеприведенном коде следует обратить на действия над СписокЗначенийМФ (в белых рамках) - его (это - список значений) мы передаем в Обработку.ПодборОбъектов, чтобы в нем же получить назад набор номенклатурных позиций...
Итак, менеджер жмакает нашу кнопочку - и получает в свое распоряжение мощный инструмент для ПРОИЗВОЛЬНОГО ПОДБОРА НУЖНОЙ ЕМУ НОМЕНКЛАТУРЫ:


Задание условий

Произведенный отбор номенклатуры
Вот он, миг торжества менеджера - вожделенная БКК ( Большая Красная Кнопка, лежит здесь: http://infostart.ru/profile/174/projects/841/ )!!! Менеджер жмакает кнопку ОК и полученный набор номенклатуры ПЕРЕДАЕТСЯ В РОДИТЕЛЬСКУЮ ОБРАБОТКУ для дальнейшей алгоритмической обработки:


Полученный набор номенклатуры обработан особым образом для отображения
"На рисунках все красиво..." - скажет хитрый "чайник", - "Ты мне пальцем покажи, как это получается!"
И будет прав. Ибо есть одна маленькая засада. А засада следующая: Обработка.ПодборОбъектов вызывается в немодальном режиме и куда она должна передать сформированный набор данных? Понятно куда - в родительскую форму... Но как и в какое место? Ведь после открытия Обработки.ПодборОбъектов родительская обработка (из которой произошел вызов) давно "убежала" по своему коду из того места, ГДЕ ОНА ВЫЗВАЛА Обработку.ПодборОбъектов... Настоящие разведчики засад не боятся и обходят их скрытными горными (получена альпийская подготовка!) тропами (например, такими: http://tomba.infostart.ru/IMAGES/FOTO02/sklon600.jpg ), а именно: используем возможности предопределенной процедуры ПриПовторномОткрытии(), так как при нажатии манеджером БКК, тьфу! кнопки Обработка.ПодборОбъектов выполняет такой код:
Если Найти(ИмяФормыДействия, ".ert") > 0 Тогда
    ОткрытьФорму("Отчет", СписВозврата, ИмяФормыДействия);
т.е. производит открытие родительской формы с передачей списка объектов. А так как родительская форма не была закрыта при вызове Обработка.ПодборОбъектов (см.выше рисунок "Задание условий" http://infostart.ru/articles/242/image.php?img=650 - видишь там, на заднем фоне, видна родительская формочка...?) - в родительской форме успешно отрабатывает процедура ПриПовторномОткрытии(), смотрим на ее код:

Получение списка объектов после хитрожо.. интересных действий менеджера
Белой рамкой обозначен код, блокирующий "несанкционированное" использование процедуры ПриПовторномОткрытии(). Список значений СписокЭлементовМФ УЖЕ СОДЕРЖИТ список номенклатуры, без всяких лишних телодвижений с нашей стороны - так как этот список значений БЫЛ НАМИ ПЕРЕДАН РАНЕЕ в Обработку.ПодборОбъектов и она произвела его заполнение самостоятельно. Приведенный выше код достаточно прост и всего лишь "перелопачивает" полученный набор номенклатурных позиций для удобоваримого вывода в таблице значений, расположенной на форме. Понятно, что при необходимости над полученным набором объектов могут быть произведены ЛЮБЫЕ ДОПУСТИМЫЕ ДЕЙСТВИЯ КАКОЙ-УГОДНО СЛОЖНОСТИ в зависимости от алгоритма/целей родительской обработки.

Все вышерасказзаное предназначено, вообщем-то для одного: показать еще раз (с другого ракурса) возможность избежать программистом "рутинных" действий по "коллекционированию" объектов (что особенно актуально для начинающих и середнячков-программистов, которые так и норовят где-нибудь косяччок забить...) и сосредоточиться на СОДЕРЖАТЕЛЬНОМ программировании "бизнес-процессов".

Попутное замечание: при использовании Обработка.ПодборОбъектов есть возможность возвращать данные в совершенно другую "родительскую" обработку (зависит от передаваемых в Обработку.ПодборОбъектов параметров), что позволяет без особых напрягов вязать достаточно содержательные цепочки обработок...

Собственно говоря, меня немного занесло в другую сторону ( http://tomba.infostart.ru/IMAGES/FOTO03/ann2.jpg ) и я решительно возвращаюсь к тому, что хотел рассказать.
Всем хороши Обработка.ПодборОбъектов и Uchoice.ert, кроме одного: не позволяют отбирать объекты НЕПОСРЕДСТВЕННЫМ ВЫБОРОМ САМОГО ОБЪЕКТА, а предоставляют возможность осуществлять отбор лишь манипулируя условиями, налагаемыми на разнообразные реквизиты справочников/документов. Для особо продвинутых юзеров/менеджеров это трудности не составит, а вот тем, кто не шибко разбирается, что такое "реквизиты", "условия" и прочая "программистская мутотень", - на всякий случай хорошо было бы предоставить возможность "типового" подбора - т.е. позволить выбирать ОБЪЕКТ ЦЕЛИКОМ (как это делается в типовой ТиС в разных документах по кнопке "Подбор"). Почему это не сделано "штатно" ( http://infostart.ru/file.php?0,file=40 ) - сие мне не ведомо, поэтому я в полном соответствии с заголовком данной статьи не парю себе мозги, а в два счета добавляю эту возможность.
Добавляем ОБЪЕКТ ЦЕЛИКОМ в перечень реквизитов справочника/документа:


Объект-справочник

Объект-документ
+ к этому заблокируем наши добавленные в список реквизитов "ссылки на объекты" от показа именно как реквизитов справочника/документов в самой Обработке.ПодборОбъектов/Uchoice.ert - есть такая возможность для удобного просмотра результатов выборки:



Уберем из перечня реквизитов для просмотра выборки

Пояснение к предыдущему коду
И тперь мы можем выполнять подбор объектов в привычной манере, не потеряв при этом возможности условий по реквизитам:


Подбор в простой штатной манере...
Все.
Очередная лекция - закончена.
В следующей статье мы попробуем решить более хитрую задачу: в возможность выбора элементов справочника по условиям, накладываемым на реквизиты справочника, добавить возможность выбора элементов справочника по условию принадлежности к некоему заранее неопределяемому составу документов... заумно...? Тогда скажем так: без лишнего "непроизводительного" программирования получить перечень элементов справочника, принадлежащих номенклатурному набору вполне конкретного клиента.. Зачем? А вот зачем: чтобы совать ему не весь прайс в 3000 позиций. а только тот перечень, который его интересует (тот, который он берет постоянно...)

Статья понравилась/пригодилась? Узнал что-то новое? Поощри автора - приплюсуй рейтинг или если хотите выразить свою благодарность другим способом - можете сделать взнос на рублевый кошелек WebMoney R292336385918 (через платежный терминал, например...)..

уффффффф... устал....

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Poppy (poppy) 18.10.07 21:43
Не соглашусь с фразами:
"Практически полным аналогом внешней обработки UCHOICE.ERT является обработка, включенная в состав конфигурации: Обработка.ПодборОбъектов"
и
"Её отличие от Ushoice.ert состоит в том, что Обработка.ПодборОбъектов... "

Странно говорить об отличиях абсолютно идентичных обработок. ;-)

ИМХО автор сам не до конца понимает и вносит путаницу в ряды начинающих программистов.
Из двух статей можно сделать вывод, что внешняя обработка предназначена для работы с плугинами, но внутренняя - для подбора объектов. Это равносильно, например, утверждению, что 1С:Бух для Скуль предназначена для ЕНВД, но 1С:Бух сетевая для других налогов... ;)
2. Сhe Burashka (CheBurator) 18.10.07 21:57
(1) Согласен. В статью вношу поправочку. Но я и здесь молчать не буду! ;-) Встроенная обработка имеет некоторые отличия - кому интересно пусть сам над ними помозгует. В русле изложения статьи они несущественны.
3. Сhe Burashka (CheBurator) 18.10.07 22:01
(1) + если кто-то более детально разовъет тему грамотного использования упомянутых обработок (как, например, было сделано по следам моей статьи по косякам во множественном фильтре) - буду только рад и с удовольствием сам почитаю...
4. Poppy (poppy) 18.10.07 22:35
(2)
Сравни встроенную обработку из типовой Бухии с внешней... Там отличий никаких нет.
В типовой ТиС есть небольшое отличие встроенной обработки.

(3)
Думаю, это будет неплохим продолжением темы. По мере возможности приложу к этому усилия.

В целом считаю поднятую тему = полезной. Будет куда пинать начинающих кодеров перенумераторов документов.
5. Сhe Burashka (CheBurator) 18.10.07 22:41
(4) по (3) - давай! а то я собственно и взялся ХОТЬ ЧТО-ТО написать по этому поводу именно из-за кучи уе...х перенумераторов, которые плодятся как кролики...
Ufimtsev; +1 Ответить
6. Аркадий Кучер (Abadonna) 19.10.07 03:00
Мерзкую морду фара из картинок убрал - респект ;)
7. Сhe Burashka (CheBurator) 19.10.07 09:07
(6) а что делать...? если всякое ламерье падко на гуй... ;-) - вот и рождаются для них всякие висты... ;-)
8. Аркадий Кучер (Abadonna) 19.10.07 09:57
(7) Не ламерье, а люди с нормальным вкусом
ms33; Ufimtsev; +2 Ответить 1
9. Сhe Burashka (CheBurator) 19.10.07 10:09
10. Сhe Burashka (CheBurator) 20.10.07 02:43
ну вот, сегодня приперло... по быстрому набросал десяток строк - теперь набор элементов справочника можно получать по условию вхождения во множество документов...
Ufimtsev; Львенок; +2 Ответить
11. v_id (v_id) 09.11.07 10:48
Хочу поделюсь своими экспериментами.
Странно, но мой экземпляр Uchoice.ert не хотел отбирать объекты справочников по периодическим реквизитам. Пришлось исправить
Код
 Если (гТипОбъекта = "Операция") Или (гТипОбъекта = "Документ") Тогда 
Показать полностью


на

Код
 Если (гТипОбъекта = "Операция") Или (гТипОбъекта = "Документ")  Или (гТипОбъекта = "Справочник") Тогда 
Показать полностью


после этого заработало.
ЗЫ. Хотя я конечно допускаю, что я где-то ошибся в параметрах вызова обработки.
12. Сhe Burashka (CheBurator) 09.11.07 11:15
(11) возможно, я этого не использовал, поэтому сказать ничего не могу.
Просьба указывать примерный номер строки или давать "окружение" кода, чтобы однозначно идентифицировать место вставки.
Styvi; Ufimtsev; +2 Ответить
13. Gen Tay (GenTay) 27.10.13 13:56