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