Нужно ли заменять процедуру ЗаполнитьЗначенияСвойств в управляемых формах 1С?

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

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

Разберем детально, как работает данный метод в управляемом приложении, почему его не нужно исключать из разработки и какие альтернативные механизмы копирования данных существуют в платформе 1С:Предприятие 8.3 и Библиотеке Стандартных Подсистем (БСП).

Контекст доступности и особенности метода ЗаполнитьЗначенияСвойств

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

  1. Тонкий клиент и веб-клиент — для работы с клиентскими структурами и данными форм.
  2. Сервер — при выполнении серверных вызовов, обработке проведения документов и формировании движений.
  3. Толстый клиент — в обычном и управляемом режимах.
  4. Внешнее соединение и мобильная платформа.

Метод реализован на уровне ядра платформы (C++), поэтому при копировании реквизитов одной строки или объекта он работает значительно быстрее, чем ручной перебор свойств в цикле. Платформа 1С сохраняет строгую обратную совместимость для базовых методов, поэтому отказываться от вызова ЗаполнитьЗначенияСвойств в управляемом приложении нет никаких оснований.

Специфика применения и ограничения метода

При использовании процедуры важно учитывать следующие особенности ее поведения:

  1. Сопоставление по именам: значения переносятся только между теми свойствами приемника и источника, имена которых совпадают без учета регистра.
  2. Поверхностное копирование: если реквизит содержит ссылку или объектную коллекцию, копируется ссылка/указатель, а не создается независимая копия объекта.
  3. Типизация данных: если типы значений совпадающих по имени полей несовместимы, может возникнуть ошибка приведения типов либо значение не установится.
  4. Одиночные объекты: метод работает с одной записью (строкой, структурой, объектом метаданных) и не предназначен для пакетного копирования целых таблиц за один вызов.

Посмотрим на пример использования параметров фильтрации (третий и четвертый параметры процедуры), которые позволяют явно задать список копируемых или исключаемых полей:


// Заполняем только указанные реквизиты, исключая служебные
ЗаполняемыеКолонки = "Номенклатура, Количество, Сумма";
ИсключаемыеКолонки = "НомерСтроки";

ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник, ЗаполняемыеКолонки, ИсключаемыеКолонки);

Альтернативные способы формирования движений регистров

Если задача заключается в формировании движений по регистру из документа (как в типовой конфигурации «Бухгалтерия предприятия 3.0»), рассмотрим два основных подхода:

1. Пакетная выгрузка через запрос и метод Загрузить (рекомендуемый вариант)

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Ссылка.Период КАК Период,
    |   Ссылка.Организация КАК Организация,
    |   Номенклатура КАК Номенклатура,
    |   Количество КАК Количество,
    |   Сумма КАК Сумма
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
    |ГДЕ
    |   Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);

// Имена полей в выборке запроса должны точно совпадать с измерениями и ресурсами регистра
ТаблицаДвижений = Запрос.Выполнить().Выгрузить();
Движения.ОстаткиНоменклатуры.Загрузить(ТаблицаДвижений);

2. Построчное заполнение набора записей в цикле

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


Для Каждого СтрТовары Из ЭтотОбъект.Товары Цикл
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.Период = ЭтотОбъект.Дата;
    Движение.Организация = ЭтотОбъект.Организация;
    
    // Копируем реквизиты строки табличной части в запись регистра
    ЗаполнитьЗначенияСвойств(Движение, СтрТовары);
КонецЦикла;

Работа с данными управляемых форм и механизмы БСП

Если требуется переносить данные между контекстом управляемой формы и объектами информационной базы, применяются специализированные методы платформы и библиотеки БСП:

  1. Преобразование данных формы: для перевода объектов типа ДанныеФормыСтруктура или ДанныеФормыКоллекция в прикладные типы (например, ДокументОбъект или ТаблицаЗначений) на сервере формы используются методы РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.
  2. Копирование данных на форме: для прямого копирования между элементами формы без их сериализации в прикладные объекты применяется системная процедура КопироватьДанныеФормы.
  3. Функции БСП (в конфигурациях уровня БП 3.0, ERP, КА):
    • ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру — создает независимую копию структуры с возможностью отбора полей.
    • ОбщегоНазначенияКлиентСервер.ЗаполнитьСтруктуру — переносит поля из источника в существующую структуру.
    • ОбщегоНазначения.СкопироватьРеквизиты — серверная процедура для копирования реквизитов объектов с поддержкой списка исключений.

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

← На главную