Последовательное уменьшение значений в таблице значений

1. veritasuna12 3 06.11.19 08:09 Сейчас в теме
Коллеги подскажите алгоритм последовательного уменьшения значений Таблицы1 значениями Таблицы2, результирующая Таблица3

Таблица1
1. Номенклатура1 2 Поле1
2. Номенклатура1 3 Поле2
3. Номенклатура2 1 Поле3
4. Номенклатура2 1 Поле4
5. Номенклатура2 1 Поле5

Таблица2
1. Номенклатура1 3
2. Номенклатура2 2

Таблица3
1. Номенклатура1 2 Поле2
2. Номенклатура2 1 Поле5
По теме из базы знаний
Найденные решения
9. Sashares 34 06.11.19 09:41 Сейчас в теме
(7) В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
DmitriyPopow; veritasuna12; +2 Ответить
17. veritasuna12 3 06.11.19 10:31 Сейчас в теме
(9)По сути всё верно. Цикл без удаления строк просто с занулением такой :

Для каждого Стр2 Из ТЗ2 Цикл
					
					Пока Стр2.Количество <> 0 Цикл
						
						Для Каждого Стр1 Из ТЗ1 Цикл
							
							Если Стр1.Номенклатура = Стр2.Номенклатура Тогда
								
								Если Стр1.Количество > Стр2.Количество Тогда
									
									Стр1.Количество = Стр1.Количество-Стр2.Количество;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество = Стр2.Количество Тогда
									
									Стр1.Количество = 0;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество < Стр2.Количество Тогда
									
									Стр2.Количество = Стр2.Количество-Стр1.Количество;
									Стр1.Количество = 0;
									
								КонецЕсли;
							КонецЕсли;
							
						КонецЦикла;	
						
					КонецЦикла;
					
				КонецЦикла;

Показать


Глаза боятся, руки делают..
20. kasper076 101 07.11.19 12:21 Сейчас в теме
(17)
Для каждого Стр2 Из ТЗ2 Цикл
	НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
	Кол_во = Стр2.Количество;
	Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
		Если Стр1.Количество < Кол_во Тогда
			Кол_во = Кол_во - Стр1.Количество;
			Стр1.Количество = 0;
		Иначе
			Стр1.Количество = Стр1.Количество - Кол_во;
			Прервать;
		КонецЕсли;
	КонецЦикла;    
КонецЦикла;
Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. DmitriyPopow 33 06.11.19 08:12 Сейчас в теме
покрутил и так и так. не понял алгоритм который имеется ввиду, можно "на пальцах" пояснить?)
alex-l19041; +1 Ответить
3. veritasuna12 3 06.11.19 08:19 Сейчас в теме
Принципиально уменьшать количество последовательно. Вычитаем строку 1 Таблицы2: сначала из первой строки Таблицы1, т. к. в первой строке колличество меньше вычитаемого, то первая строка Таблицы1 уходит в ноль, а оставшееся количество уже вычитаем из второй строки....
4. DmitriyPopow 33 06.11.19 09:13 Сейчас в теме
1) Запросами т.е. первые 2 тч загнать в запрос. там соединиться по ключевым полям, далее обходя результат запроса по группировке Номенклатура (как с партиями например, только тут не документ партии и номенклатура) , и формируем результирующий тз
2) в цикле обходим таблицу 2, находим строки по Номенклатуре в ТЗ1, уменьшаем количество пока наше количество из тз2 не станет равно 0, Потом удаляем строки из тз1 у которых количество = 0, можно сразу сформировать массив строк в первом цикле и потом обойти его и удалить строки, но тут надо аккуратно, отсортировать строки перед циклом в обеих ТЗ чтобы не удалить не ту строку случайно после удаления строки поднимаются и можно удалить не ту
5. YannikAlx 43 06.11.19 09:21 Сейчас в теме
каким боком тут Поле 1,2,3,4,5 ?
по какому закону вы его тулите в 3 таблицу?
6. DmitriyPopow 33 06.11.19 09:26 Сейчас в теме
(5)представьте что 1 таблица это данные документа, 2 таблица это остатки в регистре. и надо получить то что осталось не списано после списание по партиям. поле 1,2.... не кое поле из тч документа например сумма Номенклатурная группа, статья затрат...
veritasuna12; +1 Ответить
7. YannikAlx 43 06.11.19 09:33 Сейчас в теме
(6) Совершенно не понятно....
КАК получается вот такой результат? Почему в результате Поле2 а не Поле 1 ?

Номенклатура1 2 Поле1
+ Номенклатура1 3 Поле2

- Номенклатура1 3

= Номенклатура1 2 Поле2
8. DmitriyPopow 33 06.11.19 09:38 Сейчас в теме
(7) у нас 2 строки в первой таблице по номенклатура1, во второй количество = 3
идем по строкам 1 таблицы, из первой строки кол = 2 - 3 = - 1 т.е. кол в 1 строке считаем равно 0 и еще 1 остается от 3, во сторой строке вычитаем из кол = 3 - 1 = 2. эта строка остается в таблице т.к. ее количество <> 0 соответственно поле2, а не поле1 , если отсрортируется строки по другому то будет другой результат да. но в примере строки отсортированы так
veritasuna12; +1 Ответить
10. YannikAlx 43 06.11.19 09:53 Сейчас в теме
(8)
С трудом разобрался в логике...
11. Sashares 34 06.11.19 09:54 Сейчас в теме
(10)
Я хочу услышать ответ автора...
в (3)
12. YannikAlx 43 06.11.19 09:56 Сейчас в теме
(11) Вы ввели сначала в заблуждение... Ибо в (2) ответ - супер...

Спасибо что откорректировали 2 на 3...
13. Sashares 34 06.11.19 09:58 Сейчас в теме
(12)Да, извиняюсь, перепутал сначала.
9. Sashares 34 06.11.19 09:41 Сейчас в теме
(7) В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
DmitriyPopow; veritasuna12; +2 Ответить
17. veritasuna12 3 06.11.19 10:31 Сейчас в теме
(9)По сути всё верно. Цикл без удаления строк просто с занулением такой :

Для каждого Стр2 Из ТЗ2 Цикл
					
					Пока Стр2.Количество <> 0 Цикл
						
						Для Каждого Стр1 Из ТЗ1 Цикл
							
							Если Стр1.Номенклатура = Стр2.Номенклатура Тогда
								
								Если Стр1.Количество > Стр2.Количество Тогда
									
									Стр1.Количество = Стр1.Количество-Стр2.Количество;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество = Стр2.Количество Тогда
									
									Стр1.Количество = 0;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество < Стр2.Количество Тогда
									
									Стр2.Количество = Стр2.Количество-Стр1.Количество;
									Стр1.Количество = 0;
									
								КонецЕсли;
							КонецЕсли;
							
						КонецЦикла;	
						
					КонецЦикла;
					
				КонецЦикла;

Показать


Глаза боятся, руки делают..
19. Sashares 34 06.11.19 10:33 Сейчас в теме
(17)Пока Стр2.Количество <> 0 Цикл - этот цикл лишний.
Если у вас вдруг в таблице 2 количество будет больше чем в таблице 1, то из-за этого будет бесконечный цикл.
А если меньше, то и без этого цикла все будет работать.
20. kasper076 101 07.11.19 12:21 Сейчас в теме
(17)
Для каждого Стр2 Из ТЗ2 Цикл
	НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
	Кол_во = Стр2.Количество;
	Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
		Если Стр1.Количество < Кол_во Тогда
			Кол_во = Кол_во - Стр1.Количество;
			Стр1.Количество = 0;
		Иначе
			Стр1.Количество = Стр1.Количество - Кол_во;
			Прервать;
		КонецЕсли;
	КонецЦикла;    
КонецЦикла;
Показать
14. YannikAlx 43 06.11.19 10:00 Сейчас в теме
Остался вопрос о порядке строк в таблицах...
На основании чего устанавливается порядок следования строк?
Это очень важно, потому что если отнимать сначала от второй строки, то результат будет
Номенклатура1 2 Поле 1
Из за чего и возник изначально вопрос о способе получения Поля в результате...
15. DmitriyPopow 33 06.11.19 10:23 Сейчас в теме
(14) да пусть будет положение луны в пространстве, алгоритм не изменится)
16. YannikAlx 43 06.11.19 10:26 Сейчас в теме
(15) Привел вам пример если первая строка в 1 таблице - будет второй то результат будет другим...
, то есть положение луны меняет результат все же...
18. DmitriyPopow 33 06.11.19 10:32 Сейчас в теме
(16) Согласен, результат разный, но алгоритм один, меняются исходные данные. аля списание партий по FIFO LIFO. именно алгоритм и просили подсказать
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день