При работе с типовыми конфигурациями 1С часто возникает задача добавить новые предопределенные элементы в существующие справочники. Однако, когда конфигурация находится «на замке» (закрыта для изменений), стандартный механизм создания предопределенных данных становится недоступным. Давайте разберем, почему это происходит и какими способами можно реализовать требуемую логику, не снимая конфигурацию с поддержки.
Предопределенные элементы справочников — это не просто записи в базе данных. Они жестко привязаны к метаданным конфигурации. Платформа 1С:Предприятие при компиляции конфигурации создает специальные связи, которые позволяют обращаться к элементам через имя, например, Справочники.Валюты.ДолларСША. Расширения конфигурации созданы для дополнения функционала, но они не могут менять структуру метаданных основной конфигурации. Поскольку предопределенные элементы являются частью этой структуры, их добавление в существующий объект «на замке» технически невозможно.
Это самый радикальный метод, который часто называют «уронить шкаф». Вы можете снять конфигурацию с поддержки, добавить необходимые элементы и вернуть ее обратно. Однако мы крайне не рекомендуем этот путь, так как он создает огромные сложности при обновлении конфигурации в будущем. Конфликты при сравнении и объединении версий могут привести к потере данных или нарушению работоспособности системы.
Если ваша цель — жестко ограничить выбор пользователя фиксированным списком значений, рассмотрите использование объекта Перечисления. Вы можете создать новое перечисление в расширении. Логика работы программы перестраивается таким образом, чтобы вместо поиска предопределенного элемента справочника, система обращалась к значениям перечисления.
Часто предопределенные элементы нужны для служебной логики или хранения идентификаторов настроек. В этом случае эффективно использовать непериодический РегистрСведений, добавленный через расширение. При первом запуске системы или обновлении информационной базы можно программно проверять наличие необходимых записей в этом регистре:
Процедура ПриНачалеРаботыСистемы()
Если Не ЗначениеЗаполнено(РегистрыСведений.МоиНастройки.ПолучитьПоследнююЗапись()) Тогда
// Создаем записи программно
НоваяЗапись = РегистрыСведений.МоиНастройки.СоздатьМенеджерЗаписи();
НоваяЗапись.Ключ = \"ОсновнойЭлемент\";
НоваяЗапись.Значение = Справочники.Контрагенты.НайтиПоКоду(\"000000001\");
НоваяЗапись.Записать();
КонецЕсли;
КонецПроцедуры
Если вам нужно «зафиксировать» конкретный объект справочника, вы можете создать Константу в расширении. В значении константы можно хранить УникальныйИдентификатор (GUID) или Код нужного элемента справочника. При обращении к логике, требующей предопределенного значения, используйте значение константы:
// Получение элемента по значению константы
Идентификатор = Константы.ОсновнойСклад.Получить();
Склад = Справочники.Склады.ПолучитьСсылку(Идентификатор);
Если задача требует хранения целых наборов данных, создайте отдельный справочник в расширении. Чтобы интегрировать его в интерфейс основной конфигурации, используйте механизм расширения форм. Вы можете программно добавить кнопки или команды в формы существующих объектов, которые будут открывать ваш справочник настроек или выполнять действия с ним.
Рассмотренные способы позволяют «малой кровью» достичь нужного результата, сохраняя конфигурацию на поддержке и обеспечивая стабильность обновлений. Выбирайте тот подход, который наиболее полно соответствует задаче автоматизации, стараясь минимизировать изменения в структуре метаданных.