Глава 7. Формы

7.1. Общая информация

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

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

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

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

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

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

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

Форма создается в редакторе формы, который доступен в режиме Конфигуратор (см. здесь). В этом редакторе определяются:

Реквизиты формы ‑ предназначены для хранения данных, с которыми работает форма (см. здесь).

Параметры формы ‑ предназначены для организации связи между формами и управления функциональностью формы при ее открытии (см. здесь).

Команды формы ‑ предназначены для выполнения различных действий внутри формы (см. здесь).

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

Элементы формы ‑ предназначены для отображения и редактирования реквизитов формы, а также для отображения и выполнения команд (см. здесь).

Командный интерфейс ‑ содержит команды, которые могут выполняться в форме и предоставлены глобальным командным интерфейсом и командами формы (см. здесь).

ВНИМАНИЕ! Формы одновременно присутствуют и на стороне сервера, и на стороне клиента. Об этом всегда следует помнить при разработке формы.

7.2. Реквизиты формы

7.2.1. Общая информация

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

ВНИМАНИЕ! Необходимо помнить, что все данные формы должны быть описаны в виде реквизитов. Не допускается использование переменных модуля формы в качестве источников данных для элементов формы.

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

Имеется возможность назначить Основной реквизит формы, т. е. реквизит, который будет определять стандартную функциональность формы (расширение формы).

ВНИМАНИЕ! Следует помнить, что основной реквизит у формы может быть только один.

Расширение формы ‑ это дополнительные свойства, методы и параметры формы объекта ФормаКлиентскогоПриложения, характерные для типа основного реквизита формы.

7.2.2. Типы данных формы

Форма оперирует ограниченным набором типов данных:

● Типы, которые непосредственно используются в форме, ‑ это те типы, которые существуют на стороне тонкого клиента и веб-клиента (например, Число, СправочникСсылка.Товары, ГрафическаяСхема, ТабличныйДокумент).

● Типы, которые будут преобразованы в специальные типы данных, ‑ типы данных формы. Такие типы отображаются в списке реквизитов формы в круглых скобках, например (СправочникОбъект.Товары).

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

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

Используются следующие типы данных:

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

ДанныеФормыКоллекция ‑ это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. В коллекциях, полученных на основе наборов записей регистров или табличных частей объектов, поле элемента коллекции НомерСтроки не соответствует реальному индексу элемента коллекции. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.

ДанныеФормыСтруктураСКоллекцией ‑ это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.

ДанныеФормыДерево ‑ объект предназначен для хранения иерархических данных.

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

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

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. В общем виде иерархия и состав данных формы зависят от сложности и взаимосвязи прикладных объектов формы.

Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

ВНИМАНИЕ! Во время разработки конфигурации важно помнить, что прикладные объекты доступны только на сервере, в то время как объектами данных форм можно пользоваться и на сервере, и на клиенте.

При формировании реквизитов формы необходимо учитывать ряд ограничений:

● В данных формы могут храниться данные только тех типов системы «1С:Предприятие», для которых указан возможность XDTO-сериализации (см. здесь).

● Запрещено присваивание реквизитам формы значений типа Массив и Соответствие.

● Для реквизитов произвольного типа объектов ДанныеФормыСтруктура, ДанныеФормыЭлементКоллекции, ДанныеФормыЭлементДерева, ДанныеФормыСтруктураСКоллекцией запрещается присваивание значений типа Массив и Соответствие.

● Не рекомендуется использовать значения типов Массив и Соответствие в качестве элементов коллекций типа Структура или СписокЗначений. В вышеперечисленных случаях рекомендуется использовать фиксированные коллекции: ФиксированныйМассив, ФиксированноеСоответствие.

● Не рекомендуется использовать типы Структура и СписокЗначений в данных реквизитов формы (т. е. в реквизитах реквизитов).

● Не рекомендуется размещать один объект типа ТабличныйДокумент в несколько реквизитов формы.

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

ДокументОбъект,

СправочникОбъект,

БизнесПроцессОбъект,

ЗадачаОбъект,

ПланВидовХарактеристикОбъект,

ПланВидовРасчетаОбъект,

ПланОбменаОбъект,

ПланСчетовОбъект,

ВнешнийИсточникДанныхКубТаблицаИзмеренияОбъект,

ВнешнийИсточникДанныхТаблицаОбъект.

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

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

● Для реквизита, подчиненного динамическому списку (колонке динамического списка):

● Свойство включено ‑ реквизит всегда считывается из базы данных и включается в данные формы.

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

● Для реквизита, подчиненного коллекции движений:

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

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

● Остальные реквизиты формы:

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

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

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

Примечание 2. Для реквизитов формы, имеющих объектный тип (СправочникОбъект, ДокументОбъект и т. д.), реквизиты Ссылка, ПометкаУдаления и ЭтоГруппа всегда присутствуют в данных формы (если соответствующий реквизит есть у объекта), вне зависимости от состояния свойства Использовать всегда.

Примечание 3. Запрещено присваивание реквизитам данных формы значений других объектов данных формы.

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

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

Далее рассмотрим некоторые особенности реквизитов форм разных типов:

● Для реквизитов формы типа ТаблицаЗначений и ДеревоЗначений имеется возможность добавлять колонки (команда Добавить колонку реквизита). Это определяет структуру данных создаваемой коллекции.

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

Эти колонки будут создаваться системой в момент создания данных формы. Обращение к таким реквизитам доступно как на клиенте, так и на сервере.

Пример заполнения колонки реквизита, не связанной с данными:

Копировать в буфер обмена
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    Для Каждого Строка Из Объект.Товары Цикл
   // ВидТовара - реквизит, не связанный с данными
   Строка.ВидТовара = Строка.Товар.Вид;
    КонецЦикла
КонецПроцедуры

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

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

ВНИМАНИЕ! Колонки реквизитов, не связанные с данными, не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно.

Описание свойств Просмотр и Редактирование см. здесь.

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

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

Копировать в буфер обмена
Процедура ОбработчикКомандыФормы()
    Для Счетчик=1 по 100 Цикл
   ВыполнитьДействие();
    КонецЦикла
КонецПроцедуры

Если нажать кнопку, инициирующую эту команду, в режиме 1С:Предприятия, то индикатор вначале будет в крайнем левом положении, а потом ‑ сразу в крайнем правом (считаем, что метод ВыполнитьДействие() выполняется какое-то время, что должно позволить увидеть изменение индикатора). То есть индикатор будет обновлен только после того, как закончится исполнение обработчика команды.

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

Копировать в буфер обмена
Процедура ОбработчикКомандыФормы()
    Для Счетчик=1 по 100 Цикл
   ВыполнитьДействие();
   ОбновитьОтображениеДанных();
    КонецЦикла
КонецПроцедуры

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

Примечание. В веб-клиенте вызов метода ОбновитьОтображениеДанных() приведет к обновлению элементов формы только после окончания выполнения кода на встроенном языке.

7.2.3. Преобразование данных прикладных объектов в данные формы и обратно

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

ЗначениеВДанныеФормы(),

ДанныеФормыВЗначение(),

КопироватьДанныеФормы().

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

Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.

ЗначениеВДанныеФормы() ‑ преобразует объект прикладного типа в данные формы.

ДанныеФормыВЗначение() ‑ преобразует данные формы в объект прикладного типа.

КопироватьДанныеФормы() ‑ производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.

При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.

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

Приведем пример, как использовать преобразование данных в собственных алгоритмах.

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОбъектТовар = Товары.НайтиПоНаименованию("Кофейник").ПолучитьОбъект();
    ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Записать()
    ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьНаСервере()
    ОбъектТовар = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Товары"));
    ОбъектТовар.Записать();
КонецПроцедуры

Также у объекта ФормаКлиентскогоПриложения существуют методы, доступные на сервере:

ЗначениеВРеквизитФормы() ‑ выполняет преобразование объекта прикладного типа в заданный реквизит формы.

РеквизитФормыВЗначение() ‑ преобразует реквизит данных формы в объект прикладного типа.

Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений (см. здесь).

Также следует помнить, что при преобразовании в данные формы (как с помощью метода ЗначениеВДанныеФормы(), так и с помощью метода ЗначениеВРеквизитФормы()) объектов типа ТаблицаЗначений или ДеревоЗначений нужно учитывать следующую особенность: в преобразуемом объекте должны существовать все колонки, которые существуют в данных формы.

ВНИМАНИЕ! Колонки реквизитов, не связанные с данными (см. здесь), не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно. Колонки, отсутствующие в данных объекта, очищаются при преобразовании в данные формы.

При переносе объекта в данные формы платформой, или при вызове методов ЗначениеВДанныеФормы(), ЗначениеВРеквизитФормы(), переносятся только данные объекта. Внутренние состояние объекта в данные формы не переносится. Например, значение ссылки нового, которая установлена в объект методом УстановитьСсылкуНового(), будет утеряна в процессе преобразования объекта в данные формы и обратно.

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

Копировать в буфер обмена
&НаСервере
Процедура ПересчитатьНаСервере()
    // Преобразует реквизит Объект в прикладной объект.
    Документ = РеквизитФормыВЗначение("Объект");
    // Выполняет пересчет методом, определенным в модуле документа.
    Документ.Пересчитать();
    // Преобразует прикладной объект обратно в реквизит.
    ЗначениеВРеквизитФормы(Документ, "Объект");
КонецПроцедуры

7.2.4. Свойства реквизитов

Данный раздел содержит описание некоторых свойств реквизитов формы.

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

Основной реквизит ‑ определяет, что данный реквизит формы является основным и определяет расширение формы.

Сохраняемые данные ‑ если для реквизита установлено это свойство, то интерактивное изменение такого реквизита будет приводить:

● К попытке блокировки связанного реквизита формы.

● Установке признака изменения у формы (флаг Модифицированность).

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

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

● примитивных типов данных (Число, Строка, Булево, Дата, любые типы ссылок, стандартный период),

● список значений,

● дерево значений,

● таблица значений.

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

7.3. Специальные типы реквизитов формы

7.3.1. Динамический список

7.3.1.1. Общая информация

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

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

Рис. 220. Варианты создания динамического списка

При создании реквизита формы типа ДинамическийСписок разработчик может выбрать два способа формирования запроса к данным:

● Заданием основной таблицы ‑ в этом случае достаточно просто указать таблицу (свойство Основная таблица), из которой необходимо получать данные, и система будет автоматически формировать запрос к данным (см. правую часть на рис. 220).

● Ручным формированием запроса ‑ для этого нужно установить свойство Произвольный запрос (см. левую часть рис. 220). После этого будет доступно ручное формирование запроса получения данных из информационной базы.

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

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

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

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

Копировать в буфер обмена
ВЫБРАТЬ
    ВЫБОР
   КОГДА Доставка.Коэффициент = 1
    ТОГДА &Представление
   ИНАЧЕ Доставка.Коэффициент
    КОНЕЦ КАК Коэффициент
ИЗ
    Документ.ДоставкаПродукции КАК Доставка

При этом если тип значения параметра отличается от типа реквизита объекта (например, Реквизит1 имеет тип Число, а значение параметра ‑ тип Строка), то для корректного отображения поля следует выполнить явное приведение значения параметра к нужному типу:

Копировать в буфер обмена
ВЫБРАТЬ
    ВЫБОР
   КОГДА Доставка.Коэффициент = 1
    ТОГДА ВЫРАЗИТЬ(&Представление КАК Строка(100))
   ИНАЧЕ Доставка.Коэффициент
    КОНЕЦ КАК Коэффициент
ИЗ
    Документ.ДоставкаПродукции КАК Доставка

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

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

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

● Если установлен режим просмотра в виде дерева, то будут считываться только данные открытых узлов дерева.

● Не поддерживается единовременная загрузка данных динамического списка в случае установленного иерархического просмотра (свойство Отображение установлено в значение Дерево) и начальном отображении дерева, установленном в значение Раскрывать все уровни. Для получения данных будет выполнено столько запросов к серверу, сколько узлов находится в отображаемом списке.

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

● свойство имеет значение Истина ‑ для тонкого и веб-клиента динамический список получает представления для всех полей ссылочного типа, которые передаются на клиента.

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

Совет! Для динамического списка с большим количеством ссылочных полей, не связанных с колонками таблицы или элементами формы, но имеющих установленный флаг Использовать всегда, установка значения свойства Получение представлений для невидимых полей в значение Ложь может привести к ускорению получению данных динамическим списком. Если, однако, значения из таких полей каким-либо образом попадают в элементы формы или участвуют в формировании текстовых строк ‑ не следует устанавливать свойство Получение представлений для невидимых полей в значение Ложь, так как это приведет к дополнительным серверным вызовам для получения представления.

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

● В пакетном запросе списка отсутствует запросы после основного запроса пакета.

● Состав временных таблиц и полей в них неизменен с предыдущего выполнения пакетного запроса.

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

● формат,

● формат редактирования,

● подсказка,

● признак выделения отрицательных значений,

● маска,

● признак многострочного режима,

● признак расширенного редактирования,

● режим пароля.

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

7.3.1.2. Ограничения и особенности

При установке отбора в динамическом списке следует помнить, что отбор не действует на группы, если для динамического списка выбран режим отображения Иерархический список или Дерево. Под «группами» понимается элемент справочника или плана видов характеристик, у которого свойство ЭтоГруппа установлено в значение Истина.

Отборы, автоматически накладываемые динамическим списком на стандартные реквизиты Владелец, Родитель, Дата, Период и ЭтоГруппа, применяются стандартными средствами системы компоновки данных. Отборы, автоматически накладываемые динамическим списком на ключевые поля, могут применяться как стандартными средствами системы компоновки данных так и путем непосредственного добавления в текст запроса условия В на поля основной таблицы. В результате применения отборов средствами компоновки, они могут примениться как во вложенных запросах, так и в параметрах виртуальных таблиц.

При разработке динамических списков рекомендуется проверить все динамические списки с произвольными запросами. В процессе проверки следует убедиться, что если в запросе списка присутствуют вложенные запросы или виртуальные таблицы, и в них доступны для отбора поля с псевдонимами, совпадающими с псевдонимами стандартных реквизитов Владелец, Родитель, Дата, Период, ЭтоГруппа или ключевых полей, то эти поля действительно соответствуют стандартными реквизитам, с которыми у них совпадает псевдоним. Если это не так ‑ следует изменить запрос что бы они совпадали или псевдоним отличался.

Если выбрано ручное формирование запроса, то на запрос налагаются некоторые ограничения:

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

● Не поддерживается отбор, сортировка и группировка:

● По реквизитам табличных частей.

● Поля представлений.

● Поле ВерсияДанных.

● Поле ИмяПредопределенныхДанных.

● Поле Вид таблицы плана счетов.

● Поле ВидДвижения таблицы регистра накопления.

● Поле ТипЗначения таблицы плана видов характеристик.

● Поле типа Тип;

● Поле типа Строка (неограниченной длины).

● Поле типа ДвоичныеДанные.

● Не поддерживается сортировка и группировка по полям Субконто<НомерСубконто> и ВидСубконто<НомерСубконто> таблицы ДвиженияССубконто регистра бухгалтерии.

● Не поддерживается сортировка по полям, которые имеют составной тип и состав которого (составного типа) содержит более 100 типов. Такие поля будут исключены из списка доступных полей порядка.

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

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

● Не поддерживаются объединения.

● Не поддерживается использование секции УПОРЯДОЧИТЬ ПО. Следует использовать запрос без основной таблицы или задавать необходимое упорядочивание через настройки динамического списка.

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

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

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

● таблица Субконто регистра бухгалтерии;

● все виртуальные таблицы регистра бухгалтерии, кроме таблицы ДвиженияССубконто;

● таблицы значений констант (включая таблицу Константы);

● таблицы внешних источников данных без ключевых полей;

● таблицы кубов внешних источников данных;

● таблицы регистра накопления:

● таблица оборотов;

● таблица остатков;

● таблица оборотов и остатков.

● таблицы регистра расчета:

● таблица фактического периода действия;

● данных графика;

● базовых данных.

● Таблицы табличных частей объектов;

● Таблицы регистрации изменений (используемые в механизмах обмена данными);

● Таблицы последовательностей;

● Таблицы перерасчетов (используемые в механизмах периодических расчетов).

● Таблицы, которая используется в запросе только во внешнем соединении.

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

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

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

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

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

Состав колонок и настройки динамического списка связаны с полями запроса по псевдонимам полей выборки. Если в запросе для поля выборки псевдоним не задан явно и поле является системным, то в качестве псевдонима используется имя поля для английского варианта встроенного языка. Указанная связь означает, что при изменении (или явном указании псевдонима для поля, у которого использовался автоматический псевдоним) псевдонима поля запроса, формирующего данные динамического список, будут утеряны настройки реквизита динамического списка, элементы формы «потеряют» отображаемые реквизиты, настройки динамического списка станут неверными и т. д.

В том случае, если источником данных динамического списка является таблица (обычная или виртуальная), которая позволяет устанавливать отбор по периоду, то в том случае, если пользователь устанавливает период отображения в таком динамическом списке (команда Установить интервал дат…), заданные границы периода будут установлены в качестве значений отбора или параметров виртуальной таблицы. Если средствами расширения языка запросов для системы компоновки данных были явно указаны имена параметров виртуальной таблицы ‑ будут установлены параметры с заданными именами. Таблицы, для которых возможно управлять периодом отображения или обработки данных:

● таблицы регистров (основные или виртуальные), для которых существует возможность отбора по периоду (для регистра расчета ‑ по периоду регистрации);

● основные таблицы документов, бизнес-процессов и задач;

● основные таблицы журналов документов;

● основные таблицы последовательностей, таблицы границ последовательностей.

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

При отображении данных динамического списка следует помнить о следующих особенностях:

● При программном изменении свойств динамического списка не происходит автоматического повторного заполнения командных панелей, связанных с этим динамическим списком.

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

● Для строк группировок не применяется никакое оформление: условное оформление динамического списка, условное оформление формы, оформление от настроек колонок таблицы (Формат, Шрифт и т. п.).

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

Например, в следующем примере поле будет иметь тип Число.

Копировать в буфер обмена
ВЫБОР
    КОГДА Ложь
    ТОГДА 5
    ИНАЧЕ &Параметр
КОНЕЦ

Если присвоить параметру Параметр значение другого типа, в динамический список для этого поля будет получать значение 0 (значение по умолчанию для типа Число).

Если в подобной ситуации требуется выбирать параметр другого типа ‑ рекомендуется использовать конструкцию языка запросов ВЫРАЗИТЬ. Например, если в приведенном выше примере требуется передавать в параметр строку не длиннее 100 символов, то следует заменить простое указание параметра, на выражение с явным приведением типа:

Копировать в буфер обмена
ВЫБОР
    КОГДА Ложь
    ТОГДА 5
    ИНАЧЕ ВЫРАЗИТЬ(&Параметр КАК Строка(100))
КОНЕЦ

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

Например, в списке с произвольным запросом:

Копировать в буфер обмена
ВЫБРАТЬ
    ВЫБОР
   КОГДА ЛОЖЬ
   ТОГДА 1
    КОНЕЦ КАК Поле

Значением Поле будет 0, а не NULL, как можно ожидать исходя из текста запроса.

Если в произвольном тексте запроса динамического списка в выражениях полей выборки используются параметры ‑ следует явно указать тип параметров при помощи конструкции ВЫРАЗИТЬ. Например, вместо &Номенклатура КАК Номеклатура использовать ВЫРАЗИТЬ(&Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура. В противном случае поиск через строку поиска может работать некорректно или выдавать ошибки.

7.3.1.3. Способы получения и кеширования данных динамическим списком

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

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

2. Считывание из базы данных выполняется страницами по 1 000 элементов данных. Выполняется кеширование данных на сервере. Иерархические данные кешируются: для каждого родителя кешируется не более 2 страниц элементов. На один динамический список кешируется не более 20 страниц элементов. Кеширование будет включено динамическим списком для следующих таблиц:

● Критерий отбора;

● Все таблицы регистра бухгалтерии, кроме основной таблицы и таблицы ДвиженияССубконто;

● Все таблицы регистра накопления, кроме основной таблицы;

● Все таблицы регистра сведений, кроме основной таблицы;

● Все таблицы регистра расчета, кроме основной таблицы;

● Виртуальная таблица ЗадачиПоИсполнителю;

● Таблицы внешних источников без ключей;

● Кубы внешних источников.

3. Считывание из базы данных выполняется страницами по 1 000 элементов. Первая порция равна 1 странице. Каждая следующая порция увеличивается на 1 страницу (при достижении конца предыдущей выборки). Чем ближе передвигается «точка просмотра» к концу отображаемых данных, тем большая выборка считывается из базы данных, в пределе становясь равной всем отображаемым данным. Выполняется кеширование данных на сервере. Максимальное количество записей в кеше и динамическом списке ‑ 1 000 000.

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

● В качестве значения свойства Основная таблица указана одна из следующих таблиц: план обмена, справочник, список документов, журнал документов, план видов характеристик, план счетов, план видов расчета, бизнес-процесс, задача, таблица точек бизнес-процесса:

● Ключ, идентифицирующий строку таблицы: Ссылка.

● Свойство Динамическое считывание данных:

● Установлено: используется способ 1 (описание способов приведено выше).

● Сброшено: используется способ 2 (описание способов приведено выше).

● В качестве значения свойства Основная таблица указана одна из следующих таблиц: основная таблица регистра сведений, регистра накопления, регистра бухгалтерии, регистра расчета, виртуальная таблица регистра бухгалтерии ДвиженияССубконто:

● Ключ, идентифицирующий строку таблицы: КлючЗаписи.

● Свойство Динамическое считывание данных:

● Установлено: используется способ 1 (описание способов приведено выше).

● Сброшено: используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана таблица критерия отбора или таблица задач по исполнителю (ЗадачиПоИсполнителю):

● Ключ, идентифицирующий строку таблицы: Ссылка.

● Свойство Динамическое считывание данных не применимо.

● Используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана виртуальная таблица регистра сведений СрезПервых или СрезПоследних:

● Ключ, идентифицирующий строку таблицы: КлючЗаписи.

● Свойство Динамическое считывание данных не применимо.

● Используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана одна из виртуальных таблицы регистров, кроме перечисленных выше:

● Ключ, идентифицирующий строку таблицы: Число.

● Свойство Динамическое считывание данных не применимо.

● Используется способ 3 (описание способов приведено выше).

● Свойство Основная таблица не указано, используется произвольный запрос: поведение зависит от свойств Вид ключа, Поля ключа и Динамическое считывание данных. Подробное описание см. здесь.

Для отображения данные передаются на клиента порциями, размер которых аналогичен размеру порции в 1-м способе считывания данных (описан в начале данного раздела).

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

7.3.1.4. Настройка способа получения и кеширования данных динамического списка без основной таблицы

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

Для того, чтобы указать системе «1С:Предприятие» параметры ключа для данных произвольного запроса без основной таблицы, редактор запроса динамического списка предлагает следующие свойства, которые становятся доступными в том случае, если свойство Основная таблица не заполнено:

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

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

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

Рис. 221. Произвольный запрос динамического списка

Рассмотрим свойства, предназначенные для формирования ключа, более подробно.

Значение свойства Вид ключа может принимать следующие значения:

Значение поля ‑ в данном случае принимается, что у данных, возвращаемых запросом, одно ключевое поле. Поле, выступающее в роли ключа, определяется свойством Поля ключа.

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

Ключ строки ‑ в данном случае принимается, что ключ включает несколько полей. Одно поле также является допустимым вариантом. Для указания полей, входящих в состав ключа, предназначено свойство Поля ключа.

Тип значения свойства ТекущаяСтрока: значение типа КлючСтрокиДинамическогоСписка.

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

Тип значения свойства ТекущаяСтрока: значение типа Число.

Авто ‑ в этом случае платформа пытается определить вид ключа на основании свойства Поля ключа и заполненности свойства Основная таблица:

● Основная таблица не указана:

● Поля ключа не заданы. В этом случае платформа будет использовать в качестве вида ключа значение Номер строки.

● В полях ключа указано одно значение. В этом случае платформа будет использовать в качестве вида ключа значение Значение поля.

● В полях ключа указано несколько значений. В этом случае платформа будет использовать в качестве вида ключа значение Ключ строки.

● Основная таблица указана:

● Используемый вид ключа зависит от используемой таблицы. Связь основной таблицы и используемого ключа см. здесь.

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

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

● Если поле является полем ключа с видом Значение поля, то среди значений этого поля не допускаются значения Неопределено и NULL.

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

Вид ключа

Включено динамическое считывание данных

Выключено динамическое считывание данных

Значение поля

Способ 1

Способ 2

Ключ строки

Способ 1

Способ 2

Номер строки

Не применимо

Способ 3

Описание способов считывания данных динамическим списком см. здесь.

7.3.1.5. Настройки динамического списка

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

Рис. 222. Условное оформление динамического списка

Во время настройки динамического списка в конфигурации разработчик прикладного решения имеет возможность сделать следующее:

● задать поля, по которым необходимо проводить упорядочивание;

● описать отбор данных в списке;

● указать настройки условного оформления;

● задать поля, по которым необходимо группировать данные.

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

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

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

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

ПользовательскиеНастройки ‑ это настройки, которые изменяет пользователь в режиме «1С:Предприятие»;

ФиксированныеНастройки ‑ эти настройки задаются из встроенного языка. Также в это свойство попадают значения отбора, которые передаются в форму с помощью ее параметров. Свойства динамического списка Отбор, Параметры, УсловноеОформление предоставляют быстрый доступ к фиксированным настройкам компоновщика настроек динамического списка. Другими словами, данные обращения являются эквивалентными: Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор и Список.Отбор.

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

● Если какой-либо вид настроек целиком отмечен как пользовательский, то в результирующие настройки попадают пользовательские настройки (Список.КомпоновщикНастроек.ПользовательскиеНастройки). При этом если какие-либо элементы настроек отмечены как недоступные, то эти настройки будет помещены в результирующие настройки из свойства Список.КомпоновщикНастроек.Настройки.

● Если какой-либо вид настроек отмечен как пользовательский не целиком, а поэлементно, то:

● Элементы, отмеченные как пользовательские, попадут в результирующие настройки из свойства Список.КомпоновщикНастроек.ПользовательскиеНастройки.

● Элементы, отмеченные как недоступные, попадут в результирующие настройки из свойства Список.КомпоновщикНастроек.Настройки.

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

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

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

Рис. 223. Управление включением в пользовательские настройки

Флажок в нижней части окна (см. рис. 223) отвечает за размещение в настройках (обычных или быстрых) всего вида настроек. Эта возможность доступна для отбора, порядка, группировки и условного оформления. Если настройки указаны с режимом редактирования Быстрый выбор, то в свойстве Группа пользовательских настроек таблицы формы, отображающей динамический список, необходимо указать пустую группу формы, в которой будут располагаться элементы, связанные с быстрыми пользовательскими настройками динамического списка. Если группа не указана ‑ быстрые пользовательские настройки не будут отображены на форме. Также имеется возможность явно вызвать создание пользовательских настроек с помощью встроенного языка с помощью метода СоздатьЭлементыФормыПользовательскихНастроек() расширения динамического списка.

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

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

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

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

7.3.1.6. Поиск в динамическом списке

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

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

Рассмотрим особенности использования поиска в динамическом списке:

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

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

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

● Поиск выполняется не по всем колонкам динамического списка (и объекта конфигурации), а только по тем колонкам, которые отображаются в таблице.

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

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

● В том случае, если для поля основной таблицы динамического списка используется отбор с видом сравнения Равно, то при выполнении полнотекстового поиска к поисковому запросу по этой таблице будет добавлено значение отбора.

● Строка поиска разбивается на слова. Строка поиска не должна быть длиннее 1 000 символов, а количество слов, полученных при разбиении, не должно быть больше 32. Разбиение выполняется по следующим правилам:

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

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

● Для каждого слова формируется свой набор условий, которые объединяются «по ИЛИ». Этот набор условий формируется в том случае, если полнотекстовый поиск данного слова в таблице, из которой было получено данное поле, вернул хотя бы один объект или полнотекстовый поиск не использовался для этого поля. Условия формируются следующим образом:

● Для поля типа Строка условие имеет вид ИмяПоля ПОДОБНО %Слово%.

● Для поля типа Число условие имеет вид ИмяПоля=Значение, где Значение ‑ это слово, которое приведено к типу Число. Если приведение выполнить невозможно ‑ поиск по полю выполняться не будет.

● Слово ищется как подстрока в представлении по умолчанию для типа Булево, определенное для текущего сеанса. Если искомое слово обнаружено в представлении, то в дальнейшем выполняется поиск значения, соответствующего представлению, в котором обнаружено слово. При этом для поиска не используются представления, которые заданы с помощью свойства элемента формы Формат.

● Для поля типа Дата условие имеет вид ИмяПоля>= НачалоДня(Слово) И ИмяПоля<=КонецДня(Слово). Если Слово подобно дате, в которой год указан одной или двумя цифрами, год будет приведен к текущему веку и уже это значение будет подсталяться в поисковое условие.

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

Набор условий для каждого слова объединяются «по И».

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

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

● Команда поиска по текущему значению не доступна в том случае, если основной таблицей динамического списка является критерий отбора.

● Найденные фрагменты строк выделяются при отображении в таблице.

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

● Если на форме отсутствует дополнение элемента формы вида Отображение строки поиска, связанное с таблицей (свойство Источник дополнения элемента формы), отображающей динамический список, то нажатие сочетания клавиш Ctrl + F приводит к открытию диалога поиска.

Рис. 224. Диалог поиска

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

● При использовании диалога поиска нужно помнить о следующих особенностях:

● Открытие диалога поиска по сочетанию клавиш приводит к тому, что значение текущей ячейки оказывается в строке Что искать, а значение переключателя Как искать устанавливается в значение По точному совпадению.

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

7.3.1.7. Получение данных, отображаемых динамическим списком

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

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

Пример получения данных:

Копировать в буфер обмена
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Возврат ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

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

● Не поддерживается следующее оформление таблицы:

● Чередование цветов строк;

● Картинка шапки;

● Картинка подвала;

● Цвет фона подвала;

● Цвет текста подвала;

● Шрифт подвала;

● Горизонтальное положение в подвале;

● Режим пароля.

● Не поддерживается условное оформление, указанное для управляемой формы;

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

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

7.3.1.8. Дополнительная обработка данных, получаемых динамическим списком

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

Данное событие вызывается после получения данных динамическим списком. Событие вызывается в том случае, если динамическим списком получена хотя бы одна строка.

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

Обработчик ПриПолученииДанныхНаСервере получает три параметра:

ИмяЭлемента ‑ содержит имя таблицы, для которой выполняется данный обработчик.

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

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

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

Рис. 225. Цена по категории

Динамический список расположен в реквизите Список, отображается таблицей Список (элемент формы). Вид цены настраивается с помощью реквизита ВидЦен типа СправочникСсылка.ВидыЦен.

Примечание. Примеры, приведенные ниже, не являются законченным. Они предназначены для демонстрации различных механизмов работы с динамическим списком.

Собственно запрос динамического списка очень простой:

Копировать в буфер обмена
ВЫБРАТЬ
    СправочникТовары.Ссылка,
    СправочникТовары.ПометкаУдаления,
    СправочникТовары.Родитель,
    СправочникТовары.ЭтоГруппа,
    СправочникТовары.Код,
    СправочникТовары.Наименование,
    СправочникТовары.Артикул,
    СправочникТовары.Поставщик,
    СправочникТовары.Вид,
    СправочникТовары.Описание,
    СправочникТовары.Предопределенный,
    ВЫРАЗИТЬ (NULL КАК Число(10, 2)) КАК Цена
ИЗ
    Справочник.Товары КАК СправочникТовары

Этот запрос отображает сам справочник товаров и «готовит место» для размещения цены товаров (колонка Цена). Остальные действия выполняются в обработчике события ПриПолученииДанныхНаСервере:

Копировать в буфер обмена
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    Если Настройки.ДополнительныеСвойства.Свойство("ВидЦен") Тогда
   ВидЦен = Настройки.ДополнительныеСвойства.ВидЦен;
    КонецЕсли;
    Если Не ЗначениеЗаполнено(ВидЦен) Тогда
   Возврат;
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст =
   "ВЫБРАТЬ
   |    Цены.Товар,
   |    Цены.Цена
   |ИЗ
   |    РегистрСведений.ЦеныТоваров.СрезПоследних(Товар В (&Товары) И ВидЦен = &ВидЦен) КАК Цены";
    Запрос.УстановитьПараметр("Товары", Строки.ПолучитьКлючи());
    Запрос.УстановитьПараметр("ВидЦен", ВидЦен);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
   СтрокаСписка = Строки[Выборка.Товар];
   СтрокаСписка.Данные["Цена"] = Выборка.Цена;
   СтрокаСписка.Оформление["Цена"].УстановитьЗначениеПараметра("Формат", "ЧЦ=10; ЧДЦ=2; ЧН= ");
    КонецЦикла;
КонецПроцедуры

При рассмотрении текста обработчика следует обратить внимание на следующие моменты:

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

Копировать в буфер обмена
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ВидЦен", ВидЦен);
Элементы.Список.Обновить();

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

3. Данные, расположенные в Строки.Данные, представляют из себя в точности тот набор данных, который будет передан клиентскому приложению для отображения таблицей управляемой формы, которая связана с динамическим списком. Эта передача будет выполнена после завершения обработчика.

4. Работа с оформлением ячеек динамического списка (Строки.Оформление) не отличается от работы с оформлением ячеек системы компоновки данных.

Если в обработчике события ПриПолученииДанныхНаСервере изменяются данные строк, то рекомендуется исключать поля, в которых изменяются данные, из списков полей, используемых для группировки, упорядочивания и отбора. Если этого не сделать, группировка, упорядочивание и отбор (включая все виды поиска) будет работать неожиданно для пользователя. Причиной такого поведение является то, что все указанные операции выполняются по тем данным, которые непосредственно вернет запрос формирования динамического списка. Результат работы обработчика ПриПолученииДанныхНаСервере не используется для этих операций. Для установки ограничения на использование поля в той или иной операции предназначены методы динамического списка УстановитьОграниченияИспользованияВГруппировке(), УстановитьОграниченияИспользованияВПорядке() и УстановитьОграниченияИспользованияВОтборе(). Методы ПолучитьОграниченияИспользования…() (для реквизита типа ДинамическийСписок) возвращают текущий список полей, недоступных для выполнения той или иной операции, при условии, что список ограничений задан методами УстановитьОграниченияИспользования…().

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

7.3.2. Форматированный документ

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

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

В информационной базе форматированный документ рекомендуется хранить в реквизите типа ХранилищеЗначения, в который помещается объект типа ФорматированныйДокумент.

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

● Создать реквизит формы типа ФорматированныйДокумент и установить для него свойство Сохраняемые данные.

● Создать элемент формы типа Поле ввода вида Поле форматированного документа и связать его с ранее созданным реквизитом.

● При чтении данных формы (обработчик ПриЧтенииНаСервере()) загрузить в реквизит формы документ (метод УстановитьHTML()), который необходимо редактировать, предварительно получив его из информационной базы.

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

В процессе работы с документом можно использовать закладки. Закладка описывает положение некоторого символа в документе. При определении положения нужно учитывать следующие особенности:

● содержимое документа считается одной последовательностью символов;

● перенос строки считается одним символом;

● картинка считается одним символом.

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

С помощью закладок можно получать и устанавливать выделение или позицию курсора в редакторе, добавлять и удалять элементы текста в документе (собственно текст, картинка, перевод строки).

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

Приведем пример получения и установки выделения в редакторе форматированного документа.

Копировать в буфер обмена
// Содержимое - реквизит формы типа ФорматированныйДокумент
// Редактор - элемент формы типа Поле форматированного документа
// Начало - реквизит формы типа Число. Указывает позицию начала выделения.
// Окончание - реквизит формы типа Число. Указывает позицию окончания выделения.
&НаКлиенте
Процедура ПолучитьВыделение()
    ПозицияНачала = 0;
    ПозицияОкончания = 0;
    Элементы.Редактор.ПолучитьГраницыВыделения(ПозицияНачала,ПозицияОкончания);
    Начало = Содержимое.ПолучитьПозициюПоЗакладке(ПозицияНачала);
    Окончание = Содержимое.ПолучитьПозициюПоЗакладке(ПозицияОкончания);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВыделение()
    ПозицияНачала = Содержимое.ПолучитьЗакладкуПоПозиции(Начало);
    ПозицияОкончания = Содержимое.ПолучитьЗакладкуПоПозиции(Окончание);
    Элементы.Редактор.УстановитьГраницыВыделения(ПозицияНачала,ПозицияОкончания);
КонецПроцедуры

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

Копировать в буфер обмена
Процедура ВставитьСтрокуВТекущуюПозицию(Редактор, Содержимое, Строка)
    Перем Начало, Конец;
    Редактор.ПолучитьГраницыВыделения(Начало, Конец);
    Позиция = Содержимое.ПолучитьПозициюПоЗакладке(Начало);
    Содержимое.Удалить(Начало, Конец);
    Начало = Содержимое.ПолучитьЗакладкуПоПозиции(Позиция);
    Содержимое.Вставить(Начало, Строка);
    Закладка = Содержимое.ПолучитьЗакладкуПоПозиции(Позиция + СтрДлина(Строка));
    Редактор.УстановитьГраницыВыделения(Закладка, Закладка);
КонецПроцедуры

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

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

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

Пример:

Копировать в буфер обмена
Для каждого Параграф Из Документ.Элементы Цикл
    Если Параграф.ТипПараграфа = ТипПараграфа.Обычный Тогда
   ОбработатьОбычныйПараграф(Параграф);
    ИначеЕсли Параграф.ТипПараграфа = ТипПараграфа.МаркированныйСписок Тогда
   ОбработатьСписок(Параграф);
    ИначеЕсли Параграф.ТипПараграфа = ТипПараграфа.НумерованныйСписок Тогда
   ОбработатьСписок(Параграф);
    Иначе
   Продолжить;
    КонецЕсли;
КонецЦикла;

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

Пример:

Копировать в буфер обмена
Полужирный = Новый Шрифт(, , Истина);
Курсив = Новый Шрифт(, , , Истина);
Обычный = Новый Шрифт;
Для каждого Элемент Из Параграф.Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ПереводСтрокиФорматированногоДокумента") Тогда
   Продолжить;
    КонецЕсли;
    Если Элемент.Шрифт = Полужирный Или Элемент.Шрифт = Курсив Тогда
    Элемент.Шрифт = Обычный;
   КонецЕсли;
КонецЦикла;

При программной работе с текстом также могут помочь методы ПолучитьЭлементы() и СформироватьЭлементы(). Эти методы возвращают массив элементов форматированного документа. Чтобы увидеть разницу в работе этих методов, рассмотрим пример форматированного документа, содержащего следующую строку: 012 456 890. Строка состоит из 11 символов, где на месте символов 4 и 8 расположены пробелы. Необходимо получить элементы, которые расположены между позициями 2 и 9 этого документа.

Копировать в буфер обмена
ПозицияНачала = Документ.ПолучитьЗакладкуПоПозиции(2);
ПозицияОкончания = Документ.ПолучитьЗакладкуПоПозиции(9);
Результат = Документ.ПолучитьЭлементы(ПозицияНачала, ПозицияОкончания);
Для каждого Элемент Из Результат Цикл
    Сообщить("Текст - " + Элемент.Текст);
КонецЦикла;
Результат = Документ.СформироватьЭлементы(ПозицияНачала, ПозицияОкончания);
Для каждого Элемент Из Результат Цикл
    Сообщить("Текст - " + Элемент.Текст);
КонецЦикла;

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

Копировать в буфер обмена
Текст - 012 456 890

А при работе метода СформироватьЭлементы() вывод будет следующий:

Копировать в буфер обмена
Текст - 2 456 8

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

Нужно помнить, что метод СформироватьЭлементы() изменяет форматированный документ во время своего вызова и если (в рассматриваемом примере) после вызова метода СформироватьЭлементы() снова вызвать метод ПолучитьЭлементы(), то результат работы будет такой:

Копировать в буфер обмена
Текст - 2 456 8

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

7.3.3. Планировщик

7.3.3.1. Общая информация

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

Общая схема работы выглядит следующим образом:

● Из информационной базы получаются данные, которые следует отобразить.

● Эти данные (в виде элементов) отображаются в планировщике.

● Пользователь редактирует элементы.

● Данные измененных элементов актуализируются в информационной базе.

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

7.3.3.2. Устройство планировщика

7.3.3.2.1. Измерения
Общая информация

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

Копировать в буфер обмена
ИзмерениеЗал = Планировщик.Измерения.Добавить("Зал");
ЭлементИзмерения = ИзмерениеЗал.Элементы.Добавить(Перечисления.ВидЗала.Мужской);
ЭлементИзмерения = ИзмерениеЗал.Элементы.Добавить(Перечисления.ВидЗала.Женский);
ИзмерениеМастер = Планировщик.Измерения.Добавить("Мастер");
ЭлементИзмерения = ИзмерениеМастер.Элементы.Добавить("Иванов");
ЭлементИзмерения = ИзмерениеМастер.Элементы.Добавить("Петров");
ЭлементИзмерения = ИзмерениеМастер.Элементы.Добавить("Сидорова");

В этом примере планировщику добавляется два измерения:

Зал ‑ описывает тип зала некоторой парикмахерской. Для определения типа зала служит перечисление ВидЗала с двумя значениями: Мужской и Женский.

Мастер ‑ фамилия мастера, работающего в том или ином зале. Типом значения будет являться строка с фамилией мастера.

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

Рис. 226. Два измерения

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

Рис. 227. Измененный порядок измерений

Ширина и высота колонок/строк

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

Рис. 228. Сильное сжатие элемента формы

Очевидно, что использование планировщика, показанного на рис. 228, несколько неудобно.

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

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

Минимальная ширина колонки ‑ если выключить флажок Авто минимальная ширина колонки, то станет доступно ручное указание минимальной ширины колонки планировщика. Значение 0 означает, что колонка будет сжиматься до сохранения технической возможности.

Авто минимальная высота строки и Минимальная высота строки управляют высотой строк поля планировщика. Поведение аналогично свойствам управления шириной колонки.

Если колонка (или строка) достигает заданного (вручную или автоматически) минимального размера, дальнейшее сжатие прекращается, и у поля планировщика появляются полосы прокрутки.

Так, если для примера, показанного на рис. 228, установить свойства Авто минимальная ширина колонки и Авто минимальная высота строки, то минимальный размер поля планировщика будет следующим:

Рис. 229. Автоматическое определение минимального размера

Дальнейшее уменьшение высоты или ширины поля планировщика приведет к появлению полосы прокрутки по соответствующей координате.

Фиксация заголовков планировщика

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

● Возможность фиксации заголовков измерений управляется с помощью свойства планировщика Фиксировать заголовок измерений (ФиксироватьЗаголовокИзмерений). Значение Авто интерпретируется как Да во всех видах клиентских приложений.

● Возможность фиксации заголовка шкалы времени управляется с помощью свойства Фиксировать заголовок шкалы времени (ФиксироватьЗаголовокШкалыВремени). Значение Авто интерпретируется как Да во всех видах клиентских приложений.

При работе веб-клиента под управлением Microsoft Internet Explorer оба описанных свойства всегда интерпретируется как Нет, вне зависимости от фактического значения.

7.3.3.2.2. Элементы

На «пересечении» измерений и шкалы времени находится элемент. Элемент имеет следующие основные характеристики:

● Описание элемента.

● Дата и время начала и окончания действия или события, описываемого элементом.

● Значения всех измерений, заданных для данного экземпляра планировщика.

● Значение элемента.

● Параметры повторения элемента (для повторяющихся элементов).

В простейшем случае элемент создается следующим образом:

Копировать в буфер обмена
Элемент = Планировщик.Элементы.Добавить(Дата('20140606150000'), Дата('20140606154000'));
Элемент.Текст = "Постричь Василия";
Измерения = Новый Соответствие;
Измерения.Вставить("Зал", Перечисления.ВидЗала.Мужской);
Измерения.Вставить("Мастер", "Иванов");
Элемент.ЗначенияИзмерений = Новый ФиксированноеСоответствие(Измерения);

В данном примере создается элемент, который описывает событие, начинающееся 6 июня 2014 года в 15:00 и заканчивающееся в тот же день в 15:40. Событие будет происходить в мужском зале (значение измерения Зал установлено в значение Мужской) и мастером будет Иванов (значение измерения Мастер установлено в значение Иванов).

В результате элемент на форме будет отображаться следующим образом:

Рис. 230. Элемент в планировщике

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

Одним из вариантов такого уникального идентификатора является следующее:

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

● Ссылка на элемент справочника События помещается в свойство Значение создаваемого элемента.

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

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

7.3.3.2.3. Шкала времени
Размещение шкалы времени

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

Рис. 231. Горизонтальная шкала времени

Поведение элементов при недостатке места

В одной ячейке планировщика (пересечение измерений и шкалы времени) могу располагаться несколько элементов. На рис. 231 показано расположение одного элемента в ячейке. На рис. 232 показан планировщик, в ячейке которого (12 марта 2014 года, мужской зал, мастер Иванов, интервал времени с 15 до 16 часов) размещено 4 элемента.

Рис. 232. Несколько элементов в ячейке

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

Рис. 233. Несколько элементов в ячейке. Не хватает места

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

Для решения этой проблемы предназначено свойство реквизита формы Поведение элементов при недостатке места (ПоведениеЭлементовПриНедостаткеМеста). Поведение, которое отображено на рис. 233, будет наблюдаться если свойство установлено в значение Сворачивать элементы. Если свойство Поведение элементов при недостатке места установить в значение Отображать все элементы, то при уменьшении размера планировщика внешний вид будет несколько другим.

Рис. 234. Несколько элементов в ячейке. Разная высота

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

Настройка шкалы времени

Кроме изменения положения, шкалу времени можно различным образом настраивать. Первым вариантом настройки является возможность задать, в каких единицах будет измеряться шкала времени, и сколько таких единиц будет помещаться на шкале перед тем, как произойдет перенос в следующую колонку (или строку). Например, можно установить, что шкала времени будет измеряться в часах и в одной колонке (строке) будет помещаться 6 часов. В этом случае отображение в планировщике одного дня будет состоять из 4 колонок (строк), в зависимости от режима отображения шкалы времени: в сутках 24 часа и 6 часов в одной колонке (строке).

При отображении шкалы времени сверху, изображение будет выглядеть следующим образом:

Рис. 235. Кратность шкалы времени

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

Копировать в буфер обмена
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта = 6;
Планировщик.ШкалаВремени.Положение = ПоложениеШкалыВремени.Верх;

Если заголовки с отметкой часа не нужны над каждым 6-ти часовым фрагментом, то такие перенесенные заголовки можно отключить, присвоив свойству Планировщик.ОтображатьПеренесенныеЗаголовкиШкалыВремени значение Ложь.

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

Рис. 236. Граница двух периодов

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

Копировать в буфер обмена
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;

В результате граница двух «соседних» дней станет более заметной:

Рис. 237. Разделение двух периодов

В данном примере можно сделать два улучшения: перенести дату перед временем и сменить формат отображения даты:

Копировать в буфер обмена
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;
ЭлементШкалыВремени.Формат = "Л=; ДЛФ=DD";
Планировщик.ШкалаВремени.Элементы.Сдвинуть(ЭлементШкалыВремени,  1);

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

Рис. 238. Изменен порядок шкал и формат представления

Также следует помнить, что из коллекции ШкалаВремени невозможно удалить элемент, если он единственный. Следовательно, вначале необходимо добавить новую шкалу времени, и лишь затем можно удалить автоматически добавленную шкалу времени.

7.3.3.2.4. Периоды отображения

Планировщик может отображать различные периоды времени. Период времени может быть один или несколько, периоды могут иметь произвольную длительность. Для установки периодов отображения служит коллекция Планировщик.ТекущиеПериодыОтображения. Периоды отображения следует задавать с учетом времени. Если задать период с помощью конструкции Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140601'), Дата('20140601'));, то будет отображена первая секунда 1 июня 2014 года. Для того чтобы день окончания периода отображался целиком, следует использовать функцию КонецДня() или явным образом указывать время окончания периода.

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

● 1 июня ‑ 5 июня;

● 10 июня ‑ 19 июня;

● 21 июня ‑ 23 июня.

Планировщик настраивается следующим образом:

Копировать в буфер обмена
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
Планировщик.КратностьПериодическогоВарианта = 7;
Планировщик.ТекущиеПериодыОтображения.Очистить();
Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140601'), КонецДня(Дата('20140605')));
Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140610'), КонецДня(Дата('20140619')));
Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140621'), КонецДня(Дата('20140623')));
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;
ЭлементШкалыВремени.Формат = "Л=; ДЛФ=DD";
Планировщик.ШкалаВремени.Элементы.Удалить(Планировщик.ШкалаВремени.Элементы[0]);

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

Рис. 239. Перенос шкалы времени с дискретными интервалами

На рис. 239 видно, что первые 7 дней целиком включили первый интервал (5 дней, с 1 июня по 6 июня) и 2 дня от второго интервала. Вторые 7 дней включили 7 дней второго интервала и третьи 7 дней включили остаток второго интервала и целиком третий интервал.

Еще одним способом задания отображения прерывистых интервалов служит задание свойств ОтступСНачалаПереносаШкалыВремени и ОтступСКонцаПереносаШкалыВремени. Данные свойства задаются в размерности свойства ЕдиницаПериодическогоВарианта. Другими словами, если единицей периодического варианта является день, то и отступ с начала или конца шкалы времени будет вычисляться в днях. Например, необходимо отобразить в планировщике июнь 2014 года таким образом, чтобы в каждом 7-дневном интервале отображались только первые 5 (или менее) дней. Для этого используется следующий код настройки планировщика (в примере не будет использоваться измерение Мастер из предыдущих примеров):

Копировать в буфер обмена
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
Планировщик.КратностьПериодическогоВарианта = 7;
Планировщик.ТекущиеПериодыОтображения.Очистить();
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоМесяца('20140601'), КонецМесяца('20140601'));
Планировщик.ОтступСКонцаПереносаШкалыВремени = 2;
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;
ЭлементШкалыВремени.Формат = "Л=; ДЛФ=DD";
Планировщик.ШкалаВремени.Элементы.Удалить(Планировщик.ШкалаВремени.Элементы[0]);

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

Рис. 240. Отступ с конца переноса шкалы времени

В данном случае весь июнь разбивается на следующие периоды:

1. 1 июня ‑ 7 июня;

2. 8 июня ‑ 14 июня;

3. 15 июня ‑ 21 июня;

4. 22 июня ‑ 28 июня;

5. 29 июня ‑ 30 июня.

Затем из каждого интервала будет удалено то количество дней (с начала и конца интервала), которые заданы в свойствах ОтступСНачалаПереносаШкалыВремени и ОтступСКонцаПереносаШкалыВремени (соответственно) и получившиеся интервалы будут отображены. Последний интервал поглощается отступом целиком, но начало интервала все равно будет отображено (по аналогии с поведением при задании текущих периодов отображения).

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

7.3.3.2.5. Переопределение форм редактирования элементов

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

ПередСозданием ‑ в данном событии можно переопределить форму, которая будет использоваться при создании нового элемента. По умолчанию используется форма быстрого редактирования элемента. Надо иметь ввиду, что параметры Начало, Конец, ЗначенияИзмерений и Текст в обработчике события ПередСозданием поля планировщика являются возвращаемыми, т. е. разработчик может сразу указать, какие значения будут подставлены в форму создания нового элемента. Эта возможность может потребоваться, если, например, элементы могут создаваться не чаще, чем один элемент в 15 минут.

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

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

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

● В контекстном меню элемента выбрана команда Редактировать;

● На элементе, отображаемом в планировщике, выполнен двойной щелчок мыши.

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

Собственно переопределение формы выполняется следующим образом:

1. В обработчике нужного события открывается требуемая форма;

2. Параметр используемого обработчика СтандартнаяОбработка устанавливается в значение Ложь.

7.3.3.2.6. Формирование контекстного меню

При нажатии кнопки мыши в поле планировщика, можно определить, какое действие будет выполняться по умолчанию и какое меню будет показываться, если действие по умолчанию не задано или сразу нажата правая кнопка мыши. Для выполнения указанных действия предназначен обработчик события ОбработкаФормированияКоманд поля планировщика.

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

ПараметрыКоманд ‑ содержит набор значений, описывающих, где выполнено нажатие кнопки мыши.

Команды ‑ массив, который (после выхода из обработчика) описывает контекстное меню планировщика для данного нажатия кнопки мыши.

КомандаПоУмолчанию ‑ содержит описание той команды, которая будет выполнена при нажатии левой кнопки мыши в данном месте планировщика.

Рассмотрим подробнее особенности формирования команд планировщика. Для описания команды планировщика предназначен объект ОписаниеКомандыПланировщика. Описание команды создается конструктором объекта. Собственно команда имеет несколько свойств:

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

Неопределено ‑ будет отображаться как разделитель в меню.

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

● Значение системного перечисления СтандартнаяКомандаПланировщика ‑ в этом случае команда описывает выполнение стандартной команды.

● Значение типа ОписаниеОповещения ‑ значение данного типа описывает команду, реализованную на встроенном языке в прикладном решении.

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

Доступность ‑ указывает, будет команда доступна в данном случае или нет.

Картинка ‑ описывает картинку, которая отображается в меню.

Пометка ‑ позволяет установить или снять отметку у команды в контекстном меню.

Таким образом, можно создать совершенно различные команды, которые (в общем случае) позволяют достаточно гибко наполнять контекстное меню планировщика:

Копировать в буфер обмена
// создается разделитель
Разделитель = Новый ОписаниеКомандыПланировщика(Неопределено, "-");
// создается команда, описанная на встроенном языке
УниверсальнаяКоманда = Новый ОписаниеКомандыПланировщика(Новый ОписаниеОповещения("УниверсальнаяКоманда", ЭтаФорма, Параметры.Источник), "Показать источник");
КомандыПодменю = Новый Массив;
// создается стандартная команды
КомандыПодменю.Добавить(Новый ОписаниеКомандыПланировщика(СтандартнаяКомандаПланировщика.СоздатьЭлемент, "Создать"));
КомандыПодменю.Добавить(Новый ОписаниеКомандыПланировщика(СтандартнаяКомандаПланировщика.БыстроРедактироватьЭлемент, "Изменить"));
// создается подменю
Подменю = Новый ОписаниеКомандыПланировщика(КомандыПодменю, "Дполнительные команды");

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

Если при покидании обработчика параметр КомандаПоУмолчанию имеет значение отличное от Неопределено, то эта команда будет вызвана при нажатии левой кнопки мыши в соответственном источнике, при этом обработчик события НажатиеНа… поля планировщика вызван не будет. При вызове обработчика формирования команд, платформа уже указывает для данного параметра какую-то стандартную команду планировщика. Если этот параметр равен значению Неопределено или нажата правая кнопка мыши, то будет открыто контекстное меню, которое описано в параметре обработчика Команды. К обработчикам событий вида НажатиеНа… относятся обработчики следующих событий: НажатиеНаЭлементеИзмерения, НажатиеНаЭлементеШкалыВремени, НажатиеНаПеренесенномЗаголовкеШкалыВремени, НажатиеНаНавигационнойСсылке, НажатиеНаДействиеПланировщика.

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

ИсточникКомандПланировщика.ЭлементИзмерения и обработчик события НажатиеНаЭлементеИзмерения ‑ необходимо установить свойство поля планировщика Гиперссылка элемента шкалы измерения.

ИсточникКомандПланировщика.ЭлементШкалыВремени и обработчик события НажатиеНаЭлементеШкалыВремени ‑ необходимо установить свойство планировщика Гиперссылка элемента шкалы времени.

ИсточникКомандПланировщика.ОбластьПеренесенногоЗаголовкаШкалыВремени и обработчик события НажатиеНаПеренесенномЗаголовкеШкалыВремени ‑ необходимо установить свойство планировщика Гиперссылка перенесенного заголовка шкалы времени.

7.3.3.2.7. Действия элемента

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

Действие описывается с помощью объекта ДействиеЭлементаПланировщика, которое обладает следующими свойствами:

Свойство

Описание

Видимость

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

Доступность

Если свойство установлено в значение Истина, то при нажатии на действие вызывается обработчик события планировщика НажатиеНаДействиеПланировщика.

Значение

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

Картинка и

Текст

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

Подсказка

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

Положение

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

ВКонцеЭлемента ‑ действие отображается в области у правого (нижнего) края элемента планировщика для горизонтального (вертикального) положения шкалы времени соответственно.

ПослеТекста ‑ действие отображается в области сразу после текста:

● Вдоль правой границы элемента ‑ для горизонтального положения шкалы времени.

● Вдоль левой границы элемента ‑ для вертикального положения шкалы времени.

Шрифт и

ЦветТекста

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

Для того чтобы добавить действие к элементу планировщика, следует использовать метод Добавить() коллекции Действия:

Копировать в буфер обмена
ДействиеНазад = ЭлементПланировщика.Действия.Добавить("ДействиеНазад", "", БиблиотекаКартинок.ПредыдущийЭтап);
ДействиеНазад.Положение = ПоложениеДействияЭлементаПланировщика.ВКонцеЭлемента;
ДействиеНазад.Подсказка = "На предыдущий этап";

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

● На поле планировщика.

● В системной форме быстрого редактирования элемента.

● В системной форме обычного редактирования элемента.

Если элемент планировщика формируется следующим кодом на встроенном языке:

Копировать в буфер обмена
Элемент = Планировщик.Элементы.Добавить(Дата('20200610150000'), Дата('20200610154000'));
Элемент.Текст = "Постричь Василия";
Измерения = Новый Соответствие;
Измерения.Вставить("Зал", Перечисления.ВидЗала.Мужской);
Измерения.Вставить("Мастер", "Иванов");
Элемент.ЗначенияИзмерений = Новый ФиксированноеСоответствие(Измерения);
Действие = Элемент.Действия.Добавить("Изменить", "", БиблиотекаКартинок.Изменить);
Действие.Подсказка = "Отредактировать запись клиента";

То действие, указанное для этого элемента, будет отображаться следующим образом:

Рис. 241. Действие элемента

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

7.3.3.2.8. Повторяющиеся элементы

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

Повторяющиеся элементы по-разному представлены в коллекции элементов и при отображении на форме. В коллекции элементов повторяющийся элемент будет представлен в единственном числе и у этого элемента будет заполнено свойство Расписание.

При отображении на форме будут присутствовать все повторяющиеся элементы, однако возможность их перебрать система не предоставляет. В то же время, при попытке отредактировать какой-либо элемент, образующий серию, свойство элемента формы ВыделенныеЭлементы будет содержать коллекцию из элементов планировщика, которые образуют серию для элемента с расписанием. У таких элементов не будет установлено свойство Расписание, но будет заполнено свойство Родитель.

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

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

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

7.3.3.2.9. Перетаскивание и планировщик

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

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

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

Значение

Описание

Выделение

В этом случае пользователь выделяет разные элементы поля планировщика с нажатой клавишей Shift.

Копирование

Пользователь перетаскивает элемент планировщика в другое место поля с нажатой клавишей Ctrl.

Редактирование

Пользователь выполняет редактирование элемента планировщика, например, изменяет границы элемента и меняет его (элемента) местоположение.

Создание

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

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

Свойство

Описание

ЗначенияИзмерений

Соответствие, которое содержит значения измерений планировщика для текущего элемента.

Конец

Содержит информацию о дате и времени окончания элемента планировщика.

Начало

Содержит информацию о дате и времени начала элемента планировщика.

Элемент

Содержит ссылку на редактируемый или копируемый элемент планировщика. В остальных случаях содержит значение Неопределено.

Когда речь идет о свойствах Начало и Конец, то следует помнить о следующих особенностях:

● В случае создания элемента планировщика путем выделения пустой области, эти значения описывают начало и конец области выделения.

● В случае выделения элементов планировщика, эти значения описывают начало и конец области выделения.

● В случае редактирования элемента планировщика путем перетаскивания, эти значения описывают начало и конец редактируемого элемента.

● В случае копирования существующего элемента планировщика, эти значения описывают начало и конец копируемого элемента.

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

Свойство

Описание

Конец

Происходит изменение окончания элемента планировщика. Элемент планировщика увеличивается или уменьшается со стороны окончания элемента.

Начало

Происходит изменение начала элемента планировщика. Элемент планировщика увеличивается или уменьшается со стороны начала элемента.

НачалоИКонец

Происходит изменение положения элемента планировщика.

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

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

● Что выделено пользователем? Для этого служит параметр события ПараметрыПеретаскивания.

● Что делает пользователь? Для этого служат параметры ВариантИзмененияГраницы и ДействиеПеретаскивания.

● Пользователь может завершить действие? Для этого служит параметр Отказ.

7.3.3.3. Общая схема редактирования данных планировщика

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

Общая схема работы выглядит следующим образом:

1. Определяются общие параметры планировщика, количество измерений, настройки шкалы времени и т. д.

2. Определяется текущий период отображения планировщика;

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

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

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

5. При смене периода отображения выполняется создание элементов, которые принадлежат новому периоду отображения.

6. При успешном завершении работы с планировщиком, выполняется синхронизация данных планировщика и справочника, в котором хранятся данные элементов.

7.3.4. Диаграммы

7.3.4.1. Общие сведения

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

Рис. 242. Пример графика

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

Рис. 243. Пример графика c 2 сериями

В приведенном примере Яблоки и Яйца ‑ серии диаграммы, месяцы ‑ точки диаграммы.

Для наглядного отображения данных разного вида используют различные типы диаграмм. Доступны три типа данных для работы с диаграммами:

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

● Диаграмма Ганта (см. здесь). Диаграмма Ганта доступна для размещения в форме и табличном документе.

● Дендрограмма (см. здесь). Дендрограмма доступна для размещения в форме и табличном документе.

Далее каждый из основных видов диаграмм будет рассмотрен более подробно.

На диске ИТС опубликована конфигурация, содержащая примеры построения различных видов диаграмм: https://its.1c.ru/db/metod8dev#content:5952:hdoc. Эта конфигурация также доступна в разделе демонстрационных версий на сайте фирмы «1С»: http://demo.1c.ru/.

7.3.4.2. Интерактивное редактирование свойств диаграмм

7.3.4.2.1. Общая информация

Конфигуратор позволяет редактировать свойства четырех основных областей диаграммы:

1. Всей диаграммы в целом.

2. Область построения диаграммы ‑ та область, где отображается собственно диаграмма.

3. Область заголовка диаграммы ‑ область, где отображается заголовок диаграммы.

4. Область легенды ‑ область, где отображается легенда диаграммы: как называются отображаемые данные и каким образом они отображаются на диаграмме.

Пример расположения областей диаграммы приведен на рис. 266.

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

● В форме:

● Выделить реквизит формы требуемого типа: Диаграмм, ДиаграммаГанта или Дендрограмма.

● Для данного реквизита выбрать команду Перейти.

● В открывшемся диалоге выбрать объект перехода Данные ‑ Тип диаграммы ‑ Настройка.

● В табличном документе:

● Выбрать рисунок необходимого типа (вставка рисунка осуществляется с помощью команд меню Сервис и настройки ‑ Таблица ‑ Рисунки).

● Открыть палитру свойств рисунка.

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

Рис. 244. Выбор области настройки диаграммы

В выпадающем списке перечислены 4 основных области диаграммы, описание которых приведено в начале данного раздела.

7.3.4.2.2. Редактирование свойств диаграммы
Общая информация

Набор свойств, редактируемых для диаграммы в целом, существенно зависит от вида самой диаграммы.

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

Также имеется возможность настроить параметры отображения серий. Эти параметры зависят от вида диаграммы, но имеется три общих параметра:

Отображать графическое представление данных в диаграмме ‑ этот параметр указывает, каким образом выбранная серия будет отображаться в диаграмме:

Отображать ‑ данная серия будет всегда отображаться в диаграмме.

Не отображать ‑ выбранная серия не будет отображаться в диаграмме и не будет участвовать в формировании объединенной серии.

Авто (значение по умолчанию) ‑ выбранная серия отображается в диаграмме, если не включено ограничений по количеству серий.

Отображать в легенде ‑ определяет, каким образом выбранная серия будет отображаться в легенде диаграммы:

Отображать ‑ серия отображается в легенде.

Не отображать ‑ серия не отображается в легенде.

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

Линии тренда ‑ позволяет указать параметры построения линий тренда для серии (подробнее см. здесь).

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

Диаграмма

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

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

Прямой ‑ порядок следования серий в легенде соответствует порядку добавления серий.

Обратный ‑ порядок следования серий в легенде соответствует обратному порядку добавления серий.

Авто (значение по умолчанию) ‑ в этом случае порядок следования серий в легенде зависит от вида диаграммы:

● Обратный порядок используется для следующих диаграмм: гистрограмма горизонтальная, гистрограмма горизонтальная объемная, график с накоплением, график с областями и накоплением, график с областями нормированный, гистограмма с накоплением, гистограмма с накоплением объемная, гистрограмма нормированная, гистрограмма нормированная объемная.

● Прямой порядок используется для остальных диаграмм.

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

Для указания максимального и минимального значения диаграммы предоставляется несколько различных вариантов:

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

Использовать значение ‑ в этом случае конкретные значения максимального/минимального значения задаются значениями в свойстсвах Максимальное значение/Минимальное значение.

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

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

● Если значение свойства Расчет максимального значения диаграммы равно Использовать значение, и значение свойства Расчет минимального значения диаграммы не равно Использовать значение, то при расчёте интервала:

● Минимальное значение рассчитывается по формуле МаксимальноеЗначениe*2–МинимальноеЗначение.

● Минимальное значение корректируется (в меньшую сторону) таким образом, чтоб получить «красивое» деление шкалы.

● Если значение свойства Расчет минимального значения диаграммы равно Использовать значение, и значение свойства Расчет максимального значения диаграммы не равно Использовать значение, то при расчёте интервала:

● Максимальное значение расчитывается по формуле МинимальноеЗначение*2–МаксимальноеЗначениe.

● Максимальное значение корректируется (в меньшую сторону) таким образом, чтоб получить «красивое» деление шкалы.

● Если значение свойства Расчет минимального значения диаграммы равно Использовать значение, и значение свойства Расчет максимального значения диаграммы равно Использовать значение, то при расчёте интервала:

● Маскимальное значение рассчитывается по формуле МинимальноеЗначение*2–МаксимальноеЗначениe.

● Максимальное значение корректируется (в меньшую сторону) таким образом, чтоб получить «красивое» деление шкалы. Следует отметить, что корректировка максимального значения выполняется несмотря на то, что алгоритм расчета максимального значения задан как Использовать значение. Эта коррекция выполняется потому, что заданы некорректные максимальное и минимальное значения.

Если на оси значений откладываются числовые значения, а в качестве максимального/минимального значени указано значение типа Дата, то соответствующее установленное значение игнорируется, и расчёт максимума/минимума выполняется автоматически.

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

Так, если в качестве примера рассмотреть тестовый набор данных (см. здесь), который используется далее в данной главе, то:

● Если свойство Серии в строках установлено, то в качестве серий будут использованы значения из строк 14.03, 15.03, 16.03, 17.03.

● Если свойство Серии в строках сброшено, то в качестве серий будут использованы значения из колонок Оптовые покупатели, Розничные покупатели и Дилеры.

Линии тренда

Линия тренда представляет собой геометрическое отображение средних значений анализируемых показателей, полученное с помощью какой-либо математической функции. Система «1С:Предприятие» предоставляет возможность выполнять построение линий тренда с помощью следующих функций:

● Линейная. Используется уравнение вида y=a*x+b.

● Экспоненциальная. Используется уравнение вида: y=b*e(a*x).

● Логарифмическая. Используется уравнение вида: y=a*ln(x)+b.

● Степенная. Используется уравнение: y=a*xb.

● Полиномиальная. Используется уравнение вида: a0+a1*x+…+aN*(xN), где N больше 2.

ПРИМЕЧАНИЕ. Описание используемых функций и их особенностей выходит за рамки данной документации. Особенности поведения используемых функций и их (функций) параметризацию следует искать в соответствующих учебных материалах.

Редактирование линий тренда осуществляется в специальном диалоге.

Рис. 245. Настройка линий тренда

Для одной серии можно указать более одной линии тренда. Для этого нужно добавить новую линию тренда в данном диалоге. При добавлении указываются:

Тип ‑ какая функция будет использоваться для построения линии тренда. Список функций приведен выше.

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

Фактор ‑ что будет являться значением (фактором) для интерполяции:

Номер точки ‑ фактором будет выступать порядковый номер точки на данной диаграмме (нумерация начинается с 1).

Значение точки ‑ фактором будет являться свойство Значение точки, приведённое к типу Число. Если значениями серии или точек являются даты, и для линии тренда свойство Фактор установлено в Значение точки, то при расчёте тренда, даты переводятся в числа как количество дней (суток), прошедшее с минимальной для данной диаграммы даты. Количество дней может быть дробным.

Авто (значение по умолчанию) ‑ фактором будет выступать либо как номер точки, либо ее значение, в зависимости от значений всех точек.

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

Цвет ‑ определяет цвет линии тренда. Если в качестве цвета указано значение Авто (для этого следует очистить заданное значение кнопкой очистки значения), то цвет линии тренда будет:

● если выводится несколько серий ‑ равен цвету серии, для которой линия тренда была создана (соответственно, при смене цвета серии, изменяется цвет линии тренда);

● если выводится одна серия ‑ чёрный.

Маркер ‑ определяет форму маркера. Маркер отображается только в начале и конце линии тренда.

Линия ‑ определяет стиль линии, которой будет рисоваться линия тренда.

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

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

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

В легенде ‑ будет или нет линия тренда преставлена в легенде диаграммы.

Уравнение ‑ будет или нет отображаться в диаграмме фактическое уравнение интерполяции.

Коэффициент детерминации ‑ управляет отображением коэффициента детерминации. Коэффициент детерминации оценку интерполяционной функции на использованных заданных данных и позволяет оценить адекватность использованной функции для использованных данных.

Информационные линии и интервалы

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

Рис. 246. Информационные интервалы и линии

Для управления выделением для собственно диаграммы предусмотрены следующие свойства:

Информационные интервалы значений (ИнформационныеИнтервалыЗначений), Информационные интервалы точек (ИнформационныеИнтервалыТочек) ‑ позволяют выделить один или несколько интервалов значений по соответствующей оси. Интервал представляет собой прямоугольник определенного цвета, выделяющий определенный интервал значений на соответствующей оси.

Информационные линии значений (ИнформационныеЛинииЗначений), Информационные линии точек (ИнформационныеЛинииТочек) ‑ позволяют создать одну или несколько линий, которые проходят по некоторым характеристическим значениям соответствующей оси.

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

Рис. 247. Информационный интервал

Для интервалов используются следующие свойства (пример приведен на рис. 247):

Начало и Конец ‑ описывают интервал значений или точек. Типы значений и сами значения зависят от используемых данных.

Текст ‑ подпись интервала.

Подсказка ‑ дополнительная информация, возникающая при наведении курсора мыши на интервал.

Область текста ‑ позволяет указать формат отображения подписи интервала.

Цвет и Прозрачность ‑ позволяют задать цвет отображения интервала и его (цвета) прозрачность. Прозрачность задается значением от 0 (полностью непрозрачный) до 100 (полностью прозрачный).

Линия, Цвет линии и Прозрачность линии ‑ позволяют указать, каким образом будет отображаться граница интервала. Прозрачность задается аналогично таковой для цвета отображения интервала.

Начало области отображения и Конец области отображения ‑ позволяют управлять размером области отображения интервала. По умолчанию интервал отображается от соответствующей оси и на всю высоту диаграммы. В примере на рис. 247 отображение интервала по умолчанию ‑ от точки Колбаса (собственно ось значений) до точки Печенье (граница области построения диаграммы). Однако такое отображение не всегда подходит. Тогда с помощью данных свойств можно задать «отступ» от нижней и верхней границы интервала (в процентах). На рисунке видно, что задан отступ в 20% от нижней границы интервала и на 20% от верхней границы интервала.

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

Рис. 248. Информационная линия

Свойства подобны одноименным свойствам свойств информационного интервала. Стоит отдельно остановиться на следующих свойствах:

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

Положение ‑ позволяет указать, где будет проведена линия: непосредственно «по значению» или между предыдущим и текущим значениями.

Подсказки значений

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

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

Отображать при наведении ‑ всплывающая подсказка отображается при непосредственном попадании мышью в значение. Во время движения мыши подсказка не показывается.

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

Не отображать ‑ всплывающая подсказка не отображается.

Авто ‑ в зависимости от вида диаграммы интерпретируется следующим образом:

● Для графиков (обычных, с областями и радарных) и точечных диаграмм интерпретируется как Отображать для ближашего.

● Для остальных типов диаграмм интерпретируется как Отображать при наведении.

Если для диаграммы установлен режим Отображать при наведении, то подсказка (совместно с курсором мыши) будет выглядеть следующим образом:

Рис. 249. Отображать при наведении

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

Рис. 250. Подсказка для ближайшего

Если на графике отображается несколько серий, то может возникнуть потребность отображать в подсказке информацию сразу по всем сериям в выбранной точке. Этой возможность управляет свойство диаграммы Режим заполнения подсказки значений (ЗаполнениеПодсказкиЗначений):

Одно значение ‑ в этом случае всплывающая подсказка отображает то значение, на которое указывает курсор мыши.

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

Авто ‑ интерпретируется как Одно значение.

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

Рис. 251. Все значения точки

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

● Подсказка всегда отображается в режиме Отображать для ближайшего.

● Задержка от момента перемещения курсора мыши до отображения подскази регулируется свойством Отображение подсказки значений.

Еще одной возможность оформления подсказки является возможность задания текста подсказки в виде форматированной строки. Так, если для значения серии Розничные покупатели в точке 16.03 задать представление в виде строки Специальное значение (шрифт курсивом), то в этом случае диаграмма будет выглядеть следующим образом:

Рис. 252. Форматирование подсказки

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

Для установки подсказки предназначено свойство ЗначениеДиаграммы.Подсказка или соответствующие параметры методов установки значений диаграммы.

При выводе подсказки может требоваться выделить все значения точки, на значение которой указывает курсор мыши. Для управления этой возможностью предназначены свойства Отображать всплывающую информационную линию точек (ОтображатьВсплывающуюИнформационнуюЛиниюТочек) и Отображать всплывающую информационную линию значений (ОтображатьВсплывающуюИнформационнуюЛиниюЗначений). Если такое отображение разрешено, то при отображении подсказки будет отображать информационная линия. Пример можно посмотреть на рис. 250. Если отображение информаицонной линии запрещено, то отображение будет соответствовать изображению на рис. 251.

Выделение на диаграмме

Диаграмма предоставляет возможность интерактивно выделять некоторые элементы диаграммы и обрабатывать данное выделение. Что может быть выделено на диаграмме, можно установить с помощью свойства диаграммы Режим выделения (РежимВыделения):

Выделение значений ‑ позволяет интерактивно выделять серии диаграммы и значения диаграммы.

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

Нет ‑ в диаграмме нельзя интерактивно изменять выделение.

Авто ‑ интерпретируется как Выделение значений.

Информацию на диаграмме также можно выделять с помощью щелчка левой кнопкой мыши на нужной серии легенды.

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

Выделение на диаграмме выполняется следующим образом:

● Выделение выполняется:

● по одиночному нажатию левой кнопкой мыши на значении;

● по одиночному нажатию левой кнопкой мыши на серии диаграммы в легенде;

● выделением прямоугольной области в области построения диаграммы.

● Если выделение выполняется с нажатой клавишей Ctrl, то выделяемый объект добавляется к выделению или удаляется из него (если этот объект был ранее добавлен в выделение).

● Если выделение осуществляется без нажатия клавиши Ctrl, то новое выделение становится единственным.

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

● Если на диаграмме ничего не выделено, то диаграмма отображается как обычно.

● Если на диаграмме выделены какие-то данные, то:

● Серии, в которых есть выделенные значения, отображаются цветом, заданным для серии. Выделенные значения отображаются с окантовкой.

● Серии, в которых нет выделенных значений, отображаются более бледным цветом, заданным для серии.

Интерактивное изменение значений диаграммы

При отображении информации с помощью диаграмм, система «1С:Предприятие» предоставляет возможность редактирования отображаемых данных интерактивно, непосредственно на самой диаграмме. Такая возможность может быть полезна в различных сценариях, например при выполнении сценариев «что будет, если» или при планировании чего-либо.

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

1. Свойство диаграммы Режим редактирования значений. Это свойство определяет возможность интерактивного изменения значений диаграммы по умолчанию, для всей диаграммы. Если свойство установлено в значение Авто, то для диаграммы это означает запрет возможности интерактивного изменения (значение интерпретируется как Не использовать).

2. Свойство серии диаграммы Режим редактирования значений. Это свойство определяет возможность редактирования значений конкретной серии. Если значение установлено в значение Авто, то возможность редактирования определяется настройкой диаграммы.

3. Свойство значения диаграммы ЗначениеДиаграммы.СостояниеРедактирования. Разрешает или запрещает редактирование конкретного значения диаграммы. Если это значение установлено в значение РежимРедактированияЗначенийДиаграммы.Авто, то возможность редактирования определяется, последовательно, настройками серии и самой диаграммы.

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

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

● Отобразить на графике продажи за этот год, при этом:

● Фактические продажи за уже прошедшие месяцы также нельзя редактировать.

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

При редактировании значений поможет обработчик события элемента формы ПриРедактированииЗначения. Обработчик вызывается как во время изменения значения, так и после окончания или отмены редактирования значения. Определить, какое действие выполняется в данный момент времени можно с помощью параметра обработчика СостояниеРедактирования:

Завершено ‑ редактирование завершено успешно. Параметр обработчика ЗначениеДиаграммы содержит новое значение.

Отменено ‑ во время редактирования значения нажата кнопка Esc. Параметр обработчика ЗначениеДиаграммы содержит значение, которое было до начала редактирования.

НеЗавершено ‑ пользователь находится в состоянии изменение значения. Параметр обработчика ЗначениеДиаграммы содержит текущее значение.

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

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

● При нажатии на левую кнопку мыши запрашивается блокировка формы (если нужна), и начинается редактирование.

● При перемещении мыши значение текущей точки изменяется на величину, зависящую от текущего масштаба шкалы и расстояния перемещения мыши. В нормированных диаграммах учитывается общая сумма, по которой происходит нормировка.

Во время перемещения мыши формируется событие элемента формы ПриРедактированияЗначения с новым значением и параметром СостояниеРедактирования, равным значению НеЗавершено.

● Во время интерактивного изменения значения выполняется пересчет значений шкал и выполняется перерисовка самой диаграммы.

● Если редактирование отменяется нажатием кнопки Esc, то значение диаграммы устанавливается в то значение, которое было до начала редактирования.

Формируется событие ПриРедактированияЗначения со старым значением и параметром СостояниеРедактирования, равным значению Отменено. Редактирование закончено.

● При успешном завершении редактирования (отпускается левая кнопка мыши) формируется событие ПриРедактированияЗначения с новым значением и параметром СостояниеРедактирования, равным значению Завершено.

● Последним шагом формируется событие элемента формы ПриИзменении, а для формы устанавливается признак Модифицированность.

Дополнительная шкала значений

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

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

1. Для нужной серии (или нескольких серий) указывается необходимость использования дополнительной шкалы.

2. При необходимости настраиваются параметры дополнительной шкалы.

Дополнительную шкалу можно указать для графика (со всеми вариантами) и для гистограммы (со всеми вариантами).

Параметры дополнительной шкалы задаются аналогично свойствам основной шкалы значений. Эти параметры сгруппированы в панели свойств диаграммы в группу Дополнительная ось значений.

В свойствах нужной серии следует установить свойство Используемая шкала значений в значение Дополнительная. На диаграмме появится дополнительная шкала значений. Рассмотрим пример.

Имеются продажи какого-то товара по месяцам (январь, февраль, март). Цена товара 150 рублей, объем продаж 2 500, 6 000 и 6 300 штук соответственно. Нужно отобразить на одной диаграмме оба графика. С использованием одной шкалы этот график будет выглядеть следующим образом:

Рис. 253. Одна шкала

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

Для дополнительной шкалы оставим автоматическое формирование настроек и укажем ее использование для серии Сумма. График стал значительно более информативным:

Рис. 254. Две шкалы

На диаграмме хорошо читаются графики и для количества и для суммы, видны масштабы и значения осей.

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

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

Комбинирование диаграмм

Выводя разные показатели на одну диаграмму, кроме отображения дополнительной шкалы значений (подробнее см. здесь), может потребоваться вывести какие-то показатели другим типом диаграммы. Рассмотрим пример.

Имеется таблица данных с количественными показателями продаж.

Яблоки

Груши

Арбузы

Июнь

50

35

0

Июль

60

40

0

Август

70

37

56

Сентябрь

65

38

70

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

Рис. 255. Оригинальная диаграмма

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

Рис. 256. Модифицированная диаграмма

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

● Выбрать серию Арбузы: в свойстве диаграммы Текущая серия выбрать значение Арбузы.

● Свойство серии Тип графического отображения установить в значение График.

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

Система «1С:Предприятие» не накладывает ограничений на количество серий с типом графика, отличающегося от типа всей диаграммы. Можно изменить тип графика как для одной серии, так и для любого их количества.

Накопление серий

Режим накоплений в диаграмме может настраиваться двумя способами:

1. Указанием «накопительного» типа диаграммы (свойство Тип диаграммы в настройках всей диаграммы). Для такого типа диаграммы в названии будет выражение «с накоплением», например Гистограмма с накоплением или График с накоплением. В этом случае накопление задается сразу для всех серий, отображаемых диаграммой. Специфическая информация по «накопительным» диаграмма приводится в разделе, посвященному различным типам диаграмм (подробнее см. здесь).

2. Индивидуальным указанием режима накопления для серии, отображаемой диаграммой. Индивидуальный режим накопления управляется двумя свойствами: свойством серии Режим накопления и свойством серии Группа накопления. Данный раздел посвящен рассмотрению этих свойств.

Для примера будем рассматривать следующую таблицу с данными:

Яблоки

Груши

Арбузы

Дыни

Июнь

50

35

0

0

Июль

60

40

0

0

Август

70

37

56

70

Сентябрь

65

38

70

90

Отобразим эти данные в виде обычной гистограммы:

Рис. 257. Обычная гистограмма

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

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

Рис. 258. Включили накопления

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

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

Получится диаграмма следующего вида:

Рис. 259. Гистограмма с накоплениями

Теперь для каждой из серий (Яблоки, Груши, Арбузы, Дыни) укажем свойство Группа накопления следующим образом:

● Для серий Яблоки и Груши укажем значение, например, С дерева.

● Для серий Арбузы и Дыни укажем значение, например, С земли.

В результате будет построена следующая диаграмма:

Рис. 260. Включили группы накоплений

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

7.3.4.2.3. Редактирование свойств области построения

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

Каждая из шкал настраивается с помощью редактора шкалы диаграммы.

Рис. 261. Редактор шкалы диаграммы

Более подробно рассмотрим возможности редактора.

Группа Шкала

Свойство Положение шкалы ‑ устанавливает расположение шкалы диаграммы:

Авто ‑ для шкалы значений используется значение Край, для шкалы точек в точечной и пузырьковой диаграммах ‑ значение Край, в остальных случаях ‑ Базовое значение.

Базовое значение ‑ шкала отображается на базовом значении перпендикулярной оси:

● для шкалы точек ‑ на базовом значении оси значений;

● для шкалы значений ‑ на базовом значении оси точек.

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

Свойства Линия шкалы и Цвет линии шкалы ‑ задают вид и цвет линии шкалы. Вид линии можно выбрать во всплывающем списке или настроить в диалоге. Цвет настраивается с помощью диалога выбора цвета.

Свойство Шаг шкалы ‑ позволяет задать значение шага шкалы. Если на шкале откладываются дискретные значения, то значение шага округляется до целого:

● Если шаг шкалы = 1, выводится каждый шаг.

● Если шаг шкалы = 2, выводится каждый второй шаг, и т. д.

● Если установлено значение 0, шаг шкалы рассчитывается автоматически.

Свойство Отметки шкалы позволяет задать положение отметок шкалы диаграммы относительно шкалы:

Снаружи ‑ отметки отображаются с внешней стороны шкалы;

Внутри ‑ отметки отображаются с внутренней стороны шкалы;

По центру ‑ отметки занимают одинаковое расстояние с обеих сторон шкалы;

Нет ‑ отметки шкалы не отображаются;

Авто:

● отметки шкалы отображаются снаружи, если подписи диаграммы отображаются снаружи;

● отметки шкалы отображаются внутри, если подписи отображаются внутри.

Группа Сетка

Свойство Отображение линий сетки позволяет управлять отображением линий сетки:

Отображать ‑ линии сетки отображаются;

Не отображать ‑ линии сетки не отображаются;

Авто:

● линии сетки отображаются для шкал значений и точек в точечной и пузырьковой диаграммах;

● для всех остальных диаграмм линии сетки не отображаются.

Свойства Линия сетки и Цвет линии сетки ‑ задают вид и цвет линий сетки. Вид линии можно выбрать во всплывающем списке или настроить в диалоге. Цвет настраивается с помощью диалога выбора цвета.

Группа Подписи шкалы

Свойство Положение подписей ‑ устанавливает положение подписей к шкале:

Не отображать ‑ подписи шкалы не отображаются.

Внутри ‑ подписи шкалы отображаются с внутренней стороны шкалы;

Снаружи ‑ подписи шкалы отображаются с внешней стороны шкалы;

Авто ‑ интерпретируется как Снаружи.

Свойство Формат подписей позволяет задать форматную строку для преобразования значения шкалы в текст.

Свойства Шрифт подписей и Цвет подписей позволяют указать, каким шрифтом и цветом будут отображаться подписи шкалы.

Свойство Ориентация подписей задает ориентацию подписей шкалы:

Горизонтально ‑ текст отображается горизонтально;

Вертикально ‑ текст отображается вертикально;

Произвольный угол ‑ угол наклона текста задается свойством Угол наклона подписей:

● Положительное значение свойства означает вращение вокруг левого края подписи. 0 градусов ‑ справа, 180 градусов ‑ слева.

● Отрицательное значение свойства означает вращение вокруг правого края подписи. 0 градусов ‑ слева, 180 градусов ‑ справа.

● 0 градусов эквивалентно значению Горизонтально.

● 90 градусов и ‑90 градусов эквивалентны значению Вертикально с разным расположением базовой линии текста.

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

Свойство Максимальное количество рядов подписей позволяет указать максимальное количество рядов, которые будут использоваться для вывода подписей. Если указано значение 0 ‑ количество рядов будет вычислено автоматически.

Группа Заголовок

Свойство Отображение заголовка устанавливает способ отображения заголовка:

Авто ‑ заголовок отображается, если есть текст, который может быть отображен.

Не отображать ‑ заголовок не отображается.

Отображать ‑ заголовок отображается.

Свойство Формирование заголовка ‑ устанавливает способ формирования заголовка шкалы:

Авто ‑ если в свойстве Текст заголовка введен текст, используется установленное значение. В противном случае, текст формируется на основе данных диаграммы.

Использовать текст ‑ используется текст, указанный в свойстве Текст заголовка.

Автотекст ‑ текст формируется на основе данных диаграммы.

Свойство Текст заголовка позволяет явно задать заголовок шкалы.

Свойство Расположение заголовка задает область, в которой будет расположен заголовок:

Рядом с осью ‑ заголовок располагается рядом с осью диаграммы.

В области построения ‑ заголовок располагается в области построения.

В выделенной области ‑ заголовок располагается в выделенной области:

● для горизонтальной оси ‑ снизу;

● для вертикальной оси ‑ слева.

Свойство Область заголовка позволяет настроить область подписи для шкалы диаграммы.

Рис. 262. Настройка области подписи

При настройке области подписи следует учитывать определенные правила расположения области заголовка. Эти правила определяются значениями свойств Расположение заголовка (диалог настройки шкалы диаграммы) и группы свойств Расположение (диалог настройки области заголовка):

● Свойство Расположение заголовка установлено в значение В выделенной области. Значение Тип расположения области настройки заголовка:

● Если ось расположена горизонтально:

Авто, Центр, Свободное место, Край, Край авто или Край внутри ‑ подпись располагается в выделенной области, по центру.

Лево верх или Лево низ ‑ подпись располагается в выделенной области, слева.

Право верх или Право низ ‑ то подпись располагается в выделенной области, справа.

Координаты ‑ подпись располагается в выделенной области, а свойства Верх и Лево указывает смещение внутри выделенной области. При этом 0 ‑ это минимальное значение по соответствующей координате, а 1 ‑ максимальное значение. Таким образом, значение 0,5 является серединой области, выделено для отображения заголовка.

● Если ось расположена вертикально:

Авто, Центр, Свободное место, Край, Край авто или Край внутри ‑ подпись располагается в выделенной области, по центру.

Лево верх или Право верх ‑ подпись располагается в выделенной области, сверху.

Лево низ или Право низ ‑ подпись располагается в выделенной области, снизу.

Координаты ‑ подпись располагается в выделенной области, а свойства Верх и Лево указывает смещение внутри выделенной области. При этом 0 ‑ это минимальное значение по соответствующей координате, а 1 ‑ максимальное значение. Таким образом, значение 0,5 является серединой области, выделено для отображения заголовка.

● Свойство Расположение заголовка установлено в значение В области построения. Значение Тип расположения области настройки заголовка:

Край и Край авто ‑ подпись для вертикальной оси располагается слева области построения, подпись горизонтальной оси располагается сверху области построения.

Край внутри ‑ подпись для вертикальной оси располагается слева области построения, подпись горизонтальной оси располагается снизу области построения.

Центр ‑ подпись располагается по центру области построения.

Авто ‑ аналогично Свободное место.

Верх лево ‑ подпись располагается в верхнем левом углу области построения.

Низ лево ‑ подпись располагается в нижнем левом углу области построения.

Верх право ‑ подпись располагается в верхнем правом углу области построения.

Низ право ‑ подпись располагается в нижнем правом углу области построения.

Координаты ‑ подпись располагается в выделенной области, а свойства Верх и Лево указывает смещение внутри выделенной области. При этом 0 ‑ это минимальное значение по соответствующей координате, а 1 ‑ максимальное значение. Таким образом, значение 0,5 является серединой области, выделено для отображения заголовка.

Свободное место ‑ автоматически ищется подходящее место внутри области построения.

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

● Ось расположена горизонтально: область является прямоугольником, ширина которого равна длине оси, а высота ‑ две высоты подписи.

● Ось расположена вертикально: область является прямоугольником, ширина которого равна двум высотам подписи, а высота ‑ длине оси.

7.3.4.3. Диаграмма

7.3.4.3.1. Общие сведения

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

Рис. 263. Диаграмма на форме

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

Рис. 264. Переход к настройкам диаграммы

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

Рис. 265. Форма настройки

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

1. область построения,

2. область легенды

3. область заголовка.

По умолчанию эти области расположены следующим образом:

Рис. 266. Области диаграммы

Область построения может содержать следующие элементы:

1. шкала точек,

2. шкала серий,

3. шкала значений,

4. таблица данных.

На диаграмме эти элементы могут располагаться следующим образом:

Рис. 267. Элементы диаграммы

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

7.3.4.3.2. Работа с диаграммами средствами встроенного языка
Работа с данными диаграммы

Связь объекта Диаграмма с данными может быть организована двумя способами.

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

Копировать в буфер обмена
Генератор = Новый ГенераторСлучайныхЧисел;
Диаграмма.Очистить();
Диаграмма.Обновление = Ложь;
Серия = Диаграмма.Серии.Добавить("Серия");
Для Сч = 1 По 10 Цикл
    Точка = Диаграмма.Точки.Добавить("Точка № " + Строка(Сч));
    Значение = Генератор.СлучайноеЧисло(1, 10);
    Диаграмма.УстановитьЗначение(Точка, Серия, Значение);
КонецЦикла;
Диаграмма.Обновление = Истина;

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

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

Копировать в буфер обмена
Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    ПродажиОбороты.Период КАК Период,
    |    ПродажиОбороты.СуммаОборот КАК Выручка
    |ИЗ
    |    РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК ПродажиОбороты
    |
    |УПОРЯДОЧИТЬ ПО
    |    Период";
РезультатЗапроса = Запрос.Выполнить();
ТаблицаИсходныхДанных = РезультатЗапроса.Выгрузить();
Диаграмма.СерииВСтроках = Ложь;
Диаграмма.ИсточникДанных = ТаблицаИсходныхДанных;

Если при создании серии или точки задано ее ключевое значение, то впоследствии можно выполнить поиск этой серии и точки. Ключевое значение содержится в свойстве Значение:

Копировать в буфер обмена
Точка.Значение = 1;
Серия.Значение = "Серия1";

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

Копировать в буфер обмена
// Поиск точки
Точка = Диаграмма.УстановитьТочку(4);
// Поиск серии
Серия = Диаграмма.УстановитьСерию("Серия1");
// Определение значения точки диаграммы
Значение = Диаграмма.ПолучитьЗначение(Точка, Серия).Значение;
// Изменение значения точки диаграммы
Диаграмма.УстановитьЗначение(Точка, Серия, Значение + 10);

Методы УстановитьТочку()/УстановитьСерию() создает новую точку (серию) диаграммы, если точка (серия) с указанным ключевым значением не найдена. Для новой серии заполняется свойство Значение. Эту особенность удобно использовать при заполнении диаграммы данными.

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

Копировать в буфер обмена
Пока Выборка.Следующий() Цикл
    Серия = Диаграмма.УстановитьСерию(Выборка.Товар);
    Точка = Диаграмма.УстановитьТочку(Выборка.Период);
    Диаграмма.УстановитьЗначение(Точка, Серия, Выборка.Выручка);
КонецЦикла;

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

1. Удалить серию/точку выходящую из области видимости. Для этого используется метод Удалить() коллекций СерииДиаграммы/ТочкиДиаграммы.

2. Вставить серию/точку входящую в область видимости. Для этого используется методы Вставить()/Добавить() коллекций СерииДиаграммы/ТочкиДиаграммы.

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

Ограничение количества отображаемых серий

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

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

Копировать в буфер обмена
Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено;
Диаграмма.МаксимумСерийКоличество = 3;

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

Рис. 268. Сводная серия

Настройка областей диаграммы

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

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

Например, формат шкалы значений может быть установлен следующим образом:

Копировать в буфер обмена
Диаграмма.ОбластьПостроения.ФорматШкалыЗначений = "ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧГ=3,0";

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

Рис. 269. Свойства области построения

Режим сглаживания

Способ построения соединительной линии графика зависит от значения свойств РежимСглаживания и НатяжениеСглаживания.

По умолчанию значения в области построения диаграммы соединяются прямыми линиями. В режиме сглаживания ГладкаяКривая для соединения значений используются «гладкие кривые».

Рис. 270. Сглаживание

В верхней части рис. 270 изображена диаграмма с отключенным режимом сглаживания, а в нижней ‑ с включенным режимом сглаживания и стандартным натяжением сглаживания.

Линии тренда

Добавить линию тренда к серии можно следующим образом:

Копировать в буфер обмена
Серия = Диаграмма.Серии.Добавить();
ЛинияТренда = Серия.ЛинииТренда.Добавить();
ЛинияТренда.ТипАппроксимации = ТипАппроксимацииЛинииТрендаДиаграммы.Экспоненциальный;
ЛинияТренда.Маркер = ТипМаркераДиаграммы.Нет;

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

Для линии тренда имеется возможность указать следующие параметры:

● Цвет линии тренда (свойство Цвет).

● Необходимость отображения линии тренда в легенде диаграммы (свойство ОтображатьВЛегенде).

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

● Настроить режим отображения уравнения, если оно отображется (свойство ОбластьУравнения) и т. д.

Подробнее о редактировании линий тренда см. здесь.

Настройка полупрозрачности

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

Если в свойстве диаграммы РежимПолупрозрачности задан режим Использовать, то прозрачность диаграммы определяется значением свойства ПроцентПолупрозрачности. Если процент полупрозрачности установлен равным нулю, то используется процент полупрозрачности по умолчанию для данного вида диаграммы.

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

Сохранение цвета серии

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

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

Платформа предоставляет специальный объект ОформлениеЗначений, который хранит соответствие между значением серии и цветом, которым эта серия выводится. Этот объект хранит соответствия для всех типов объектов, которые участвуют в построении диаграмм для текущего пользователя. Другими словами, если в конфигурации строятся диаграммы с использованием складов, контрагентов и товаров ‑ то объект ОформлениеЗначений будет одновременно хранить соответствия для всех упомянутых типов объектов. Для каждого типа значений данный объект хранит не более 100 самых часто используемых объектов (и цветов для них). Т. е. если в прикладном решении используются диаграммы, где серии связаны с товарами, то в настройках будут храниться данные по цветам для 100 (максимум) самых часто используемых в диаграммах товаров. Объект ОформлениеЗначений можно хранить в хранилище значений. Система компоновки данных использует для этого настройку Общее/ЦветаДиаграммы.

Схемы работы выглядит следующим образом:

● Выполняется заполнение диаграммы данными.

● Из хранилища получается соответствие объектов и цветов, например, можно использовать системное хранилище значений: ЦветаСерий = ХранилищеСистемныхНастроек.Загрузить("Общее/ЦветаДиаграммы";.

● Полученное соответствие загружается в диаграмму: Диаграмма.ЗаполнитьЦветаСерий(ЦветаСерий);. Заполнение будет действовать на те цвета серий, для которых указано значение Авто.

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

● Затем рекомендуется выполнить сохранение соответствия цветов обратно в хранилище: ХранилищеСистемныхНастроек.Сохранить("Общее/ЦветаДиаграммы", , ЦветаСерий);. Сохранение после построения диаграммы рекомендуется делать по той причине, что в диаграмме могут участвовать объекты, которые до этого момента не участвовали в построении диаграммы. Следовательно, для нового объекта диаграмма автоматически назначит новый цвет. И это назначение рекомендуется сохранить в хранилище для будущего использования.

Если на форме предусмотрена возможность изменять цвет серии диаграммы, то рекомендуется выполнять это следующим образом:

● Получить соответствие цветов и объектов типа ОформлениеЗначений.

● Установить цвет серии с помощью свойства СерияДиаграммы.Цвет.

● Изменить цвет в соответствии цветов и объектов с помощью метода ОформлениеЗначений.Установить(Объект, Цвет).

● Сохранить соответствие цветов и объектов в хранилище.

Обработка событий

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

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

Копировать в буфер обмена
Серия = Диаграмма.Серии.Добавить();
Серия.Расшифровка = ТаблицаДанныхСтрока.Покупатель;

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

Существует возможность реализовать произвольную «расшифровку» выбранного элемента. Например, показать список всех документов продажи по выбранному покупателю. Для этого событие ОбработкаРасшифровки может быть обработано, например, так:

Копировать в буфер обмена
&НаКлиенте
Процедура ДиаграммаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыФормы = Новый Структура;
    // Передача ссылки на элемент справочника Покупатели
    // в общую форму ДокументыПоПокупателю.
    ПараметрыФормы.Вставить("Покупатель", Расшифровка);
    ОткрытьФорму("ОбщаяФорма.ДокументыПоПокупателю", ПараметрыФормы);
КонецПроцедуры

Аналогично расшифровка может быть задана и обработана для точки или значения диаграммы.

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

Копировать в буфер обмена
&НаКлиенте
Процедура ДиаграммаПриАктивизации(Элемент)
    Данные = Элемент.ПолучитьВыделенныеЭлементы();
КонецПроцедуры

7.3.4.3.3. Особенности построения диаграмм
Отображение точек в диаграммах с накоплением

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

● Диаграммы, поддерживающие базовое значение:

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

● Перед накоплением из текущего значения вычитается базовое значение.

● Получившееся значение накапливается по абсолютному значению в соответствующей сумме (в зависимости от знака).

● Диаграммы, не поддерживающие базовое значение:

● Для каждой точки рассчитываются две суммы: больше и меньше 0.

● Текущее значение накапливается по абсолютному значению в соответствующей сумме (в зависимости от знака).

Для каждой точки отображается два значения диаграммы: накопленная сумма положительных и отрицательных значений (базового значения или значения 0).

Данный расчет применяется для следующих диаграмм:

● Различные типы гистограмм с накоплением;

● График с областями;

● График с областями и накоплениями;

● Радарный график с накоплениями;

● Радарный график с областями и накоплениями.

Пропуск значений в диаграммах

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

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

Как ноль ‑ в этом случае нечисловые значения будут эквивалентны значению 0.

Пропускать ‑ в этом случае нечисловые значения будут пропущены при построении диаграммы.

Авто ‑ нечисловое значение считается эквивалентно значению 0.

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

Не соединять ‑ точки, между которыми есть нечисловые значения, не соединяются.

Соединять ‑ точки, между которыми есть нечисловые значения, соединяются напрямую.

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

Авто ‑ трактуется как Не соединять.

Отображение нечисловых значений имеет ряд особенностей, в зависимости от типа диаграммы:

● Для радарных графиков соединение с базовым значением интерпретируется как соединение с центром графика.

● Для диаграмм-поверхностей алгоритм отрисовки аналогичен описанному выше, но при соединении не пропущенных учитываются 4 соседних точки.

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

● Гистограмма любого вида (без накопления);

● Биржевая диаграмма (любая) ‑ элемент не рисуется, если отсутствует хотя бы одно из 4 используемых значений;

● Изометрическая;

● Измерительная;

● Пузырьковая.

● Для всех нормированных диаграмм и диаграмм с накоплением нечисловое значение интерпретируется как ноль.

7.3.4.3.4. Данные для диаграмм

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

Оптовые покупатели

Розничные покупатели

Дилеры

14.03

6

8

6

15.03

5

9

4

16.03

9

8

6

17.03

5

4

7

В зависимости от типа диаграммы, серии могут располагаться как в строках, так и в столбцах.

Если диаграмма строится на другом наборе данных, этот набор данных приводится непосредственно в том разделе, где демонстрируется диаграмма. Как правило, в диаграммах (в примерах далее) отключается флажок Серии в строках.

7.3.4.3.5. График

График использует способ отображения, при котором соседние значения внутри серии соединяются линией.

Рис. 271. График

7.3.4.3.6. График по шагам

График по шагам отличается от обычного графика тем, что соседние значения соединяются не прямыми линиями, а ступенями.

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

Рис. 272. График по шагам

7.3.4.3.7. График с накоплением

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

Рис. 273. График с накоплением

7.3.4.3.8. График с областями

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

Рис. 274. График с областями

7.3.4.3.9. График с областями и накоплением

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

Рис. 275. График с областями и накоплением

7.3.4.3.10. График с областями нормированный

Нормированный график показывает вклад каждой серии в общую сумму значений в точке. Например, в первой точке значения серий 6, 8 и 6. Общая сумма равна 20, вклад первой серии составит 30%, второй ‑ 40%, третьей ‑ 30%.

Рис. 276. График с областями, нормированный

7.3.4.3.11. Гистограмма, гистограмма объемная, гистограмма горизонтальная, гистограмма горизонтальная объемная

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

Рис. 277. Гистограмма

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

Рис. 278. Разная глубина объемной диаграммы

На рис. 278 изображены две полностью одинаковые гистрограммы, которые отличаются только значением свойства Глубина объемной диаграммы. У верхней диаграмме это свойство установлено в значение 50, а у нижней ‑ в значение 10.

7.3.4.3.12. Гистограмма с накоплением, объемная, горизонтальная, горизонтальная объемная

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

Рис. 279. Гистограмма с накоплением

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

Копировать в буфер обмена
Диаграмма.СоединениеЗначенийПоСериям = ТипСоединенияЗначенийПоСериямДиаграммы.СоединениеКраев;
Диаграмма.ЛинииСоединенияЗначенийПоСериям = Новый Линия(ТипЛинииДиаграммы.Пунктир, 2);
Диаграма.ЦветСоединенияЗначенийПоСериям = WebЦвета.Красный;

В результате получается диаграмма следующего вида:

Рис. 280. Гистограмма с накоплением и соединением краев

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

7.3.4.3.13. Гистограмма нормированная, объемная, горизонтальная, горизонтальная объемная

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

Рис. 281. Гистограмма нормированная

Для нормированных диаграмм доступно соединение значений внутри серии.

7.3.4.3.14. Круговая, круговая объемная

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

Рис. 282. Круговая

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

С помощью свойств Начальный угол и Конечный угол имеется возможность управлять тем, в каком секторе круга будет формироваться диаграмма. Например, если задать свойству Начальный угол значение 90, а свойству Конечный угол ‑ значение 270, то диаграмма будет отображаться в нижней полуплоскости. Данные свойства действуют для круговой и круговой объемной диаграмм.

Рис. 283. Ограничены углы отображения

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

Положение заголовков серий можно задавать с помощью свойства Положение подписей для объекта Диаграмма. На рис. 283 положение подписей указано как Центр.

Для объемной диаграммы имеется возможность с помощью свойства Глубина объемной диаграммы управлять объемной «толщиной» диаграммы.

7.3.4.3.15. Кольцевая, объемная кольцевая

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

Рис. 284. Кольцевая

Имеется возможность управлять внутренним радиусом кольцевой диаграммы с помощью свойства диаграммы ВнутреннийРадиусКольцевойДиаграммы.

Аналогично круговой диаграмме, свойства Начальный угол и Конечный угол позволяют задать сектор полного круга, который будет использоваться для построения диаграммы. Так, на рис. 285, диаграмма строится в сегменте, ограниченном углом в -135 градусов (свойство Начальный угол) и 45 граудсов (свойство Конечный угол).

Рис. 285. Ограничены углы отображения

Свойства Начальный угол и Конечный угол действуют для кольцевой и кольцевой объемной диаграмм.

Из примера на рис. 285 можно сделать один вывод: если свойство Начальный угол больше 0, то начало отображение диаграммы смещается по часовой стрелке от вертикальной оси, а если это свойство меньше нуля ‑ то начало отображения смещается от вертикальной оси против часовой стрелки. Этот вывод действителен и для круговой диаграммы.

Для объемной диаграммы имеется возможность с помощью свойства Глубина объемной диаграммы управлять объемной «толщиной» диаграммы.

7.3.4.3.16. Биржевая, биржевая «свеча»

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

Биржевая диаграмма показывает данные одной серии. При этом значение первой точки используется как начальное значение показателя, значение второй точки ‑ минимальное значение, третьей точки ‑ максимальное, четвертой ‑ значение на конец периода.

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

Рис. 286. Биржевая

Биржевая диаграмма может содержать данные нескольких серий. В таком случае отображаются значения той серии, которая указана в свойстве АктивнаяСерия диаграммы.

7.3.4.3.17. Изометрическая обычная, непрерывная, лента, пирамида, водопад

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

Рис. 287. Изометрическая

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

Для диаграмм вида Изометрическая непрерывная, Изометрическая лента и Водопад допустимо использование свойств РежимСглаживания и НатяжениеСглаживания.

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

7.3.4.3.18. Поверхность, каркасная поверхность, выпуклая поверхность, вогнутая поверхность, затененная поверхность, сотовая

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

Рис. 288. Поверхность

7.3.4.3.19. Радарный график, с областями, с накоплением, с областями и накоплением, с областями нормированный

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

Рис. 289. Радарный

Назначение прочих разновидностей радарного графика аналогично соответствующим случаям с диаграммой типа График.

7.3.4.3.20. Измерительная

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

Использование измерительной панели позволяет наглядно отнести значение показателя к определенной группе.

Рис. 290. Измерительная

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

Копировать в буфер обмена
Полоса = Диаграмма.ПолосыИзмерительнойДиаграммы.Добавить();
Полоса.Начало = 5;
Полоса.Конец = 10;
Полоса.ЦветФона = WebЦвета.Зеленый;
Полоса.Текст = "Хорошо";

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

Рис. 291. Измерительная, секторами

7.3.4.3.21. Воронка, объемная, нормированная, нормированная объемная

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

Для диаграмм Воронка и Воронка объемная значения отображаются шириной сегмента воронки. В диаграммах Воронка нормированная и Воронка нормированная объемная значения отображаются высотой сегмента воронки.

Рис. 292. Воронка продаж

На оформление воронки влияют значения следующих свойств диаграммы: ПробелыВоронки, ВысотаГорлаВоронки и ШиринаГорлаВоронки.

Для диаграмм вида Воронка, и Воронка объемная допустимо использование свойств РежимСглаживания и НатяжениеСглаживания.

7.3.4.3.22. Точечная диаграмма

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

Рис. 293. Точечная диаграмма

Данная диаграмма построена на основании следующего набора данных:

Август

Сентябрь

Октябрь

Ноябрь

Декабрь

Лыжы

90

330

610

1 050

1 380

Лыжные ботинки

40

280

290

830

970

Перчатки лыжные

20

210

610

730

810

Велосипеды

700

540

100

50

20

Какие данные будут откладываться по осям диаграммы, определяется свойством Источник значения оси точек:

Серия ‑ в этом случае в свойстве Серия на оси точек указывается та серия, которая будет откладываться на оси точек.

Точки ‑ в этом случае по оси точек откладываются значения точек.

Авто ‑ в этом случае:

● серия одна ‑ на оси точек откладываются точки.

● серий более одной ‑ поведение аналогично явному указанию значения Серия.

Пример на рис. 293 отображается со следующими настройками:

● Флаг Серии в строках установлен;

● Свойство Источник значения оси точек установлено в значение Точки.

Если несколько изменить настройки диаграммы, а именно:

● Свойство Источник значения оси точек установлено в значение Серия.

● Свойство Серия на оси точек установлено в значение Лыжы.

● Для серии Велосипеды добавлена линия тренда, заданная линейным уравнением.

В результате будет получен следующий график:

Рис. 294. Точечная диаграмма и линия тренда

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

7.3.4.3.23. Пузырьковая диаграмма

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

Рис. 295. Пузырьковая диаграмма

Диаграмма построена на основании следующего набора данных:

Товар

Продажи

Доля рынка

Ботинки

5 500

3

Брюки

12 200

12

Костюм

60 000

33

Пиджак

24 400

10

Рубашка

32 000

42

Аналогично точечной диаграмме, назначение данных на оси диаграммы выполняется с помощью свойства Источник значения оси точек. Логика системы при этом полностью совпадает с таковой для точечной диаграммы.

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

Источник значения размера пузырька ‑ определяет, откуда брать значение, определяющее размер пузырька на диаграмме:

Нет ‑ в этом случае поведение диаграммы полностью эквивалентно точечной диаграмме.

Общая серия ‑ указывается серия, значения которой будут использоваться в качестве размера пузырька. Указание серии выполняется с помощью свойства Общая серия размера пузырька.

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

Отображение отрицательных значений пузырьковой диаграммы ‑ определяет, каким образом диаграмма будет «реагировать» на отрицательные значения в данных:

Нет (значение по умолчанию) ‑ если значение меньше нуля, то пузырек не отображается.

По модулю ‑ все значения учитываются по модулю.

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

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

Влияние размера на пузырек ‑ описывает, каким образом значение, описывающее размер пузырька, будет влиять на размер:

Увеличение/уменьшение диаметра ‑ в этом случае диаметр пузырька будет изменяться прямо/обратно пропорционально значению размера.

Увеличение/уменьшение площади ‑ в этом случае площадь пузырька будет изменяться прямо/обратно пропорционально значению размера.

● В любом случае размер пузырька будет ограничен свойствами Максимальный размер пузырька и Минимальный размер пузырька.

7.3.4.4. Диаграмма Ганта

7.3.4.4.1. Общие сведения

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

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

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

Рис. 296. Общий вид

Диаграмма Ганта отображает данные, которые можно представить следующим образом:

Рис. 297. Структура данных диаграммы Ганта

Диаграмма Ганта позволяет создавать несколько серий (коллекция СерииДиаграммыГанта), каждая серия состоит из нескольких точек (коллекция ТочкиДиаграммыГанта). Если представить точки и серии осями координат на плоскости (ось Точки и Серии на рис. 297), то на пересечение серии (тип СерияДиаграммыГанта) и точки (тип ТочкаДиаграммыГанта) будет находиться значение диаграммы Ганта (тип ЗначениеДиаграммыГанта). На рисунке данное пересечение изображено прямоугольником Значение. Значение диаграммы является коллекцией интервалов (тип ИнтервалДиаграммыГанта). Кроме того, значение диаграммы может содержать набор дополнительных данных (ЗначениеДиаграммыГанта.Данные), структуру которых определяет разработчик прикладного решения в зависимости от решаемых им задач.

Далее в этой главе будут рассмотрены способы работы с диаграммой Ганта.

7.3.4.4.2. Добавление данных

Для управления составом серий и точек используются свойства диаграммы Серии и Точки.

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

Копировать в буфер обмена
// Добавление серии.
СерияПлан = ДиаграммаГанта.Серии.Добавить();
СерияПлан.Текст = "План";
// Добавление точки.
ТочкаСтроительствоОфиса = ДиаграммаГанта.Точки.Добавить();
ТочкаСтроительствоОфиса.Текст = "Строительство офиса";
// Получение значения.
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаСтроительствоОфиса, СерияПлан);
// Добавление интервала.
Интервал = Значение.Добавить();
Интервал.Начало = '20220925';
Интервал.Конец = КонецДня('20221006');

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

Рис. 298. Один интервал

Точки и серии диаграммы Ганта могут образовывать иерархическую структуру. Например:

Копировать в буфер обмена
// Создание точек
ТочкаПланирование = ТочкаСтроительствоОфиса.Точки.Добавить();
ТочкаПланирование.Текст = "Планирование строительства";
ТочкаПланирование.Значение = "planingConstruction";
ТочкаЗакупка = ТочкаСтроительствоОфиса.Точки.Добавить();
ТочкаЗакупка.Текст = "Закупка материалов";
ТочкаЗакупка.Значение = "purchaseMaterials";
ТочкаРасчистка = ТочкаСтроительствоОфиса.Точки.Добавить();
ТочкаРасчистка.Текст = "Очистка территории";
ТочкаРасчистка.Значение = "clearTerritory";
// Создание интервалов
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаПланирование, СерияПлан);
ИнтервалПланированиеПлан = Значение.Добавить();
ИнтервалПланированиеПлан.Начало = '20220925';
ИнтервалПланированиеПлан.Конец = КонецДня('20221001');
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаЗакупка, СерияПлан);
ИнтервалЗакупкаПлан = Значение.Добавить();
ИнтервалЗакупкаПлан.Начало = '20221002';
ИнтервалЗакупкаПлан.Конец = КонецДня('20221004');
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаРасчистка, СерияПлан);
ИнтервалРасчисткаПлан = Значение.Добавить();
ИнтервалРасчисткаПлан.Начало = '20220928';
ИнтервалРасчисткаПлан.Конец = КонецДня('20221006');
// Настройка отображения
Диаграммаганта.РазвернутьТочку(ТочкаСтроительствоОфиса, Истина);

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

Рис. 299. Несколько интервалов

Для заполнения диаграммы Ганта данными удобно использовать методы УстановитьТочку() и УстановитьСерию(). Метод УстановитьТочку() (УстановитьСерию()) возвращает точку (серию) диаграммы, у которой в свойстве Значение содержится значение, которое указано в качестве параметра метода, например, ссылка на элемент справочника. Если точка (серия) с таким ключевым значением не найдена, то создается новая точка (серия) и заполняется свойство Значение. Значением свойства Значение удобно пользоваться для быстрого поиска точки/серии. Этой возможностью мы воспользуемся в другом примере.

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

7.3.4.4.3. Управление отображением диаграммы

Поле диаграммы Ганта отображает по умолчанию саму диаграмму и таблицу данных этой диаграммы. Описание работа с таблицей данных диаграммы Ганта см. здесь.

Диаграмма содержит горизонтальные и вертикальные линии разметки (включая различные метки времени). Для управления отображением этими линиями служат свойства расширения поля формы для диаграммы Ганта:

● Свойство Вертикальные линии (ВертикальныеЛинии). Может принимать следующие значения:

Да (Истина). В этом случае в области построения диаграммы отображаются все вертикальные линии.

Нет (Ложь). В этом случае в области построения диаграммы все вертикальные линии не отображаются.

Авто (Неопределено). В этом случае вертикальные линии:

● Отображаются в области текстов точек и таблицы данных.

● Не отображаются в области значений и интервалов.

● Свойство Горизонтальные линии (ГоризонтальныеЛинии). Может принимать следующие значения:

Да (Истина). В этом случае в области построения диаграммы отображаются все горизонтальные линии.

Нет (Ложь). В этом случае в области построения диаграммы все горизонтальные линии не отображаются.

Авто (Неопределено). В этом случае значение трактуется как Да (Истина).

Текст (значения, точки, интервала), который отображается на диаграмме, может не умещаться в отведенное ему место (по ширине). Имеется возможность задать режим отображения текста с помощью свойства Размещение текста области построения диаграммы Ганта (ОбластьПостроениеДиаграммыГанта.РазмещениеТекста). Это свойство может принимать следующие значения:

Обрезать ‑ текст всегда отображается в одной строке. Если текст не может быть размещен полностью ‑ он усекается по размеру области отображения.

Переносить ‑ текст отображается в нескольких строках, если одной строки не хватает для отображения.

Авто ‑ система сама определяет тип размещения текста. В режиме совместимости с версией 8.3.22 и предшествующими Авто трактуется как Обрезать. В остальных случаях Авто трактуется как Переносить.

7.3.4.4.4. Настройка шкалы времени

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

Копировать в буфер обмена
ДиаграммаГанта.АвтоОпределениеПолногоИнтервала = Ложь;
ДиаграммаГанта.УстановитьПолныйИнтервал('20220924', '20221009');

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

Копировать в буфер обмена
НедельнаяШкала = ДиаграммаГанта.ОбластьПостроения.ШкалаВремени.Элементы.Вставить(0);
НедельнаяШкала.Единица = ТипЕдиницыШкалыВремени.Неделя;
НедельнаяШкала.Кратность = 1;

Диаграмма примет следующий вид:

Рис. 300. Недельная шкала времени

Следует учитывать, что в диаграмме Ганта заголовок элемента уровня шкалы отображается только в начале соответствующего деления. Если начало деления не отображается (оказалось «левее» отображаемого диапазона), то заголовок не будет отображен на диаграмме.

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

Копировать в буфер обмена
Метка = НедельнаяШкала.Метки.Добавить('20221004');
Метка.Текст = "Контроль";
Метка.ЦветЛинии = WebЦвета.Красный;

При этом диаграмма станет выглядеть следующим образом:

Рис. 301. Метка внутри шкалы

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

Копировать в буфер обмена
ФиктивнаяШкала = ДиаграммаГанта.ОбластьПостроения.ШкалаВремени.Элементы.Добавить();
ФиктивнаяШкала.ОтображатьПериодическиеМетки = Ложь;
Метка = ФиктивнаяШкала.Метки.Добавить('20221004');
Метка.Текст = "Контроль";
Метка.ЦветЛинии = WebЦвета.Красный;

Тогда диаграмма примет следующий вид:

Рис. 302. Метка внутри шкалы

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

Копировать в буфер обмена
ИнтервалФона = ДиаграммаГанта.ИнтервалыФона.Добавить('20220924', КонецДня('20220925'));
ИнтервалФона.Цвет = WebЦвета.БледноМиндальный;
ИнтервалФона = ДиаграммаГанта.ИнтервалыФона.Добавить('20220930', КонецДня('20221001'));
ИнтервалФона.Цвет = WebЦвета.БледноМиндальный;

В результате диаграмма станет выглядеть следующим образом:

Рис. 303. Выделенные интервалы

7.3.4.4.5. Интервалы

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

Копировать в буфер обмена
Связь = ИнтервалПланированиеПлан.Добавить(ИнтервалЗакупкаПлан);

В результате диаграмма примет следующий вид:

Рис. 304. Связи интервалов

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

Интервал диаграммы Ганта может содержать какой-либо пояснительный текст. Этот текст получается из свойства ИнтервалДиаграммыГанта.Текст, а если это свойство не задано, то из свойства ИнтервалДиаграммыГанта.Значение.Текст. Для того, чтобы управлять отображением текста интервала, у диаграммы Ганта предназначено свойство Отображение текста интервала (ОтображениеТекстаИнтервала). Свойство может принимать следующие значения:

Отображать ‑ текст на интервале отображается.

НеОтображать ‑ текст на интервале не отображается.

Авто ‑ трактуется как НеОтображать в режиме совместимости с версией 8.3.22 и предыдущих. В остальных случаях трактуется как Отображать.

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

7.3.4.4.6. Интерактивное редактирование диаграммы Ганта

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

В качестве примера добавим к данным диаграммы серию Факт и разрешим редактирование ее значения в точке Расчистка территории:

Копировать в буфер обмена
СерияФакт = ДиаграммаГанта.Серии.Добавить();
СерияФакт.Текст = "Факт";
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаСтроительствоОфиса, СерияФакт);
Интервал = Значение.Добавить();
Интервал.Начало = '20220925';
Интервал.Конец = КонецДня('20221006');
// Разрешено интерактивное редактирование интервалов.
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаРасчистка, СерияФакт);
Значение.Редактирование = Истина;
Интервал = Значение.Добавить();
Интервал.Начало = '20220927';
Интервал.Конец = КонецДня('20221006');

На диаграмме станет доступно редактирование фактического значения:

Рис. 305. Редактируемый интервал

На рис. 305 показано, как будет выглядеть интервал, который редактируется с помощью мыши.

Кроме возможности разрешить редактирование конкретного значения (или значений) диаграммы Ганта, существует возможность управлять возможностью выделения нескольких значений и получать эти значения во встроенном языке. Для этого предназначены следующие свойства расширения поля ввода для диаграммы Ганта:

РежимВыделенияЗначений ‑ позволяет указать, каким образом можно будет выделять значения диаграммы Ганта. Возможны следующие значения:

Нет ‑ выделение запрещено.

Множественный ‑ разрешено выделение нескольких значений в диаграмме.

Одиночный ‑ разрешено выделение только одного значения диаграммы.

Авто ‑ трактуется как Нет в режиме совместимости с версией 8.322 и предшествующих. В остальных случаях трактуется как Множественный.

ТекущееЗначение ‑ содержит идентификатор текущего, выделенного, значения диаграммы Ганта. Для поиска значения, соответствующего идентификатору, элемент формы предоставляет метод НайтиЗначениеПоИдентификатору(). Диаграмма Ганта позволяет установить текущее значение диаграммы путем присваивания нового значения свойству ТекущееЗначение.

ВыделенныеЗначения ‑ массив идентификаторов выделенных значений диаграммы Ганта. Схема работы аналогична текущему значению.

Если у расширения поля формы для диаграммы Ганта включено свойство Положение таблицы (которое позволяет показать таблицу данных непосредственно около самой диаграммы), то между свойствами ТекущаяСтрока и РежимВыделения таблицы формы с данными и свойствами ТекущееЗначение и РежимВыделенияЗначений диаграммы Ганта существует определенная связь:

● Изменение значения свойства ТекущаяСтрока таблицы формы влияет на значение свойства ТекущееЗначение диаграммы Ганта и наоборот.

● Изменение значения свойства РежимВыделения таблицы формы влияет на значение свойства РежимВыделенияЗначений диаграммы Ганта, и наоборот. При этом:

● Установка конкретного режима выделения для таблицы формы приводит к установке аналогичного режима выделения для диаграммы Ганта и наоборот.

● При отключении режима выделения значений в диаграмме Ганта (РежимВыделенияЗначенийДиаграммыГанта.Нет), для таблицы устанавливается режим выделения РежимВыделенияЗначенийДиаграммыГанта.Одиночный.

● При задании свойству РежимВыделенияЗначений диаграммы Ганта значения РежимВыделенияЗначенийДиаграммыГанта.Авто, свойству таблицы формы РежимВыделения в режиме совместимости с версией 8.3.22 и предыдущих автоматически устанавливается значение РежимВыделенияТаблицы.Одиночный. В остальных случаях таблице формы задается режим выделения РежимВыделенияТаблицы.Множественный.

Кроме выделения значений, доступно и выделение интервалов диаграммы Ганта. Для этого предназначены следующие свойства расширения поля ввода для диаграммы Ганта:

РежимВыделенияИнтервалов ‑ позволяет указать, каким образом можно будет выделять интервалы в диаграмме Ганта. Возможны следующие значения:

Нет ‑ выделение запрещено.

Множественный ‑ разрешено выделение нескольких интервалов в диаграмме.

Одиночный ‑ разрешено выделение только одного интервала диаграммы Ганта.

Авто ‑ трактуется как Нет в режиме совместимости с версией 8.322 и предшествующих. В остальных случаях трактуется как Множественный.

ТекущийИнтервал ‑ содержит идентификатор текущего, выделенного, значения диаграммы Ганта. Для поиска значения, соответствующего идентификатору, элемент формы предоставляет метод НайтиИнтервалПоИдентификатору(). Диаграмма Ганта позволяет установить текущее значение диаграммы путем присваивания нового значения свойству ТекущийИнтервал.

ВыделенныеИнтервалы ‑ массив идентификаторов выделенных значений диаграммы Ганта. Схема работы аналогична текущему интервалу.

7.3.4.4.7. Дополнительные данные диаграммы Ганта

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

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

Рис. 306. Добавление колонки данных

На встроенном языке данная последовательность действий будет выглядеть несколько более «многословно»:

Копировать в буфер обмена
// Добавляем колонку данных в реквизиты формы
ТипСтоимости = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Неотрицательный));
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("Стоимость", ТипСтоимости, "ДиаграммаГанта", "Стоимость, руб"));
ИзменитьРеквизиты(НовыеРеквизиты);
// Добавляем колонку в таблицу формы
КолонкаСтоимости = Элементы.Добавить("ДиаграммаГантаТаблицаСтоимость", Тип("ПолеФормы"), Элементы.ДиаграммаГантаТаблица);
КолонкаСтоимости.Вид = ВидПоляФормы.ПолеВвода;
КолонкаСтоимости.ПутьКДанным = "ДиаграммаГанта.Стоимость";

В данном примере стоит обратить внимание на следующий момент: если диаграмма Ганта является реквизитом формы (как в текущем примере), то колонку реквизита необходимо добавлять не через коллекцию ДиаграммаГанта.КолонкиДанных, а с помощью модификации реквизитов формы. Если диаграмма Ганта создается во встроенном языке ‑ тогда колонки добавляются через коллекцию КолонкиДанных.

Итак, мы добавили реквизит для хранения стоимости, и соответствующую колонку для отображения данных в таблице на форме. Теперь надо заполнить добавленные реквизиты значениями для всех процессов, из которых состоит строительство офиса. Перед тем, как показать пример такого заполнения, стоит заметить, что система «1С:Предприятие» автоматически никак не обрабатывает дополнительные данные диаграммы Ганта. Другими словами, если вам необходимо заниматься каким-то действиями с добавленными данными (например, вычислять итоги по иерархии точек или серий), то этим надо заниматься самостоятельно, из встроенного языка.

Приступим к заполнению стоимостных показателей для работ. Установим следующую стоимость наших работ для плановых показателей: планирование строительства ‑ 200 руб., закупка материалов ‑ 100 руб., расчистка территории ‑ 150 руб.

Копировать в буфер обмена
// Зададим значения стоимости для дополнительных данных
ИтогоСтоимость = 0;
Точка = ДиаграммаГанта.УстановитьТочку("planingConstruction");
Данные = ДиаграммаГанта.ПолучитьЗначение(Точка, СерияПлан).Данные;
Данные["Стоимость"] = 200;
ИтогоСтоимость = ИтогоСтоимость + Данные["Стоимость"];
Точка = ДиаграммаГанта.УстановитьТочку("purchaseMaterials");
Данные = ДиаграммаГанта.ПолучитьЗначение(Точка, СерияПлан).Данные;
Данные["Стоимость"] = 100;
ИтогоСтоимость = ИтогоСтоимость + Данные["Стоимость"];
Точка = ДиаграммаГанта.УстановитьТочку("clearTerritory");
Данные = ДиаграммаГанта.ПолучитьЗначение(Точка, СерияПлан).Данные;
Данные["Стоимость"] = 150;
ИтогоСтоимость = ИтогоСтоимость + Данные["Стоимость"];
// Заполним стоимость для "группирующего" элемента
ДиаграммаГанта.ПолучитьЗначение(ТочкаСтроительствоОфиса, СерияПлан).Данные["Стоимость"] = ИтогоСтоимость;

В представленном выше примере стоит обратить внимание на следующие моменты:

● Для поиска точек используются значения, которые указаны при создании точек (свойство Значение, подробнее см. здесь). Если при создании точек/серий были указаны уникальные (в рамках диаграммы) значения свойства Значение, то методы УстановитьТочку()/УстановитьСерию() будут возвращать вам требуемые объекты без дополнительных усилий.

● Коллекция Данные (у значения диаграммы Ганта) содержит в себе все добавленные колонки. К этим колонкам можно обращаться как по имени (применяется в примере), так и по индексу. Если выполняется попытка получить значение колонки, которой нет в коллекции, то для такой колонки значением будет Неопределено.

● Переменная ИтогоСтоимость и последняя строка примера предназначены для того, чтобы актуализировать стоимость всех работ по строительству офиса. Это значение состоит из суммы стоимостей подчиненных работ. Если в диаграмме будет выполняться интерактивное редактирование колонки Стоимость, то при необходимости разработчику будет необходимо самому пересчитывать значения стоимости по иерархии.

Для однозначной идентификации объектов типа ЗначениеДиаграммыГанта можно использовать специальное свойство Идентификатор. После создания значения диаграммы Ганта это свойство будет содержать значение типа ИдентификаторЗначенияДиаграммыГанта и платформа заполнит его автоматически. Значение свойства Идентификатор можно использовать для прямого поиска нужного значения с помощью метода ДиаграммаГанта.НайтиЗначениеПоИдентификатору().

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

ТочкаТочкаДиаграммыГанта.Текст;

ТекстЗначениеДиаграммыГанта.Текст.

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

● Интерактивно ‑ с помощью свойства Положение таблицы элемента формы типа Поле формы вида Поле диаграммы Ганта. Значение Авто для данного свойства интерпретируется как необходимость отображения таблицы данных слева от собственно диаграммы.

● Из встроенного языка ‑ с помощью свойства ПолеФормы.ПоложениеТаблицы.

Таблица данных хорошо подходит для ситуаций, когда требуется обеспечить какое-либо интерактивное взаимодействие с диаграммой и, если у значений диаграммы имеются какие-либо дополнительные данные. При этом у диаграммы будет наблюдаться одна особенность: при наличии нескольких серий, таблица будет содержать «одноименные» строки:

Рис. 307. Дубли строк таблицы

На рис. 307 в диаграмме имеется две серии: План ‑ верхняя серия и Факт ‑ нижняя серия. В таблице видно, что в колонке Точка количество повторений названия точки совпадает с количеством серий в диаграмме. Пример одной точки в разных сериях отмечен квадратными скобками. Также видно, что значение стоимости задано только для значений, серией которых является серия План. Такое отображение данных является особенностью отображения таблицы данных.

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

Рис. 308. Печатное представление таблицы

На рис. 308 наглядно показано, что представление точки объединяет все серии (можно сравнить с рис. 307). Данные отображаются, по-прежнему, в привязке к «своим» сериям. Однако, такое представление диаграммы полностью исключает какое-либо интерактивное взаимодействие с таблицей данных диаграммы, т. к. этой таблицы не будет на форме. Возможно, стоит автоматически преобразовывать диаграмму перед печатью в более удобное представление.

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

● Таблица всегда отображается внутри области построения диаграммы Ганта. Управление отображением таблицы выполняется с помощью свойства Положение таблицы (ПоложениеТаблицы) элемента формы Поле диаграммы Ганта (ПолеФормы.ПоложениеТаблицы).

● Результирующая высота строки вычисляется как максимум из высоты строки диаграммы Ганта и высоты строки таблицы.

● Высота области шапки таблицы и высота шкалы времени диаграммы Ганта вычисляется как максимум из оригинальных высот.

● Высота области подвала таблицы и высота шкалы времени диаграммы Ганта вычисляется как максимум из оригинальных высот.

● Раскрытие/сворачивание строки таблицы раскрывает/сворачивает точку диаграммы Ганта.

● Раскрытие/сворачивание серии диаграммы Ганта добавляет/удаляет строки, соответствующие подчинённым сериям.

● Вертикальная прокрутка таблицы и диаграммы работает синхронно: прокручивается и таблица, и собственно диаграмма.

● Горизонтальная прокрутка для таблицы и диаграммы выполняется раздельно.

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

● Управление текущей строкой и режимом выделения таблицы данных связано с текущим значением/интервалом диаграммы Ганта. Более подробное описание связи см. здесь.

7.3.4.4.8. Обработка событий

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

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

Интерактивное изменение интервалов диаграммы Ганта приводит к появлению события ПриОкончанииРедактированияИнтервала. В обработчике события доступны свойства измененного интервала.

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

Копировать в буфер обмена
&НаКлиенте
Процедура ДиаграммаГантаПриОкончанииРедактированияИнтервала(Элемент, Интервал, ОтменаРедактирования)
    Если Интервал.Конец > ДиаграммаГанта.КонецПолногоИнтервала Тогда
   ОтменаРедактирования = Истина;
    КонецЕсли;
КонецПроцедуры

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

7.3.4.5. Дендрограмма

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

Рис. 309. Дендрограмма

Разница в значениях элементов показана расположением соединительной линии.

В качестве примера представим на дендрограмме различия в цене двух товаров: яблоки ‑ 10 рублей, груши ‑ 12 рублей.

Рис. 310. 2 объекта

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

Копировать в буфер обмена
Яблоки = Дендрограмма.Элементы.Добавить();
Яблоки.Текст = "Яблоки (10 руб.)";
Груши = Дендрограмма.Элементы.Добавить();
Груши.Текст = "Груши (12 руб.)";
Связь = Дендрограмма.Связи.Добавить();
Связь.ПервыйЭлемент = Яблоки;
Связь.ВторойЭлемент = Груши;
Связь.Расстояние = 2;

Коллекция Элементы дендрограммы содержит перечень объектов, в нашем случае ‑ товаров. Связи между объектами задаются в коллекции Связи.

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

Копировать в буфер обмена
Апельсины = Дендрограмма.Элементы.Добавить();
Апельсины.Текст = "Апельсины (20 руб)";
Связь = Дендрограмма.Связи.Добавить();
Связь.ПервыйЭлемент = Яблоки;
Связь.ВторойЭлемент = Апельсины;
Связь.Расстояние = 8;

Дендрограмма будет иметь следующий вид:

Рис. 311. 3 объекта

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

Рис. 312. Объединение элементов

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

Копировать в буфер обмена
Дендрограмма.ОбластьПостроения.ФорматШкалыЗначений = "ЧДЦ=2;";

Дендрограмма примет следующий вид:

Рис. 313. Формат шкалы значений

Режим автоматической настройки масштаба дендрограммы при изменении размеров формы определяется свойством ПоддержкаМасштаба:

ВсеЭлементы ‑ все элементы отображаются в поле дендрограммы независимо от размеров формы.

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

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

7.4. Параметры формы

7.4.1. Общая информация

Параметры формы (закладка Параметры) служат двум целям:

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

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

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

Параметры формы можно передать в форму в момент ее создания. Анализ переданных параметров можно выполнить в событии ПриСозданииНаСервере() (коллекция Параметры является свойством объекта ФормаКлиентскогоПриложения):

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

ВНИМАНИЕ! После вызова обработчика события ПриСозданииНаСервере все неключевые параметры формы удаляются из коллекции Параметры.

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

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

7.4.2. Стандартные параметры формы

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

Перечень стандартных параметров форм в зависимости от вида расширения формы можно посмотреть в разделах Встроенный язык ‑ Интерфейс (управляемый) ‑ Управляемая форма ‑ Расширение… встроенной справки.

7.4.3. Пример работы с параметрами формы

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

К моменту начала работы с примером нужно иметь конфигурацию, обладающую следующими свойствами:

● имеется справочник Товары с иерархией групп и элементов;

● имеется справочник Аналоги с реквизитом ВыбранныйТовар типа СправочникСсылка.Товары;

● оба справочника имеют формы элементов.

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

● как происходит использование стандартных параметров формы;

● каким образом их использует сама система;

● как их может использовать разработчик.

Добавим дополнительный параметр, который будет управлять закрытием формы выбора после выбора элемента. Назовем этот параметр ЗакрыватьПослеВыбора (тип Булево). Добавим его в качестве параметра формы ФормаВыбора справочника Товары.

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

Копировать в буфер обмена
&НаКлиенте
Процедура ВыбранныйТоварНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    СтруктураПараметров = Новый Структура;
    СтруктураПараметров.Вставить("РежимВыбора", Истина);
    СтруктураПараметров.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы);
    СтруктураПараметров.Вставить("РазрешитьВыборКорня", Ложь);
    СтруктураПараметров.Вставить("ТекущаяСтрока", Объект.ВыбранныйТовар);
    СтруктураПараметров.Вставить("ЗакрыватьПослеВыбора", Ложь);
    ОткрытьФорму("Справочник.Товары.ФормаВыбора", СтруктураПараметров, Элементы.ВыбранныйТовар);
КонецПроцедуры

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

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

Теперь необходимо обработать переданные параметры в форме выбора. Сделаем это в обработчике ПриСозданииНаСервере() модуля формы выбора.

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Элементы.Список.ВыборГруппИЭлементов = Параметры.ВыборГруппИЭлементов;
    Элементы.Список.РазрешитьВыборКорня = Параметры.РазрешитьВыборКорня;
    Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
    ЗакрыватьПриВыборе = Параметры.ЗакрыватьПослеВыбора;
КонецПроцедуры

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

Примечание. Если у таблицы Список, отображающей список товаров, свойство РежимВыбора не будет установлено в значение Истина, то выбор товаров будет недоступен.

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

Копировать в буфер обмена
&НаКлиенте
Процедура СписокВыборЗначения(Элемент, СтандартнаяОбработка, Значение)
    СтандартнаяОбработка = Ложь;
    ОповеститьОВыборе(Значение);
КонецПроцедуры

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

Копировать в буфер обмена
&НаКлиенте
Процедура ВыбранныйТоварОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Объект.ВыбранныйТовар = ВыбранноеЗначение;
КонецПроцедуры

Мы самостоятельно реализовали системный механизм выбора значения в поле ввода на форме.

ВНИМАНИЕ! Данный пример не является законченным. Его единственным назначением является демонстрация механизмов работы с параметрами формы.

Если при создании параметров (обработчик ВыбранныйТоварНачалоВыбора()) заменить строку:

Копировать в буфер обмена
    ПараметрыВыбора.Вставить("ЗакрыватьПослеВыбора", Истина);

на строку:

Копировать в буфер обмена
    ПараметрыВыбора.Вставить("ЗакрыватьПослеВыбора", Ложь);

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

7.5. Команды формы

7.5.1. Общая информация

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

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

Стандартные команды, которые предоставляются расширением основного реквизита формы и расширениями реквизитов, которые являются списками (например, табличная часть объекта, динамический список, набор записей регистра сведений и т. д.), если с этим реквизитом есть связанный элемент формы.

Глобальные команды ‑ команды, предоставленные глобальным командным интерфейсом (подробнее про командный интерфейс см. здесь). Такие команды могут быть непараметризованными и параметризованными. Параметризованные глобальные команды будут предоставлены форме только в том случае, если на форме есть источники параметров с соответствующими типами.

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

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

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

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

● Попытка выполнить блокировку основного реквизита формы. Если попытка закончится неудачей ‑ команда не будет выполнена.

● Установлен признака изменения у формы (флаг Модифицированность).

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

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

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

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

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

● Для формы, открытой в немодальном режиме, выполняется только закрытие формы.

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

Стандартная команда формы Справка служит для открытия справочной информации по форме/объекту конфигурации. Расположение этой кнопки на командной панели формы определяется свойством ТолькоВоВсехДействиях этой кнопки. Если данное свойство установлено в значение Авто (и для командной панели с автоматическим заполнением), то фактическое расположение будет следующим:

● Интерфейс Такси ‑ если у формы или родительского объекта конфигурации имеется справочная информация, то кнопка будет располагаться на командной панели. В противном случае кнопка будет располагаться только в меню Еще.

● Другие интерфейсы ‑ кнопка всегда располагается на командной панели формы.

Использование ‑ подробнее см. здесь.

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

7.5.2. Особенности применения различных команд

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

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

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

● Команду ПоказатьВСписке, для которой свойство Параметр заполняется ссылкой на документ, в форме которого формируется командная панель;

● Команды ПоказатьВСписке (по одной на каждый подходящий журнал), для которых свойство Параметр заполняется ссылкой на соответствующий журнал документов.

Если нет доступных журналов, то в командной панели размещается команда ПоказатьВСписке, у кнопки которой свойство Параметр не задано.

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

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

Пример реализации:

Копировать в буфер обмена
Форма = ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");
Форма.ВыполнитьПереход(Объект.Ссылка);

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

7.6. Модуль формы

Модуль формы состоит из набора процедур и функций. Допускаются переменные и тело модуля.

Каждая процедура, функция или объявление переменной модуля формы должны предваряться одной из следующих директив компиляции:

НаКлиенте ‑ означает, что метод выполняется на стороне клиента, а переменная существует все время жизни клиентской части формы.

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

НаСервере ‑ означает, что метод выполняется на стороне сервера, а переменная существует только во время вызова выполнения серверного вызова.

Для серверных методов допустимыми являются вызовы серверных, серверных внеконтекстных и клиент-серверных внеконтекстных методов.

НаСервереБезКонтекста ‑ означает, что метод исполняется на сервере вне контекста формы. Переменные не могут предваряться такой директивой компиляции.

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

Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей.

НаКлиентеНаСервереБезКонтекста ‑ означает, что метод исполняется как на клиенте, так и на сервере, вне контекста формы. Переменные не могут предваряться такой директивой компиляции.

Также такой метод не имеет доступа к переменным модуля формы.

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

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

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

Не рекомендуется сохранять ссылки на реквизиты формы в переменных модуля (и других доступных хранилищах) на время операций, которые могут привести к пересозданию реквизитов формы. К таким операциям относятся: вызов метода ИзменитьРеквизиты() при работе на сервере и выполнение любого контекстного серверного вызова при работе на стороне клиента.

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

ВНИМАНИЕ! В серверной переменной формы невозможно сохранить данные между двумя вызовами серверной стороны формы.

Не допускается использование нескольких директив компиляции перед одним методом или переменной. Не допускается наличие одноименных методов или переменных, отличающихся только директивами компиляции.

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

В модуле формы рекомендуется использовать директивы препроцессора только внутри процедур и функций.

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

Полный перечень директив компиляции и инструкций препроцессора см. здесь.

Приведем пример использования директив компиляции:

Копировать в буфер обмена
&НаСервере
Перем СервернаяПеременная;
&НаКлиенте
Перем КлиентскаяПеременная;
&НаСервере
Процедура Серверная()
    Сообщить(СервернаяПеременная);
КонецПроцедуры
&НаКлиенте
Процедура Команда1Выполнить()
    Сообщить(КлиентскаяПеременная);
    Серверная();
КонецПроцедуры
#Если Сервер Тогда
    СервернаяПеременная = "Сервер";
#КонецЕсли
#Если НаКлиенте Тогда
    КлиентскаяПеременная = "Клиент";
#КонецЕсли

7.7. Элементы формы

7.7.1. Общая информация

Визуальное представление управляемой формы описывается набором элементов. Элементы формы образуют иерархическую коллекцию. Иерархия элементов формы определяет внешний вид и состав отображаемых на форме элементов управления. Существует несколько типов элементов формы:

● форма ‑ корневой элемент дерева элементов (см. здесь), существует в единственном экземпляре;

● поле формы (см. здесь);

● декорация формы (см. здесь);

● таблица формы (см. здесь);

● кнопка формы (см. здесь);

● группа формы (см. здесь);

● дополнение элемента формы (см. здесь).

Элементы формы типа поле формы и таблица формы всегда связаны с данными формы. Если связанный реквизит не указан, или он недоступен на клиенте ввиду ограничения по правам, или исключен из состава (свойства Просмотр и Редактирование реквизитов формы), поля не будет видно на форме, и оно будет автоматически удалено при создании формы в режиме исполнения.

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

7.7.2. Общие свойства элементов формы

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

7.7.2.1. Группа свойств «Основные»

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

● Заголовок состоит из нескольких слов, разделенных пробелами.

● Элемент с заголовком не является:

● Любым элементом, подчиненным таблице управляемой формы;

● Меню, кнопкой (вида Обычная кнопка или Кнопка командной панели);

● Заголовком страницы;

● Заголовком группы, если заголовок содержит дополнительные элементы оформления (оформление групп в интерфейсе версии 8.2).

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

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

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

Для управления видимостью элементов формы существуют два свойства: Видимость и Пользовательская видимость. Первое свойство можно изменять как в редакторе формы (в конфигураторе), так и программно. Свойство Пользовательская видимость настраивается только в конфигураторе и задает начальную видимость элемента формы в разрезе ролей. Результирующая видимость элемента формы образуется сложением «по И» свойств Видимость и Пользовательская видимость для конкретного пользователя. Описание редактирования свойства Пользовательская видимость см. здесь. Кроме того, изменяя видимость элементов формы в диалоге Настройка формы, пользователь фактически выполняет изменение свойства Пользовательская видимость конкретного элемента формы.

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

● при изменении видимости с помощью функциональных опций;

● при изменении видимости элемента Группа;

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

Описание свойств Высота и Ширина (или Количество строк) см. здесь.

С помощью свойства Пропускать при вводе можно задать пропуск элемента формы при обходе формы с помощью клавиши Enter. Если свойство установлено в значение Да, то элемент будет пропущен при обходе по Enter (но доступен при обходе с помощью клавиши Tab или указания элемента мышью). Если свойство установлено в значение Нет, то элемент не будет пропущен при обходе с помощью клавиши Enter. Также существует возможность указать автоматическое определение необходимости пропуска элемента формы. Для этого необходимо установить значение этого свойства равным Авто. В этом случае будет использоваться следующий алгоритм работы:

● Элемент типа Поле будет пропускаться в случае поля вида, поля надписи или поля картинки, а также в зависимости от значения свойства Отображение предупреждения при редактировании (см. здесь).

● Элемент типа Кнопка не будет пропускаться в том случае, если кнопка является кнопкой по умолчанию.

● Элемент типа Декорация будет пропускаться.

● Элемент типа Таблица не будет пропускаться.

7.7.2.2. Связь элементов с реквизитами формы

7.7.2.2.1. Общая информация

Любой элемент, отображающий какие-либо данные, должен быть связан с реквизитом формы. Можно выделить «обычную» связь ‑ когда элемент формы отображает данные какого-либо реквизита формы, и «специальные» режимы связи.

7.7.2.2.2. Связь с обычным реквизитом формы

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

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

7.7.2.2.3. Связь с текущими данными таблиц

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

Например, необходимо расположить на форме поле, которое отображает цену для текущей строки товара. Для этого в нужное место иерархии элементов формы добавляем поле (вид поля ввода может быть как Поле надписи, так и Поле ввода), для которого в качестве данных выбираем (в диалоге Выбор реквизита) Объект.Товары.Цена. Здесь Объект ‑ это реквизит формы типа Документ конкретного вида, Товары ‑ это табличная часть документа, а Цена ‑ реквизит табличной части.

7.7.2.2.4. Связь с определенной строкой таблицы

Элемент формы может быть связан с реквизитом, представляющим собой колонку указанной строки таблицы, являющейся реквизитом формы. Такая связь допускается как для полей, так и для таблиц, при этом не требуется, чтобы в таблице отображалась соответствующая колонка. Конкретная строка задается индексом строки (например, ТаблицаЗначений[1]) или последовательностью индексов для иерархических таблиц (например ТаблицаЗначений[2].СписокИтогов[4]). Элемент, связанный с данными строки, может находиться как в режиме Только просмотр, так и в режиме редактирования. Обращаем внимание, что подобная связь допускается только с реквизитами формы и не допускается с элементами формы. Другими словами, выражение <ИмяРеквизита>[Индекс] невозможно заменить на <ИмяЭлемента>[Индекс] или <ИмяЭлемента>.ТекущиеДанные.<ИмяРеквизита>[Индекс].

Примечание. Данная связь не поддерживается для динамических списков.

Например, необходимо расположить на форме поле, которое отображает значение поля Долг из 4-й строки таблицы значений Контрагенты. Для этого в нужное место иерархии элементов формы добавляем поле (вид поля ввода может быть как Поле надписи, так и Поле ввода), для которого в качестве данных выбираем (в диалоге Выбор реквизита) Контрагенты[3].Долг. Здесь Контрагенты ‑ это реквизит формы типа (ТаблицаЗначений), а Долг ‑ колонка таблицы значений.

Если данные поля ссылаются на отсутствующую строку ‑ редактировать такое поле будет нельзя, даже если выбрано поле ввода, в противном случае изменение, выполненное в поле ввода, будет выполнено в таблице, на которую ссылается поле ввода.

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

7.7.2.2.5. Связь с реквизитами через ссылку

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

Примечание. Для реквизитов составного типа (включая типы СправочникСсылка, ДокументСсылка и т. д.) недоступно получение реквизитов через ссылку.

Например, нужно расположить на форме поле, которое отображает артикул текущей строки товара. Для этого нам необходимо добавить в нужное место иерархии элементов формы поле с видом Поле надписи, для которого в качестве данных выбрать (в диалоге Выбор реквизита) Объект.Товары.Товар.Артикул. Здесь Объект ‑ это реквизит формы типа Документ конкретного вида, Товары ‑ это табличная часть документа, Товар ‑ это реквизит табличной части, а Артикул ‑ реквизит справочника Товары.

7.7.2.2.6. Связь с итогами коллекций

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

● итоги по числовым полям,

● количество строк в коллекции.

Элементы, связанные с такими реквизитами, всегда находятся в режиме Только просмотр.

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

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

7.7.2.3. Группа свойств «Использование»

Подробнее про использование свойства Быстрый выбор см. здесь.

Описание свойства Связи параметров выбора см. здесь. Описание свойства Параметры выбора см. здесь. Если значения свойств Связи параметров выбора и Параметры выбора заданы и в свойствах реквизита объекта метаданных, и в свойствах элемента формы, то значения свойства будут объединены. Объединение будет выполняться «по ИЛИ» (по именам параметров).

Имеется возможность указывать расширенную подсказку для следующих элементов формы:

● Поле;

● Таблица;

● Группа;

● Кнопка;

● Декорация.

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

Если заданы одновременно свойства Подсказка и свойство Заголовок расширенной подсказки ‑ отображаться будет текст из расширенной подсказки.

Свойство Сочетание клавиш предназначено для того, чтобы ускорить доступ к тому или иному элементу формы. Если для какого-то элемента формы установлено сочетание клавиш, то нажатие этого сочетания сразу переносит фокус ввода на требуемый элемент. Сочетания клавиш не работают для полей надписи и декораций. Однако следует помнить, что для некоторых сочетаний клавиш, которые используются системой «1С:Предприятие», невозможно переопределить исполняемые действия. Другими словами, если назначить такое «зарезервированное» сочетание для выполнения другого действия, то при нажатии сочетания клавиш будет выполнено системное действие.

7.7.2.4. Группа свойств «События»

В данной группе собраны ссылки на обработчики, которые предоставляет тот или иной элемент формы.

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

7.7.2.5. Картинки элементов

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

● из конфигуратора,

● программным способом.

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

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

Если при выборе файла с картинкой обнаруживается, что файл является картинкой формата SVG и содержит анимацию (SMIL-анимацию), то конфигуратор сообщает об этом и предлагает выполнить выполнить заменить SVG-картинку на набор картинок (подробнее о наборе картинок см. здесь). В наборе будет размещаться оригинальная SVG-картинка, и будет анимированная GIF-картинка с указанием, что GIF-картинку следует использовать для отображения в веб-браузерах Microsoft Internet Explorer и Microsoft Edge (основанный на инструменте отображения веб-страниц EdgeHTML). GIF-картинка будет получена конфигуратором автоматически. Это вызвано тем, что веб-браузеры Microsoft Internet Explorer и Microsoft Edge (основанный на инструменте отображения веб-страниц EdgeHTML) не поддерживают отображение SVG-анимации. При конвертации SVG-анимации в GIF-картинку следует помнить следующие особенности:

● Конвертируются картинки, продолжительность цикла анимации которых не превышает 15 секунд.

● В полученной GIF-картинке будет не более 30 кадров и частота смены кадров будет не более 30 кадров в секунду.

● В результате конвертации будет сформирован набор из двух картинок.

7.7.3. Форма

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

При открытии формы имеется возможность прервать этот процесс в нескольких местах:

● обработчик события ПриСозданииНаСервере ‑ отказ от открытия в этой обработчике приведет к тому, что форма вообще не будет создана.

● обработчик события ПриОткрытии ‑ отказ от открытия в этом обработчике может привести к различным последствиям.

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

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

Режим открытия формы управляется специальным свойством ‑ Режим открытия окна. Данное свойство описывает, каким образом будет открыто окно:

Независимый ‑ форма открывается:

● Режим Формы в отдельных окнах. Форма открывается в немодальном окне, которое является вспомогательным окном приложения.

● Режим Формы в закладках. Форма открывается в отдельной закладке.

● Режим Такси. Форма открывается в рабочей области основного окна приложения.

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

Форма, открытая в таком режиме, не участвует в поиске уже открытых форм. Если попытаться открыть точно такую же форму (даже с параметром уникальности, установленным в значение Ложь), то форма, открытая в режиме Блокировать окно владельца, не будет найдена и будет открыта новая форма.

Этот режим по умолчанию установлен у следующих форм:

● элемент и группа справочника,

● узел плана обмена,

● элемент и группа плана видов характеристик,

● счет,

● вид расчета,

● задача,

● запись независимого регистра сведений.

Блокировать весь интерфейс ‑ аналогично форме, которая открывается в режиме Блокировать окно владельца, но блокируется работа не только с родительской формой, но со всем интерфейсом прикладного решения. Такой режим открытия не используется в качестве установки «по умолчанию».

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

● Если в свойстве ВладелецФормы задана форма и эта форма не закрыта, блокируется окно этой формы.

● Если в свойстве ВладелецФормы задан элемент формы, и эта форма не закрыта, то блокируется окно формы, которой принадлежит этот элемент.

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

Свойство Режим открытия окна не оказывает влияния на открытие формы в следующих случаях:

● Если она открывается в модальном режиме. В этом случае форма будет открыта модально и в отдельном окне.

● При открытии в уже существующем основном или вспомогательном окне. В этом случае форма будет открыта в существующем основном или вспомогательном окне.

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

В интерфейсе Такси для формы, открытой в режиме Блокировать окно владельца или Блокировать весь интерфейс, нет возможности настроить панель навигации формы.

Каждая форма имеет заголовок. Заголовок может устанавливаться вручную, формироваться автоматически и быть комбинированным. Если свойство формы Заголовок не задано и установлено свойство Автоматический заголовок, то заголовок формы будет сформирован автоматически (описание правил формирования автоматического заголовка см. здесь). Явное указание свойства Заголовок (при установленном свойстве Автоматический заголовок) приведет к тому, что заголовок формы будет формироваться из значения свойства Заголовок, затем через ":" будет выведен автоматический заголовок формы. Если у формы указано только свойство Заголовок, а свойство Автоматический заголовок сброшено, то в качестве заголовка формы будет использоваться только значение свойства Заголовок.

Свойство Отображать заголовок позволяет управлять отображением заголовка формы (включая признак модификации данных формы). Свойство можно изменять из встроенного языка в режиме «1С:Предприятие». Свойство используется только при работе в интефейсе Такси. Если используется обычный режим основного окна, то данное свойство применяется только для форм, расположенных на начальной странице основного окна.

Рис. 314. Управление заголовоком

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

Свойство Отображать кнопку закрытия управляет наличием на форме кнопки закрытия (если способ открытия формы подразумевает наличие кнопки закрытия) и поведением клавиши ESC. Свойство можно изменять из встроенного языка в режиме «1С:Предприятие». Свойство используется только при работе в интефейсе Такси. Данное свойство не управляет кнопкой закрытия окна, которая находится в заголовоке вспомогательного окна.

Рис. 315. Управление кнопкой закрытия

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

Свойство формы Вертикальная прокрутка определяет расположение элементов формы при начальном отображении, а также то, как будут вести себя элементы формы в том случае, если форма будет сжиматься по вертикали:

● Значение Использовать ‑ полоса вертикальной прокрутки появится после того, как вертикальный размер элементов формы достигнет размера, который был задан при редактировании формы в конфигураторе (это относится и к элементам с автоматически определением высоты элемента).

● Значение ИспользоватьБезРастягивания ‑ при растягивании формы элементы формы не реагируют на изменение размера формы.

● Значение ИспользоватьПриНеобходимости ‑ перед появлением полосы прокрутки элементы формы будут сжиматься по вертикали до своего минимального размера.

Рассмотрим пример: имеется форма с реквизитом Список типа ДинамическийСписок. Этот реквизит отображается на форме таблицей Список, для которой высота указана в 8 строк таблицы. Если свойство формы Вертикальная прокрутка установить в значение Использовать, то форма практически не будет сжиматься:

Рис. 316. Вертикальная прокрутка формы ‑ использовать

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

Если свойство формы Вертикальная прокрутка установить в значение ИспользоватьПриНеобходимости, то форма вначале максимально уменьшит свой размер по вертикали, и лишь потом появится вертикальная полоса прокрутки:

Рис. 317. Вертикальная прокрутка формы ‑ использовать при необходимости

При установке свойства в значение Авто, поведение формы определяется системой на основании типа основного реквизита формы:

● Если основной реквизит формы имеет тип ДинамическийСписок, или основной реквизит формы имеет тип ОтчетОбъект, и для расширения формы отчета заполнено свойство РезультатОтчета, то значение Авто трактуется как значение ИспользоватьПриНеобходимости;

● В остальных случаях значение Авто трактуется как Использовать.

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

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

Свойство Вариант масштаба определяет, каким образом управляемая форма будет отображаться в интерфейсе Такси:

Авто ‑ система автоматически определяет режим отображения формы. В этом случае анализируется свойство ВариантМасштабаФормКлиентскогоПриложения объекта НастройкиКлиентскогоПриложения. Если в данном свойстве не указано конкретное значение варианта масштаба, то в интерфейсе Такси значение Авто будет трактоваться как Обычный.

Обычный ‑ форма выглядит стандартно для интерфейса Такси. Свойство Масштаб оказывает влияние на размер формы.

Рис. 318. Обычный вариант масштаба

Компактный ‑ в этом случае форма выглядит «почти» как в интерфейсе версии 8.2. Свойство Масштаб не оказывает влияние на размер формы.

Рис. 319. Компактный вариант масштаба

С технической точки зрения, форма, для которой значение свойства Вариант масштаба установлено в значение Компактный, имеет следующие особенности:

● В качестве шрифта формы используется системный шрифт Шрифт диалогов и меню;

● Элементы формы имеют размеры, максимально соответствующие таковым в интерфейсе версии 8.2;

● Расстояния между элементами формы максимально соответствуют расстояниям в интерфейсе версии 8.2;

● Табличный документ, диаграмма, диаграмма Ганта, дендрограмма, графическая схема и географическая схема отображаются без увеличения масштаба.

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

Также можно управлять масштабом сразу всех форм прикладного решения. Для этого следует соответствующим образом установить значение свойства ВариантМасштабаФормКлиентскогоПриложения объекта НастройкиКлиентскогоПриложения. Значение этого свойства будет использоваться для всех форм, у которых значение свойства Вариант масштаба установлено в значение Авто.

Если для формы установлен обычный режим отображения, то форма позволяет управлять масштабом своего отображения с помощью свойства Масштаб. Данное свойство указывает, каким должен быть масштаб данной формы относительно ее базового размера (в процентах). Значение свойства может изменяться от 10 до 400. В том случае, если в режиме «1С:Предприятия» будет выполнено изменение масштаба всего приложения (см. здесь), то масштаб, установленный в приложении, будет рассчитываться от масштаба, указанного с помощью свойства Масштаб. Так, установив у формы масштаб 200% (через свойство Масштаб), размер формы станет в 2 раза (по каждой координате) больше базового размера. Если в режиме «1С:Предприятия» для такой формы указать масштаб 50% (с помощью диалога настройки масштаба), то итоговый масштаб формы будет 100%, т. е. форма примет свой обычный вид.

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

Рис. 320. Список групп

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

Если свойство Разрешить изменять форму снято, то пользователь не может изменить состав и относительное положение элементов формы в режиме 1С:Предприятие.

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

Если свойство формы Сохранение данных формы в настройках установлено в значение Использовать список, то в списке реквизитов становится доступной колонка Сохранение. Значения реквизиты, у которых свойство Сохранение установлено в значение Истина, будут сохраняться в хранилище данных формы (подробнее см. здесь). Для сохранения будет использовано либо хранилище, указанное в свойстве формы Хранилище настроек, либо хранилище, указанное в свойстве Хранилище настроек данных форм конфигурации.

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

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

● Для всех форм:

Восстановить параметры.

● Для табличного поля:

Добавить,

Скопировать,

Удалить.

● Для расширения формы объекта, записи регистра сведений, константы:

Записать,

Записать и закрыть,

Провести,

Провести и закрыть,

Отменить проведение,

Старт,

Выполнено.

● Для расширения формы выбора/настроек:

Завершить редактирование,

Выбрать настройки.

● Для расширения табличного поля для динамического списка:

Пометить на удаление,

Провести,

Отменить проведение,

Создать группу,

Переместить в группу.

● Для расширения табличного поля для списка значений:

Изменить,

Переместить вверх,

Переместить вниз,

Сортировать по убыванию,

Сортировать по возрастанию,

Подбор.

● Все команды изменения следующих коллекций системы компоновки данных:

● коллекций настроек,

● коллекций доступных полей.

● Для расширения табличного поля для ДанныеФормыКоллекция, ДанныеФормыДерево, ДанныеФормыСтруктураИКоллекция:

Изменить,

Переместить вверх,

Переместить вниз,

Сортировать по убыванию,

Сортировать по возрастанию.

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

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

7.7.4. Поле

7.7.4.1. Общая информация

Элемент формы Поле предназначен для отображения и редактирования какого-либо реквизита формы. Поле формы может быть нескольких видов:

● поле ввода,

● поле надписи,

● поле флажка,

● поле картинки,

● поле переключателя,

● поле текстового документа,

● поле табличного документа (подробнее см. здесь),

● поле календаря,

● поле индикатора,

● поле полосы регулирования,

● поле диаграммы (подробнее см. здесь),

● поле диаграммы Ганта (подробнее см. здесь),

● поле дендрограммы (подробнее см. здесь),

● поле графической схемы,

● поле географической схемы,

● поле HTML-документа (подробнее см. здесь),

● поле форматированного документа (подробнее см. здесь);

● поле планировщика (подробнее см. здесь);

● поле PDF-документа (подробнее см. здесь).

Если поле является подчиненным элементом для элемента формы Таблица, то оно может принимать следующие типы:

● поле ввода,

● поле картинки,

● поле надписи,

● поле флажка.

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

Свойство поля ввода Подсказка ввода позволяет указывать подсказку, которая будет формироваться непосредственно «внутри» поля ввода, если выполняются следующие условия:

● Тип связанного реквизита не является типом Число или Дата.

● Значение связанного реквизита не содержит значение по умолчанию для данного типа.

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

Маска;

ФормаВыбора;

ФорматРедактирования;

БыстрыйВыбор;

ВыборГруппИЭлементов;

ПараметрыВыбора (дополненное значениями, в соответствии со свойством СвязиПараметровВыбора);

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

Поле ввода будет игнорировать свойство ЦветФона в том случае, если для этого поля свойство Доступность установлено в значение Ложь или свойство ТолькоПросмотр установлено в значение Истина.

7.7.4.2. Обновление отображаемых данных

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

● В поле ввода находятся данные, которые не зафиксированы в реквизите формы, связанного с полем ввода. Например, при вводе текста.

● В это время срабатывает обработчик ожидания или внешнего события.

● В обработчике события изменяются данные формы или состав элементов формы.

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

Свойство ОбновлениеТекстаРедактирования

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

Метод ОбновитьОтображениеДанных()

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

Параметрами метода могут выступать только следующие элементы формы: ГруппаФормы, ТаблицаФормы, ПолеФормы.

Использование метода ОбновитьОтображениеДанных() имеет смысл только в следующих случаях:

● из обработчика внешнего события;

● обработчика ожидания формы;

● обработчика оповещения.

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

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

7.7.4.3. Данные и представление

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

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

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

В результате вышесказанного, при отображении и редактировании данных в таблице наблюдается следующее поведение:

● Данные отображаются своим представлением.

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

● После окончания редактирования данные опять отображаются своим представлением (без учета списка выбора).

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

● Использовать условное оформление формы.

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

7.7.4.4. Предупреждение при редактировании

Если в поле ввода формы редактируется реквизит, который заполняется автоматически, но, тем не менее, может заполняться вручную (в крайне редких случаях), то такое поведение можно реализовать с помощью свойств поля ввода Отображение предупреждения при редактировании и Предупреждение при редактировании. Если значение свойства Отображение предупреждения при редактировании равно Отображать, то при попытке начать редактирование поля «1С:Предприятие» выдаст предупреждение, которое состоит либо из строки, указанной в свойстве Предупреждение при редактировании, либо формируется автоматически.

Для стандартных полей Код и Номер (для объектов с автоматической нумерацией) автоматическая строка предупреждения будет выглядеть как Номер заполняется при записи автоматически, а для остальных полей автоматическая строка будет выглядеть как Редактирование поля "Имя поля" не рекомендуется. Если значение свойства Отображение предупреждения при редактировании равно Авто, то для стандартных реквизитов Код и Номер будет использоваться значение Отображать, а для остальных полей ‑ Не отображать. Свойство Отображение предупреждения при редактировании также оказывает влияние на свойство поля ввода Пропускать при вводе. Если значение свойства Пропускать при вводе равно Авто, то поле будет пропускаться при вводе в том случае, если значение свойства Отображение предупреждения при редактировании равно Отображать (или Авто для стандартных полей Код и Номер).

7.7.4.5. Отметка незаполненного

Если свойство АвтоОтметкаНезаполненного поля ввода установлено в значение Истина, то свойство этого поля ОтметкаНезаполненного будет автоматически актуализироваться при передаче значения из реквизита в поле ввода.

7.7.4.6. Отображение переключателя и флажка

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

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

Рис. 321. Виды флажка

На рис. 321 представлены различные варианты отображения поля флажка. Каждый вид флажка описан в заголовке каждой строки.

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

Рис. 322. Виды переключателя

На рис. 322 представлены различные варианты отображения поля переключателя. В верхней части рисунка поле переключателя представлено в виде тумблера, а в нижней ‑ в виде переключателя.

7.7.4.7. Редактирование стандартных периодов и дат

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

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

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

7.7.4.8. Контекстное меню поля ввода

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

Система предоставляет в обработчик следующую информацию:

● В каком элементе формы будет формироваться контекстное меню ‑ параметр Элемент.

● В какой части поля ввода инициируется создание контекстного меню ‑ параметр ПараметрыКоманд.

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

Параметр Параметры содержит объект ПараметрыФормированияКомандПоляВвода. «Ведущим» свойством объекта является свойство Источник. Это свойство определяет, для какой части поля ввода формируется контекстное меню (значение типа системного перечисления ИсточникКомандПоляВвода):

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

МножественноеЗначение ‑ контекстное меню формируется над каким-либо из элементов коллекции, которая связана с полем ввода. В этом случае свойство Идентификатор объекта ПараметрыФормированияКомандПоляВвода укажет разработчику, «над» каким именно элементом коллекции формируется контекстное меню. Следует понимать, что полученный не является индексом коллекции. Для получения элемента, для которого формируется контекстное меню, следует использовать метод коллекции НайтиПоИдентификатору().

В параметре Команды обработчика события ОбработкаФормированияКоманд система «1С:Предприятие» передаст контекстное меню, заполненное по умолчанию. Это меню состоит из массива объектов ОписаниеКомандыПоляВвода, который обладает следующими свойствами:

Свойство

Описание

Доступность

Тип: Булево. Определяет, доступна данная команда в текущий момент или нет.

Картинка

Тип: Картинка. Содержит картинку, которая будет отображаться перед командой.

Команда

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

Неопределено ‑ будет отображать горизонтальный разделитель меню.

● Значение системного перечисления СтандартнаяКомандаПоляВвода ‑ позволяет указать одну из стандартных команд поля ввода. В этом случае остальные свойства объекта ОписаниеКомандыПоляВвода игнорируются, а параметры отображения стандартной команды будут предоставлены системой.

● Значение типа ОписаниеОповещения ‑ позволяет указать команду, реализованную на встроенном языке.

● Значение типа Массив ‑ в этом случае в контекстном меню будет сформировано подменю. Состав подменю определяется аналогично самому контекстному меню.

Пометка

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

Представление

Тип: Строка. Данное свойство содержит представление команды контекстного меню.

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

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

Копировать в буфер обмена
&НаКлиенте
Процедура ЭлементСтрокаОбработкаФормированияКоманд(Элемент, ПараметрыКоманд, Команды)
    Команды.Очистить();
    Команды.Добавить(Новый ОписаниеКомандыПоляВвода(СтандартнаяКомандаПоляВвода.Копировать));
    Команды.Добавить(Новый ОписаниеКомандыПоляВвода(СтандартнаяКомандаПоляВвода.Вставить));
    Команды.Добавить(Новый ОписаниеКомандыПоляВвода(СтандартнаяКомандаПоляВвода.Очистить));
КонецПроцедуры

Теперь рассмотрим рамочный пример формирования контекстного меню в зависимости от того, на каком элементе формируется контекстное меню:

Копировать в буфер обмена
&НаКлиенте
Процедура РеквизитСписокОбработкаФормированияКоманд(Элемент, ПараметрыКоманд, Команды)
    Если ПараметрыКоманд.Источник = ИсточникКомандПоляВвода.МножественноеЗначение Тогда
   ТекущийЭлемент = РеквизитСписок.НайтиПоИдентификатору(ПараметрыКоманд.Идентификатор;
   // здесь можно сформировать контекстное меню, зависящее от
   // значения элемента, на котором формируется контекстное меню
    ИначеЕсли ПараметрыКоманд.Источник = ИсточникКомандПоляВвода.ОбластьВвода Тогда
   // здесь можно сформировать контекстное меню, которое формируется
   // в той части поля ввода, в которой пользователь вводит символы
    КонецЕсли;
КонецПроцедуры

Логика работы примера проста:

● Вначале определяется, где формируется контекстное меню ‑ в области ввода или на каком-то элементе, отображаемым полем ввода.

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

7.7.4.9. Поле табличного документа

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

Отображение выделения ‑ позволяет управлять способом отображения выделения в табличном документе:

Всегда ‑ выделение будет отображаться всегда, в том числе и в том случае, если поле табличного документа не активно. Это значение устанавливается по умолчанию.

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

Не отображать ‑ выделение не будет отображаться никогда.

При выделении нескольких ячеек ‑ выделение отображается в том случае, если оно (выделение) состоит более чем из одной ячейки табличного документа.

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

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

Вертикальная/Горизонтальная полоса прокрутки ‑ позволяет управлять наличием полос прокрутки у табличного документа:

Не использовать ‑ полосы прокрутки не будут использоваться.

Использовать всегда ‑ полосы прокрутки всегда присутствуют в табличном документе.

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

Тип курсоров ‑ позволяет управлять видом курсора мыши, который находится над табличным документом:

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

Обычные ‑ курсор мыши всегда имеет вид стандартного курсора («стрелочка»).

7.7.4.10. Поле HTML-документа

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

Для работы с HTML во всех операционных системах используется WebKit, начиная с «1С:Предприятия» версии 8.3.14 (и режима совместимости Версия 8.3.14 и последующих).

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

При работе с HTML следует учитывать следующие особенности:

● Отображение HTML-документа в различных операционных системах может различаться.

● Не поддерживаются скрипты с состоянием (переменные, хранящие значения, необходимые в различных обработчиках событий).

● Не поддерживается работа с языком разметки SVG (кроме отображения картинок).

● Не поддерживается свойство HTML-документа parentWindow.

● Не поддерживаются переходы по ссылке внутри отображаемой страницы

● При доступе к DOM-модели HTML-документа с помощью свойства ПолеHTMLДокумента.Документ следует использовать только те свойства и методы, которые доступы во всех веб-браузерах, поддерживаемых системой «1С:Предприятие».

● При использовании поля HTML-документа для загрузки в него стороннего сайта необходимо учитывать, что сайт может запретить встраивать себя в iframe, используя заголовок ответа X-Frame-Options: DENY. В таком случае в веб-клиенте такой сайт не будет отображен в поле HTML-документа.

7.7.4.11. Поле документа PDF

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

1. Создать реквизит формы типа ДокументPDF.

2. Создать поле формы вида Поле PDF документа и указать в качестве данных реквизит, созданный на предыдущем шаге.

Работа с реквизитом формы выполняется с помощью методов реквизита. Методы полностью аналогичны методам объекта ДокументPDF. Командная панель для управления полем PDF-документа создается обычным образом.

У элемента формы, отображающего PDF-документ, имеется обработчик события НажатиеНаНавигационнойСсылке. Этот обработчик будет вызван в том случае, когда пользователь нажимает какую-либо гиперссылку отображаемого PDF-документа. Разработчик может проанализировать ссылку и принять решение ‑ разрешать ее открытие или это делать недопустимо.

Свойство ИспользуемоеИмяФайла позволит разработчику заранее указать полный путь к файлу, в который будет выполняться сохранение файл, открытого в поле формы, если пользователь выберет команды сохранения файла. Команда Сохранить будет пытаться сразу сохранить файл по указанному пути (и имени), а команда Сохранить как ‑ откроет диалог сохранения с предустановленным именем файла.

Смотри также:

● Состояние просмотра (см. здесь).

7.7.4.12. Работа со списковыми данными в поле ввода

7.7.4.12.1. Общая информация

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

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

На следующей картинке изображен фрагмент формы, на которой список значений (содержащий 4 значения) отображается обеими способами:

Рис. 323. Сравнение отображений списка значений

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

Из этой картинки видно, что в поле ввода можно:

● Вводить новые значения ‑ курсор после четвертого элемента.

● Удалять существующие значения ‑ «крестики» у каждого элемента в поле ввода.

● Выделять несколько значений ‑ выделены первый, второй и третий элементы.

● Использовать стандартные кнопки ввода поля.

Поле ввода может только отображать множественные значения или (в дополнение к отображению) вводить множественные значения. Для того, чтобы поле ввода начало отображать множественные значения, необходимо, чтобы в качестве данных поля ввода выступал список значений или реквизит формы типа ДанныеФормыКоллекция. Возможность редактирования множественных значений в поле ввода управляется свойством элемента формы Расширенное редактирование множественных значений (РасширенноеРедактированиеМножественныхЗначений). Если это свойство включено ‑ редактирование в самом поле доступно. Если свойство выключено ‑ редактирование в поле выключено, а для редактирования будет открываться отдельная форма редактирования. Управлять тем, как поле формы будет отображать такие данные ‑ нельзя.

Если множественные значения не помещаются в область данных поля ввода с полными представлениями, то выполняются следующие действия:

● Представления значений сокращаются по стандартным правилам, с добавлением в конце символа многоточия (…).

● Если и сокращенные представления не помещаются в область данных, то в поле ввода сохраняются сокращенные представления, которые полностью помещаются в область данных поля ввода вместе с кнопкой +N, где N ‑ количество скрытых элементов (которые не поместились в поле ввода).

При этом поведение поля зависит от высоты, заданный для этого поля в форме:

● Высота поля равна 1 строке:

● Множественные значения размещаются в начале области данных поля ввода. Ввод текста начинается правее последнего элемента.

● Область редактирования текста может сжиматься до минимальной ширины в 3 символа.

● Если множественные значения не помещаются целиком, появляется кнопка +N.

● Высота поля ввода равна 2 строкам:

● Нижняя строка всегда резервируется для ввода текста.

● Верхняя строка резервируется для отображения множественных значений.

● Если множественные значения не помещаются целиком, появляется кнопка +N.

● Высота поля ввода более 2 строк:

● Нижняя строка всегда резервируется для ввода текста.

● Верхние строки резервируются для отображения множественных значений.

● Если множественные значения не помещаются целиком, появляется кнопка +N.

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

Рассмотрим различия в поведении поля ввода, которое отображает множественные значения, в зависимости от состояния свойства Расширенное редактирование множественных значений:

● Свойство включено:

● Включено по умолчанию для новых полей ввода.

● Возможно редактирование данных непосредственно в поле ввода.

● Свойство выключено:

● Выключено по умолчанию, если поле формы создано в предыдущих версиях.

● Редактирование непосредственно в поле ввода не поддерживается (в том числе и удаление значений).

● Множественные значения можно выделить и скопировать их представление в буфер обмена.

● Не поддерживается использование гиперссылки множественного значения (и открытие значения нажатием на гиперссылку).

● Не поддерживаются свойства поля ввода, связанные с редактированием множественных значений (в том числе и внутри диалога редактирования множественных значений):

ГиперссылкаМножественныхЗначений,

РазрешитьВводПустыхМножественныхЗначений,

РазрешитьДублированиеМножественныхЗначений,

ОтображатьФлажкиВВыпадающемСпискеПриВводеМножественныхЗначений.

● Не поддерживаются события поля ввода, связанные с редактированием множественных значений:

ДобавлениеМножественныхЗначений.

УдалениеМножественныхЗначений.

ОткрытиеМножественногоЗначения.

ОбработкаНавигационнойСсылкиМножественногоЗначения.

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

● Свойство ЦветФонаМножественныхЗначений.

● Свойство ЦветТекстаМножественныхЗначений.

● Свойство ШрифтМножественныхЗначений.

● Свойство РазмерКартинкиМножественногоЗначения.

● Свойство ФигураКартинкиМножественногоЗначения.

● Условное оформление формы для множественных значений.

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

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

● адреса электронной почты;

● номера телефонов пользователя или контрагента;

● редактирование отбора по списку в системе компоновки данных;

● установка категорий, множественных характеристик, тэгов;

● роли пользователя.

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

7.7.4.12.2. Простая настройка поля ввода

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

Таким образом, если отображаемый список будет заполнен вот таким образом (Список ‑ это реквизит формы типа СписокЗначений):

Копировать в буфер обмена
Список.Добавить(1, "Первый элемент");
Список.Добавить(2, "Второй элемент");
Список.Добавить(3, "Третий элемент");
Список.Добавить(4, "Четвертый элемент");

То поле ввода будет выглядеть следующим образом:

Рис. 324. Отображение списка значений

Если отображается ДанныеФормыКоллекция, то необходимо заполнить еще несколько свойств:

● Свойство ПутьКДаннымЗначенияМножественногоЗначения указывает колонку, в которой хранятся значения, которые показываются в поле ввода. Если указать только это свойство, то в поле ввода будут показываться представления значений (результат работы функции Строка() для каждого отображаемого значения). Если не заполнить данное свойство ‑ поле не будет отображаться на форме.

● Свойство ПутьКДаннымПредставленияМножественногоЗначения. Это свойство следует указывать тогда, когда представление данных отличается от представления соответствующего значения по умолчанию.

Допустим, на форме есть реквизит Таблица, который имеет тип (ТаблицаЗначений) (ДанныеФормыКоллекция), который заполнен следующими данными (заголовки колонок содержат имена колонок реквизита):

ЗначениеТаблицы

ПредставлениеТаблицы

1

Первый элемент

2

Второй элемент

3

Третий элемент

4

Четвертый элемент

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

Рис. 325. Отображение таблицы (без представлений)

Если для поля ввода заполнить и свойство ПутьКДаннымПредставленияМножественногоЗначения, указав в этом свойстве Таблица.ПредставлениеТаблицы, то поле ввода будет отображаться следующим образом:

Рис. 326. Отображение таблицы (с представлениями)

Как видно, разница между двумя отображениями поля ввода заключается в том, что на рис. 325 поле ввода отображает сами значения, а на рис. 326 ‑ отображается содержимое колонки с представлениями значений.

Для того, чтобы стало возможно редактирование множественных значений в поле ввода, необходимо, чтобы было включено свойство поля ввода Расширенное редактирование множественных значений. Теперь для того, чтобы ввести какое-либо значение в список, достаточно ввести нужное значение в свободную часть поля ввода и нажать клавишу ENTER. Для управления возможностями ввода служат два свойства:

РазрешитьВводПустыхМножественныхЗначений ‑ при пустой области ввода разрешает пользователю нажатием ENTER вводить «пустые» значения в отображаемый список.

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

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

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

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

При использовании свойства ОграничениеТипа тип вводимого множественного значения определяется как пересечение описаний типов следующих свойств:

● Для списка значений: состав типов реквизита (свойство Тип значения реквизита типа СписокЗначений) и состав типов, ограничивающий типы поля ввода формы клиентского приложения из встроенного языка (свойство поля ввода ОграничениеТипа).

● Для типа ДанныеФормыКоллекция: состав типов колонки, которая указана в свойстве поля ввода ПутьКДаннымЗначенияМножественногоЗначения и состав типов, ограничивающий типы поля ввода в таблице формы клиентского приложения из встроенного языка (свойство поля ввода ОграничениеТипа).

Если в результате пересечения одной из вышеописанных комбинаций типов получится простой тип ‑ выбор типа не будет требоваться при вводе значений.

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

● Если данные в поле ввода содержат единственное значение ‑ оно будет приведено к новому типу.

● Если данные поля ввода содержат несколько значений ‑ они останутся неизменными.

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

● Если данные в поле ввода содержат единственное значение ‑ оно будет очищено.

● Если данные поля ввода содержат несколько значений ‑ они останутся неизменными.

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

Смотри также:

● Параметры выбора (см. здесь).

● Связи параметров выбора (см. здесь).

7.7.4.12.3. Редактирование данных в поле

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

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

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

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

● Если множественные значения добавляются из формы выбора, то будет вызван один набор событий для всех значений выбранных в форме.

При открытии формы выбора из поля ввода, в нее будет передан параметр ВыборДобавлением, который позволит определить, в каком режиме находится поле ввода:

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

Ложь ‑ параметр формы ВыборДобавление не указан при открытии формы выбора из встроенного языка или вызов выполняется для конфигурации, у которой установлен режим совместимости Версия 8.3.22 или предыдущие версии.

Неопределено ‑ во всех остальных случаях.

Ввод данных

События при вводе данных:

● Обработчик события ИзменениеТекстаРедактирования вызывается в тот момент, когда пользователь начинает набирать какой-либо текст в поле ввода. Набранный текст передается в параметре Текст обработчика события.

АвтоПодбор ‑ после ввода текста или при нажатии на кнопку выбора из списка

● Обработчик события НачалоВыбора вызывается перед открытием формы выбора. Форма выбора может быть открыта с нажатием кнопки выбора поля ввода, нажатием клавиши F4 в поле ввода или выбором гиперссылки Показать все в списке выбора.

Параметры формы выбора передаются в параметре ДанныеВыбора обработчика НачалоВыбора. Если форма выбора должна позволить множественный выбор значений (для последующей передачи в поле ввода), то в форму выбора должен быть передан параметр МножественныйВыбор, установленный в значение Истина.

Параметр ВыборДобавлением указывает, каким образом происходит выбор

● Значению Ложь ‑ если для поля ввода запрещено расширенное редактирование множественных значений.

● Значение Ложь ‑ если для поля ввода разрешено расширенное редактирование множественных значений, а обработчик вызывается после нажатия кнопки Открытие поля ввода, где в обработчике события Открытие() сохранили стандартную обработку события.

● Значение Истина ‑ во всех остальных случаях.

● Обработчик события ОбработкаВыбора вызывается после того, как установлен очередной флажок в списке выбора или выбрано значение в форме выбора. Выбранное значение передается в параметре ВыбранноеЗначение. Если выбрано одно значение ‑ именно оно и будет в этом параметре. Аналогично будет обработан выбор значения в списке выбора с флажками: каждая установка флажка приведет к событию ОбработкаВыбора. Если добавление значений осуществляется из формы выбора, в которой разрешен множественный выбор, то в событие ОбработкаВыбора попадет массив выбранных элементов (в параметре ВыбранноеЗначение).

Параметр обработчика ВыборДобавлением предназначен для определения способа добавления значения в поле ввода:

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

● Если событие вызвано из формы выбора, то значение параметра соответствует параметру ВыборДобавлением формы выбора.

● Во всех остальных случаях этот параметр равен значению Истина, если в поле ввода разрешен ввод множественных значений и Ложь ‑ во всех остальных случаях.

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

● Обработчик события ПриИзменении вызывается после любого изменения данных в поле ввода.

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

● В параметре ВыбранноеЗначение находится одиночное значение:

● Флажок для значения отображается, если это значение уже есть в коллекции, отображаемой полем.

● Флажок для значения не отображается, если этого значения нет в коллекции, отображаемой полем.

● В параметре ВыбранноеЗначение расположен массив значений:

● Флажок для значения отображается, если все значения из массива присутствуют в коллекции, которая отображается полем ввода.

● Флажок для значения не отображается, если все значения из массива отсутствуют в коллекции, которая отображается полем ввода.

● Флажок отображается в третьем состоянии, если в коллекции присутствуют не все значения из массива.

Вызов событий зависит от того, устанавливается флажок в списке выбора или сбрасывается:

● Флажок устанавливается для одиночного значения или значения, представляющего массив значений:

● Вызывается обработчик события ОбработкаВыбора. Параметр ВыбранноеЗначение содержит значение, для которого установили флажок.

● Вызывается обработчик события ДобавлениеМножественныхЗначений. Параметр Значения содержит выбранное значение.

● Вызывается обработчик события ПриИзменении.

● Флажок сбрасывается для одиночного значения или значения, представляющего массив значений:

● Вызывается обработчик события УдалениеМножественныхЗначений. Параметр Идентификаторы содержит массив с идентификаторами удаляемых значений.

● Вызывается обработчик события ПриИзменении.

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

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

● Формальный параметр ВыборДобавлением будет игнорироваться, если:

● Поле ввода отображает одиночное значение, которое не является коллекцией значений.

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

● В остальных случаях:

● Поле ввода отображает СписокЗначений, значение формального параметра ЗначениеВыбора в обработчике события имеет тип СписокЗначений:

● Формальный параметр ВыборДобавлением установлен в значение Ложь:

● Значение формального параметра ЗначениеВыбора заменяет значения редактируемого реквизита.

● Вызывается обработчик события ПриИзменении

● Формальный параметр ВыборДобавлением установлен в значение Истина:

● Вызывается событие ДобавлениеМножественныхЗначений.

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

● Вызывается обработчик события ПриИзменении.

● Значение формального параметра ЗначениеВыбора в обработчике события имеет тип Массив:

● Если формальный параметр ВыборДобавлением установлен в значение Ложь, то текущий состав коллекции очищается.

● Вызывается обработчик события ДобавлениеМножественныхЗначений.

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

● Вызывается обработчик события ПриИзменении.

● Во всех остальных случаях:

● Если формальный параметр ВыборДобавлением установлен в значение Ложь, то текущий состав коллекции очищается.

● Вызывается обработчик события ДобавлениеМножественныхЗначений.

● В отображаемую коллекцию добавляет содержимое формального параметра ЗначениеВыбора.

● Вызывается обработчик события ПриИзменении.

Удаление данных

События при удалении значений в поле ввода в режиме редактирования множественных значений:

● При очистке поля:

● Обработчик события Очистка вызывается в тот момент, когда пользователь «заказал» очистку поля. Это можно сделать как с помощью кнопок самого поля ввода, так и с помощью сочетания клавиш Shift + F4. В данном случае имеется возможность отказаться от очистки поля с помощью параметра СтандартнаяОбработка.

● При удалении одного или нескольких элементов в поле ввода:

● Вызывается обработчик события УдалениеМножественныхЗначений. В качестве параметра Идентификаторы этого обработчика передается массив, который содержит идентификаторы удаляемых значений из связанного списка значений или коллекции. Необходимо понимать, что массив содержит не индексы (хотя значения и очень похожи), а идентификаторы. В отличие от индекса, идентификатор не изменяется при удалении элементов коллекции. Для того, чтобы получить элемент коллекции по идентификатору ‑ следует использовать метод коллекции НайтиПоИдентификатору(). А удалять ‑ уже полученный элемент. Параметр СтандартнаяОбработка позволяет указать системе, что все действия со связанными данными будут выполняться из встроенного языка.

● Обработчик события ПриИзменении вызывается после того, как связанные данные очищены и произошло обновление элемента формы.

Открытие формы значения

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

● В контекстном меню элемента выбрать пункт Открыть. Этот пункт расположен в контекстном меню по умолчанию или может быть добавлен в контекстное меню в обработчике события ОбработкаФормированияКоманд (подробнее см. здесь).

● Нажать на элемент, если он отображается гиперссылкой. Эта возможность управляется свойством поля ввода ГиперссылкаМножественныхЗначений. Это значение может принимать одно из трех значений:

Да ‑ представление каждого множественного значения является гиперссылкой («нажимается» и отображается с подчеркиванием при наведении).

Нет ‑ представление каждого множественного значения не является гиперссылкой.

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

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

Работа с выделением из встроенного языка

Поле ввода позволяет получить и установить выделенные значения в поле ввода. Если, например, пользователь выделил несколько значений в поле ввода в режиме редактирования множественных значений, то с помощью метода ПолучитьВыделенныеМножественныеЗначения() расширения поля формы для поля ввода можно получить массив идентификаторов элементов отображаемой коллекции. Для выполнения обратной операции (установить выделение по списку идентификаторов) служит метод УстановитьВыделенныеМножественныеЗначения().

Для получения идентификатора элемента коллекции (списка значений или ДанныеФормыКоллекция) следует использовать метод ПолучитьИдентификатор().

7.7.4.12.4. Флажки в выпадающем списке

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

Рис. 327. Флажки в списке выбора

За наличие флажков в списке отвечает свойство поля ввода ОтображатьФлажкиВВыпадающемСпискеПриВводеМножественныхЗначений. Это значение имеет тип Булево, но может принимать три состояния:

Истина ‑ допускается использование флажков в списке выбора.

Ложь ‑ не допускается использование флажков в списке выбора.

Неопределено ‑ трактовка значения зависит от значения свойства поля ввода РазрешитьДублированиеМножественныхЗначений:

Истина ‑ в выпадающем списке флажки не отображаются (свойство трактуется как Ложь).

Ложь ‑ в выпадающем списке флажки отображаются (свойство трактуется как Истина).

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

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

7.7.4.12.5. Картинки значений в поле ввода

Поле ввода может отображать картинки для каждого отображаемого значения. Механика отображения картинок несколько различается для случая отображения типа СписокЗначений и типа ДанныеФормыКоллекция. Для обеих способов отображения действуют свойства, которые управляют размером и формой картинок в поле ввода:

● Свойство РазмерКартинкиМножественногоЗначения определяет то, какого размера будет картинка в поле ввода:

Маленький ‑ размер картинки составляет 16 на 16 точек.

Средний ‑ размер картинки составляет 24 на 24 точки.

Крупный ‑ размер картинки составляет 32 на 32 точки.

Авто ‑ трактуется как Маленький во всех случаях.

Если фактический размер картинки отличается от установленного ‑ платформа будет выполнять автоматическое масштабирование картинки.

● Свойство ФигураКартинкиМножественногоЗначения определяет, какую форму примет картинка в поле ввода:

Квадрат ‑ картинка будет вписываться в квадрат.

Круг ‑ картинка будет вписываться в круг.

Авто ‑ трактуется как Квадрат во всех случаях.

Теперь рассмотрим отображение картинок для типа СписокЗначений. В этом случае картинка получается из соответствующего свойства элемента списка значений (ЭлементСпискаЗначений.Картинка). Это самый простой способ указания картинки.

Если для поля ввода указать параметры отображения картинки как средний размер и круглый внешний вид, то поле ввода будет выглядеть следующим образом (для сравнения ‑ нижнее поле ввода демонстрирует стандартные настройки отображения картинок):

Рис. 328. Список значений. Картинки в поле ввода

В том случае, если источником множественных значений выступает ДанныеФормыКоллекция, существует два способа управления отображением картинок:

1. Размещение картинки в каждой строке коллекции (по аналогии со списком значений).

2. Указание одной коллекции картинок для поля ввода, в самой коллекции указание индекса отображаемой картинки в каждой строке коллекции.

Начнем рассмотрение с картинкой в каждой строке коллекции. Для этого в настройках поля ввода необходимо указать, какая колонка будет содержать картинки. Это делается с помощью свойства поля ввода ПутьКДаннымКартинкиМножественногоЗначения. Затем в эту колонку заносятся нужные картинки. Пример такого кода приведен далее (картинка размещается в колонке КартинкаТаблицы):

Копировать в буфер обмена
Строка = Таблица.Добавить();
Строка.ЗначениеТаблицы = 1;
Строка.ПредставлениеТаблицы = "Первый элемент";
Строка.КартинкаТаблицы = БиблиотекаКартинок.Константа;
Строка = Таблица.Добавить();
Строка.ЗначениеТаблицы = 2;
Строка.ПредставлениеТаблицы = "Второй элемент";
Строка.КартинкаТаблицы = БиблиотекаКартинок.Справочник;
Строка = Таблица.Добавить();
Строка.ЗначениеТаблицы = 3;
Строка.ПредставлениеТаблицы = "Третий элемент";
Строка.КартинкаТаблицы = БиблиотекаКартинок.Документ;
Строка = Таблица.Добавить();
Строка.ЗначениеТаблицы = 4;
Строка.ПредставлениеТаблицы = "Четвертый элемент";
Строка.КартинкаТаблицы = БиблиотекаКартинок.Задача;

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

Рис. 329. Таблица значений. Картинки в поле ввода

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

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

Копировать в буфер обмена
&НаСервереБезКонтекста
Функция ПолучитьДобавляемыхСотрудников(МассивЗначений)
    ДобавляемыеСотрудники = Новый Массив;
    Для каждого Ссылка из МассивЗначений Цикл
   КартинкаСотрудника = Новый Структура("Сотрудник,Картинка", Ссылка);
   КартинкаСотрудника.Картинка = ПолучитьНавигационнуюСсылку(Ссылка, "Фотография");
   ДобавляемыеСотрудники.Добавить(КартинкаСотрудника);
    КонецЦикла;
    Возврат ДобавляемыеСотрудники;
КонецФункции
&НаКлиенте
Процедура СотрудникиДобавлениеМножественныхЗначений(Элемент, МассивЗначений, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    КартинкиСотрудников = ПолучитьДобавляемыхСотрудников(МассивЗначений);
    Для каждого КартинкаСотрудника из КартинкиСотрудников Цикл
   НовыйСотрудник = Сотрудники.Добавить();
   ЗаполнитьЗначенияСвойств(НовыйСотрудник, КартинкаСотрудника);
    КонецЦикла;
КонецПроцедуры

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

При использовании картинок в поле ввода с использованием множественных значений рекомендуется:

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

● Использовать картинки размером не более чем 128 на 128 точек. Если исходная картинка имеет большие размеры, то рекомендуется изменить ее размер с помощью метода ОбрабатываемаяКартинка.УстановитьРазмер().

● При указании картинок можно использовать любой поддерживаемый способ указания картинки:

● Указанием навигационной ссылки на реквизит объекта информационной базы.

● Указание адреса картинки во временном хранилище.

● Указание индекса картинки в коллекции картинок (свойство КартинкаМножественныхЗначений).

7.7.4.12.6. Таблица формы и поле ввода в режиме редактирования множественных значений

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

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

Должна получится следующая форма:

Рис. 330. Пример поля в таблице для списка значений

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

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

Копировать в буфер обмена
&НаКлиенте
Процедура НастройкаПравДоступаПриАктивизацииСтроки(Элемент)
    Если Элемент.ТекущиеДанные <> Неопределено Тогда
   Элемент.ТекущиеДанные.ПраваДоступа.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ПраваДоступа");
    КонецЕсли;
КонецПроцедуры

Если все сделано корректно, то при добавлении строки в таблицу НастройкаПравДоступа, права доступа будут редактироваться как на следующей картинке:

Рис. 331. Редактирование множественных значений в таблице

Если в качестве хранилища множественных значений в таблице формы выступает не список значений, а вложенная таблица формы, то все выполняется еще проще (модифицируем предыдущий пример):

1. Для реквизита НастройкиПравДоступа.ПраваДоступа установим тип (ТаблицаЗначений).

2. Для созданной таблицы значений создадим одну колонку с именем ПравоДоступа и типом СправочникСсылка.ПраваДоступа.

3. Удалим элемент формы НастройкаПравДоступа и перетащим наш модифицированный реквизит НастройкиПравДоступа на форму. Согласимся с тем, чтобы конфигуратор создал все элементы формы сам.

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

Форма должна иметь следующий вид:

Рис. 332. Пример поля в таблице для таблицы значений

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

7.7.4.12.7. Прочие механизмы управления полем ввода

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

Свойство

Описание поведения

ВыделятьОтрицательные

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

Доступность

Если для поля выключена доступность, то:

● Из представления значений убирается символ удаления («X»).

● Гиперссылки в представлениях недоступны для нажатия.

● Выделение недоступно.

● Контекстное меню недоступно.

● Недоступно открытие стандартного диалога редактирования списка значений.

Маска

Используется для ввода текстовых значений.

РежимПароля

Все отображаемые значения считаются паролями и отображаются в виде фиксированной строки, состоящей из 8 символов «*».

ТолькоПросмотр

Если для поля включен режим «только просмотр», то:

● Из представления значений убирается символ удаления («X»).

● Гиперссылки в представлениях доступны для нажатия.

● Недоступно удаление значений.

● При открытии стандартного диалога редактирования списка значений ‑ изменения списка недоступны.

Формат

Формирует представление значений типа Число, Дата, Булево.

ЦветТекста

Используется, если значение свойства ЦветТекстаМножественныхЗначений поля ввода установлено в значение Авто.

Шрифт

Используется, если значение свойства ШрифтМножественныхЗначений поля ввода установлено в значение Авто.

7.7.4.13. Автоматическое заполнение форм в веб-браузере или мобильном устройстве

На мобильных устройствах и в веб-браузерах существуют механизмы автоматического заполнения форм. Для автозаполнения доступны такие данные как ФИО, адрес, номер телефона, электронная почта и так далее. Для того, чтобы механизм автоматического заполнения форм «понял», какие данные в какое поле ввода формы можно предложить, поле ввода формы клиентского приложения обладает свойством ПодсказкаАвтоЗаполнения. Значение, указанное в этом свойстве, будет использоваться в веб-клиенте и на мобильном устройстве механизмами автозаполнения форм, а в тонком клиенте это значение будет игнорироваться. Платформа «1С:Предприятие» позволяет указать для поля ввода следующие варианты содержимого:

АдресЭлектроннойПочты ‑ адрес электронной почты пользователя.

Город ‑ имя города из адреса пользователя.

Имя ‑ имя пользователя.

ИмяПользователя ‑ логин пользователя.

Индекс ‑ почтовый индекс из адреса пользователя.

НеИспользовать ‑ не использовать механизм автоматического заполнения форм для данного поля.

НовыйПароль ‑ новый пароль.

НомерБанковскойКарты ‑ номер зарегистрированной банковской карты пользователя.

НомерТелефона ‑ номер телефона пользователя.

ОдноразовыйКод ‑ одноразовый код.

Отчество ‑ отчество пользователя.

Пароль ‑ текущий пароль.

ПолноеИмя ‑ полное имя пользователя мобильного устройства/веб-браузера.

ПрефиксИмени ‑ префикс имени пользователя.

Регион ‑ имя области из адреса пользователя.

Страна ‑ название страны из адреса пользователя.

СуффиксИмени ‑ суффикс имени пользователя.

Улица ‑ имя улицы из адреса пользователя.

Фамилия ‑ фамилия пользователя.

Под «пользователем» понимается (в описании возможных вариантов содержимого) пользователь мобильного устройства (как он указан при активации устройства) или пользователь веб-браузера (который используется для настройки веб-браузера), но не пользователь системы «1С:Предприятие».

7.7.5. Декорация

Представляет собой оформительский элемент формы. Декорация не связана с данными (реквизитами формы). Декорация может представлять собой надпись или картинку.

Текст, отображаемый декорацией вида Текст, может динамически переноситься (при сжатии или растяжении формы) при одновременном выполнении следующих условий:

● Текст содержит несколько слов, разделенных пробелами;

● Значение свойства декорации Растягивать по горизонтали в явном виде не установлено в значение Нет;

● Значение свойство декорации Высота установлено в значение 0;

● Значение свойства декорации Растягивать по вертикали в явном виде не установлено в значение Нет.

Декорация вида Картинка будет автоматически определять свой размер (по ширине и высоте) по установленной картинке, если соответствующее свойство декорации (Ширина или Высота, соответственно) установлено в значение 0.

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

7.7.6. Таблица

7.7.6.1. Общая информация

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

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

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

Свойства ЦветРамки и Рамка, заданные для колонки таблицы, не оказывают влияния на отображение колонки.

Для реквизита формы типа СписокЗначений существует выбор, каким образом реквизит будет отображаться. Если выбирается вариант Таблица, то список значений будет выглядеть как таблица с доступными колонками: Значение, Представление, Пометка и Картинка. При этом следует помнить об особенности отображения значений в колонке Значение. В этой колонке будет отображено значение колонки Представление. Само значение при этом остается неизменным. Если будет выбран тип Поле ввода, то для редактирования списка будет открыто специальное окно.

Также для таблицы, связанной с реквизитом типа СписокЗначений, предоставляется стандартный набор команд редактирования, включая команды установки и снятия пометок.

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

7.7.6.2. Отображение динамического списка

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

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

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

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

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

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

Если форма списка плана счетов или справочника с иерархией элементов открывается с установленными параметрами РазрешитьВыборКорня, равным Истина, и РежимВыбора, равным Истина, то для всех таблиц формы, связанных с основным реквизитом формы (типа ДинамическийСписок), будут автоматически изменены значения следующих свойств:

● свойство ОтображатьКорень будет установлено в значение Истина;

● свойство РазрешитьВыборКорня будет установлено в значение Истина;

● свойство Отображение будет установлено в значение Дерево.

7.7.6.3. Отображение картинок

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

В случае необходимости подмены стандартной картинки, следует:

1. Добавить в библиотеку картинок требуемую коллекцию картинок;

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

3. Добавить в текст запроса поле, имеющее значение индекса картинки.

Например:

Копировать в буфер обмена
ВЫБОР
    КОГДА Таблица.ПометкаУдаления ТОГДА 2
    КОГДА Таблица.Предопределенный ТОГДА 1
    ИНАЧЕ 0
КОНЕЦ КАК ИндексКартинки

4. Указать добавленное поле в свойстве ПутьКДаннымКартинкиСтроки таблицы, связанной с динамическим списком.

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

7.7.6.4. Управление высотой таблицы

Для управления высотой таблицы формы клиентского приложения предназначено свойство ВариантУправленияВысотойЭлемента:

В строках формы ‑ в этом случае высота таблицы задается с помощью свойства Высота таблицы управляемой формы. Если значение этого свойства равно 0, то высота таблицы будет равна 16 единицам для таблицы, отображающей динамический список и 8 единицам ‑ во всех остальных случаях. Для ограничения максимальной высоты таблицы формы необходимо использовать свойства АвтоМаксимальнаяВысота и МаксимальнаяВысота.

В строках таблицы ‑ в этом случае высота таблицы задается с помощью свойства ВысотаВСтрокахТаблицы таблицы управляемой формы. Если значение этого свойства равно 0, то высота таблицы будет равна 15 строкам для таблицы, отображающей динамический список и 7 строкам ‑ во всех остальных случаях. Для ограничения максимальной высоты таблицы используются свойства АвтоМаксимальнаяВысотаВСтрокахТаблицы и МаксимальнаяВысотаВСтрокахТаблицы.

По содержимому ‑ если таблица связана с динамическим списком, то высота таблицы задается значением свойства ВысотаВСтрокахТаблицы. Если значение этого свойства равно 0, то высота таблицы определяется значением свойства Высота.

Если таблица не связана с динамическим списком, то полностью отображаются все строки таблицы, но не менее 3.

Если свойство АвтоМаксимальнаяВысотаВСтрокахТаблицы установлено в значение Истина, то таблица отображает не более 50 строк. Если свойство АвтоМаксимальнаяВысотаВСтрокахТаблицы установлено в значение Ложь, то количество отображаемых строк в таблице ограничено значением свойства МаксимальнаяВысотаВСтрокахТаблицы. Если значение свойства МаксимальнаяВысотаВСтрокахТаблицы равно 0, то таблица не имеет ограничений по количеству отображаемых строк.

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

7.7.6.5. Управление прокруткой колонок

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

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

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

7.7.6.6. Поиск в таблице

Если таблица отображает данные типа ДинамическийСписок, то описание особенностей поиска см. здесь.

Поиск в таблице не оказывает влияния на содержимое свойства ДанныеФормыКоллекция.ОтборСтрок. Содержимое свойства ДанныеФормыКоллекция.ОтборСтрок не отображается дополнением элемента формы Состояние просмотра.

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

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

Использовать ‑ поиск при вводе символов выполняется для любых типов реквизитов, связанных с таблицей, если у колонки, в которой осуществляется ввод символов, свойство Режим редактирования установлено в значение Вход. Для поиска будет использоваться или строка поиска (если разрешено с помощью свойства таблицы Положение строки поиска, см. здесь) или форма поиска, если строка поиска запрещена в данной таблице.

Не использовать ‑ поиска при вводе символов не используется для любых типов реквизитов, связанных с таблицей.

При поиске используется следующий алгоритм:

● Строка поиска разбивается на слова. Строка поиска не должна быть длиннее 1 000 символов, а количество слов, полученных при разбиении, не должно быть больше 20. Разбиение выполняется по следующим правилам:

● Строка разбивается, используя символы пробела и табуляции в качестве разделителей.

● Затем обрабатывается каждый получившийся фрагмент:

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

● Иначе фрагмент разбивается далее, используя в качестве разделителей символы ",.-/\". В этом случае в качестве слова принимается каждый получившийся фрагмент строки.

● Для каждого слова формируется свой набор условий для каждой колонки таблицы, которые объединяются «по ИЛИ». Условия формируются в зависимости от типа колонки:

● Тип Строка. Слово ищется началу слова. Если в слове есть буквы и цифры, то:

● Последовательность, состоящая только из букв, считается отдельным словом.

● Последовательность, состоящая только из цифр, считается отдельным словом.

● Тип Число. Слово преобразуется к числу. Если преобразование выполнить невозможно ‑ поиск по полю выполняться не будет. Если преобразование завершилось успешно, то для поиска будет использоваться следующее условие: ЗначениеПоля >= Целое(Слово) И ЗначениеПоля<(Целое(Слово)+1). Для значений с ведущими нулями, поиск будет выполняться как по строке с ведущими нулями, так и по строке, указанной без ведущих нулей.

● Тип Булево. Проверяется равенство слова и локализованному представлению значения типа Булево (для языка локализации текущего сеанса).

● Тип Дата. Слово преобразуется к дате с автоматическим дополнением месяца и года. Значение поля будет проверяться на нахождение внутри дня, определенного полученной датой (ЗначениеПоля >= НачалоДня(Слово) И ЗначениеПоля<=КонецДня(Слово)).

● Для ссылочных полей выполняется поиск по началу слова в представлении ссылочного поля.

Набор условий для каждого слова объединяются «по И».

Элемент в таблице считается найденным (в том числе, если этот элемент содержит подчиненные), если выполняется хотя-бы одно условие:

● Если в нем есть все искомые слова.

● Если в нем есть хотя бы одно искомое слово, а остальные слова содержатся в его родителях, в первой видимой колонке, имеющей строковый или ссылочный тип.

Если после поиска в какой-либо строке произойдет изменение значения колонки, то строка не будет скрыта до тех пор, пока не будет изменено поисковое значенеие и поиск не будет повторен.

Если в таблице установлен поисковый отбор, то в таблице будут недоступны команды перемещения текущего элемента таблицы вверх и вниз.

7.7.6.7. Определение текущей строки таблицы

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

Начало ‑ в качестве текущей будет первая строка списка.

Конец ‑ в качестве текущей будет последняя строка списка.

Авто ‑ текущая строка списка определяется типом данных, отображаемых таблицей. Переход в конец списка будет выполняться для таблицы, которая отображает динамический список, в котором первым полем в списке сортировке выступает поле Дата или Период. Динамический список должен обрабатывать следующие данные: списки документов, бизнес-процессов и задач, журналы документов, записи регистров бухгалтерии, расчета, накопления и периодических регистров сведений. В остальных случаях текущей строкой будет первая строка таблицы.

Если при обновлении таблицы изменяется состав отображаемых строк в отображаемой области, то поведение зависит от того, какой состав строк перестал отображать:

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

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

7.7.7. Кнопка

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

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

Если кнопка, связанная с командой, размещена в командной панели, то ее размещение регулируется свойством Положение в командной панели (ПоложениеВКомандойПанели):

В дополнительном подменю ‑ кнопка размещена только в дополнительном подменю Еще.

В командной панели ‑ кнопка размещается только в командной панели.

В командной панели и дополнительном подменю ‑ кнопка размещена одновременно и в командной панели и в меню Еще (если оно есть в командной панели).

Авто ‑ положение выбирается системой автоматически, в зависимости от команды и вида клиентского приложения.

Меню Еще в командной панели формируется в следующих случаях:

● В командной панели есть команды, для которых указано размещение В дополнительном подменю.

● В текущие размеры командной панели не поместились команды с размещением В командной панели и дополнительном подменю.

Пользователь имеет возможность изменить размещение кнопки с помощью редактора настройки формы, который доступен в режиме «1С:Предприятия» с помощью команды формы Еще ‑ Изменить форму.

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

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

● Свойство Положение в командной панели устанавливаем в значение В командной панели. Теперь требуемая команда оказалась сразу видимой и пропала из меню Еще.

● Сбрасываем свойство Уникальность команды. В результате команда снова появилась в том месте меню, в котором она размещалась по умолчанию.

Получившийся вид формы приведен на рисунке.

Рис. 333. Уникальность команды для кнопки формы

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

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

Кнопка может иметь несколько режимов отображения (свойство Отображение). Если выбрано отображение Картинка и текст, то картинка, расположенная на кнопке, может располагаться слева или справо относительно текста кнопки. Для управления этим расположением предназначено свойство кнопки Положение картинки (доступно для кнопки формы и кнопки командной панели). Если данное свойство установлено в значение Авто, то картинка будет рсполагаться с левой стороны текста.

Рис. 334. Положение картинки кнопки

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

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

Рис. 335. Фигура кнопки

Данное свойство может принимать следующие значения:

Авто ‑ в этом случае для стандартных команд используется значение, указанное для команды. Для остальных команд значение трактуется как Обычная.

Обычная, Овал ‑ форма кнопки соответствует значению (рис. 335).

Задавать фигуру кнопки можно для кнопок, расположенных на форме и в командной панели. Свойство не действует на команды, расположенные в подменю.

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

Рис. 336. Отображение фигуры кнопки

Для отображения фигуры кнопки можно указать несколько различных способов:

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

Всегда ‑ в этом случае фигура кнопки отображается всегда (первая строка в примере на рис. 336).

При активности ‑ в этом случае в обычном состоянии кнопка отображается без фона и рамки (вторая строка в примере на рис. 336). В том случае, если курсор мыши указывает на кнопку, на ней установлен фокус ввода или у кнопки установлено свойство Пометка ‑ отображается стандартная кнопка с заданными цветами рамки и фона.

Нет ‑ в этом случае в обычном состоянии кнопка отображается без фона и рамки. При наведении курсора у текста появляется подчеркивание (третья строка в примере на рис. 336) и изменяется курсор мыши. Свойство Пометка никак не отображается в этом варианте отображения.

Свойство определяет отображение для кнопок, расположеных на форме и в командных панелях. Свойство Отображение фигуры не действует на команды, расположенные в подменю.

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

Обычная кнопка, Кнопка командной панели ‑ в этом случае кнопка отображается обычным образом;

Гиперссылка, Гиперссылка командной панели ‑ в этом случае кнопка отображается в виде гиперссылки.

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

7.7.8. Группа

7.7.8.1. Общая информация

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

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

В редакторе можно создать группы следующих видов:

Обычная группа ‑ предназначена для объединения элементов формы. Более подробное описание обычной группы см. здесь.

Командная панель ‑ элемент формы, предназначенный для размещения кнопок и групп. Более подробное описание обычной группы см. здесь.

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

Группа колонок ‑ позволяет объединять колонки в таблице. С помощью группы этого вида можно изменять правило группировки колонок (вертикальная или горизонтальная группировка).

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

7.7.8.2. Обычная группа

Обычная группа может обладать различными вариантами оформления:

Нет ‑ группа специально никак не выделяется;

Слабое выделение ‑ заголовок группы отображается большим шрифтом зеленого цвета;

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

Сильное выделение ‑ заголовок группы отображается большим шрифтом зеленого цвета. С левой стороны (на всю высоту группы) формируется полоса зеленого цвета. Снизу формируется отступ.

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

Обычную группу можно настроить таким образом, что пользователь (в режиме «1С:Предприятия») сможет сворачивать или разворачивать такую группу. Например, можно разместить в сворачиваемой группе информацию, которая не важна при регулярной работе с формой, но иногда может потребоваться для просмотра и анализа.

Поведение группы определяется свойством Поведение:

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

● Свертываемая группа. Для такой группы свойство Поведение установлено в значение Свертываемая. Такая группа может быть свернута или развернута пользователем в режиме «1С:Предприятие». Прикладной разработчик не может определить текущее состояние группы из встроенного языка. Также он не может принудительно свернуть или развернуть группу. Начальное состояние группы определяется флажком Свернута. Группа не может быть свернута или развернута, если у нее не отображается заголовок или заголовок не заполнен.

Рис. 337. Свернутая/развернутая группа

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

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

При нажатии на заголовок такой группы, она «всплывает» над родительской формой в специальном окне. В каждый момент времени на форме может быть только одна всплывающая группа. Из этого вытекает, что всплывающие группы не могут быть вложенными. Вложенная всплывающая группа будет отображаться как свертываемая группа. Отображение и скрытие всплывающей группы не требует серверного вызова.

Рис. 338. Всплывающая группа

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

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

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

● Отобразить группу. Используется метод расширения группы управляемой формы Показать(). При вызове этого метода:

● Обычная группа никак не реагирует. Ошибка не генерируется.

● Свертываемая группа разворачивается. Активный элемент формы не меняется.

● Всплывающая группа показывается. Активным становится первый элемент всплывающей группы.

● Скрыть группу. Используется метод расширения группы управляемой формы Скрыть(). При вызове этого метода:

● Обычная группа никак не реагирует. Ошибка не генерируется.

● Свертываемая группа сворачивается. Активный элемент формы не меняется.

● Всплывающая группа скрывается. Активной становится картинка перед заголовком всплывающей группы.

● Получить состояние группы. Используется метод расширения группы управляемой формы Скрыта(). При вызове этого метода:

● Для обычной группы всегда возвращается Ложь.

● Для свертываемой и всплывающей группы возвращается Истина, если группа свернута или не показывается (соответственно). Ложь возвращается в противном случае.

7.7.8.3. Командная панель

Свойство командной панели Источник команд определяет элемент формы (Форма, а также элементы формы типа Таблица и поля вида Поле табличного документа или Поле графической схемы), который предоставит «свои» команды для отображения в командной панели. Состав команд для отображения в командной панели регулируется свойством Состав команд элемента формы, являющегося источником команд.

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

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

Подменю ‑ группа, которая позволяет делать выпадающие меню.

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

● группа кнопок отделяется разделителями слева и справа;

● каждая группа кнопок может обладать собственным источником команд;

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

Рис. 339. Расположение кнопок группы

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

7.7.8.4. Особенности использования групп формы

Свойство Только просмотр группы влияет на все элементы, подчиненные группе.

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

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

Любая группа кнопок (командная панель, подменю, группа кнопок, контекстное меню) заполняется по одинаковым правилам. Кнопки будут отображены в следующем порядке:

1. Кнопки, предоставляемые источником команд, с которым связана данная группа.

2. Кнопки командного интерфейса, если источник команд подразумевает его включение.

3. Пользовательские команды, добавленные в данную группу.

4. Команды меню Еще (Все действия) (только для командной панели).

5. Последней будет размещена Справка (в том случае если она была предоставлена источником команд).

Если вышеприведенный автоматический порядок расположения кнопок в группе не устраивает, то можно воспользоваться следующими возможностями:

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

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

● Можно вручную поместить кнопку, связанную со стандартной командой источника команд, в необходимое место командной панели. В этом случае соответствующая команда не будет использоваться при автоматическом размещении команд источника в текущей командной панели, а останется на том месте, куда ее разместили вручную.

7.7.9. Дополнение элемента формы

7.7.9.1. Общая информация

Дополнение элемента формы предназначено для отображения дополнительных свойств элемента формы (дополнения элемента формы) и управления этими элементами. Дополнения элемента формы поддерживаются для элементов формы Таблица и Поле PDF документа. Доступны следующие дополнения:

Дополнение

Элемент формы

Описание

Отображение строки поиска

Таблица

Позволяет настроить отображение строки поиска.

Состояние просмотра

Таблица

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

Поле PDF документа

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

Управление поиском

Таблица

Позволяет настроить внешний вид кнопки управления поиском.

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

7.7.9.2. Дополнения для элемента таблица

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

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

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

Положение строки поиска ‑ определяет положение строки поиска. Может принимать следующие значения: Авто, Командная панель, Нет, Верх, Низ.

Рис. 340. Строка поиска в таблице

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

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

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

Строка поиска, размещенная в командной панели, всегда прижимается к правому краю командной панели (вместе с кнопками, расположенными правее строки поиска).

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

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

Значение Авто интерпретируется как Нет (если таблица отображает дерево или список значений) и Командная панель во всех остальных случаях.

Переход к строке поиска осуществляется следующим образом:

● Нажатием сочетания клавиш Ctrl + F;

● Мышью;

● При начале набора текста в таблице (подробнее см. здесь).

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

Рис. 341. Состояние поиска в таблице

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

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

Значение Авто интерпретируется как Верх.

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

Рис. 342. Управление поиском в таблице

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

Значение Авто интерпретируется как Командная панель (если таблица отображает динамический список) и Нет во всех остальных случаях.

Если на форме присутствуют несколько командных панелей, источником команд для которых является одна таблица формы клиентского приложения, то строка поиска и кнопка управления поиском будет располагаться только в одной командной панели:

● Или в командной панели самой таблицы (если для нее включено автоматическое заполнение)

● Или в любой из оставшихся командных панелей.

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

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

Так, для того, чтобы поставить отображение строки поиска в зависимость от включения полнотекстового поиска (строка поиска отображается только при включенном полнотекстовом поиске), следует пример, подобный следующему:

Копировать в буфер обмена
НастройкаОбъект = Новый НастройкиОтображенияДинамическогоСписка;
НастройкаОбъект.РежимОтображенияСтрокиПоиска = РежимОтображенияСтрокиПоискаДинамическогоСписка.ОтображатьПриИспользованииПолнотекстовогоПоиска;
ХранилищеСистемныхНастроек.СохранитьНастройкуПоУмолчанию("Общее/НастройкиОтображенияДинамическихСписков", НастройкаОбъект);

В данном примере выполняется сохранение настройки по умолчанию.

Смотри также:

● Настройки по умолчанию (см. здесь).

● Системное хранилище настроек динамического списка (см. здесь).

7.7.9.3. Дополнение для элемента поля PDF-документа

PDF-документ содержит различную дополнительную информацию: наличие и состояние подписей, признак сохранения в архивных форматах (PDF/A) и т. д. Для отображения этой дополнительной информации служит дополнение элемента формы Состояние просмотра поля элемента формы Поле PDF Документа. Положение дополнения регулируется свойством элемента формы Положение состояния просмотра:

Верх ‑ состояние просмотра будет расположено непосредственно над полем PDF-документа.

Низ ‑ состояние просмотра будет расположено непосредственно после поля PDF-документа (по высоте).

Нет ‑ состояние просмотра не отображается в форме.

Авто ‑ трактуется как Верх.

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

7.7.10. Специальные командные панели

Кроме создания собственных командных панелей (элемент формы Группа вида Командная панель) редактор форм предоставляет возможность работать со специализированными командными панелями:

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

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

Командная панель таблицы ‑ системой автоматически предоставляется командная панель для элемента формы вида Таблица. Ее видимостью, положением и наполнением можно управлять. Видимость и положение панели управляются с помощью свойства командной панели Выравнивание, а содержимое управляется свойством Автозаполнение.

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

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

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

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

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

● Разместить в командной панели элемент Группа ‑ Командная панель.

● Выбрать у этой группы в качестве источника команд Глобальные команды командной панели формы.

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

При установке (из встроенного языка) в качестве текущего элемента кнопки какой-либо командной панели, следует помнить, что фокус будет установлен на первую кнопку командной панели, а не на ту кнопку, которую используют в операции установки текущего элемента: ЭтотОбъект.ТекущийЭлемент = Элементы.КнопкаКоманднойПанели;. Также следует помнить, что свойство кнопки АктивизироватьПоУмолчанию игнорируется при размещении кнопки в командной панели. Если пользователь перемещает кнопку из командной панели на форму, то данное свойство начинает использоваться.

Если в процессе контекстного серверного вызова в форме выполнены следующие изменения: изменена структура данных; добавлены или удалены команды формы; добавлены, удалены или перемещены элементы формы; изменены параметры таблиц управляемой формы, то будет выполнено перезаполнение стандартных командных панелей и групп. При этом:

● все пользовательские команды, вставленные в такие панели и группы, будут удалены;

● измененные параметры стандартных команд будут установлены в значения по умолчанию.

7.7.11. Условное оформление формы

Форма позволяет устанавливать оформление элементов формы в зависимости от значений реквизитов формы. Эта возможность называется условное оформление. Настройка условного оформления выполняется аналогично настройке условного оформления системы компоновки данных. Вызов настройки условного оформления доступен из панели свойств корневого элемента формы. Не рекомендуется использовать условное оформление формы для оформления динамических списков, если такое оформление можно получить за счет настройки условного оформления самого списка. Условное оформление может применяться к элементам формы, полям таблицы формы и элементам поля ввода в режиме редактирования множественных значений. В данном разделе последний вариант будет для сокращения называться «множественное значение поля ввода». Для полей, которые поддерживают такой режим работы, в редакторе условного оформления будет доступен подчиненный элемент МножественноеЗначение. Условное оформление поля ввода в режиме редактирования множественных значений не поддерживается в таблицах формы и в динамических списках.

Доступны следующие виды условного оформления:

Цвет фона ‑ позволяет изменять цвет фона и применяется для:

● Элементов формы: поле ввода, множественное значение поля ввода, поле текстового документа, таблица, обычная кнопка.

● Полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки.

Цвет текста ‑ позволяет изменять цвет текста и применяется для:

● Элементов формы: поле надписи, поле ввода, множественное значение поля ввода, поле текстового документа, поле картинки, поле переключателя, таблица, обычная кнопка, гиперссылка, декорация-текст, декорация-картинка.

● Полей таблицы: поле надписи, поле ввода, поле переключателя.

Шрифт ‑ позволяет изменять шрифт и применяется для:

● Элементов формы: поле надписи, поле ввода, множественное значение поля ввода, поле текстового документа, поле картинки, поле переключателя, поле календаря, таблица, обычная кнопка, гиперссылка, декорация-текст, декорация-картинка.

● Полей таблицы: поле надписи, поле ввода.

Примечание. Изменение шрифта элемента формы, выполненное с помощью условного оформления, не учитывается при определении размера элементов.

Выделять отрицательные ‑ позволяет задать выделение отрицательных значений. Применяется для:

● Элементы формы: поле надписи, поле ввода.

● Поля таблицы: поле надписи, поле ввода.

Горизонтальное положение ‑ задает горизонтальное положение значения и применяется для:

● Элементов формы: поле надписи, поле ввода, декорация-текст.

● Полей таблицы: поле надписи, поле ввода.

Отметка незаполненного ‑ позволяет задать отметку незаполненного значения и применяется для:

● Элементов формы: поле ввода, таблица.

● Полей таблицы: поле ввода.

Совет. Если управление свойством Отметка незаполненного выполняется с помощью условного оформления, то рекомендуется для оформляемого поля установить свойство Автоотметка незаполненного в значение Нет.

Текст ‑ используется для задания текста и применяется для:

● Поля таблицы: поле надписи, поле ввода, множественное значение поля ввода.

Формат ‑ позволяет изменить формат вывода значения и применяется для:

● Элементов формы: множественное значение поля ввода, группа вида Страница, группа вида Обычная группа.

● Полей таблицы: поле надписи, поле ввода.

Видимость ‑ используется только для отключения видимости колонок таблицы: поле надписи, поле ввода, поле переключателя, поле картинки. Место ячеек с отключенной видимостью занимают соседние ячейки за счет изменения своего размера. Алгоритм растягивания ячеек может различаться в различных клиентских приложениях.

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

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

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

Доступность ‑ используется только для отключения доступности:

● Элементов формы: множественное значение поля ввода.

● Полей таблицы: поле надписи, поле ввода, множественное значение поля ввода, поле переключателя, поле картинки.

Только просмотр ‑ используется только для включения режима Только просмотр для:

● Элементов формы: множественное значение поля ввода.

● Полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки.

Отображать ‑ используется только для того, чтобы отключить отображение значения в колонке таблицы следующего вида: поле надписи, поле ввода, поле переключателя, поле картинки. Этот вид условного оформления рекомендуется использовать в том случае, когда необходимо скрыть колонку таблицы, которая расположена в группе колонок с группировкой В ячейке. Если необходимо скрывать колонки, которые не группируются с другими колонками или при группировке сохраняют отображение в отдельных колонках таблицы, то следует использовать вид условного оформления Видимость.

Примечание. Для условного оформления используется текущая дата компьютера, скорректированная с учетом часового пояса сеанса «1С:Предприятия». Подробнее про часовые пояса см. здесь.

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

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

Рассмотрим пример условного оформления.

Допустим, нам необходимо в документе Расход товара выделить те строки табличной части, в которых количество менее 10 штук.

Для этого нужно в условном оформлении формы задать следующие условия:

● Вид условного оформления ‑ цвет текста. В качестве значения цвета выберем Особый текст из стиля.

● В качестве условия выберем следующее выражение: Объект.Товары.Количество Меньше "10". В этом выражении Объект ‑ основной реквизит формы, Товары ‑ табличная часть, Количество ‑ реквизит табличной части.

● В качестве оформляемых полей выберем всю табличную часть Товары.

Рис. 343. Настройка условного оформления

Результат работы условного оформления можно увидеть на рис. 344.

Рис. 344. Результат условного оформления

Таким образом, цвет шрифта первой строки табличной части стал красным, т. к. количество товара в этой строке меньше 10.

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

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

В этом случае будет выделено только одно поле:

Рис. 345. Оформление одного поля табличной части

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

7.7.12. Особенности поведения элементов формы

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

Элементы управляемой формы, связанные со стандартными реквизитами Ссылка и Проведен, недоступны для изменения.

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

● Стилевые шрифты системы «1С:Предприятие»:

● Мелкий шрифт текста,

● Обычный шрифт текста,

● Крупный шрифт текста,

● Очень крупный шрифт текста.

● Векторные шрифты из состава пакета «MS Core Fonts»:

● Andale Mono,

● Arial,

● Arial Black,

● Comic Sans MS,

● Courier New,

● Georgia,

● Impact,

● Times New Roman,

● Trebuchet MS,

● Verdana,

● Webdings.

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

Поведение полей формы вида надпись, картинка, декорация-надпись, декорация-картинка не зависят от установки режима ТолькоПросмотр (как для конкретных элементов формы, так и для формы в целом).

Если у реквизита формы типа Число свойства Длина и Точность заданы одинаковыми значениями, то поле ввода позволяет ввести любое число, но при попытке покинуть поле ввода будет выдано сообщение о некорректном вводе, если введенное значение не находится в диапазоне от ‑1 до 1 (исключая ‑1 и 1).

Если в обработчике ПриИзменении поля, расположенного в таблице формы, выполняются действия, которые ведут к вызову сервера и перестроению формы, то обработчики событий этой таблицы ПриОкончанииРедактирования и ПередОкончаниемРедактирования не будут вызваны.

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

Если для поля ввода или поля надписи свойство Высота установлено в значение большее, чем 1, и свойство Растягивать по вертикали установлено в значение Авто, то это значение будет трактоваться как Истина, т. е. указанные элементы формы будут растягиваться по вертикали.

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

● фиксированного значения, заданного в платформе;

● значение свойства ШиринаВыпадающегоСписка расширения поля управляемой формы для поля ввода.

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

● размер экрана для тонкого клиента;

● размер формы для веб-клиента.

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

7.7.13. Правила размещения элементов формы

7.7.13.1. Общая информация

Элементы формы размещаются в прямоугольной логической сетке. Данная сетка является иерархической, при этом самым верхним уровнем логической сетки выступает сетка, заданная для формы, а в ячейке логической сетки формы может образовываться своя логическая сетка, если элементом формы, который находится в этой ячейке, является группа типа Обычная группа или группа типа Страница. Собственно форма, группа типа Обычная группа и группа типа Страница далее будут называть группирующим элементом формы. Ширина ячейки логической сетки определяется шириной элемента формы, расположенной в этой ячейке, а высота ‑ логической строкой. Понятие «логическая строка» не описывается определенными числовыми параметрами. Проще всего показать это понятие на примере. Для этого создадим форму со следующей структурой:

Рис. 346. Структура формы

В редакторе видны следующие элементы:

● Собственно форма с установленной вертикальной группировкой и отключенной командной панелью формы.

● Группа без отображения Группа1 с горизонтальной группировкой. В этой группе размещены элементы Элемент1 и Элемент3.

● Группа без отображения Группа2 с горизонтальной группировкой. В этой группе размещены элементы Элемент2 и Элемент4.

Для некоторого уменьшения размера рисунка, для таблицы Элемент3 уменьшена высота таблицы. На работу алгоритма размещения элементов (в данном примере) данное изменение не влияет.

Рис. 347. Понятие логической сетки

На рис. 347 изображены 2 строки логической сетки. В первой строке расположены элементы Элемент 1 и Элемент 3, а во второй ‑ Элемент 2 и Элемент 4. Легко заметить, что каждая из описанных строк будет иметь разную высоту. Но, тем не менее, в логической сетке формы будет использоваться именно две строки. Таким образом, высота строки логической сетки вычисляется по высоте самого высокого элемента из всех, которые расположены на одной горизонтали. Для первой строки высота будет определяться по высоте элементов Элемент 1 и Элемент 3, а для второй строки ‑ по высоте элементов Элемент 2 и Элемент 4.

Также необходимо отметить, что каждая строка у формы имеет свою ширину ячейки. Это происходит потому, что элементы Элемент 1 и Элемент 3 располагаются в одном группирующем элементе, а Элемент 2 и Элемент 4 ‑ в другом группирующем элементе. В рамках каждого группирующего элемента размещение элементов выполняется обособленно.

Таким образом, видно, что в данном примере имеется три логических сетки:

1. Логическая сетка формы. Для данного примера задается сетка 2 x 1: два элемента (группы) с вертикальной группировкой, заданной для формы.

2. Логическая сетка группы с элементами Элемент 1 и Элемент 3. Эта группа определяет сетку 1 x 2: два элемента (Элемент 1 и Элемент 3) в группе с горизонтальной группировкой для группы. Эта сетка вложена в логическую сетку уровня формы.

3. Логическая сетка группы с элементами Элемент 2 и Элемент 4. Эта группа определяет сетку 1 x 2: два элемента (Элемент 2 и Элемент 4) в группе с горизонтальной группировкой для группы. Эта сетка также вложена в логическую сетку уровня формы.

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

● По возможности использовать значения по умолчанию для свойств элементов.

● Минимизировать явное указание размеров элементов формы.

В общем случае можно определить правила размещения элементов формы следующим образом:

● Элементы формы размещаются по двум направлениям:

● Горизонтальное направление ‑ каждый новый элемент формы располагается правее предыдущего. Такую группу можно представить как матрицу 1 x N, где N ‑ количество элементов в группе.

● Вертикальное направление ‑ каждый новый элемент формы располагается ниже предыдущего. Такую группу можно представить как матрицу N x 1, где N ‑ количество элементов в группе.

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

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

● Порядок отображения элементов определяется порядком их следования на закладке Элементы редактора формы.

● Имеется возможность влиять на размещение элементов с помощью следующих параметров:

● Горизонтальный и вертикальный интервал размещения элементов;

● Размер элементов;

● Выравнивание элементов;

● Возможность растягивать элементы по горизонтали и вертикали;

● И т. д.

● Область размещения элементов ограничена размером окна, в котором формируется форма. Размер окна ограничен размерами рабочей области основного окна или параметрами экрана. Если в результате размещения совокупный размер элементов превысит размер окна, отведенного форме по соответствующей координате (вертикальной или горизонтальной), то в форме появятся линейки прокрутки.

● Правила размещения элементов внутри группы эквивалентны правилам размещения внутри формы.

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

Формирование формы, в том виде, как она отображается пользователю, состоит из двух этапов:

1. На сервере:

● Система получает дерево элементов формы.

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

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

● Получившееся описание формы передается на сторону клиента.

2. На клиенте:

● Клиентское приложение определяет характеристики экрана, на котором будет отображаться форма: ориентация, размеры, используемые шрифты и т. д.

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

● Полученная «почти форма» преобразуется в реальный набор элементов управления целевой платформы (тонкий клиент, толстый клиент, веб-клиент, мобильное устройство) и отображается пользователю.

Особенности размещения элементов формы в режиме совместимости с версией 8.3.6 и ниже, рассмотрены в документации к «1С:Предприятию» версии 8.3.6 (http://its.1c.ru/db/v836doc/bookmark/dev/TI000000404).

7.7.13.2. Группы и объединение элементов формы

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

Командная панель ‑ управление группировкой недоступно.

Страница ‑ позволяет управлять группировкой элементов.

Обычная группа ‑ позволяет управлять группировкой элементов.

Группа колонок ‑ позволяет управлять группировкой элементов (колонок таблицы формы).

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

Рис. 348. Вертикальная группировка

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

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

Рис. 349. Горизонтальная группировка

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

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

Рис. 350. Исходное расположение колонок

Однако в нашем списке необходимо сделать так, чтобы код и артикул располагались в две строки, один под другим. Для этого необходимо создать группу колонок, подчиненную элементу Список, и задать ему имя КодИАртикул (например). Затем для группы колонок следует задать вертикальную группировку.

Рис. 351. Вертикальная группировка колонок

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

● Для группы колонок КодИАртикул задать свойство Заголовок;

● Затем для этой же группы установить свойство Отображать в шапке;

● Последним шагом следует установить свойство Отображать заголовок.

В результате получится следующая форма:

Рис. 352. Заголовок группы

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

● Необходимо выделить элементы Код и Артикул;

● Сбросить флажок Отображать в шапке. Эту операцию можно проделать и для каждого элемента отдельно (без выделения сразу двух элементов).

В результате получится следующая форма:

Рис. 353. Отображение только заголовка группы

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

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

7.7.13.3. Размеры элементов формы

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

● Для управления шириной элемента:

Ширина ‑ ширина элемента.

АвтоМаксимальнаяШирина ‑ признак того, что система автоматически рассчитывает максимальную ширину данного элемента. Существует не у всех элементов.

МаксимальнаяШирина ‑ максимальная ширина элемента, указанная прикладным разработчиком. Существует не у всех элементов.

● Для управления высотой элемента:

Высота ‑ высота элемента.

АвтоМаксимальнаяВысота ‑ признак того, что система автоматически рассчитывает максимальную высоту данного элемента. Существует не у всех элементов.

МаксимальнаяВысота ‑ максимальная высота элемента, указанная прикладным разработчиком. Существует не у всех элементов.

● Также следует упомянуть, что на линейные размеры элемента оказывает влияние значения свойств РастягиватьПоГоризонтали и РастягиватьПоВертикали.

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

Реальный размер элемента формы в режиме 1С:Предприятие может не совпадать с указанными размерами. При определении размеров элементов система учитывает шрифт (и его размеры), указанный в свойствах элементов формы.

Примечание. Изменение шрифта элемента формы, выполненное с помощью условного оформления, не учитывается при определении размера элементов.

Вычисление размера элемента по любой оси зависит от состояния растягивания по этой оси:

● Растягивание выключено:

● Явно указанное свойство Ширина (Высота) определяет размер элемента. В этом случае свойства, определяющие максимальный размер элемента, игнорируются.

● Свойство Ширина (Высота) установлено в значение 0. Это означает автоматическое определение размера элемента. В этом случае размер элемента по соответствующему измерению определяется по содержимому элемента. При этом размер элемента не может быть больше максимального размера. Максимальный размер элемента по соответствующей оси может быть указан как вычисляемый автоматически (свойства АвтоМаксимальная…) так и явно задан вручную (свойства Максимальная…).

● Растягивание включено:

● Явно указанное свойство Ширина (Высота) определяет «весовой» коэффициент растягивания/сжатия.

● Свойство Ширина (Высота) установлено в значение 0. Это означает автоматическое определение размера элемента. Система подберет подходящий размер исходя из типа данных, содержимого и других параметров. При этом размер элемента не может быть больше максимального размера. Максимальный размер элемента по соответствующей оси может быть указан как вычисляемый автоматически (свойства АвтоМаксимальная…) так и явно задан вручную (свойства Максимальная…).

● Если максимальная ширина или высота элемента установлена в значение 0, то по соответствующему измерению элемент может изменять размер неограниченно.

● При определении ширины поля ввода действуют следующие особенности:

● Если свойство МаксимальнаяШирина задано явно (свойство АвтоМаксимальнаяШирина выключено), то оно определяет максимальную ширину в символах. При этом, например, кнопки поля ввода входят в эту ширину.

● Если свойство АвтоМаксимальнаяШирина включено, то максимальная ширина определяется в зависимости от типа поля ввода, и кнопки также входят в неё для лучшего выравнивания по правой границе. Свойство Ширина в этом случае работает по-другому: если оно равно 0, то определяется ширина в зависимости от типа поля ввода, и к ней прибавляется количество включенных кнопок.

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

7.7.13.4. Растягивание групп

Изменение размеров обычной группы (растягивание) зависит от элементов, входящих в группу и от значений свойств Растягивать по вертикали и Растягивать по горизонтали:

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

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

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

7.7.13.5. Ширина и высота групп

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

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

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

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

7.7.13.6. Управление расстоянием между элементами

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

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

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

На рисунке ниже приведен пример двух предельных вариантов установки вертикального интервала между элементами.

Рис. 354. Различный вертикальный интервал

7.7.13.7. Выравнивание элементов формы

7.7.13.7.1. Общая информация

Элемент формы состоит из области данных ‑ области элемента формы, в которой отображаются данные, и области заголовка (заголовок) ‑ области элемента формы, которая отображает заголовок (см. рис. 355). Стандартная ширина области данных определяет ширину области данных и обладает следующими свойствами:

● определяется типом данных реквизита, связанных с элементом формы или свойством Ширина элемента формы;

● не зависит от свойства элемента формы Растягивать по горизонтали.

Рис. 355. Структура элемента формы

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

Рис. 356. Базовая линия для выравнивания

7.7.13.7.2. Выравнивание в рамках группы

В рамках группирующего элемента выравнивание границ компонентов элемента формы определяется свойством Выравнивание элементов и заголовков. Данное свойство позволяет задать следующие варианты выравнивания:

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

Рис. 357. Выравнивание: нет

Элементы лево, заголовки лево. Это режим выравнивания, который применялся в «1С:Предприятие» версии 8.3.6 и младше. В этом случае заголовки полей выравниваются по левой границе группирующего элемента. Области данных также выравниваются по левой границе.

Рис. 358. Выравнивание: лево-лево

Элементы право, заголовки лево. В этом случае заголовки полей выравниваются по своей левой границе, а данные ‑ по правой границе.

Рис. 359. Выравнивание: право-лево

● Элементы лево, заголовки право. В этом случае заголовки выравниваются по правой границе, а данные ‑ по левой.

Рис. 360. Выравнивание: лево-право

● Элементы право, заголовки право. В этом случае все части элемента формы выравниваются по правой границе «своей» области.

Рис. 361. Выравнивание: право-право

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

Рис. 362. Сквозное выравнивание по умолчанию

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

Рис. 363. Сквозное выравнивание. Снизу «Использовать»

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

Сквозное выравнивание не используется для групп, свойство Поведение которых установлено в значение, отличное от Обычная.

7.7.13.7.3. Выравнивание между группами

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

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

В результате получается следующая форма:

Рис. 364. Выравнивание между группами

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

Для решения этой проблемы предназначено свойство группы формы Объединенная группа. Рассмотрим, как действует данное свойство.

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

Если у группы выключить данное свойство, то механизм размещения элементов будет анализировать все элементы такой группы как отдельные элементы. Так, если отключить данное свойство у группы ГруппаДействий (на рис. 365), то форма приобретет следующий вид:

Рис. 365. Выравнивание между группами

Подробнее остановимся на том, что изображено на рис. 366. Основной вопрос заключается в следующем: почему первая строка из элемента ГруппаДействие по высоте заняла столько же, сколько и весь элемент ГруппаОписаний?

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

После того, как у элемента ГруппаДействие был сброшен флажок Объединенная группа, группа перестала восприниматься механизмом размещения как единое целое. Каждый элемент группы учитывается отдельно. Но для элемента ГруппаОписание флажок Объединенная группа по-прежнему установлен. Это значит, что механизм размещения считает, что элемент Действие1 и элемент ГруппаОписание расположены в одной строке, и высота этой строки соответствует высоте элемента ГруппаОписание.

Если теперь сбросить флажок Объединенная группа у элемента ГруппаОписание, то форма станет выглядеть следующим образом:

Рис. 366. Выравнивание между группами

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

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

● Свойство установлено ‑ группа считается единым элементом;

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

Кроме этого, группа, у которой сброшено свойство Объединенная группа (группа становится «разъединенной»), обладает следующими особенностями:

● Из всех свойств группы используются только следующие свойства: Группировка, Цвет фона, Отображать заголовок и Отображение (для определения параметров определения заголовка группы). Свойство Группировка используется для определения порядка размещения элементов текущей группы в родительском группирующем элементе.

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

● Не формируются разделители (см. здесь).

7.7.13.7.4. Управление относительным расположением элементов

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

Для организации такого расположения существуют несколько свойств:

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

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

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

Рис. 367. Управление относительным расположением

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

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

7.7.13.8. Разделители элементов

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

Рис. 368. Разделитель

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

1. Оба разделяемых элемента растягиваются в соответствующем направлении.

2. Между разделяемыми элементами нет других элементов (они располагаются рядом).

3. Высота каждого их разделяемых элементов не менее 2 строк.

4. Значение свойства Ширина (или Высота, в зависимости от ориентации разделителя) каждого из разделяемых элементов формы больше минимальной ширины (высоты) и меньше максимальной ширины (высоты) элемента формы. Максимальные размеры задаются с помощью свойств Максимальная… или АвтоМаксимальная…. Минимальная ширина и высота автоматически определяются платформой.

5. Ни один из разделяемых элементов не является надписью с автоматическим переносом текста.

6. Размер соответствующего интервала между элементами родительской группы (или формы) достаточен для размещения разделителя.

7. У родительской группы (или формы) нет дочерних элементов типа Группа вида Обычная группа с выключенным свойством Объединенная.

7.7.13.9. Адаптация формы к мобильному клиенту

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

Исходя из этих предпосылок мобильный клиент пытается автоматически перестроить форму таким образом, чтобы она поместилась на экране мобильного устройства. В процессе адаптации уменьшается ширина элементов формы для тех элементов, ширина которых в конфигурации задана так, что превышает фактическую ширину экрана на мобильном устройстве. Ширина для таких элементов формируется такими образом, чтобы элемент поместился (по ширине) в текущей ориентации мобильного устройства без горизонтальной прокрутки. Кроме изменения ширины, система может выполнить попытку уменьшить количество отображаемых элементов формы, чтобы улучшить визуальный вид формы. Для управления необходимости такой перестройки предназначено свойство формы Вариант сворачивания элементов формы по важности (СворачиваниеЭлементовПоВажности). Значение Авто трактуется как Использовать.

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

● Более важным элементам отводится больше места на форме.

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

● Если первым или последним из сворачиваемых элементов является командная панель, то она не сворачивается, так как может относиться к важному элементу.

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

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

● Менее важные элементы, находящиеся ниже последнего более важного элемента, не сворачиваются.

● Если внутри свернутой группы также расположены элементы разной важности, то к этой группе алгоритм применяется рекурсивно.

● Заголовок свертываемой группы формируется по следующему алгоритму:

● Если свертывается уже существующая группа, то используется заголовок этой группы.

● Если в свертываемую группу попадает один элемент с заданным заголовком, то используется заголовок этого элемента.

● Если не подходит ни один из вышеперечисленных пунктов ‑ заголовок формируется соединением, через ",", всех заголовков элементов, входящих в свертываемую группу.

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

● Значение ОченьВысокая для элемента формы, отображающего данные основного реквизита формы (и подчиненные реквизиты).

● Значение Высокая, если элемент растягивается по вертикали и является одним из следующих элементов:

● таблица формы, отображающей динамический список;

● поле табличного документа;

● поле диаграммы любого вида и типа;

● поле форматированного документа;

● поле HTML-документа.

● Если элементом является командная панель, то:

● Значение Высокая, если источником команд для командной панели выступает собственно управляемая форма.

● Значение важности элемента, который является источником команд для командной панели.

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

● Значение Обычная для всех остальных элементов.

7.8. Командный интерфейс формы

Командный интерфейс формы состоит:

● из панели навигации формы,

● командной панели самой формы.

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

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

Команда автоматически попадает в командный интерфейс формы, в случае если тип параметра параметризованной команды совпадает с типом основного реквизита формы.

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

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

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

7.9. Работа с формой из встроенного языка

7.9.1. Открытие формы

Для того чтобы открыть форму, существуют два способа:

● Воспользоваться методом ОткрытьФорму().

● Воспользоваться комбинацией метода ПолучитьФорму() и метода Открыть() объекта ФормаКлиентскогоПриложения.

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

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

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

Пример 1:

Копировать в буфер обмена
// Откроем форму списка справочника товары
// в режиме "только просмотр"
Параметры = Новый Структура("ТолькоПросмотр", Истина);
ОткрытьФорму("Справочник.Товары.ФормаСписка", Параметры);

Пример 2:

Копировать в буфер обмена
// Открыть модальную форму и после закрытия
// получить доступ к реквизитам формы
Форма = ПолучитьФорму("ОбщаяФорма.ВыборПериода");
Результат = Форма.Открыть();

Описание работы с параметрами формы см. здесь.

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

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

7.9.2. Переопределение открываемой формы

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

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

Так, при открытии формы элемента справочника Номенклатура в следующем случае обработчик будет вызван.

Копировать в буфер обмена
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта");

Однако обработчик не будет вызван, если попытаться открыть форму следующим образом.

Копировать в буфер обмена
ОткрытьФорму("Справочник.Товары.Форма.ФормаЭлемента");

Рассмотрим пример с разными формами формы элемента справочника более подробно.

При открытии формы будет выполняться анализ реквизита Вид справочника Номенклатура, и в том случае, если значение этого свойства равно значению Перечисления.ВидыТоваров.Услуга, открывать форму ФормаУслуги справочника Номенклатура.

Копировать в буфер обмена
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    Если ВидФормы = "ФормаОбъекта" И Параметры.Ключ.Вид = Перечисления.ВидыТоваров.Услуга Тогда
   ВыбраннаяФорма = Метаданные.Справочники.Товары.Формы.ФормаУслуги;
   СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

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

Примечание. Обработчик ОбработкаПолученияФормы не вызывается при попытке открытия общих форм, форм констант, форм хранилищ настроек, внешних отчетов и внешних обработок.

7.9.3. Модификация свойств элементов формы

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

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

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

Так, отключение доступности элемента формы ВидЦены выполняется следующим образом:

Копировать в буфер обмена
Элементы.ВидЦены.Доступность = Ложь;

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

Например, мы имеем группу ВалютаДокумента, которая состоит из полей ввода Валюта и КурсВалюты. Если необходимо сделать всю группу недоступной, достаточно выполнить следующее:

Копировать в буфер обмена
Элементы.ВалютаДокумента.Доступность = Ложь;

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

Примечание. Если модификация элементов формы приводит к изменению расположения элементов на форме (например, при изменении видимости элементов формы), то возможны вызовы различных обработчиков событий, связанных с активизацией элементов (например, будет вызвано событие ПриАктивизацииСтроки у таблицы).

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

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

7.9.4. Модификация формы

Существует возможность программной модификации формы. Для модификации (создания, изменения и удаления) доступны:

● реквизиты формы,

● локальные команды формы,

● элементы формы.

Примечание. Удалять можно только те объекты, которые созданы из встроенного языка.

Общую схему программной работы с формой можно представить следующим образом:

● изменение состава реквизитов формы,

● изменение состава команд формы,

● изменение состава элементов формы.

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

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

Более подробно рассмотрим все этапы модификации формы.

7.9.4.1. Изменение состава реквизитов

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

Рассмотрим подробнее методику создания реквизитов.

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

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

Копировать в буфер обмена
МоиРеквизиты = Новый Массив;
МоиРеквизиты.Добавить(Новый РеквизитФормы("ТаблицаДанных", Новый ОписаниеТипов("ТаблицаЗначений"), , "Таблица значений", Ложь));
МоиРеквизиты.Добавить(Новый РеквизитФормы("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"), "ТаблицаДанных", "Кто поставляет", Ложь));
МоиРеквизиты.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"), "ТаблицаДанных", "Имя товара", Ложь));

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

На рис. 369 изображены реквизиты, созданные в редакторе формы, аналог которых создает код, приведенный выше.

Рис. 369. Эквивалент программному коду

После того как были созданы все реквизиты, которые планировалось создать в форме, следует выполнить изменение списка реквизитов:

Копировать в буфер обмена
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);

Выполнение данного кода приведет к тому, что система вначале удалит реквизиты, перечисленные в массиве УдаляемыеРеквизиты, а затем выполнит добавление реквизитов из массива ДобавляемыеРеквизиты. После чего произойдет перестроение формы.

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

После добавления реквизита обращение к нему в программном коде возможно только с помощью конструкции ЭтотОбъект.ИмяРеквизита. Выражение «ЭтотОбъект.» является обязательным для программно добавляемых реквизитов.

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

Следует обратить внимание на две особенности полученного списка:

● данный список не является динамическим и не отслеживает изменения реквизитов, которые произошли после вызова метода;

● несмотря на то, что полученный список можно изменять, эти изменения никак не отразятся на реальных свойствах реквизитов формы.

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

Например, если мы хотим изменить свойства реквизита ПараметрЗаказа, то это следует делать таким образом:

Копировать в буфер обмена
МассивРеквизитов = ПолучитьРеквизиты("ПараметрЗаказа");
...
// Выполним изменения реквизита
...
УдаляемыеРеквизиты = Новый Массив;
УдаляемыеРеквизиты.Добавить("ПараметрЗаказа");
ИзменитьРеквизиты(МассивРеквизитов, УдаляемыеРеквизиты);

7.9.4.2. Изменение состава команд

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

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

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Команда = Команды.Добавить("КомандаУстановкиСтатуса");
    Команда.Действие = "ОбработчикПрограммныхКоманд";
    Команда.Заголовок = "Установить статус";
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикПрограммныхКоманд(Команда)
    ...
КонецПроцедуры

Обработчик команды должен существовать в модуле формы и предваряться директивой компиляции &НаКлиенте.

Примечание. Один обработчик может обслуживать несколько программно добавляемых команд.

7.9.4.3. Работа с элементами формы

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

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

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

Первое свойство указывает на родительский элемент формы, например, для поля формы, расположенного в группе, свойство Родитель будет указывать на элемент формы типа ГруппаФормы.

Свойство ПодчиненныеЭлементы существует у тех элементов формы, которые могут иметь подчиненные элементы. Например, для элемента формы типа ГруппаФормы коллекция ПодчиненныеЭлементы будет содержать те элементы, которые расположены в этой группе.

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

Если последний параметр метода не указан, то перемещаемый элемент будет размещен в конце коллекции элементов нового родителя.

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

Рассмотрим подробнее способ добавления элемента управления.

В примере показано, как разместить на форме два элемента:

● поле формы, связанное с реквизитом формы;

● кнопку, связанную с командой формы.

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    МоиРеквизиты = Новый Массив;
    ТипСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки());
    МоиРеквизиты.Добавить(Новый РеквизитФормы("ОписаниеОбъекта", ТипСтрока, "", "Описание объекта", Ложь));
    ИзменитьРеквизиты(МоиРеквизиты);
    Команда = Команды.Добавить("ИзменитьСтроку");
    Команда.Действие = "ОбработчикПрограммныхКоманд";
    Команда.Заголовок = "Изменить строку";
    Элемент = Элементы.Добавить("ОписаниеОбъекта", Тип("ПолеФормы"));
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = "ОписаниеОбъекта";
    Элемент = Элементы.Добавить("ИзменитьСтроку", Тип("КнопкаФормы"));
    Элемент.ИмяКоманды = "ИзменитьСтроку";
КонецПроцедуры
...
&НаКлиенте
Процедура ОбработчикПрограммныхКоманд(Команда)
    ЭтотОбъект.ОписаниеОбъекта = "Описание объекта, сформированное командой";
КонецПроцедуры

Форма, в которой будет размещен этот код, будет выглядеть как на рис. 370. Форма показана после того, как пользователь нажал кнопку Изменить строку.

Рис. 370. Результат программной модификации формы

7.9.5. Обработка ожидания и форма

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

Однако, в этой схеме есть особенность. Для понимания особенности рассмотрим, как выполняется обработчик ожидания. Операционная система информирует приложение о том, что приложение не выполняет никакой работы. В этот момент система «1С:Предприятие» проверяет, что интервал времени, установленный для обработчика ожидания прошел и вызывает собственно обработчик ожидания. Первым следствием этого описания следует то, что управление будет передано в обработчик через больший интервал времени, чем хотел разработчик прикладного решения. Если, например, после установки обработчика ожидания было длительное исполнение кода на встроенном языке, то обработчик ожидания не будет выполнен до окончания исполнения кода.

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

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

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

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

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

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

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

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

7.9.6. Работа с динамическим списком

В данном разделе приведены примеры выполнения некоторых операций по работе с динамическим списком, размещенным в форме.

Примечание. Примеры, приведенные ниже, не являются законченным. Они предназначены для демонстрации различных механизмов работы с динамическим списком.

7.9.6.1. Параметр запроса динамического списка

В данном разделе приведен пример установки параметра запроса динамического списка.

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

Копировать в буфер обмена
ВЫБРАТЬ
    Товары.Код КАК Код,
    Товары.Наименование КАК Наименование,
    Товары.Артикул КАК Артикул,
    ТоварныеЗапасыОстатки.КоличествоОстаток КАК Количество,
    ЦеныТоваровСрезПоследних.Цена КАК Цена,
    Товары.ЭтоГруппа
ИЗ
    Справочник.Товары КАК Товары
   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(, Склад = &Склад) КАК ТоварныеЗапасыОстатки
   ПО (ТоварныеЗапасыОстатки.Товар = Товары.Ссылка)
   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(, ВидЦен = &ВидЦен) КАК ЦеныТоваровСрезПоследних
   ПО Товары.Ссылка = ЦеныТоваровСрезПоследних.Товар

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

Копировать в буфер обмена
// СписокТоваров - реквизит формы типа ДинамическийСписок
// Параметры.Склад и Параметры.ВидЦен - параметры формы соответствующих типов
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СписокТоваров.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад);
    СписокТоваров.Параметры.УстановитьЗначениеПараметра("ВидЦен", Параметры.ВидЦен);
КонецПроцедуры

7.9.6.2. Отбор

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

Установить

Функция добавляет отбор в динамический список и возвращает созданный элемент отбора.

Копировать в буфер обмена
Функция ДобавитьОтбор(СписокОтборов, ИмяПоля, Значение, ВидСравнения = Неопределено, Использование = Истина)
    НовыйЭлемент = СписокОтборов.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения);
    НовыйЭлемент.ПравоеЗначение = Значение;
    НовыйЭлемент.Использование = Использование;
    Возврат НовыйЭлемент;
КонецФункции

Пример использования:

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

Удалить

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

Копировать в буфер обмена
Функция УдалитьОтбор(СписокОтборов, ИмяПоля = "")
    Если ПустаяСтрока(ИмяПоля) Тогда
   СписокОтборов.Элементы.Очистить();
   Возврат Истина;
    КонецЕсли;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ОтборУдален = Ложь;
    Для каждого ЭлементОтбора Из СписокОтборов.Элементы Цикл
   Если ЭлементОтбора.Использование И ЭлементОтбора.ЛевоеЗначение = Поле Тогда
    СписокОтборов.Элементы.Удалить(ЭлементОтбора);
    ОтборУдален = Истина;
   КонецЕсли;
    КонецЦикла;
    Возврат ОтборУдален;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок"
//     В списке должна быть колонка "Контрагент"
// Выполняется удаление отбора по полю "Контрагент".
Результат = УдалитьОтбор(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, "Контрагент");

7.9.6.3. Группировка

В данном разделе приведены примеры установки и удаления группировки в динамическом списке.

Установка

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

Копировать в буфер обмена
Функция ДобавитьГруппировку(СписокГруппировок, ИмяПоля, Использование = Истина, ТипГруппировки = Неопределено)
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент = СписокГруппировок.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    НовыйЭлемент.Использование = Использование;
    НовыйЭлемент.Поле = Поле;
    НовыйЭлемент.ТипГруппировки = ?(ТипГруппировки = Неопределено, ТипГруппировкиКомпоновкиДанных.Элементы, ТипГруппировки);
    Возврат НовыйЭлемент;
КонецФункции

Пример использования:

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

Удаление

Процедура удаляет группировку динамического списка и возвращает результат удаления. Если имя поля с удаляемой группировкой не указано, выполняется очистка списка группировок.

Копировать в буфер обмена
Функция УдалитьГруппировку(СписокГруппировок, ИмяПоля = "")
    Если ПустаяСтрока(ИмяПоля) Тогда
   СписокГруппировок.Элементы.Очистить();
   Возврат Истина;
    КонецЕсли;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ГруппировкаУдалена = Ложь;
    МассивЭлементовДляУдаления = Новый Массив;
    Для каждого ЭлементГруппировки из СписокГруппировок.Элементы Цикл
   Если ЭлементГруппировки.Поле = Поле тогда
    МассивЭлементовДляУдаления.Добавить(ЭлементГруппировки);
   КонецЕсли;
    КонецЦикла;
    Для каждого УдаляемыйЭлемент из МассивЭлементовДляУдаления Цикл
   СписокГруппировок.Элементы.Удалить(УдаляемыйЭлемент);
   ГруппировкаУдалена = Истина;
    КонецЦикла;
    Возврат ГруппировкаУдалена;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок"
//
// Выполняется удаление всех группировок в динамическом списке
Результат = УдалитьГруппировку(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Группировка);

7.9.6.4. Порядок (сортировка)

В данном разделе приведены примеры установки и удаления упорядочивания динамического списка.

Установка

Функция добавляет поле сортировки в динамический список и возвращает созданный элемент порядка.

Копировать в буфер обмена
Функция ДобавитьПорядок(СписокПорядков, ИмяПоля, Использование = Истина, ТипУпорядочивания = Неопределено)
    Поле = Новый ПолеКомпоновкиДанных(Поле);
    НовыйЭлемент = СписокПорядков.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    НовыйЭлемент.Использование = Использование;
    НовыйЭлемент.Поле = Поле;
    НовыйЭлемент.ТипУпорядочивания = ?(ТипУпорядочивания = Неопределено, НаправлениеСортировкиКомпоновкиДанных.Возр, ТипУпорядочивания);
    Возврат НовыйЭлемент;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок"
// В списке должна быть колонка "Наименование"
//
// Выполняется установка сортировки по полю "Наименование",
// направление сортировки - по убыванию, сортировка используется
ДобавитьПорядок(ДинамическийСписок.КомпоновщикНастроек.Настройки.Порядок, "Наименование", Истина, НаправлениеСортировкиКомпоновкиДанных.Убыв);

Удаление

Процедура удаляет сортировку динамического списка и возвращает результат удаления. Если имя поля упорядочивания не указано, выполняется очистка списка упорядочивания.

Копировать в буфер обмена
&НаКлиенте
Функция УдалитьПорядок(СписокПорядков, ИмяПоля = "")
    Если ПустаяСтрока(ИмяПоля) Тогда
   СписокПорядков.Элементы.Очистить();
   Возврат Истина;
    КонецЕсли;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ПорядокУдален = Ложь;
    МассивЭлементовДляУдаления = Новый Массив;
    Для каждого ЭлементПорядка из СписокПорядков.Элементы Цикл
   Если ЭлементПорядка.Поле = Поле тогда
    МассивЭлементовДляУдаления.Добавить(ЭлементПорядка);
   КонецЕсли;
    КонецЦикла;
    Для каждого УдаляемыйЭлемент из МассивЭлементовДляУдаления Цикл
   СписокПорядков.Элементы.Удалить(УдаляемыйЭлемент);
   ПорядокУдален = Истина;
    КонецЦикла;
    Возврат ПорядокУдален;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок"
//
// Выполняется удаление (не отключение) порядка по полю "Наименование"
Результат = УдалитьПорядок(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Порядок, "Наименование");

7.9.6.5. Условное оформление

В данном разделе приведены примеры задания условного оформления динамического списка. В условном оформлении используется динамический список Список, в котором есть поля Организация и Сумма (типа Число). В примере задаются три элемента условного оформления:

● если значение поля Сумма меньше 500, то текст полей Организация и Сумма оформляется красным цветом;

● если значение поля Сумма больше 500, но меньше 10 000, то для всех полей строки текст оформляется синим цветом;

● если значение поля Сумма больше 10 000, то текст полей Организация и Сумма оформляется зеленым цветом.

Также в примере используется функция установки отбора (см. здесь).

Копировать в буфер обмена
Функция УстановитьУсловноеОформление(СписокОформления, ИменаОформляемыхПолей, СтруктураОформление, Использование = Истина) Экспорт
    НовыйЭлемент = СписокОформления.Элементы.Добавить();
    НовыйЭлемент.Использование = Использование;
    // Зададим оформляемые поля, заданные массивом с именами полей
    Для каждого ИмяПоля Из ИменаОформляемыхПолей Цикл
   ОформляемоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
   ОформляемоеПоле.Использование = Истина;
   ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    КонецЦикла;
    // Зададим оформление, заданное структурой,
    // в которой - Ключ: имя параметра оформления,
    //    а Значение - значение параметра оформления
    Для каждого ЭлементОформления Из СтруктураОформление Цикл
   НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(ЭлементОформления.Ключ, ЭлементОформления.Значение);
    КонецЦикла;
    Возврат НовыйЭлемент;
КонецФункции

Пример задания условного оформления:

Копировать в буфер обмена
ЭлементыУсловногоОформления = Список.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
ОформляемыеПоля = Новый Массив;
ОформляемыеПоля.Добавить("Сумма");
ОформляемыеПоля.Добавить("Организация");
// ***** Установка красного цвета для суммы менее 500
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(128,0,0));
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, ОформляемыеПоля, Оформление);
// Зададим условие оформления: Сумма < 500
ДобавитьОтбор(НовыйЭлемент.Отбор, "Сумма", 500, ВидСравненияКомпоновкиДанных.Меньше);
// ***** Установка зеленого цвета для суммы более 10 000
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(0,128,0));
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, ОформляемыеПоля, Оформление);
Зададим условие оформления: Сумма > 10 000
ДобавитьОтбор(НовыйЭлемент.Отбор, "Сумма", 10000, ВидСравненияКомпоновкиДанных.Больше);
// установка синего цвета, если сумма в интервале от 500 до 10 000
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(0,0,128));
// Передача пустого массива в качестве списка оформляемых полей
// означает оформление всех полей строки
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, Новый Массив, Оформление);
// Cоздадим группу условий "И"
ГруппаОтборов = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтборов.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
// Зададим условие оформления: Сумма > 500 И Сумма < 10 000
ДобавитьОтбор(ГруппаОтборов, "Сумма", 500, ВидСравненияКомпоновкиДанных.Больше);
ДобавитьОтбор(ГруппаОтборов, "Сумма", 10000, ВидСравненияКомпоновкиДанных.Меньше);

7.9.7. Механизм перетаскивания

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

Операции перетаскивания поддерживают следующие элементы формы:

● таблица формы,

● поле табличного документа,

● поле календаря,

● поле картинки,

● декорация-картинка,

● поле планировщика.

При операциях перетаскивания используются следующие термины:

источник данных ‑ элемент формы, из которого можно перетаскивать данные;

приемник данных ‑ элемент формы, в который можно перетаскивать данные.

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

Разрешить начало перетаскивания ‑ разрешает элементу формы предоставлять данные.

Разрешить перетаскивание ‑ разрешает элементу формы принимать данные. Эти свойства можно устанавливать из палитры свойств или из встроенного языка.

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

Значение ‑ содержит перетаскиваемое значение, например, для таблицы управляемой формы это может быть ссылка на объект, для табличного документа ‑ область табличного документа, для календаря ‑ дата. Можно присвоить этому свойству свое значение (например, какую-нибудь структуру), тогда это значение будет являться перетаскиваемым объектом. Для таблицы управляемой формы, связанной с реквизитом формы типа ДанныеФормыКоллекция, ДанныеФормыДерево или ДанныеФормыСтруктраСКоллекцией, в качестве значения перетаскивания передается:

● идентификатор строки (или массив идентификаторов), если перетаскивание осуществляется в рамках одной таблицы;

● элемент коллекции (или массив элементов), если перетаскивание осуществляется между разными таблицами.

При выполнении операции перетаскивания из поля планировщика (см. здесь), свойство Значение содержит копии перетаскиваемых элементов.

Действие ‑ указывает действие перетаскивания и является значением типа ДействиеПеретаскивания.

ДопустимыеДействия ‑ указывает допустимые действия перетаскивания и является значением типа ДопустимыеДействияПеретаскивания. При помощи этого свойства можно указать, какие операции возможны с данными источника данных (например, только копирование).

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

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

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

Если у таблицы свойство ИзменятьПорядокСтрок установлено в значение Ложь, то при перетаскивании внутри таблицы стандартная обработка отменяет перетаскивание и событие Перетаскивание вызвано не будет.

Если свойство ИзменятьПорядокСтрок установлено в значение Истина или перетаскивание осуществляется извне таблицы, стандартная обработка не отменяет перетаскивание.

Стандартная обработка не отменяет перетаскивание, если у таблицы свойство РежимВыделения установлено в значение Множественный, свойство ИзменятьПорядокСтрок установлено в значение Истина или перетаскивание осуществляется извне таблицы, и перетаскивается более одного элемента.

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

● При перетаскивании элементов дерева внутри одного узла осуществляется изменение порядка следования элементов дерева внутри узла.

● При перетаскивании элементов дерева между различными узлами осуществляется перемещение элементов дерева в выбранный узел.

● Для поля табличного документа ‑ проверка возможности вставить передаваемое значение.

● Для поля картинки и календаря стандартной обработки нет.

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

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

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

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

Как файл. В этом случае в качестве значения перетаскивания будет выступать объект типа Файл (или массив таких объектов). Данный способ перетаскивания не поддерживается при использовании веб-клиента.

Как ссылка на файл. В этом случае в качестве значения перетаскивания будет выступать объект типа СсылкаНаФайл (или массив таких объектов). Данный способ перетаскивания поддерживается и для тонкого клиента и для веб-клиента.

Если для элемента формы способ перетаскивания файлов установлен в значение Как ссылка на файл, то:

● В веб-клиенте обработчик события ПроверкаПеретаскивания возникает один раз, при отпускании кнопки мыши и непосредственно перед выполнением обработчика события Перетаскивание.

● В тонком клиенте обработчик события ПроверкаПеретаскивания возникает многократно, во время выполнения перетаскивания.

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

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

● Данные объекты не могут быть сериализованы.

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

● Объект СсылкаНаФайл не может быть создан из встроенного языка. Он может создаваться только платформой, во время работы с механизмом перетаскивания.

В то же время, структуры данных, расположенные в оперативной памяти (массивы, структуры, соответствия и т. д.) вполне могут хранить объекты типа СсылкаНаФайл.

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

7.9.8. Различные подходы к модальности

7.9.8.1. Общая информация

В прикладных решениях, разрабатываемых с помощью системы «1С:Предприятие», часто возникает необходимость открыть форму, которая будет предоставлять одновременно несколько возможностей:

● Блокировать работу с другими фрагментами интерфейса прикладного решения;

● Позволять ввести какую-либо информацию (включая ответ на вопрос);

● Останавливать исполнение кода прикладного решения до момента, пока не будет завершена работа с открытой формой.

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

В рамках системы «1С:Предприятие» существуют две схемы использования таких форм:

● Модальные окна;

● Блокирующие окна.

В рамках одного прикладного решения может использовать или какой-либо один подход или смешанная модель. Для управления такой возможностью существует специальное свойство конфигурации ‑ Режим использования модальности (см. здесь).

Первая схема использования модальности (модальные окна) предполагает использование синхронных вызовов встроенного языка (подробнее см. здесь) и особых типов окон операционной системы ‑ модальных окна. Модальные окна можно открыть с помощью методов ОткрытьФормуМодально() или Предупреждение(). Однако, модальные окна не поддерживаются при работе в веб-клиенте.

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

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

Пример с модальными окнами:

Копировать в буфер обмена
&НаКлиенте
Процедура ВыполнитьАлгоритм()
    Результат = Вопрос("Выполнить быстро или не медленно?", РежимДиалогаВопрос.ДаНет);
    Если Результат = КодВозвратаДиалога.Да Тогда
   // Первый вариант алгоритма
    Иначе
   // Второй вариант алгоритма
    КонецЕсли;
КонецПроцедуры

В этом примере (модальные окна) работа встроенного языка остановится на строке Результат = Вопрос() и продолжится только после того, как пользователь ответит на заданный вопрос.

Пример с блокирующими окнами:

Копировать в буфер обмена
&НаКлиенте
Асинх Процедура ВыполнитьАлгоритм(Команда)
    Результат = Ждать ВопросАсинх("Выполнить быстро или не медленно?", РежимДиалогаВопрос.ДаНет);
    Если Результат = КодВозвратаДиалога.Да Тогда
   // Первый вариант алгоритма
    Иначе
   // Второй вариант алгоритма
    КонецЕсли;
КонецПроцедуры

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

Использование механизма обратного вызова будет полезно в следующем случае: необходимо открыть какую-либо форму, а затем обработать факт закрытия этой формы. Предположим, что открытие формы выполняется из общего модуля КлиентскаяРабота. Будет использоваться общая форма с именем ПомощникОформления.

В общем модуле будет следующий программный код:

Копировать в буфер обмена
Процедура ОткрытьФормуПомощника() Экспорт
    ЗакрытиеОбратныйВызов = Новый ОписаниеОповещения("ОбработкаЗакрытияФормы", ЭтотОбъект);
    ОткрытьФорму("ОбщаяФорма.ПомощникОформления", , , , , , ЗакрытиеОбратныйВызов, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
Процедура ОбработкаЗакрытияФормы(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    Сообщить("Форма закрыта: " + РезультатЗакрытия);
КонецПроцедуры

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

Копировать в буфер обмена
&НаКлиенте
Процедура ЗакрытьФорму(Команда)
    Закрыть("Результат");
КонецПроцедуры

7.9.8.2. Закрытие вспомогательного или основного окна приложения и блокирующие окна

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

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

ТекстПредупреждения ‑ данный параметр должен быть сформирован в обработчике события (если этот параметр существует для выбранного обработчика).

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

Копировать в буфер обмена
&НаКлиенте
Перем ОтветПередЗакрытием;
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если Не ЗавершениеРаботы Тогда
   Если ОтветПередЗакрытием <> Истина Тогда
    Отказ = Истина;
    ОбратныйВызов = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
    ПоказатьВопрос(ОбратныйВызов, "Закрыть форму?", РежимДиалогаВопрос.ДаНет);
   КонецЕсли;
    Иначе
   Отказ = Истина;
   ТекстПредупреждения = "При закрытии формы все данные будут утеряны. Вы хотите";
    КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
   ОтветПередЗакрытием = Истина;
   Закрыть();
    Иначе
   ОтветПередЗакрытием = Неопределено;
    КонецЕсли;
КонецПроцедуры

В приведенном примере примера реализована особая реакция на закрытие всего приложения. Обработка процесса закрытия приложения работает следующим образом:

● Если форма закрывается в процессе завершения работы приложения, то прикладной разработчик может определить это по состоянию параметра ЗавершениеРаботы и определяет, нужно выдать пользователю какое-либо сообщение, которое требует реакции пользователя: завершить работу или все-таки продолжить работу, т. к. в форме есть существенная информация.

● Если разработчик считает, что пользователю необходимо выдать сообщение, то он может это сделать с помощью параметра ТекстПредупреждения обработчика событий ПередЗакрытием или ПередЗавершениемРаботыСистемы. Параметр Отказ также следует установить в значение Истина.

● Если хотя бы одна форма или процедура обработчика события ПередЗавершениемРаботыСистемы сообщит о том, что она «не хочет» закрытия приложения, система будет формировать диалоги, требующие реакции пользователя. Количество диалогов равно количеству отказов от закрытия (включая обработчик модуля управляемого приложения). В веб-клиенте будет отображен один диалог, который будет содержать все сообщения, которые были установлены в управляемых формах и модуле управляемого приложения. При этом в веб-браузере Mozilla Firefox диалог будет содержать только текст, установленный самим веб-браузером и не будет отображаться текст, установленный в обработчиках событий системы «1С:Предприятие».

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

Если параметр ЗавершениеРаботы имеет значение Ложь, то это означает, что закрывается единственная форма и в этом случае логика работы выглядит следующим образом:

● Вначале задается вопрос о необходимости (возможности) закрытия формы и собственно закрытие формы отменяется.

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

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

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

Аналогичное поведение будет наблюдаться в том случае, если в обработчике ПередЗавершениемРаботыСистемы параметр Отказ будет установлен в значение Истина.

Во всех остальных случаях считается, что нет причин, препятствующих закрытию форм и приложения.

7.9.8.3. Особенности использования блокирующих окон

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

Схема именования методов открытия диалогов для таких объектов ‑ стандартная для платформы:

● Синхронный метод (если есть) ‑ Открыть(), Выбрать() и т. д.

● Асинхронный метод (с использованием обратного вызова) ‑ Показать().

● Асинхронный метод (с использованием обещаний) ‑ ОткрытьАсинх(), ВыбратьАсинх() и т. д.