При разработке в конфигурации УТ 11.4 часто возникает задача добавить на форму документа дополнительные колонки для отображения или ввода данных. Однако, многие разработчики сталкиваются с тем, что после нажатия кнопки «Записать», введенные пользователем данные бесследно исчезают. Давайте разберемся, почему это происходит и как правильно организовать хранение и отображение данных.
Самая распространенная ошибка заключается в путанице между реквизитами формы и реквизитами объекта. Если вы добавили колонку только в окне «Реквизиты» в редакторе формы, то создали лишь «временное хранилище» в оперативной памяти.
В управляемых формах 1С при записи объекта происходит его «перечитывание» из базы данных. Если данные, которые вы ввели, не были физически сохранены в таблице базы данных (потому что реквизит не существует в метаданных самого объекта), платформа автоматически затирает их актуальными данными из базы. Чтобы данные сохранялись, необходимо добавить новый реквизит именно в структуру табличной части в дереве метаданных (слева в конфигураторе).
Даже если вы добавили реквизит в метаданные, данные могут очищаться или сбрасываться из-за логики типовых конфигураций. В УТ 11 активно используются серверные обработчики, которые принудительно обновляют состояние формы. Разберем жизненный цикл записи:
ПередЗаписью.ПриЧтенииНаСервере для обновления формы.Если в ПриЧтенииНаСервере прописана логика, которая заново инициализирует или пересчитывает колонки (например, цены или скидки), она может воспринимать ваши новые поля как «пустые» или требующие автоматического расчета. В итоге, после перезаписи объекта, ваши изменения будут перезаписаны стандартными алгоритмами системы.
Для корректной работы мы рекомендуем следовать алгоритму:
Если вы хотите, чтобы данные всегда были актуальными, используйте структуру, схожую с типовой логикой ЗаполнитьДанные. Рассмотрим упрощенный пример серверной процедуры, которую стоит вызывать при чтении объекта:
Процедура ЗаполнитьДополнительныеПоля(Объект)
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Здесь ваша логика расчета или проверки данных
Если СтрокаТЧ.Количество > 0 Тогда
СтрокаТЧ.МойНовыйРеквизит = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Вызывайте эту процедуру в ПриЧтенииНаСервере. Таким образом, при каждом перечитывании объекта из базы (которое происходит автоматически при записи) ваши данные будут гарантированно пересчитаны и отображены на форме корректно.
Чтобы точно определить, какой код «ломает» ваши данные, установите точки останова в следующих местах:
ПередЗаписью (проверьте, приходят ли туда данные в колонках).ПриЧтенииНаСервере (посмотрите, меняются ли данные после выполнения этой процедуры).Если после завершения ПриЧтенииНаСервере данные становятся пустыми — значит, именно эта процедура «затирает» их, и вам необходимо внести коррективы в алгоритм заполнения реквизитов внутри этой процедуры. Никогда не полагайтесь на то, что данные, введенные на клиенте, сохранятся сами собой, если они не являются полноценными реквизитами объекта, которые платформа умеет записывать в СУБД.