При разработке в среде 1С:Предприятие 8 (особенно на платформе с использованием «обычных форм», таких как в конфигурации БГУ 1.0) программисты часто сталкиваются с парадоксальной ситуацией. Программный код отрабатывает без ошибок, значение реквизиту присваивается, метод Записать() выполняется успешно, и даже консоль запросов подтверждает наличие данных в таблице базы данных. Однако при открытии документа в интерфейсе поле ввода остается абсолютно пустым. Рассмотрим подробнее, почему это происходит и как исправить эту ошибку.
Разберем ситуацию по шагам. Основная причина кроется не в механизме записи данных, а в механизме их визуализации на форме. В обычных формах элементы управления типа «Поле ввода» имеют ряд специфических свойств, которые могут блокировать отображение значения. Проанализируем основные факторы:
СписокВыбора этого элемента. Если в списке нет строки, в точности совпадающей со значением в базе, поле будет выглядеть пустым.Значения (то, что хранится в базе) и Представления (то, что видит пользователь). Если вы программно записываете в реквизит «красивое» название (Представление) вместо технического идентификатора (Значения), механизм сопоставления не сработает.Прежде чем приступать к исправлению кода, необходимо убедиться, что проблема действительно в интерфейсе, а не в записи. Используем стандартную консоль запросов. Выполним простой запрос к таблице документа:
ВЫБРАТЬ
Ссылка,
МакетПервичногоДокумента
ИЗ
Документ.СписаниеМатериалов
ГДЕ
Ссылка = &СсылкаНаДокумент
Если запрос возвращает ожидаемую строку (например, "Акт о списании материалов (ф. 0504230, ред.52н)"), значит, программная часть записи объекта выполнена верно. Проблема локализована в модуле формы или свойствах элемента управления.
Рассмотрим пример кода, который часто приводит к ошибкам, и приведем его к надежному виду. Проанализируем рекомендации по безопасной записи объекта. Вместо использования неочевидных имен переменных (например, просто Объект), лучше использовать более явные названия и добавлять проверки.
// Безопасный метод присвоения значения
Если ЗначениеЗаполнено(НдокСсылка) Тогда
ДокОбъект = НдокСсылка.ПолучитьОбъект();
// ВАЖНО: убедитесь, что присваиваемая строка полностью совпадает
// со "Значением" в списке выбора на форме
ДокОбъект.МакетПервичногоДокумента = "Акт о списании материалов (ф. 0504230, ред.52н)";
Попытка
ДокОбъект.Записать();
Сообщить("Значение успешно записано в базу.");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Выясним причину «очистки» поля при открытии. В конфигурациях типа БГУ 1.0 формирование списков доступных макетов часто происходит динамически. За это отвечают общие модули, такие как УниверсальныеМеханизмы.
Рассмотрим фрагмент стандартной процедуры ПриИзменении, которая управляет логикой выбора макета:
Процедура МакетПервичногоДокументаПриИзменении(Элемент)
// Универсальный механизм устанавливает параметры печати по умолчанию
УниверсальныеМеханизмы.УстановитьПечатьПоУмолчанию(
мПечатьПоУмолчанию,
ЭлементыФормы.ОсновныеДействияФормы,
мДеревоМакетов,
Метаданные.Имя,
Новый Действие("ОсновныеДействияФормыПечатьПоУмолчанию"),
ЭлементыФормы.МакетПервичногоДокумента,
ЭтоНовый
);
РаботаСДиалогами.ЗаполнитьВидПервичногоДокумента(ЭтотОбъект, ЭтаФорма);
КонецПроцедуры
Проанализируем этот код. Функция ЗаполнитьВидПервичногоДокумента берет данные из СписокВыбора элемента формы. Если при открытии формы ваш макет не был добавлен в этот динамический список (например, из-за настроек пользователя или фильтров по организации), то попытка сопоставить значение из базы со списком провалится.
Посмотрим на функцию поиска в списке выбора, которая часто используется в типовых решениях:
Функция ПолучитьСтрокуДереваМакетовПоУмолчаниюДляЗаписанногоОбъекта(ДеревоКнопок, ЭУВидПервичногоДокумента)
Если ТипЗнч(ЭУВидПервичногоДокумента) = Тип("ПолеВвода") Тогда
Если ЗначениеЗаполнено(ЭУВидПервичногоДокумента.Значение) Тогда
// Ищем в списке выбора элемент по ЗНАЧЕНИЮ
ЭлементСпискаВыбора = ЭУВидПервичногоДокумента.СписокВыбора.НайтиПоЗначению(ЭУВидПервичногоДокумента.Значение);
Если ЭлементСпискаВыбора <> Неопределено Тогда
// Только если нашли, возвращаем представление для интерфейса
ИмяМакетаПоУмолчанию = ЭлементСпискаВыбора.Представление;
// ... дальнейшая логика
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецФункции
Важный совет: Если вы столкнулись с пустой формой, проверьте в отладчике содержимое коллекции ЭлементыФормы.МакетПервичногоДокумента.СписокВыбора в момент выполнения процедуры ПриОткрытии. Убедитесь, что:
Значение в элементе списка, а не полю Представление.Для окончательного решения проблемы рекомендуется проверить следующие настройки в конфигураторе:
Объект.МакетПервичногоДокумента).ПередОткрытием, если оно отсутствует.ПриУстановкеДанных. Это поможет найти место, где значение «затирается» логикой конфигурации.Таким образом, проблема «пустого реквизита» в 1С чаще всего является следствием работы строгих фильтров элементов управления в обычных формах. Сопоставление данных базы и состава СпискаВыбора — ключ к исправлению этой ошибки.