Как вызвать процедуру из модуля менеджера документа в обработке и исправить ошибку «Метод объекта не обнаружен»?

Программист 1С v8.3 (Обычные формы) Финансы и профессиональные услуги
← На главную

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

Анализ исходной ситуации и программного кода

Рассмотрим рабочую задачу. Нам необходимо сформировать специальный идентификатор для отправки данных в Центральный Банк РФ на основе стандартного UUID (уникального идентификатора) документа. Для этого в модуле менеджера документа мКредитныйДоговор были написаны три вспомогательные функции. Проанализируем их исходный код:


Функция Из_Число_В_XСчисл(Знач Значение, Шаблон)
    Результат="";
    Основание = СтрДлина(Шаблон);
    Если Значение = 0 Тогда
        Результат = "0";
    Иначе
        Пока Значение>0 цикл
            Остат = Значение%Основание;
            Результат1=Сред(Шаблон,Остат+1,1);
            Значение = (Значение-Остат)/Основание;
            Результат = Результат1 + Результат;
        КонецЦикла;
    КонецЕсли;
    Возврат Результат;
КонецФункции

Функция РассчитатьКонтрольныйСимволПоПравиламЦБ(Знач УУИД)
    УУИД = НРег(СтрЗаменить(УУИД, "-", ""));
    Сумма = 0;
    Для Позиция = 1 По СтрДлина(УУИД) Цикл
        КодСимвола = КодСимвола(УУИД, Позиция);
        Если КодСимвола >= 48 И КодСимвола <= 57 Тогда //цифра
            Цифра = КодСимвола - 48;
        ИначеЕсли КодСимвола >= 97 И КодСимвола <= 102 Тогда //буква маленькая
            Цифра = КодСимвола - 87;
        Иначе
            Возврат "";
        КонецЕсли;
        Сумма = Сумма + Цифра * ((Позиция - 1) % 10 + 1);
    КонецЦикла;
    Остаток = Сумма % 16;
    Если Остаток < 10 Тогда
        Возврат Символ(Остаток + 48);
    Иначе
        Возврат Символ(Остаток + 87);
    КонецЕсли;
КонецФункции

Функция УУИдДляЦБ(Ид) Экспорт
    К = РассчитатьКонтрольныйСимволПоПравиламЦБ(Ид);
    ИтоговыйИД = Строка(ИД) + "-" + Строка(К);
    Возврат ИтоговыйИД;    
КонецФункции

Обратим внимание на архитектуру этих функций. Первые две функции (Из_Число_В_XСчисл и РассчитатьКонтрольныйСимволПоПравиламЦБ) являются локальными (внутренними) функциями модуля. Они не имеют ключевого слова Экспорт, а значит, могут вызываться только внутри этого же модуля менеджера. Третья функция УУИдДляЦБ помечена ключевым словом Экспорт, что делает её публичным программным интерфейсом данного менеджера документов.

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


Процедура КнопкаВыполнитьНажатие(Кнопка)
    Рез = Документы.мКредитныйДоговор.УУИдДляЦБ(СсылкаНаОбъект.УникальныйИдентификатор());
    Сообщить(Рез);
КонецПроцедуры

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

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(3)}: Метод объекта не обнаружен (УУИдДляЦБ)

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

Причина 1: Путаница между Модулем объекта и Модулем менеджера

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

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

Если вы случайно поместили код функции УУИдДляЦБ в Модуль объекта, то попытка обратиться к ней через менеджер класса (Документы.мКредитныйДоговор.УУИдДляЦБ(...)) неизбежно вызовет ошибку Метод объекта не обнаружен.

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


// Пример вызова, если бы метод находился в Модуле объекта
ДоговорОбъект = СсылкаНаОбъект.ПолучитьОбъект();
Рез = ДоговорОбъект.УУИдДляЦБ(СсылкаНаОбъект.УникальныйИдентификатор());

Поскольку наш метод является расчетным и не зависит от реквизитов конкретного объекта БД (он принимает UUID на вход в качестве параметра), его нахождение в Модуле менеджера является методологически верным.

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

Еще одна частая скрытая проблема — использование сходных по написанию символов кириллицы и латиницы в названии экспортной функции. Символы У, И, д, Ц, Б в названии УУИдДляЦБ могут быть случайно набраны в разных раскладках. Например, латинская буква y вместо русской у, или латинская C вместо русской С.

Для платформы 1С функции УУИдДляЦБ (полностью на кириллице) и УУИdДляЦБ (с латинской "d") — это абсолютно разные методы. Если в модуле менеджера имя объявлено в одной раскладке, а в модуле формы вызывается в другой — система выдаст ошибку отсутствия метода.

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

Причина 3: Конфигурация базы данных не обновлена

Иногда разработчики вносят изменения в модуль менеджера, нажимают кнопку сохранения модуля или стандартное сочетание клавиш Ctrl + S, но забывают обновить конфигурацию базы данных (клавиша F7 или синий бочонок на панели инструментов). При запуске предприятия в режиме отладки код формы обращается к старой версии конфигурации БД, где экспортной функции еще не существовало.

Как исправить: Закройте пользовательский сеанс «1С:Предприятие», вернитесь в конфигуратор, выполните команду меню Конфигурация -> Обновить конфигурацию базы данных (или нажмите F7). Убедитесь, что процесс обновления завершен успешно, и только после этого запускайте режим предприятия.

Причина 4: Контекст исполнения (Клиент / Сервер)

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

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

Как исправить: Выполняйте вызовы методов менеджеров документов исключительно в серверном контексте (например, внутри процедуры с директивой &НаСервере или &НаСервереБезКонтекста), передавая результат обратно на клиент.

Разбор алгоритма расчета контрольного символа ЦБ

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

  1. Функция РассчитатьКонтрольныйСимволПоПравиламЦБ принимает строку UUID, убирает из нее дефисы с помощью функции СтрЗаменить(УУИД, "-", "") и переводит строку в нижний регистр через НРег(...).
  2. Далее запускается цикл по всем символам полученной строки. С помощью функции КодСимвола определяется числовое представление каждого знака.
  3. Символы переводятся в шестнадцатеричные веса: цифры от 0 до 9 дают значения от 0 до 9, а латинские буквы от a до f — значения от 10 до 15 соответственно.
  4. Каждому шагу цикла присваивается циклический вес по формуле ((Позиция - 1) % 10 + 1), принимающий последовательные значения от 1 до 10.
  5. Накапливается взвешенная сумма произведений весов на значения символов.
  6. Остаток от деления итоговой суммы на 16 конвертируется обратно в символ (0-9 или a-f) и возвращается в качестве контрольного разряда.

Правила хорошего тона при проектировании модулей в 1С

Чтобы избежать хаоса в коде конфигурации при работе с модулями менеджеров, рекомендуется придерживаться следующих правил:


#Область ПрограммныйИнтерфейс

Функция УУИдДляЦБ(Ид) Экспорт
    К = РассчитатьКонтрольныйСимволПоПравиламЦБ(Ид);
    ИтоговыйИД = Строка(ИД) + "-" + Строка(К);
    Возврат ИтоговыйИД;    
КонецФункции

#КонецОбласти

Правильным архитектурным решением будет создание нового Общего модуля (например, с именем ИнтеграцияЦБСлужебный или РаботаСДоговорамиУниверсальный) с установленными флажками «Сервер» и «Вызов сервера». Перенесите туда расчетные математические функции, сделав их экспортными. Это позволит вызывать алгоритм из любого места конфигурации (включая любые обработки и документы) в едином стандартизированном формате.

← На главную