В системе 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].Количество;
Ошибки, которые часто встречаются
- Неправильный индекс – индексы начинаются с 0. Попытка обратиться к элементу с индексом, превышающим
Количество ⏤ 1, вызовет ошибкуИндекс за пределами диапазона. - Опечатка в имени реквизита – в 1С имена чувствительны к регистру. Лучше использовать автодополнение в конфигураторе.
- Отсутствие строки – перед записью в реквизит убедитесь, что строка существует (например,
Если Таблица.Количество = 0 Тогда Таблица.Добавить; КонецЕсли;). - Тип данных – попытка записать строку в числовой реквизит приводит к ошибке приведения типов.
Лучшие практики
- Всегда проверяйте
Количествотабличной части перед обращением по индексу. - Используйте
Для Каждого– код будет чище и менее подвержен ошибкам с индексами. - Для массовых операций (например, импорт 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
- Воскресенье: выходной
Отделы
- Техническая поддержка
- Отдел внедрения
- Отдел обучения
- Юридический отдел
Руководство
Генеральный директор – Иванов И.И.
Технический директор – Петров П.П.
Отзывы
Оставьте отзыв о работе службы поддержки в разделе «Отзывы» личного кабинета или напишите нам на feedback@1c.ru;