Как создать документ на основании другого и открыть его форму во внешней обработке 1С?

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

При работе с платформой 1С:Предприятие 8.3 программистам часто требуется автоматизировать рутинные операции, такие как создание нового документа на основании уже существующего и последующее открытие формы вновь созданного документа для проверки или дозаполнения. Эта задача может вызвать сложности, особенно у тех, кто только начинает осваивать встроенный язык 1С и принципы клиент-серверного взаимодействия. Чтобы избежать типичных просчетов, рекомендуется проводить анализ обработок на наличие ошибок, связанных с вызовами серверных процедур.

В этом руководстве мы подробно разберем, как создать внешнюю обработку, которая позволит нам выбрать документ-основание, автоматически создать на его базе новый документ, заполнит необходимые поля и откроет форму этого нового документа. В качестве основы для разработки можно взять готовый шаблон дополнительной обработки с сохранением параметров. Мы рассмотрим все ключевые шаги, включая подготовку формы обработки, взаимодействие между клиентским и серверным контекстами, программное создание и запись документов, а также открытие их форм.

Шаг 1: Подготовка внешней обработки и формы

Для начала создадим новую внешнюю обработку в конфигураторе. Во внешней обработке нам понадобится форма, через которую пользователь будет взаимодействовать с нашей логикой. Разместим на этой форме следующие элементы:

  1. Реквизит формы для выбора документа-основания: Нам потребуется место, где пользователь сможет указать документ, на основании которого будет создан новый. Создадим реквизит формы с типом ДокументСсылка.ИмяВашегоДокументаОснования. Давайте назовем этот реквизит ДокументОснование.

  2. Команда и кнопка: Создадим на форме команду, например, "СоздатьИОткрытьДокумент", и привяжем к ней кнопку на форме. Эта кнопка будет запускать весь процесс.

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

Шаг 2: Взаимодействие Клиент-Сервер в 1С

Критически важно понимать, что в 1С:Предприятии 8.3 существует строгое разделение на клиентский и серверный контексты выполнения кода. Это одно из фундаментальных отличий от многих других языков программирования, и оно является частым источником ошибок для новичков.

Для нашей задачи это означает, что когда пользователь нажимает кнопку на форме (клиентский контекст), мы должны передать ссылку на выбранный документ-основание на сервер. На сервере мы выполним всю логику по созданию нового документа, его заполнению и записи, а затем вернем ссылку на новый документ обратно на клиент.

Рассмотрим пример кода для обработчика команды на клиенте:


&НаКлиенте
Процедура СоздатьИОткрытьНовыйДокумент(Команда)
    // 1. Проверим, что пользователь выбрал документ-основание
    Если НЕ ЗначениеЗаполнено(ДокументОснование) Тогда
        Сообщить("Пожалуйста, выберите документ-основание в соответствующем поле.", СтатусСообщения.Внимание);
        Возврат;
    КонецЕсли;

    // 2. Вызываем серверную функцию для создания и записи нового документа
    СсылкаНовогоДокумента = СоздатьДокументНаОснованииНаСервере(ДокументОснование);

    // 3. После выполнения серверной логики, проверяем результат
    Если ЗначениеЗаполнено(СсылкаНовогоДокумента) Тогда
        // 4. Открываем форму созданного документа
        ОткрытьФорму("Документ.ИмяНовогоДокумента.ФормаДокумента", Новый Структура("Ключ", СсылкаНовогоДокумента));
        Сообщить("Документ успешно создан и открыт!", СтатусСообщения.Информация);
    Иначе
        Сообщить("Не удалось создать новый документ. Подробности смотрите в журнале регистрации или сообщениях.", СтатусСообщения.Ошибка);
    КонецЕсли;
КонецПроцедуры

Шаг 3: Создание нового документа на сервере

Теперь мы переходим к реализации серверной части. Здесь мы будем работать с объектами базы данных. Нам понадобится функция, которая принимает ссылку на документ-основание и возвращает ссылку на созданный новый документ.

Отличие Ссылки от Объекта:

В нашей серверной функции мы выполним следующие шаги:

  1. Проверим статус документа-основания: Прежде чем создавать новый документ, часто требуется убедиться, что документ-основание проведен.

  2. Создадим новый документ на основании: Для этого мы будем использовать метод СоздатьНаОсновании().

Давайте реализуем серверную функцию СоздатьДокументНаОснованииНаСервере:


&НаСервере
Функция СоздатьДокументНаОснованииНаСервере(СсылкаНаДокументОснование)

    Если НЕ СсылкаНаДокументОснование.Проведен Тогда
        Сообщить("Документ-основание не проведен. Создание нового документа невозможно.", СтатусСообщения.Предупреждение);
        Возврат Неопределено;
    КонецЕсли;

    ПеременнаяНовыйДокументОбъект;

    Попытка
        ПеременнаяНовыйДокументОбъект = Документы.ИмяНовогоДокумента.СоздатьНаОсновании(СсылкаНаДокументОснование);
    Исключение
        Сообщить("Произошла ошибка при создании нового документа на основании: " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
        Возврат Неопределено;
    КонецПопытки;
    
    // ... (дальнейшая логика заполнения и записи)
    Возврат ПеременнаяНовыйДокументОбъект.Ссылка;
КонецФункции

Шаг 4: Заполнение полей нового документа

После создания объекта нового документа многие поля заполнятся автоматически. Однако нам может потребоваться скорректировать реквизиты программно. Для стандартизации подобных действий в сложных конфигурациях часто применяют общий модуль для программного изменения форм, содержащий вспомогательные функции.

Добавим логику заполнения полей:


ПеременнаяНовыйДокументОбъект.Ответственный = Пользователи.ТекущийПользователь();
ПеременнаяНовыйДокументОбъект.Комментарий = "Документ создан автоматически внешней обработкой на основании "
                                             + СсылкаНаДокументОснование.Метаданные().Имя
                                             + " №" + СсылкаНаДокументОснование.Номер
                                             + " от " + Формат(СсылкаНаДокументОснование.Дата, "ДФ=dd.MM.yyyy");

Если ПеременнаяНовыйДокументОбъект.Метаданные().ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
    // Пример дополнительной обработки табличной части
КонецЕсли;

Шаг 5: Запись нового документа и возврат ссылки

После заполнения полей документ необходимо сохранить с помощью метода Записать(). В случае успешной записи функция вернет ссылку на новый документ в клиентскую процедуру.

Шаг 6: Открытие формы нового документа на клиенте

Как мы уже видели в Шаге 2, после получения ссылки мы используем метод ОткрытьФорму(). Этот метод универсален и позволяет открывать формы любых объектов системы, а для автоматизации создания таких интерфейсов можно использовать функции добавления элементов форм и команд.

Итоговый пример кода (Модуль формы обработки)


Перем ДокументОснование;

&НаКлиенте
Процедура СоздатьИОткрытьНовыйДокумент(Команда)
    Если НЕ ЗначениеЗаполнено(ДокументОснование) Тогда
        Сообщить("Пожалуйста, выберите документ-основание.", СтатусСообщения.Внимание);
        Возврат;
    КонецЕсли;

    СсылкаНовогоДокумента = СоздатьДокументНаОснованииНаСервере(ДокументОснование);

    Если ЗначениеЗаполнено(СсылкаНовогоДокумента) Тогда
        ОткрытьФорму("Документ.ИмяНовогоДокумента.ФормаДокумента", Новый Структура("Ключ", СсылкаНовогоДокумента));
    Иначе
        Сообщить("Не удалось создать новый документ.", СтатусСообщения.Ошибка);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция СоздатьДокументНаОснованииНаСервере(СсылкаНаДокументОснование)
    Если НЕ СсылкаНаДокументОснование.Проведен Тогда
        Сообщить("Документ-основание не проведен.", СтатусСообщения.Предупреждение);
        Возврат Неопределено;
    КонецЕсли;

    ПеременнаяНовыйДокументОбъект = Документы.ИмяНовогоДокумента.СоздатьНаОсновании(СсылкаНаДокументОснование);
    ПеременнаяНовыйДокументОбъект.Ответственный = Пользователи.ТекущийПользователь();

    Попытка
        ПеременнаяНовыйДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        Сообщить("Ошибка при записи: " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
        Возврат Неопределено;
    КонецПопытки;

    Возврат ПеременнаяНовыйДокументОбъект.Ссылка;
КонецФункции

Дополнительные рекомендации и советы

  1. Именование переменных: В языке 1С имена переменных не могут содержать точки. Это стандартная практика.

  2. Обработка ошибок: Всегда используйте блоки Попытка ... Исключение.

  3. Проверка прав доступа: Убедитесь, что у пользователя достаточно прав на создание объектов.

  4. Использование отладчика: Это лучший способ понять, в какой момент происходит ошибка.

Следуя этим шагам, вы сможете успешно создать внешнюю обработку для автоматизированного создания документов. Для повышения качества кода не забывайте использовать инструменты анализа конфигураций на ошибки, что значительно упростит поддержку ваших решений.

← На главную