Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Вывод сообщений с привязкой к элементам формы
Дальше: Проверка заполнения и проверка при записи

Проверка заполнения и функциональные опции

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

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

Функциональные опции бывают независимые и параметризуемые.

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

Примечание

Пример можно посмотреть в демонстрационной базе «Проверка заполнения», функциональная опция УчетПоСкладам.

Оно может храниться, например, в константе типа Булево. Истина – функциональная опция включена, Ложь – выключена (рис. 3.66).

Рис. 3.66. Независимая функциональная опция

В этом случае все просто и понятно.

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

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

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

Примечание

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

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

Пусть значение такой функциональной опции хранится в реквизите РасчетыВВалюте справочника Поставщики (рис. 3.67).

Рис. 3.67. Параметризуемая функциональная опция

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

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

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

Листинг 3.49. Установка параметра функциональной опции

ПараметрыОпций = Новый Структура("Поставщик", Объект.Поставщик);

УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыОпций);

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

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

Рассмотрим это на примере.

Примечание

Пример можно посмотреть в демонстрационной базе «Проверка заполнения», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта «Пример 6».

Выполним команду Настройки в панели функций из группы команд Сервис (рис. 3.68).

Рис. 3.68. Включение/выключение функциональной опции

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

В ней уже нет поля Склад.

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

Рис. 3.69. Новая накладная при выключенном учете по складам

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

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

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

После этого попробуем записать документ. Мы получим сообщение о том, что реквизит Склад не заполнен (рис. 3.70).

Рис. 3.70. Сообщение о незаполненном поле «Склад»

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

Теперь рассмотрим работу параметризуемой функциональной опции ВалютныйУчет. С этой функциональной опцией связан реквизит табличной части Валюта.

Создадим новую накладную и выберем поставщика Поставщик валютный. В табличной части появится колонка Валюта (рис. 3.71).

Рис. 3.71. Колонка «Валюта» в табличной части

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

Рис. 3.72. Сообщение о незаполненном поле «Валюта»

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

Попробуем записать документ. Документ запишется без сообщений об ошибках.

Таким образом, в одном случае реквизит Валюта проверяется, а в другом – нет. Хотя и в одном, и в другом случае он присутствует в массиве проверяемых реквизитов. Как это достигается?

Откроем модуль документа, процедуру ОбработкаПроверкиЗаполнения, пример 6.

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

Листинг 3.50. Исключение реквизита из проверки в зависимости от значения функциональной опции

СтруктураПараметров = Новый Структура("Поставщик", Поставщик);

 

// Если функциональная опция "Валютный учет" выключена...

Если НЕ ПолучитьФункциональнуюОпцию("ВалютныйУчет", СтруктураПараметров) Тогда

 

// ... не проверять заполненность поля "Валюта" табличной части.

ИндексПоляВалюта = ПроверяемыеРеквизиты.Найти("Товары.Валюта");

Если ИндексПоляВалюта <> Неопределено Тогда

ПроверяемыеРеквизиты.Удалить(ИндексПоляВалюта);

 

КонецЕсли;

 

КонецЕсли;

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

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

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

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

Назад: Вывод сообщений с привязкой к элементам формы
Дальше: Проверка заполнения и проверка при записи