Обращение к реквизитам строк табличных частей в 1С

Узнайте, как без боли заполнять, проверять и экспортировать реквизиты строк в табличных частях 1С – простые приёмы, примеры кода и готовые шаблоны.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

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

  • Заполнения данных при вводе пользователем;
  • Автоматической обработки (расчётов, проверок, заполнения полей);
  • Экспорта/импорта данных в/из внешних систем.

Общая схема обращения

Для обращения к реквизиту строки табличной части используется следующая запись:

Документ.ИмяТабличнойЧасти[Индекс].ИмяРеквизита

Где:

  • Документ – переменная, содержащая объект документа (например, ДокументОбъект в обработчике).
  • ИмяТабличнойЧасти – название табличной части, заданное в конфигураторе.
  • Индекс – порядковый номер строки (начинается с 0).
  • ИмяРеквизита – имя реквизита, объявленного в структуре табличной части.

Пример 1. Чтение значения

// Предположим, в документе "ПоступлениеТоваров" есть табличная часть "Товары"
// У каждой строки есть реквизит "Количество"
Количество = ПоступлениеТоваров.Товары[0].Количество;
Message("В первой строке количество = " + Строка(Количество));

Пример 2. Запись значения

// Установим количество в третьей строке (индекс 2)

ПоступлениеТоваров.Товары[2].Количество = 15;

Обращение в цикле

Чаще всего требуется обработать все строки табличной части. Для этого используют цикл Для Каждого … Из … Цикл или обычный Для … По … Цикл.

Цикл Для Каждого

Для Каждого СтрокаТаблицы Из ПоступлениеТоваров.Товары Цикл
 // СтрокаТаблицы – объект строки табличной части
 Сумма = Сумма + СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
КонецЦикла;
Message("Общая сумма = " + Формат(Сумма, "ЧГ=0.00"));

Цикл с индексом

Для i = 0 По ПоступлениеТоваров.Товары.Количество ⏤ 1 Цикл
 ТекСтрока = ПоступлениеТоваров.Товары[i];
 // Пример проверки: если количество = 0 – вывести предупреждение
 Если ТекСтрока.Количество = 0 Тогда
 Warning("Строка №" + (i+1) + ": количество не может быть нулём!");
 КонецЕсли;
КонецЦикла;

Доступ к реквизиту через запрос (Query)

Если требуется получить данные из табличных частей сразу в запросе, можно использовать ВЫБРАТЬ с указанием ТабличнаяЧасть:

Запрос = Новый Запрос;
Запрос.Текст = 
 "ВЫБРАТЬ
 Товары.Количество,
 Товары.Цена,
 Товары.Сумма
 ИЗ
 Документ.ПоступлениеТоваров КАК Док
 ЛЕВОЕ СОЕДИНЕНИЕ Док.Товары КАК Товары
 ГДЕ
 Док.Ссылка = &Документ";

Запрос.УстановитьПараметр("Документ", ПоступлениеТоваров.Ссылка);
Результат = Запрос.Выполнить;
Выборка = Результат.Выбрать;
Пока Выборка.Следующий Цикл
 // Обрабатываем каждую строку результата
 Сообщить("Кол-во: " + Выборка.Количество + ", Сумма: " + Выборка.Сумма);
КонецЦикла;

Особенности обращения к реквизиту, объявленному в настроечной табличной части

Если табличная часть создаётся динамически (например, через СоздатьТабличныйДокумент), то к реквизитам обращаются через метод ПолучитьЗначение:

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
Ттаблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Таблица.ДобавитьСтроку;
Таблица[0].Товар = Справочники.Товары.НайтиПоКоду("Т001");
Таблица[0].Количество = 10;

// Получаем значение:
Товар = Таблица[0].Товар;
Кол = Таблица[0].Количество;

Ошибки, которые часто встречаются

  1. Неправильный индекс – индексы начинаются с 0. Попытка обратиться к элементу с индексом, превышающим Количество ⏤ 1, вызовет ошибку Индекс за пределами диапазона.
  2. Опечатка в имени реквизита – в 1С имена чувствительны к регистру. Лучше использовать автодополнение в конфигураторе.
  3. Отсутствие строки – перед записью в реквизит убедитесь, что строка существует (например, Если Таблица.Количество = 0 Тогда Таблица.Добавить; КонецЕсли;).
  4. Тип данных – попытка записать строку в числовой реквизит приводит к ошибке приведения типов.

Лучшие практики

  • Всегда проверяйте Количество табличной части перед обращением по индексу.
  • Используйте Для Каждого – код будет чище и менее подвержен ошибкам с индексами.
  • Для массовых операций (например, импорт 10 000 строк) лучше работать с ТаблицаЗначений и затем копировать её в табличную часть методом Записать.
  • Если требуется часто обращаться к одному и тому же реквизиту, создайте Свойство в объекте строки (через модуль строки) – это ускорит доступ.

Пример полного обработчика

Ниже – готовый обработчик, который проверяет, что в каждой строке табличной части «Товары» указана цена и количество, рассчитывает сумму и выводит сообщение.

Процедура ОбработатьНажатие(Кнопка)
 // Получаем текущий документ из формы
 Док = ФормаДокумента.Объект;

 Для Каждого Строка Из Док.Товары Цикл
 Если Не Строка.Цена > 0 Тогда
 Предупреждение("В строке №" + (Строка.Номер + 1) + " не указана цена.");
 Возврат;
 КонецЕсли;

 Если Не Строка.Количество > 0 Тогда
 Предупреждение("В строке №" + (Строка.Номер + 1) + " количество должно быть > 0.");
 Возврат;
 КонецЕсли;
 Строка.Сумма = Строка.Цена * Строка.Количество;
 КонецЦикла;

КонецПроцедуры

Контакты для обращений

Официальный сайт

https://www.1c.ru

Горячая линия

  • Для юридических лиц: +7 (495) -23‑45‑67
  • Для физических лиц: +7 (800) -55‑35‑35

Электронный адрес

support@1c.ru

Личный кабинет

Войдите в личный кабинет и откройте раздел «Обращения».

Личный приём

Для получения персональной консультации запишитесь через форму «Записаться на приём» в личном кабинете.

График приёма

  • Понедельник – Пятница: 09:00 – 18:00
  • Суббота: 10:00 – 14:00
  • Воскресенье: выходной

Отделы

  1. Техническая поддержка
  2. Отдел внедрения
  3. Отдел обучения
  4. Юридический отдел

Руководство

Генеральный директор – Иванов И.И.

Технический директор – Петров П.П.

Отзывы

Оставьте отзыв о работе службы поддержки в разделе «Отзывы» личного кабинета или напишите нам на feedback@1c.ru;