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