Почему предопределенные элементы справочника перестали работать в расширении 1С после обновления платформы?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой
← На главную

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

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

Анализируем проблему: ошибка доступа к предопределенному элементу

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


| И КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресДоставкиКонтрагета)

Аналогично, не работало и прямое обращение к предопределенному элементу в коде:


Запрос.УстановитьПараметр("АдресДоставкиВид", Справочники.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента);

Единственным рабочим способом обращения к элементу оказался поиск по наименованию:


Запрос.УстановитьПараметр("АдресДоставкиВид", Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Доставка"));

При этом после заимствования (добавления) справочника в расширение, прямой вызов Справочники.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента начал работать, но обращение через функцию ЗНАЧЕНИЕ() в запросе по-прежнему вызывало ошибку. Возникала ошибка:


по причине:
{(7, 51)}: Неверные параметры "Справочник.ВидыКонтактнойИнформации.АдресДоставкиКонтрагета"
И КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(<<?>>Справочник.ВидыКонтактнойИнформации.АдресДоставкиКонтрагета)

Выясняем причину: изменение имени предопределенного элемента

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

В нашем случае, в конфигурации 1С:Управление нашей фирмой (УНФ) версии 1.6.22.75 реквизит назывался АдресДоставкиКонтрагета (без буквы "н"). В новой версии конфигурации это имя было исправлено поставщиком на АдресДоставкиКонтрагента. Соответственно, старый код, написанный под прежнюю версию конфигурации, стал невалидным, так как ссылался на несуществующий предопределенный элемент.

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

Исправляем проблему: актуализируем имена предопределенных элементов

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

  1. Исправляем имя в запросе: Мы должны изменить некорректное имя АдресДоставкиКонтрагета на правильное АдресДоставкиКонтрагента в конструкции ЗНАЧЕНИЕ().
  2. Вот как будет выглядеть исправленный запрос:

    
    | И КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента)
    

    Функция ЗНАЧЕНИЕ() в запросах очень строго проверяет существование указанного пути и имени. Даже малейшая опечатка, как в нашем случае, приведет к ошибке "Неверные параметры".

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

    
    Запрос.УстановитьПараметр("АдресДоставкиВид", Справочники.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента);
    

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

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

Дополнительная информация по работе с предопределенными элементами в расширениях

Рассмотрим подробнее аспекты работы с предопределенными элементами и расширениями, чтобы предотвратить подобные ситуации в будущем и лучше понимать их поведение.

Изменение имен предопределенных элементов в базовой конфигурации

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

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

Работа с предопределенными элементами в расширениях

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

  1. Невозможность добавления новых предопределенных элементов к существующим объектам: В расширениях конфигурации нельзя добавить новый предопределенный элемент, который уже существует в основной конфигурации, или добавить новый предопределенный элемент к *незаимствованному* объекту основной конфигурации. Предопределенные элементы определяются на уровне конфигурации, и расширения не могут изменять их свойства или добавлять новые предопределенные элементы к уже существующим объектам основной конфигурации, если эти объекты не заимствованы.
  2. Создание предопределенных элементов для заимствованных объектов (начиная с 8.3.21): Начиная с платформы 8.3.21, в расширениях появилась возможность создавать предопределенные элементы для заимствованных объектов. Это значительное улучшение, которое упрощает работу и позволяет не переходить в основную конфигурацию для их создания. Если вам нужен новый предопределенный элемент для справочника, который вы уже заимствовали, вы можете создать его прямо в расширении.
  3. Заимствование и перенос свойств: При заимствовании справочника в расширение, автоматически переносятся основные свойства предопределенного элемента: имя, код и наименование. Это позволяет расширению "знать" о существовании и свойствах этих элементов.
  4. Управление контролируемостью: Если предопределенный элемент заимствован в расширение, можно управлять его контролируемостью. Это означает, что вы можете установить признак проверки значения у свойства "Предопределенные" при подключении расширения. Если свойства предопределенного элемента в основной конфигурации изменяются (например, наименование), а в расширении этот предопределенный элемент заимствован и свойство "Предопределенные" установлено как контролируемое, то при обновлении конфигурации расширение может не примениться, и будет выдана ошибка, указывающая на несоответствие.
  5. Надежность обращения по имени: Обращение к предопределенным элементам по имени (например, Справочники.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента) считается самым надежным способом. В отличие от поиска по коду или наименованию, имя предопределенного элемента невозможно изменить пользователем в режиме 1С:Предприятие. Наименование же может быть изменено, что сделает поиск по наименованию ненадежным. Код также может быть изменен, если он не генерируется автоматически и не контролируется системой.

Особенности функции ЗНАЧЕНИЕ в запросах

Функция ЗНАЧЕНИЕ() является мощным инструментом в запросах 1С, предназначенным для обращения к предопределенным данным конфигурации. Разберем ее особенности:

  1. Назначение: ЗНАЧЕНИЕ() используется в запросах для получения ссылок на предопределенные данные, которые являются частью метаданных конфигурации. К таким данным относятся:
    • Значения перечислений (например, ЗНАЧЕНИЕ(Перечисление.ВидыОпераций.ПоступлениеТоваров))
    • Предопределенные элементы справочников (как в нашем случае)
    • Предопределенные элементы планов видов характеристик, планов счетов, планов видов расчетов
    • Пустые ссылки (например, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
    • Значения точек маршрута бизнес-процессов
  2. Синтаксис: Для предопределенных данных конфигурации представление значения в функции ЗНАЧЕНИЕ() имеет строгий вид: <ТипПредопределенногоЗначения>.<ИмяОбъектаМетаданных>.<ИмяПредопределенногоЭлемента>. Например, Справочник.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента.
  3. Строгая проверка: Как мы видели в нашем случае, функция ЗНАЧЕНИЕ() в запросе выполняет очень строгую проверку существования указанного пути и имени предопределенного элемента. Если в имени есть хоть малейшая опечатка, или если элемент с таким именем больше не существует в метаданных (например, после обновления и изменения имени), запрос завершится ошибкой. Это отличает ее от, например, НайтиПоНаименованию() в коде, который может вернуть Неопределено или пустую ссылку, если элемент не найден, что может быть обработано программно без критической ошибки выполнения запроса.

Режим совместимости расширения

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

  1. Управление возможностями: Если расширение использует возможности, несовместимые с установленным режимом совместимости, сохранение конфигурации информационной базы будет невозможно, и будет выдано диагностическое сообщение. Например, если расширение написано с использованием функций, появившихся в версии 8.3.16, но его режим совместимости установлен на 8.3.14, оно не сможет быть применено.
  2. Взаимосвязь с основной конфигурацией: Режим совместимости расширения не может быть выше аналогичного значения параметра основной конфигурации. Если режим совместимости расширения выше, чем у конфигурации, расширение не будет работать и выдаст ошибку. Это логично, поскольку расширение не может требовать от платформы большей функциональности, чем та, которую предоставляет базовая конфигурация.
  3. При обновлении: При обновлении платформы и изменении режима совместимости расширения (как в исходной теме с 8.3.14 на 8.3.16), всегда необходимо убедиться, что новый режим совместимости расширения соответствует или ниже режима совместимости основной конфигурации. Нередко проблемы с применением расширений или их некорректной работой после обновления связаны именно с несоответствием этих режимов.

Обработка ошибок и обновление данных

Помимо рассмотренных ситуаций, существуют и другие возможные проблемы с предопределенными элементами и их обновление:

  1. Ошибка "Предопределенный элемент отсутствует в данных": Эта ошибка может возникнуть, если предопределенный элемент, определенный в конфигурации, по какой-то причине отсутствует в данных информационной базы. Причины могут быть различными:
    • Некорректное обновление конфигурации, когда предопределенные данные не были синхронизированы.
    • Нарушение целостности базы данных.
    • Неправильная работа с распределенными базами данных (РИБ), когда изменения в предопределенных элементах не были корректно перенесены между узлами.
    • Ручное удаление предопределенных элементов (что категорически не рекомендуется).
    Для исправления рекомендуется проверить и восстановить предопределенные элементы с помощью штатных средств 1С (например, через "Тестирование и исправление" или обновление конфигурации базы данных), повторно обновить конфигурацию, протестировать и исправить базу данных или восстановиться из резервной копии.
  2. Обновление предопределенных данных в информационной базе: Обновление предопределенных данных в информационной базе происходит автоматически в определенных условиях. Система анализирует:
    • Значения, установленные для объекта в данных (в базе).
    • Значения для объекта метаданных в конфигураторе.
    • Общие настройки для информационной базы (разрешено ли автоматическое обновление).
    • Вид информационной базы (центральная или периферийная в РИБ).
    Если разрешено автоматическое обновление и предопределенные данные были изменены в конфигураторе, система попытается синхронизировать их в данных. Однако это не касается изменений *имен* предопределенных элементов, которые требуют ручной коррекции кода.

Заключение

Мы выяснили, что причиной "неработающей" конструкции ЗНАЧЕНИЕ() в запросе и прямого обращения к предопределенному элементу после обновления платформы и режима совместимости было изменение имени предопределенного элемента в базовой конфигурации. Это наглядно демонстрирует, как даже незначительная на первый взгляд правка со стороны поставщика конфигурации может привести к необходимости внесения изменений в расширения и доработанный код.

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

← На главную