С-Предприятие 8.0. Практическое пособие разработчика

         

Алгоритм организации подборов


Для иллюстрации механизма подбора информации в форме мы будем использовать задачу подбора элементов справочника в табличную часть документа, как наиболее распространенную. Поскольку механизм подбора реализован на уровне форм, то в других случаях просто будут задействованы иные прикладные объекты, сам механизм подбора не изменится.

Для организации подбора в форму документа следует открыть форму справочника как подчиненную форме документа, либо элементу управления, расположенному в форме документа. Способ получения формы справочника может быть любым, также как и сама форма справочника, которая будет использована. Важно лишь то, что эта форма должна быть открыта как подчиненная.

Результат подбора будет доступен в обработчике события "Обработка выбора" формы документа или элемента управления (в зависимости от подчинения формы справочника).

Событие "Обработка выбора" будет вызвано в двух случаях:

·когда в форме справочника будет выполнен интерактивный выбор,
·когда в форме справочника будет вызван метод ОповеститьОВыборе().

Различные способы подбора мы проиллюстрируем на примере подбора элементов справочника "Номенклатура" в документ "ПриходнаяНакладная".



Часть III. Специальные приемы разработки


Третья часть нашей книги будет посвящена некоторым конкретным приемам использования тех или иных объектов конфигурации которые могут потребоваться разработчику в процессе создания и модификации конфигурации. [486]



Данные и элементы управления


Важной особенностью платформы 1С:Предприятие 8.0 является механизм представления данных в формах. Ключевым моментом здесь является то, что принадлежность формы к тому или иному объекту конфигурации никоим образом не определяет состав данных, которые форма будет отображать. Например, можно создать общую форму, которая не будет подчинена ни одному из объектов конфигурации, но которая, в зависимости от содержимого, будет либо отображать список справочника, либо позволять редактировать документ. Однако такую форму уже нельзя будет назначить основной для выполнения определенных действий.

Форма сама по себе и ее элементы управления обособлены от объектов конфигурации. Для того чтобы форма отображала какие-либо данные, необходимо задать связь самой формы и большинства из ее элементов управления с данными. При использовании конструктора форм, конфигуратор создает такие связи автоматически. Если разработчик создает форму вручную – он может определить эти связи путем задания свойств формы и элементов управления. В любом случае, эти связи могут быть изменены средствами встроенного языка в процессе выполнения программы.

Связь формы и элементов управления с данными осуществляется при помощи реквизитов формы. Список существующих реквизитов формы доступен на закладке "Реквизиты" окна редактирования формы.

Среди всех реквизитов формы, как правило, существует один основной реквизит (он выделен жирным шрифтом). Основной реквизит определяет источник данных для формы в целом. От типа значения основного реквизита формы зависит не только то, какие данные будут отображены в элементах управления формы, но и поведение самой формы. Например, если основному реквизиту формы указать тип значения ДокументОбъект.ПриходнаяНакладная, то при закрытии формы программа будет запрашивать подтверждение записи и проведения документа. Если же основному реквизиту формы указать тип значения СправочникСписок.Номенклатура, то подобного подтверждения при закрытии формы возникать не будет. [502]




Похожее влияние источники данных оказывают и на элементы управления. Например, состав колонок табличного поля будет различным, если в качестве источника данных этого поля указать реквизит формы с типом значения СправочникСписок.Номенклатура или РегистрНакопленияСписок.ОстаткиКомплектующих. To же самое справедливо и для элемента управления командная панель. При установленном свойстве командной панели "Автозаполнение", смена источника данных (а точнее говоря, источника действий) будет приводить к изменению состава команд, которые отображает командная панель.

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



Рассмотрим этот механизм на примере элемента управления Поле ввода, расположенного в колонке "Вид номенклатуры" формы списка справочника "Номенклатура":



Поскольку форма отображает данные объекта СправочникСписок.Номенклатура, к свойствам, методам и [503] событиям объекта Форма добавляется расширение формы списка справочника:



В результате этого у формы появляются такие свойства как ПараметрТекущаяСтрока, ПараметрВыборПоВладельцу и т.п. [504]

Затем, поскольку данными, отображаемыми в табличном поле, будет список справочника "Номенклатура", к свойствам, методам и событиям табличного поля добавляется расширение табличного поля списка справочника. Но, поскольку это табличное поле расположено в форме, к его свойствам, методам и событиям добавляется также и расширение элементов управления, расположенных в форме:



[505]

И в заключение, поскольку поле ввода будет отображать значение реквизита справочника типа Перечисление.ВидыНоменклатуры, к свойствам и событиям поля ввода добавляется расширение поля ввода перечисления. А раз это поле ввода расположено в табличном поле, то к его свойствам и событиям добавляется также расширение элементов управления, расположенных в табличном поле:





Теперь, когда мы представляем, что такое расширение, рассмотрим более подробно расширение элементов управления, расположенных в форме.

В числе прочего, это расширение добавляет элементам управления одно важное свойство – Данные. Это свойство имеет тип Строка и [506] должно содержать путь к данным. Путем к данным может являться либо имя реквизита формы, либо путь к одному из свойств реквизита

Например, если в форме существует элемент управления табличное поле, можно в качестве данных указать ему имя реквизита "СправочникСписок", который имеет тип значения СправочникСписок.Номенклатура. [507]

Если на этой же форме разместить поле ввода, то его свойство Данные может иметь значение СправочникСписок.Отбор.Ссылка.Значение.



[508]

Таким образом свойство Данные позволяет связать элемент управления с теми данными, которые он должен отображать.

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

Следующим важным свойством, которым обладают элементы управления расположенные в форме, является свойство "ТипЗначения". Это свойство содержит тип реквизита, данные которого отображает элемент управления. При выборе в конфигураторе значения свойства Данные, свойство Тип значения заполняется автоматически, на основании типа выбранных данных.

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

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



Говоря о связи элементов управления и данных, следует отдельно упомянуть поле ввода, поскольку это элемент управления имеет одну особенность – свойство ОграничениеТипа.

Использование этого свойства позволяет ограничить пользователя в выборе возможных типов данных значений, вводимых в поле ввода. Например, если реквизит формы имеет составной тип данных:

·Число,
·Строка,
·Дата,
·СправочникСсылка.Клиенты,
·СправочникСсылка.Сотрудники, [509]
·СправочникСсылка.Номенклатура,
то можно ограничить пользователя лишь возможностью ввода значений примитивных типов:

·Число,
·Дата,
·Строка:


[510]

Интересной особенностью здесь является то, что типы данных, заданные в свойстве ОграничениеТипа поля ввода, могут не совпасть с типом данных реквизита, отображаемого в поле ввода.

Например, как в приведенном выше примере, когда в реквизите уже хранится значение типа СправочникСсылка.Клиенты. В этом случае ограничение типа будет игнорироваться, т.е. тип отображаемых данных будет обладать "большим весом", чем поле ввода, эти данные отображающее. Такое решение вполне логично, поскольку именно реквизит содержит данные, а поле ввода – всего лишь инструмент для их отображения. [511]


Общие приемы


Существует ряд приемов использования объектов конфигурации, которые нельзя отнести только к какому-то одному виду объектов. Такие приемы мы собрали в этой главе. [487]



Формы


В этой главе мы собрали приемы работы, которые имеют отношение к формам объектов. Кроме этого в начале главы дается краткое пояснение того, каким образом в системе 1С:Предприятие данные отображаются в формах. [501]



Использование метода ОповеститьОВыборе()


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

Также метод ОповеститьОВыборе() может использоваться в тех случаях, когда требуется передать в форму документа не только [491] выбранный элемент справочника (или массив элементов), а некоторую произвольную структуру данных. [492]



Изменение данных табличного поля путем установки типа значения


Как мы уже говорили выше, путем установки типа значения элемента управления также можно изменять отображаемые данные, если данные используемого типа значения могут быть однозначно отображены в элементе управления. В следующем примере мы посмотрим, как можно изменять содержимое табличного поля, не используя реквизиты формы.

Нашей задачей будет создание в форме списка аналогичного механизма отображения движений документов "ОказаниеУслуги" в регистрах накопления.

Откроем конфигуратор и создадим основную форму списка документа "ОказаниеУслуги" с помощью конструктора. Расположим на ней переключатель из трех кнопок:

Зададим следующие выбираемые значения переключателей:

·"ОстаткиМатериалов" – "Остатки",
·"СтоимостьМатериалов" – "Стоимость",
·"Продажи" – "Продажи". [520]

Под переключателем расположим табличное поле с именем "ТабличноеПоле", типом ТаблицаЗначений и пустым свойством Данные:

Создадим процедуру обработки события "При открытии" формы и установим в ней начальное значение переключателя и начальное содержимое табличного поля:

Процедура ПриОткрытии()

ОстаткиМатериалов = "Остатки";

   Массив = Новый Массив;

   Массив.Добавить(Тип("РегистрНакопленияСписок.ОстаткиМатериалов"));

   НашеОписание = Новый ОписаниеТипов(Массив);

   ТабПоле = ЭлементыФормы.ТабличноеПоле;

   ТабПоле.ТипЗначения = НашеОписание;

   ТабПоле.СоздатьКолонки();

   ТабПоле.Значение.Отбор.Регистратор.Установить(, Истина);

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

В этой процедуре, в зависимости от выбранного значения переключателя мы создаем объект ОписаниеТипов, содержащий нужный нам тип данных. Затем указываем этот объект в качестве значения свойства ТипДанных табличного поля. После создания колонок поля мы устанавливаем использование отбора по значению [521] регистратора, которое, по умолчанию, не определено. Это позволит нам избежать отображения в табличном поле полного списка регистра в момент открытия формы.




Затем создадим процедуру обработки события "ПриИзменении" переключателя, в которой, в зависимости от установленного значения переключателя, будем изменять свойство ТипЗначения табличного поля:

Процедура ОстаткиМатериаловПриИзменении(Элемент)

   Если ОстаткиМатериалов = "Остатки" Тогда

       НужныйТип = Тип("РегистрНакопленияСписок.ОстаткиМатериалов");

   ИначеЕсли ОстаткиМатериалов = "Стоимость" Тогда

       НужныйТип = Тип("РегистрНакопленияСписок.СтоимостьМатериалов");

   ИначеЕсли ОстаткиМатериалов = "Продажи" Тогда

       НужныйТип = Тип("РегистрНакопленияСписок.Продажи");

   КонецЕсли;

   Массив = Новый Массив();

   Массив.Добавить(НужныйТип);

   НашеОписание = Новый ОписаниеТипов(Массив);

   ТабПоле = ЭлементыФормы.ТабличноеПоле;

   ТабПоле.ТипЗначения = НашеОписание;

   ТабПоле.СоздатьКолонки();

   НашОтбор = ТабПоле.Значение.Отбор;

   ЗначениеОтбора = ЭлементыФормы.ДокументСписок.ТекущаяСтрока;

   НашОтбор.Регистратор.Установить(ЗначениеОтбора, Истина);

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

Действия, выполняемые этой процедурой, аналогичны предыдущей, за исключением того, что ОписаниеТипов мы формируем исходя из положения переключателя, и отбор устанавливаем по значению ссылки на документ, выделенный в верхнем табличном поле "ДокументСписок". [522]

Теперь осталось только создать обработчик события "ПриАктивизацииСтроки" табличного поля "ДокументСписок":

Процедура ДокументСписокПриАктивизацииСтроки(Элемент)

   НашОтбор = ЭлементыФормы.ТабличноеПоле.Значение.Отбор;

   Если Элемент.ТекущиеДанные = Неопределено Тогда

       НашОтбор.Регистратор.Установить(, Истина);

   Иначе

       НашОтбор.Регистратор.Установить(Элемент.ТекущаяСтрока, Истина);

   КонецЕсли;

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

В этой процедуре мы просто управляем отбором нижнего табличного поля в зависимости от содержимого верхнего поля.

Запустите 1С:Предприятие и проверьте работу списка документа "ОказаниеУслуги". [523]


Изменение источника данных табличного поля


В процессе разработки форм периодически возникает необходимость в изменении данных табличного поля расположенного в форме, в зависимости от желания пользователя или алгоритмов работы программы. Только что мы с вами показали в форме списка документа "ПриходнаяНакладная" движения по регистру остатков "ОстаткиМатериалов". Нашим пользователям очень понравилась такая возможность, и они захотели также иметь возможность видеть на этой форме и движения по регистру остатков "СтоимостьМатериалов".

Добавление в форму еще одного такого же табличного поля нежелательно, поскольку это будет отвлекать внимание от списка документов, и занимать много места на экране. Поэтому мы воспользуемся возможностью изменения источника данных у элемента управления.

Откроем в конфигураторе форму списка документа "ПриходнаяНакладная", сдвинем табличное поле вниз и на освободившемся пространстве расположим элемент управления переключатель, состоящий из двух кнопок:


[516]

После того, как мы укажем заголовок первой кнопки – "Остатки материалов" – система автоматически сформирует имя этой кнопки "ОстаткиМатериалов". Отметим, что эта кнопка будет первой в группе, и напишем подсказку – "Отобразить движения по регистру "Остатки материалов".

Затем создадим вторую кнопку с заголовком "Стоимость материалов". Напишем подсказку – "Отобразить движения по регистру "Стоимость материалов".

Нажмем "ОК" и расположим кнопки в форме:

Откроем палитру свойств кнопки "ОстаткиМатериалов" и укажем, что тип выбираемого значения будет Строка, а выбираемое значение будет равно "Остатки".

По умолчанию все кнопки имеют тип выбираемого значения Число и выбираемое значение 0, поэтому для того, чтобы можно было анализировать состояние группы переключателей, необходимо для каждой кнопки в этой группе задать уникальное выбираемое значение. Кроме этого, одна из кнопок в группе всегда должна быть первой в группе – именно по ее значению можно будет определить состояние группы, а переключение кнопок в группе будет выполняться в порядке обхода элементов управления формы (Форма

Порядок обхода). По умолчанию установлен автопорядок обхода элементов формы (свойство формы "Автопорядок обхода"). Поэтому если вам [517] понадобится установить собственный порядок обхода элементов формы, это свойство нужно отключить и тогда станет доступен соответствующий пункт меню.




Сейчас нас устраивает автоматический порядок обхода элементов и поэтому мы создадим обработчик события "ПриОткрытии" формы, и зададим в нем начальное значение нашего переключателя:

Процедура ПриОткрытии()

   ОстаткиМатериалов = "Остатки";

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

Теперь добавим в форму новый реквизит, который будет являться вторым источником данных для нашего табличного поля. Назовем его "РегистрСписок" и установим его тип РегистрНакопленияСписок.СтоимостьМатериалов:



Укажем его тип РегистрНакопленияСписок.СтоимостьМатериалов.

В заключение создадим процедуру обработки события "При изменении" для кнопки "Остатки материалов":

Процедура ОстаткиМатериаловПриИзменении(Элемент)

   Если ОстаткиМатериалов = "Остатки" Тогда

       ЭлементыФормы.ТабличноеПоле.Данные = "ТабличноеПоле";

   Иначе

       ЭлементыФормы.ТабличноеПоле.Данные = "РегистрСписок";

   КонецЕсли;

   ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();

   ДокументСписокПриАктивизацииСтроки(ЭлементыФормы.ДокументСписок);

КонецПроцедуры [518]

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

Откройте 1С:Предприятие в режиме отладчика и проверьте работу списка документа "ПриходнаяНакладная". [519]


Множественный подбор


При множественном подборе форма справочника будет открыта до тех пор, пока пользователь не закроет ее интерактивно или пока не будет вызван метод формы Закрыть().

Для разнообразия создадим форму списка справочника "Номенклатура" и затем в форме документа "ПриходнаяНакладная", в обработчик события нажатия кнопки "Подбор" внесем следующие изменения:

Процедура КоманднаяПанельМатериалыПодбор(Кнопка)

   ФормаПодбора = Справочники.Номенклатура.ПолучитьФормуСписка( ,ЭлементыФормы.Материалы);

   ФормаПодбора.РежимВыбора = Истина;

   ФормаПодбора.ЗакрыватьПриВыборе = Ложь;

   ФормаПодбора.Открыть();

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

Свойство "ЗакрыватьПриВыборе" как раз и будет задавать режим множественного выбора. Установка же свойства "РежимВыбора" понадобилась нам, так как в этом примере для получения подчиненной формы мы используем метод ПолучитьФормуСписка(). Полученная этим методом форма будет иметь свойство "РежимВыбора" установленным в Ложь (в отличие от получения формы методом ПолучитьФормуВыбора(), когда "РежимВыбора" устанавливается в Истина).

Запустите 1С:Предприятие в режиме отладки и проверьте работу множественного подбора.



Объект конфигурации Критерий отбора


Объект конфигурации Критерий отбора предназначен для задания правил, по которым может выполняться отбор объектов.

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



Объекты, введенные на основании


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

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

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



Одиночный подбор


При одиночном подборе форма справочника будет закрываться сразу после выбора элемента. Для выбора следующего элемента необходимо будет снова инициировать подбор. [488]

Создадим основную форму выбора справочника "Номенклатура". Затем добавим в состав командной панели табличного поля документа "ПриходнаяНакладная" кнопку "Подбор".

Добавим кнопку "Подбор"

В форме документа, в обработчик события нажатия кнопки "Подбор" добавим следующий текст:

Процедура КоманднаяПанельМатериалыПодбор(Кнопка)

ФормаПодбора = Справочники.Номенклатура.ПолучитьФормуВыбора( ,ЭлементыФормы.Материалы);

   ФормаПодбора.Открыть();

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

Затем создадим обработчик события "Обработка выбора" табличного поля "Материалы", расположенного в форме документа "ПриходнаяНакладная":

Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

   НоваяСтрока = Материалы.Добавить();

   НоваяСтрока.Материал = ВыбранноеЗначение;

   ЭлементыФормы.Материалы.ТекущаяСтрока = НоваяСтрока;

КонецПроцедуры [489]

Запустите 1С:Предприятие в режиме отладки и проверьте работу одиночного подбора.



Оформление строк табличного поля


Одним из полезных свойств элемента управления "Табличное поле" является возможность настройки оформления его строк программным способом.

Для иллюстрации этой возможности мы снова воспользуемся формой справочника "Номенклатура" и придадим ей "нестандартный" вид.

Откроем в конфигураторе форму списка справочника "Номенклатура" и создадим обработчик события формы "При открытии" со следующим текстом:

Процедура ПриОткрытии()

   СписокСправочника = ЭлементыФормы.СправочникСписок;

   //задать режим чередования цветов строк

   СписокСправочника.ЦветФонаЧередованияСтрок = WEBЦвета.Бежевый;

   СписокСправочника.ЧередованиеЦветовСтрок = Истина;

   //скрыть линии сетки

   СписокСправочника.ВертикальныеЛинии = Ложь;

   СписокСправочника.ГоризонтальныеЛинии = Ложь;

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

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

Затем мы скрываем линии разделяющие колонки и строки.

Теперь откроем обработчик события "ПриВыводеСтроки" табличного поля списка справочника, и добавим в него следующие строки:

Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

   //для элементов отобразим цену и ...

   Если Не ДанныеСтроки.ЭтоГруппа Тогда

       ОтборНоменклатуры = Новый Структура;

       ОтборНоменклатуры.Вставить("Номенклатура", ДанныеСтроки.Ссылка);

       ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;

       АктуальнаяЦена = РегистрыСведений.Цены.ПолучитьПоследнее(, ОтборНоменклатуры).Цена;

       ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;

       //низкие цены выделим другим цветом




       Если АктуальнаяЦена < 500 Тогда

           ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WEBЦвета.Васильковый;

       КонецЕсли;

       //... раздвинуть строку если длинное наименование

       Если СтрДлина(СокрЛП(ДанныеСтроки.Наименование)) > 30 Тогда

           ОформлениеСтроки.Ячейки.Наименование.АвтоВысотаЯчейки = Истина;

           ОформлениеСтроки.Ячейки.Наименование.ВысотаЯчейки = 3;

       КонецЕсли;

   КонецЕсли;

КонецПроцедуры [527]

Здесь, в случае вывода элемента справочника, мы анализируем длину его наименования и для наименований более 30 символов устанавливаем автоматическое определение высоты ячейки, ограничивая ее максимальную высоту тремя строками.

Запустим 1С:Предприятие в режиме отладки и посмотрим на результат:



[528]






Организация подборов


Задача организации подбора заключается, как правило, в заполнении табличной части информацией, которую выбирает пользователь в списке какого-либо объекта.



Отбор объектов, введенных на основании


Поскольку задача получения всех объектов, введенных на основании какого-либо другого объекта чаще всего возникает при анализе документов, мы рассмотрим применение описанной выше методики на примере получения списка документов, введенных на основании элемента справочника "Клиенты". [497]

Создадим новый объект конфигурации "КритерийОтбора" с именем "ОказаниеУслуги". На закладке "Данные" выберем тип используемого критерия – СправочникСсылка.Клиенты.

На закладке "Состав" в качестве объектов, входящих в критерий, выберем реквизит "Основание" документа "ОказаниеУслуги":

На закладке "Формы" создадим основную форму списка при помощи конструктора. [498]

Запустите 1С:Предприятие в режиме отладки и проверьте работу критерия отбора:

Кнопка "Перейти" открывает форму списка критерия отбора...

Обратите внимание, что пункт меню "Перейти", формируемый платформой автоматически, включил в себя команду открытия формы списка созданного нами критерия отбора с установленным отбором по текущему элементу справочника "Клиенты".

Чтобы проиллюстрировать действия, выполняемые платформой при открытии формы списка критерия отбора, создадим основную форму списка справочника "Клиенты" и в командную панель формы добавим кнопку "ДокументыКлиента".

Обработчик этой кнопки будет выглядеть следующим образом:

Процедура ДействияФормыДокументыКлиента(Кнопка)

   ФормаКритерия = КритерииОтбора.ОказаниеУслуги.ПолучитьФорму();

   ФормаКритерия.Открыть();

   СписокКритерияОтбора = ФормаКритерия.ЭлементыФормы.Список.Значение;

   СписокКритерияОтбора.Отбор.ЗначениеОтбора.Значение = ЭлементыФормы.СправочникСписок.ТекущаяСтрока;

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

Этот обработчик открывает форму критерия отбора и затем устанавливает значение единственного элемента отбора объекта [499] КритерийОтбораСписок.ОказаниеУслуги равным ссылке на элемент справочника.




Запустите 1С:Предприятие в режиме отладки и проверьте работу нового пункта меню.

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

Добавьте в обработчик события "При открытии" формы документа "ОказаниеУслуги" следующие строки:

Процедура ПриОткрытии()

   МассивСсылок = КритерииОтбора.ОказаниеУслуги.Найти(ЭлементыФормы.Клиент.Значение);

   Для Каждого НужнаяСсылка Из МассивСсылок Цикл

       Сообщить(НужнаяСсылка);

   КонецЦикла;

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

 В оригинале...

Процедура ДействияФормыДокументыКлиента(Кнопка)

   ФормаКритерия = КритерииОтбора.ОказаниеУслуги.ПолучитьФорму();

   ФормаКритерия.Открыть();

   СписокКритерияОтбора = ФормаКритерия.ЭлементыФормы.Список.Значение;

   СписокКритерияОтбора.Отбор.ЗначениеОтбора.Значение = ЭлементыФормы.СправочникСписок.ТекущаяСтрока;

   МассивСсылок = КритерииОтбора.ОказаниеУслуги.Найти(ЭлементыФормы.СправочникСписок.ТекущаяСтрока);

   Для Каждого НужнаяСсылка Из МассивСсылок Цикл

       Сообщить(НужнаяСсылка);

   КонецЦикла;

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

Запустите 1С:Предприятие в режиме отладки и проверьте вывод списка зависимых документов в окно сообщений. [500]





if (window.topicInitScriptAvailable) { HMInitToggle('TOGGLE0186A1','hm:type','dropdown','hm:state','0');HMInitToggle('$TOGGLE0186A1_ICON','hm:type','dropdown','hm:state','0','hm:src0','hmtoggle_plus0.gif','hm:src1','hmtoggle_plus1.gif','onclick','HMToggle(\'toggle\',\'TOGGLE0186A1\',\'\$TOGGLE0186A1_ICON\')');}


Подбор с использованием множественного выбора


Еще одним способом организации подбора является возможность использования свойства формы "Множественный выбор". Это свойство разрешает множественный выбор в табличных полях формы. В этом случае в форму документа будет возвращен не элемент справочника, а массив элементов, выбранных в табличном поле формы справочника. [490]

В форме документа "ПриходнаяНакладная" внесем в обработчик события нажатия кнопки "Подбор" следующие изменения:

Процедура КоманднаяПанельМатериалыПодбор(Кнопка)

ФормаПодбора = Справочники.Номенклатура.ПолучитьФормуСписка( ,ЭлементыФормы.Материалы);

   ФормаПодбора.РежимВыбора = Истина;

  //ФормаПодбора.ЗакрыватьПриВыборе = Ложь;

   ФормаПодбора.МножественныйВыбор = Истина;

   ФормаПодбора.Открыть();

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

В обработчик события "Обработка выбора" добавим обход массива переданных элементов:

Процедура МатериалыОбработкаВыбора(Элемент, РезультатВыбора, СтандартнаяОбработка)

   Для СчетчикЦикла = 0 по РезультатВыбора.ВГраница() Цикл

       НоваяСтрока = Материалы.Добавить();

       НоваяСтрока.Материал = РезультатВыбора[СчетчикЦикла];

   КонецЦикла;

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

Запустите 1С:Предприятие в режиме отладки и проверьте работу множественного подбора (множественный выбор в табличном поле выполняется при нажатой кнопке "Control").

Теперь, если вы удалите комментарий в обработчике события нажатия кнопки "Подбор", то получите вариант "множественного подбора с использованием множественного выбора".



Связанные списки


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

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

Рассмотрим вариант создания такой связи между списками на примере списка документа "ПриходнаяНакладная", в котором будут отображаться движения документа по регистру "ОстаткиМатериалов". Откроем конфигуратор и создадим основную форму списка документа "ПриходнаяНакладная". Уменьшим высоту табличного поля списка документа и на освободившемся пространстве расположим табличное поле с именем "ТабличноеПоле" и типом РегистрНакопленияСписок.ОстаткиМатериалов:

Добавим на форму табличное поле...


[512]

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

Для этого откроем палитру свойств добавленного нами табличного поля и воспользуемся свойством "Связь по регистратору". Связь по регистратору мы будем устанавливать с обработчиком события "При активизации строки" верхнего поля "ДокументСписок":

Установим связь по регистратору...


[513]

Теперь запустим 1С:Предприятие в режиме отладки и проверим работу связанных списков:

Обратите внимание, что при перемещении в верхнем списке, данные нижнего списка меняются соответствующим образом:

Аналогичную связь можно установить исключительно программными средствами, не используя связь по регистратору. Для этого нужно в обработчике события "При активизации строки" верхнего списка устанавливать отбор нижнего списка по регистратору. [514]




Чтобы выполнить этот пример, уберем для нижнего табличного поля связь по регистратору, а для верхнего создадим обработчик события "При активизации строки":

Процедура ДокументСписокПриАктивизацииСтроки(Элемент)

ЭлементыФормы.ТабличноеПоле.Значение.Отбор.Регистратор.Установить(Элемент.ТекущаяСтрока, Истина);

КонецПроцедуры [515]

Ввод на основании


Механизм ввода на основании может быть использован для ввода новых объектов различного типа (документы, справочники, планы видов характеристик и т.д.). Мы рассмотрим этот механизм на примере ввода новых документов, как наиболее распространенном.

Для каждого объекта конфигурации Документ можно разрешить его ввод на основании других объектов базы данных и возможность являться основанием для других объектов. Действия по заполнению реквизитов при вводе на основании должны быть описаны в модуле объекта Документ, в обработчике события "Обработка заполнения". Есть возможность использовать конструктор ввода на основании, который позволяет визуальными средствами конструировать текст обработчика.

Рассмотрим пример, когда документ "ОказаниеУслуги" будет вводиться на основании элемента справочника "Клиенты".

Откроем окно редактирования объекта конфигурации Документ "ОказаниеУслуги" и добавим новый реквизит документа – "ОбъектОснование" с типом СправочникСсылка.Клиенты. Создание такого реквизита не является обязательной частью механизма ввода на основании и понадобится нам только для того, чтобы в последствии построить цепочку зависимых документов. [493]

Перейдем на закладку "Ввод на основании" и определим состав документов, на основании которых может вводиться документ "ОказаниеУслуги", и основанием для которых он может являться:

Определим состав объектов и вызовем конструктор ввода на основании...


[494]

Затем вызовем конструктор ввода на основании и зададим значения реквизитов документа, создаваемого на основании. Для этого воспользуемся кнопкой "Заполнить выражения":

Обратите внимание, что для заполнения реквизита "ОбъектОснование" конструктор предложил использовать значение Основание.Ссылка. В данном случае такая запись будет избыточной, поскольку в качестве основания будет передана ссылка на элемент справочника. Однако в общем случае событие "Обработка заполнения" возникает при создании нового объекта на основании некоторого переданного значения. Совсем не обязательно, что это значение будет иметь тип ссылки.




Согласимся со всем, что предложил конструктор, и нажмем "ОК".

В модуле документа будет сформирован текст обработчика события "Обработка заполнения":

Процедура ОбработкаЗаполнения(Основание)

//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ

   // Данный фрагмент построен конструктором.

   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!![495]

   Если ТипЗнч(Основание) = Тип("СправочникСсылка.Клиенты") Тогда

       // Заполнение шапки

       Клиент = Основание.Ссылка;

       ОбъектОснование = Основание.Ссылка;

   КонецЕсли;

   //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ

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

Как видите, для каждого типа объекта-основания формируется своя ветка условия Если..., в которой происходит заполнение реквизитов нового документа.

Запустите 1С:Предприятие в режиме отладки и проверьте работу ввода на основании. Обратите внимание, что в командной панели формы списка справочника "Клиенты" появилась кнопка "Ввести на основании":



[496]


Вычисляемые колонки в списках


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

Мы рассмотрим эту ситуацию на примере отображения актуальной цены в списке справочника "Номенклатура".

Откроем в конфигураторе форму списка справочника "Номенклатура" (или, если ее нет, создадим основную форму списка). Воспользуемся контекстным меню правой кнопки мыши и добавим в табличное поле колонку с именем и текстом шапки "Цена":

В табличное поле списка справочника Номенклатура добавим колонку Цена...

Создадим обработчик события табличного поля "При выводе строки", и добавим в него следующий текст:

Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

   //для элементов отобразим цену и ...

   Если Не ДанныеСтроки.ЭтоГруппа Тогда

       ОтборНоменклатуры = Новый Структура;

       ОтборНоменклатуры.Вставить("Номенклатура", ДанныеСтроки.Ссылка); [524]

       ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;

       АктуальнаяЦена = РегистрыСведений.Цены.ПолучитьПоследнее(, ОтборНоменклатуры).Цена;

       ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;

       //низкие цены выделим другим цветом

       Если АктуальнаяЦена < 500 Тогда

           ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WEBЦвета.Васильковый;

       КонецЕсли;

   КонецЕсли;

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

Обработчик события табличного поля "При выводе строки" передает три параметра: "Элемент" – само табличное поле, для которого было вызвано это событие, "ОформлениеСтроки" – объект, содержащий оформление выводимой строки табличного поля и "ДанныеСтроки" – элемент выборки справочника "Номенклатура", отображаемый в выводимой строке.




Первое, что мы делаем в этом обработчике – проверяем, что выводимый элемент справочника не является группой. В этом случае мы создаем вспомогательную структуру для описания отбора ("ОтборНоменклатуры") и помещаем в ячейку "Цена" актуальное значение цены, полученной из периодического регистра сведений "Цены".

Затем мы анализируем значение выведенной цены и если оно находится в нижнем ценовом диапазоне (менее 500 рублей), выделяем это значение васильковым цветом. Для указания цвета мы используем системный набор значений WEBЦвета.

Запустим 1С:Предприятие в режиме отладки и посмотрим, какой внешний вид примет теперь справочник "Номенклатура":



[525]

При использовании обработчика события "При выводе строки" нужно быть крайне внимательным и всегда стараться минимизировать обращения к данным, которые не содержатся в параметре "ДанныеСтроки".

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

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