Ситуация, когда новый реквизит в 1С:Предприятии 7.7 корректно отображает значение в процессе выполнения программного кода (через Сообщить), но «исчезает» после открытия сохраненного документа, является классической проблемой для разработчиков на «семерке». Рассмотрим подробно причины возникновения этой ошибки и алгоритм ее решения, основываясь на опыте практикующих специалистов.
В платформе 1С 7.7 механизмы работы с объектами метаданных тесно связаны с физическими файлами таблиц .dbf. Если вы добавили реквизит в конфигураторе, прописали его заполнение в обработке загрузки, но данные не сохраняются, нам необходимо последовательно проверить несколько уровней: от логики кода до физической целостности базы данных.
Проанализируем типичный фрагмент кода загрузки, который часто становится источником проблем:
// Фрагмент кода загрузки из DBF
Док.Новый();
Док.ДатаДок = Шапка.DAT_BV;
Док.НомерДокумента = СокрП(Ном);
// Наш новый реквизит
Док.ИДГК = СокрП(Шапка.ID_GK);
Сообщить("Значение до записи: " + Док.ИДГК);
Док.Записать();
Сообщить("Значение после записи: " + Док.ИДГК);
Если оба сообщения выводят правильное значение, но в самом документе (в форме или в отчете) поле пустое, мы имеем дело с одной из следующих проблем.
Это самая распространенная ошибка. В 1С 7.7 на форме документа может располагаться поле ввода, которое не связано напрямую с данными объекта (документа). Проанализируем, как это проверить:
Важно: Если вы добавили «Реквизит формы» вместо «Реквизита документа», то значение будет существовать только пока открыта форма. Для постоянного хранения данных реквизит должен быть создан в дереве метаданных (в структуре документа).
В версии 7.7 при добавлении реквизита конфигуратор должен изменить структуру файла таблицы документов (например, DH*.dbf для шапки). Иногда этот процесс проходит некорректно, особенно если база работает в многопользовательском режиме или произошел сбой при сохранении 1cv7.md.
Рассмотрим шаги для восстановления синхронизации:
Проверим также файл 1cv7.dd (словарь данных). Если в нем отсутствует описание вашего нового поля, 1С не сможет физически записать данные в таблицу, даже если в коде ошибки не возникает.
Разберем ситуацию, когда идентификатор реквизита (например, ИДГК) совпадает с именем глобальной переменной или переменной, объявленной в модуле формы через Перем.
В 1С 7.7 приоритет имен работает специфически. Если в модуле формы документа объявлена Перем ИДГК;, то обращение к ней внутри формы будет перекрывать обращение к реквизиту документа. В обработке загрузки мы используем контекст объекта (Док.ИДГК), но при открытии формы или выполнении предопределенных процедур (например, ПриЗаписи() в модуле документа) значение может затираться локальной переменной.
Выясним, не является ли реквизит частью табличной части. Если ИДГК добавлен в табличную часть, то код Док.ИДГК = ... без позиционирования на конкретной строке (через НоваяСтрока() или ПолучитьСтроку()) не имеет смысла или будет работать некорректно.
Посмотрим на правильный алгоритм работы с реквизитами шапки и табличной части:
// Если ИДГК - реквизит шапки
Док.ИДГК = ЗначениеИзDBF;
// Если ИДГК - реквизит табличной части
Док.НоваяСтрока();
Док.Товар = СпрТовары.ТекущийЭлемент();
Док.ИДГК = ЗначениеИзDBF; // Значение запишется в конкретную строку
Проанализируем события, происходящие при вызове метода Записать(). В модуле документа могут существовать процедуры ПриЗаписи() или ОбработкаПроведения(). Рассмотрим вероятность того, что в этих процедурах написан код, который пересчитывает или очищает поля шапки.
Для диагностики рекомендуем временно добавить в модуль документа следующий код:
Процедура ПриЗаписи()
Сообщить("Значение ИДГК в момент записи в базу: " + ИДГК);
КонецПроцедуры
Если в этот момент значение пустое, значит, очистка происходит где-то в логике самого модуля документа еще до физического попадания данных на диск.
Если все вышеперечисленные методы не помогают, выполните следующие действия:
1cv7.dd, ищите по идентификатору документа) любой программой для просмотра DBF. Убедитесь, что колонка с именем вашего реквизита физически существует и содержит данные после работы обработки.СокрП() данные должны передаваться корректно, но лишние невидимые символы (ASCII 0) могут визуально скрывать текст в интерфейсе 1С.Таким образом, решение проблемы чаще всего кроется либо в несоответствии физической структуры таблиц (требуется реструктуризация), либо в ошибочном размещении реквизита на форме в качестве независимого объекта, не связанного с метаданными документа.