В современной разработке на платформе 1С:Предприятие 8.3 расширения конфигурации стали основным инструментом кастомизации типовых решений. Одной из наиболее частых задач является добавление нового реквизита в существующий документ и последующее извлечение данных из этого реквизита с помощью внешних обработок или отчетов. Разберем детально, как реализовать этот механизм, и проанализируем технические нюансы, которые могут возникнуть в процессе.
Для начала создадим новое расширение в информационной базе. Важно помнить, что расширение должно иметь возможность изменять структуру данных. Проанализируем настройки свойств расширения: убедимся, что флаг «Используется только для изменения отображения» снят. Если этот флаг будет установлен, система не позволит добавлять новые поля в таблицы базы данных, и реквизит будет существовать только на уровне интерфейса.
После создания расширения выполним следующие действия:
РеализацияТоваровУслуг).ДопИнфо_Префикс_ID).Рассмотрим вопрос именования. Хорошей практикой считается использование уникальных префиксов для всех объектов и реквизитов расширения. Это защитит ваш код от конфликтов имен при будущих обновлениях типовой конфигурации от вендора.
Выясним причину, почему в некоторых случаях реквизиты расширения могут быть недоступны. Ключевым фактором является версия платформы и установленный режим совместимости. Для полноценной работы с данными в расширениях (включая добавление собственных реквизитов в таблицы) режим совместимости основной конфигурации должен быть не ниже 8.3.11. Начиная с версии 8.3.17, которая упоминается в теме, механизмы работы с расширениями стали максимально стабильными, и данные расширений физически интегрируются в структуру СУБД.
Часто программисты сталкиваются с тем, что Конструктор запросов в конфигураторе «не видит» добавленный в расширение реквизит, если работа ведется над внешней обработкой. Это происходит из-за разделения контекстов метаданных. В режиме конфигуратора внешняя обработка «видит» только объекты основной конфигурации.
Чтобы обойти это ограничение, рассмотрим два способа:
Разберем ситуацию, когда нам нужно получить данные во внешней обработке. Наиболее безопасным методом является использование объекта Запрос. Посмотрим на пример кода, который позволит нам извлечь значение добавленного реквизита:
ТекстЗапроса = "
|ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.ДопИнфо_Префикс_ID КАК ДополнительныйИдентификатор
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Проведен = ИСТИНА";
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка данных
Сообщить("Документ: " + Выборка.Ссылка + " Значение: " + Выборка.ДополнительныйИдентификатор);
КонецЦикла;
Использование запроса предпочтительнее прямого обращения через точку (например, Объект.НовыйРеквизит), так как запрос компилируется в момент выполнения (Runtime). Это гарантирует, что если расширение подключено, данные будут получены без ошибок компиляции кода в конфигураторе.
Если ваша внешняя обработка будет использоваться в разных базах (где расширение может быть не установлено), проанализируем ситуацию возникновения ошибки «Поле не найдено». Чтобы избежать аварийного завершения работы программы, рекомендуется добавить программную проверку наличия реквизита перед выполнением запроса. Разберем, как это сделать:
Функция ЕстьРеквизитВМетаданных(ИмяОбъекта, ИмяРеквизита)
МетаОбъект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если МетаОбъект <> Неопределено Тогда
Если МетаОбъект.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Пример использования:
Если ЕстьРеквизитВМетаданных("Документ.РеализацияТоваровУслуг", "ДопИнфо_Префикс_ID") Тогда
// Выполняем запрос с этим реквизитом
Иначе
// Выполняем альтернативный код или выводим предупреждение
КонецЕсли;
Проанализируем архитектурную особенность расширений. В версии 8.3.17 данные реквизитов расширений хранятся в отдельных таблицах (или дополнительных колонках), которые жестко привязаны к конкретному расширению. Помните: если вы удалите расширение из информационной базы, все данные, накопленные в его реквизитах, будут физически удалены из СУБД без возможности восстановления стандартными средствами 1С. Поэтому перед любыми манипуляциями с составом расширений обязательно создавайте резервную копию базы данных.
Также стоит учитывать кэширование метаданных. В некоторых случаях после добавления реквизита он может не сразу появиться в списке доступных полей в пользовательском сеансе. В такой ситуации рекомендуется перезапустить сеанс или выполнить очистку кэша на стороне сервера/клиента.
Таким образом, мы выяснили, что добавление и использование реквизитов из расширений — это мощный и легитимный механизм платформы 1С, требующий лишь внимательного отношения к контексту выполнения запросов и режиму совместимости базы данных.