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

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

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

Суть проблемы: Можно ли передать параметры для предзаполнения через навигационную ссылку?

Автор темы столкнулся с ситуацией, когда требовалось из внешней системы (в данном случае, Bitrix24) открыть форму создания нового элемента справочника 1С, например, Справочник.ВнутренниеДокументы, и сразу же заполнить один из его ключевых реквизитов, такой как ВидДокумента, используя параметры в навигационной ссылке. Была предпринята попытка сформировать ссылку следующего вида:


e1c://filev/C/Users/IVMokhov/Desktop/БАЗЫ ДАННЫХ/НПС#e1cib/data/Справочник.ВнутренниеДокументы?ВидДокумента=СправочникСсылка.ВидыВнутреннихДокументов:b0dc9408533d4a3011ebdb3b7e4ecc70

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

Официальная позиция 1С: Прямая передача параметров для предзаполнения новой формы объекта не поддерживается

В ходе дискуссии был получен однозначный ответ от представителя 1С (Сергея Нуралиева), который подтвердил, что передача произвольных параметров для предзаполнения полей формы *нового* объекта через стандартные навигационные ссылки 1С не поддерживается платформой. Это функциональное пожелание существует у разработчиков уже давно, но по состоянию на апрель 2022 года так и не было реализовано.

Это означает, что часть ссылки вида ?ВидДокумента=... в случае открытия *нового* элемента справочника или документа (например, e1cib/data/Справочник.ВнутренниеДокументы без указания GUID) не будет интерпретироваться платформой как команды для установки начальных значений реквизитов. Навигационные ссылки 1С предназначены в первую очередь для прямого доступа к конкретным *существующим* объектам базы данных, спискам с отбором или к отчетам/обработкам, которые могут принимать параметры.

Таким образом, наша попытка напрямую передать ?ВидДокумента=... в URL для предзаполнения новой формы не увенчается успехом, поскольку платформа просто игнорирует эту часть в данном контексте.

Обходные пути и программная реализация для предзаполнения реквизитов

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

Способ 1: Использование обработки-посредника, запускаемой по навигационной ссылке

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

Шаг 1: Создаем внешнюю обработку или обработку в конфигурации

В конфигурации мы создаем новый объект метаданных "Обработка" (например, МояОбработкаДляСозданияДокумента). У этой обработки может быть форма. Важно, чтобы именно форма этой обработки открывалась по ссылке.

Шаг 2: Формируем навигационную ссылку на обработку с параметрами

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


e1c://filev/C:/ПутьКБазеДанных#e1cib/data/Обработка.МояОбработкаДляСозданияДокумента?ВидДокументаГУИД=b0dc9408533d4a3011ebdb3b7e4ecc70

Здесь:

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


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

Результат будет примерно таким: e1cib/data/Обработка.МояОбработкаДляСозданияДокумента. К этой строке мы затем вручную добавляем ?ВидДокументаГУИД=... для внешней системы (например, Bitrix24).

Шаг 3: Реализуем логику в модуле формы обработки

В модуле формы нашей обработки МояОбработкаДляСозданияДокумента мы добавим код в обработчик события ПриСозданииНаСервере. Этот код будет проверять наличие нашего параметра, парсить его, создавать новый объект и открывать его форму с уже заполненными данными.


// В модуле формы обработки "МояОбработкаДляСозданияДокумента"
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ПереданныйГУИДСтрокой = "";

    // Проверяем, был ли передан наш пользовательский параметр "ВидДокументаГУИД"
    Если Параметры.Свойство("ВидДокументаГУИД") Тогда
        ПереданныйГУИДСтрокой = Параметры.ВидДокументаГУИД;
    КонецЕсли;

    Если НЕ ПустаяСтрока(ПереданныйГУИДСтрокой) Тогда
        Попытка
            // Внешние системы могут передавать GUID в сокращенном формате (32 символа без дефисов).
            // Преобразуем его в стандартный формат 1С с дефисами для надежной работы.
            Если СтрДлина(ПереданныйГУИДСтрокой) = 32 Тогда
                ПереданныйГУИДСтрокой = Сред(ПереданныйГУИДСтрокой, 1, 8) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 9, 4) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 13, 4) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 17, 4) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 21, 12);
            КонецЕсли;
            
            // Создаем объект УникальныйИдентификатор из полученной строки
            УИДВидаДокумента = Новый УникальныйИдентификатор(ПереданныйГУИДСтрокой);
            
            // Получаем ссылку на элемент справочника "ВидыВнутреннихДокументов" по GUID
            ВидДокументаСсылка = Справочники.ВидыВнутреннихДокументов.ПолучитьСсылку(УИДВидаДокумента);
            
            Если ВидДокументаСсылка.Пустая() Тогда
                Сообщить("Не удалось найти вид документа по указанному GUID: " + ПереданныйГУИДСтрокой, СтатусСообщения.Важное);
            Иначе
                // Создаем новый элемент справочника "ВнутренниеДокументы"
                НовыйВнутреннийДокументОбъект = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
                
                // Заполняем ключевой реквизит "ВидДокумента"
                НовыйВнутреннийДокументОбъект.ВидДокумента = ВидДокументаСсылка;
                
                // Дополнительное заполнение других реквизитов, если это необходимо
                НовыйВнутреннийДокументОбъект.Наименование = "Новый документ (создан извне " + Формат(ТекущаяДата(), "ДЛФ=Д") + ")";
                
                // Открываем форму созданного объекта. Пользователь сможет дозаполнить и сохранить.
                ФормаНовогоДокумента = НовыйВнутреннийДокументОбъект.ПолучитьФорму();
                ФормаНовогоДокумента.Открыть();
            КонецЕсли;
        Исключение
            Сообщить("Ошибка при обработке параметров или создании документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
    Иначе
        Сообщить("GUID вида документа не был передан в ссылке или он пуст. Открытие пустой формы.", СтатусСообщения.Информация);
        // Если параметр не передан, можно открыть пустую форму нового документа
        ФормаНовогоДокумента = Справочники.ВнутренниеДокументы.СоздатьЭлемент().ПолучитьФорму();
        ФормаНовогоДокумента.Открыть();
    КонецЕсли;
    
    // Важно: Отменяем стандартное открытие формы самой обработки,
    // так как мы уже открыли форму нового документа.
    Отказ = Истина; 
    СтандартнаяОбработка = Ложь;

КонецПроцедуры

Этот подход позволяет нам использовать навигационные ссылки для передачи пользовательских параметров и реализации гибкой логики создания и предзаполнения объектов.

Способ 2: Комплексная интеграция через HTTP-сервисы

Для более сложной и надежной интеграции с внешними системами, такими как Bitrix24, когда требуется не просто открыть существующий объект, а создать новый с предзаполненными данными, часто используют HTTP-сервисы 1С. Этот подход является более архитектурно правильным для взаимодействия "система-система" и обеспечивает большую гибкость и безопасность, поскольку внешняя система взаимодействует с 1С через веб-протокол, а не напрямую запускает клиентское приложение.

Принцип работы:

  1. Настройка HTTP-сервиса в 1С: Мы создаем в конфигурации 1С новый объект метаданных "HTTP-сервис" (например, СозданиеДокументовИзБитрикс). Определяем его шаблоны URL и методы (например, POST).
  2. HTTP-запрос от внешней системы: Во внешней системе (например, Bitrix24) при нажатии кнопки "Создать документ" формируется HTTP-запрос (обычно POST-запрос) к нашему HTTP-сервису 1С. В теле запроса передаются все необходимые параметры для предзаполнения (например, GUID вида документа, наименование, дата, ответственный и т.д.), чаще всего в формате JSON.
  3. Обработка запроса в 1С: HTTP-сервис 1С принимает запрос, извлекает параметры из его тела.
  4. Создание и заполнение объекта: В обработчике HTTP-сервиса (например, в методе POST) пишется код, который создает новый элемент справочника ВнутренниеДокументы, заполняет его полученными параметрами и записывает в базу данных.
  5. Возврат навигационной ссылки: После успешного создания объекта HTTP-сервис может вернуть в Bitrix24 навигационную ссылку на *созданный* элемент 1С. Bitrix24 затем может использовать эту ссылку, чтобы открыть уже созданный и частично заполненный документ в 1С для пользователя, который сможет его доработать и сохранить. Это отличается от предыдущего способа тем, что 1С сама *создает* объект и *отдает* ссылку на него, а не принимает параметры для открытия.

Пример кода в модуле HTTP-сервиса (упрощенно)

Для реализации этого подхода потребуется создать HTTP-сервис и определить в нем метод POST. Пример модуля HTTP-сервиса может выглядеть так:


// В модуле HTTP-сервиса (например, "СозданиеДокументовИзБитрикс")
// Метод Post для обработки входящих запросов
Функция Post(ЗапросHTTP)
    ОтветHTTP = Новый HTTPСервисОтвет(200); // По умолчанию возвращаем 200 OK

    Попытка
        // Получаем тело запроса как строку (предполагаем JSON)
        ТелоЗапросаСтрока = ЗапросHTTP.ПолучитьТелоКакСтроку();
        
        // Десериализуем JSON в структуру или соответствие
        ДанныеЗапроса = ПрочитатьJSON(ТелоЗапросаСтрока);

        // Извлекаем необходимые параметры, например, GUID вида документа
        ПереданныйГУИДСтрокой = ДанныеЗапроса.ВидДокументаГУИД;
        
        Если НЕ ПустаяСтрока(ПереданныйГУИДСтрокой) Тогда
            // Преобразование GUID, аналогично предыдущему способу
            Если СтрДлина(ПереданныйГУИДСтрокой) = 32 Тогда
                ПереданныйГУИДСтрокой = Сред(ПереданныйГУИДСтрокой, 1, 8) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 9, 4) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 13, 4) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 17, 4) + "-"
                                       + Сред(ПереданныйГУИДСтрокой, 21, 12);
            КонецЕсли;

            УИДВидаДокумента = Новый УникальныйИдентификатор(ПереданныйГУИДСтрокой);
            ВидДокументаСсылка = Справочники.ВидыВнутреннихДокументов.ПолучитьСсылку(УИДВидаДокумента);
            
            Если ВидДокументаСсылка.Пустая() Тогда
                ОтветHTTP.УстановитьТелоИзСтроки("{\"Успех\": false, \"Ошибка\": \"Вид документа по указанному GUID не найден.\"}");
                ОтветHTTP.КодСостояния = 404; // Not Found
            Иначе
                // Создаем и заполняем новый элемент справочника "ВнутренниеДокументы"
                НовыйВнутреннийДокументОбъект = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
                НовыйВнутреннийДокументОбъект.ВидДокумента = ВидДокументаСсылка;
                НовыйВнутреннийДокументОбъект.Наименование = "Документ создан из Bitrix24 (" + Строка(ТекущаяДата()) + ")";
                // Здесь можно заполнить другие реквизиты из ДанныеЗапроса, например:
                // НовыйВнутреннийДокументОбъект.Комментарий = ДанныеЗапроса.Комментарий;

                НовыйВнутреннийДокументОбъект.Записать(); // Сохраняем новый объект в базу

                // Формируем навигационную ссылку на только что созданный объект
                НавигационнаяСсылкаНаНовыйДокумент = ПолучитьНавигационнуюСсылку(НовыйВнутреннийДокументОбъект.Ссылка);
                
                // Возвращаем успех и ссылку на новый документ в формате JSON
                ОтветHTTP.УстановитьТелоИзСтроки("{\"Успех\": true, \"Ссылка1С\": \"" + НавигационнаяСсылкаНаНовыйДокумент + "\", \"ГУИДДокумента\": \"" + Строка(НовыйВнутреннийДокументОбъект.УникальныйИдентификатор) + "\"}");
            КонецЕсли;
        Иначе
            ОтветHTTP.УстановитьТелоИзСтроки("{\"Успех\": false, \"Ошибка\": \"GUID вида документа не был передан в запросе.\"}");
            ОтветHTTP.КодСостояния = 400; // Bad Request
        КонецЕсли;

    Исключение
        ОтветHTTP.УстановитьТелоИзСтроки("{\"Успех\": false, \"Ошибка\": \"Внутренняя ошибка сервера: " + ОписаниеОшибки() + "\"}");
        ОтветHTTP.КодСостояния = 500; // Internal Server Error
    КонецПопытки;

    Возврат ОтветHTTP;
КонецФункции

После получения такой навигационной ссылки на *уже созданный* объект, Bitrix24 может использовать её, чтобы открыть этот документ в 1С. Пользователь увидит форму с предзаполненными данными и сможет продолжить работу.

Работа с Уникальными Идентификаторами (GUID) в 1С

В ходе обсуждения часто упоминался Уникальный Идентификатор (GUID) — это глобально уникальный идентификатор объекта в базе данных 1С. Работа с ним критически важна для предложенных решений.

  1. Получение GUID объекта: В 1С GUID любого ссылочного объекта можно получить через его свойство УникальныйИдентификатор. Например: МойЭлементСправочника.УникальныйИдентификатор. Результатом будет объект типа УникальныйИдентификатор. Чтобы получить его строковое представление, нужно использовать Строка(МойЭлементСправочника.УникальныйИдентификатор).
  2. Формат GUID: GUIDы в 1С обычно представлены в строковом формате с дефисами (например, "48ef3a4f-f79b-11e8-bba4-000c29098faf"). Однако внешние системы иногда могут передавать их в "свернутом" виде (32 символа без дефисов). В таком случае, перед использованием для получения ссылки в 1С, этот короткий GUID необходимо преобразовать к стандартному формату с дефисами. Пример такого преобразования был показан в коде выше.
  3. Создание объекта УникальныйИдентификатор: Для работы с GUIDами в коде 1С используется конструктор Новый УникальныйИдентификатор("строка_с_GUID"). Строка должна быть в полном формате с дефисами.
  4. Получение ссылки по GUID: Метод ПолучитьСсылку() у менеджера объекта (например, Справочники.ВидыВнутреннихДокументов.ПолучитьСсылку(УИД)) позволяет получить ссылку на объект по его уникальному идентификатору. Если объект с таким GUID не найден, метод вернет пустую ссылку.

Важно всегда проверять, что полученная ссылка не пустая, прежде чем пытаться использовать её для заполнения реквизитов.

Заключение

Платформа 1С:Предприятие напрямую не поддерживает передачу произвольных параметров для предзаполнения новой формы объекта через навигационные ссылки, указывающие непосредственно на объект метаданных (например, Справочник.ИмяСправочника). Однако, это не означает, что задача нерешаема. Мы рассмотрели два основных подхода, которые позволяют реализовать этот функционал:

  1. Использование обработки-посредника: Мы создаем специальную обработку, которая становится целью навигационной ссылки. В эту ссылку можно передать пользовательские параметры, которые затем разбираются в обработчике ПриСозданииНаСервере формы обработки. Обработка программно создает новый объект, заполняет его реквизиты и открывает его форму для пользователя. Этот способ относительно прост в реализации и подходит для многих сценариев.
  2. Комплексная интеграция через HTTP-сервисы: Для более надежной, безопасной и масштабируемой интеграции с внешними системами рекомендуется использовать HTTP-сервисы 1С. Внешняя система отправляет HTTP-запрос с данными, 1С создает объект, заполняет его и возвращает навигационную ссылку на уже созданный объект. Это позволяет разделить логику создания данных и их отображения, делая систему более гибкой.

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

← На главную