Как исправить ошибку «Значение не является значением объектного типа (Записать)» при настройке УТМ ЕГАИС в 1С:Розница

Программист 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

При обновлении конфигурации 1С:Розница на новые релизы пользователи и администраторы часто сталкиваются со сбоями в работе интеграции с ЕГАИС. Один из наиболее неприятных и неочевидных сбоев — невозможность открыть форму настроек подключения к Универсальному транспортному модулю (УТМ). При попытке войти в настройки система аварийно завершает работу с ошибкой: «Значение не является значением объектного типа (Записать)».

В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы Библиотеки стандартных подсистем (БСП) и рассмотрим несколько эффективных способов решения проблемы — от простых пользовательских действий до написания корректирующих обработок и создания расширений.

Техническая суть проблемы: почему происходит сбой?

Для понимания природы ошибки обратимся к архитектуре хранения данных в современных конфигурациях 1С. Все файлы, связанные с обменом ЕГАИС (справки, тикеты, запросы организаций, транспортные накладные), хранятся в специализированном справочнике ЕГАИСПрисоединенныеФайлы. Сами двоичные данные этих файлов могут находиться либо непосредственно в базе данных (в регистре сведений ДвоичныеДанныеФайлов), либо во внешних томах хранения на диске.

Когда вы пытаетесь открыть настройки подключения УТМ, система инициализирует проверку связи и обращается к кэшированным данным ЕГАИС. При этом вызывается стандартная функция общего модуля БСП:

ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Сообщение)

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

ДвоичныеДанные.Записать(ПутьКФайлу)

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

Основные причины повреждения двоичных данных

Мы можем выделить три ключевые причины, из-за которых файлы ЕГАИС теряют связь со своими двоичными данными:

  1. Некорректное обновление конфигурации. При переходе через несколько релизов (особенно при обновлении устаревших версий вроде 2.2.7 на актуальные 2.2.9 и выше) происходит глобальная реструктуризация таблиц ИБ. В этот момент связи между элементами справочника файлов и записями регистра двоичных данных могут нарушиться.
  2. Сбои при переносе базы данных. Если файлы хранились в томах на диске, а базу перенесли на другой компьютер или сервер без копирования папки томов (или изменились права доступа сетевой службы 1С к этим папкам), платформа не сможет считать физические файлы.
  3. Логические ошибки СУБД. Наличие «битых» или пустых ссылок (значений NULL) в таблицах хранения двоичных данных.

Рассмотрим подробнее практические методы устранения данной проблемы.

Способ 1. Локальное исправление через перезапрос данных организации ЕГАИС

Чаще всего сбой вызывают старые запросы данных по ФСРАР ID организаций, которые хранятся в кэше. Если при открытии настроек УТМ или связанных с ними документов происходит вылет, мы можем принудительно обновить информацию в базе, отправив повторный запрос.

Проанализируем алгоритм действий по шагам:

  1. Запустите конфигурацию и перейдите в журнал регистрации (меню Администрирование — Обслуживание — Журнал регистрации).
  2. Найдите событие ошибки в момент попытки открытия настроек УТМ. В детальном описании ошибки обратите внимание на идентификатор объекта (UUID) присоединенного файла, на котором спотыкается система.
  3. Определите, к какому контрагенту или собственной организации относится данный файл (обычно это старый запрос сведений об организации ЕГАИС).
  4. Перейдите в раздел работы с ЕГАИС и создайте новый документ Запрос данных ЕГАИС с типом «Организации».
  5. Укажите ФСРАР ID нужного контрагента или вашей организации и отправьте запрос в систему.
  6. После получения ответа от ЕГАИС старые некорректные записи в базе будут автоматически перезаписаны новыми актуальными данными. Это исправит структуру присоединенного файла, и ошибка при открытии настроек исчезнет.

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

Если поврежденных файлов в базе много, ручной перезапрос не поможет. В такой ситуации лучшим решением будет программный поиск и пометка на удаление всех элементов справочника ЕГАИСПрисоединенныеФайлы, которые не содержат реальных двоичных данных.

Выясним, как это реализовать. Для этого нам понадобится внешняя обработка, в которой мы выполним следующий код:


Выборка = Справочники.ЕГАИСПрисоединенныеФайлы.Выбрать();
КоличествоПоврежденных = 0;

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

Сообщить("Очистка завершена. Всего поврежденных файлов помечено на удаление: " + КоличествоПоврежденных);

После выполнения данного скрипта запустите стандартное интерактивное удаление помеченных объектов (Администрирование — Удаление помеченных объектов) и удалите битые файлы из базы данных. Это абсолютно безопасно для текущего учета, так как при следующем обмене ЕГАИС актуальные квитанции и схемы будут загружены заново.

Способ 3. Проверка прав доступа и путей к томам хранения

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

Проанализируем порядок диагностики этой проблемы:

  1. Перейдите в меню Администрирование — Настройки работы с файлами.
  2. Откройте гиперссылку Тома хранения файлов.
  3. Проверьте пути, указанные для каждого тома (особенно для систем под управлением Windows и Linux, где синтаксис путей различается). Если база данных была перенесена на новый сервер, обновите пути на актуальные.
  4. Убедитесь, что у учетной записи, от имени которой запущена служба сервера 1С:Предприятие (например, USR1CV8), есть полные права (чтение, запись, изменение) на папки, в которых расположены тома хранения файлов.

Способ 4. Использование расширения конфигурации (Быстрый обход ошибки)

Если вам необходимо срочно восстановить работоспособность кассы или торговой точки, а времени на поиск поврежденных файлов нет, можно применить «костыль» в виде небольшого расширения конфигурации. Мы перехватим процедуру записи двоичных данных на диск и добавим проверку на Неопределено.

Для этого выполните следующие действия:

  1. Создайте новое расширение в конфигураторе и добавьте в него общий модуль, отвечающий за работу с файлами ЕГАИС.
  2. Найдите процедуру, в которой происходит выгрузка двоичных данных во временную директорию перед вызовом метода Записать().
  3. Примените аннотацию &Вместо для модификации метода. Код в расширении должен выглядеть следующим образом:

&Вместо("ИмяПроцедурыЗаписиФайла")
Процедура Модифицированная_ИмяПроцедурыЗаписиФайла(Параметр1, Параметр2)
    // Код получения двоичных данных из оригинальной процедуры
    ДвоичныеДанные = ПолучитьНужныеДанные(Параметр1); 
    
    Если ДвоичныеДанные <> Неопределено Тогда
        ДвоичныеДанные.Записать(ПутьКФайлу);
    Иначе
        // Создаем пустой буфер двоичных данных во избежание аварийного завершения работы
        ПустыеДанные = Новый ДвоичныеДанные;
        ПустыеДанные.Записать(ПутьКФайлу);
    КонецЕсли;
КонецПроцедуры

Такое решение позволит форме настроек УТМ открыться без системных сбоев, после чего вы сможете спокойно провести диагностику и переполучить необходимые документы из ЕГАИС.

Рекомендации по профилактике

Чтобы избежать подобных проблем при последующих обновлениях конфигураций семейства 1С, настоятельно рекомендуем перед каждым крупным обновлением выполнять регламентную процедуру Тестирования и исправления (Конфигуратор — Администрирование — Тестирование и исправление) с включенными опциями проверки логической и ссылочной целостности базы данных, а также очистки недействующих ссылок.

← На главную