При разработке в среде «1С:Предприятие 8» программисты часто сталкиваются с задачей изменения логики поведения управляемой формы в зависимости от того, как она была открыта — стандартно (из списка, кнопкой «Создать») или программно из другого объекта с передачей специфических параметров. Кажется, что самым простым решением является вызов метода Параметры.Свойство(). Однако на практике разработчики нередко обнаруживают, что этот метод возвращает Истина даже тогда, когда параметр явно не передавался. Выясним, почему это происходит, и разберем корректные способы проверки.
Для начала проанализируем внутреннее устройство платформы. Коллекция Параметры управляемой формы — это не обычный объект типа Структура, а специализированный объект платформы. Его поведение зависит от того, к какому типу параметров мы обращаемся. Параметры управляемой формы можно разделить на три категории:
Ключ, Основание, ЗначенияЗаполнения, РежимВыбора и другие. Эти параметры всегда неявно присутствуют в коллекции Параметры. При стандартном открытии формы (например, при нажатии кнопки «Создать») они инициализируются значением Неопределено. Соответственно, проверка Параметры.Свойство("Основание") всегда вернет Истина, так как ключ физически существует в коллекции.РежимПросмотра), платформа также зарегистрирует его заранее. Он будет существовать в коллекции по умолчанию со значением Неопределено. Проверка через Свойство() для него тоже всегда будет возвращать Истина.МойУникальныйПараметр), то его изначально в коллекции нет. Метод Свойство() вернет для него корректное значение Ложь, если параметр не был передан при открытии.Именно из-за этого разделения у автора темы возникла путаница. Он использовал имя параметра Основание, которое является предопределенным параметром расширения формы для объектов, поддерживающих ввод на основании. Метод Параметры.Свойство("Основание") всегда возвращал Истина, вводя разработчика в заблуждение.
Если мы работаем со стандартным параметром формы (таким как Основание) или параметром, который мы сами объявили в дереве параметров формы в конфигураторе, нам нужно проверять не факт наличия ключа в коллекции, а его значение.
Рассмотрим пример проверки на значение Неопределено в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли стандартный параметр "Основание"
Если Параметры.Основание <> Неопределено Тогда
// Параметр был передан при программном открытии или вводе на основании
ПроверитьИОбработатьОснование(Параметры.Основание);
КонецЕсли;
КонецПроцедуры
Если параметр должен содержать ссылку на объект и мы хотим убедиться, что ссылка не является пустой, лучшим решением будет использование функции ЗначениеЗаполнено(). Посмотрим на пример:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем заполненность параметра
Если ЗначениеЗаполнено(Параметры.Основание) Тогда
// Выполняем логику заполнения на основании
ДокументОснование = Параметры.Основание;
КонецЕсли;
КонецПроцедуры
Если вы передаете свой собственный уникальный параметр, который не зарегистрирован на вкладке «Параметры» формы, вы можете использовать классическую проверку через Свойство(). Метод вернет Истина только тогда, когда параметр был явно передан в структуре параметров при открытии формы.
Проанализируем пример такой проверки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗначениеПараметра = Неопределено;
Если Параметры.Свойство("ИспользоватьСпецРежим", ЗначениеПараметра) Тогда
// Сюда мы попадем, только если "ИспользоватьСпецРежим" был передан программно
Если ЗначениеПараметра = Истина Тогда
// Выполняем специфические действия
ПрименитьСпециальныйРежимФормы();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Чтобы избежать конфликтов с логикой платформы «1С:Предприятие 8», никогда не используйте для своих кастомных нужд имена параметров, которые зарезервированы системой. Перечислим основные из них:
Для форм объектов (справочников, документов):
Ключ — ссылка на редактируемый объект. Если параметр пуст, открывается форма нового объекта.Основание — объект, на основании которого создается новый.ЗначенияЗаполнения — структура значений для автоматического заполнения реквизитов нового объекта.Для форм списков и выбора:
РежимВыбора — булево значение, сигнализирующее об открытии формы в режиме выбора элемента.МножественныйВыбор — разрешает или запрещает выбор нескольких элементов одновременно.ТекущаяСтрока — указывает строку списка, на которую необходимо установить фокус при открытии.Отбор — структура для быстрой установки фильтрации в динамическом списке.Обратим внимание на код, предложенный в сообщении №22 темы форума. В нем содержится серьезная методическая ошибка:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("", Объект.Ссылка); // Ошибка! Использование пустой строки в качестве ключа
ОткрытьForm("..Форма.", ПараметрыЗаполнения);
Использование пустой строки "" в качестве ключа структуры недопустимо стандартами разработки. Это приведет к непредсказуемому поведению платформы при попытке прочитать параметры в получателе. Всегда задавайте осмысленные строковые имена параметров, например:
&НаКлиенте
Процедура ОткрытьФормуСПараметром()
Если Объект.Ссылка.Пустая() Тогда
Предупреждение("Необходимо записать объект.");
Возврат;
КонецЕсли;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ДокументИсточник", Объект.Ссылка);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыЗаполнения);
КонецПроцедуры
В форме-получателе мы сможем корректно обработать этот параметр:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СсылкаНаИсточник = Неопределено;
Если Параметры.Свойство("ДокументИсточник", СсылкаНаИсточник) Тогда
// Успешно прочитали наш кастомный параметр
ЗаполнитьНаСервереПоИсточнику(СсылкаНаИсточник);
КонецЕсли;
КонецПроцедуры
Соблюдение этих простых правил и понимание архитектуры платформы 1С позволит вам избежать труднодиагностируемых ошибок при открытии и инициализации управляемых форм.