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