Почему не заполняются значения табличной части документа при программном открытии формы?

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

В практике разработки на платформе 1С:Предприятие 8.3 часто встречается задача: необходимо загрузить данные из внешнего файла (текстового, Excel или JSON) и сразу показать пользователю заполненную форму нового документа. Казалось бы, алгоритм прост — создать объект, заполнить его и открыть форму. Однако именно здесь программисты часто сталкиваются с тем, что в открывшейся форме табличная часть оказывается пустой или заполненной лишь частично (например, цена есть, а количество и сумма равны нулю).

В этой статье мы подробно проанализируем, почему так происходит, разберем типичные ошибки в коде и рассмотрим правильные архитектурные подходы к решению этой задачи.

Анализ проблемного кода: типичные ошибки

Рассмотрим ситуацию, когда программист пытается «протолкнуть» данные в форму через прямое манипулирование объектом ДанныеФормы. Обычно это выглядит следующим образом:


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

Проанализируем этот подход. Использование связки ЗначениеВДанныеФормы и КопироватьДанныеФормы является крайне нестабильным. Основная проблема заключается в том, что метод КопироватьДанныеФормы корректно переносит строки табличной части только при полном совпадении структур. Если в форме документа присутствуют расчетные колонки или программные обработчики, данные могут «теряться» в момент передачи между контекстами сервера и клиента.

Почему исчезают «Количество» и «Сумма»?

Выясним причину, по которой одни поля (например, Номенклатура или Цена) заполняются, а другие остаются пустыми. В типовых конфигурациях 1С (УТ 11, ERP, БП 3.0) логика управления формой очень сложна. Разберем основные факторы влияния:

  1. Автоматический пересчет при открытии. Когда форма открывается, срабатывают стандартные события, такие как ПриЧтенииНаСервере или ПриСозданииНаСервере. Если в коде формы прописаны алгоритмы пересчета (например, если не заполнена единица измерения, то количество обнуляется), то ваши программно вставленные значения будут затерты стандартной логикой конфигурации.
  2. Отсутствие вызова событий «ПриИзменении». При программном заполнении ДанныеФормы события элементов управления (например, ТоварыКоличествоПриИзменении) не генерируются автоматически. Форма «не видит», что данные изменились, и не запускает цепочку связанных расчетов (Цена * Количество = Сумма). В итоге при визуализации интерфейс может отобразить нулевые значения.
  3. Проблемы типизации. При чтении данных из текстовых файлов значения часто приходят в виде строк. Даже если в отладчике значение выглядит как число, наличие невидимого символа (например, неразрывного пробела) приведет к тому, что платформа не сможет привести его к числовому типу реквизита табличной части и подставит 0.

Правильное решение №1: Использование параметров заполнения

В современной разработке на управляемых формах рекомендуется не «заталкивать» данные в форму, а передавать их через механизм параметров. Рассмотрим этот метод по шагам.

Шаг 1. В модуле объекта документа. Реализуем предопределенную процедуру ОбработкаЗаполнения. Она предназначена именно для инициализации нового объекта данными.


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

Шаг 2. В обработке загрузки. Вместо того чтобы открывать форму и копировать данные, мы просто передаем структуру в метод открытия.


ПараметрыФормы = Новый Структура;
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("ДанныеИзФайла", ТаблицаЗагруженныхТоваров);
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ДанныеЗаполнения);

ОткрытьФорму("Документ.ПоступлениеТоваров.ФормаОбъекта", ПараметрыФормы);

Этот способ гарантирует, что форма откроется со штатно инициализированным объектом, и все стандартные механизмы пересчета отработают корректно.

Правильное решение №2: Работа через временное хранилище

Если данных очень много, передача их через параметры может замедлить работу. В этом случае проанализируем алгоритм работы через ВременноеХранилище.

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

  1. Загружаем данные из файла в ТаблицуЗначений на сервере.
  2. Помещаем таблицу во временное хранилище с помощью функции ПоместитьВоВременноеХранилище.
  3. Передаем адрес хранилища в параметры формы.
  4. В форме документа в процедуре ПриСозданииНаСервере извлекаем таблицу и заполняем Объект.Товары.

Пример кода в форме документа:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("АдресДанных") Тогда
        ДанныеИзХранилища = ПолучитьИзВременногоХранилища(Параметры.АдресДанных);
        Объект.Товары.Загрузить(ДанныеИзХранилища);
        // Не забываем удалить данные из хранилища после использования
        УдалитьИзВременногоХранилища(Параметры.АдресДанных);
    КонецЕсли;
КонецПроцедуры

Важные рекомендации по отладке

Если вы все же решили использовать метод с ЗначениеВДанныеФормы, обратите внимание на следующие моменты:

Проверка типов данных. Обязательно используйте явное приведение типов при чтении из файла. Вместо простого присваивания СтрокаРезультат[1], используйте конструкцию:

ТабТоваров.Количество = Число(СтрЗаменить(СтрокаРезультат[1], Символы.НПП, ""));

Это позволит избежать проблем с неразрывными пробелами, которые часто встречаются в текстовых выгрузках.

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

Заключение. Мы рассмотрели причины, по которым могут не заполняться колонки табличной части. Основной вывод: старайтесь избегать прямого манипулирования ДанныеФормы извне самой формы. Используйте ОбработкуЗаполнения или передачу данных через ВременноеХранилище. Это обеспечит целостность данных и правильную работу бизнес-логики вашей конфигурации.

← На главную