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