Как исправить ошибку «Значение не является значением объектного типа (ВалютаДокумента)» при открытии документа списания в 1С?

Бухгалтер 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При попытке открыть или скопировать документ Списание с расчетного счета в программе 1C:Бухгалтерия 8.3 пользователи нередко сталкиваются с аварийным завершением работы формы и системной ошибкой: «Значение не является значением объектного типа (ВалютаДокумента)». При этом документ перестает открываться, не позволяет просмотреть проводки или внести изменения стандартными средствами интерфейса. Разберем детально, почему возникает данный сбой, как работает программный механизм и какими способами можно восстановить работоспособность документов.

Причины возникновения ошибки и логика работы платформы

Проанализируем техническую сторону проблемы. Ошибка вида «Значение не является значением объектного типа» на уровне платформы 1С:Предприятие означает, что встроенный язык пытается обратиться через точку к реквизиту или свойству составного объекта, но переменная слева от точки содержит Неопределено или Null вместо ссылки на объект информационной базы.

При открытии формы документа Списание с расчетного счета на сервере отрабатывают типовые процедуры инициализации данных формы. Программа выполняет сбор параметров: считывает банковский счет организации, контрагента, договор контрагента и валюту расчетов. Сбой чаще всего происходит в следующих ситуациях:

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

Способ 1. Исправление через «Групповое изменение реквизитов»

Рассмотрим основной и наиболее эффективный пользовательский способ исправления поврежденных документов без изменения конфигурации и написания программного кода.

Разберем по шагам порядок действий:

  1. Перейдем в раздел «Администрирование» и выберем пункт «Обслуживание» (или сразу перейдем в «Корректировка данных» → «Групповое изменение реквизитов»).
  2. В поле «Выбирать элементы» укажем документ Списание с расчетного счета.
  3. Обязательно настроим отбор, нажав на гиперссылку «Все элементы»: добавим условие отбора по конкретному контрагенту или конкретным проблемным документам (по номеру или дате), чтобы не затронуть корректно работающие документы базы данных.
  4. Нажмем кнопку «Дополнительные параметры» (в правом верхнем углу или внизу формы обработки) и включим флаги:

    «Показывать служебные реквизиты»

    «Разрешить редактирование реквизитов объектов»

  5. В списке доступных реквизитов найдем поле Договор (или Договор контрагента) и выберем правильный действующий договор, принадлежащий именно этому контрагенту.
  6. Если поврежден служебный реквизит валюты, найдем поле Валюта документа и укажем валюту взаиморасчетов (например, руб.).
  7. Нажмем кнопку «Изменить реквизиты» и дождемся завершения выполнения операции.

После применения групповой обработки откроем документ повторно. Платформа успешно перечитает структуру договора и документ откроется в штатном режиме.

Способ 2. Программная диагностика и поиск поврежденных реквизитов

Если документов с ошибками много или визуально сложно определить, в каком именно поле кроется проблема, проанализируем состояние данных с помощью встроенного языка или консоли запросов. Посмотрим на пример проверочного запроса:


ВЫБРАТЬ
    Списание.Ссылка КАК ДокументСсылка,
    Списание.Номер КАК Номер,
    Списание.Дата КАК Дата,
    Списание.Контрагент КАК Контрагент,
    Списание.ДоговорКонтрагента КАК Договор,
    Списание.ДоговорКонтрагента.Владелец КАК ВладелецДоговора,
    Списание.ВалютаДокумента КАК Валюта
ИЗ
    Документ.СписаниеСРасчетногоСчета КАК Списание
ГДЕ
    Списание.Контрагент <> Списание.ДоговорКонтрагента.Владелец
    ИЛИ Списание.ДоговорКонтрагента ЕСТЬ NULL
    ИЛИ Списание.ВалютаДокумента ЕСТЬ NULL

Данный запрос позволяет моментально выявить строки, в которых контрагент документа не совпадает с владельцем прикрепленного договора, либо где значения валюты не заполнены.

Для программного исправления выборки документов можно воспользоваться следующим фрагментом кода:


Выборка = Документы.СписаниеСРасчетногоСчета.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.Контрагент.Пустая() Тогда
        Продолжить;
    КонецЕсли;
    
    // Проверяем корректность договора
    Если Выборка.ДоговорКонтрагента.Владелец <> Выборка.Контрагент Тогда
        ДокОбъект = Выборка.ПолучитьОбъект();
        ДокОбъект.ДоговорКонтрагента = Выборка.Контрагент.ОсновнойДоговорКонтрагента;
        
        Если НЕ ЗначениеЗаполнено(ДокОбъект.ВалютаДокумента) Тогда
            ДокОбъект.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
        КонецЕсли;
        
        Попытка
            ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
        Исключение
            Сообщить("Ошибка при записи документа № " + ДокОбъект.Номер + ": " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Способ 3. Проверка ссылочной целостности информационной базы

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

  1. Создадим резервную копию информационной базы (выгрузка в файл .dt или копия средствами СУБД).
  2. Запустим программу в режиме «Конфигуратор» от имени пользователя с административными правами.
  3. В главном меню перейдем в раздел «Администрирование» → «Тестирование и исправление...».
  4. Установим флаги напротив проверок:

    «Проверка логической целостности информационной базы»

    «Проверка ссылочной целостности информационной базы» (при наличии битых ссылок выберем вариант «Очищать ссылки» или «Создавать объекты»)

    «Реиндексация таблиц информационной базы»

  5. Нажмем кнопку «Выполнить» и ознакомимся с результатами в служебных сообщениях.

Способ 4. Очистка кэша настроек пользователя

Иногда форма документа может аварийно завершать работу из-за поврежденных пользовательских настроек отображения колонок или форм. Чтобы исключить влияние локального кэша, выполним следующие действия:

  1. Перейдем в раздел «Администрирование» → «Настройки пользователей и прав».
  2. Раскроем блок «Персональные настройки пользователей» и выберем «Очистка настроек».
  3. Выберем проблемного пользователя и в списке настроек очистим сохраненные параметры формы для документа Списание с расчетного счета.

Комплексное применение описанных методов позволяет полностью устранить ошибку ВалютаДокумента, восстановить целостность учетных данных и вернуть возможность штатной работы с банковскими документами.

← На главную