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

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

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

Архитектура хранения дополнительных сведений

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

Ключевым понятием здесь является объект ПланыВидовХарактеристик. Именно он определяет структуру дополнительных реквизитов. Значения хранятся в разрезе этих планов, что позволяет создавать динамические структуры данных. При программной выборке вы фактически работаете с записями регистра, привязанными к конкретному объекту-владельцу.

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

Важно различать дополнительные реквизиты, которые могут влиять на состав данных (например, выбор вида номенклатуры), и простые текстовые или числовые поля. Для системы 1С это разные сущности с точки зрения индексации и доступа. Если вы планируете частую выборку по таким полям, убедитесь, что в настройках ДРС включено соответствующее индексирование.

💡

Для часто используемых дополнительных реквизитов включите опцию "Индексировать" в свойствах плана видов характеристик. Это ускорит формирование выборок и отчетов в разы.

Получение значения через объект ссылки

Самый простой и надежный способ получить значение дополнительного реквизита — использовать метод ПолучитьДополнительныеРеквизиты() объекта ссылки. Этот подход абстрагирует разработчика от внутренней структуры таблиц и гарантирует корректную работу при любых изменениях в конфигурации.

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

СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоНаименованию("Товар А");

Если СсылкаНаЭлемент.Пустая() Тогда

Возврат Неопределено;

КонецЕсли;

// Получаем структуру дополнительных реквизитов

ДопРеквизиты = СсылкаНаЭлемент.ПолучитьДополнительныеРеквизиты();

// Извлекаем конкретное значение

ЗначениеСтраны = ДопРеквизиты.СтранаПроизводитель;

Сообщить("Страна: " + ЗначениеСтраны);

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

💡

Использование метода ПолучитьДополнительныеРеквизиты() допустимо только для одиночных обращений. Внутри циклов этот метод категорически запрещен из-за проблемы N+1 запроса.

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

Оптимизированная выборка в циклах

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

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

  • 🚀 Используйте запросы с соединением по таблице дополнительных сведений для массовой выборки.
  • 📦 Загружайте данные в таблицу значений один раз перед началом цикла обработки.
  • ⚡ Применяйте индексы по полям отбора в плане видов характеристик.

Пример правильной организации кода для обработки списка номенклатуры:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| ДопРеквизитыНоменклатурыДополнительныеРеквизиты.Значение КАК Страна

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДопРеквизитыНоменклатурыДополнительныеРеквизиты КАК ДопРеквизитыНоменклатурыДополнительныеРеквизиты

| ПО Номенклатура.Ссылка = ДопРеквизитыНоменклатурыДополнительныеРеквизиты.Ссылка

| И ДопРеквизитыНоменклатурыДополнительныеРеквизиты.ПланВидовХарактеристик = &ПланВХ

| И ДопРеквизитыНоменклатурыДополнительныеРеквизиты.Свойство = &Свойство";

Запрос.УстановитьПараметр("ПланВХ", ПланыВидовХарактеристик.ДополнительныеРеквизитыНоменклатуры);

Запрос.УстановитьПараметр("Свойство", "СтранаПроизводитель");

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

// Обработка данных без дополнительных запросов

ОбработатьТовар(Выборка.Ссылка, Выборка.Страна);

КонецЦикла;

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

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

📊 Какой метод выборки вы используете чаще?
Объектный метод в цикле
Единый запрос
Консоль запросов
Не работаю с ДРС

Работа с произвольными типами данных

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

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

Тип значения Возможная ошибка Способ обработки
Строка Попытка математической операции Преобразование через Число()
Число Конкатенация со строкой Преобразование через Строка()
Ссылка Пустая ссылка Проверка Пустая()
Булево Некорректное приведение Явное сравнение с Истина

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

Что делать, если тип не определен?

Если вы не знаете заранее тип хранимых данных, используйте универсальный метод toString() или конвертацию в строку для логирования и отладки, прежде чем выполнять строгие операции.

Использование в отчетах и СКД

Для аналитиков и разработчиков отчетов доступ к дополнительным реквизитам часто требуется непосредственно в системе компоновки данных (СКД). В отличие от программного кода, здесь нельзя написать цикл с проверками, поэтому важно правильно настроить источники данных.

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

В настройках отчета вы можете найти дополнительные реквизиты в списке полей объекта, но они будут иметь специфические имена, часто содержащие префиксы плана видов характеристик. Для удобства пользователей рекомендуется переименовывать эти поля в настройках СКД, давая им понятные названия, соответствующие бизнес-смыслу.

  • 📊 Группируйте данные по дополнительным реквизитам для анализа срезов.
  • 🔍 Используйте отборы по ДРС для фильтрации результатов отчета.
  • 🛠 Настройте условное оформление на основе значений характеристик.

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

Типичные ошибки и способы их устранения

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

Самая распространенная ошибка — попытка записать значение в дополнительный реквизит через свойство объекта ссылки без проверки прав доступа или без предварительной загрузки объекта в режиме записи. Для записи изменений необходимо использовать метод ЗаписатьДополнительныеРеквизиты(), передавая в него обновленную структуру.

⚠️ Внимание: Интерфейс и названия методов могут незначительно отличаться в разных версиях платформы 1С. Если вы работаете с устаревшей конфигурацией, сверьте синтаксис в синтаксис-помощнике вашей версии.

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

☑️ Диагностика проблем с ДРС

Выполнено: 0 / 4

FAQ: Часто задаваемые вопросы

Как получить список всех дополнительных реквизитов для объекта?

Для этого можно использовать метод ПолучитьМетаданные() у объекта менеджера или проанализировать план видов характеристик, связанный с данным справочником. Также можно выполнить запрос к таблице регистра сведений, сгруппировав данные по полю "Свойство".

Можно ли использовать дополнительные реквизиты в условиях отбора запроса?

Да, это стандартная практика. В тексте запроса необходимо добавить условие соединения с таблицей регистра сведений и указать нужное значение в поле Значение или Свойство в секции ГДЕ.

Почему значение дополнительного реквизита не сохраняется?

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

Влияют ли дополнительные реквизиты на скорость проведения документов?

Сами по себе они не влияют, если не используются в сложных вычислениях при проведении. Однако, если в документе есть цикл, перебирающий ДРС связанных объектов без оптимизации, это может существенно замедлить процесс проведения.