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