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