При работе с системой 1С:ERP часто возникает вопрос о гибкости настройки элементов справочников. В частности, пользователей интересует, можем ли мы сделать обычный элемент справочника предопределенным непосредственно в режиме "1С:Предприятие", то есть без необходимости заходить в "Конфигуратор" и вносить изменения в структуру базы данных. Давайте подробно разберем эту ситуацию и выясним, какие механизмы доступны в системе.
Мы выясним, что создание нового, ранее не существовавшего предопределенного элемента непосредственно в пользовательском режиме невозможно. Это функция разработчика, которая выполняется в "Конфигураторе", используя анализ структуры метаданных. Однако, существуют механизмы, которые позволяют нам привязать уже существующий обычный элемент к предопределенному имени или, наоборот, отвязать его. Именно этот аспект часто путает пользователей и вызывает вопросы.
Прежде чем углубляться в детали, рассмотрим, что такое предопределенные элементы в контексте платформы 1С. Предопределенные элементы – это особые записи в справочниках (или других объектах метаданных, таких как планы счетов, виды характеристик), которые жестко заданы в конфигурации разработчиком. Они имеют уникальное системное имя и предназначены для следующих целей:
Справочники.Валюты.НайтиПоНаименованию("Рубль"), но гораздо надежнее и правильнее использовать Справочники.Валюты.Рубль, если "Рубль" – это предопределенный элемент.Создание таких элементов – это часть проектирования конфигурации, и оно выполняется разработчиком в режиме "Конфигуратор".
Как мы уже выяснили, создать новый предопределенный элемент справочника с нуля, если его не было в конфигурации, в режиме "1С:Предприятие" невозможно. Эта операция требует изменения структуры метаданных, что является прерогативой разработчика. Процесс создания предопределенного элемента в "Конфигураторе" выглядит следующим образом:
После этого система "знает" о существовании такого предопределенного имени. При первом запуске или обновлении, если элемента с таким именем еще нет в базе, он будет создан автоматически.
Несмотря на невозможность создания, в пользовательском режиме мы можем выполнять другую очень важную операцию: привязать уже существующий обычный элемент справочника к предопределенному имени, которое было заранее создано разработчиком в "Конфигураторе". Или, наоборот, отвязать предопределенный элемент, сделав его обычным.
Этот механизм основан на использовании стандартного реквизита объекта, который называется ИмяПредопределенныхДанных (ранее мог называться ИмяПредопределенного или похожим образом). Этот реквизит присутствует у тех объектов метаданных (справочники, планы счетов), которые поддерживают механизм предопределенных данных.
ИмяПредопределенныхДанныхРеквизит ИмяПредопределенныхДанных хранит строковое значение – то самое уникальное системное имя предопределенного элемента, которое было задано разработчиком в "Конфигураторе".
ИмяПредопределенныхДанных пуст, то элемент считается обычным, пользовательским.Для изменения значения реквизита ИмяПредопределенныхДанных в режиме "1С:Предприятие" мы можем использовать следующие штатные средства платформы, а также специализированные обработки:
Это мощный штатный инструмент платформы 1С, который позволяет нам изменять значения реквизитов у множества объектов одновременно. Он идеально подходит для нашей задачи.
В большинстве типовых конфигураций (таких как 1С:ERP) обработка "Групповое изменение реквизитов" доступна через меню "Все функции" (или "Сервис и настройки" -> "Функции для технического специалиста" в более новых версиях управляемых форм) или через раздел "Администрирование" -> "Обслуживание" -> "Корректировка данных" -> "Групповое изменение реквизитов".
В открывшемся окне обработки мы увидим поле "Изменять". Здесь нам необходимо выбрать тип объекта, который мы хотим изменить, например, "Справочники: Номенклатура" или "Справочники: Организации". Выберите соответствующий справочник, элементы которого мы планируем сделать предопределенными.
Если мы хотим изменить реквизит не у всех элементов справочника, а только у определенных, мы можем использовать кнопку "Добавить условия отбора". Здесь мы можем задать фильтры, например, по наименованию, коду, группе или другим реквизитам, чтобы выбрать нужные элементы.
После выбора объектов и, возможно, задания отбора, перейдите к нижней части окна, где перечислены реквизиты объекта. Нам нужен стандартный реквизит ИмяПредопределенныхДанных. Он может быть не сразу виден, так как относится к служебным реквизитам. Чтобы его отобразить, мы можем нажать на кнопку "Дополнительные параметры" или "Показать все реквизиты" (точное название кнопки может отличаться в разных версиях платформы).
Найдите в списке реквизит ИмяПредопределенныхДанных (или ИмяПредопределенного, если это более старая конфигурация или специфический объект). Поставьте флажок напротив этого реквизита, используя Редактор объектов информационной базы 8.3.
Рядом с выбранным реквизитом ИмяПредопределенныхДанных появится поле для ввода значения. Здесь мы должны ввести точное системное имя предопределенного элемента, которое было задано разработчиком в "Конфигураторе". Например, если разработчик создал предопределенный элемент с именем "ОсновнаяОрганизация", мы вводим это имя.
Важно: Имя должно быть введено строго в соответствии с регистром и без ошибок, так как система будет искать предопределенный элемент по этому имени.
Нажмите кнопку "Изменить реквизиты". Система предложит подтвердить операцию. После подтверждения, выбранные элементы справочника получат указанное значение в реквизите ИмяПредопределенныхДанных, и, таким образом, станут привязаны к соответствующему предопределенному имени.
Если нам требуется выполнять такую операцию часто или для пользователей, не обладающих правами на использование "Группового изменения реквизитов", разработчик может создать простую внешнюю обработку. Такая обработка будет содержать минимальный код для выполнения этой задачи. Например, она может предложить пользователю выбрать элемент справочника и ввести имя предопределенного элемента, к которому нужно привязать выбранный элемент.
Вот пример очень простого кода, который может быть использован в такой обработке (предполагая, что у нас есть ссылка на элемент справочника ЭлементСправочника и строка ИмяПредопределенного):
// Предположим, что ЭлементСправочника - это уже выбранный элемент справочника,
// а ИмяПредопределенного - это строка, введенная пользователем.
Если ТипЗнч(ЭлементСправочника) = Тип("СправочникСсылка.Номенклатура") Тогда
ОбъектНоменклатуры = ЭлементСправочника.ПолучитьОбъект();
ОбъектНоменклатуры.ИмяПредопределенныхДанных = ИмяПредопределенного;
Попытка
ОбъектНоменклатуры.Записать();
Сообщить("Элемент '" + ЭлементСправочника.Наименование + "' успешно привязан к предопределенному имени '" + ИмяПредопределенного + "'.");
Исключение
Сообщить("Ошибка при записи элемента: " + ОписаниеОшибки());
КонецПопытки;
ИначеЕсли ТипЗнч(ЭлементСправочника) = Тип("СправочникСсылка.Организации") Тогда
ОбъектОрганизации = ЭлементСправочника.ПолучитьОбъект();
ОбъектОрганизации.ИмяПредопределенныхДанных = ИмяПредопределенного;
Попытка
ОбъектОрганизации.Записать();
Сообщить("Элемент '" + ЭлементСправочника.Наименование + "' успешно привязан к предопределенному имени '" + ИмяПредопределенного + "'.");
Исключение
Сообщить("Ошибка при записи элемента: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
// Для отвязки элемента, то есть чтобы сделать его обычным:
// ОбъектНоменклатуры.ИмяПредопределенныхДанных = "";
// ОбъектНоменклатуры.Записать();
Такая обработка может быть снабжена пользовательским интерфейсом для выбора элементов и ввода имени, что делает процесс более удобным и безопасным для конечного пользователя, не требуя глубоких знаний о механизмах платформы.
Чтобы описанный выше механизм привязки элементов в пользовательском режиме работал корректно, разработчик должен не только создать имя предопределенного элемента в "Конфигураторе", но и правильно настроить свойство объекта конфигурации "Обновление предопределенных данных" для соответствующего справочника.
Это свойство находится на вкладке "Прочие" или "Дополнительно" в свойствах самого справочника в "Конфигураторе". Оно может принимать следующие значения:
Для нашей задачи – возможности привязки существующего элемента в режиме "1С:Предприятие" – разработчику необходимо задать свойство "Обновление предопределенных данных" в значение "Не обновлять автоматически". В противном случае, если свойство установлено в "Обновлять автоматически" и элемента с таким именем еще нет, система при обновлении создаст новый элемент, и нам нечего будет привязывать. Если же разработчик создал предопределенный элемент с именем, но не включил его автоматическое обновление, мы получаем возможность "занять" это имя существующим элементом.
Давайте подведем итоги нашего анализа:
ИмяПредопределенныхДанных.Таким образом, хотя прямое "превращение" обычного элемента в предопределенный в пользовательском режиме невозможно, мы имеем мощный и гибкий механизм для управления привязками к предопределенным именам, что позволяет нам адаптировать систему под специфические требования без постоянного вмешательства разработчика в конфигурацию.
Всегда помните о важности сохранения целостности данных и действуйте осторожно при изменении системных реквизитов, особенно тех, что связаны с предопределенными данными. Перед любыми массовыми изменениями всегда рекомендуется делать резервные копии базы данных.