При работе с расширениями в конфигурации 1С:Управление торговлей 11.4 (особенно в модулях документов, связанных с маркировкой, таких как ЗаказНаЭмиссиюКодовМаркировкиСУЗ), программисты часто сталкиваются с досадной ошибкой: "Процедура или функция с указанным именем не определена (Прочитать)". Эта проблема может проявляться как при запуске предприятия, так и при попытке открыть форму в конфигураторе, что иногда приводит к аварийному завершению работы (вылету) платформы.
В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизмы работы платформы с расширениями и предложим пошаговые инструкции по исправлению ошибки.
Самая распространенная причина — это невнимательность при объявлении параметров процедур. Рассмотрим типовой фрагмент кода, который часто встречается в расширениях:
&НаСервере
Процедура ОбновитьПредставленияНаФорме(Прочитать = Ложь)
Если Прочитать Тогда
Прочитать();
Иначе
ОбновитьСтатусИСМП();
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: в заголовке процедуры объявлен параметр с именем Прочитать. В языке 1С существует встроенный метод формы Прочитать(), который перечитывает данные объекта из базы данных. Когда мы объявляем параметр с таким же именем, внутри этой процедуры имя Прочитать начинает указывать на локальную переменную (параметр), а не на метод формы.
Посмотрим на строку Прочитать();. С точки зрения компилятора, вы пытаетесь вызвать переменную типа Булево как функцию. Поскольку переменная не является функцией, система выдает ошибку "Процедура или функция не определена".
Как исправить:
Для решения этой проблемы необходимо явно указать контекст вызова метода формы. Вместо простого обращения, используйте обращение через ЭтотОбъект:
&НаСервере
Процедура ОбновитьПредставленияНаФорме(Прочитать = Ложь)
Если Прочитать Тогда
ЭтотОбъект.Прочитать(); // Теперь система понимает, что вызывается метод формы
Иначе
ОбновитьСтатусИСМП();
КонецЕсли;
КонецПроцедуры
Либо, что более правильно с точки зрения чистоты кода, переименуйте параметр процедуры, например, в НужноВыполнитьЧтение.
Методы Прочитать(), Записать() и Модифицированность() доступны форме только в том случае, если у нее назначен Основной реквизит (обычно это реквизит Объект с типом ДокументОбъект).
Выясним причину, почему это происходит в расширениях. При заимствовании формы в расширение, связь между формой и ее основным реквизитом может "надломиться" из-за различий в версиях основной конфигурации и расширения (особенно после обновления платформы или конфигурации).
Разберем, как это проверить:
Объект. Проверьте, выделен ли он жирным шрифтом.Проанализируем ситуацию, описанную пользователями: конфигуратор "вылетает" при попытке открыть заимствованную форму. Это часто случается на версиях платформы 8.3.15 и 8.3.16. Причина кроется в повреждении кэша метаданных или в некорректном сопоставлении идентификаторов объектов (UUID) между основной конфигурацией и расширением.
Если обновление расширения через стандартную команду (правой кнопкой на расширении — "Обновить") не помогает, рассмотрим радикальный, но эффективный метод:
Этот метод позволяет "вылечить" форму от внутренних противоречий в структуре XML-описания метаданных, которые возникают при обновлении типовых конфигураций (например, при переименовании документов или реквизитов в 1С:УТ).
Иногда ошибка "Записать" или "Прочитать" возникает из-за того, что в расширении была добавлена кнопка или команда, вызывающая эти методы напрямую, но в свойствах команды неверно указан контекст выполнения или отсутствует связь с объектом.
Посмотрим на пример:
В расширении вы добавили команду &НаКлиенте Процедура МояКоманда(Команда). Внутри вы вызываете Записать();. Если форма сложная и расширение перекрывает стандартные обработчики событий (например, ПриЗаписи или ПередЗаписью), платформа может потерять область видимости стандартных методов, если расширение подключено некорректно.
Рекомендация: Всегда проверяйте, что расширение имеет тип "Адаптация" или "Дополнение" и у него снята галочка "Безопасный режим", если вы используете специфические вызовы серверного контекста.
Подведем итоги нашего анализа. Ошибка "Процедура не определена" в 90% случаев в расширениях 1С:УТ 11 решается следующими шагами:
Прочитать(). Используйте ЭтотОбъект.Прочитать() для исключения конфликта.Объект является основным в форме расширения.Помните, что расширения — это мощный инструмент, но они требуют внимательности к контексту выполнения кода. Использование явного указания ЭтотОбъект — это хороший тон программирования, который убережет вас от подобных ошибок в будущем.