При разработке и интеграции внешних обработок заполнения табличных частей в конфигурациях 1С на обычных формах (таких как «Управление производственным предприятием 1.3» (УПП), «Комплексная автоматизация 1.1» (КА) или «Управление торговлей 10.3» (УТ)) программисты регулярно сталкиваются с непредвиденным поведением системы. Одной из самых частых и досадных ошибок является аварийное завершение работы с диагностическим сообщением вида: Значение не является значением объектного типа (Записать).
Давайте подробно проанализируем, почему возникает эта ошибка, как устроен механизм работы с внешними обработками через типовой общий модуль УниверсальныеМеханизмы, и какие пошаговые действия помогут полностью решить проблему.
Для начала выясним причину сбоя, обратив внимание на строку кода в общем модуле, которую указывает конфигуратор:
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(613)}: Значение не является значением объектного типа (Записать)
Эта ошибка означает, что в коде общего модуля метод Записать() вызывается у переменной, которая на самом деле имеет значение Неопределено (то есть не инициализирована как объект). Давайте заглянем в типовой алгоритм работы модуля УниверсальныеМеханизмы:
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла); // Ошибка происходит на этой строке!
Рассмотрим этот процесс по шагам:
ПолучитьИмяВременногоФайла()..epf) из реквизита типа ХранилищеЗначения (обычно это реквизит ХранилищеВнешнейОбработки справочника «Внешние обработки»).Записать(). Если в хранилище ничего нет, переменная ДвоичныеДанные принимает значение Неопределено, что и приводит к критическому сбою всей цепочки исполнения.Существует несколько основных причин, по которым платформа не может получить двоичные данные из базы:
.epf внутрь загружен не был, либо после выбора файла не была нажата кнопка сохранения элемента.AppData\Local\Temp). В результате функция ПолучитьИмяВременногоФайла() выдает путь, но физически записать туда данные не удается.Рассмотрим подробнее каждый из способов решения проблемы — от простых административных действий до корректировки программного кода конфигурации.
Самый быстрый и частый способ устранения ошибки — перезаписать элемент справочника:
.epf).Если файл точно загружен, но ошибка сохраняется, убедитесь, что у пользователя есть необходимые права на запуск внешнего кода:
Если ваша конфигурация находится на поддержке с возможностью изменения, мы рекомендуем добавить проверку в общий модуль УниверсальныеМеханизмы. Это спасет пользователей от непонятных системных ошибок, сразу указывая на суть проблемы.
Изменим исходный код в модуле, добавив проверку на Неопределено:
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
// Безопасная проверка двоичных данных перед записью
Если ДвоичныеДанные = Неопределено Тогда
ВызватьИсключение "Не удалось запустить внешнюю обработку!
Возможные причины:
1. Файл внешней обработки (.epf) не был корректно загружен в информационную базу.
2. У текущего пользователя отсутствуют права на запуск внешних обработок.";
КонецЕсли;
ДвоичныеДанные.Записать(ИмяФайла);
Для того чтобы каждый раз не тратить время на загрузку файла в справочник в процессе отладки, рекомендуется запускать внешнюю обработку напрямую через меню Файл — Открыть. Для этого в модуле объекта обработки должна быть правильно реализована экспортная процедура Инициализировать().
Давайте посмотрим на пример правильного кода модуля объекта внешней обработки табличной части:
// Экспортная процедура, вызываемая типовым механизмом заполнения ТЧ
Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт
// Сохраняем переданные параметры во временные переменные
ДокументОбъект = Объект;
ИмяТЧ = ИмяТабличнойЧасти;
ПолеТЧ = ТабличноеПоле;
// Получаем и открываем основную форму обработки
ФормаОбработки = ПолучитьФорму("Форма");
// Передаем контекст документа в форму (если это необходимо для дальнейшей работы)
ФормаОбработки.ДокументВладелец = ДокументОбъект;
ФормаОбработки.ИмяТабличнойЧасти = ИмяТЧ;
// Открываем форму в модальном режиме
ФормаОбработки.ОткрытьМодально();
КонецПроцедуры
Используя этот подход и эмулируя параметры вызова непосредственно в процедурах формы, вы сможете легко вести отладку обработки с помощью клавиши F5 напрямую из конфигуратора, минуя стадию постоянного импорта файла в базу данных.