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