Почему не обновляются данные в таблице на управляемой форме 1С и как это исправить

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

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

Разбираем причину: Объект vs Реквизит формы

В платформе 1С:Предприятие 8.3 концепция управляемого приложения жестко разделяет данные, хранящиеся в базе, и данные, отображаемые на форме. Когда мы открываем форму документа, создается копия данных объекта в памяти сервера — так называемый ДанныеФормыСтруктура.

Проанализируем типичную ошибку, которую совершил автор темы. Он пытался очистить и заполнить Объект.Товары. С точки зрения логики прикладного объекта — это правильно. Но на управляемой форме элемент управления "Таблица" может быть связан не с табличной частью документа напрямую, а с произвольным реквизитом формы типа ТаблицаЗначений или ДеревоЗначений.

Выясним причину, по которой разработчики типовых конфигураций (таких как УТ 11, ERP или КА) отказываются от прямого отображения табличных частей. Чаще всего это связано со сложной логикой интерфейса. Например, в документе "Установка цен номенклатуры" количество колонок с ценами динамически меняется в зависимости от выбранных видов цен. Стандартная табличная часть объекта имеет фиксированный набор колонок "в ширину", поэтому для реализации динамики на форму выводится программно созданная таблица. Для реализации подобного интерфейса можно использовать пример программного вывода таблицы значений на управляемую форму.

Проверка свойства ПутьКДанным

Первым делом, если вы заметили, что программные изменения не отражаются на форме, проанализируем настройки элементов формы в конфигураторе. Нам необходимо найти элемент таблицы и посмотреть на его свойство ПутьКДанным.

  1. Если в поле указано Объект.Товары, то вы работаете напрямую с табличной частью. Любые изменения в Объект.Товары на сервере должны отобразиться сразу после завершения серверного вызова.
  2. Если в поле указано просто Товары (без префикса Объект) или любое другое имя (например, ТаблицаЦен), значит, на форме отображается реквизит формы.

В ситуации автора сообщения 6 именно это и произошло: он очищал Объект.Товары, в то время как на форме жила своей жизнью "произвольная таблица".

Как правильно заполнять данные на сервере

Рассмотрим правильный алгоритм работы на сервере, когда нам нужно обновить данные таблицы. Если мы работаем внутри модуля формы, у нас есть доступ и к Объекту, и к другим реквизитам формы.

Посмотрим на пример кода, который должен был использовать автор для корректного обновления данных, если таблица на форме — это реквизит ТоварыНаФорме:


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

Важный момент: если ваша задача — не просто отобразить данные, а сохранить их потом в документ, вам придется вручную перенести данные из реквизита формы обратно в Объект.Товары перед записью документа (обычно это делается в обработчике ПередЗаписьюНаСервере). Для решения этой задачи подойдёт готовый пример создания колонок в табличной части с сохранением значений в документе.

Использование методов ЗначениеВРеквизитФормы и РеквизитФормыВЗначение

Если логика заполнения сложная и требует использования методов прикладного объекта (например, методов менеджера или процедур из модулей объекта), мы применяем механизмы трансформации данных. Проанализируем ситуацию, когда нам нужно преобразовать данные из программного объекта в данные формы.

Рассмотрим шаги по использованию этих методов:

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

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


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

Этот метод ЗначениеВРеквизитФормы принудительно обновляет визуальное состояние формы. Однако помните, что он работает "тяжелее", чем прямое обращение к строкам реквизита, так как происходит полная перезагрузка коллекции.

Специфика документа "Установка цен номенклатуры"

Поскольку в сообщении 6 автор упомянул именно этот документ, разберем его особенности подробнее. В типовых решениях (УТ 11) заполнение этой формы происходит через специальные служебные модули.

Если вы пытаетесь программно изменить цены в этом документе через форму, крайне не рекомендуется напрямую трогать Объект.Товары. Вместо этого изучите процедуры типа РассчитатьЦены() или ЗаполнитьПоДаннымБазы() в модуле формы. Эти процедуры вызывают серверные функции, которые оперируют данными в реквизите ДеревоЦен, и только потом, при нажатии кнопки "Записать", данные "размазываются" по нескольким табличным частям объекта (Товары, ВидыЦен и т.д.).

Резюме и практические советы

Подведем итоги нашего анализа. Чтобы избежать "зависания" данных на форме, следуйте этим правилам:

Проблема автора заключалась в "трех соснах": он видел таблицу на экране, знал про табличную часть в объекте, но не учел, что между ними стоит посредник — произвольный реквизит формы. Понимание этой прослойки — ключ к успешной разработке на 1С 8.3.

← На главную