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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Причина 1: Некорректное размещение реквизита

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

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

Причина 2: Пересчет данных в обработчиках событий

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

  1. Выполнение процедур ПередЗаписью.
  2. Запись данных в базу.
  3. Выполнение процедуры ПриЧтенииНаСервере для обновления формы.

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

Как правильно организовать работу с колонками?

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

Пример реализации логики пересчета

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


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

Вызывайте эту процедуру в ПриЧтенииНаСервере. Таким образом, при каждом перечитывании объекта из базы (которое происходит автоматически при записи) ваши данные будут гарантированно пересчитаны и отображены на форме корректно.

Рекомендация по диагностике

Чтобы точно определить, какой код «ломает» ваши данные, установите точки останова в следующих местах:

Если после завершения ПриЧтенииНаСервере данные становятся пустыми — значит, именно эта процедура «затирает» их, и вам необходимо внести коррективы в алгоритм заполнения реквизитов внутри этой процедуры. Никогда не полагайтесь на то, что данные, введенные на клиенте, сохранятся сами собой, если они не являются полноценными реквизитами объекта, которые платформа умеет записывать в СУБД.

← На главную