Как правильно вызвать создание одного документа из другого в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки возникает задача: нужно вызвать логику создания документа «Заявка» при нажатии кнопки в форме списка документа «Реализация». Разберем, почему попытка «вызвать кнопку другой формы» — это не лучший путь, и как решить задачу профессионально.

Почему не стоит пытаться вызвать команду формы напрямую?

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

Решение 1: Вынос логики в экспортные процедуры

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

  1. Найдите код, который исполняется при нажатии команды в форме.
  2. Перенесите этот код в Модуль объекта документа «Заявка» или в Общий модуль.
  3. Добавьте ключевое слово Экспорт к заголовку процедуры.
  4. Вызывайте эту процедуру из любого места системы: из команд формы, из обработок или регламентных заданий.

Пример структуры кода в модуле объекта документа «Заявка»:


Процедура ВыполнитьПодготовительныеДействия(Основание) Экспорт
    // Здесь размещаем логику подготовки данных
    // Например, проверки или расчеты
КонецПроцедуры

Решение 2: Использование стандартного механизма «Ввод на основании»

Платформа 1С обладает мощным встроенным механизмом для передачи данных между документами. Вместо того чтобы придумывать «велосипед», воспользуемся стандартным методом Заполнить(). Это наиболее надежный и поддерживаемый путь.

При использовании этого подхода мы действуем следующим образом:

  1. Создаем новый документ через метод СоздатьДокумент().
  2. Вызываем метод Заполнить(Основание), где Основание — это ссылка на документ «Реализация».
  3. В модуле объекта «Заявка» используем стандартный обработчик ОбработкаЗаполнения().

Давайте посмотрим, как выглядит программная реализация в форме списка документа «Реализация»:


&НаКлиенте
Процедура СоздатьЗаявкуНаОсновании(Команда)
    // Получаем текущую ссылку на документ
    ТекущаяСсылка = Элементы.Список.ТекущиеДанные.Ссылка;
    
    // Вызываем серверную процедуру для создания
    СоздатьДокументЗаявкаНаСервере(ТекущаяСсылка);
КонецПроцедуры

&НаСервере
Процедура СоздатьДокументЗаявкаНаСервере(Основание)
    НовыйДокумент = Документы.Заявка.СоздатьДокумент();
    НовыйДокумент.Заполнить(Основание);
    НовыйДокумент.Показать();
КонецПроцедуры

А в модуле объекта документа «Заявка» вся логика заполнения будет выглядеть аккуратно и предсказуемо:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Реализация") Тогда
        // Заполняем реквизиты данными из Реализации
        ЭтотОбъект.Контрагент = ДанныеЗаполнения.Контрагент;
        ЭтотОбъект.Сумма = ДанныеЗаполнения.Сумма;
    КонецЕсли;
КонецПроцедуры

Почему этот подход правильный?

Проанализируем преимущества данных методов:

В завершение подчеркнем: никогда не пытайтесь программно «нажать кнопку» в чужой форме. Вместо этого выносите полезную логику в Экспортные процедуры или используйте штатные механизмы Заполнения. Это сделает вашу конфигурацию стабильной, а код — чистым и понятным.

← На главную