Как получить ссылку на дополнительную обработку или отчет из формы этой обработки?

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

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

1. Передача ссылки через параметры формы (наиболее надежный и рекомендуемый способ)

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

  1. Объявление параметра в форме обработки/отчета:

    В свойствах формы вашей дополнительной обработки или отчета необходимо добавить параметр. Для этого перейдите в конфигураторе в форму вашей обработки/отчета, затем откройте панель "Реквизиты" или "Параметры" формы (обычно находится внизу или слева).

    Создайте новый параметр формы со следующими свойствами:

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

    После выполнения этих шагов система автоматически заполнит этот параметр при стандартном открытии формы обработки или отчета из справочника "Дополнительные отчеты и обработки".

  2. Получение значения параметра в модуле формы:

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

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Мы проверяем наличие свойства "ДополнительнаяОбработкаСсылка" в коллекции Параметры
        // Это важно, так как форма может быть открыта и без этого параметра,
        // например, в режиме отладки или из другого места, не связанного со справочником.
        Если Параметры.Свойство("ДополнительнаяОбработкаСсылка") Тогда
            СсылкаНаЭлементСправочника = Параметры.ДополнительнаяОбработкаСсылка;
                    
            // Теперь у нас есть ссылка на элемент справочника "Дополнительные отчеты и обработки".
            // Мы можем использовать ее для дальнейших действий, например:
            // 1. Получить объект справочника, чтобы работать с его реквизитами:
            // ОбъектСправочника = СсылкаНаЭлементСправочника.ПолучитьОбъект();
            // 2. Получить имя объекта метаданных, к которому привязана обработка:
            // ИмяОбъектаМетаданных = ОбъектСправочника.ИмяОбъекта;
            // 3. Сохранить ссылку в реквизите формы для дальнейшего использования:
            // ЭтотОбъект.СсылкаНаМоюОбработку = СсылкаНаЭлементСправочника;
            // и так далее.
        Иначе
            // Обработка ситуации, когда параметр не передан.
            // Например, вывести сообщение пользователю или использовать значения по умолчанию.
        КонецЕсли;
    КонецПроцедуры
    

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

2. Поиск элемента справочника по имени объекта метаданных

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

  1. Получение имени объекта метаданных текущей обработки/отчета:

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

    
    &НаСервере
    Функция ПолучитьИмяОбъектаМетаданныхТекущейОбработки()
        // ЭтотОбъект в контексте формы обработки/отчета ссылается на саму обработку/отчет.
        // Метаданные() возвращает объект метаданных, описывающий эту обработку/отчет.
        // .Имя - это строковое представление имени объекта метаданных.
        Возврат ЭтотОбъект.Метаданные().Имя;
    КонецФункции
    

    Вызов ЭтотОбъект.Метаданные().Имя вернет строковое имя объекта метаданных, например, "ВнешняяОбработка1" или "ВнешнийОтчет2". Это имя соответствует имени файла обработки/отчета при его загрузке или имени объекта в конфигурации, если обработка/отчет является встроенным.

  2. Поиск в справочнике "Дополнительные отчеты и обработки" по имени объекта:

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

    
    &НаСервере
    Функция НайтиСсылкуПоИмениОбъекта()
        // Получаем имя метаданных текущей обработки/отчета
        ИмяМетаданных = ЭтотОбъект.Метаданные().Имя;
    
        // Создаем новый запрос для поиска в справочнике
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1 // Мы выбираем только одну ссылку, так как ожидаем уникальный результат
        |    ДополнительныеОтчетыИОбработки.Ссылка
        |ИЗ
        |    Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
        |ГДЕ
        |    ДополнительныеОтчетыИОбработки.ИмяОбъекта = &ИмяОбъекта // Фильтруем по имени объекта метаданных
        |    И ДополнительныеОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ // Исключаем помеченные на удаление элементы
        |    И ДополнительныеОтчетыИОбработки.Публикация = ИСТИНА // Исключаем неопубликованные (неактивные) элементы
        |    И ДополнительныеОтчетыИОбработки.Вид = &Вид"; // Фильтруем по виду (обработка или отчет)
    
        Запрос.УстановитьПараметр("ИмяОбъекта", ИмяМетаданных);
                
        // Определяем вид текущего объекта (ДополнительнаяОбработка или ДополнительныйОтчет)
        Вид = Неопределено;
        Если ТипЗнч(ЭтотОбъект) = Тип("ДополнительныйОтчет") Тогда
            Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
        ИначеЕсли ТипЗнч(ЭтотОбъект) = Тип("ДополнительнаяОбработка") Тогда
            Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
        Иначе
            // Если тип не определен как ожидаемый, возможно, это внешняя обработка
            // запущенная не через стандартный механизм ДополнительныхОтчетовИОбработок.
            // В этом случае данный метод может быть неприменим или потребует корректировки запроса.
            Возврат Неопределено;
        КонецЕсли;
    
        // Устанавливаем параметр "Вид" для запроса
        Если Вид <> Неопределено Тогда
            Запрос.УстановитьПараметр("Вид", Вид);
        Иначе
            Возврат Неопределено; // Не удалось определить вид, вернуть Неопределено
        КонецЕсли;
    
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
    
        Если Выборка.Следующий() Тогда
            Возврат Выборка.Ссылка; // Возвращаем найденную ссылку
        Иначе
            Возврат Неопределено; // Ссылка не найдена
        КонецЕсли;
    КонецФункции
    

    Важно учитывать, что теоретически в справочнике может существовать несколько элементов с одинаковым ИмяОбъекта (например, если один и тот же файл обработки был загружен несколько раз, возможно, с разными наименованиями элементов в справочнике, или если по ошибке загрузили несколько версий). В этом случае ВЫБРАТЬ ПЕРВЫЕ 1 вернет только одну из них, что может быть непредсказуемо, если нам нужна конкретная. Чтобы максимально сузить круг поиска и найти только актуальный элемент, мы настоятельно рекомендуем добавить дополнительные фильтры в запрос. В нашем примере мы добавили фильтры по ПометкаУдаления = ЛОЖЬ и Публикация = ИСТИНА, что позволяет исключить удаленные или неактивные обработки.

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

3. Получение ссылки по Уникальному Идентификатору (УИД) элемента справочника

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

  1. Получение УИД элемента справочника:

    Если вы решили использовать этот метод, то первым шагом будет получение УИД нужного элемента справочника. Это обычно делается вручную:

    • Добавьте вашу обработку/отчет в справочник Дополнительные отчеты и обработки в вашей информационной базе.
    • Откройте этот элемент справочника в режиме 1С:Предприятия.
    • Получите его УИД. Это можно сделать различными способами:
      • Через консоль запросов, выполнив запрос к справочнику и выбрав поле УникальныйИдентификатор.
      • В режиме отладки, установив точку останова после получения ссылки на элемент справочника (например, СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("МояОбработка")) и просмотрев свойство УникальныйИдентификатор у этой ссылки.
      • В некоторых конфигурациях может быть предусмотрена возможность копирования УИД элемента справочника из формы или списка.
    • Скопируйте полученный УИД в виде строки (например, "00000000-0000-0000-0000-000000000000").

    Пример получения УИД через код (для отладки/одноразового использования, не для продакшена):

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

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

  2. Получение ссылки по УИД:

    Зная УИД элемента справочника (например, "00000000-0000-0000-0000-000000000000"), мы можем получить на него программную ссылку с помощью функции ПолучитьСсылку() и конструктора УникальныйИдентификатор.

    
    &НаСервере
    Функция ПолучитьСсылкуПоУИД()
        // Здесь мы "хардкодим" УИД. В реальном проекте УИД должен быть получен динамически
        // или храниться в параметрах/константах.
        УИД_ЭлементаСправочника = "00000000-0000-0000-0000-000000000000"; // ОБЯЗАТЕЛЬНО замените на реальный УИД
    
        Попытка
            // Создаем объект УникальныйИдентификатор из строкового представления.
            // Затем используем функцию ПолучитьСсылку() для получения ссылки на объект по его УИД.
            СсылкаНаЭлементСправочника = ПолучитьСсылку(Новый УникальныйИдентификатор(УИД_ЭлементаСправочника));
            Возврат СсылкаНаЭлементСправочника;
        Исключение Ошибка
            // Обработка ошибки, если УИД недействителен, имеет неверный формат
            // или если объект с таким УИД не найден в базе данных.
            Сообщить("Ошибка при получении ссылки по УИД: " + Ошибка.Описание);
            Возврат Неопределено;
        КонецПопытки;
    КонецФункции
    

    Важный недостаток: Хардкод УИД делает обработку крайне негибкой и плохо переносимой между разными базами данных или различными окружениями (например, база разработки, база тестирования, рабочая база). Это связано с тем, что при загрузке обработки в новый справочник Дополнительные отчеты и обработки в другой информационной базе, для вновь созданного элемента будет сгенерирован новый, уникальный УИД, отличный от того, который был "зашит" в код. Таким образом, обработка перестанет работать без ручной корректировки кода. Этот метод следует использовать с большой осторожностью и только в очень специфических случаях, когда другие подходы неприменимы или когда перенос между базами не является критичным фактором, а стабильность ссылки на конкретную запись важнее.

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

  1. Для дополнительных отчетов: Мы хотим подчеркнуть, что все описанные выше методы получения ссылки применимы и для дополнительных отчетов. Это связано с тем, что дополнительные отчеты также хранятся в том же справочнике Дополнительные отчеты и обработки и используют схожие механизмы запуска форм, поэтому подходы к получению ссылки остаются идентичными.

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

  3. Команды и параметры: Если вы создаете собственную команду для запуска дополнительной обработки/отчета (например, через механизм командных панелей или непосредственно в коде), всегда убедитесь, что в свойствах этой команды (в конфигураторе или при создании команды программно) вы корректно настроили передачу параметров. В частности, передачу ссылки на сам элемент справочника ДополнительныеОтчетыИОбработки. Система 1С обычно делает это автоматически для стандартных механизмов запуска, но при кастомной разработке этот момент важно контролировать.

  4. Гибкость и переносимость: Мы всегда стремимся к разработке решений, которые максимально гибки, легко поддерживаемы и легко переносятся между различными базами данных и окружениями (разработка, тестирование, продакшн). Метод передачи ссылки через параметры формы является "золотым стандартом" в этом отношении, обеспечивая максимальную надежность и минимум проблем при эксплуатации.

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

← На главную