При разработке отчетов, выборок или обработок в платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией: при визуальном открытии документа в пользовательском интерфейсе поле заполнено ссылочным значением, однако запрос к базе данных или обращение через точку вида Ссылка.СчетКонтрагента возвращает пустую ссылку. Разберем основные технические причины подобного поведения и рассмотрим последовательные шаги диагностики структуры данных.
Самой распространенной причиной является несоответствие элемента управления на форме реквизиту объекта базы данных. Проанализируем, почему это происходит:
ПоступлениеНаРасчетныйСчет) присутствуют два похожих реквизита — СчетОрганизации (наш расчетный счет) и СчетКонтрагента (банковский счет плательщика). Если на форме отображается только один из них, визуально кажется, что банковский счет выбран, тогда как второй реквизит остается незаполненным.Объект.ИмяРеквизита. В этом случае значение отображается на экране, но не сохраняется в таблицу базы данных при стандартной записи.Текст, создавая видимость заполненности при фактически пустом значении.Чтобы исключить субъективную ошибку восприятия формы и убедиться в реальном состоянии данных в таблице, выполним быструю проверку непосредственно в интерфейсе пользователя:
Список, раскроем ветку Ссылка и добавим флажок напротив проверяемого реквизита (например, Счет контрагента или Счет плательщика).Нередко типовые конфигурации используют алгоритмы подстановки основных значений по умолчанию. Рассмотрим этот механизм подробнее:
В процедурах модуля формы ПриСозданииНаСервере или ПриЧтенииСозданииНаСервере может вызываться логика, которая при пустом значении реквизита считывает основной банковский счет из справочника Контрагенты и подставляет его в элемент формы. Если пользователь просто открыл документ, просмотрел его и закрыл без нажатия кнопки «Записать», в таблице базы данных реквизит останется пустой ссылкой.
В типовых решениях состав обязательных и сохраняемых реквизитов жестко завязан на реквизит ВидОперации. Проанализируем, как логика модулей может очищать реквизит:
ПередЗаписью или модуля формы ПередЗаписьюНаСервере при определенных видах операций (например, расчеты по кредитам, инкассация, прочие поступления) выполняется принудительная программная очистка реквизитов, не относящихся к данной операции.Если в информационной базе включено ограничение прав на уровне записей и таблиц (RLS), поведение запроса зависит от прав текущего пользователя и режима исполнения кода:
БанковскиеСчета или его владельца, запрос вернет пустую ссылку (или значение NULL при левых соединениях).
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10
| Док.Ссылка КАК Ссылка,
| Док.СчетКонтрагента КАК СчетКонтрагента
|ИЗ
| Документ.ПоступлениеНаРасчетныйСчет КАК Док
|ГДЕ
| Док.СчетКонтрагента = ЗНАЧЕНИЕ(Справочник.БанковскиеСчета.ПустаяСсылка)";
Результат = Запрос.Выполнить();
Для гарантированного выявления причины проблемы выполним следующие диагностические действия:
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Сообщить("Значение реквизита в базе: " + СокрЛП(ОбъектДокумента.СчетКонтрагента));
ПередЗаписью модуля объекта документа. Проверим значение переменной ЭтотОбъект.СчетКонтрагента в начале процедуры и непосредственно перед выходом из нее.ПередЗаписью через аннотации &Перед, &Вместо или &После и модифицирующих реквизиты объекта.