Как правильно заполнить реквизиты формы из параметров при открытии в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причина возникновения проблемы

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

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

Решение 1: Использование метода ЗаполнитьЗначенияСвойств с исключением

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

Разберем пример кода, который можно разместить в модуле открываемой формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Исключаем системные параметры, которые могут вызвать ошибку записи
    СписокИсключений = "ЗакрыватьПриВыборе, ЗакрыватьПриЗакрытииВладельца, 
                       |КлючНазначенияИспользования, ПараметрыФункциональныхОпций, 
                       |ТолькоПросмотр, АвтоТест, Ключ, ЗначениеКопирования";
    
    ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, , СписокИсключений);
    
КонецПроцедуры

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

Решение 2: Явное перечисление заполняемых реквизитов

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

Посмотрим на пример:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Заполняем только конкретные реквизиты, перечисленные через запятую
    ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, "Организация, Склад, Контрагент");
    
КонецПроцедуры

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

Решение 3: Проверка наличия свойства (ручной обход)

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("ИмяВашегоПараметра") Тогда
        ЭтаФорма.ИмяРеквизита = Параметры.ИмяВашегоПараметра;
    КонецЕсли;
    
    // Повторяем для каждого необходимого параметра
    
КонецПроцедуры

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

Решение 4: Использование свойства метаданных "Заполнять из параметров"

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

Преимущества этого метода:

  1. Отсутствие лишнего кода в модуле формы.
  2. Высокая производительность (отрабатывает на уровне платформы).
  3. Безопасность (платформа сама контролирует типы и права доступа).

Решение 5: Паттерн "Дополнительные параметры"

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

В вызывающей форме (откуда открываем):


ПараметрыВызова = Новый Структура;
ПараметрыВызова.Вставить("ДатаНачала", Объект.Дата);
ПараметрыВызова.Вставить("Сотрудник", Объект.Сотрудник);

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДополнительныеДанные", ПараметрыВызова);

ОткрытьФорму("Обработка.МояОбработка.Форма.Форма", ПараметрыФормы);

В открываемой форме (в процедуре ПриСозданииНаСервере):


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

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

Подведем итоги

Выбор метода зависит от сложности вашей задачи:

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

← На главную