Как добавить предопределенный элемент в справочник 1С и обращаться к нему из кода
Содержание
Предопределенный элемент создают в конфигураторе: откройте окно редактирования справочника, на вкладке «Прочее» нажмите кнопку «Предопределенные», добавьте строку, задайте имя, код и наименование, затем обновите конфигурацию базы данных (F7). После этого элемент появится в базе, и к нему можно обращаться из кода как Справочники.ИмяСправочника.ИмяЭлемента.
Так же настраиваются предопределенные данные планов видов характеристик, планов счетов и планов видов расчета. Ниже — что именно хранит платформа, какие поля можно заполнить в конфигураторе, а какие только программно, и как не получить ошибку «Предопределенный элемент не существует» после обновления.
Как устроены предопределенные данные в 1С 8.3
Предопределенный элемент — обычная запись справочника, у которой есть постоянное имя в метаданных. Пользователь может переименовать её, поменять реквизиты, но удалить интерактивно не сможет. Код программы опирается на это имя и уверен, что запись всегда на месте.
Где встречаются предопределенные данные:
- 📁 Справочники — статьи затрат, виды контактной информации, базовые единицы измерения.
- 🏷️ Планы видов характеристик — виды субконто, дополнительные свойства.
- 📒 Планы счетов — сами счета с признаками учета и видами субконто.
- 💰 Планы видов расчета — базовые начисления и удержания.
Связь записи с метаданными
Начиная с платформы 8.3.3 связь хранится прямо в записи: у каждого элемента есть стандартный реквизит ИмяПредопределенныхДанных. Если он пустой — элемент обычный. Если в нём записано имя — элемент предопределенный, а реквизит Предопределенный возвращает Истина.
Отсюда два следствия:
- Переименование наименования в пользовательском режиме ничего не ломает: код ищет запись по имени, а не по наименованию.
- Если в базе окажутся две записи с одинаковым
ИмяПредопределенныхДанных, платформа не сможет выбрать нужную — это источник ошибки «не уникален» (о ней ниже).
Чем предопределенный элемент отличается от обычного
| Признак | Обычный элемент | Предопределенный |
|---|---|---|
| Где создается | в пользовательском режиме или кодом | в конфигураторе |
| Удаление пользователем | можно | нельзя |
| Обращение из кода | через поиск по коду или наименованию | напрямую по имени |
| Переносится обновлением конфигурации | нет | да |
Пошагово: создаем предопределенный элемент справочника
Возьмем пример: справочник СтатьиЗатрат, в который нужно добавить предопределенную статью «Аренда офиса» с именем Аренда.
Шаг 1. Откройте редактор предопределенных
- В дереве конфигурации раскройте ветку «Справочники».
- Дважды щелкните
СтатьиЗатрат— откроется окно редактирования объекта. - Перейдите на вкладку «Прочее».
- Нажмите кнопку «Предопределенные».
Откроется список предопределенных элементов этого справочника. Если он пустой — значит, их пока нет.
Если конфигурация на поддержке и объект не снят с замка, кнопка добавления будет недоступна. Включите возможность изменения конфигурации или правьте объект в собственной (не типовой) конфигурации.
Шаг 2. Добавьте элемент
Нажмите «Добавить» (или Insert) и заполните поля:
- 🔤 Имя — идентификатор для кода:
Аренда. Только буквы, цифры и подчеркивание, первой не может быть цифра. - 🔢 Код — например,
000000001. Длина и тип кода берутся из свойств справочника. - 📝 Наименование — «Аренда офиса», это видит пользователь.
Для иерархического справочника с группами доступна команда добавления группы. Элементы внутри предопределенной группы перетаскиваются в нее мышью или создаются, когда группа выделена. Родителем предопределенного элемента в конфигураторе может быть только предопределенная группа.
Шаг 3. Сохраните и обновите базу
- Закройте редактор предопределенных.
- Сохраните конфигурацию.
- Выполните «Обновить конфигурацию
базы данных» (
F7).
После обновления и запуска в режиме «Предприятие» элемент появится в списке справочника. В списке он помечается особой пиктограммой.
Реквизиты и табличные части предопределенных элементов
В редакторе предопределенных справочника заполняются только стандартные поля: имя, код, наименование и признак группы. Значения своих реквизитов и строки табличных частей здесь не задаются.
Их заполняют одним из трех способов:
| Способ | Когда подходит | Риски |
|---|---|---|
| Вручную в режиме «Предприятие» | одна база, данные меняются редко | в новой базе придется повторять |
| Кодом в обработчике обновления | тираж конфигурации, много баз | ошибка в коде перезапишет правки пользователя |
| Механизм начального заполнения БСП | конфигурация на БСП 3.x | нужно знать, как устроен механизм |
Заполнение кодом
Минимальный пример: заполнить реквизит СчетУчета у статьи Аренда, если он пуст.
Процедура ЗаполнитьСтатьюАренда() Экспорт
Ссылка = Справочники.СтатьиЗатрат.Аренда;
Если Не ЗначениеЗаполнено(Ссылка.СчетУчета) Тогда
Объект = Ссылка.ПолучитьОбъект();
Объект.СчетУчета = ПланыСчетов.Хозрасчетный.ОбщехозяйственныеРасходы;
Объект.Записать();
КонецЕсли;
КонецПроцедуры
Проверка ЗначениеЗаполнено нужна, чтобы не затереть то, что пользователь уже поправил руками. Имя счета в примере условное — подставьте предопределенный счет своего плана счетов.
В конфигурациях на БСП 3.x принято другое место: процедура ПриНачальномЗаполненииЭлементов в модуле менеджера справочника. Там описывается таблица значений с именем предопределенного и значениями реквизитов, а БСП сама заполняет их при создании базы и при обновлении версии.
Планы видов характеристик и планы счетов
У них в редакторе предопределенных полей больше:
- 🏷️ ПВХ — кроме имени, кода и наименования задается тип значения характеристики. Для вида субконто «Контрагенты» это
СправочникСсылка.Контрагенты. - 📒 План счетов — вид счета (активный, пассивный, активно-пассивный), признак забалансового, признаки учета и до заданного в свойствах максимума видов субконто.
Виды субконто счета выбираются из предопределенных элементов ПВХ, указанного в свойстве плана счетов. Поэтому сначала создают вид субконто в ПВХ, потом подключают его к счету.
Ссылки на предопределенные элементы из других объектов
Предопределенные данные удобны тем, что на них можно сослаться прямо в метаданных, без строчки кода.
Где это используется:
- Значение заполнения реквизита. В свойствах реквизита документа укажите
Значение заполнения— выберите предопределенную статью. Новый документ откроется с уже подставленной «Арендой». - Параметры выбора. У реквизита можно ограничить выбор, например, только элементами внутри предопределенной группы: параметр
Отбор.Родительсо значением этой группы. - Виды субконто счетов. Как описано выше, счет плана счетов ссылается на предопределенные виды субконто.
- Предопределенные значения в формах. В условном оформлении и отборах динамического списка тоже выбирается конкретный предопределенный элемент.
Если удалить предопределенный элемент из конфигурации, все такие ссылки в метаданных станут пустыми или сломаются при проверке. Перед удалением найдите, где он используется: в контекстном меню элемента есть команда поиска ссылок на объект.
Зависимость от порядка создания
Платформа создает предопределенные записи при инициализации данных. Если элемент справочника А ссылается в реквизите на элемент справочника Б, задавайте это значение после создания обоих — кодом обработчика обновления, а не в момент первого запуска.
Обращение к предопределенным элементам из кода и запросов
Есть четыре способа получить ссылку. Выбор зависит от того, где выполняется код.
| Где | Как писать | Пример |
|---|---|---|
| Сервер, модуль объекта | через менеджер | Справочники.СтатьиЗатрат.Аренда |
Клиент (модуль формы, &НаКлиенте) | глобальная функция | ПредопределенноеЗначение("Справочник.СтатьиЗатрат.Аренда") |
| Запрос | функция языка запросов | ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.Аренда) |
| Проверка признака | реквизит записи | Ссылка.Предопределенный, Ссылка.ИмяПредопределенныхДанных |
На клиенте менеджеров справочников нет, поэтому Справочники.… там не скомпилируется. ПредопределенноеЗначение() работает и на клиенте, и на сервере.
Пример запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Расходы.Сумма КАК Сумма
|ИЗ
| РегистрНакопления.Расходы КАК Расходы
|ГДЕ
| Расходы.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.Аренда)";
В запросе можно отбирать и все предопределенные записи разом: ГДЕ СтатьиЗатрат.Предопределенный.
Список имен предопределенных
Менеджер справочника умеет вернуть массив имен всех предопределенных элементов:
Имена = Справочники.СтатьиЗатрат.ПолучитьИменаПредопределенных();
Для Каждого Имя Из Имена Цикл
Сообщить(Имя);
КонецЦикла;
Это удобно в обработчиках обновления: пройти по именам и проверить, у каких записей не заполнены реквизиты.
Проверка перед изменением
Если в форме элемента нужно запретить менять что-то у предопределенных записей, проверяйте Объект.Предопределенный в ПриСозданииНаСервере и блокируйте поле. Так пользователь не сломает, например, код, на который завязана выгрузка.
Обновление конфигурации и инициализация данных
Когда предопределенный элемент реально появляется в базе, управляет свойство справочника «Обновление предопределенных данных» на вкладке «Прочее»:
- ⚙️ Авто — значение по умолчанию; в обычной базе записи создаются автоматически.
- ✅ Обновлять автоматически — платформа всегда создает недостающие предопределенные.
- ⛔ Не обновлять автоматически — записи создает только код или обмен.
Распределенная база (РИБ)
В подчиненных узлах РИБ предопределенные элементы не должны создаваться сами: они приходят из главного узла обменом. Если создать их в узле автоматически, после обмена появятся две записи с одним именем.
Для управления этим есть глобальные методы:
УстановитьИнициализациюПредопределенныхДанных(Истина)— отметить, что инициализация уже выполнена, и платформа не будет создавать записи сама.ПолучитьИнициализациюПредопределенныхДанных()— проверить текущее состояние.ИнициализироватьПредопределенныеДанные()— принудительно создать недостающие записи.
В типовых конфигурациях на БСП это уже реализовано в подсистеме обмена данными. В своей конфигурации с РИБ вызывайте установку признака до первого обращения к предопределенным в узле.
Ошибки предопределенных элементов и их исправление
Две ошибки встречаются чаще остальных. Обе возникают в режиме «Предприятие», хотя причина — в данных или в конфигурации.
Как найти дубли
Запрос для поиска повторяющихся имен:
ВЫБРАТЬ
Т.ИмяПредопределенныхДанных КАК Имя,
КОЛИЧЕСТВО(Т.Ссылка) КАК Записей
ИЗ
Справочник.СтатьиЗатрат КАК Т
ГДЕ
Т.Предопределенный
СГРУППИРОВАТЬ ПО
Т.ИмяПредопределенныхДанных
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Т.Ссылка) > 1
Выполните его в консоли запросов. Для каждого имени из результата решите, какая запись остается: обычно та, на которую больше ссылок в документах.
Исправление дублей — изменение данных в рабочей базе. Сначала сделайте резервную копию, исправьте на копии, проверьте документы, и только потом повторите в рабочей базе вне рабочего времени.
Частые промахи разработчика
- 🔁 Переименовали имя элемента в конфигураторе. Для платформы это удаление старого и создание нового: в базе может появиться вторая запись. Если нужно только поменять отображение — меняйте наименование, а не имя.
- 🧩 Сослались на элемент в клиентском коде через менеджер. Модуль не скомпилируется. На клиенте — только
ПредопределенноеЗначение(). - 📦 Загрузили данные из другой базы без предопределенных. После загрузки проверьте, что каждое имя из
ПолучитьИменаПредопределенных()находит запись.