К статье
Практический материал

Разработка и Конфигурация · 10 мин

Ошибка 1С «Обращение к процедуре как к функции»: причины и способы исправления

Ошибка 1С «Обращение к процедуре как к функции»: почему возникает, как найти проблемный код, исправить вызов и проверить результат. Примеры и типичные ошибки.

Ошибка «Обращение к процедуре как к функции» — одна из самых частых синтаксических ошибок, с которыми сталкиваются разработчики и администраторы 1С при доработке конфигураций. Она возникает, когда код пытается получить возвращаемое значение от метода, который объявлен как процедура и по определению ничего не возвращает.

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

Хорошая новость в том, что ошибка всегда локальна: она указывает на конкретный модуль, строку и метод. Проблема решается либо исправлением вызова, либо изменением объявления метода — в зависимости от того, какое поведение было задумано изначально.

Что именно означает эта ошибка

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

Ошибка может проявиться на двух этапах. При синтаксической проверке модуля в конфигураторе она выводится в окне сообщений с указанием строки. Если код не проверялся, ошибка возникнет в режиме «Предприятие» в момент первого обращения к проблемному методу — и работа пользователя прервётся.

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

Где искать проблемный код

Текст сообщения об ошибке содержит имя модуля и номер строки. Откройте конфигуратор, перейдите к указанному модулю (общий модуль, модуль объекта, формы или обработки) и найдите строку. Обычно проблема видна сразу: результат вызова присваивается переменной, сравнивается с чем-либо или передаётся в другой метод.

Если сообщение указывает на место вызова, а не на объявление, выполните поиск самого метода: выделите его имя и нажмите F12 или используйте контекстное меню «Перейти к определению». Так вы увидите, объявлен ли метод как «Процедура» или как «Функция».

После любого исправления запустите проверку модуля: меню «Конфигурация» → «Проверка конфигурации» или кнопка синтаксического контроля модуля. Это покажет, остались ли другие места с аналогичной проблемой — часто один метод вызывается из нескольких точек.

Порядок действий
  1. 1
    Прочитайте сообщение об ошибке: запомните модуль и номер строки
  2. 2
    Откройте модуль и найдите вызов, где результат присваивается или используется в выражении
  3. 3
    Перейдите к определению метода (F12) и проверьте — процедура это или функция
  4. 4
    Решите, что задумано: исправьте вызов или измените объявление метода
  5. 5
    Выполните синтаксическую проверку модуля и всей конфигурации
  6. 6
    Протестируйте сценарий в режиме «Предприятие» на копии базы

Способ 1: исправить место вызова

Если метод задумывался как процедура — то есть он выполняет действие (записывает объект, выводит сообщение, заполняет табличную часть) и результат ему не нужен, — правильное решение: исправить вызов. Уберите присваивание и использование результата в выражении.

// Было (ошибка):

Результат = ЗаписатьДокумент(ДокументОбъект);

// Стало:

ЗаписатьДокумент(ДокументОбъект);

Если после вызова нужно проверить успешность операции, используйте другие механизмы: попытку/исключение, проверку состояния объекта после вызова или параметры, переданные по ссылке (через ключевое слово «Знач» без него — параметр может изменяться внутри процедуры).

Такой подход предпочтителен, когда процедура вызывается из множества мест и все они корректны, кроме одного. Менять объявление метода в этом случае опасно: придётся перепроверять все существующие вызовы.

Способ 2: превратить процедуру в функцию

Если логика требует получить результат — например, метод проверяет условие и должен сообщить вызывающему коду «да» или «нет», — измените объявление. Замените ключевое слово «Процедура» на «Функцию» и добавьте оператор «Возврат» с нужным значением на каждом пути выполнения.

// Было:

Процедура ПроверитьЗаполнение(Объект) Экспорт

...

КонецПроцедуры

// Стало:

Функция ПроверитьЗаполнение(Объект) Экспорт

...

Возврат ЗаполненоКорректно;

КонецФункции

Частая ошибка при таком преобразовании — забыть «Возврат» на одной из веток условий. Тогда функция вернёт «Неопределено», и последующая логика (например, «Если Результат Тогда...») будет работать непредсказуемо. Проверьте каждый выход из функции.

Учтите обратную сторону: функцию нельзя вызвать как отдельный оператор, игнорируя результат. Если метод уже вызывается где-то как процедура, после превращения в функцию эти места станут ошибкой «Использование функции как процедуры» — их придётся оформить через присваивание.

Типичные сценарии возникновения ошибки

Копирование кода из другой конфигурации

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

Рефакторинг типового модуля

При доработке типовой конфигурации кто-то изменил функцию на процедуру (или наоборот), но не исправил все вызовы. Ошибка всплывает при обновлении или первом обращении к доработанному функционалу. Здесь помогает глобальный поиск (Ctrl+Shift+F) по имени метода с проверкой каждого вхождения.

Перепутанные методы с похожими именами

В конфигурации сосуществуют, например, процедура «ЗаполнитьДанные» и функция «ПолучитьДанные». В спешке вызвали не тот метод. Автодополнение в редакторе модуля (Ctrl+Пробел) показывает тип метода — обращайте на это внимание.

Вызов метода внешней обработки или расширения

Если код вызывает метод объекта внешней обработки или метода, заимствованного через расширение, сигнатура могла измениться после обновления. Проверьте актуальную версию вызываемого объекта.

Типичные ошибки
01
Механическая замена «Процедура» на «Функция» без добавления «Возврат» — функция вернёт «Неопределено» и сломает логику
02
Исправление одного вызова без поиска остальных — ошибка появится снова в другом сценарии
03
Правка кода прямо в рабочей базе без копии — пользователи получат ошибку в момент обновления конфигурации
04
Игнорирование синтаксической проверки после правки — смежные ошибки остаются незамеченными

Как проверить, что проблема решена

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

Второй уровень — прогон сценария в режиме «Предприятие» на тестовой копии базы. Выполните те действия, которые раньше приводили к ошибке, и убедитесь, что результат соответствует ожиданиям: документ записывается, проверка возвращает корректное значение, сообщения не появляются.

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

Контрольные точки

Как проверить результат

Синтаксическая проверка модуля
Норма

Ошибок и предупреждений нет

Тревожный признак

Остаётся сообщение о процедуре или появилась ошибка «Использование функции как процедуры»

Запуск сценария в режиме «Предприятие»
Норма

Действие выполняется, результат корректен

Тревожный признак

Ошибка возникает снова или логика работает неверно

Глобальный поиск по имени метода
Норма

Все вызовы соответствуют типу метода

Тревожный признак

Найдены вызовы старого типа

Как не допускать ошибку в будущем

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

Полезно называть методы так, чтобы тип читался из имени: функции — как вопросы или получатели значений («ПолучитьОстаток», «ЭтоПроведённыйДокумент»), процедуры — как действия («ЗаписатьДанные», «СформироватьОтчёт»). Это снижает шанс перепутать метод при вызове.

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

Если нужен и побочный эффект, и результат, а менять тип метода нежелательно, передайте в процедуру параметр-структуру и заполните в ней поле с результатом. Вызов остаётся процедурным, а вызывающий код читает нужное значение из структуры после вызова.
ПЗ
Практическое замечание

Частые вопросы

Может ли эта ошибка появиться из-за сбоя платформы или базы данных?

Нет. Это исключительно синтаксическая ошибка кода: несовпадение типа метода и способа его вызова. Платформа и данные здесь ни при чём — исправляется только правкой модуля.

Чем эта ошибка отличается от «Использование функции как процедуры»?

Это зеркальные ситуации. Первая возникает, когда результат процедуры пытаются получить как значение. Вторая — когда функцию вызывают как отдельный оператор, игнорируя возвращаемое значение. Исправления аналогичны: привести вызов в соответствие с объявлением.

Ошибка возникла после обновления конфигурации. Что делать?

Вероятнее всего, при обновлении затёрлись доработки, менявшие тип метода, а ваши вызовы остались. Сравните модуль с предыдущей версией, восстановите согласованность объявления и вызовов, а в дальнейшем выносите доработки в расширение.

Можно ли вызвать функцию и просто не использовать её результат?

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

Опасно ли исправлять эту ошибку самостоятельно в рабочей базе?

Сама ошибка проста, но правку безопасно делать только на копии: изменение типа метода может затронуть другие вызовы и внешние обработки. После проверки на копии переносите изменения в рабочую базу в нерабочее время.

Итог

Что важно запомнить

Ошибка «Обращение к процедуре как к функции» означает, что код ждёт значение от метода, который его не возвращает. Решение всегда одно из двух: убрать использование результата в месте вызова или превратить процедуру в функцию с «Возврат» на всех ветках. После правки — синтаксическая проверка, глобальный поиск вызовов и тест на копии базы.