Задача - как подобрать из бухт кабеля двух длин на складе (бухты не режутся) количество с минимальным отклонением от заказа клиента

27.10.20

Учетные задачи - Логистика, склад и ТМЦ

Условие задачи: Мы продаем витую пару, в бухтах по 30 метров и по 70 метров, бухты не разрезаются, продаются целиком. Имеем на складе какое-то произвольное количество тех и других бухт. Что требуется: Приходит клиент и просит какую-либо длину, произвольную, допустим 150 метров, необходимо написать процедуру, которая одним запросом подберет необходимое количество тех и других бухт как можно ближе к этой длине с учетом товаров на складе. Не нашел готового решения. Не претендую на оптимальность. Рабочая версия для УПП

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Обработка подбора
.epf 9,03Kb ver:1
13
13 Скачать бесплатно
запрос
.sel 14,15Kb ver:1
8
8 Скачать бесплатно

Начальные условия:
По условиям задачи введены две номенклатуры на один склад 
Выводятся первые 10 записей для подбора

 

ВЫБРАТЬ
 0 КАК Цифра
ПОМЕСТИТЬ Цифры
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
 9
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 Цифры.Цифра + Цифры1.Цифра * 10 + Цифры2.Цифра * 100 + Цифры3.Цифра * 1000 КАК Поле1
ПОМЕСТИТЬ Тысяча
ИЗ
 Цифры КАК Цифры,
 Цифры КАК Цифры1,
 Цифры КАК Цифры2,
 Цифры КАК Цифры3
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТоварыНаСкладахОстатки.Номенклатура,
 ТоварыНаСкладахОстатки.КоличествоОстаток
ПОМЕСТИТЬ Бобины30
ИЗ
 РегистрНакопления.ТоварыНаСкладах.Остатки(
   &Дата,
   Склад = &Склад
    И Номенклатура = &Бобины30) КАК ТоварыНаСкладахОстатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТоварыНаСкладахОстатки.Номенклатура,
 ТоварыНаСкладахОстатки.КоличествоОстаток
ПОМЕСТИТЬ Бобины70
ИЗ
 РегистрНакопления.ТоварыНаСкладах.Остатки(
   &Дата,
   Склад = &Склад
    И Номенклатура = &Бобины70) КАК ТоварыНаСкладахОстатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 70
 30 * ВЫБОР
  КОГДА Тысяча.Поле1 <= 70
   ТОГДА Тысяча.Поле1
  ИНАЧЕ 0
 КОНЕЦ КАК СуммыПо30,
 ВЫБОР
  КОГДА Тысяча.Поле1 <= 70
   ТОГДА Тысяча.Поле1
  ИНАЧЕ 0
 КОНЕЦ КАК КоличествоБобинПо30м,
 Бобины30.Номенклатура
ПОМЕСТИТЬ БобиныПо30
ИЗ
 Тысяча КАК Тысяча,
 Бобины30 КАК Бобины30
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 30
 70 * ВЫБОР
  КОГДА Тысяча.Поле1 <= 30
   ТОГДА Тысяча.Поле1
  ИНАЧЕ 0
 КОНЕЦ КАК СуммыПо70,
 ВЫБОР
  КОГДА Тысяча.Поле1 <= 30
   ТОГДА Тысяча.Поле1
  ИНАЧЕ 0
 КОНЕЦ КАК КоличествоБобинПо70м,
 Бобины70.Номенклатура
ПОМЕСТИТЬ БобиныПо70
ИЗ
 Тысяча КАК Тысяча,
 Бобины70 КАК Бобины70
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
 БобиныПо30.СуммыПо30 + БобиныПо70.СуммыПо70 КАК Сумма,
 БобиныПо30.Номенклатура КАК БобиныПо30Метров,
 БобиныПо30.КоличествоБобинПо30м КАК КоличествоБобинПо30м,
 БобиныПо70.Номенклатура КАК БобиныПо70Метров,
 БобиныПо70.КоличествоБобинПо70м КАК КоличествоБобинПо70м
ПОМЕСТИТЬ ВыборкаВсехВариантов
ИЗ
 БобиныПо30 КАК БобиныПо30,
 БобиныПо70 КАК БобиныПо70
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 10
 МИНИМУМ(ВыборкаВсехВариантов.Сумма - &ДлинаЗаказчика) КАК МинимальноеОтклонение,
 ВыборкаВсехВариантов.КоличествоБобинПо30м,
 ВыборкаВсехВариантов.КоличествоБобинПо70м
ИЗ
 ВыборкаВсехВариантов КАК ВыборкаВсехВариантов
ГДЕ
 ВыборкаВсехВариантов.Сумма - &ДлинаЗаказчика >= 0
СГРУППИРОВАТЬ ПО
 ВыборкаВсехВариантов.КоличествоБобинПо30м,
 ВыборкаВсехВариантов.КоличествоБобинПо70м
УПОРЯДОЧИТЬ ПО
 МинимальноеОтклонение

Обработка УПП подбор минимальное отклонение

См. также

Логистика, склад и ТМЦ Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа позволяет организовать учет ответственного хранения товаров с весовыми характеристиками, в том числе со сроком годности и личным кабинетом Поклажедателя. Модуль реализован в виде расширения конфигурации, устанавливается в режиме 1С:Предприятие 8 за 5 минут по инструкции, что позволяет оставить конфигурацию 1С на стандартной поддержке и продолжать получать стандартные обновления от фирмы "1С".

89900 руб.

09.06.2020    41812    34    59    

69

Операции по ВЭД Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Мастера заполнения Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

СКАЧАЙТЕ И ПОПРОБУЙТЕ БЕСПЛАТНО! Данная обработка расширяет функционал типовой конфигурации «1С:Бухгалтерия предприятия» и позволяет осуществлять автоматическое заполнение ГТД в документах «Реализация товаров и услуг», «Списание товаров», «Отчет о розничных продажах», «Отчет комиссионера (агента) о продажах», «Требование-накладная», «Возврат товаров от покупателя», «Комплектация номенклатуры», «Безвозмездная передача», «Отчет производства за смену». Обработка предназначена для работы в конфигурации «1С:Бухгалтерия предприятия 8, редакция 3.0» Есть версия обработки оптимизированная для работы в 1CFresh

9600 руб.

19.06.2012    140660    276    81    

235

Файловый обмен (TXT, XML, DBF), FTP Логистика, склад и ТМЦ Пользователь Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Данная система является дополнением к известной моей разработке "Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, БП 2.0, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2" и служит для ПОЛНОЙ автоматизации процесса загрузки/обновления номенклатуры, картинок, документов с номенклатурой и прочего с возможностью загрузки сразу из разных источников данных (E-MAIL, HTTP, FTP, ЛОКАЛЬНЫЕ КАТАЛОГИ). Имеет возможность фильтрации файлов и писем. Имеет возможность задать на профиль/группу профилей свое расписание работы. И многое другое! Обновление от 31.03.2025, версия 1.8!

28800 руб.

13.07.2021    23412    9    9    

18

Печатные формы Логистика, склад и ТМЦ Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработки для "1С:Бухгалтерия предприятия 3.0", которые формируют акты МХ-1 и МХ-3 для документов "ПоступлениеТоваровУслуг", "Реализация товаров услуг", "Возврат товаров поставщику", "Передача материалов в эксплуатацию" соответственно. Так же можно сформировать акты с факсимиле, которая загружена в 1С:Бухгалтерия предприятия 3.0.

3720 руб.

18.02.2019    66403    229    15    

182

Учет ОС и НМА Сканер штрих-кода Терминал сбора данных Логистика, склад и ТМЦ Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Приложение Инвентаризация ОС и ТМЦ предназначено для инвентаризации основных средств и товарно-материальных ценностей, закреплённых за конкретным материально ответственным лицом или складом. В конфигурации 1С:Бухгалтерии 3.0 отсутствуют возможности генерации и работы со штрих-кодами для основных средств. Приложение позволяет генерировать и обрабатывать штрих-коды как для основных средств, так и для товарно-материальных ценностей (материалы, товары). В новом релизе появилась возможность работы с фотографиями объектов учета.

07.07.2023    4064    2    alfanika    0    

6

Печатные формы Логистика, склад и ТМЦ Бухгалтер Платформа 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Комплексная автоматизация 2.х Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

13200 руб.

27.06.2023    5143    16    2    

17

Логистика, склад и ТМЦ Роли и права Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Расширение для 1С:Бухгалтерия 3.0, которое позволяет использовать отдельные роли для доступа к складским документам, для доступа к документам раздела "Производство" и для доступа к документам раздела "Покупки".

4560 руб.

21.05.2019    1696425    581    194    

141

Производство готовой продукции (работ, услуг) Логистика, склад и ТМЦ Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение для установки аналогов номенклатуры и замены номенклатуры на аналоги по остаткам в документах: Производства, в том числе давальческого. Продажи. Комплектации. Складского учета.

7200 руб.

18.01.2022    15790    32    23    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. logarifm 1126 23.08.15 16:27 Сейчас в теме
С русским очень плохо, боюсь скачивать даже сей шедевр. Не вобиду но я не понимаю зачем вообще такое выкладывать, кому оно вообще надо? У меня есть масса одноразовых или специфичиских работ но я же ими не засоряю ис...
2. TODD22 20 23.08.15 18:42 Сейчас в теме
Не очень понятно требование к задаче решить это одним запросом. А несколькими запросами и объектной моделью уже не модно? Или в чём принципиальность?
3. Артано 798 24.08.15 07:15 Сейчас в теме
(2) TODD22, не задавай вопросы, быстрее скачивай все файлы =)
4. TODD22 20 24.08.15 07:27 Сейчас в теме
(3) Артано, Ну тогда уж лучше "Нет времени объяснять, качай все файлы" :)
5. mpudy 24.08.15 08:16 Сейчас в теме
Консоль в которой проверяется запрос - лол.
6. ser6702 176 24.08.15 09:51 Сейчас в теме
Коллеги, задачка только для того чтобы размять мозги. Задавалась на собеседовании. На мисте обсуждалось как ее решить. Было сказано, что решение выложено на инфостарте. Но как такого решения не было. Дополнил пробел.
7. Cooler 22 24.08.15 10:30 Сейчас в теме
8. ser6702 176 24.08.15 10:54 Сейчас в теме
может кому то поможет пройти собеседование
11. TODD22 20 24.08.15 11:29 Сейчас в теме
(8)
может кому то поможет пройти собеседование

За это спасибо. Но там где дают такие задачи делать скорее всего нечего.
16. ser6702 176 24.08.15 14:59 Сейчас в теме
(11) значит в R-Stily делать Вам нечего
20. TODD22 20 24.08.15 15:56 Сейчас в теме
(16) И что такое R-style? Я что то не в курсе.
Гугл говорит что есть такой "системный интегратор", но я у них вакансии 1сника не увидел.
ojiojiowka; +1 Ответить
22. ser6702 176 25.08.15 08:30 Сейчас в теме
9. ser6702 176 24.08.15 10:57 Сейчас в теме
И в данной ветке вы только разминали мозги
а здесь предложно конкретное решение. Рабочее. Быстрое. А мозги размять размяли - но результат как обычно российский))) языками почесать
10. ser6702 176 24.08.15 10:59 Сейчас в теме
7 - и решены ваши сомнения в том, что задачка решается одним запросом
12. ildarovich 7959 24.08.15 12:35 Сейчас в теме
Не хватает ссылки на исходное обсуждение:
Задачка про оптимальный запрос.

В комментарии /17/ того обсуждения я приводил свое решение. Оно довольно простое. Повторю его здесь:

ВЫБРАТЬ
    0 КАК Х
ПОМЕСТИТЬ Число0_1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    1
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Инь.Х + 2 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_3
ИЗ
    Число0_1 КАК Инь,
    Число0_1 КАК Янь
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Инь.Х + 4 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_15
ИЗ
    Число0_3 КАК Инь,
    Число0_3 КАК Янь
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Инь.Х + 16 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_255
ИЗ
    Число0_15 КАК Инь,
    Число0_15 КАК Янь
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Инь.Х + 256 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_65535
ИЗ
    Число0_255 КАК Инь,
    Число0_255 КАК Янь
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Число.Х КАК По70,
    ВЫБОР
        КОГДА &НужноМетров <= Число.Х * 70
            ТОГДА 0
        ИНАЧЕ ВЫРАЗИТЬ((&НужноМетров - Число.Х * 70) / 30 + 0.499999 КАК ЧИСЛО(10, 0))
    КОНЕЦ КАК По30,
    Число.Х * 70 + ВЫБОР
        КОГДА &НужноМетров <= Число.Х * 70
            ТОГДА 0
        ИНАЧЕ ВЫРАЗИТЬ((&НужноМетров - Число.Х * 70) / 30 + 0.499999 КАК ЧИСЛО(10, 0))
    КОНЕЦ * 30 - &НужноМетров КАК Остаток
ПОМЕСТИТЬ Варианты
ИЗ
    Число0_65535 КАК Число
ГДЕ
    Число.Х <= &Остаток70
    И ВЫРАЗИТЬ((&НужноМетров - Число.Х * 70) / 30 + 0.499999 КАК ЧИСЛО(10, 0))<= &Остаток30
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Варианты.По70,
    Варианты.По30,
    Варианты.Остаток
ИЗ
    Варианты КАК Варианты
ГДЕ
    Варианты.Остаток В
            (ВЫБРАТЬ
                МИНИМУМ(Варианты.Остаток)
            ИЗ
                Варианты)
Показать


В статье другое решение?
13. omut 24.08.15 13:02 Сейчас в теме
(12) ildarovich, все верно. Строим заведомо достаточное поле сочетаний и просто выбираем наиболее подходящий под условия задачи. Но в целом и правда не ясно, зачем делать все одним запросом, накладывая - пусть и теоретическое - ограничение на максимально возможную сумму комбинации. По идее, можно ведь и текст запроса генерировать в обработке динамически (например, ограничив уже практической необходимостью максимальные значения по остаткам на складе и соотношению длин бухт и общей необходимой длины. Т.е. совсем просто соединив две таблицы, в одной из которых последовательность длин по первой номенклатуре, во второй - по второй и высчитав отклонение результата по модулю. Формально задача решена (запрос один), но сам запрос будет разный в зависимости от исходных данных. Зато на все случаи жизни.
Поэтому, можно согласиться с (11)
14. ildarovich 7959 24.08.15 14:01 Сейчас в теме
(13) omut, я против "тупого" лишнего перебора. Когда типоразмеров бухт ДВА, то выбрав число бухт-семидесяток, мы однозначно получаем нужное число бухт-тридцаток. То есть задача очень простая: ОДНОМЕРНАЯ.
В моем запросе "цикл" поиска делается по бухтам бОльшей размерности, чтобы сократить число "итераций". То есть запрос максимально быстрый. Такой же подход нужно применять при решении задачи в коде.

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

Кстати, запрос не обязательно строить динамически:
в статье Запрос-комбинатор показано, как "скомбинировать", например, длины бухт для нахождения решения перебором.
18. ser6702 176 24.08.15 15:02 Сейчас в теме
(14) Дело в том, что можно предложить клиенту варианты... сколько бухт какой размерности он может взять, чтоб набрать нужную длину. может он предпочтет взять примерно равное количество разных бухт. Или одну бухту одной длинны, а остальные все другие
19. ildarovich 7959 24.08.15 15:33 Сейчас в теме
(18) любую задачу теоретически можно решить перебором. Можно сложить радиодетали в ящик и трясти его пока не получится телевизор. Вопрос в том, сколько это займет времени.
Знание закономерностей сокращает перебор. Иногда, как в данной задаче, весьма существенно. Игнорирование закономерностей (тупой подбор, а не вычисление количества бухт второй размерности) - это бессмысленное прожигание времени. Даже если это работает на текущих данных, может не работать (слишком долго работать) в других случаях.
Для примера задайте требуемую длину 4587450 метров. - Сколько ваша обработка потратит времени на нахождение ответа (пусть текущие остатки это допускают)? - А мой запрос? - Сравните и сделайте выводы!
Было бы легче общаться, если бы ваш запрос (или результат построения запроса) был приведен прямо в статье. А так остается только предположения строить о том, что на самом деле вы имеете ввиду.
21. omut 24.08.15 15:59 Сейчас в теме
(19) ildarovich, я, видимо, не совсем ясно выразился в части "перебора". Перебор подразумевает создание таблицы не так, как в вашем случае (создание последовательности чисел от 1 до n), а через создание текста запроса, который выдаст эту последовательность от 1 до заданного n. Не велика разница за исключением того, что вы получаете заранее известное максимальное значение числа, полученную таблицу потом ограничиваете через условие (но таблица все равно изначально создана полная). В предложенном мной варианте таблица ограничена изначально нужным числом. Вы тоже можете добавить такое ограничение на этапе формирования Число0_65535 через сравнение Х с максимально необходимым. Это будет некоторой оптимизацией.
23. ser6702 176 25.08.15 09:19 Сейчас в теме
(19) - да, на этих данных работать будет долго
Но с практической точки зрения сколько в реальности может быть бухт на складе? Ну пусть по несколько тысяч...
какая тогда разница по скорости выполнения между запросам?
17. ser6702 176 24.08.15 15:00 Сейчас в теме
(13) да - именно по такому пути решена задачка
15. ser6702 176 24.08.15 14:57 Сейчас в теме
(12) решение похожее. Но не такое ).
Оставьте свое сообщение