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