Табличные части (ТЧ) – один из самых часто используемых механизмов в конфигурациях 1С:Предприятие․ Они позволяют хранить набор строк‑записей, связанных с конкретным объектом (документом, справочником, регистром и т․п․)․ Вопрос «как правильно и эффективно работать с табличной частью из модуля объекта» возникает у большинства разработчиков․
Содержание - Общее представление о табличных частях
- Прямой доступ из модуля объекта
- Метод
ПолучитьОбъект и его подводные камни - Экспортные процедуры и функции
- Работа с ТЧ через запросы
- Вызов из клиент‑ и сервер‑модулей
- Лучшие практики и типичные ошибки
- Полный пример: чтение, добавление, удаление
Общее представление о табличных частях
ПолучитьОбъект и его подводные камниТабличная часть – это объект типа ТаблицаЗначений, который хранится внутри метаданных объекта․ У каждого объекта может быть несколько ТЧ, каждая из которых имеет своё имя (например, Товары, Сотрудники)․
В модуле объекта (модуль документа, справочника, регистровой операции и т․п․) к ТЧ можно обращаться через свойство объекта:
ДокументОбъект․Товары; // Табличная часть «Товары» текущего документа
Прямой доступ из модуля объекта
Если вы работаете внутри модуля объекта (не формы), то объект уже загружен в память, и к его ТЧ можно обращаться напрямую:
- Чтение: перебор строк через
Для КаждогоилиЦикл․ - Запись: изменение полей текущей строки․
- Добавление: метод
ДобавитьилиВставить․ - Удаление: метод
Удалитьу строки․
// Пример перебора Для Каждого Строка Из ТекущийОбъект․Товары Цикл Сообщить(Строка․Номенклатура + " – " + Строка․Количество); КонецЦикла;
Метод ПолучитьОбъект и его подводные камни
Для вызова экспортных процедур из других модулей часто используют:
Объект = Справочники․Контрагенты․ПолучитьОбъект(Идентификатор); Объект․ЭкспортнаяПроцедура;
Важно: ПолучитьОбъект загружает весь объект из базы, включая все табличные части․ При больших ТЧ это может привести к значительным затратам памяти и времени․
Рекомендации:
- Если нужна только часть данных, используйте запрос к ТЧ (см․ раздел 4)․
- Для чтения/записи небольших ТЧ допускается
ПолучитьОбъект, но в циклических процессах лучше кешировать объект․ - В случае, когда требуется только одна строка ТЧ, передавайте её в качестве параметра, а не весь объект․
Экспортные процедуры и функции
Экспортные процедуры объявляются в модуле объекта с ключевым словом Экспорт․ Они предназначены для вызова из:
- модулей форм того же объекта;
- общих модулей;
- других объектов (через
ПолучитьОбъект)․
Пример экспортной процедуры, заполняющей табличную часть:
Процедура ЗаполнитьТЧ(ТЧ, Данные) Экспорт // ТЧ – ссылка на ТаблицаЗначений, Данные – массив строк Для Каждого Строка Из Данные Цикл НоваяСтрока = ТЧ․Добавить; НоваяСтрока;Номенклатура = Строка․Номенклатура; НоваяСтрока․Количество = Строка․Количество; КонецЦикла; КонецПроцедуры
Вызов из другого модуля:
Док = Документы․ЗаказПокупателя․ПолучитьОбъект(Идентификатор); Док․ЗаполнитьТЧ(Док․Товары, МассивДанных); Док․Записать;
Работа с табличными частями через запросы
Если требуется получить только часть данных, лучше использовать Запрос․ В запросе указывается имя табличной части в секции Таблицы:
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
Товары․Номенклатура,
Товары․Количество,
Товары․Сумма
ИЗ
Документ․ЗаказПокупателя․Товары КАК Товары
ГДЕ
Товары․Количество > 0
И Товары․Дата > &ДатаНачала";
Запрос․УстановитьПараметр("ДатаНачала", НачалоГода(ТекущаяДата));
Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;
Пока Выборка․Следующий Цикл
Сообщить(Выборка․Номенклатура + ": " + Выборка․Количество);
КонецЦикла;
Такой запрос не загружает весь документ, а только нужные строки ТЧ, что экономит ресурсы․
Вызов из клиент‑ и сервер‑модулей
В управляемых формах часто требуется вызвать серверную логику․ Делается это через ВыполнитьНаСервере или ВыполнитьНаКлиенте:
// На клиенте (модуль формы)
Процедура КнопкаЗаполнитьНажатие(Элемент)
// Передаём текущий объект формы на сервер
ВыполнитьНаСервере("ЗаполнитьТЧНаСервере", ЭтотОбъект);
КонецПроцедуры
// На сервере (модуль объекта)
Процедура ЗаполнитьТЧНаСервере(Объект) Экспорт
// Объект уже содержит ТЧ
Объект․Товары․Очистить;
// ․․․добавляем строки․․․
КонецПроцедуры
При таком подходе объект передаётся по ссылке, но сервер получает только те данные, которые уже находятся в памяти сервера, без дополнительного ПолучитьОбъект․
Лучшие практики и типичные ошибки - Не вызывайте
ПолучитьОбъект в цикле․ Это приводит к множественной загрузке одних и тех же данных․ - Не храните ссылки на табличные части в глобальных переменных․ ТаблицаЗначений не сериализуется корректно между клиентом и сервером․
- Для больших ТЧ используйте запросы․ Запросы работают напрямую с СУБД и не требуют полной загрузки объекта․
- Экспортные процедуры должны принимать только те параметры, которые действительно нужны․ Чем меньше данных передаётся, тем быстрее будет работа․
- Обрабатывайте ошибки․ При работе с ТЧ часто возникают ошибки «Элемент не найден», «Недостаточно прав», «ТЧ не инициализирована»․
- При работе с управляемыми формами используйте методы
ЭлементыФормы только для UI‑элементов, а бизнес‑логику держите в модуле объекта․
Полный пример: чтение, добавление, удаление
ПолучитьОбъект в цикле․ Это приводит к множественной загрузке одних и тех же данных․ЭлементыФормы только для 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С:УПП за 3 месяца» – ЗАО «СтройИнвест»
- «Удобный личный кабинет, всегда под рукой нужные документы» – ИП Смирнова Е․В․
Официальный сайт: 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С:УПП за 3 месяца» – ЗАО «СтройИнвест»
- «Удобный личный кабинет, всегда под рукой нужные документы» – ИП Смирнова Е․В․
Если у вас возникли вопросы по работе с табличными частями в модулях объектов, используйте любой из указанных каналов связи – мы всегда готовы помочь!