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

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

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

Выясняем причину: почему столбец «красный»?

В конфигураторе 1С вы наверняка заметили, что при добавлении элемента формы, который не привязан к данным объекта, он отображается красным цветом. Это означает, что данный элемент является свободным реквизитом формы.

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

Решение проблемы: правильный подход к архитектуре

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

Способ №1: Добавление реквизита в структуру объекта

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

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

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

Способ №2: Перезаполнение данных после записи

Если по каким-то причинам вы категорически не хотите менять структуру метаданных (например, данные имеют сугубо временный характер и не должны храниться в базе), вам придется управлять заполнением данных вручную. Однако стоит помнить: это «костыльное» решение, требующее поддержки.

Разберем логику реализации через события формы:

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

Пример концептуального кода для обработки событий:


// В модуле формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Инициализируем хранилище
    ЭтотОбъект.ВременныеДанные = Новый Соответствие;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    // Сохраняем данные из ТЧ во временное хранилище
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        ЭтотОбъект.ВременныеДанные.Вставить(СтрокаТЧ.КлючСвязи, СтрокаТЧ.МойКрасныйРеквизит);
    КонецЦикла;
КонецПроцедуры

Почему не стоит использовать другие методы?

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

Резюме: Если вы хотите, чтобы данные были стабильными и надежными, всегда добавляйте реквизит в структуру объекта (способ №1). Использование «красных» свободных колонок оправдано только в крайне редких случаях, когда данные не требуют постоянного хранения и вы готовы обеспечить сложную логику их восстановления программным путем.

← На главную