Как добавить или использовать предопределенные элементы справочника в расширении 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

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

Выясняем причину ограничения: версии платформы и режим совместимости

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

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

  1. Режим совместимости: Если в вашей конфигурации (например, в старых релизах "1С:Комплексная автоматизация" или "1С:ERP") установлен режим совместимости ниже 8.3.20, то даже при использовании самой современной платформы (8.3.24 или 8.3.25) функционал будет заблокирован.
  2. Собственный объект vs Заимствованный: Важно понимать фундаментальное ограничение — платформа позволяет создавать предопределенные элементы только в тех объектах метаданных, которые были полностью созданы внутри расширения. Если вы заимствовали справочник из основной конфигурации в расширение, добавить в него новые предопределенные элементы через визуальный редактор расширения невозможно. Это сделано для предотвращения критических конфликтов метаданных при обновлении конфигурации.

Вариант решения №1: Создание объекта в основной конфигурации

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

Рассмотрим последовательность действий:

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

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

Вариант решения №2: Программное создание "псевдопредопределенных" элементов

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

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


Функция ПолучитьПредопределенныйЭлемент(ИмяЭлемента) Экспорт
    
    // Пытаемся найти элемент по коду или наименованию, которое мы считаем уникальным
    СсылкаНаЭлемент = Справочники.МойСправочник.НайтиПоНаименованию(ИмяЭлемента);
    
    Если СсылкаНаЭлемент.Пустая() Тогда
        // Если элемент не найден, создаем его программно
        НовыйОбъект = Справочники.МойСправочник.СоздатьЭлемент();
        НовыйОбъект.Наименование = ИмяЭлемента;
        // Заполняем другие важные реквизиты
        НовыйОбъект.Записать();
        СсылкаНаЭлемент = НовыйОбъект.Ссылка;
    КонецЕсли;
    
    Возврат СсылкаНаЭлемент;

КонецФункции

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

Использование предопределенных элементов в запросах расширения

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

Посмотрим на пример запроса внутри расширения:


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Количество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПродаж.Завершена)
    И Продажи.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ОсновнойСклад)

Где ОсновнойСклад — это имя предопределенного элемента, созданного в основной конфигурации. Это будет работать корректно, так как расширение дополняет, а не заменяет пространство имен предопределенных данных.

Особенности работы с UUID и уникальностью

При работе с предопределенными элементами, созданными внутри расширения (когда платформа это позволяет), важно учитывать механизм идентификаторов (UUID). Проанализируем важные моменты:

Резюме и рекомендации

Выяснив все технические детали, мы можем сформулировать следующие правила для разработчика:

  1. Проверьте совместимость: Для работы с предопределенными в справочниках расширения нужен режим 8.3.20+.
  2. Определите принадлежность объекта: Добавить предопределенный элемент в заимствованный справочник (из основной конфигурации) нельзя ни в одной версии платформы.
  3. Выбирайте метод:
    • Если нужно расширить типовой справочник — делайте это в основной конфигурации.
    • Если нужен абсолютно новый справочник с предопределенными данными в расширении — убедитесь в актуальности режима совместимости.
    • Если нельзя менять основную конфигурацию и режим совместимости низкий — используйте программный поиск и создание элементов при старте системы или вызове функции.

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

← На главную