Предопределённые элементы 1С 8.3: что можно поменять в программе, а что только в конфигураторе
Содержание
Изменить предопределенный элемент в 1С можно тремя способами. Наименование и обычные реквизиты меняют прямо в форме элемента в режиме 1С:Предприятие, как у любой записи справочника. Имя, код по умолчанию и сам состав предопределённых правят только в конфигураторе, в свойствах объекта на вкладке Прочее → кнопка Предопределенные. Третий способ — программный, через свойство ИмяПредопределенныхДанных: им снимают признак с элемента или привязывают его к другой записи.
Выбор зависит от задачи. Переименовать статью затрат или вид контактной информации — хватит формы. Исправить дубли после обмена или «потерянный» элемент — нужен код. Поменять имя, на которое опирается программа, — это уже доработка конфигурации со всеми последствиями для обновлений.
Чем предопределённый элемент отличается от обычного
Предопределённый элемент описан в самой конфигурации, а не только в данных базы. Разработчик задал ему имя (например, ОсновнаяВалюта или Товары), и код программы обращается к записи по этому имени:
Справочники.ВидыНоменклатуры.Товары
ПредопределенноеЗначение("Справочник.ВидыНоменклатуры.Товары")
Отсюда все сложности:
- 🔗 На имя завязан код. Отчёты, проведение документов и обработки ищут запись не по наименованию, а по имени. Переименование в форме код не ломает, а смена имени в конфигураторе — ломает.
- 🚫 Удалить интерактивно нельзя без отдельного права. Пометку удаления платформа блокирует.
- 🧩 Элемент существует в двух местах. Описание — в конфигурации, запись — в таблице базы. Если связь между ними порвётся, программа выдаст ошибку при первом обращении по имени.
- 🔄 Обновления типовой конфигурации могут менять предопределённые данные. Ваши правки в конфигураторе встанут в конфликт с поставщиком.
Предопределённые бывают у справочников, планов счетов, планов видов характеристик и планов видов расчёта. В плане счетов БП 3.0 предопределённые почти все счета типового плана.
Как узнать, что элемент предопределённый
В списке справочника такие записи отмечены отдельной пиктограммой. Точно проверить можно в конфигураторе: откройте объект, вкладка Прочее → Предопределенные. Там видно имя, код и наименование каждого элемента.
Программно признак читают через свойство Предопределенный (Истина/Ложь), а имя — через ИмяПредопределенныхДанных. Оба поля доступны и в запросе:
ВЫБРАТЬ
Спр.Ссылка,
Спр.Наименование,
Спр.ИмяПредопределенныхДанных
ИЗ
Справочник.ВидыНоменклатуры КАК Спр
ГДЕ
Спр.Предопределенный
Запрос удобно выполнить в консоли запросов, чтобы увидеть, какие записи в базе связаны с какими именами.
Когда менять предопределённый элемент действительно нужно
Причин немного, и у каждой свой способ.
| Задача | Способ | Риск |
|---|---|---|
| Наименование не подходит компании («Основной склад» → «Склад Химки») | Форма элемента | Почти нет |
| Нужно заполнить реквизиты: ставку, счёт учёта, единицу | Форма элемента | Почти нет |
| В базе два элемента с одним именем после обмена или загрузки | Код через ИмяПредопределенныхДанных | Средний, нужна копия |
| Ошибка «предопределённый элемент не существует» после удаления записи | Код или повторная инициализация | Средний |
| Разработчику нужен новый предопределённый элемент или новое имя | Конфигуратор | Высокий для типовой |
Если ваш случай — первые две строки, конфигуратор не нужен вовсе.
Способ 1. Изменить предопределенный элемент в режиме 1С:Предприятие
Это безопасный путь. Ссылка на запись не меняется, имя тоже, поэтому код продолжает работать.
- Откройте нужный справочник или план счетов
через раздел программы или через
Главное меню → Все функции. Если пункта «Все функции» нет, включите его вСервис и настройки → Параметрыфлажком «Отображать команду “Все функции”». - Найдите элемент по наименованию и откройте двойным щелчком.
- Поменяйте наименование или реквизиты.
- Нажмите
Записать и закрыть.
Что поменять, как правило, не получится:
- 📛 Код — у части объектов он заблокирован в форме, если типовая конфигурация защищает предопределённые записи. Так устроены, например, предопределённые счета в плане счетов БП 3.0: их код задаёт поставщик.
- 🗑️ Пометку удаления — без специального права платформа её не даст поставить.
- 🗂️ Родителя и вид элемента — зависит от конфигурации; в типовых формах эти поля для предопределённых часто закрыты.
Новое наименование увидят все документы и отчёты, где запись уже выбрана: они хранят ссылку, а не текст. Печатные формы прошлых периодов тоже выйдут с новым названием.
Способ 2. Поменять предопределённые данные в конфигураторе
Здесь меняется сама конфигурация. Способ для разработчика или администратора, который отвечает за доработки.
Подготовка
- Сделайте выгрузку информационной базы в файл
.dt(Администрирование → Выгрузить информационную базу) или резервную копию средствами СУБД. - Для типовой конфигурации на поддержке включите возможность изменения:
Конфигурация → Поддержка → Настройка поддержки→Включить возможность изменения. Для самого объекта выберите правило «Объект поставщика редактируется с сохранением поддержки».
Снятие с полной поддержки делает обновления ручными: при каждом обновлении придётся сравнивать и объединять изменённый объект. Для небольшой правки наименования это неоправданная цена — используйте способ 1.
Правка
- В дереве конфигурации откройте объект (справочник, план счетов).
- Перейдите на вкладку
Прочееи нажмитеПредопределенные. - В открывшемся списке измените нужное поле: имя, код, наименование, родителя. Здесь же добавляют новые элементы и удаляют лишние.
- Сохраните конфигурацию и обновите конфигурацию базы данных (
F7).
После обновления структуры платформа сопоставит описание с записями базы. Изменённое в конфигураторе наименование не перезапишет то, которое пользователь уже поменял в форме: запись в базе живёт своей жизнью.
Если меняете имя
Имя — это то, к чему привязан код. Перед переименованием найдите все обращения: Правка → Глобальный поиск (или Ctrl+Shift+F) по старому имени во всех модулях. Ищите оба варианта: .СтароеИмя и строку "Справочник.ИмяОбъекта.СтароеИмя" внутри ПредопределенноеЗначение.
Пропущенное обращение в серверном модуле даст ошибку только тогда, когда код выполнится, — например, при проведении документа через месяц. Синтаксический контроль модулей (Конфигурация → Проверка конфигурации) часть таких мест покажет заранее.
Способ 3. Привязать или отвязать элемент кодом
Начиная с платформы 8.3.3 (при режиме совместимости не ниже 8.3.3) у элементов есть свойство ИмяПредопределенныхДанных, доступное для записи. Это главный рабочий инструмент практика, когда в базе беспорядок с предопределёнными:
- присвоить пустую строку — запись станет обычной, её можно пометить на удаление;
- присвоить имя из конфигурации — обычная запись станет предопределённой под этим именем.
Типичная задача: после загрузки данных в справочнике два элемента «Товары», оба с именем Товары. Нужно оставить тот, на который ссылаются документы, а второй отвязать.
// Выполняется на сервере, под пользователем с полными правами
Лишний = Справочники.ВидыНоменклатуры.НайтиПоКоду("000000012").ПолучитьОбъект();
Лишний.ИмяПредопределенныхДанных = "";
Лишний.ПометкаУдаления = Истина;
Лишний.Записать();
Код 000000012 здесь условный: сначала выполните запрос из первого раздела и посмотрите, какая из записей лишняя. Ориентир — на какую запись нет ссылок в документах: удаление помеченных объектов само покажет, если на запись кто-то ссылается, и не даст её удалить.
Обратная ситуация: запись удалили, а имя в конфигурации осталось. Если запись ещё есть в базе как обычная, её возвращают так:
Объект = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары", Истина).ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "Товары";
Объект.Записать();
Если записи нет совсем, менеджер объекта создаст недостающие предопределённые методом ИнициализироватьПредопределенныеДанные():
Справочники.ВидыНоменклатуры.ИнициализироватьПредопределенныеДанные();
Метод создаёт отсутствующие элементы, но новые записи получат новые ссылки. Старые документы, которые ссылались на удалённую запись, останутся с битыми ссылками — их перевыбирают вручную или обработкой.
Код с записью объектов запускайте сначала на копии базы. Выполнять его удобно во внешней обработке или в консоли кода в режиме 1С:Предприятие под администратором.
Ошибки при изменении предопределённых элементов и что с ними делать
Большинство проблем появляется не в момент правки, а позже: при обмене, обновлении или проведении.
Откуда берутся дубли в распределённой базе
Классическая причина — свойство объекта Обновление предопределенных данных на вкладке Прочее. Варианты: Авто, Обновлять автоматически, Не обновлять автоматически.
В периферийных узлах РИБ платформа при значении Авто не создаёт предопределённые элементы сама: они должны прийти из главного узла. Если кто-то поставил Обновлять автоматически или вызвал инициализацию в узле, элемент создастся локально, а затем придёт ещё один из центра — получите два элемента с одним именем. Для объектов в РИБ оставляйте Авто.
Можно обойтись без правки предопределённого
Часто задача решается так, что предопределённые данные остаются нетронутыми.
- ➕ Создать обычный элемент рядом. Нужен ещё один вид номенклатуры или склад — добавьте запись в форме. Предопределённый для этого не трогают.
- 📌 Сменить значение по умолчанию. Если не устраивает, что программа подставляет предопределённую запись, ищите настройку в разделе
Администрированиеили в персональных настройках пользователя: во многих типовых значения по умолчанию задаются там, а не жёстко в коде. - 🧱 Расширение конфигурации. Нужен новый реквизит или своя логика вокруг элемента — сделайте её в расширении (
Конфигурация → Расширения конфигурации). Основная конфигурация останется на поддержке, обновления пройдут без ручного объединения. - 🔁 Субсчёт вместо правки счёта. В плане счетов вместо изменения предопределённого счёта добавьте к нему свой субсчёт с нужной аналитикой.
Как защитить предопределённые элементы от случайных изменений
Защита строится на правах и на коде формы.
Права ролей
В конфигураторе у ролей есть отдельные права для предопределённых данных: интерактивное удаление, установка и снятие пометки удаления, удаление помеченных. Найдите их в списке прав объекта в редакторе роли. Обычным пользователям эти права не выдавайте. В типовых конфигурациях они, как правило, есть только у полных прав.
Блокировка полей в форме
Если нужно запретить и правку наименования, закройте поля формы для предопределённых записей. В модуле формы элемента:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Предопределенный Тогда
Элементы.Наименование.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Для типовой конфигурации такую доработку правильнее делать в расширении, чтобы не снимать форму с поддержки.
Проверка при записи
Форма защищает только интерактивную правку. Чтобы обработки и загрузки тоже не меняли запись, добавьте проверку в обработчик ПередЗаписью модуля объекта: если Предопределенный равно Истина и пользователь не администратор — Отказ = Истина с сообщением. Учтите, что обмен данными пишет объекты с ОбменДанными.Загрузка = Истина; такие записи проверку обычно пропускают, иначе обмен остановится.