При работе с системой 1С:Предприятие часто возникает задача интеграции с внешними системами или просто создания удобных механизмов быстрого доступа. Один из таких сценариев — необходимость открыть форму нового объекта (например, документа или элемента справочника) по внешней навигационной ссылке, при этом часть реквизитов этого нового объекта должна быть уже предзаполнена. Давайте разберем, насколько это реализуемо в платформе 1С и какие существуют способы решения этой задачи, основываясь на опыте коллег и официальной информации.
Автор темы столкнулся с ситуацией, когда требовалось из внешней системы (в данном случае, Bitrix24) открыть форму создания нового элемента справочника 1С, например, Справочник.ВнутренниеДокументы, и сразу же заполнить один из его ключевых реквизитов, такой как ВидДокумента, используя параметры в навигационной ссылке. Была предпринята попытка сформировать ссылку следующего вида:
e1c://filev/C/Users/IVMokhov/Desktop/БАЗЫ ДАННЫХ/НПС#e1cib/data/Справочник.ВнутренниеДокументы?ВидДокумента=СправочникСсылка.ВидыВнутреннихДокументов:b0dc9408533d4a3011ebdb3b7e4ecc70
Однако, как показала практика и последующее обсуждение, такая ссылка открывает форму нового элемента, но реквизит ВидДокумента остается незаполненным. Возникает закономерный вопрос: почему так происходит и как добиться желаемого результата?
В ходе дискуссии был получен однозначный ответ от представителя 1С (Сергея Нуралиева), который подтвердил, что передача произвольных параметров для предзаполнения полей формы *нового* объекта через стандартные навигационные ссылки 1С не поддерживается платформой. Это функциональное пожелание существует у разработчиков уже давно, но по состоянию на апрель 2022 года так и не было реализовано.
Это означает, что часть ссылки вида ?ВидДокумента=... в случае открытия *нового* элемента справочника или документа (например, e1cib/data/Справочник.ВнутренниеДокументы без указания GUID) не будет интерпретироваться платформой как команды для установки начальных значений реквизитов. Навигационные ссылки 1С предназначены в первую очередь для прямого доступа к конкретным *существующим* объектам базы данных, спискам с отбором или к отчетам/обработкам, которые могут принимать параметры.
Таким образом, наша попытка напрямую передать ?ВидДокумента=... в URL для предзаполнения новой формы не увенчается успехом, поскольку платформа просто игнорирует эту часть в данном контексте.
Несмотря на отсутствие прямой поддержки стандартными средствами, мы можем использовать различные программные подходы для достижения желаемого результата. Эти подходы требуют дополнительной разработки в самой конфигурации 1С.
Этот способ является одним из наиболее прямых обходных путей, когда мы хотим передать параметры через саму навигационную ссылку. Вместо того чтобы пытаться передать параметры напрямую форме нового объекта, мы создадим специальную обработку, которая будет служить посредником. Навигационная ссылка будет указывать на эту обработку, а уже обработка будет принимать и парсить параметры, создавать новый объект и открывать его форму.
В конфигурации мы создаем новый объект метаданных "Обработка" (например, МояОбработкаДляСозданияДокумента). У этой обработки может быть форма. Важно, чтобы именно форма этой обработки открывалась по ссылке.
Навигационная ссылка теперь будет указывать на нашу обработку. Мы можем добавить к ней произвольные параметры, которые будут переданы в объект Параметры формы обработки при ее открытии. Пример ссылки с параметром:
e1c://filev/C:/ПутьКБазеДанных#e1cib/data/Обработка.МояОбработкаДляСозданияДокумента?ВидДокументаГУИД=b0dc9408533d4a3011ebdb3b7e4ecc70
Здесь:
e1c://... – стандартная часть ссылки на базу.#e1cib/data/Обработка.МояОбработкаДляСозданияДокумента – навигационная ссылка на нашу обработку.?ВидДокументаГУИД=b0dc9408533d4a3011ebdb3b7e4ecc70 – наш пользовательский параметр. ВидДокументаГУИД — это имя параметра, а b0dc9408533d4a3011ebdb3b7e4ecc70 — его значение (короткий GUID).Чтобы получить базовую навигационную ссылку на обработку, можно использовать следующий код в режиме 1С:Предприятие:
// В модуле объекта или в обработке (например, в ОбщемМодуле или временной обработке)
НавигационнаяСсылкаНаОбработку = ПолучитьНавигационнуюСсылку(Обработки.МояОбработкаДляСозданияДокумента);
Сообщить(НавигационнаяСсылкаНаОбработку);
Результат будет примерно таким: e1cib/data/Обработка.МояОбработкаДляСозданияДокумента. К этой строке мы затем вручную добавляем ?ВидДокументаГУИД=... для внешней системы (например, Bitrix24).
В модуле формы нашей обработки МояОбработкаДляСозданияДокумента мы добавим код в обработчик события ПриСозданииНаСервере. Этот код будет проверять наличие нашего параметра, парсить его, создавать новый объект и открывать его форму с уже заполненными данными.
// В модуле формы обработки "МояОбработкаДляСозданияДокумента"
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПереданныйГУИДСтрокой = "";
// Проверяем, был ли передан наш пользовательский параметр "ВидДокументаГУИД"
Если Параметры.Свойство("ВидДокументаГУИД") Тогда
ПереданныйГУИДСтрокой = Параметры.ВидДокументаГУИД;
КонецЕсли;
Если НЕ ПустаяСтрока(ПереданныйГУИДСтрокой) Тогда
Попытка
// Внешние системы могут передавать GUID в сокращенном формате (32 символа без дефисов).
// Преобразуем его в стандартный формат 1С с дефисами для надежной работы.
Если СтрДлина(ПереданныйГУИДСтрокой) = 32 Тогда
ПереданныйГУИДСтрокой = Сред(ПереданныйГУИДСтрокой, 1, 8) + "-"
+ Сред(ПереданныйГУИДСтрокой, 9, 4) + "-"
+ Сред(ПереданныйГУИДСтрокой, 13, 4) + "-"
+ Сред(ПереданныйГУИДСтрокой, 17, 4) + "-"
+ Сред(ПереданныйГУИДСтрокой, 21, 12);
КонецЕсли;
// Создаем объект УникальныйИдентификатор из полученной строки
УИДВидаДокумента = Новый УникальныйИдентификатор(ПереданныйГУИДСтрокой);
// Получаем ссылку на элемент справочника "ВидыВнутреннихДокументов" по GUID
ВидДокументаСсылка = Справочники.ВидыВнутреннихДокументов.ПолучитьСсылку(УИДВидаДокумента);
Если ВидДокументаСсылка.Пустая() Тогда
Сообщить("Не удалось найти вид документа по указанному GUID: " + ПереданныйГУИДСтрокой, СтатусСообщения.Важное);
Иначе
// Создаем новый элемент справочника "ВнутренниеДокументы"
НовыйВнутреннийДокументОбъект = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
// Заполняем ключевой реквизит "ВидДокумента"
НовыйВнутреннийДокументОбъект.ВидДокумента = ВидДокументаСсылка;
// Дополнительное заполнение других реквизитов, если это необходимо
НовыйВнутреннийДокументОбъект.Наименование = "Новый документ (создан извне " + Формат(ТекущаяДата(), "ДЛФ=Д") + ")";
// Открываем форму созданного объекта. Пользователь сможет дозаполнить и сохранить.
ФормаНовогоДокумента = НовыйВнутреннийДокументОбъект.ПолучитьФорму();
ФормаНовогоДокумента.Открыть();
КонецЕсли;
Исключение
Сообщить("Ошибка при обработке параметров или создании документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Иначе
Сообщить("GUID вида документа не был передан в ссылке или он пуст. Открытие пустой формы.", СтатусСообщения.Информация);
// Если параметр не передан, можно открыть пустую форму нового документа
ФормаНовогоДокумента = Справочники.ВнутренниеДокументы.СоздатьЭлемент().ПолучитьФорму();
ФормаНовогоДокумента.Открыть();
КонецЕсли;
// Важно: Отменяем стандартное открытие формы самой обработки,
// так как мы уже открыли форму нового документа.
Отказ = Истина;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Этот подход позволяет нам использовать навигационные ссылки для передачи пользовательских параметров и реализации гибкой логики создания и предзаполнения объектов.
Для более сложной и надежной интеграции с внешними системами, такими как Bitrix24, когда требуется не просто открыть существующий объект, а создать новый с предзаполненными данными, часто используют HTTP-сервисы 1С. Этот подход является более архитектурно правильным для взаимодействия "система-система" и обеспечивает большую гибкость и безопасность, поскольку внешняя система взаимодействует с 1С через веб-протокол, а не напрямую запускает клиентское приложение.
СозданиеДокументовИзБитрикс). Определяем его шаблоны URL и методы (например, POST).POST) пишется код, который создает новый элемент справочника ВнутренниеДокументы, заполняет его полученными параметрами и записывает в базу данных.Для реализации этого подхода потребуется создать 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С используется конструктор Новый УникальныйИдентификатор("строка_с_GUID"). Строка должна быть в полном формате с дефисами.ПолучитьСсылку() у менеджера объекта (например, Справочники.ВидыВнутреннихДокументов.ПолучитьСсылку(УИД)) позволяет получить ссылку на объект по его уникальному идентификатору. Если объект с таким GUID не найден, метод вернет пустую ссылку.Важно всегда проверять, что полученная ссылка не пустая, прежде чем пытаться использовать её для заполнения реквизитов.
Платформа 1С:Предприятие напрямую не поддерживает передачу произвольных параметров для предзаполнения новой формы объекта через навигационные ссылки, указывающие непосредственно на объект метаданных (например, Справочник.ИмяСправочника). Однако, это не означает, что задача нерешаема. Мы рассмотрели два основных подхода, которые позволяют реализовать этот функционал:
ПриСозданииНаСервере формы обработки. Обработка программно создает новый объект, заполняет его реквизиты и открывает его форму для пользователя. Этот способ относительно прост в реализации и подходит для многих сценариев.Выбор конкретного метода зависит от сложности интеграции, требований к безопасности, масштабируемости и удобству поддержки. Наиболее гибким и архитектурно правильным для взаимодействия между системами является использование HTTP-сервисов. Если же задача относится к более простому сценарию с прямым запуском клиентского приложения 1С, то создание специализированной обработки может быть достаточным и эффективным решением.