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