Никогда не указывайте друзьям на их ошибки.
Ошибки будут исправлены, а Вам этого не простят.
Л.Смит.

Урок 27.
"Подбор".

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

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

Форма А.

1. Для того чтобы начать подбор, необходимо вызвать один единственный метод ОткрытьПодбор(....). Обычно это происходит при нажатии какой-либо кнопки в форме А.  Рассмотрим параметры, передаваемые методу.
ОткрытьПодбор(Объект, ИмяФормы, КонтекстФормы, ФлагМножВыбора, ТекЗнач)
Объект - строка с именем объекта агрегатного типа для подбора. Можно указывать: ''Справочник.ХХХХХ', ''Документ.ХХХХХ'',  ''Журнал.ХХХХХ', ''ПланСчетов.ХХХХХ'', ''Отчет.ХХХХХХ'', ''Обработка.ХХХХХХ''
ИмяФормы - строка с именем формы для подбора (актуально только для справочников и журналов). Необязательный параметр.
КонтекстФормы - Имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр. После исполнения данного метода система вернет в данную переменную контекст формы подбора. С помощью значения этого контекста можно затем произвольно манипулировать формой подбора, пока она открыта. Необязательный параметр.
ФлагМножВыбора - если 1, то можно будет выбрать много объектов, если 0, то только один объект.
ТекЗнач - в  том случае, если выбор происходит из списка, тогда можно будет установить курсор на конкретный объект в форме списка (например, на документ в журнале документов)

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

Процедура ОбработкаПодбора(зн, конт)
Если пустоеЗначение(зн)=1 тогда
возврат;
конецЕсли;
НоваяСтрока(); //делаем в документе новую строку
Товар=зн; //в строке присваиваем выбранный товар
//можно проделать еще какие-то действия: спросить количество
// или получить продажную цену.
конецПроцедуры

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

Остается только рассмотреть передачу значений между формами А и Б. Значения двигаются в обе стороны:

1. Из формы Б в форму А передаются значения выбранные пользователем

2. Из формы А в форму Б передаются значения, предназначенные для определения параметров выборки. Это может быть склад (для показа остатков по конкретному складу), контрагент (для выбора документов) и т.д. Мне известно 2 способа передачи значений (имеются в виду нормальные способы, а не с помощью внешних файлов)

1 способ. С помощью третьего параметра в методе ОткрытьПодбор(). Рассмотрим на примере. Будем осуществлять подбор товаров из справочника "Номенклатура".
ОткрытьПодбор("Справочник.Номенклатура", "дляПодбора", "привет"); - это метод откроет список "для подбора" справочника "Номенклатура". Что за слово "привет"? Оно будет доступна в форме списка для подбора через Форма.параметр.  То есть, если в процедуре ПриОткрытии() в форме списка, написать сообщить(форма.Параметр), то система передаст нам "привет". Это отвлеченный пример. На самом деле Обычно пишут  ОткрытьПодбор("Справочник.Номенклатура", "дляПодбора", ТекСклад); - и передают склад, указанный в документе. Если надо передать несколько значений, то их "загоняют" в СписокЗначений и его передают в открываемую форму. Пример:

.....................
сз=создатьОбъект("СписокЗначений");
сз.ДобавитьЗначение(склад);
сз.ДобавитьЗначение(контрагент);
ОткрытьПодбор("Журнал.РасходныеНакладные",,сз);
......................
//это мы пытаемся подобрать расходные накладные, выписанные
//с определенного склада определенному контрагенту.

В форме журнала расходных накладных в процедуре приОткрытии() получим параметры:

Процедура ПриОткрытии()
    Если ПустоеЗначение(форма.параметр)=1 тогда
        продолжить;
    конецЕсли;
    сз=форма.Параметр;
    скл=сз.ПолучитьЗначение(1);    //получили склад
    контр=сз.ПолучитьЗначение(2);// получили контрагента
    //дальше со скл и контр поступаете по своему усмотрению
    ...........................
конецПроцедуры

2 способ. Снова используется метод ОткрытьПодбор() и его третий параметр. Оказывается, как только мы передали туда свое значение, оттуда пришел Контекст открытой формы. И, обращаясь через этот контекст, мы можем управлять этой формой как захотим! Для тех, кто не знает, что такое контекст: контекст - это совокупность методов, реквизитов доступных в данном модуле. Это  мое произвольное определение, но его сейчас нам будет достаточно. Итак, рассмотрим пример:

Процедура Сформировать()
    к=""; //ничего передавать не будем, но переменная нужна
    ОткрытьПодбор("Отчет.ОборотноСальдоваяВедомостьПосчету",,к,1,); //открываем подбор
    к.счет=СчетПоКоду("50.1"); //устанавливаем нужный нам реквизит
//в открытой форме
    к.форма.Заголовок("Ха-Ха_ха"); //испортили заголовок отчета
    к.форма.Субконто1.видимость(0);//спрятали одно из Субконто
    к.форма.обновить(); //это надо, чтобы пользователь увидел то, что мы изменили
    сообщить(к.счет);//получили значения из открытой формы
    сообщить(к.Дата1);
    сообщить(к.Дата2);
КонецПроцедуры

Важно. Подбор можно вызывать не только из формы документа, но и для любой другой формы.

Задачи для самостоятельного решения:

  1. Создайте обработку, которая бы позволяла выбирать расходные накладные и печатать их.
  2. Задание 1 доработайте таким образом, чтобы при подборе документов в обработку, можно было указывать контрагента, по которому выбираются документы
  3. Доработайте отчет "Оборотно-Сальдовая ведомость по счету" таким образом, чтобы в том случае, если субконто является справочник, можно было бы указывать не одно значение, а список значений.
Hosted by uCoz