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

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

Как обратиться к процедуре модуля менеджера документа в 1С

Как вызвать экспортную процедуру модуля менеджера документа в 1С: синтаксис Документы.ИмяДокумента.Процедура(), примеры кода, ошибки и ограничения.

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

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

Что такое модуль менеджера и чем он отличается от модуля объекта

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

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

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

Синтаксис вызова процедуры модуля менеджера

Обращение строится по цепочке: глобальная коллекция Документы → имя документа, как оно задано в конфигураторе → имя экспортной процедуры или функции. Пример вызова процедуры без возврата значения:

Документы.РеализацияТоваровУслуг.ЗаполнитьПоОснованию(МассивСсылок, ПараметрыЗаполнения);

Если в модуле менеджера объявлена функция, результат присваивается переменной:

ТабличныйДокумент = Документы.СчетНаОплатуПокупателю.ПечатнаяФормаСчета(СсылкаНаДокумент);

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

bsl
// В модуле менеджера документа "ЗаказПокупателя":
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    // ...
КонецПроцедуры

// Вызов из любого другого модуля:
Документы.ЗаказПокупателя.ДобавитьКомандыПечати(КомандыПечати);

Обязательное условие: ключевое слово Экспорт

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

Функция ПолучитьДанныеДляПечати(Ссылка) Экспорт

// тело функции

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

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

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

Откуда можно вызвать процедуру менеджера

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

  • Из модуля объекта другого документа при вводе на основании: Документы.РеализацияТоваровУслуг.ЗаполнитьПоЗаказу(ЭтотОбъект, Основание);
  • Из общего модуля печати: получение макета и данных через функцию менеджера;
  • Из регламентного задания: массовая обработка документов за период;
  • Из формы списка: серверная процедура, которая вызывает менеджер для выбранных ссылок.

С клиента (из клиентской процедуры формы) напрямую вызвать менеджер нельзя в тонком и веб-клиенте — нужна серверная процедура формы с директивой &НаСервере, которая уже обратится к Документы.ИмяДокумента. Это стандартный шаблон: клиент собирает параметры, сервер выполняет вызов.

Порядок действий
  1. 1
    Откройте модуль менеджера документа в конфигураторе
  2. 2
    Убедитесь, что нужная процедура объявлена с ключевым словом Экспорт
  3. 3
    В вызывающем модуле напишите Документы.ИмяДокумента.ИмяПроцедуры(Параметры)
  4. 4
    Проверьте совпадение числа и типов параметров с объявлением
  5. 5
    Выполните проверку модуля (Ctrl+F7) и запустите вызов в отладчике

Передача параметров и возврат значений

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

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

Для передачи большого числа параметров удобнее упаковать их в структуру — так вызов проще читать и расширять без изменения сигнатуры:

ПараметрыПечати = Новый Структура("Ссылка, ИмяМакета, ВыводитьЦены", Ссылка, "Счет", Истина);

Результат = Документы.СчетНаОплатуПокупателю.СформироватьПечатнуюФорму(ПараметрыПечати);

Типичные ошибки и способы их устранения

Первая и самая частая ошибка — обращение через ссылку: СсылкаНаДокумент.ЗаполнитьПоОснованию(). У ссылки есть только предопределённые свойства (Номер, Дата и реквизиты), методов модуля менеджера у неё нет. Правильно — Документы.ИмяДокумента.ЗаполнитьПоОснованию(...).

Вторая ошибка — попытка вызвать процедуру объекта через менеджер или наоборот. Процедуры модуля объекта доступны только через объект: ДокОбъект = Ссылка.ПолучитьОбъект(); ДокОбъект.МояПроцедураОбъекта();. Менеджер и объект — два разных контекста, и смешивать их вызовы нельзя.

Третья группа проблем — директивы компиляции. Если процедура в модуле менеджера помечена недопустимой директивой или использует клиентские объекты (например, Предупреждение), модуль не скомпилируется на сервере тонкого клиента. Проверяйте модуль через «Конфигурация → Проверка конфигурации» с включёнными режимами тонкого и веб-клиента.

Типичные ошибки
01
Вызов через ссылку: Ссылка.Процедура() — у ссылки нет методов менеджера, будет ошибка выполнения
02
Отсутствие Экспорт — процедура не видна снаружи, ошибка «не определена»
03
Опечатка в имени документа — ошибка компиляции, имя должно совпадать с метаданными
04
Использование ЭтотОбъект в модуле менеджера — контекста объекта нет, обращайтесь через параметр-ссылку
05
Вызов менеджера из клиентской процедуры тонкого клиента — нужен серверный вызов через &НаСервере

Альтернативы: когда менеджер не подходит

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

Сравнение вариантов размещения помогает выбрать правильно с первого раза и не переносить код позже.

Где разместить процедуру

Модуль менеджера

Операции над видом документов: печать по массиву ссылок, поиск, заполнение по основанию. Не подходит для работы с реквизитами одного объекта

Модуль объекта

Логика конкретного документа: проведение, заполнение, контроль перед записью. Требует получения объекта, что медленнее при массовой обработке

Общий серверный модуль

Переиспользуемая логика для нескольких видов документов. Требует аккуратного разделения на подсистемы

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

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

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

Компиляция модуля
Норма

Проверка конфигурации проходит без ошибок в вызывающем модуле

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

Ошибка «Процедура или функция не определена» — нет Экспорт или опечатка в имени

Выполнение вызова
Норма

Процедура отрабатывает, результат соответствует ожиданиям

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

Ошибка «Метод объекта не обнаружен» — вызов идёт через ссылку вместо менеджера

Контекст исполнения
Норма

Вызов выполняется на сервере, отладчик останавливается в модуле менеджера

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

Ошибка вызова из клиентской процедуры тонкого клиента

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

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

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

Почему отладчик не заходит в модуль менеджера?

Чаще всего потому, что вызов выполняется на сервере, а отладка сервера не включена или отлаживается только клиентский процесс. Включите отладку на сервере 1С (параметр -debug в командной строке сервера) и подключите нужный предмет отладки в конфигураторе.

Чем вызов менеджера отличается от Документы.Имя.СоздатьДокумент()?

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

Можно ли вызвать процедуру менеджера одного документа из модуля менеджера другого?

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

Видны ли процедуры модуля менеджера через COM или веб-сервисы?

Напрямую — нет. Для внешнего доступа создайте HTTP-сервис или веб-сервис, в модуле которого вызовите нужную экспортную процедуру менеджера. Это стандартный способ публикации серверной логики наружу.

Что делать, если процедура должна вернуть табличный документ на клиент?

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

Итог

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

Процедура модуля менеджера вызывается как Документы.ИмяДокумента.ИмяПроцедуры() и обязательно должна быть экспортной. Менеджер — серверный контекст без привязки к конкретному документу: для работы с реквизитами объекта используйте модуль объекта, а вызовы с клиента делайте через серверные процедуры.