Как правильно перезаполнить табличную часть документа при создании на основании?

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

При разработке на управляемых формах 1С часто возникает задача автоматического заполнения табличных частей нового документа данными из документа-основания. Однако разработчики нередко сталкиваются с ошибкой «Нельзя изменять поле, содержащее объект данных формы». Давайте разберем, почему это происходит и как правильно реализовать данный функционал.

Понимание природы данных формы

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

Рекомендуемый способ: ОбработкаЗаполнения

Наиболее архитектурно верный путь решения задачи — это использование предопределенной процедуры ОбработкаЗаполнения в модуле объекта. Этот метод обладает рядом преимуществ:

  1. Код выполняется на сервере в контексте объекта, где доступны все возможности работы с данными.
  2. Логика заполнения срабатывает один раз при создании документа, что избавляет от проблем с жизненным циклом формы.
  3. Вы работаете с полноценным ДокументОбъект, где можно использовать Выгрузить() и Загрузить() для табличных частей без ограничений.

Рассмотрим пример правильной реализации в модуле объекта:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ДокументОснование") Тогда
        // Очищаем существующую ТЧ
        ЭтотОбъект.СоставБюджета.Очистить();
        
        // Получаем данные из основания
        ТЗ = ДанныеЗаполнения.СоставБюджета.Выгрузить();
        
        // Выполняем специфическую логику, например, фильтрацию
        // Здесь можно добавить любые условия отбора
        
        // Загружаем данные в объект
        ЭтотОбъект.СоставБюджета.Загрузить(ТЗ);
    КонецЕсли;
КонецПроцедуры

Как манипулировать данными непосредственно на форме?

Если задача требует перезаполнения табличной части уже после открытия формы (например, по нажатию кнопки «Перезаполнить»), работать с ДанныеФормыКоллекция нужно напрямую. Не пытайтесь преобразовывать ДанныеФормыКоллекция в ДокументОбъект — это приведет к ошибке доступа.

Вместо этого используйте методы самой коллекции на форме:


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

Ключевые советы по работе с ТЧ

При работе с табличными частями на управляемой форме помните следующее:

Соблюдение этих простых правил позволит избежать конфликтов с платформой 1С и сделает код вашего приложения стабильным и легко поддерживаемым.

← На главную