Как программно получить объект последовательности по его идентификатору в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Анализ проблемы: почему стандартный подход не работает

Рассмотрим ситуацию, когда мы пытаемся составить список всех последовательностей и применить к ним метод Установить. Типичный ошибочный код выглядит следующим образом:


Процедура Сформировать() 
    Для п = 1 По Метаданные.Последовательность() Цикл 
        // Получаем идентификатор в виде строки
        ТекИмя = Метаданные.Последовательность(п).Идентификатор;
        
        // Попытка вызвать метод Установить у строки приведет к ошибке
        // "Значение не представляет агрегатный объект (Установить)"
        ТекИмя.Установить(Док.ТекущийДокумент());
    КонецЦикла;    
КонецПроцедуры

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

Решение №1: Использование глобального агрегатного объекта «Последовательность»

В платформе 1С 7.7 существуют специальные системные объекты, которые выполняют роль менеджеров для определенных типов данных. К ним относятся Константа, Справочник, Документ и, что важно для нас, Последовательность. Эти объекты обладают встроенным методом ПолучитьАтрибут, который позволяет обратиться к конкретной сущности по её имени.

Проанализируем правильный алгоритм решения задачи:

  1. Переберем метаданные, чтобы получить список имен всех последовательностей.
  2. Используем глобальный объект Последовательность.
  3. Вызовем метод ПолучитьАтрибут, передав в него строку с идентификатором.

Рассмотрим реализацию этого метода на практике:


Перем СпП; // Список значений для хранения имен

Процедура ПриОткрытии()
    СпП = СоздатьОбъект("СписокЗначений");
    КолП = Метаданные.Последовательность(); 
    Если КолП > 0 Тогда
        Для п = 1 По КолП Цикл
            // Сохраняем краткий Идентификатор (НЕ ПолныйИдентификатор)
            СпП.ДобавитьЗначение(Метаданные.Последовательность(п).Идентификатор);
        КонецЦикла;       
    КонецЕсли;    
КонецПроцедуры

Процедура ВыполнитьУстановку()
    Если Док.Выбран() = 0 Тогда
        Предупреждение("Выберите документ!");
        Возврат;
    КонецЕсли;

    Для п = 1 По СпП.РазмерСписка() Цикл 
        ИмяПос = СпП.ПолучитьЗначение(п); 
        
        // Ключевой момент: получаем объект через менеджер последовательностей
        ОбъектПоследовательность = Последовательность.ПолучитьАтрибут(ИмяПос);
        
        // Теперь мы можем работать с методами последовательности
        ОбъектПоследовательность.Установить(Док.ТекущийДокумент());
        Сообщить("Граница последовательности " + ИмяПос + " установлена на документ " + Док);
    КонецЦикла;    
КонецПроцедуры

Важный нюанс: при использовании метода ПолучитьАтрибут необходимо передавать именно Идентификатор (например, "ПартииТоваров"), а не ПолныйИдентификатор (например, "Последовательность.ПартииТоваров"). Поскольку мы обращаемся к атрибуту уже существующего объекта Последовательность, добавление префикса типа приведет к ошибке поиска.

Решение №2: Использование функции «Шаблон» (динамическое выполнение)

Существует альтернативный способ, который часто называют «хаком» платформы 7.7. Функция Шаблон предназначена для формирования строк с вычисляемыми выражениями в квадратных скобках. Однако её можно использовать для выполнения кода, если выражение внутри скобок содержит вызов метода объекта.

Разберем, как это работает:


ИмяПос = "Основная";
ДокОбъект = Док.ТекущийДокумент();
// Формируем строку кода и исполняем её внутри функции Шаблон
Шаблон("[Последовательность." + ИмяПос + ".Установить(ДокОбъект)]");

Этот метод работает, потому что при вычислении шаблона система обращается к глобальному контексту и выполняет все инструкции внутри []. Однако у него есть существенные недостатки: код становится менее читаемым, его сложно отлаживать, и он работает медленнее, чем прямой вызов ПолучитьАтрибут. Мы рекомендуем использовать первое решение как более надежное и профессиональное.

Проверка принадлежности документа к последовательности

При создании по-настоящему универсальной обработки важно помнить, что не каждый документ входит в каждую последовательность. Если вы попытаетесь вызвать метод Установить для документа, который не является регистратором в данной последовательности, система может повести себя непредсказуемо или выдать ошибку.

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


Для п = 1 По СпП.РазмерСписка() Цикл 
    ИмяПос = СпП.ПолучитьЗначение(п); 
    ОбъектПоследовательность = Последовательность.ПолучитьАтрибут(ИмяПос);
    
    // Проверяем, участвует ли данный документ в последовательности
    Если ОбъектПоследовательность.Принадлежит(Док.ТекущийДокумент()) = 1 Тогда
        ОбъектПоследовательность.Установить(Док.ТекущийДокумент());
    Иначе
        Сообщить("Документ " + Док + " не входит в последовательность " + ИмяПос, "i");
    КонецЕсли;
КонецЦикла;

Метод Принадлежит возвращает 1, если документ является влияющим на данную последовательность, и 0 в противном случае. Это позволяет избежать логических ошибок в работе универсальных алгоритмов перепроведения или корректировки границ.

Дополнительные методы объекта «Последовательность»

Разберем еще несколько полезных методов, которые становятся доступными после того, как мы получили объект через ПолучитьАтрибут:

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

Подводя итог, отметим, что для успешного решения задачи необходимо четко разделять понятия Метаданные (описание структуры) и Данные/Объекты (механизмы управления). Работа с метаданными дает нам только имена, а управление осуществляется через глобальные менеджеры типов.

← На главную