Использование функциональных опций определяет некоторые особенности проверки заполнения.
Функциональные опции позволяют автоматически скрыть/отобразить элементы интерфейса, которые связаны с функциональностью, не использующейся в данном прикладном решении (или, наоборот, использующейся).
Функциональные опции бывают независимые и параметризуемые.
Если функциональная опция независимая, то ее значение неизменно для всей конфигурации в целом.
Примечание
Пример можно посмотреть в демонстрационной базе «Проверка заполнения», функциональная опция УчетПоСкладам.
Оно может храниться, например, в константе типа Булево. Истина – функциональная опция включена, Ложь – выключена (рис. 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. Исключение реквизита из проверки в зависимости от значения функциональной опции
СтруктураПараметров = Новый Структура("Поставщик", Поставщик);
// Если функциональная опция "Валютный учет" выключена...
Если НЕ ПолучитьФункциональнуюОпцию("ВалютныйУчет", СтруктураПараметров) Тогда
// ... не проверять заполненность поля "Валюта" табличной части.
ИндексПоляВалюта = ПроверяемыеРеквизиты.Найти("Товары.Валюта");
Если ИндексПоляВалюта <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(ИндексПоляВалюта);
КонецЕсли;
КонецЕсли;
Во встроенном языке существует метод глобального контекста ПолучитьФункциональнуюОпцию(). Он позволяет узнать значение параметризуемой функциональной опции. Кроме имени функциональной опции ему нужно передать и значение ее параметра. Значение параметра передается в виде структуры, которая содержит имя параметра и значение параметра.
В нашем случае такой структурой является СтруктураПараметров, где в качестве значения используется поставщик, выбранный в поле Поставщик накладной.
Таким образом, если метод возвращает значение Ложь (выбран поставщик без расчетов в валюте, функциональная опция выключена), выполняется условие Если…, и из массива проверяемых реквизитов удаляется реквизит табличной части Валюта.
Если функциональная опция включена, ничего не происходит, и платформа проверяет значение реквизита Валюта.