Почему в расширении 1С не срабатывает процедура общего модуля при попытке передать реквизиты формы?

Задача: на форме есть реквизиты, их значения нужно использовать в модулях объекта и менеджера (например, при формировании движений по регистрам).
  • 2 июня 2026 г. 8:00
Ответы на вопрос 1
Коротко — чаще всего причина в том, что вы пытаетесь передать «объект формы» или элемент формы (Control, Form, объект реквизита) в процедуру, которая выполняется в другом контексте (сервер/клиент) или в модуле конфигурации, недоступном из расширения. В расширениях и в 1С в целом есть ограничения на передачу клиентских объектов и на видимость модулей.

Что проверить и как исправить (практические шаги)

1. Не передавайте объекты формы/элементы управления
- Нельзя передавать в серверную процедуру ссылку на форму, элемент управления, форму как объект. При маршалинге клиент→сервер такие объекты не сериализуются — вызов «не сработает».
- Решение: заберите из формы примитивные значения (Строка, Число, Дата, Булево, Ссылка на объект конфигурации и т.п.) и передайте только их.
Пример:
Процедура КнопкаНажата(Кнопка)
    Знач = ЭлементыФормы.РеквизитЗначение.Значение;
    ОбщийМодуль.МойМодуль.МояПроцедура(Знач);
КонецПроцедуры

2. Учтите режим выполнения общего модуля (клиент/сервер/оба)
- Если общий модуль настроен как «Сервер», а вы вызываете из клиентского обработчика, платформа сделает удалённый вызов и попытается передать параметры. Передавайте только сериализуемые значения.
- Если логика должна работать с элементами формы (изменять их и т.п.), выполните процедуру на клиенте (модуль «Клиент» или общий модуль с режимом выполнения «Клиент» / «Оба»), либо выполняйте изменения на клиенте, а на сервер — только вычисления на основании переданных значений.

3. Расширение vs базовая конфигурация — области видимости
- Код базовой конфигурации не видит автоматом общие модули из расширения. И наоборот — расширение видит объекты базы, но не может изменить код базового модуля без спец. механизмов.
- Если форма принадлежит базовой конфигурации, и вы добавили процедуру в общий модуль расширения, форма базовой конфигурации не вызовет этот код. Нужны:
  - либо изменение кода формы (в её расширении) — добавить обработчик, который вызовет ваш общий модуль расширения,
  - либо использовать механизмы подписки на события/обработчики расширения.
Пример: в расширении добавьте обработчик на кнопку/событие формы и из него вызовите ОбщийМодуль(расширения).МояПроцедура(...).

4. Проверьте сигнатуру процедуры и видимость (публичность)
- Процедура должна быть доступна (публичная) и иметь ожидаемые параметры. Ошибки в параметрах — тоже причина «не срабатывает».

5. Логика формирования движений по регистрам
- Генерацию движений и изменение регистров обычно делают на сервере (в процедурах документов/регистров или в общем серверном модуле). Делайте так:
  - На форме соберите значения реквизитов (на клиенте).
  - Вызовите серверную процедуру общего модуля, передав простые значения.
  - В серверной процедуре используйте эти значения для формирования движений.

Пример полного варианта:
Клиент (форма):
Процедура СохранитьНажатие(Кнопка)
    Код = ЭлементыФормы.Код.Значение;
    Дата = ЭлементыФормы.Дата.Значение;
    // передаём только примитивы на сервер
    Результат = ОбщийМодуль.МодульПостинга.МетодПровестиДокумент(Код, Дата);
КонецПроцедуры

Сервер (общий модуль МодульПостинга, режим «Сервер»):
Процедура МетодПровестиДокумент(Код, Дата)
    // формируем движения по регистрам на основании переданных значений
КонецПроцедуры

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

По этим данным дам точечный пример и исправление.
Похожие вопросы