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