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