Как добавить реквизит через расширение и прочитать его в запросе внешней обработки

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

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

Шаг 1. Создание расширения и добавление реквизита

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

После создания расширения выполним следующие действия:

  1. Найдем в дереве объектов основной конфигурации нужный документ (например, РеализацияТоваровУслуг).
  2. Нажмем правой кнопкой мыши и выберем пункт «Добавить в расширение».
  3. В самом расширении перейдем к объекту и добавим новый реквизит (например, ДопИнфо_Префикс_ID).
  4. Установим нужный тип данных (Строка, Число, Ссылка и т.д.).

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

Шаг 2. Настройка режима совместимости

Выясним причину, почему в некоторых случаях реквизиты расширения могут быть недоступны. Ключевым фактором является версия платформы и установленный режим совместимости. Для полноценной работы с данными в расширениях (включая добавление собственных реквизитов в таблицы) режим совместимости основной конфигурации должен быть не ниже 8.3.11. Начиная с версии 8.3.17, которая упоминается в теме, механизмы работы с расширениями стали максимально стабильными, и данные расширений физически интегрируются в структуру СУБД.

Шаг 3. Использование конструктора запросов и консоли запросов

Часто программисты сталкиваются с тем, что Конструктор запросов в конфигураторе «не видит» добавленный в расширение реквизит, если работа ведется над внешней обработкой. Это происходит из-за разделения контекстов метаданных. В режиме конфигуратора внешняя обработка «видит» только объекты основной конфигурации.

Чтобы обойти это ограничение, рассмотрим два способа:

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

Шаг 4. Программное обращение к данным из внешней обработки

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


ТекстЗапроса = "
|ВЫБРАТЬ
|    Док.Ссылка КАК Ссылка,
|    Док.ДопИнфо_Префикс_ID КАК ДополнительныйИдентификатор
|ИЗ
|    Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
|    Док.Проведен = ИСТИНА";

Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Обработка данных
    Сообщить("Документ: " + Выборка.Ссылка + " Значение: " + Выборка.ДополнительныйИдентификатор);
КонецЦикла;

Использование запроса предпочтительнее прямого обращения через точку (например, Объект.НовыйРеквизит), так как запрос компилируется в момент выполнения (Runtime). Это гарантирует, что если расширение подключено, данные будут получены без ошибок компиляции кода в конфигураторе.

Шаг 5. Проверка наличия реквизита в метаданных

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


Функция ЕстьРеквизитВМетаданных(ИмяОбъекта, ИмяРеквизита)
    МетаОбъект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
    Если МетаОбъект <> Неопределено Тогда
        Если МетаОбъект.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЕсли;
    Возврат Ложь;
КонецФункции

// Пример использования:
Если ЕстьРеквизитВМетаданных("Документ.РеализацияТоваровУслуг", "ДопИнфо_Префикс_ID") Тогда
    // Выполняем запрос с этим реквизитом
Иначе
    // Выполняем альтернативный код или выводим предупреждение
КонецЕсли;

Важные рекомендации по хранению данных

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

Также стоит учитывать кэширование метаданных. В некоторых случаях после добавления реквизита он может не сразу появиться в списке доступных полей в пользовательском сеансе. В такой ситуации рекомендуется перезапустить сеанс или выполнить очистку кэша на стороне сервера/клиента.

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

← На главную