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