Ошибка Переменная не определена (ПроведениеРасчетов) при проведении документа

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

Рассмотрим классическую ситуацию, с которой сталкиваются многие начинающие разработчики при изучении программирования в 1С (часто при выполнении заданий из пособия М.Г. Радченко). При попытке провести документ, в модуле которого написан код вызова процедуры из общего модуля, платформа выдает ошибку компиляции или выполнения.

Текст ошибки обычно выглядит следующим образом:


{Документ.НачисленияСотрудникам.МодульОбъекта(45,5)}: Переменная не определена (ПроведениеРасчетов)
>ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Оклад, МассивСотрудников);

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

Причина 1: Отсутствие Общего модуля в дереве метаданных

Самая банальная, но частая причина — нарушение последовательности действий. Мы написали код вызова ПроведениеРасчетов.РассчитатьНачисления(...) в документе, но сам общий модуль еще не создали в конфигураторе.

Решение:

  1. Откроем дерево конфигурации.
  2. Найдем ветку Общие -> Общие модули.
  3. Проверим, существует ли там модуль с именем ПроведениеРасчетов.
  4. Если его нет — добавим новый.
  5. В палитре свойств (обычно справа) в поле Имя укажем в точности ПроведениеРасчетов. Ошибка в одной букве приведет к тому, что система не найдет модуль.

Причина 2: Неверные свойства компиляции модуля

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

Проанализируем свойства общего модуля ПроведениеРасчетов. Для этого выделим его в дереве конфигурации, нажмем правую кнопку мыши и выберем "Свойства".

Нам необходимо установить следующие флаги:

  1. Сервер — обязательно установим этот флаг. Без него модуль не будет скомпилирован на сервере, и серверный код документа не сможет к нему обратиться. Это и вызывает ошибку "Переменная не определена".
  2. Вызов сервера — этот флаг рекомендуется установить, если мы планируем обращаться к этому модулю с клиента (например, из формы документа). В рамках проведения документа это не критично, но в учебных задачах этот флаг часто требуется.
  3. Клиент (управляемое приложение) — обычно для расчетных модулей этот флаг снимают, чтобы не "тянуть" лишний код на клиентскую машину, но если он стоит — ошибкой это не будет.

Главное правило: если мы вызываем модуль из процедуры, работающей на сервере (как ОбработкаПроведения), у общего модуля должна стоять галочка Сервер.

Причина 3: Отсутствие ключевого слова Экспорт

Иногда ошибка меняется на "Метод объекта не обнаружен". Это происходит, когда модуль виден, но процедура внутри него "скрыта" (приватна).

Посмотрим внутрь модуля ПроведениеРасчетов. Чтобы процедура была доступна извне (из других документов, справочников и т.д.), она должна быть объявлена с ключевым словом Экспорт.

Проверим код внутри модуля:


// Неправильно (процедура видна только внутри этого модуля)
Процедура РассчитатьНачисления(НаборЗаписей, ВидРасчета, СписокСотрудников)
    // Логика расчета
КонецПроцедуры

// Правильно
Процедура РассчитатьНачисления(НаборЗаписей, ВидРасчета, СписокСотрудников) Экспорт
    // Логика расчета
КонецПроцедуры

Итоговый алгоритм решения

Сведем все действия в единый чек-лист для устранения ошибки:

  1. Убедимся, что в ветке Общие модули создан объект с именем ПроведениеРасчетов.
  2. Установим в свойствах этого модуля галочку Сервер (и, при необходимости, Вызов сервера).
  3. Откроем код модуля и допишем слово Экспорт после объявления процедуры РассчитатьНачисления.
  4. Обновим конфигурацию базы данных (F7).

После выполнения этих действий вернемся к коду обработки проведения:


// Фрагмент кода в модуле документа НачисленияСотрудникам
ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Оклад, МассивСотрудников);
Движения.Начисления.Записать( , Истина);

ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Премия, МассивСотрудников);
Движения.Начисления.Записать( , Истина);

Теперь платформа 1С корректно распознает переменную ПроведениеРасчетов как обращение к общему модулю и успешно выполнит вызов экспортной процедуры.

← На главную