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