RE: Как программно получить регистры ERP с измерениями “Номенклатура” и “Склад”?

#33331
bot_avaOdin — Одинэсник
Участник

    В конфигурации 1С:ERP (8.3) для программного получения всех регистров (накопления, сведений и т.п.), у которых в измерениях присутствуют одновременно реквизиты «Номенклатура» и «Склад», можно использовать метаданные конфигурации и перебрать все регистры, проверяя их измерения.

    Пример кода на встроенном языке 1С:

    1C
    Процедура ПолучитьРегистрыСНоменклатуройИСкладом() Экспорт
        Результат = Новый Массив;
    
        МетаданныеКонфигурации = Метаданные;
    
        // Перебираем все регистры накопления
        Для Каждого РегистрНакопления Из МетаданныеКонфигурации.РегистрНакопления Цикл
            ЕстьНоменклатура = Ложь;
            ЕстьСклад = Ложь;
    
            Для Каждого Измерение Из РегистрНакопления.Измерения Цикл
                ИмяИзмерения = Измерение.Имя;
                Если ИмяИзмерения = "Номенклатура" Тогда
                    ЕстьНоменклатура = Истина;
                КонецЕсли;
                Если ИмяИзмерения = "Склад" Тогда
                    ЕстьСклад = Истина;
                КонецЕсли;
            КонецЦикла;
    
            Если ЕстьНоменклатура И ЕстьСклад Тогда
                Результат.Добавить(РегистрНакопления.Имя);
            КонецЕсли;
        КонецЦикла;
    
        // Аналогично можно проверить регистры сведений, если нужно
        // Для этого раскомментируйте следующий блок:
    
        /*
        Для Каждого РегистрСведений Из МетаданныеКонфигурации.РегистрСведений Цикл
            ЕстьНоменклатура = Ложь;
            ЕстьСклад = Ложь;
    
            Для Каждого Измерение Из РегистрСведений.Измерения Цикл
                ИмяИзмерения = Измерение.Имя;
                Если ИмяИзмерения = "Номенклатура" Тогда
                    ЕстьНоменклатура = Истина;
                КонецЕсли;
                Если ИмяИзмерения = "Склад" Тогда
                    ЕстьСклад = Истина;
                КонецЕсли;
            КонецЦикла;
    
            Если ЕстьНоменклатура И ЕстьСклад Тогда
                Результат.Добавить(РегистрСведений.Имя);
            КонецЕсли;
        КонецЦикла;
        */
    
        // Вывод результата
        Для Каждого ИмяРегистра Из Результат Цикл
            Сообщить(ИмяРегистра);
        КонецЦикла;
    
        Возврат Результат;
    КонецПроцедуры
    

    Объяснение:

    — Используем объект `Метаданные` для доступа к метаданным конфигурации.
    — Перебираем все регистры накопления (`Метаданные.РегистрНакопления`).
    — Для каждого регистра проверяем наличие измерений с именами «Номенклатура» и «Склад».
    — Если оба измерения присутствуют, добавляем имя регистра в результат.
    — Аналогично можно проверить регистры сведений, если в вашей конфигурации есть такие, где эти измерения могут встречаться.
    — В конце выводим список найденных регистров.

    Если нужно получить не только имена, а и объекты метаданных для дальнейшей работы — можно сохранять сами объекты.

    Рекомендую посмотреть здесь:
    https://infostart.ru/public/1794329/ (пример работы с метаданными в 1С)
    https://its.1c.ru/db/metod8dev#content:360:hdoc (официальная документация по работе с метаданными)

    База знаний 1С