Почему в 1С:УТ 11.4 возникает ошибка Процедура или функция с указанным именем не определена (Прочитать)

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

При работе с расширениями в конфигурации 1С:Управление торговлей 11.4 (особенно в модулях документов, связанных с маркировкой, таких как ЗаказНаЭмиссиюКодовМаркировкиСУЗ), программисты часто сталкиваются с досадной ошибкой: "Процедура или функция с указанным именем не определена (Прочитать)". Эта проблема может проявляться как при запуске предприятия, так и при попытке открыть форму в конфигураторе, что иногда приводит к аварийному завершению работы (вылету) платформы.

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

Причина 1: Конфликт имен (Маскирование встроенного метода параметром)

Самая распространенная причина — это невнимательность при объявлении параметров процедур. Рассмотрим типовой фрагмент кода, который часто встречается в расширениях:


&НаСервере
Процедура ОбновитьПредставленияНаФорме(Прочитать = Ложь)
    Если Прочитать Тогда
        Прочитать();
    Иначе
        ОбновитьСтатусИСМП();
    КонецЕсли;
КонецПроцедуры

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

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

Как исправить:

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


&НаСервере
Процедура ОбновитьПредставленияНаФорме(Прочитать = Ложь)
    Если Прочитать Тогда
        ЭтотОбъект.Прочитать(); // Теперь система понимает, что вызывается метод формы
    Иначе
        ОбновитьСтатусИСМП();
    КонецЕсли;
КонецПроцедуры

Либо, что более правильно с точки зрения чистоты кода, переименуйте параметр процедуры, например, в НужноВыполнитьЧтение.

Причина 2: Сбой основного реквизита в расширении

Методы Прочитать(), Записать() и Модифицированность() доступны форме только в том случае, если у нее назначен Основной реквизит (обычно это реквизит Объект с типом ДокументОбъект).

Выясним причину, почему это происходит в расширениях. При заимствовании формы в расширение, связь между формой и ее основным реквизитом может "надломиться" из-за различий в версиях основной конфигурации и расширения (особенно после обновления платформы или конфигурации).

Разберем, как это проверить:

  1. Откройте форму документа в расширении.
  2. Перейдите на вкладку "Реквизиты".
  3. Найдите реквизит Объект. Проверьте, выделен ли он жирным шрифтом.
  4. Если реквизит не выделен жирным, значит, он потерял статус Основного реквизита. Щелкните по нему правой кнопкой мыши и выберите "Установить основным реквизитом".

Причина 3: Особенности работы платформы (8.3.15 - 8.3.16)

Проанализируем ситуацию, описанную пользователями: конфигуратор "вылетает" при попытке открыть заимствованную форму. Это часто случается на версиях платформы 8.3.15 и 8.3.16. Причина кроется в повреждении кэша метаданных или в некорректном сопоставлении идентификаторов объектов (UUID) между основной конфигурацией и расширением.

Если обновление расширения через стандартную команду (правой кнопкой на расширении — "Обновить") не помогает, рассмотрим радикальный, но эффективный метод:

  1. Сохраните ваш код: Перед удалением формы из расширения обязательно скопируйте весь добавленный программный код в текстовый файл.
  2. Удалите форму из расширения: Найдите форму в дереве метаданных расширения и удалите ее.
  3. Заимствуйте форму заново: Найдите эту форму в основной конфигурации, нажмите правой кнопкой мыши и выберите "Добавить в расширение".
  4. Перенесите изменения: После чистого заимствования верните программный код и элементы управления обратно.

Этот метод позволяет "вылечить" форму от внутренних противоречий в структуре XML-описания метаданных, которые возникают при обновлении типовых конфигураций (например, при переименовании документов или реквизитов в 1С:УТ).

Причина 4: Вызов серверных методов из неподходящего контекста

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

Посмотрим на пример:

В расширении вы добавили команду &НаКлиенте Процедура МояКоманда(Команда). Внутри вы вызываете Записать();. Если форма сложная и расширение перекрывает стандартные обработчики событий (например, ПриЗаписи или ПередЗаписью), платформа может потерять область видимости стандартных методов, если расширение подключено некорректно.

Рекомендация: Всегда проверяйте, что расширение имеет тип "Адаптация" или "Дополнение" и у него снята галочка "Безопасный режим", если вы используете специфические вызовы серверного контекста.

Резюме и практические советы

Подведем итоги нашего анализа. Ошибка "Процедура не определена" в 90% случаев в расширениях 1С:УТ 11 решается следующими шагами:

Помните, что расширения — это мощный инструмент, но они требуют внимательности к контексту выполнения кода. Использование явного указания ЭтотОбъект — это хороший тон программирования, который убережет вас от подобных ошибок в будущем.

← На главную