Рассмотрим классическую ситуацию, с которой сталкиваются многие начинающие разработчики при изучении программирования в 1С (часто при выполнении заданий из пособия М.Г. Радченко). При попытке провести документ, в модуле которого написан код вызова процедуры из общего модуля, платформа выдает ошибку компиляции или выполнения.
Текст ошибки обычно выглядит следующим образом:
{Документ.НачисленияСотрудникам.МодульОбъекта(45,5)}: Переменная не определена (ПроведениеРасчетов)
>ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Оклад, МассивСотрудников);
Разберем подробно причины возникновения этой ошибки и пошагово исправим её. Проблема заключается в том, что серверный контекст выполнения кода документа "не видит" общий модуль, к которому мы обращаемся.
Самая банальная, но частая причина — нарушение последовательности действий. Мы написали код вызова ПроведениеРасчетов.РассчитатьНачисления(...) в документе, но сам общий модуль еще не создали в конфигураторе.
Решение:
ПроведениеРасчетов.ПроведениеРасчетов. Ошибка в одной букве приведет к тому, что система не найдет модуль.Если модуль создан, но ошибка сохраняется, значит, система не видит его в том контексте, где происходит вызов. Процедура ОбработкаПроведения документа выполняется на сервере.
Проанализируем свойства общего модуля ПроведениеРасчетов. Для этого выделим его в дереве конфигурации, нажмем правую кнопку мыши и выберем "Свойства".
Нам необходимо установить следующие флаги:
Главное правило: если мы вызываем модуль из процедуры, работающей на сервере (как ОбработкаПроведения), у общего модуля должна стоять галочка Сервер.
Иногда ошибка меняется на "Метод объекта не обнаружен". Это происходит, когда модуль виден, но процедура внутри него "скрыта" (приватна).
Посмотрим внутрь модуля ПроведениеРасчетов. Чтобы процедура была доступна извне (из других документов, справочников и т.д.), она должна быть объявлена с ключевым словом Экспорт.
Проверим код внутри модуля:
// Неправильно (процедура видна только внутри этого модуля)
Процедура РассчитатьНачисления(НаборЗаписей, ВидРасчета, СписокСотрудников)
// Логика расчета
КонецПроцедуры
// Правильно
Процедура РассчитатьНачисления(НаборЗаписей, ВидРасчета, СписокСотрудников) Экспорт
// Логика расчета
КонецПроцедуры
Сведем все действия в единый чек-лист для устранения ошибки:
ПроведениеРасчетов.Экспорт после объявления процедуры РассчитатьНачисления.После выполнения этих действий вернемся к коду обработки проведения:
// Фрагмент кода в модуле документа НачисленияСотрудникам
ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Оклад, МассивСотрудников);
Движения.Начисления.Записать( , Истина);
ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Премия, МассивСотрудников);
Движения.Начисления.Записать( , Истина);
Теперь платформа 1С корректно распознает переменную ПроведениеРасчетов как обращение к общему модулю и успешно выполнит вызов экспортной процедуры.