Как программно узнать возможные типы субконто у счета в 1С?

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

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

Понимание структуры типов субконто

Важно помнить, что ВидыСубконто у счета — это ссылки на элементы ПланВидовХарактеристик. Именно этот объект в конфигурации хранит информацию о допустимых типах данных. Чтобы получить доступ к этим типам программно, мы используем свойство ТипЗначения, которое возвращает объект ОписаниеТипов.

Метод 1: Проверка вхождения конкретного типа

Если вам нужно узнать, поддерживает ли субконто определенный тип (например, СправочникСсылка.Номенклатура), не обязательно перебирать все возможные варианты. Платформа предоставляет метод СодержитТип(), который значительно упрощает задачу.

Рассмотрим, как проверить наличие конкретного типа в описании:


МассивТипов = Счет.ВидыСубконто[0].ВидСубконто.ТипЗначения.Типы();
Если Счет.ВидыСубконто[0].ВидСубконто.ТипЗначения.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда
    Сообщить("Данное субконто может принимать значение типа Номенклатура");
КонецЕсли;

Метод 2: Анализ всех доступных типов через Метаданные

Если ваша задача состоит в том, чтобы вывести список всех возможных типов для пользователя или логически обработать их, нам потребуется метод Метаданные.НайтиПоТипу(). Это «золотой стандарт» при работе с типами, так как он позволяет получить доступ к объекту метаданных, а не просто к абстрактному типу.

Давайте разберем пример, в котором мы перебираем массив типов и определяем, к какому виду метаданных они относятся:


// Получаем массив всех типов, разрешенных для данного субконто
МассивТипов = Счет.ВидыСубконто[0].ВидСубконто.ТипЗначения.Типы();

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

Почему использование метаданных — лучшее решение?

Использование связки Метаданные.НайтиПоТипу() и методов коллекции Содержит() позволяет избежать жесткого кодирования имен объектов. Этот подход обладает рядом преимуществ:

  1. Универсальность: Код будет работать корректно, даже если в будущем типы субконто будут изменены в конфигураторе.
  2. Читаемость: Использование ПолноеИмя() или Представление() позволяет пользователю увидеть понятное название объекта, а не просто идентификатор типа.
  3. Безопасность: Платформенные методы проверки типов сводят к минимуму риск возникновения ошибок при приведении типов.

Практические советы для разработчика

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

Однако, если программная обработка неизбежна, всегда опирайтесь на ОписаниеТипов и объект Метаданные. Это позволит вам создавать гибкие и масштабируемые решения в любой конфигурации 1С.

← На главную