При разработке в среде 1С часто возникают ситуации, когда требуется связать данные, находящиеся в разных табличных частях одного и того же документа. Рассмотрим, как эффективно решить задачу переноса данных, например, «Проекта» из первой табличной части во вторую, используя возможности языка запросов платформы 1С.
Наиболее надежным и производительным способом является использование временных таблиц. Это позволяет не просто «перенести» данные, а выполнить качественное соединение, обеспечивающее целостность информации. Разберем по шагам, как построить такой запрос:
Номенклатура и Проект) и помещаем их во временную таблицу.ВНУТРЕННЕЕ СОЕДИНЕНИЕ, мы сопоставляем записи второй табличной части с данными, полученными из временной таблицы, по общему ключу — Номенклатура.Посмотрим на пример реализации такого запроса:
ВЫБРАТЬ
ТЧ_А.Номенклатура КАК Номенклатура,
ТЧ_А.Проект КАК Проект
ПОМЕСТИТЬ ВТ_Проекты
ИЗ
Документ.НашДокумент.ТЧ_А КАК ТЧ_А
ГДЕ
ТЧ_А.Ссылка = &Ссылка;
ВЫБРАТЬ
ТЧ_Б.Номенклатура КАК Номенклатура,
ВТ_Проекты.Проект КАК Проект
ИЗ
Документ.НашДокумент.ТЧ_Б КАК ТЧ_Б
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Проекты КАК ВТ_Проекты
ПО ТЧ_Б.Номенклатура = ВТ_Проекты.Номенклатура
ГДЕ
ТЧ_Б.Ссылка = &Ссылка;
Когда мы работаем с ТабличнаяЧасть документа, важно помнить об ограничениях производительности. Если вы попытаетесь перебирать данные в цикле, это может замедлить работу системы. Пакетные запросы с ПОМЕСТИТЬ позволяют выполнить всю обработку на стороне сервера базы данных. Это исключает лишнюю передачу данных между сервером и клиентом.
Обратите внимание на использование параметра &Ссылка. Всегда ограничивайте выборку в запросе конкретной ссылкой на документ, чтобы не получить данные из всей базы, что критически важно для производительности.
Если запрос к базе данных по какой-то причине не подходит или задача требует предварительной обработки данных в памяти, вы можете воспользоваться следующим алгоритмом:
ТаблицаЗначений методом Выгрузить().ТаблицаЗначений в запрос в качестве параметра.МенеджерВременныхТаблиц.Загрузить() или обхода результата запроса.В процессе совместного анализа задачи важно задаться вопросом: а нужна ли вторая табличная часть вообще? Рассмотрим несколько советов:
ПриИзменении в модуле формы. Это обеспечит актуальность данных «на лету» без необходимости запускать сложные запросы перед записью.ЕСТЬNULL: При соединении таблиц всегда помните про возможность отсутствия данных. Используйте ЕСТЬNULL(ВТ_Проекты.Проект, Справочники.Проекты.ПустаяСсылка()), чтобы избежать ошибок и потери данных во второй табличной части, если проект для какой-то номенклатуры не был задан.Таким образом, мы выяснили, что оптимальный путь — это использование пакетных запросов с временными таблицами. Это позволяет писать чистый, поддерживаемый код, который работает быстро и корректно в рамках архитектуры 1С.