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