1с как связать две табличные части по полю

Обновлено: 04.12.2022

Добрый день дорогие форумчане! Буду благодарна за помощь. Платформа 8.2 В документе есть две табличные части и необходимо при выборе строки в одной табличной части отразить все строки соответствия в другой табличной части, при этом должна быть возможность заполнять обе таблицы. Пробовала через ОтборСтрок, отбор происходит и добавить строки я могу, но невозможно ничего в них изменить (
ЭлементыФормы.ТЧНоменклатура.ОтборСтрок.Автомобиль.Использование = Истина;
ЭлементыФормы.ТЧНоменклатура.ОтборСтрок.Автомобиль.ВидСравнения = ВидСравнения.Равно;
ЭлементыФормы.ТЧНоменклатура.ОтборСтрок.Автомобиль.Значение = Авто;

Спасибо, за отклик добрый человек! Ну наверное, тупо объясняю. У меня есть список машин, и по каждой я ввожу номенклатуру. И хотелось бы, чтобы при выборе машины можно было видеть все, что по ней введено и добавить необходимые позиции.

Я эти табличные части пытаюсь связать по машине. И когда в таблице номенклатуры добавляю строчку, она уже идет с ссылкой на машину, строка которой активна в списке машин. Но выбор номенклатуры недоступен. Прочитала в интернете, что при ОтбореСтрок не доступна возможность редактирования

Возникает при активизации строки табличного поля.
Событие также возникает при изменении значения ТекущаяСтрока.

В первой табличной части реализуешь обработчик события "ПриАктивизацииСтроки". В процедуре-обработчике ПриАктивизацииСтроки() пишешь свой код установки фильтра во второй табличной части.

Я так и сделала, но во второй таблице, записи не доступны для редактирования

Иногда при разработке больших отчётов и различных шахматок приходится соединять таблицы из разных выборок по определенному полю, например, выборка по продаже и выборка по производству - объединяем по номенклатуре, в запросе, бывает, это делать неудобно, т.к. в таблицу можно присваивать различные структуры для расшифровок.

Сделал функцию, которая объединяет 2 таблицы в одну, наподобие полного соединения в запросе.

ТЗ1 - первая Таблица значений

ТЗ2 - вторая Таблица значений

KEYт_str - колонки, по которым происходит объединение, пример: "номенклатура" или "номенклатура,ЕдИзм"

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Готовые переносы данных

Алкогольная декларация

54-ФЗ

Инструментарий разработчика

Маркетплейсы и 1С

Траектория обучения 1С-разработчика

Управление проектом на Инфостарте

>>>> приходится соединять таблицы из разных выборок по определенному полю
>>>> в запросе бывает это делать неудобно

Чего я не понимаю или где я отстал от этой жизни? Пакетные запросы с временными таблицами ужо не канают?

>>в запросе бывает это делать неудобно т.к. в Таблицу можно присваивать различные структуры для расшифровок.

хм, а что это значит? Имеются ввиду вложенные таблицы, структуры и т.п.? В таких случаях, да, временные таблицы сносят все внутренности..

Но, имхо, всё равно лучше соединиться-таки временными таблицами, а потом уже загрузить как-нить колонку со структурами (по ключу какому-нить или ловко воспользоваться "ЗагрузитьКолонку", если после левого джоина строки не раздублятся в первой ТЗ. или еще как-нить)

А тут более десятка циклов. Что будет, если ТЗ тысяч по 10-15 будет?

[а так ваще, всякие ТЗ в ТЗ - чур меня :). хотя иногда и бывает удобно, типа Структуры в ТЗ, но как раз для случаев, когда ожидаются запросы к таким таблицам, лучше внутренние структуры не делать]

>>в запросе бывает это делать неудобно

Неудобно спать стоя, а это нужно делать в запросе в ВТ

(3) :D я думаю просто это из той серии, сам придумал проблему, сам ее решил. в общем (0) неплохо бы увидеть реальный пример применения и чем лучше ВТ

Временные таблицы, временные таблицы.
Нас и здесь неплохо кормят :). Тьфу, и с таблицами значений неплохо.

(0) 1. Код совсем неоптимальный :( на средних и больших таблицах совсем долго работать будет.
а) Зачем постоянно создавать и заполнять структуру отбора?
б) в двух циклах по ТЗ1 идет одно и то же заполнение :( дважды :(
в) зачем вообще нужен второй цикл по ТЗ1 ?
и т.п.
2. В Коде нет некоторых простейших проверок - например, если в обеих таблицах есть колонки с одинаковым именем, которые не являются ключевыми, будет выдано исключение :( - Колонки.Добавить()
и т.п.

ЗЫ юзай Разукрашку - она есть в рекомендациях при создании/изменении публикаций

+ (6)
1. г) Вместо тормозного кода (интерпретатор все-таки)
Для каждого К Из ТЗ1.Колонки Цикл // или Тз2
стр[К.Имя] = стр1[К.Имя];
КонецЦикла;
можно юзать очень быстрое
ЗаполнитьЗначенияСвойств(стр, стр1) - все равно одинаковых колонок не будет

Лучше юзай Закрашку

artbear , по поводу ЗАполнитьЗначенияСвойств, замечания приняты ;)

по поводу скорости, ТЗ работает довольно быстро, проверял даж на таблицах 2+2_тысячи. :D

(9) А другие замечания? нафига вообще второй цикл по ТЗ1 и повторное заполнение данных :(
Жаль, что ты не осознал, значит, не искупил :( минус будет висеть :)

для тогож эта функция и делалась штобы можно было обьеденить таблицы без ВТ, просто как альтернативный вариант

Так, объясняю зачем нужен второй цикл по ТЗ1 .

Второй Цикл По ТЗ1 нужен для того штобы перенести те строчки из ТЗ2 которым нет пары в ТЗ1 ;)

[злым шепотом] афтар, скажи что осознал, одумался, ненарошно, исправишься и искупишь.. ))

если кто возьмётся оптимизировать, предлагаю сразу дополнить функционал левым и внутренним соединением тож :)

artbear: Первый обход по ТЗ1 нужен для того штоб перенести в новую таблицу те строки из ТЗ1 которым нет пары в ТЗ2

Второй Обход по ТЗ1 нужен для того штобы перенести строки которым есть парыв ТЗ2.
Можно было конешно запихнуть в один цикл, но сделал специально раздельно для наглядного разделения выполняемыхопрераций.

нрод прежде чем минусовать разберитесь в коде!.

Если што-то не так укажыте конкретно строчку и вопрос.

(18) Для такого метода важна производительность, а разделение операций организовать очень легко - у тебя должен быть всего ОДИН цикл,
а код будет выполняться в разных ветках в зависимости
НайденныеСтроки = ТЗ2.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 тогда // или = 0
можешь сам сделать исправления и посмотреть, насколько быстрее стал выполняться код :)

На самом деле я подобную функцию делал. кода под рукой нет, а на 1С давно не программил, но смысл в том, что идет итерация по одной таблице и ищутся строки, как-то так

Для j = 0 По iterator Цикл

Строки = ТЗ2.НайтиСтроки(Отбор);
col = Строки.Количество();

Если col > 0 Тогда

А дальше С помощью ЗаполнитьЗначенияСвойств заполнялись строки

(0) пишите, пожалуйста, русским транскриптом на языке 1С (в качестве предыстории напишите, откуда у вас привычка писать англ. символами?) (9) в качестве примера у вас "номенклатура", поэтому приведите пожалуйста задачу из жизни, из реальной практики клиентов, пример со структурами .
и честно признайтесь - это задача из жизни клиентов или для зачета в универе? :)

Вообще временные таблицы сохраняются на жесткий диск, поэтому скорость такого соединения оставляет желать лучшего, фактически это тот же самый семерочный подход, когда для того, чтобы к таблице значений можно было применить семерочный запрос она сохранялась в отдельный документ. Это не есть гуд. Поэтому возможность сделать соединение непосредственно в оперативке должно бы ускорять процедуру довольно существенно, хотя последнее утверждение стоит, конечно, потестировать.

(0) Отрицательные примеры тоже полезны.
Текущая статья является хорошей иллюстрацией к теме : не пробуйте повторить !
Даже разжевывать не хочется , почему такие процедуры лючше выполнять запросом с использованием временных таблиц.
(23)

Вообще временные таблицы сохраняются на жесткий диск, поэтому скорость такого соединения оставляет желать лучшего, фактически это тот же самый семерочный подход

+(26) Это именно та причина, по которой 1С советует думать о производительности перед использованием временных таблиц, народ же решил, что вся эта красота даром и использует эту технологию где ни попадя.

(26) пруфлинки. на курсы хотя бы. про tempdb вам рассказывали. да и кэширование не тоже , что и хранение.

а вы попробуйте сделать какую либо сложную обработку кодом по ТЗ и тоже самое запросом - получите интересные цифры для сравнения :)

у меня есть конкретные примеры, когда переписывание каскада корявых циклов с удалениями, добавлениями и прочими манипуляциями строк в ТЗ на запрос с ВТ приводило к увеличения производительности с полутора часов(!) до 40-50 сек на таблицах >25'000 строк

1С всё верно пишет, другое дело, что с они не с ТЗ сравнивают :) . Они говорят про запросы с ВТ и без ВТ. Имхо, это всё-таки относится к t-sql в большей степени, на том уровне разработки - да, есть проблемы. Но с 1С сравнивать это нельзя.

Я тут приводил примеры в одной теме как раз про использованием ВТ самими 1С

БП 1.6. Отчет "РегистрРасчетАмортизацииОсновныхСредств". Запрос без ВТ на 250 строк.
БП 2.0, тот же отчет, временных таблиц 22 шт, запрос уже на 550 строк

(28) возможно ноги в курсах растут вот отсюда, к примеру http://articles.org.ru/cfaq/index.php?qid=2547 , параграф "Ограничения временных таблиц"

Дословно, привожу, что пишет по этому поводу 1С: ". необходимо понимать, что в любом случае - работа с ввременной таблицей подразумевает ее сохранение в базе данных (пусть и на время), чтение из нее (т.е. из базы данных) и уничтожение ее при уничтожении или закрытии экземпляра менеджера временных таблиц (например, при окончании процедуры). Данные действия, конечно же, при своем исполнении потребляют ресурсы, т.е. в общем случае потенциально снижают быстродействие алгоритма."

Вообще временные таблицы сохраняются на жесткий диск, поэтому скорость такого соединения оставляет желать лучшего,

(30) насчет курсов это была издевка, приписываемая вышеуказанная фраза(про жесткие диски, а в особенности про низкую скорость работы, это означает все блин табу на временные таблицы?) не могла быть в курсах
PS Кстати по сравнению с чем, скорость оставляет желать лучшего.

(31)
ну вообще да, хотелось бы чуть больше цитаты с курсов, а то непонятно в каком контексте всё это у них

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

а Strange Device сравнивает циклы по ТЗ и запросы с ВТ

(29)
кстати, ведь ТЗ - это тоже ВТ в итоге ))). Просто когда мы создаем ТЗ и начинаем циклом по ней елозить, это всё в sql преобразуется не в 1* большой запрос (как в случае запроса с ВТ или без них), а в N маленьких запросиков на каждую итерацию цикла. Особенно начинается тормоз, когда идёт вытаскивание полей в теле цикла по точке "Ссылка.Реквизит11.Реквизит22" - ведь это каждый раз делаются запросики с левым соединением на каждую итерацию.

А что лучше, 1* большой запрос или N маленьких - вопрос риторический.

Поэтому и рекомендуют - если работаете циклами по ТЗ, подготавливайте заранее данные, чтоб в теле цикла не вытаскивать по точкам, не получать константы и пр. А еще лучше - с ТЗ не работайте, а делайте запросы с ВТ или без них - всё равно однозначно быстрее :)

* - условно один. скорее всего, запросов будет несколько (надо смотреть профайлер sql) - всякие подготовительные скидки-перескидки, "перевод" чисто 1С-ных запросных конструкций на sql и пр. Но в любом случае, это не N запросов

(32) Касательно фразы "а Strange Device сравнивает циклы по ТЗ и запросы с ВТ", уважаемый romansun, считает, что цикл по уже сформированной ТЗ будет работать существенно медленнее, чем цикл по уже исполненному запросу? Посему сравнивать цикл один с другим не имеет никакого смысла. Замечу кстати, что некорректно можно работать не только с ТЗ вытаскивая из нее данные по типу "Ссылка.Реквизит11.Реквизит22", но и с результатами запроса, причем все это никоим образом не зависит от достоинств и недостатков ТЗ или запроса, а определяется только и исключительно квалификацией программиста.

ну вообще да, хотелось бы чуть больше цитаты с курсов, а то непонятно в каком контексте всё это у них

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

а Strange Device сравнивает циклы по ТЗ и запросы с ВТ

кстати, ведь ТЗ - это тоже ВТ в итоге ))). Просто когда мы создаем ТЗ и начинаем циклом по ней елозить, это всё в sql преобразуется не в 1* большой запрос (как в случае запроса с ВТ или без них), а в N маленьких запросиков на каждую итерацию цикла. Особенно начинается тормоз, когда идёт вытаскивание полей в теле цикла по точке "Ссылка.Реквизит11.Реквизит22" - ведь это каждый раз делаются запросики с левым соединением на каждую итерацию.

А что лучше, 1* большой запрос или N маленьких - вопрос риторический.

Поэтому и рекомендуют - если работаете циклами по ТЗ, подготавливайте заранее данные, чтоб в теле цикла не вытаскивать по точкам, не получать константы и пр. А еще лучше - с ТЗ не работайте, а делайте запросы с ВТ или без них - всё равно однозначно быстрее

* - условно один. скорее всего, запросов будет несколько (надо смотреть профайлер sql) - всякие подготовительные скидки-перескидки, "перевод" чисто 1С-ных запросных конструкций на sql и пр. Но в любом случае, это не N запросов

ТЗ- это не ВТ, ТЗ работает очень быстро,также как и (масивы,ТЗ,структуры,Соответствия), ТЗ всегда висит в оперативке, при обрашении к полям ТЗ неделается ни каких маленьких запросов, мыже данные не из базы по ссылким вытягиваем.

Наверняка многие сталкивались с вопросом о связывании двух- и более таблиц на формах 1С по принципу главная-подчиненная. Один из возможных вариантов решения я приведу в этой статье. Некоторые решения я уже встречал, но они либо ограничивают возможности таблиц (невозможность сортировки, изменения номера строки и перестановки строк местами) либо требовали дополнительного кода по обработке различных изменений в связанной информации. Предлагаю более разумное и довольно простое решение.

Наверняка многие сталкивались с вопросом о связывании двух- и более таблиц на формах 1С по принципу главная-подчиненная. Один из возможных вариантов решения я приведу в этой статье. Некоторые решения я уже встречал, но они либо ограничивают возможности таблиц (невозможность сортировки, изменения номера строки и перестановки строк местами) либо требовали дополнительного кода по обработке различных изменений в связанной информации. Предлагаю более разумное и довольно простое решение.

Идея:

1. Необходима уникальная скрытая связка в двух таблицах, обеспечивающая простую в обработке синхронизацию полей главной и подчиненной таблиц.

Реализация:

В поисках такой универсальной связки наткнулся на конструкцию вида:

Как раз его и будем использовать для связывания. В обе табличные части документа добавляем поле с типом УникальныйИдентификатор. После этого необходимо в модуле формы обработать несколько событий, а именно:

ПриНачалеРедактирования - Табличного поля главной таблицы и Табличного поля подчиненной таблицы.

ПередУдалением - Табличного поля главной таблицы для очистки связанных строк подчиненной.

ПриАктивизацииСтроки - для отбора строк подчиненной таблицы.

А теперь примеры обработчиков, кстати, они универсальны для любых решений.

И совсем небольшое дополнение - полю ИД устанавливаем Свойство:Индексировать = индексировать.

Поле Табличного Поля можно (и нужно во избежание) сделать недоступным для пользователя.


Из одного документа получить данные табличной части другого документа
Добрый день. Сразу оговорюсь 1С только начал изучать, поэтому просьба помидорами не закидывать. .

Как из одного документа перенести значение из табличной части в реквизит другого документа?
Только начинаю осваивать 1С, учебная задача. Есть два документа "Индивидуальный заказ" и.

Заполнение табличной части одного документа из табличной части другого документа
Здравсвуйте. 1С 8.2. Есть документ Приход и документ Расход. Оба документа имеют табличные части -.

Заполнение табличной части одного документа из табличной части этого же документа
Здравсвуйте. 1С 8.2. Есть документ в этом документе 2 табличные части В 1 табличной части.

К условию ГДЕ добавить параметрическое условие, что-то вроде ТЧТРаботникиОрганизации.ФизЛицо = &ФизЛицо. Здесь ФизЛицо - ссылка на нужное вам физ лицо.

У меня нет ссылки на нужное физ.лицо
Алгоритм следующий: изначально из документа запросов выбираются все сотрудники в таб.части и выгружаются в таблицу значений.

Далее эта таблица значений передается в качестве параметра запроса.В ней может быть 5,10 сотрудников.
Мне надо для каждого сотрудника из табличной части и таблицы отпусков вытащить данные.

Добавлено через 4 минуты
Полный текст запроса:

Это 2 сотрудника в документе,и у каждого своя таб.часть с данными отпуска.
Должно быть 2 записи в выборке

Решение

OverDozero, Сначала соедени свою ВТ со Справочник.СотрудникиОрганизаций и выведи в ВТ2 (учти правило - поля по которым соединяются таблицы, должны быть в полях запроса). И уже ВТ2 левым соединяй с ТЧТрудовыеОтпускаОрганизаций. Дату получай из ТЧ через Ссылку:

Здравствуйте!
Есть две табличные части в документе.
1. В первой табличной части открывается список студентов при изначальном выборе учебной группы.
2. Во второй тч выбираются физические упражнения и проставляются по ним баллы.
Нужно, чтобы при выборе другого студента в первой тч, список упражнений во второй тч оставался, а баллы по ним обнулялись, но предыдущие запоминались для предыдущего студента, для которого они были выставлены и посчитаны в сумме в реквизите под второй тч.

Как связать табличные части
Здраствуйте, есть документ в котором есть поле, в котором содержится 3 вида заявок на закупки, так.


Две табличные части рядом в макете
Есть две несвязанных ТЧ. В макете нужно расположить их рядом. Как это лучше сделать? пробовал.

1с 8.2 Возможно Ли Связать Табличные Части Двух Справочников?
Как связать ТЧасти двух справочников таким образом, чтобы при изменении ТЧ одного справочника, это.

Как связать две части кода?
Дорогие друзья, продолжаю мучения с моим кодом подсчета устойчивых словосочетаний в стихотворных.

Ananasta, Я бы сделал вторую ТЧ с колонкой Упражнения и колонками Оценка[ИмяСтудента] Количество колонок с оценками по количеству студентов.
Модуль формы ПриОткрытии:
- Все колонки с Оценками видимость = Ложь
УчебнаяГруппаПриИзменении:
1. В первой табличной части открывается список студентов
2. Во второй ТЧ колонкам Оценка присваиваются имена студентов ОценкаИванов, ОценкаПетров и т.д.
ИмяПервойТЧПриАктивизацииСтроки:
В первой ТЧ получаем Текущие данные
Во второй, колонка Оценка[ИмяСтудента] видимость Истина (где имя студента текущие данные студент в первой ТЧ)
Все остальные колонки Оценка видимость Ложь
ОценкаПриИзменении
Реквизит Всего по группе (число) = Всего + Итог("Оценка[ИмяСтудента] ")

Читайте также: