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