Как исправить ошибку «Значение не является значением объектного типа (Записать)» при вызове внешней обработки в УПП 1.3?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке и интеграции внешних обработок заполнения табличных частей в конфигурациях 1С на обычных формах (таких как «Управление производственным предприятием 1.3» (УПП), «Комплексная автоматизация 1.1» (КА) или «Управление торговлей 10.3» (УТ)) программисты регулярно сталкиваются с непредвиденным поведением системы. Одной из самых частых и досадных ошибок является аварийное завершение работы с диагностическим сообщением вида: Значение не является значением объектного типа (Записать).

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

Разбор механизма возникновения ошибки

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

{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(613)}: Значение не является значением объектного типа (Записать)

Эта ошибка означает, что в коде общего модуля метод Записать() вызывается у переменной, которая на самом деле имеет значение Неопределено (то есть не инициализирована как объект). Давайте заглянем в типовой алгоритм работы модуля УниверсальныеМеханизмы:


ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла); // Ошибка происходит на этой строке!

Рассмотрим этот процесс по шагам:

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

Выясняем причины: почему хранилище двоичных данных оказывается пустым?

Существует несколько основных причин, по которым платформа не может получить двоичные данные из базы:

  1. Файл обработки физически не загружен в карточку справочника. Это классическая ошибка невнимательности разработчика: элемент справочника «Внешние обработки» успешно создан, но сам файл .epf внутрь загружен не был, либо после выбора файла не была нажата кнопка сохранения элемента.
  2. Ограничения прав доступа на запуск внешних обработок. В конфигурации УПП 1.3 действует строгая подсистема прав. Если у текущего пользователя в настройках дополнительных прав (меню Сервис — Пользователи — Настройка дополнительных прав) снят флаг «Разрешить запуск внешних обработок», платформа заблокирует чтение файла из СУБД из соображений безопасности.
  3. Безопасный режим исполнения (Safe Mode). Если обработка зарегистрирована с признаком работы в безопасном режиме, то попытки работы с локальной файловой системой могут блокироваться платформой, что приводит к невозможности извлечь или сохранить файл во временную папку.
  4. Проблемы кэширования временных файлов. При интенсивном цикле разработки и частой перезаписи одной и той же внешней обработки операционная система может заблокировать доступ к файлу во временной директории (AppData\Local\Temp). В результате функция ПолучитьИмяВременногоФайла() выдает путь, но физически записать туда данные не удается.

Варианты решения проблемы

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

Решение 1. Повторная загрузка файла в справочник

Самый быстрый и частый способ устранения ошибки — перезаписать элемент справочника:

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

Решение 2. Проверка дополнительных прав пользователя

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

  1. Откройте базу данных под учетной записью с административными правами.
  2. Перейдите в меню: Сервис — Пользователи — Настройка дополнительных прав.
  3. Выберите нужного пользователя (или группу пользователей).
  4. Найдите флаг «Разрешить запуск внешних обработок» и установите его в значение «Истина».
  5. Сохраните изменения. Попросите пользователя перезапустить программу 1С.

Решение 3. Модификация общего модуля для вывода понятного сообщения

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

Изменим исходный код в модуле, добавив проверку на Неопределено:


ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();

// Безопасная проверка двоичных данных перед записью
Если ДвоичныеДанные = Неопределено Тогда
    ВызватьИсключение "Не удалось запустить внешнюю обработку! 
    Возможные причины: 
    1. Файл внешней обработки (.epf) не был корректно загружен в информационную базу.
    2. У текущего пользователя отсутствуют права на запуск внешних обработок.";
КонецЕсли;

ДвоичныеДанные.Записать(ИмяФайла);

Решение 4. Настройка правильного кода инициализации обработки для быстрой отладки

Для того чтобы каждый раз не тратить время на загрузку файла в справочник в процессе отладки, рекомендуется запускать внешнюю обработку напрямую через меню Файл — Открыть. Для этого в модуле объекта обработки должна быть правильно реализована экспортная процедура Инициализировать().

Давайте посмотрим на пример правильного кода модуля объекта внешней обработки табличной части:


// Экспортная процедура, вызываемая типовым механизмом заполнения ТЧ
Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт
    
    // Сохраняем переданные параметры во временные переменные
    ДокументОбъект = Объект;
    ИмяТЧ = ИмяТабличнойЧасти;
    ПолеТЧ = ТабличноеПоле;
    
    // Получаем и открываем основную форму обработки
    ФормаОбработки = ПолучитьФорму("Форма");
    
    // Передаем контекст документа в форму (если это необходимо для дальнейшей работы)
    ФормаОбработки.ДокументВладелец = ДокументОбъект;
    ФормаОбработки.ИмяТабличнойЧасти = ИмяТЧ;
    
    // Открываем форму в модальном режиме
    ФормаОбработки.ОткрытьМодально();
    
КонецПроцедуры

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

← На главную