1C-Code → Основы 1С → Конфигуратор и дерево метаданных
Где лежит всё, из чего состоит конфигурация: справочники, документы, регистры, модули. Карта, без которой невозможно выполнить ни одну задачу с работы.
Глава 16 из 36 · чтение примерно 24 минут
Задача с работы звучит так: «в накладной не считается скидка». Чтобы её выполнить, надо знать, куда идти. Эта глава — про карту.
Откройте конфигуратор — и слева увидите дерево. Это вся конфигурация: ничего, кроме перечисленного в нём, в программе нет.
Ветки идут в постоянном порядке, и он не алфавитный — он смысловой, от общего к частному:
| Ветка | Что это | Пример |
|---|---|---|
| Общие | то, что используется везде | общие модули, картинки, макеты |
| Константы | одно значение на всю базу | Организация по умолчанию |
| Справочники | списки того, что существует | Номенклатура, Контрагенты |
| Документы | события, которые произошли | Реализация, Поступление |
| Перечисления | жёсткий список вариантов | ВидОперации: Продажа, Возврат |
| Отчёты | показать данные | Оборотно-сальдовая ведомость |
| Обработки | сделать что-то с данными | Загрузка прайса из Excel |
| Регистры сведений | значение на дату и разрез | Цены номенклатуры |
| Регистры накопления | приход и расход | ТоварыНаСкладах |
| Регистры бухгалтерии | проводки по счетам | Хозрасчётный |
| Планы видов характеристик | свойства, заводимые пользователем | ДопРеквизиты |
| Роли | кому что можно | Кладовщик, Бухгалтер |
Справочники, документы и регистры — это то, о чём говорят. Но половина реальной работы лежит в ветках, которые новичок пролистывает, потому что они короткие.
| Ветка | Что это | Когда понадобится |
|---|---|---|
| Константы | одно значение на всю базу | название организации, ставка по умолчанию, флаг режима |
| Перечисления | закрытый список вариантов, заданный в конфигурации | вид операции, статус — там, где вариантов ровно столько и добавлять их не будут |
| Общие модули | код, не привязанный к объекту | расчёты и правила, нужные из разных мест |
| Общие реквизиты | один реквизит сразу во многих объектах | организация в каждом документе; на них же стоит разделение данных |
| Подписки на событие | ваш обработчик к чужому объекту | добавить проверку в типовой документ, не трогая его модуль |
| Регламентные задания | что выполняется по расписанию | ночная выгрузка, проверка почты, пересчёт |
| Планы видов характеристик | список «свойств», заводимых пользователем | дополнительные реквизиты, субконто |
Две из них стоит отметить отдельно, потому что они меняют привычный порядок работы.
Подписка на событие — способ вмешаться в чужой объект снаружи. Вы пишете процедуру в своём общем модуле и говорите платформе: «вызывай её перед записью всех документов вот этих видов». Модуль типового документа при этом остаётся нетронутым, и конфигурация не снимается с поддержки.
Общий реквизит — один реквизит, добавленный сразу в десятки объектов. Так в типовых сделана «Организация»: она не заведена в каждом документе по отдельности. На этом же механизме работает разделение данных, когда в одной базе живут несколько независимых организаций.
Как запомнить разницу
Справочник отвечает на вопрос «что существует». Товар существует независимо от того, продавали его сегодня.
Документ отвечает на «что случилось». У него всегда есть дата и номер: событие произошло в конкретный момент.
Регистр отвечает на «сколько и где». Он не вводится руками — его пишут документы при проведении.
Эти три вопроса — «что существует», «что случилось», «сколько сейчас» — и есть устройство любой учётной системы.
Раскройте любой справочник — и увидите одинаковый набор веток. Он одинаков у всех объектов, и это сильно упрощает жизнь: разобравшись с одним, вы знаете устройство всех.
Реквизиты — поля объекта. У контрагента это ИНН, КПП, ЮрАдрес.
Табличные части — таблицы внутри объекта. У накладной это «Товары»: сколько строк, столько позиций.
Формы — как объект выглядит на экране. Форм бывает несколько: списка, элемента, выбора.
Макеты — печатные формы и схемы отчётов.
Модули — код. Их несколько, и какой когда выполняется — тема отдельной главы: это одно из самых частых мест, где новичок пишет верный код не туда.
Обычно элементы справочника заводит пользователь. Но некоторые нужны самой программе: валюта «Рубль», статья расходов «Себестоимость», тип цены «Розничная». На них ссылается код, и без них он не работает.
Такие элементы описывают в конфигурации, а платформа заводит их в базе сама. Обращаются к ним по имени, а не поиском: Справочники.Валюты.Рубль. Это надёжнее любого поиска по наименованию — наименование пользователь переименует, а имя предопределённого живёт в конфигурации.
И ровно поэтому с ними легко сделать больно.
Предопределённый элемент нельзя просто удалить
Удалили его в конфигураторе — из базы он не исчезнет. Останется обычным элементом, на который больше ничего не ссылается: данные по нему есть, а код его не находит.
Обратное тоже верно: пользователь может пометить предопределённый элемент на удаление прямо в списке. Элемент останется, но работа с ним начнёт выглядеть странно, и виноватым окажется код.
Поэтому в типовых предопределённых мало и заводят их осознанно. Прежде чем добавить свой, стоит спросить: а точно ли на него будет ссылаться КОД, или это просто элемент, который должен быть в базе с самого начала? Во втором случае его место — в начальном заполнении, а не в конфигурации.
Типовая — это тысячи объектов и сотни тысяч строк кода. Листать дерево бесполезно; ищут четырьмя способами, и порядок обычно такой.
1. От того, что видит человек. Он показывает кнопку или поле на экране. В предприятии — «Изменить форму» или подсказка с именем элемента; дальше это имя ищется в конфигураторе.
2. Глобальный поиск по конфигурации. Ищет по всему коду и свойствам сразу. Им находят «откуда берётся эта надпись» — по куску текста из окна.
3. Поиск ссылок на объект. Правой кнопкой по объекту в дереве — «Найти ссылки». Отвечает на «кто этим пользуется» и обязателен ДО правки: иначе правка задевает тех, о ком вы не знали.
4. По журналу регистрации. Если ошибка уже была, в журнале есть имя процедуры и модуля — это точный адрес.
Отладчик как способ поиска
Самый честный ответ на «какой код тут работает» даёт не поиск, а стек вызовов. Ставите точку останова в общем месте — например, в записи объекта — нажимаете кнопку в предприятии и смотрите, откуда пришли.
Это быстрее чтения кода в типовой, где одну процедуру зовут из десяти мест, и половина вызовов — через переопределяемые модули БСП.
«Найти нужное место в чужой конфигурации» — это не одно умение, а четыре разных, и путать их значит тратить часы там, где хватило бы минуты.
| Инструмент | Отвечает на вопрос | Когда именно он |
|---|---|---|
| Глобальный поиск по конфигурации | «где вообще встречается это слово» | знаете кусок текста, имя функции, сообщение об ошибке |
| Поиск ссылок на объект | «кто пользуется этим справочником» | собираетесь менять объект и хотите знать, что сломается |
| Отладчик с точкой останова | «какой код выполняется на самом деле» | подписок и переопределений столько, что по тексту не проследить |
| Синтакс-помощник | «какие у этого метода параметры» | знаете что делать, не помните как оно называется |
Порядок обычно такой. Сначала глобальный поиск по тексту из сообщения, которое видит пользователь: сообщения в 1С почти всегда написаны в коде строкой, и находятся они мгновенно. Если текста нет — точка останова в том месте, где событие точно проходит, и дальше по стеку вызовов.
«Поиск ссылок на объект» — отдельная привычка, которую стоит завести сразу. Прежде чем менять тип реквизита или удалять что-нибудь «ненужное», спросите у конфигуратора, кто на это ссылается. В типовой ответ регулярно оказывается неожиданным.
Конфигурацию можно выгрузить в файлы
Конфигурация лежит внутри базы, и это неудобно: её не сравнить построчно, не положить в систему контроля версий, не посмотреть, что изменилось за неделю.
Поэтому есть выгрузка конфигурации в файлы: каждый объект и каждый модуль становится отдельным файлом на диске. Дальше с ними работают как с обычным кодом — git, сравнение текста, история правок с именами и датами.
Команды разработчиков на 1С так и живут: хранилище конфигурации для совместной работы, а выгрузка в файлы — для истории и разбора «кто и зачем это сделал».
Половина поведения объекта — не код, а галочки в палитре свойств. Их стоит знать в лицо, иначе будете писать код там, где хватает настройки.
| Свойство | Что меняет | Когда трогают |
|---|---|---|
| Длина и точность | сколько влезет в реквизит | деньги: 15 и 2; проценты не забыть, что длина считается ВСЯ |
| Индексировать | будет ли быстрый поиск по реквизиту | отбор или соединение по этому полю |
| Проверка заполнения | ругаться ли при записи пустого | обязательные реквизиты — без единой строки кода |
| Связи параметров выбора | что подставится в списке выбора | договор только этого контрагента |
| Функциональная опция | виден ли объект вообще | учёт по складам выключен — полей склада нет нигде |
| Основная форма | какая форма откроется | «почему при открытии не срабатывает мой код» |
Переименование объекта — это не косметика
Имя объекта используется везде: в запросах текстом, в коде, в макетах, в настройках отчётов у пользователей. Конфигуратор поправит ссылки в коде, но не поправит имя внутри строкового текста запроса и не тронет сохранённые настройки.
Поэтому переименование делают редко и с глобальным поиском по старому имени. А в расширениях — не делают вовсе: аннотации цепляются по имени.
Подсистема выглядит как раздел интерфейса, но это ещё и способ сказать «эти объекты про одно».
Практических следствия три. Объект, не включённый ни в одну подсистему, не виден в интерфейсе — сколько команд ни пиши. Права в ролях удобно выдавать подсистемами целиком. И по подсистемам ориентируются, когда разбирают чужую конфигурацию: они показывают, из каких частей она сложена.
Самое частое затруднение первого месяца: «нашёл, что не работает, но не понимаю, где это написано». Порядок поиска такой:
1. Что не так — при записи или при проведении? Если сумма не сходится после проведения — смотрите модуль объекта, процедуру ОбработкаПроведения. Если поле не пересчиталось на экране — модуль формы.
2. Глобальный поиск. В конфигураторе это Ctrl+Shift+F по всей конфигурации. Ищите не название ошибки, а имя реквизита: «Скидка» найдёт все места, где её трогают.
3. Поиск ссылок на объект. Правой кнопкой по объекту в дереве — «Поиск ссылок на объект». Покажет, кто его использует. Это спасает перед удалением: удалить объект, на который ссылаются, значит сломать конфигурацию.
На чём спотыкаются
Правят типовую конфигурацию, не сняв с поддержки, и удивляются, что нельзя. Типовая стоит «на поддержке»: часть объектов защищена от изменения. Снять с поддержки просто, а последствия долгие — про это глава про обновление.
Ищут в «Общих модулях» то, что лежит в модуле объекта. Правило простое: код про конкретный документ лежит у этого документа. В общий модуль выносят то, что нужно многим.
Добавляют реквизит и не понимают, почему его нет на форме. Реквизит объекта и элемент формы — разные вещи. Добавили реквизит — положите его на форму отдельно.
У каждого объекта и каждого реквизита есть три названия, и путать их дорого.
Имя — то, чем объект зовут в коде. Без пробелов, латиница или кириллица: ВидНоменклатуры. Менять имя у работающей конфигурации больно: код по всей базе перестанет его находить.
Синоним — то, что видит пользователь: «Вид номенклатуры». Его можно менять свободно, на код не влияет.
Комментарий — для разработчика. Не показывается нигде, кроме конфигуратора.
Упражнение 1. Куда это положить
Функция ГдеХранить(Описание) получает описание того, что надо завести, и возвращает ветку дерева: "Справочники", "Документы" или "РегистрыНакопления". Правило: если в описании есть слово "список" — справочник; если "произошло" — документ; если "остаток" — регистр накопления.
Решается в тренажёре: код запускается и проверяется сразу.
Упражнение 2. Чем искать
Функция ЧемИскать(Вопрос) получает строку: "текст сообщения" — знаем текст, который видит пользователь; "кто ссылается" — собираемся менять объект. Вернуть "глобальный поиск" для первого и "поиск ссылок" для второго.
Решается в тренажёре: код запускается и проверяется сразу.
Дерево конфигурации — это вся программа: чего нет в дереве, того нет нигде. Справочник отвечает «что существует», документ — «что случилось», регистр — «сколько сейчас». Внутри каждого объекта одинаковый набор: реквизиты, табличные части, формы, макеты, модули. Код ищут глобальным поиском по имени реквизита, а перед удалением объекта — поиском ссылок на него. Имя живёт в коде, синоним — на экране.
Читать про код и писать код — разные умения. В тренажёре к этой главе идут упражнения: вы пишете решение, оно запускается на настоящем интерпретаторе 1С и проверяется сразу, без установки платформы.
← Что такое 1С:Предприятие: конфигурация и база
→ Справочники: списки того, что существует