Последовательное уменьшение значений в таблице значений
Коллеги подскажите алгоритм последовательного уменьшения значений Таблицы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
Таблица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
По теме из базы знаний
- 1С:Предприятие 7.7. Оптимизация.
- Заметочки про 1С:Предприятие 8 (редакция 22.06.2012)
- Еще один взгляд на проблему «жизнь без последовательностей». Часть вторая (практическая)
- 50+ советов для успешной сдачи 1С: Специалист по платформе
- Интеграция 1С с маркетплейсами Ozon и Wildberries для УТ10.3, КА 1.1, УПП 1.3
Найденные решения
(7) В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
(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;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ПоказатьГлаза боятся, руки делают..
(17)
Для каждого Стр2 Из ТЗ2 Цикл
НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
Кол_во = Стр2.Количество;
Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
Если Стр1.Количество < Кол_во Тогда
Кол_во = Кол_во - Стр1.Количество;
Стр1.Количество = 0;
Иначе
Стр1.Количество = Стр1.Количество - Кол_во;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Принципиально уменьшать количество последовательно. Вычитаем строку 1 Таблицы2: сначала из первой строки Таблицы1, т. к. в первой строке колличество меньше вычитаемого, то первая строка Таблицы1 уходит в ноль, а оставшееся количество уже вычитаем из второй строки....
1) Запросами т.е. первые 2 тч загнать в запрос. там соединиться по ключевым полям, далее обходя результат запроса по группировке Номенклатура (как с партиями например, только тут не документ партии и номенклатура) , и формируем результирующий тз
2) в цикле обходим таблицу 2, находим строки по Номенклатуре в ТЗ1, уменьшаем количество пока наше количество из тз2 не станет равно 0, Потом удаляем строки из тз1 у которых количество = 0, можно сразу сформировать массив строк в первом цикле и потом обойти его и удалить строки, но тут надо аккуратно, отсортировать строки перед циклом в обеих ТЗ чтобы не удалить не ту строку случайно после удаления строки поднимаются и можно удалить не ту
2) в цикле обходим таблицу 2, находим строки по Номенклатуре в ТЗ1, уменьшаем количество пока наше количество из тз2 не станет равно 0, Потом удаляем строки из тз1 у которых количество = 0, можно сразу сформировать массив строк в первом цикле и потом обойти его и удалить строки, но тут надо аккуратно, отсортировать строки перед циклом в обеих ТЗ чтобы не удалить не ту строку случайно после удаления строки поднимаются и можно удалить не ту
(5)представьте что 1 таблица это данные документа, 2 таблица это остатки в регистре. и надо получить то что осталось не списано после списание по партиям. поле 1,2.... не кое поле из тч документа например сумма Номенклатурная группа, статья затрат...
(7) у нас 2 строки в первой таблице по номенклатура1, во второй количество = 3
идем по строкам 1 таблицы, из первой строки кол = 2 - 3 = - 1 т.е. кол в 1 строке считаем равно 0 и еще 1 остается от 3, во сторой строке вычитаем из кол = 3 - 1 = 2. эта строка остается в таблице т.к. ее количество <> 0 соответственно поле2, а не поле1 , если отсрортируется строки по другому то будет другой результат да. но в примере строки отсортированы так
идем по строкам 1 таблицы, из первой строки кол = 2 - 3 = - 1 т.е. кол в 1 строке считаем равно 0 и еще 1 остается от 3, во сторой строке вычитаем из кол = 3 - 1 = 2. эта строка остается в таблице т.к. ее количество <> 0 соответственно поле2, а не поле1 , если отсрортируется строки по другому то будет другой результат да. но в примере строки отсортированы так
(7) В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
(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;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ПоказатьГлаза боятся, руки делают..
(17)
Для каждого Стр2 Из ТЗ2 Цикл
НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
Кол_во = Стр2.Количество;
Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
Если Стр1.Количество < Кол_во Тогда
Кол_во = Кол_во - Стр1.Количество;
Стр1.Количество = 0;
Иначе
Стр1.Количество = Стр1.Количество - Кол_во;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
Остался вопрос о порядке строк в таблицах...
На основании чего устанавливается порядок следования строк?
Это очень важно, потому что если отнимать сначала от второй строки, то результат будет
Номенклатура1 2 Поле 1
Из за чего и возник изначально вопрос о способе получения Поля в результате...
На основании чего устанавливается порядок следования строк?
Это очень важно, потому что если отнимать сначала от второй строки, то результат будет
Номенклатура1 2 Поле 1
Из за чего и возник изначально вопрос о способе получения Поля в результате...
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)