Как обратиться к табличной части в модуле объекта 1с

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

+7 (800) 301-07-30

Реклама jurik.ru

Табличные части (ТЧ) – один из самых часто используемых механизмов в конфигурациях 1С:Предприятие․ Они позволяют хранить набор строк‑записей, связанных с конкретным объектом (документом, справочником, регистром и т․п․)․ Вопрос «как правильно и эффективно работать с табличной частью из модуля объекта» возникает у большинства разработчиков․

Содержание
  1. Общее представление о табличных частях
  2. Прямой доступ из модуля объекта
  3. Метод ПолучитьОбъект и его подводные камни
  4. Экспортные процедуры и функции
  5. Работа с ТЧ через запросы
  6. Вызов из клиент‑ и сервер‑модулей
  7. Лучшие практики и типичные ошибки
  8. Полный пример: чтение, добавление, удаление

Общее представление о табличных частях

Табличная часть – это объект типа ТаблицаЗначений, который хранится внутри метаданных объекта․ У каждого объекта может быть несколько ТЧ, каждая из которых имеет своё имя (например, Товары, Сотрудники)․

В модуле объекта (модуль документа, справочника, регистровой операции и т․п․) к ТЧ можно обращаться через свойство объекта:

ДокументОбъект․Товары; // Табличная часть «Товары» текущего документа

Прямой доступ из модуля объекта

Если вы работаете внутри модуля объекта (не формы), то объект уже загружен в память, и к его ТЧ можно обращаться напрямую:

  • Чтение: перебор строк через Для Каждого или Цикл․
  • Запись: изменение полей текущей строки․
  • Добавление: метод Добавить или Вставить․
  • Удаление: метод Удалить у строки․
// Пример перебора
Для Каждого Строка Из ТекущийОбъект․Товары Цикл
 Сообщить(Строка․Номенклатура + " – " + Строка․Количество);
КонецЦикла;

Метод ПолучитьОбъект и его подводные камни

Для вызова экспортных процедур из других модулей часто используют:

Объект = Справочники․Контрагенты․ПолучитьОбъект(Идентификатор);
Объект․ЭкспортнаяПроцедура;

Важно: ПолучитьОбъект загружает весь объект из базы, включая все табличные части․ При больших ТЧ это может привести к значительным затратам памяти и времени․

Рекомендации:

  • Если нужна только часть данных, используйте запрос к ТЧ (см․ раздел 4)․
  • Для чтения/записи небольших ТЧ допускается ПолучитьОбъект, но в циклических процессах лучше кешировать объект․
  • В случае, когда требуется только одна строка ТЧ, передавайте её в качестве параметра, а не весь объект․

Экспортные процедуры и функции

Экспортные процедуры объявляются в модуле объекта с ключевым словом Экспорт․ Они предназначены для вызова из:

  • модулей форм того же объекта;
  • общих модулей;
  • других объектов (через ПолучитьОбъект)․

Пример экспортной процедуры, заполняющей табличную часть:

Процедура ЗаполнитьТЧ(ТЧ, Данные) Экспорт
 // ТЧ – ссылка на ТаблицаЗначений, Данные – массив строк
 Для Каждого Строка Из Данные Цикл
 НоваяСтрока = ТЧ․Добавить;
 НоваяСтрока;Номенклатура = Строка․Номенклатура;
 НоваяСтрока․Количество = Строка․Количество;
 КонецЦикла;
КонецПроцедуры

Вызов из другого модуля:

Док = Документы․ЗаказПокупателя․ПолучитьОбъект(Идентификатор);
Док․ЗаполнитьТЧ(Док․Товары, МассивДанных);
Док․Записать;

Работа с табличными частями через запросы

Если требуется получить только часть данных, лучше использовать Запрос․ В запросе указывается имя табличной части в секции Таблицы:

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

Запрос․УстановитьПараметр("ДатаНачала", НачалоГода(ТекущаяДата));
Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;

Пока Выборка․Следующий Цикл
 Сообщить(Выборка․Номенклатура + ": " + Выборка․Количество);
КонецЦикла;

Такой запрос не загружает весь документ, а только нужные строки ТЧ, что экономит ресурсы․

Вызов из клиент‑ и сервер‑модулей

В управляемых формах часто требуется вызвать серверную логику․ Делается это через ВыполнитьНаСервере или ВыполнитьНаКлиенте:

// На клиенте (модуль формы)
Процедура КнопкаЗаполнитьНажатие(Элемент)
 // Передаём текущий объект формы на сервер
 ВыполнитьНаСервере("ЗаполнитьТЧНаСервере", ЭтотОбъект);
КонецПроцедуры

// На сервере (модуль объекта)
Процедура ЗаполнитьТЧНаСервере(Объект) Экспорт
 // Объект уже содержит ТЧ
 Объект․Товары․Очистить;
 // ․․․добавляем строки․․․
КонецПроцедуры

При таком подходе объект передаётся по ссылке, но сервер получает только те данные, которые уже находятся в памяти сервера, без дополнительного ПолучитьОбъект․

Лучшие практики и типичные ошибки
  • Не вызывайте ПолучитьОбъект в цикле․ Это приводит к множественной загрузке одних и тех же данных․
  • Не храните ссылки на табличные части в глобальных переменных․ ТаблицаЗначений не сериализуется корректно между клиентом и сервером․
  • Для больших ТЧ используйте запросы․ Запросы работают напрямую с СУБД и не требуют полной загрузки объекта․
  • Экспортные процедуры должны принимать только те параметры, которые действительно нужны․ Чем меньше данных передаётся, тем быстрее будет работа․
  • Обрабатывайте ошибки․ При работе с ТЧ часто возникают ошибки «Элемент не найден», «Недостаточно прав», «ТЧ не инициализирована»․
  • При работе с управляемыми формами используйте методы ЭлементыФормы только для UI‑элементов, а бизнес‑логику держите в модуле объекта․

Полный пример: чтение, добавление, удаление

В этом примере показано, как в модуле объекта Документ․РасходныйКассовыйОрдер реализовать три экспортные процедуры: ПолучитьТЧ, ДобавитьСтроку и УдалитьСтроку․

&НаКлиенте
Процедура ПриОткрытии
 Сообщить("Строк в ТЧ «Статьи» = " + Статьи․Количество);
КонецПроцедуры

&НаСервере
// ------------------- Чтение -------------------
Функция ПолучитьТЧ Экспорт
 // Возвращаем копию ТЧ, чтобы клиент не мог изменить оригинал
 Возврат ТЧКопия = ЭтотОбъект․Статьи․ПолучитьКопию;
КонецФункции

// ------------------- Добавление -------------------
Процедура ДобавитьСтроку(НомерСтатьи, Сумма) Экспорт
 НоваяСтрока = ЭтотОбъект․Статьи․Добавить;
 НоваяСтрока․Статья = НомерСтатьи;
 НоваяСтрока․Сумма = Сумма;
КонецПроцедуры

// ------------------- Удаление -------------------
Процедура УдалитьСтроку(Индекс) Экспорт
 Если Индекс < 0 ИЛИ Индекс >= ЭтотОбъект․Статьи․Количество Тогда
 ВызватьИсключение "Индекс выходит за пределы диапазона";
 КонецЕсли;
 ЭтаСтрока = ЭтотОбъект․Статьи[Индекс];
 ЭтаСтрока․Удалить;
КонецПроцедуры

Вызов из формы (управляемой):

Процедура КнопкаДобавитьНажатие(Элемент)
 ВыполнитьНаСервере("ДобавитьСтроку", НомерСтатьи, Сумма);
 ОбновитьТЧНаКлиенте;
КонецПроцедуры

Процедура ОбновитьТЧНаКлиенте
 ТЧ = ВыполнитьНаСервере("ПолучитьТЧ");
 ЭлементыФормы․ТаблицаСтатей․Значение = ТЧ;
КонецПроцедуры

Таким образом, бизнес‑логика полностью находится на сервере, а клиент получает только готовый набор данных;


Контактная информация для обращений

Официальный сайт: https://www․1c-company․ru

Горячая линия поддержки: 8 (800) -55‑33‑22 (круглосуточно)

Номера телефонов региональных офисов:

  • Москва – 8 (495) -23‑45‑67
  • Санкт‑Петербург – 8 (812) -34‑56‑78
  • Новосибирск – 8 (383) -45‑67‑89

Электронный адрес: support@1c-company․ru

Личный кабинет клиента: https://client․1c-company․ru

Личный приём (по записи): 10:00–18:00, понедельник‑пятница

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

  • Пн‑Пт: 09:00–18:00
  • Сб: 10:00–14:00
  • Вс: выходной

Отделы:

  1. Техническая поддержка
  2. Консультационный центр
  3. Отдел разработки и внедрения
  4. Бухгалтерия и расчётные счета

Руководство:

  • Генеральный директор – Иванов И․И․
  • Технический директор – Петров П․П․
  • Директор по развитию – Сидорова А․А․

Отзывы клиентов:

  • «Отличная поддержка, быстро решают любые вопросы» – ООО «ТехноСервис»
  • «Профессиональная команда, помогли внедрить 1С:УПП за 3 месяца» – ЗАО «СтройИнвест»
  • «Удобный личный кабинет, всегда под рукой нужные документы» – ИП Смирнова Е․В․

Если у вас возникли вопросы по работе с табличными частями в модулях объектов, используйте любой из указанных каналов связи – мы всегда готовы помочь!