Разбираем устройство чужой конфигурации 1С: от дерева объектов до таблиц SQL

· 10 мин

Содержание

Структуру 1С читают в Конфигураторе: Конфигурация → Открыть конфигурацию, дальше дерево метаданных, окно свойств объекта и команда «Поиск ссылок на объект» в контекстном меню. Для массового анализа подключают объект Метаданные во встроенном языке, функцию ПолучитьСтруктуруХраненияБазыДанных() и выгрузку конфигурации в XML-файлы.

Этого набора хватает и разработчику, которому достался чужой код, и администратору, который хочет понять, в какой таблице SQL лежит справочник и почему база весит 80 ГБ. Главное — идти от общего к частному: сначала ветки дерева и подсистемы, потом один объект целиком, потом его связи. Иначе в тысячах объектов типовой БП или ERP легко утонуть.

Что входит в структуру конфигурации 1С

Конфигурация — это описание прикладного решения: какие в нём объекты, какие у них поля, формы, макеты и модули. Платформа по этому описанию строит таблицы базы данных и интерфейс. Когда говорят «прочитать структуру 1С», обычно имеют в виду три слоя.

  • 🧱 Метаданные — объекты конфигурации: справочники, документы, регистры, планы счетов, перечисления, отчёты, обработки. У каждого объекта есть реквизиты, табличные части, формы, макеты, модули.
  • 🔗 Связи — типы реквизитов (поле документа ссылается на справочник), движения документов по регистрам, подписки на события, подсистемы.
  • 🗄️ Хранение — физические таблицы СУБД, в которые платформа превращает объекты: _Reference…, _Document…, _AccumRg…, поля _Fld….

Зачем это нужно на практике:

  1. Найти, откуда берётся цифра в отчёте или поле печатной формы.
  2. Оценить, что сломается при доработке реквизита.
  3. Подготовить обмен или выгрузку во внешнюю систему — понять, какие поля есть у объекта.
  4. Разобраться с «тяжёлыми» таблицами при обслуживании базы на MS SQL или PostgreSQL.
  5. Принять дела у другого программиста и составить карту доработок.

Инструменты для изучения структуры: что выбрать

Задачи разные, и инструмент под каждую свой. Сводная таблица:

ИнструментЧто показываетКогда брать
Дерево конфигурации в КонфигуратореВсе объекты, их реквизиты, формы, модулиПервое знакомство, точечный разбор объекта
«Поиск ссылок на объект»Где объект используется в других метаданныхОценка последствий доработки
«Глобальный поиск» по модулямГде встречается имя реквизита или процедуры в кодеПоиск логики заполнения поля
«Отчет по конфигурации»Текстовое описание объектов со свойствамиДокументирование, сравнение «на бумаге»
Объект Метаданные в кодеЛюбые сведения о структуре, программноМассовый анализ, свои отчёты
ПолучитьСтруктуруХраненияБазыДанных()Соответствие объектов и таблиц СУБДАдминистрирование, анализ размеров таблиц
Выгрузка в XML-файлы / EDTКонфигурация как набор файловПоиск по тексту, Git, автоматизация
Синтакс-помощникОписание методов и свойств платформыПроверить, что умеет объект ОбъектМетаданных

Для разбора одной формы или одного документа хватает Конфигуратора. Если вопрос звучит как «найти все объекты, где…», сразу переходите к коду или к выгрузке в файлы — вручную по дереву вы это не соберёте.

Как прочитать структуру 1С в Конфигураторе: по шагам

Шаг 1. Откройте конфигурацию

Запустите базу в режиме «Конфигуратор» и выберите Конфигурация → Открыть конфигурацию. Слева появится дерево. Просто открыть и читать конфигурацию можно при работающих пользователях — монопольный режим для этого не нужен.

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

Шаг 2. Пройдите по веткам дерева

Ветки дерева идут в устойчивом порядке: «Общие», «Константы», «Справочники», «Документы», «Журналы документов», «Перечисления», «Отчеты», «Обработки», далее планы видов характеристик, планы счетов, планы видов расчёта, регистры сведений, накопления, бухгалтерии и расчёта, бизнес-процессы и задачи.

Ветка «Общие» многое объясняет про архитектуру. Там лежат:

  • 📦 Подсистемы — разделы интерфейса и логические группы объектов;
  • ⚙️ Общие модули — основная серверная и клиентская логика;
  • 🔔 Подписки на события — код, который срабатывает при записи или проведении объектов, хотя в модуле самого объекта его нет;
  • 🔐 Роли — права доступа ;
  • 🧩 Функциональные опции — переключатели, которые прячут или показывают реквизиты.

Шаг 3. Разберите один объект целиком

Двойной щелчок по объекту открывает окно редактирования с вкладками. Для документа самые полезные:

  • «Данные» — реквизиты и табличные части с типами;
  • «Движения» — по каким регистрам документ делает записи;
  • «Формы», «Макеты» — интерфейс и печатные формы;
  • «Прочее» — модуль объекта и модуль менеджера.

Окно «Свойства» (палитра свойств) показывает имя, синоним, тип реквизита, признак индексирования, проверку заполнения. Именно здесь видно, что поле Контрагент имеет тип СправочникСсылка.Контрагенты, а не просто «Контрагент».

Шаг 4. Найдите, где объект используется

Щёлкните правой кнопкой по объекту в дереве и выберите «Поиск ссылок на объект». Конфигуратор выведет список мест: реквизиты других объектов с этим типом, роли, подсистемы, формы, регистры. Это главный способ оценить последствия перед изменением.

Для поиска по коду используйте Правка → Глобальный поиск. Ищите по имени реквизита: например, .СтавкаНДС найдёт все модули, где это поле читается или заполняется. Отметьте поиск во всех модулях конфигурации, а не только в текущем окне.

Шаг 5. Сохраните описание

Конфигурация → Отчет по конфигурации формирует текстовое описание выбранных объектов со свойствами, реквизитами и типами. Его удобно отдать аналитику или положить в документацию проекта. Для большой конфигурации отметьте только нужные ветки, иначе отчёт выйдет на сотни страниц.

Программное чтение структуры: объект Метаданные

Всё, что видно в дереве, доступно из встроенного языка через свойство глобального контекста Метаданные. Оно возвращает объект конфигурации с коллекциями Справочники, Документы, РегистрыНакопления, РегистрыСведений и так далее. Каждый элемент коллекции — ОбъектМетаданных со свойствами Имя, Синоним, Реквизиты, ТабличныеЧасти и методом ПолноеИмя().

Список всех справочников с реквизитами и их типами:

Для Каждого МетаСправочник Из Метаданные.Справочники Цикл
    Сообщить(МетаСправочник.ПолноеИмя() + " — " + МетаСправочник.Синоним);
    Для Каждого Реквизит Из МетаСправочник.Реквизиты Цикл
        Сообщить("    " + Реквизит.Имя + ": " + Строка(Реквизит.Тип));
    КонецЦикла;
КонецЦикла;

Полезные методы для навигации:

МетодЧто делает
Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг")Возвращает объект метаданных по строке или Неопределено
Метаданные.НайтиПоТипу(ТипЗнч(Ссылка))Определяет, к какому объекту относится ссылка
Ссылка.Метаданные()То же из самой ссылки или объекта
ОбъектМетаданных.ПолноеИмя()Строка вида Справочник.Номенклатура
Реквизит.Тип.СодержитТип(Тип(...))Проверка, может ли поле хранить значение нужного типа

Если поле составного типа, Строка(Реквизит.Тип) перечислит все типы через запятую. Для проверки в коде используйте СодержитТип() или массив Реквизит.Тип.Типы().

Как узнать имена таблиц в СУБД

Функция ПолучитьСтруктуруХраненияБазыДанных() возвращает таблицу значений с колонками ИмяТаблицыХранения, ИмяТаблицы, Метаданные, Назначение и вложенной таблицей Поля. Вызывать её нужно на сервере или в толстом клиенте.

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

Второй параметр Истина выдаёт имена в терминах СУБД (_Reference42, _Fld1530), Ложь — в терминах платформы. В одной выборке вы получите основную таблицу справочника, таблицы табличных частей и служебные таблицы итогов, если это регистр.

Читать таблицы напрямую из SQL можно для анализа размеров и диагностики, но писать в них в обход платформы нельзя: это ломает целостность базы и итоги регистров.

Как найти связи и зависимости между объектами

Связи в 1С бывают четырёх видов, и каждый ищется по-своему.

  1. 🔗 Ссылочные поля. Реквизит документа хранит ссылку на справочник. Находятся через «Поиск ссылок на объект» или программно — проверкой типов реквизитов.
  2. 📊 Движения. Документ пишет в регистры. Смотрите вкладку «Движения» документа или свойство Движения у метаданных документа.
  3. 🔔 Подписки на события и общие модули. Логика при записи висит вне объекта. Откройте ветку «Общие → Подписки на события» и посмотрите свойство «Источник».
  4. 🧩 Функциональные опции и подсистемы. Определяют, видит ли пользователь реквизит или раздел. Отсюда частые вопросы «почему у меня нет такого поля».

Код, который находит все документы, двигающие нужный регистр:

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

А этот — все документы, у которых в шапке или в табличной части есть поле с типом «Контрагенты»:

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

Имена ТоварыНаСкладах и Контрагенты замените на объекты своей конфигурации: в разных типовых решениях регистры называются по-разному. Если объекта с таким именем нет, обращение через точку вызовет ошибку — в этом случае используйте НайтиПоПолномуИмени() и проверку на Неопределено.

Разбор задач на реальных примерах

Откуда берётся поле в печатной форме

Задача: в счёте на оплату печатается не тот банковский счёт. Порядок действий:

  1. Откройте документ в дереве, вкладка «Макеты». Найдите макет печатной формы и посмотрите имя параметра в нужной ячейке.
  2. Глобальным поиском найдите это имя параметра в модулях. Обычно оно заполняется в модуле менеджера документа или в общем модуле печати.
  3. Дойдите до запроса, который выбирает данные, и посмотрите, из какого реквизита берётся счёт.

В типовых конфигурациях на БСП печать часто вынесена в общие модули с именами вида УправлениеПечатью…, поэтому поиск по одному модулю документа ничего не даст.

Почему документ не попадает в отчёт

Отчёт строится по регистру, а документ в этот регистр не пишет. Откройте схему компоновки отчёта, посмотрите, из какой таблицы идёт запрос. Затем проверьте вкладку «Движения» документа. Если регистра там нет — дело не в данных, а в структуре: этот вид документа в отчёт не попадёт в принципе.

Какая таблица SQL раздула базу

Администратор видит в СУБД таблицу _InfoRg12345 на 30 ГБ. Чтобы понять, что это, вызовите ПолучитьСтруктуруХраненияБазыДанных() без параметров и найдите строку с этим ИмяТаблицыХранения. Колонка Метаданные даст полное имя регистра. Дальше уже понятно, к кому идти: к разработчику или к пользователям, которые копят историю.

Выгрузка в файлы и автоматизация анализа

Когда объектов тысячи, удобнее работать с конфигурацией как с папкой файлов. Конфигурация → Выгрузить конфигурацию в файлы сохраняет её в XML: в корне Configuration.xml, дальше папки по видам объектов — Catalogs, Documents, AccumulationRegisters, CommonModules и другие. Модули лежат отдельными файлами .bsl.

Это же делается из командной строки, без открытия Конфигуратора вручную:

"C:\Program Files\1cv8\8.3.24.1467\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /DumpConfigToFiles "D:\Dump\Buh" /Out "D:\Dump\log.txt"

Для клиент-серверной базы вместо /F указывают /S "сервер\имябазы". Путь к 1cv8.exe подставьте под свою версию платформы. Параметр /Out пишет журнал — без него при ошибке непонятно, что пошло не так.

Что даёт выгрузка:

  • 🔍 поиск по тексту любым редактором или grep/findstr — например, все места, где упоминается реквизит;
  • 🗂️ сравнение версий через Git: видно, какие объекты и строки кода поменялись между релизами;
  • 📈 свои отчёты: скрипт на Python или PowerShell разбирает XML и строит список объектов, реквизитов, типов;
  • 🧰 работа в EDT — 1C:Enterprise Development Tools открывает такую выгрузку как проект с навигацией по ссылкам и поиском использования.

Если нужен анализ прямо в базе, оформите код из раздела про Метаданные во внешнюю обработку . Результат выводите не в Сообщить(), а в таблицу значений или табличный документ — так его удобно сохранить в Excel.

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

Частые ошибки при разборе структуры

  • ❌ Путать имя и синоним. В коде и запросах работает только Имя (РеализацияТоваровУслуг), синоним «Реализация (акт, накладная)» — это подпись для пользователя.
  • ❌ Не смотреть расширения. Часть доработок живёт не в основной конфигурации, а в расширениях: Конфигурация → Расширения конфигурации. Обработчик там может перехватывать типовую процедуру, и в основном модуле вы его не увидите.
  • ❌ Игнорировать подписки на события. Код при записи документа ищут в модуле объекта, а он висит в общем модуле через подписку.
  • ❌ Зашивать имена таблиц СУБД. _Reference42 в одной базе и в другой — разные справочники. Имена назначаются при создании объектов и после реструктуризации могут отличаться. Всегда берите их из ПолучитьСтруктуруХраненияБазыДанных() для конкретной базы.
  • ❌ Путать основную конфигурацию и конфигурацию базы данных. Если в Конфигураторе есть изменения, не применённые через «Обновить конфигурацию базы данных», дерево показывает не то, с чем работают пользователи. Рабочую версию открывают через Конфигурация → Конфигурация базы данных → Открыть конфигурацию БД.

Частые вопросы

Можно ли посмотреть структуру 1С без Конфигуратора?
Да. Объект Метаданные доступен из внешней обработки в режиме «1С:Предприятие». Права на запуск внешних обработок при этом нужны.
Где посмотреть структуру базы, если конфигурация закрыта паролем или поставлена без возможности изменения?
Дерево объектов видно и при поставке без возможности изменения. Модули, закрытые поставщиком, не прочитать — это законная защита, обходить её не нужно.
Как узнать, какие объекты изменены относительно типовой?
Сравните конфигурацию с конфигурацией поставщика через Конфигурация → Сравнить конфигурации. Отчёт покажет изменённые объекты, реквизиты и модули.
Чем метаданные отличаются от данных?
Метаданные — описание: «у справочника Номенклатура есть реквизит Артикул». Данные — сами записи: конкретный товар с артикулом 1024.
Сколько объектов в типовой конфигурации?
Счёт идёт на тысячи: в БП 3.0 одних документов больше сотни, а ещё регистры, общие модули, роли и формы. Поэтому массовый анализ делают кодом или по выгрузке в файлы.