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

Программист 1С v8.3 (Управляемые формы)
← К списку

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

Подход 1: Использование возможностей платформы 1С для работы с предопределенными элементами в расширениях

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

Важный момент: Мы должны понимать, что предопределенные элементы — это не просто записи в справочнике. Это фундаментальные "якоря" конфигурации, имеющие уникальные идентификаторы (GUID), которые не могут быть случайно удалены пользователями и автоматически восстанавливаются системой при необходимости. Бизнес-логика приложения часто опирается именно на эти элементы.

  1. Зависимость от версии платформы:

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

    • Начиная с версии 8.3.20, появилась возможность создавать предопределенные элементы для новых объектов (справочников, планов видов характеристик, планов счетов и планов видов расчета), которые мы создаем непосредственно в расширении. Это значительно упростило разработку для новых сущностей.

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

  2. Как это работает на практике (для версий 8.3.21 и выше):

    Если мы работаем с платформой 8.3.21 или новее, и нам нужно добавить предопределенный элемент в существующий справочник основной конфигурации, мы действуем следующим образом:

    1. Заимствуем справочник: Мы заимствуем необходимый справочник в наше расширение. Для этого в конфигураторе в расширении находим нужный справочник, выбираем его и добавляем в расширение.

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

    3. Добавляем предопределенный элемент: Теперь мы можем добавить новый предопределенный элемент непосредственно в справочник внутри расширения. Платформа позволит нам это сделать, и он будет корректно распознан как предопределенный.

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

Подход 2: Обходной путь для старых версий или специфических сценариев (ручное создание и программное присвоение имени)

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

Мы разберем по шагам, как реализовать этот подход:

  1. Добавляем элементы вручную:

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

  2. Заполняем реквизит ИмяПредопределенныхДанных:

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

    Мы можем сделать это несколькими способами:

    • Через групповую обработку: Если элементов много, мы можем воспользоваться стандартной групповой обработкой справочников и документов. В ней мы выбираем нужные элементы, находим реквизит ИмяПредопределенныхДанных и присваиваем ему уникальное строковое значение для каждого элемента (например, "МойПредопределенныйЭлемент1", "МойПредопределенныйЭлемент2").

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

      
      &НаСервере
      Процедура ЗаполнитьИменаПредопределенныхДанных()
          // Получаем ссылку на справочник, в котором хотим работать
          // Замените "Справочники.МойСправочник" на имя вашего справочника
          СправочникОбъект = Справочники.МойСправочник;
      
          // Получаем все элементы справочника (или отбираем нужные)
          Выборка = СправочникОбъект.Выбрать();
          Пока Выборка.Следующий() Цикл
              Объект = Выборка.ПолучитьОбъект();
      
              // Проверяем, если имя еще не заполнено или нужно обновить
              Если Объект.ИмяПредопределенныхДанных = "" Тогда
                  // Формируем уникальное имя. Можно использовать Код, Наименование или UUID.
                  // Для примера используем часть наименования
                  ИмяДляДанных = СокрЛП(Объект.Наименование);
                  // Убедимся, что имя уникально и соответствует требованиям (без пробелов, спецсимволов и т.д.)
                  ИмяДляДанных = СтрЗаменить(ИмяДляДанных, " ", ""); // Удаляем пробелы
                  ИмяДляДанных = СтрЗаменить(ИмяДляДанных, "-", ""); // Удаляем дефисы, если есть
      
                  Объект.ИмяПредопределенныхДанных = ИмяДляДанных;
                  Попытка
                      Объект.Записать();
                      Сообщить("Элемент " + Объект.Наименование + " получил имя: " + ИмяДляДанных);
                  Исключение
                      Сообщить("Ошибка записи элемента " + Объект.Наименование + ": " + ОписаниеОшибки());
                  КонецПопытки;
              КонецЕсли;
          КонецЦикла;
          Сообщить("Заполнение имен предопределенных данных завершено.");
      КонецПроцедуры
      

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

  3. Как обращаться к таким элементам программно:

    После заполнения реквизита ИмяПредопределенныхДанных, мы можем обращаться к этому элементу по его имени, используя синтаксис, аналогичный обращению к стандартным предопределенным элементам:

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

    Примечание: Метод ПолучитьСсылкуПоИмени() доступен для объектов, у которых есть предопределенные элементы или заполнен реквизит ИмяПредопределенныхДанных, начиная с определенных версий платформы. Для старых версий придется использовать НайтиПоНаименованию(), НайтиПоКоду() или запрос.

Обязательный шаг для применения любых изменений: Запуск обновления информационной базы

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

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

Как это сделать:

  1. Закрываем конфигуратор.

  2. Запускаем 1С:Предприятие через лаунчер (окно выбора баз).

  3. Выбираем нашу информационную базу и нажимаем кнопку "1С:Предприятие".

  4. В появившемся диалоговом окне (если оно появляется, в зависимости от настроек) система предложит обновить конфигурацию базы данных. Мы должны согласиться с обновлением.

В некоторых случаях, особенно при работе с расширениями или если обновление было отключено, может потребоваться явный запуск с параметром командной строки. Мы можем добавить ключ /C ЗапуститьОбновлениеИнформационнойБазы в параметры запуска информационной базы.

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

Диагностика и дополнительные аспекты

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

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

← К списку