Замена значений одной таблцы на значения другой

1. Asuneft 3 10.02.25 18:25 Сейчас в теме
Есть таблица (запроса или ТЗ) с набором данных, среди которых точно есть колонки: "Колонка1" и "Колонка2", есть вторая таблица (запроса или ТЗ) набором данных "Колонка1" и "Колонка3". Как можно заменить значения "Колонки2" в первой таблице на значения из Колонки3 второй таблицы по ключу !Колонка1"?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
10. nomad_irk 81 11.02.25 11:26 Сейчас в теме
(1) Если количество записей в таблицах одинаковое, то хватит:

Таблица1.ЗагрузитьКолонку(Таблица2.ВыгрузитьКолонку(<ИмяКолонки>), <ИмяКолонки>);


Перед этим отсортировать записи по нужным колонкам.
2. Said-We 10.02.25 18:29 Сейчас в теме
(1) Попробовал прям ваш запрос в deepseek загнать как есть...
Если Колонка1 уникальна в обеих таблицах, то ответ можно считать приемлемым. Если нет, то почти приемлемым. :-)
Прикрепленные файлы:
3. Asuneft 3 10.02.25 18:31 Сейчас в теме
(2) все так) но если не знаешь остальной набор колонок?
6. Pavel Rodinchenko 10.02.25 19:13 Сейчас в теме
(3) а если
Выбрать * поместить ТЗ1 из &ТЗ1 как Т;
Выбрать * поместить ТЗ2 из &ТЗ2 как Т;
ну и дальше там сравнивайте и делайте что хотите.
Просто запрос без конструктора написать придется.
4. Said-We 10.02.25 18:42 Сейчас в теме
(3) Коллекция колонок в ТЗ есть. Там есть все имена колонок. Запрос динамический и вперед.
Но можно проще, но будет работать медленнее. Добавляете к ТЗ_1 "колонку3", которой точно нет в ТЗ_1. Как угодно её назовите. И в цикле сидите и меняйте значение в известной колонке2 на значение из добавленной "колонки3".
5. Asuneft 3 10.02.25 18:44 Сейчас в теме
(4) через цикл медленно, хотелось запросом, но без перечисления колонок результирующей таблицы
7. Said-We 10.02.25 22:42 Сейчас в теме
(5) Текст запроса динамический и вперед.
8. booksfill 11.02.25 10:32 Сейчас в теме
По-моему, если у вас не гигантские таблицы, то мучить запрос, да и вводить доп. колонки не надо.
Например, вот это вот на 100 000 записей дает у меня 2,6 сек. (Core i5 - 7400, RAM 16Gb, Win10).


Процедура Замер()
  тз1 = Новый ТаблицаЗначений();
  пСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная));
  тз1.Колонки.Добавить("Колонка1", пСтрока); 
  тз1.Колонки.Добавить("Колонка2", пСтрока); 
  тз1.Колонки.Добавить("Колонка3", пСтрока); 
  
  тз2 = Новый ТаблицаЗначений();
  тз2.Колонки.Добавить("Колонка1", пСтрока); 
  тз2.Колонки.Добавить("Колонка22", пСтрока); 
  тз2.Колонки.Добавить("Колонка33", пСтрока); 
  
  Для i = 0 По 100000 Цикл
    новСтр = тз1.Добавить();
    новСтр.Колонка1 = "Колонка1 " + i;
    новСтр.Колонка2 = "Колонка2 " + i;
    новСтр.Колонка3 = "Колонка3 " + i;
  КонецЦикла; 
  
  ГЕН = Новый ГенераторСлучайныхЧисел();
  
  Для i = 8 По 90000 Цикл
    новСтр = тз2.Добавить();
    новСтр.Колонка1 = "Колонка1 " + ГЕН.СлучайноеЧисло(8, 90000);
    новСтр.Колонка22 = "Колонка22 " + i;
    новСтр.Колонка33 = "Колонка33 " + i;
  КонецЦикла; 
  
  тз2.Индексы.Добавить("Колонка1");
  
  пМиллисек1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
  
  Сообщить("Начало " + ТекущаяДатаСеанса() + " мс= " + пМиллисек1);
    
  Для каждого Стр Из тз1 Цикл
  	пСтрокаТЗ2 = тз2.Найти(Стр.Колонка1, "Колонка1");
    Если пСтрокаТЗ2 <> Неопределено Тогда
    	Стр.Колонка2 = пСтрокаТЗ2.Колонка22;
    КонецЕсли; 
  КонецЦикла; 

  пМиллисек2 = ТекущаяУниверсальнаяДатаВМиллисекундах();

  Сообщить("Окончание " + ТекущаяДатаСеанса() + " мс=" + пМиллисек2);
  
  Сообщить("Итого время выполнения, мс = " + (пМиллисек2 - пМиллисек1));
  
КонецПроцедуры

Показать
9. Said-We 11.02.25 11:23 Сейчас в теме
(8) Код как в 1С 7.7 получается. Ностальгия. Хотя код современных типовых на 1С 8.3 - это как раз 1С 77 чистой воды. Если смотреть на полезный код, а не на переходы и переливания с пустого в порожнее.

Не сильно принципиально, но в вашем варианте Колонка1 во второй таблице может повторятся. Как результат установится первое попавшееся значение из таблицы 2 по значению в Колонке1.
С другой стороны это даже хорошо. А то автор свои старания так ни разу и не показал. По факту Вы за него сделали всё. Ну, почти сделали.
11. Said-We 11.02.25 11:30 Сейчас в теме
(10) Не одинаковое количество записей, а полное соответствие (маловероятно). А том может быть в обоих по три строки, но вот такие :-)

Таблица1
Колонка1, Колонка2
1,1
2,2
3,3

Таблица2
Колонка1, Колонка2
1,11
4,44
5,55
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот