Как сделать элемент справочника предопределенным в 1С:ERP в режиме пользователя?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием
← На главную

При работе с системой 1С:ERP часто возникает вопрос о гибкости настройки элементов справочников. В частности, пользователей интересует, можем ли мы сделать обычный элемент справочника предопределенным непосредственно в режиме "1С:Предприятие", то есть без необходимости заходить в "Конфигуратор" и вносить изменения в структуру базы данных. Давайте подробно разберем эту ситуацию и выясним, какие механизмы доступны в системе.

Мы выясним, что создание нового, ранее не существовавшего предопределенного элемента непосредственно в пользовательском режиме невозможно. Это функция разработчика, которая выполняется в "Конфигураторе", используя анализ структуры метаданных. Однако, существуют механизмы, которые позволяют нам привязать уже существующий обычный элемент к предопределенному имени или, наоборот, отвязать его. Именно этот аспект часто путает пользователей и вызывает вопросы.

Что такое предопределенные элементы и зачем они нужны?

Прежде чем углубляться в детали, рассмотрим, что такое предопределенные элементы в контексте платформы 1С. Предопределенные элементы – это особые записи в справочниках (или других объектах метаданных, таких как планы счетов, виды характеристик), которые жестко заданы в конфигурации разработчиком. Они имеют уникальное системное имя и предназначены для следующих целей:

  1. Системные настройки и логика: Часто используются для хранения критически важных настроек или для обозначения элементов, которые имеют особую логику в программе (например, "Основной склад", "НДС 20%", "Типовая единица измерения").
  2. Обеспечение целостности: Гарантируют, что определенные данные всегда будут присутствовать в базе, даже если пользователь случайно их удалит или переименует (система может восстановить их или требовать их наличия).
  3. Программный доступ: Позволяют разработчику обращаться к конкретной записи справочника по ее имени, не завися от внутреннего идентификатора (GUID) или описания, которое может меняться пользователями. Например, мы можем в коде обратиться к Справочники.Валюты.НайтиПоНаименованию("Рубль"), но гораздо надежнее и правильнее использовать Справочники.Валюты.Рубль, если "Рубль" – это предопределенный элемент.
  4. Миграция и обновления: Упрощают перенос данных и обновление конфигураций, так как система всегда знает, какие элементы являются "системными".

Создание таких элементов – это часть проектирования конфигурации, и оно выполняется разработчиком в режиме "Конфигуратор".

Создание предопределенных элементов: Только в "Конфигураторе"

Как мы уже выяснили, создать новый предопределенный элемент справочника с нуля, если его не было в конфигурации, в режиме "1С:Предприятие" невозможно. Эта операция требует изменения структуры метаданных, что является прерогативой разработчика. Процесс создания предопределенного элемента в "Конфигураторе" выглядит следующим образом:

  1. Разработчик открывает "Конфигуратор".
  2. Находит нужный объект метаданных (например, справочник "Номенклатура", "Контрагенты", "Организации").
  3. Переходит на вкладку "Предопределенные" или "Предопределенные элементы" для этого объекта.
  4. Добавляет новую запись, указывая уникальное имя (это системное имя, по которому к нему можно обращаться из кода) и, при необходимости, представление (то, что увидит пользователь при первом создании элемента).
  5. Обновляет конфигурацию базы данных.

После этого система "знает" о существовании такого предопределенного имени. При первом запуске или обновлении, если элемента с таким именем еще нет в базе, он будет создан автоматически.

Привязка существующего элемента к предопределенному имени в режиме "1С:Предприятие"

Несмотря на невозможность создания, в пользовательском режиме мы можем выполнять другую очень важную операцию: привязать уже существующий обычный элемент справочника к предопределенному имени, которое было заранее создано разработчиком в "Конфигураторе". Или, наоборот, отвязать предопределенный элемент, сделав его обычным.

Этот механизм основан на использовании стандартного реквизита объекта, который называется ИмяПредопределенныхДанных (ранее мог называться ИмяПредопределенного или похожим образом). Этот реквизит присутствует у тех объектов метаданных (справочники, планы счетов), которые поддерживают механизм предопределенных данных.

Как работает реквизит ИмяПредопределенныхДанных

Реквизит ИмяПредопределенныхДанных хранит строковое значение – то самое уникальное системное имя предопределенного элемента, которое было задано разработчиком в "Конфигураторе".

Инструменты для выполнения привязки в пользовательском режиме

Для изменения значения реквизита ИмяПредопределенныхДанных в режиме "1С:Предприятие" мы можем использовать следующие штатные средства платформы, а также специализированные обработки:

1. Использование обработки "Групповое изменение реквизитов"

Это мощный штатный инструмент платформы 1С, который позволяет нам изменять значения реквизитов у множества объектов одновременно. Он идеально подходит для нашей задачи.

  1. Откройте обработку:

    В большинстве типовых конфигураций (таких как 1С:ERP) обработка "Групповое изменение реквизитов" доступна через меню "Все функции" (или "Сервис и настройки" -> "Функции для технического специалиста" в более новых версиях управляемых форм) или через раздел "Администрирование" -> "Обслуживание" -> "Корректировка данных" -> "Групповое изменение реквизитов".

  2. Выберите объект для изменения:

    В открывшемся окне обработки мы увидим поле "Изменять". Здесь нам необходимо выбрать тип объекта, который мы хотим изменить, например, "Справочники: Номенклатура" или "Справочники: Организации". Выберите соответствующий справочник, элементы которого мы планируем сделать предопределенными.

  3. Отберите элементы (при необходимости):

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

  4. Укажите изменяемый реквизит:

    После выбора объектов и, возможно, задания отбора, перейдите к нижней части окна, где перечислены реквизиты объекта. Нам нужен стандартный реквизит ИмяПредопределенныхДанных. Он может быть не сразу виден, так как относится к служебным реквизитам. Чтобы его отобразить, мы можем нажать на кнопку "Дополнительные параметры" или "Показать все реквизиты" (точное название кнопки может отличаться в разных версиях платформы).

    Найдите в списке реквизит ИмяПредопределенныхДанных (или ИмяПредопределенного, если это более старая конфигурация или специфический объект). Поставьте флажок напротив этого реквизита, используя Редактор объектов информационной базы 8.3.

  5. Задайте новое значение:

    Рядом с выбранным реквизитом ИмяПредопределенныхДанных появится поле для ввода значения. Здесь мы должны ввести точное системное имя предопределенного элемента, которое было задано разработчиком в "Конфигураторе". Например, если разработчик создал предопределенный элемент с именем "ОсновнаяОрганизация", мы вводим это имя.

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

  6. Выполните изменение:

    Нажмите кнопку "Изменить реквизиты". Система предложит подтвердить операцию. После подтверждения, выбранные элементы справочника получат указанное значение в реквизите ИмяПредопределенныхДанных, и, таким образом, станут привязаны к соответствующему предопределенному имени.

2. Создание специализированной внешней обработки

Если нам требуется выполнять такую операцию часто или для пользователей, не обладающих правами на использование "Группового изменения реквизитов", разработчик может создать простую внешнюю обработку. Такая обработка будет содержать минимальный код для выполнения этой задачи. Например, она может предложить пользователю выбрать элемент справочника и ввести имя предопределенного элемента, к которому нужно привязать выбранный элемент.

Вот пример очень простого кода, который может быть использован в такой обработке (предполагая, что у нас есть ссылка на элемент справочника ЭлементСправочника и строка ИмяПредопределенного):


// Предположим, что ЭлементСправочника - это уже выбранный элемент справочника,
// а ИмяПредопределенного - это строка, введенная пользователем.

Если ТипЗнч(ЭлементСправочника) = Тип("СправочникСсылка.Номенклатура") Тогда
    ОбъектНоменклатуры = ЭлементСправочника.ПолучитьОбъект();
    ОбъектНоменклатуры.ИмяПредопределенныхДанных = ИмяПредопределенного;
    Попытка
        ОбъектНоменклатуры.Записать();
        Сообщить("Элемент '" + ЭлементСправочника.Наименование + "' успешно привязан к предопределенному имени '" + ИмяПредопределенного + "'.");
    Исключение
        Сообщить("Ошибка при записи элемента: " + ОписаниеОшибки());
    КонецПопытки;
ИначеЕсли ТипЗнч(ЭлементСправочника) = Тип("СправочникСсылка.Организации") Тогда
    ОбъектОрганизации = ЭлементСправочника.ПолучитьОбъект();
    ОбъектОрганизации.ИмяПредопределенныхДанных = ИмяПредопределенного;
    Попытка
        ОбъектОрганизации.Записать();
        Сообщить("Элемент '" + ЭлементСправочника.Наименование + "' успешно привязан к предопределенному имени '" + ИмяПредопределенного + "'.");
    Исключение
        Сообщить("Ошибка при записи элемента: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

// Для отвязки элемента, то есть чтобы сделать его обычным:
// ОбъектНоменклатуры.ИмяПредопределенныхДанных = "";
// ОбъектНоменклатуры.Записать();

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

Важное условие со стороны конфигурации: свойство "Обновление предопределенных данных"

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

Это свойство находится на вкладке "Прочие" или "Дополнительно" в свойствах самого справочника в "Конфигураторе". Оно может принимать следующие значения:

  1. "Обновлять автоматически" (значение по умолчанию): Если установлено это значение, то при каждом обновлении конфигурации, если в базе данных отсутствует элемент с предопределенным именем, система автоматически создаст его. Это гарантирует наличие предопределенного элемента.
  2. "Не обновлять автоматически": Если разработчик устанавливает это значение, то при обновлении конфигурации платформа не будет автоматически создавать элемент, если он отсутствует. Это означает, что системное имя предопределенного элемента будет существовать в метаданных, но соответствующая запись в базе данных может быть пустой. Именно такой подход позволяет нам вручную привязать любой существующий элемент к этому "свободному" предопределенному имени в пользовательском режиме.

Для нашей задачи – возможности привязки существующего элемента в режиме "1С:Предприятие" – разработчику необходимо задать свойство "Обновление предопределенных данных" в значение "Не обновлять автоматически". В противном случае, если свойство установлено в "Обновлять автоматически" и элемента с таким именем еще нет, система при обновлении создаст новый элемент, и нам нечего будет привязывать. Если же разработчик создал предопределенный элемент с именем, но не включил его автоматическое обновление, мы получаем возможность "занять" это имя существующим элементом.

Резюме и практические рекомендации

Давайте подведем итоги нашего анализа:

  1. Создать предопределенный элемент в режиме "1С:Предприятие" с нуля невозможно. Это задача для разработчика в "Конфигураторе".
  2. Мы можем привязать существующий обычный элемент к предопределенному имени, которое заранее создано в "Конфигураторе", или отвязать его.
  3. Для этого используется стандартный реквизит объекта ИмяПредопределенныхДанных.
  4. Манипуляции с этим реквизитом можно выполнять с помощью штатной обработки "Групповое изменение реквизитов" или посредством специализированных внешних обработок, разработанных программистом.
  5. Критически важно, чтобы разработчик при создании предопределенного элемента в "Конфигураторе" установил свойство справочника "Обновление предопределенных данных" в значение "Не обновлять автоматически", если предполагается ручная привязка в пользовательском режиме.

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

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

← На главную