Разработка и Конфигурация · 11 мин
СтрокаТЧ в 1С: что это и как работать со строкой табличной части
СтрокаТЧ в 1С — это объект строки табличной части документа или справочника. Разбираем обход строк, поиск, изменение и типичные ошибки с примерами кода.
СтрокаТЧ — это сокращение от «строка табличной части», которое разработчики 1С используют в именах переменных и процедур. Под ним понимается объект, представляющий одну строку табличной части документа, справочника или другого объекта конфигурации. Через этот объект код читает и изменяет значения реквизитов конкретной строки: номенклатуру, количество, цену, сумму и любые другие колонки.
Табличная часть в 1С — это коллекция строк, поэтому почти любая обработка документов сводится к перебору этих строк в цикле, поиску нужной строки по условию или добавлению новых. Типичный пример — переменная СтрокаТЧ внутри цикла Для Каждого СтрокаТЧ Из Документ.Товары Цикл, где на каждой итерации переменная содержит очередную строку со всеми её реквизитами.
Понимание того, как устроен объект строки табличной части, критично для любых доработок: заполнение цен, пересчёт сумм, проверка заполнения, выгрузка данных. Ошибки при работе со строками — одна из самых частых причин неверных итогов в документах и падения обработок с сообщением «Поле объекта не обнаружено».
Что такое табличная часть и её строка
Табличная часть — это подчинённая коллекция данных внутри объекта конфигурации. У документа «Реализация товаров и услуг» это таблицы «Товары» и «Услуги», у справочника «Номенклатура» — например, табличная часть со штрихкодами или единицами измерения. Каждая табличная часть имеет набор реквизитов — колонок, которые определяются в конфигураторе.
Строка табличной части — это один элемент такой коллекции. Встроенный язык 1С представляет её объектом со свойствами, совпадающими по именам с реквизитами табличной части. Если в табличной части «Товары» есть реквизиты «Номенклатура», «Количество» и «Цена», то у объекта строки доступны СтрокаТЧ.Номенклатура, СтрокаТЧ.Количество и СтрокаТЧ.Цена.
У строки также есть служебные свойства. Наиболее используемое — НомерСтроки, которое возвращает порядковый номер строки в табличной части, начиная с единицы. Это свойство удобно для сообщений пользователю: «В строке 3 не заполнено количество» воспринимается лучше, чем абстрактная ошибка без привязки.
Как обойти строки табличной части в цикле
Базовый приём — цикл Для Каждого. Он последовательно помещает в переменную каждую строку коллекции, и внутри тела цикла можно читать и менять её реквизиты:
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецЦикла;
Важная особенность: переменная цикла содержит саму строку, а не её копию. Все присваивания внутри цикла сразу изменяют данные объекта. Это удобно для пересчётов, но опасно, если изменения делаются по ошибочному условию — откатить их внутри цикла нельзя, нужно переоткрывать объект или отменять транзакцию.
Если нужен порядковый номер итерации, используют либо свойство СтрокаТЧ.НомерСтроки, либо классический цикл со счётчиком через индекс: Объект.Товары[Индекс]. Индексация коллекции начинается с нуля, а НомерСтроки — с единицы; путаница между ними — частый источник смещения на одну позицию.
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
Сообщить("В строке " + СтрокаТЧ.НомерСтроки + " не указана номенклатура");
КонецЕсли;
КонецЦикла;Поиск и отбор нужных строк
Когда нужна не обработка всех строк, а конкретные, применяют методы коллекции табличной части. Метод Найти(Значение, "ИмяРеквизита") возвращает первую строку с указанным значением реквизита или Неопределено, если строка не найдена. Метод НайтиСтроки(ПараметрыОтбора) возвращает массив всех строк, удовлетворяющих структуре отбора.
Отбор = Новый Структура("Номенклатура", ТекущаяНоменклатура);
НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
СтрокаТЧ.Цена = НоваяЦена;
КонецЦикла;
Результат НайтиСтроки — массив ссылок на строки той же табличной части, поэтому изменения через найденные строки тоже применяются к объекту напрямую. Перед обращением к результату Найти всегда проверяйте его на Неопределено, иначе попытка прочитать реквизит завершится ошибкой исполнения.
Добавление, удаление и копирование строк
Новая строка создаётся методом Добавить() табличной части, который возвращает созданную строку для дальнейшего заполнения. Метод Вставить(Индекс) добавляет строку в заданную позицию. Удаление выполняется методом Удалить(СтрокаТЧ) или по индексу.
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
НоваяСтрока.Количество = 1;
Удаление строк внутри цикла перебора — классическая ловушка. При удалении текущей строки коллекция сдвигается, и цикл «перепрыгивает» через элемент. Безопасные варианты: сначала собрать строки для удаления в массив, а удалять после цикла, либо перебирать коллекцию с конца через индексный цикл с шагом минус один.
Для копирования данных между строками удобен метод ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ) — он переносит значения одноимённых реквизитов. Учтите, что переносятся все совпадающие свойства, включая те, которые в новой строке должны отличаться, например ключ связи или сумма, которую нужно пересчитать.
Работа со строкой на форме документа
В модуле формы текущая строка табличной части доступна через свойство ТекущиеДанные элемента формы, например Элементы.Товары.ТекущиеДанные. Это объект типа «ДанныеФормыСтруктура», который по интерфейсу похож на строку табличной части, но не тождественен ей: часть методов коллекции через него недоступна.
Обработчики событий табличной части формы — ПриИзменении, ПередУдалением, ПриНачалеРедактирования — получают текущую строку либо через Элементы.Товары.ТекущиеДанные, либо через параметр события. Здесь же принято вызывать пересчёт зависимых реквизитов: при изменении количества пересчитывать сумму, при изменении номенклатуры — подставлять цену и ставку НДС.
В управляемых формах важно различать клиентский и серверный контекст. Обращение к данным строки возможно на клиенте, но вызовы запросов и методов, требующих сервера, из клиентского обработчика делаются через серверные процедуры. Передавать на сервер сам объект строки формы нельзя — передают примитивные значения: ссылку на номенклатуру, количество, номер строки.
В типовых конфигурациях пересчёт строки обычно уже реализован в общих модулях (например, процедуры вида РассчитатьСуммуВСтрокеТабличнойЧасти). Перед написанием собственного пересчёта проверьте существующие механизмы — повторный расчёт часто ломает учёт скидок и НДС.
СтрокаТЧ в запросах и выгрузках
Табличные части доступны в запросах как виртуальные таблицы вида Документ.РеализацияТоваровУслуг.Товары. Запрос к табличной части возвращает строки всех документов выбранного вида, а поле Ссылка связывает строку с её документом-владельцем. Это основной способ аналитики по строкам: остатки, продажи по номенклатуре, сверка цен.
При выгрузке данных — например, в файл обмена или табличный документ — строки табличной части перебираются тем же циклом, а значения реквизитов приводятся к нужному формату. Для больших объёмов предпочтительнее запрос с обходом результата: он выполняется на стороне СУБД и существенно быстрее построчного чтения объектов.
Как выбрать действие
Типичные ошибки и как их проверить
Самая частая ошибка — «Поле объекта не обнаружено». Она возникает, когда у строки запрашивают реквизит, которого нет в табличной части: опечатка в имени или попытка обратиться к реквизиту шапки документа через строку. Проверяется открытием конфигуратора и сверкой состава реквизитов конкретной табличной части.
Вторая группа проблем — логические: документ после программного изменения строк не записывается, и изменения теряются. Любая модификация табличной части объекта требует вызова Записать() (для документов — с нужным режимом проведения). Перед записью в продуктивной базе тестируйте обработку на копии: неверный пересчёт сумм по сотням документов откатывается только восстановлением из резервной копии.
Как проверить результат
Сумма равна произведению количества на цену с учётом скидок
Сумма не пересчиталась или отличается от ожидаемой
Итоги по документу совпадают с суммами строк
Итоги расходятся — пересчёт выполнен не для всех строк
Удалены только строки, попадающие под условие
Удалены лишние или остались лишние строки — ошибка в логике перебора
Частые вопросы
Чем СтрокаТЧ отличается от табличной части?
Табличная часть — это вся коллекция строк объекта, а СтрокаТЧ — одна конкретная строка этой коллекции. У табличной части есть методы Добавить, Удалить, Найти, НайтиСтроки; у строки — только свойства-реквизиты и служебный номер строки.
Почему возникает ошибка «Поле объекта не обнаружено» при обращении к строке?
Запрошен реквизит, которого нет в составе табличной части: опечатка в имени, обращение к реквизиту шапки документа или результат метода Найти равен Неопределено. Проверьте состав реквизитов в конфигураторе и добавьте проверку результата поиска.
Как правильно удалить несколько строк по условию?
Сначала найдите строки через НайтиСтроки или соберите их в массив в цикле, затем удаляйте методом Удалить уже после перебора. Удаление внутри цикла Для Каждого сдвигает коллекцию и приводит к пропуску строк.
Как получить текущую строку табличной части на форме?
Через свойство ТекущиеДанные элемента формы: Элементы.Товары.ТекущиеДанные. Также в обработчиках событий таблицы формы доступны параметры с идентификатором текущей строки, по которому её можно получить из данных формы.
Можно ли обратиться к строке табличной части по номеру?
Да, но по индексу, а не по номеру строки: Объект.Товары[0] — первая строка. Индекс начинается с нуля, а свойство НомерСтроки — с единицы, поэтому для строки с номером N индекс равен N-1.
Нужно ли записывать документ после изменения строк программно?
Да. Изменения строк существуют только в памяти до вызова метода Записать у объекта документа. Для проведённых документов указывайте режим записи, иначе документ окажется непроведённым или запись завершится ошибкой.
Что важно запомнить
СтрокаТЧ — это объект одной строки табличной части, через который читают и меняют реквизиты строки. Основные приёмы: перебор циклом Для Каждого, поиск через Найти и НайтиСтроки, добавление методом Добавить. Ключевые риски — удаление внутри цикла, обращение без проверки на Неопределено и изменение данных без последующей записи объекта.