Почему не сохраняются введенные данные в новых реквизитах документа 1С

Программист 1С v8.3 (Обычные формы) Сфера услуг, туризм и социальный сектор
← На главную

При доработке типовых конфигураций 1С, особенно таких специфических, как «Альфа-Авто» от Рарус, начинающие разработчики часто сталкиваются с ситуацией: новые реквизиты добавлены в документ, выведены на форму, пользователь вводит в них данные, нажимает «Записать», но после переоткрытия документа поля снова оказываются пустыми. Рассмотрим подробно, почему это происходит и как правильно настроить сохранение данных.

Разбираем основную причину: Связь данных и элементов управления

Проанализируем механику работы 1С с формами (особенно это актуально для обычных форм на платформе 8.1, 8.2 и 8.3). В 1С существует четкое разделение между данными, которые хранятся в базе данных (реквизиты документа), и данными, которые существуют только пока открыта форма (реквизиты формы).

Выясним причину проблемы, описанную в теме: автор добавил реквизиты в метаданные документа (вкладка «Данные»), а затем добавил аналогичные реквизиты на саму форму. При размещении поля ввода на форме программа спрашивает или автоматически подставляет путь к данным. Если поле ввода связано с реквизитом формы, а не с реквизитом объекта, то при закрытии формы эти данные просто испарятся, так как они не передаются в объект ДокументОбъект перед записью.

Пошаговое решение для обычных форм

Разберем по шагам, как правильно привязать поля, чтобы данные сохранялись в базу данных:

  1. Откроем конструктор формы документа в конфигураторе.
  2. Перейдем на закладку «Реквизиты». Посмотрим внимательно на дерево реквизитов. Там должен быть основной реквизит с типом ДокументОбъект.ИмяВашегоДокумента. Если вы развернете этот узел (нажав на «плюсик»), вы увидите все реквизиты, которые добавлены в сам документ в дереве метаданных.
  3. Найдем на форме поле ввода, которое «не сохраняется». Откроем его свойства (правой кнопкой мыши — Свойства или Alt+Enter).
  4. Найдем пункт «Данные». Проанализируем, что там написано. Если там указано просто имя реквизита (например, ПроцентПредоплаты), это означает, что поле связано с реквизитом формы.
  5. Нажмем на кнопку выбора в поле «Данные» и выберем реквизит через путь: ДокументОбъект.ПроцентПредоплаты.

Важно: Только когда путь к данным начинается с ДокументОбъект (в обычных формах) или Объект (в управляемых формах), платформа понимает, что значение из этого поля нужно записать в соответствующее поле таблицы базы данных при выполнении команды «Записать».

Специфика конфигураций «Альфа-Авто» и защищенные модули

Рассмотрим ситуацию, когда привязка данных выполнена верно, но данные всё равно не сохраняются. В решениях от компании Рарус (например, «Альфа-Авто 4.1») часто используется программная логика, скрытая в защищенных модулях. Посмотрим на возможные программные причины:

Во многих документах Раруса процедура ПередЗаписью или ПриЗаписи вызывает функции из общих модулей (например, ЗащищенныеФункции). Если исходный код недоступен, мы можем лишь догадываться о логике, но зачастую там происходит принудительная инициализация структур. Если вы добавили реквизит в метаданные, но не включили его в специфические алгоритмы обработки (если они жестко прописаны), система может очищать «незнакомые» ей поля.

Проанализируем также совет из сообщения 40. Часто разработчики создают в модуле формы или объекта промежуточные переменные с теми же именами, что и реквизиты. Посмотрим на пример кода, который может привести к ошибке:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Ошибка: использование локальной переменной вместо реквизита объекта
    СуммаПредоплаты = 0; 
    // Если в модуле определена переменная с таким же именем, 
    // она может перекрывать реквизит документа.
КонецПроцедуры

Чтобы избежать такой «подмены», всегда явно обращайтесь к реквизитам объекта через ключевое слово ЭтотОбъект:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтотОбъект.ПроцентПредоплаты > 0 Тогда
        ЭтотОбъект.СуммаПредоплаты = ЭтотОбъект.СуммаДокумента * (ЭтотОбъект.ПроцентПредоплаты / 100);
    КонецЕсли;
КонецПроцедуры

Нюансы для управляемых форм

Рассмотрим ситуацию в управляемом приложении (сообщение 41). Здесь механика иная: данные живут на сервере в реквизите Объект. Если данные «исчезают» после записи, проанализируем следующие моменты:

Как проверить, где именно пропадают данные?

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

  1. Поставим точку останова в модуле объекта в процедуре ПередЗаписью.
  2. В момент остановки программы откроем «Вычислить выражение» (Shift+F9) и проверим значение ЭтотОбъект.ИмяВашегоРеквизита.
  3. Если значение там есть, значит, данные успешно переданы из формы в объект. Проблема кроется в процессе самой записи (например, срабатывает обнуление в защищенном модуле или в подписках на события).
  4. Если значения там уже нет (оно пустое), значит, данные не дошли из формы. Нужно проверять свойство Данные у элемента управления на форме.
  5. Если в базе данных (проверяется через Консоль запросов) значение есть, а в форме пусто — проблема в процедурах ПриОткрытии или ПриЧтенииНаСервере, где значение может очищаться кодом.

Подводя итог, в большинстве случаев проблема решается внимательной проверкой пути к данным в свойствах элементов управления формы. Никогда не забывайте, что форма — это лишь визуальное представление, и она должна быть жестко связана с объектом базы данных для корректного сохранения информации.

← На главную