|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
В http://www.sql.ru/forum/1198634-17/o-sap обсуждался вопрос, насколько 1С готова к БОЛЬШИМ внедрениям (насколько хорошо масштабируется). В процессе обсуждения выявили как минимум одну задачу, которую нельзя решить при использовании распределенных баз - это резервирование на нескольких складах. Эту задачу нормально можно решить только при одной централизованной базе. Но возник вопрос - а насколько эта задача решается штатными средствами 1С? То есть решить эту задачу в 1С можно - путем написания кода на SQL. Но это не совсем феншуйный вариант. А при использовании только штатных инструментов 1С лично мне не очень понятно, как вызывать модуль пересчета резервов, чтобы была приемлемая скорость работы и не было блокировок. Так как описание алгоритма резервирования может пригодиться и само по себе - подробно расписал мой вариант алгоритма и выкладываю в отдельной теме (в следующих сообщениях). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 14:16 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Вот описание в гугл доках: https://drive.google.com/open?id=1WDSbfBZmql-Blz_wCgy5QUHx5xbJ2cthoEcVN6E5gAw ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 14:20 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Описание задачи В таких сферах деятельности, как: торговля запчастями (автомобильные запчасти, запчасти для промышленного оборудования, запчасти для сельскохозяйственной и строительной техники и т.д.); торговля компьютерами, серверами и комплектующими; торговля комплектующими и материалами для систем отопления, водопровода, канализации у многих компаний есть сеть региональных складов (магазинов, филиалов) и нет возможности на каждом региональном складе держать весь ассортимент товаров в количестве, достаточном для выполнения всех заказов (широкая номенклатура продаваемых товаров и/или слишком много оборотных средств будет заморожено). Поэтому у таких фирм имеется один или несколько центральных складов с большим ассортиментом и объемом запасов. Стандартной является ситуация, когда для выполнения многих заказов продажи часть товаров приходится привозить на региональный склад с центрального склада или покупать у поставщиков. Для большинства клиентов этих фирм важно получить товар как можно раньше (в идеале - немедленно). При оформлении заказа покупателя необходимо рассчитать минимально возможный срок поставки, согласовать этот срок с клиентом и при выполнении поставки выдержать обещанные клиенту сроки поставки. Если часть товара нужно привезти с других складов и/или закупить у поставщика, то надо эти товары зарезервировать. Если не резервировать - есть риск, что эти товары будут отгружены другим покупателям, и срок поставки по заказу продажи будет нарушен. Поэтому для таких фирм не подходит система резервирования, когда товар резервируется только на складе филиала (локальном складе). Как выглядит типичный “идеальный” бизнес процесс продажи в таких фирмах: 1. Клиент делает заказ - согласовывается номенклатура, количество, цена и срок поставки. 2. Заказ утверждается к исполнению (проверяется задолженность, кредитный лимит, поступление предоплаты и т.п.). 3. В случае, если не весь товар есть в наличии - отдел закупок создает заказ закупки у поставщика. 4. Отдел логистики перемещает все товары по заказу клиента на склад, откуда будет выполняться отгрузка (обычно склад филиала). Товар может перемещаться или с центрального склада, или со складов других филиалов. 5. При поступлении всего товара по заказу клиента на склад филиала - клиенту отсылается сообщение, что можно забрать товар или планируется доставка до клиента. 6. Товар отгружается клиенту, и на этом заказ считается выполненным. В идеальном случае менеджер по продажам вообще никак не участвует на этапах 2-6. Он не должен звонить в отдел закупок и напоминать, что надо закупить товар под заказ клиента, не должен звонить логистам и напоминать, чтобы сделали перемещение между складами, не должен регулярно спрашивать у кладовщика, приехал ли товар и т.п. Следовательно, механизм резервирования товаров должен быть интегрирован с модулем закупки товаров у поставщиков и с модулем межскладских перемещений. Отдельно необходимо обрабатывать ситуации поставок под заказ крупных партий товара. Например, есть 30 штук товара на складах при среднем объеме продаж 5-7 штук в месяц. Клиент заказывает 100 штук товара. Это количество можно заказать у поставщика, и товар прибудет через 2 месяца. Если мы зарезервируем весь имеющийся товар на складе, то в течении этих двух месяцев не будет доступного товара для других покупателей. В таких ситуациях необходимо, чтобы резерв в 100 штук сформировался на складах фирмы после прихода от поставщика товаров, заказанных именно под этого клиента. При реализации резервирования необходимо не допустить следующих типичных проблем: Потери резервов. Во многих системах могут возникать ситуации, когда товар, который должен быть зарезервирован за одним клиентом, отгружается другому клиенту, и система не блокирует такую отгрузку. Часто такие ситуации возникают при перемещениях товара (приход товара от поставщика, приход товара при межскладских перемещениях) или при выявлении отклонений факта от документов (по факту пришло не то количество или не тот товар, который указан в документах перемещения или покупки). Сложности с выполнением складских операций. Если кладовщик обнаружил недостачу или бракованную деталь, модуль резервирования не должен мешать перемещению этой детали на склад “недостачи” или на склад “брак”. Но надо отслеживать, чтобы при таких операциях не терялись резервы. Длительное время расчета резервов (несколько минут) и блокировки. Если резервы считаются дольше, чем несколько секунд, это вызывает массу негативных эмоций как у пользователей системы, так и у клиентов. Часто расчет резервов блокирует других пользователей. И самое неприятное в блокировках и длительном времени расчета - расчет резервов в некоторых случаях вообще не выполняется (надо запускать заново) или выполняется с ошибками, что приводит к потерям резервов по некоторым заказам покупателей. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 14:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Описание алгоритма Резервирование выполняется для строк заказов продажи. Каждая строка может иметь один из следующих статусов, влияющих на резервирование: не резервировать только резервировать резервировать и перемещать резервировать, перемещать и закупать Также каждая строка имеет один из двух типов закупки обычная закупка поставка под заказ Каждая строка заказа, которую необходимо резервировать, имеет “приоритет резервирования”. Например, если резерв под заказ клиенту Петрову был создан раньше, чем резерв под заказ клиенту Иванову, то приоритет строки заказа Петрова будет выше, чем приоритет заказа Иванова. Предварительно для каждого склада, с которого предполагается отгрузка, необходимо составить список мест, где можно резервировать товар, упорядоченный по увеличению времени доставки. Отслеживаем любое из двух событий: Количество, которое должно быть зарезервировано для строки заказа продажи, не соответствует фактическому резерву. Например, по строке были созданы резервы, потом строку перевели в статус “не резервировать”, количество к резервированию равно нулю, но резервы есть. Или создали новую строку заказа покупателя со статусом “только резервировать” и количеством 10 - количество к резервированию равно 10, а фактически зарезервировано 0. Изменение количества товара в одном из мест, где можно резервировать товар (переместили товар на склад “Брак”, создали межскладское перемещение, перевели заказ поставщику в статус подтвержденного и т.п.). При появлении любого события создаем правильные резервы по товару: Находим все остатки, в которых можно резервировать товар. Создаем резервы под документы перемещения. Находим все строки заказов “поставка под заказ”, по которым нет учтенного поступления от поставщика. Если не создан заказ закупки у поставщика, то создаем строки резервирования с типом “необходимо закупить” Если создан заказ закупки у поставщика, то создаем строки резервирования в заказе закупки Находим строку заказа продажи, для которой еще не созданы резервы, и приоритет резервирования которой максимальный из еще не зарезервированных строк. Сортируем все остатки, уменьшенные на уже зарезервированное количество, по приоритету для данного склада (куда нужно доставить товар для отгрузки клиенту). Создаем строки резервов под строку заказа покупателя - резервируем по максимуму остаток с максимальным приоритетом (минимальным временем доставки), если осталось не зарезервированное количество - в следующем по приоритету остатке и т.д. Если свободных (не зарезервированных) остатков не хватило - создаем резерв с типом “необходимо закупить” (этот “резерв” не привязан ни к какому остатку и формально резервом не является, но в результате количество в резерве равно количеству в строке заказа) Проверяем, есть ли еще не зарезервированные строки заказов покупателей с данным товаром. Если есть - переходим к пункту 4 (цикл), если нет - завершаем расчет резервов. В результате у нас есть корректный список резервов. Если отфильтровать резервы, у которых тип места резервирования = склад и место назначения <> место резервирования и статус равен “резервировать и перемещать” или “резервировать, перемещать и закупать”, то получим список товаров для формирования межскладских перемещений под заказы клиентов. Если отфильтровать резервы с типом “необходимо закупить” и статус равен “резервировать, перемещать и закупать”, то получим список товаров для закупки у поставщиков. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 14:22 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Вариант реализации алгоритма Несколько пояснений к алгоритму: Модуль резервирования создавался для MS Dynamics NAV. Реализовать алгоритм на языке бизнес логики NAV (C/AL) c приемлемой скоростью работы не получалось - слишком медленно происходили пересчеты. Поэтому был использован T-SQL. Сам код выкладывать не очень корректно (там много специфических для конкретной фирмы вещей), поэтому привожу обобщенное “описание” кода без несущественных подробностей. Можно сделать вариант реализации для “ванильной” версии NAV, но это требует времени. При реализации одним из основных требований была минимизация блокировок. Расчет резервов всегда выполняется с нуля. Строки резервирования, которые были сформированы раньше, просто удаляются. Такой вариант выбран по той причине, что проверить существующие резервы, найти, что надо изменить в строках резервирования, удалить ненужные строки и создать и записать новые строки требует больше ресурсов (времени), чем каждый раз рассчитывать строки резервов с нуля. Вызов модуля расчета резервов должен вызываться асинхронно, иначе будут проблемы с блокировками. Рассматривал вариант с сообщениями, но при этом усложнялась логика работы. Остановился на другом варианте. Джоб каждую секунду запускает хранимую процедуру, которая пересчитывает резервы. Это оказалось самым простым и надежным вариантом. SQL Server 2008 R2 не может запускать джоб на выполнение каждую секунду, он может запускать с периодичностью 10 секунд. Поэтому настроены 10 джобов, запускающих одну и ту же хранимую процедуру каждые 10 секунд, но время запуска каждого джоба сдвинуто по отношению к другим на 1 секунду. В результате хранимая процедура запускается на выполнение каждую секунду. Решение спорное, но работает без нареканий. Таблицы, созданные под модуль резервирования “Товары к пересчету” - список товаров, резервы по которым необходимо пересчитать. Поля: код товара, приоритет пересчета (1 или 2), ДатаВремя создания записи. “Товары в пересчете” - список товаров, резервы по которым сейчас пересчитывает один из запущенных экземпляров хранимой процедуры. Поля: код товара, ДатаВремя начала пересчета. “Надо зарезервировать” - список строк заказов продажи и перемещений (созданных, но не отгруженных со склада - отправителя), под которые надо сформировать резервы. Поля: ID потребности в резервировании приоритет резервирования (бигинт, чем меньше число - тем выше приоритет), тип документа резервирования, номер документа резервирования, номер строки документа резервирования, код склада назначения (откуда товар будет отгружен покупателю), код товара, надо пересчитать резерв (булево), статус резервирования, тип закупки, количество. “Резервы” - список резервов. Поля: код товара, тип места резервирования (склад, межскладское перемещение, заказ поставщику), код склада, номер межскладского перемещения, номер заказа поставщику, ID потребности в резервировании - в данной таблице является ссылкой на строку в таблице “Надо зарезервировать”, тип документа резервирования, номер документа резервирования, номер строки документа резервирования, код склада назначения (откуда товар будет отгружен покупателю), статус резервирования, тип закупки, количество. “Приоритет мест резервирования” - в каком порядке резервировать товары. Поля: код склада назначения (откуда товар будет отгружен покупателю), приоритет места резервирования (int, чем меньше - тем выше приоритет, для каждого склада назначения свой список приоритетов), тип места резервирования (склад, межскладское перемещение, заказ поставщику), код склада, код склада назначения межскладского перемещения, код склада поступления товаров по заказу поставщику. Эта таблица позволяет задать любой порядок приоритетов резервирования. Например, для регионального склада “Склад10” резервы должны формироваться в следующем порядке: Склад10 (сам региональный склад); перемещения на Склад10; ЦентральныйСклад; перемещения на ЦентральныйСклад; региональный Склад8; региональный Склад5; региональный Склад6; региональный Склад2; закупки у поставщиков с приходом на Склад10; закупки у поставщиков с приходом на ЦентральныйСклад. При этом, если в списке нет строк для каких либо мест резервирования, резервы там не создаются - на складах “Брак”, “Потери и излишки”, “Склад1”, “Склад4” и т.д. резервы под заказы покупателей с отгрузкой со “Склад10” не создаются, так как эти склады не указаны в таблице приоритетов для “Склад10”. Фактически, этот список приоритетов задает “стандартные” направления межскладских перемещений товаров. Вспомогательные модули функционала резервирования Отдельная хранимая процедура запускается раз в 5 секунд, и находит все товары, по которым с момента последней проверки выполнилось хотя бы одно из условий: были движения, были созданы новые межскладские перемещения, были созданы новые подтвержденные заказы поставщикам. При нахождении таких товаров они помещаются в таблицу “Товары к пересчету” с текущим временем и приоритетом 2. Если данные в строках межскладских перемещений не совпадают со строками в таблице “Надо зарезервировать”, то в таблице “Надо зарезервировать” создаются правильные строки к резервированию с приоритетом 0, а товары помещаются в таблицу “Товары к пересчету” с текущим временем и приоритетом 2. При создании новой строки заказа покупателя с одним из статусов, предусматривающим резервирование, создается строка в таблице “Надо зарезервировать”. Если строка заказа получает статус “не резервировать” и были строки в таблице “Надо зарезервировать” - они удаляются. Если изменилось количество для резервирование в строке заказа покупателя (отгрузили товар клиенту или изменили количество) - меняется и количество в таблице “Товары к пересчету”. Причем, если количество к резервированию уменьшилось - в существующей строке уменьшается количество, а если количество к резервированию увеличилось - создается новая строка в таблице “Товары к пересчету”. “Приоритет резервирования” присваивается из последовательности с шагом 1000. Также пользователи могут “обмениваться” резервами. Тот пользователь, у заказа покупателя которого приоритет выше (значение поля “приоритет резервирования” меньше) может передать весь свой резерв или часть другому заказу покупателя. При этом создаются новые строки в таблице “Товары к пересчету” с “промежуточными” значениями приоритетов резервирования (не кратными 1000) и “надо пересчитать резерв” = истина. Выполнить отгрузку товаров покупателю можно только в том случае, если резерв на складе, с которого выполняется отгрузка, больше или равен отгружаемому количеству. Каждую минуту проверяем таблицу “Товары в пересчете”. Если есть записи, созданные раньше, чем 5 минут назад, эти записи удаляются, а товары из этих записей помещаются в “Товары к пересчету” с приоритетом 1. Основной модуль резервирования Begin transaction Поиск товаров к пересчету резервов - проверяем таблицы “Надо зарезервировать” и “Резервы”. Если у строк в таблице “Надо зарезервировать” поле “надо пересчитать резерв” = истина, то добавляем товары из этих строк, которые еще не присутствуют в “Товары к пересчету” с приоритетом 1, в таблицу “Товары к пересчету” с приоритетом 1. Если уже была запись с приоритетом 2, то она удаляется, и создается запись с приоритетом 1. Строкам в таблице “Надо зарезервировать” с полем “надо пересчитать резерв” = истина изменяем значение этого поля на ложь. Если количество в таблицах “Надо зарезервировать” и “Резервы” не совпадают друг с другом (соединение по полю “ID потребности в резервировании”), то включаем эти товары в таблицу “Товары к пересчету”, если их еще там нет. Резервы по заказам продажи включаем с приоритетом 1, резервы под перемещения - с приоритетом 2. Если уже была запись с приоритетом 2 и есть несоответствие по резервам заказа продажи, то запись с приоритетом 2 удаляется, и создается запись с приоритетом 1. Commit Begin transaction Отбираем товары для пересчета резервов Отбираем первые 100 записей (100 записей - ориентировочное значение, зависит от железа и настроек сервера СУБД и данных в системе - значение надо подбирать так, чтобы процедура завершалась в среднем не более чем за 1-2 секунды) из таблицы “Товары к пересчету”, отсортированные по возрастанию по полям “приоритет пересчета”, “ДатаВремя создания записи”, и отвечающих условию, что этих товаров нет в таблице “Товары в пересчете”, и помещаем во временную таблицу “Temp Товары к пересчету”. Все товары, которые есть в таблице “Temp Товары к пересчету” помещаем в таблицу “Товары в пересчете”. Все товары, которые есть в таблице “Temp Товары к пересчету” удаляем из таблицы “Товары к пересчету”. Commit Begin transaction Находим все остатки товаров из таблицы “Temp Товары к пересчету” на всех складах, в межскладских перемещениях и заказах поставщикам, и записываем во временную таблицу “Temp остатки”. Поля: код товара, тип места резервирования (склад, межскладское перемещение, заказ поставщику), код склада, номер межскладского перемещения перемещения, номер заказа поставщику, ДатаВремя ожидаемого выполнения (для заказа поставщику и межскладского перемещения - поступление на склад получатель) количество. Копируем во временную таблицу все строки, для которых необходимо создать резервы. Из таблицы “Надо зарезервировать” отбираем все строки, у которых “код товара” присутствует в таблице “Temp Товары к пересчету”, и копируем эти строки во временную таблицу “Temp Надо зарезервировать”. Поля те же, что и в таблице “Надо зарезервировать”: ID потребности в резервировании приоритет резервирования (бигинт, чем меньше число - тем выше приоритет), тип документа резервирования, номер документа резервирования, номер строки документа резервирования, код склада назначения (откуда товар будет отгружен покупателю), код товара, надо пересчитать резерв (булево), статус резервирования, тип закупки, количество. Commit. Все дальнейшие расчеты выполняются во временных таблицах, и процедура не блокирует работу остальных экземпляров процедуры расчета резервов или других модулей ERP системы. Begin transaction Создаем резервы под документы межскладского перемещения. Находим в таблице “Temp Надо зарезервировать” все строки с приоритетом 0 (такой приоритет устанавливаем для межскладских перемещений) и создаем под них резервы в таблице “Temp Резервы”. При этом надо проверять, что в документах перемещения количество меньше или равно остатку на складе. Создаем резервы для поставки под заказ. Находим все строки “Temp Надо зарезервировать” с типом “поставка под заказ” и помещаем в таблицу “Temp Надо зарезервировать под заказ”. Ищем в учтенных поступлениях от поставщика строки с такими заказами покупателей (под какой заказ покупателя была закупка - храним в привязке к строке заказа поставщику и к строке прихода от поставщика). Если нашли - уменьшаем количество к резервированию в строке “Temp Надо зарезервировать под заказ” на количество в приходах от поставщика; если в результате количество к резервированию ноль или меньше нуля - удаляем такие строки из “Temp Надо зарезервировать под заказ”. Ищем в “Temp остатки” строки с типом заказ поставщику, созданные под заказы покупателей из “Temp Надо зарезервировать под заказ” (дополнительно читаем данные - под какие заказы покупателей создана строка заказа поставщику). Если нашли - создаем строки “Temp Резервы” (резервируем в найденных строках “Temp остатки”) и уменьшаем количество к резервированию в строке “Temp Надо зарезервировать под заказ” на количество в приходах от поставщика; если в результате количество к резервированию ноль (все количество зарезервировали) - удаляем такие строки из “Temp Надо зарезервировать под заказ”. Для всех оставшихся количеств в строках таблицы “Temp Надо зарезервировать под заказ” создаем строки в “Temp Резервы” с типом “необходимо закупить” Основной цикл расчета резервов под заказы - начало. Для каждого товара находим строку “Temp Надо зарезервировать”, для которой еще не созданы все резервы, и приоритет резервирования которой максимальный из еще не зарезервированных строк. Для найденных строк “Temp Надо зарезервировать” находим все строки из “Temp остатки”, которые есть в списке приоритетов “Приоритет мест резервирования” для данного склада. Количество остатка уменьшаем на уже сформированные резервы из “Temp Резервы”. Если свободный остаток ноль - не включаем в список к резервированию. Сортируем по “приоритет места резервирования” и “ДатаВремя ожидаемого выполнения”. Создаем строки резервов в “Temp Резервы” - для каждой найденной строки из “Temp остатки” резервируем большее из значений - свободный остаток в данном месте резервирования или еще не зарезервированное количество из “Temp Надо зарезервировать”. Если осталось не зарезервированное количество - резервируем в следующем по приоритету свободном остатке и т.д. Если свободных (не зарезервированных) остатков не хватило - создаем на не зарезервированное количество резерв в “Temp Резервы” с типом “необходимо закупить”. Проверяем, есть ли строки в таблице “Temp Надо зарезервировать под заказ”, количество в которых больше количества в созданных под эту строку строках в “Temp Резервы”. Если есть - переходим к пункту 14 (цикл). Основной цикл расчета резервов под заказы - завершение. Commit Расчет резервов завершен. Записываем результат в общие таблицы. Begin transaction Удаляем все записи в таблице “Товары в пересчете” с товарами, которые есть в таблице “Temp Товары к пересчету”. Удаляем все записи в таблице “Резервы” с товарами, которые есть в таблице “Temp Товары к пересчету”. Копируем все записи из таблицы “Temp Резервы” в таблицу “Резервы”. Commit. Все расчеты резервов выполнены, все нужные таблицы обновлены. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 14:24 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov, подобного подхода (ежесекундный пересчет резервов с созданием заново) я не встречал ни в одной ERP. И даже в WMS не попадалось. Совершенно непонятно, зачем каждую секунду их пересчитывать, если необходимость пересчета можно отслеживать триггерами. У Вас каждую секунду 24*7 что-то происходит с запасами и заказами? Не верю. И уж точно не верю, что процент обновления статусов настолько высок, что пересоздавать резервы всякий раз заново выгоднее, чем работать "по отклонениям". Я делал подобную реализацию на 1С. Без ежесекундного пересчета. И с изменением только тех резервов (товарные позиции+склад) , по которым возникли события (заказы, закупки, перемещения). Естественно, строки заказов хранились не в документах (а в РС). И реальная строка заказа "расщеплялась" на несколько в зависимости от способа пополнения, партий закупки, складов резервирования. Не уверен, что моя реализация "потянула" бы большую контору, нас устраивало. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 15:36 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov... обсуждался вопрос, насколько 1С готова к БОЛЬШИМ внедрениям (насколько хорошо масштабируется). Нету там такого. Там только попытка сравнить 1С с САПом. Типа как сравнивать мерс и запорожец. s_ustinov... выявили как минимум одну задачу, которую нельзя решить при использовании распределенных баз - это резервирование на нескольких складах. Штатно - нельзя. Можно связать БД через триггер, но это уже шаманство. s_ustinovЭту задачу нормально можно решить только при одной централизованной базе. Но возник вопрос - а насколько эта задача решается штатными средствами 1С? Мы делали подобное на клюшках примерно в 2008 году. Все работало. Но опять же - число пользователей было около 100. Если в снеговике решили проблему с большим количеством пользователей и блокировками, то вероятно взлетит и на снеговике (утверждать небуду т.к. снеговиком не занимался и не планирую). Учитывая кривизну 1С я б не рискнул внедрять такое в большой конторе. Здоровье дороже. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 23:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Сисойs_ustinov, подобного подхода (ежесекундный пересчет резервов с созданием заново) я не встречал ни в одной ERP. И даже в WMS не попадалось. Совершенно непонятно, зачем каждую секунду их пересчитывать, если необходимость пересчета можно отслеживать триггерами. У Вас каждую секунду 24*7 что-то происходит с запасами и заказами? Не верю. И уж точно не верю, что процент обновления статусов настолько высок, что пересоздавать резервы всякий раз заново выгоднее, чем работать "по отклонениям". Запасы не пересчитываются каждую секунду. Каждую секунду идет проверка - есть ли товары, по которым надо пересчитать резервы. Если таких товаров нет - ничего не пересчитывается. И вы правы, именно этот вариант срабатывает в 99% запусков. Триггерами не получается нормально отслеживать. Триггер выполняется в той же транзакции, и если будет несколько срабатываний триггера примерно в одно и то же время - будут блокировки. И при этом я не смог придумать алгоритм, который при блокировках гарантированно не "потеряет" резерв. А пересоздавать проще не потому, что очень высокий процент обновлений статусов. Я ведь сознательно ВЕСЬ функционал расчета резервов переместил в один модуль, чтобы не было тормозов и блокировок, и при тех же отгрузках клиенту идет простая проверка, что резервов хватает (чтение из таблицы резервов), но сами резервы не пересчитываются (ничего в таблицу резервов не пишется). В результате учет документов выполняется существенно быстрее (нет пересчетов резервов) и нет блокировок, связанных с резервами. Но в результате полностью пересчитать резервы по товару проще, чем пытаться рассчитать изменения резервов. Например, есть 10 разных заказов с одним и тем же товаром. Под них создано 20 разных строк резервов. И вот на одном из складов, где был один из резервов, количество уменьшилось на 4 штуки (списали в брак / учли межскладское перемещение / отгрузили клиенту). Какой должен быть алгоритм, чтобы рассчитать изменения в резервах? СисойЯ делал подобную реализацию на 1С. Без ежесекундного пересчета. И с изменением только тех резервов (товарные позиции+склад) , по которым возникли события (заказы, закупки, перемещения). Естественно, строки заказов хранились не в документах (а в РС). И реальная строка заказа "расщеплялась" на несколько в зависимости от способа пополнения, партий закупки, складов резервирования. Не уверен, что моя реализация "потянула" бы большую контору, нас устраивало. А как именно выполнялось "изменением только тех резервов (товарные позиции+склад) , по которым возникли события (заказы, закупки, перемещения)"? Я в свое время не смог придумать нормальный алгоритм для таких ситуаций. Я уже описал ситуацию - есть несколько заказов. И например количество на складе уменьшилось (списали в брак). Если в результате на этом складе не хватает количества для резервирования, надо зарезервировать на другом складе - а там могут быть резервы по другим заказам с другим приоритетом. Как именно работает ваша реализация резервирования в такой ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 11:25 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Злой Бобрs_ustinov... выявили как минимум одну задачу, которую нельзя решить при использовании распределенных баз - это резервирование на нескольких складах. Штатно - нельзя. Можно связать БД через триггер, но это уже шаманство. Я на секунду представил несколько десятков территориально разнесенных баз, бизнес логика в которых связана через триггеры... Это не шаманство, это совсем другим словом называется. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 11:52 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Злой Бобрs_ustinov... обсуждался вопрос, насколько 1С готова к БОЛЬШИМ внедрениям (насколько хорошо масштабируется). Нету там такого. Там только попытка сравнить 1С с САПом. Типа как сравнивать мерс и запорожец. Есть там такое. Точно были фразы, что 1С ERP из коробки поддерживает до 1000 пользователей, а если надо больше - можно сделать распределенные базы. А это уже большие внедрения. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 11:58 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovЭто не шаманство, это совсем другим словом называется. Согласен. Просто вариант такой может быть. Естественно вазелином придется запастись впрок. s_ustinovЕсть там такое. Точно были фразы, что 1С ERP из коробки поддерживает до 1000 пользователей, а если надо больше - можно сделать распределенные базы. А это уже большие внедрения. Вы конечно можете продолжать верить в рекламу 1С, но практика показывает что далеко не все так просто. Я вовсе не хочу сказать что у 1С все хреново. Например формоклепание даже офис мелкомягких подвинули. Плюс еще пару моментов. Но в остальном - это такая стремная поделка, что ... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 14:16 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Злой Бобрs_ustinovЕсть там такое. Точно были фразы, что 1С ERP из коробки поддерживает до 1000 пользователей, а если надо больше - можно сделать распределенные базы. А это уже большие внедрения. Вы конечно можете продолжать верить в рекламу 1С, но практика показывает что далеко не все так просто. Я вовсе не хочу сказать что у 1С все хреново. Например формоклепание даже офис мелкомягких подвинули. Плюс еще пару моментов. Но в остальном - это такая стремная поделка, что ... Я как раз не верю в рекламу. В той ветке форума были отдельные утверждения, что 1С готов к крупным внедрениям. Лично я такого не говорил и в это не верю. Хотя могу ошибаться, последние лет 5 новинки 1С активно не смотрел - но всё равно не верю, слишком много 1С наклепала у себя велосипедов, от которых не желает отказываться. И в качестве возможного решения проблем с масштабируемостью 1С упоминались распределенные базы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 14:47 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Кстати, если кто делал аналогичные вещи (в любой из систем) - поделитесь деталями. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 15:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
startegПардон , не удержался. Если вы сразу пересчитываете резервы, в момент приема заказа, то есть риск наступить на следующий косяк: 1. Всего есть 100 единиц Т1 2. На заказ Петрова зарезервировали с 100 Т1 (резерв пересчитался - заказ не закрыт) 3. Иванов хочет зарезервировать 50 Т1, но его нет (все у Петрова в резерве) 4. Иванов закрыл заказ 5. Петров отказался от Т1 вообще (резерв пересчитался заказ закрыт!) 6. 100 единиц Т1 - все еще доступны для заказа :-) Есть две возможности уменьшить риск такого косяка: 1. Обычно первым оформляется запрос (заявка / предварительный заказ / Quote - называют по разному). В навике это отдельный тип документа Quote, в мы 1С делали дополнительный статус для документа "Заказ". С помощью этого документа можно посчитать общую цену с учетом скидок и посмотреть наличие товара (сколько есть незарезервированного товара и на каких складах), но товар не резервируется. И только если клиента всё устраивает - из квоты создается заказ. И только иногда (например, для постоянных клиентов) сразу создается заказ с резервированием строк. То есть резервы создаются тогда, когда риск отказа от заказа небольшой. 2. По каждому товару можно установить максимальное количество, которое может быть зарезервировано одним заказом. Например, известны "желаемые" (которые должны быть по плану) остатки товара на всех складах. И устанавливаем максимальное количество резервирования по одному заказу покупателя 20% от общего желаемого количества остатков. Если надо больше - оформляется поставка под заказ. В особых случаях директор филиала (согласовав с менеджером этой группы товаров) может оформить резерв на большее количество, но это исключение. В результате косяки, когда одному клиенту оформили резерв, по этой причине отказали другому клиенту, а потом первый клиент отказался - встречаются относительно редко. Хотя полностью исключить такие косяки нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2017, 16:43 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovstartegПардон , не удержался. Если вы сразу пересчитываете резервы, в момент приема заказа, то есть риск наступить на следующий косяк: 1. Всего есть 100 единиц Т1 2. На заказ Петрова зарезервировали с 100 Т1 (резерв пересчитался - заказ не закрыт) 3. Иванов хочет зарезервировать 50 Т1, но его нет (все у Петрова в резерве) 4. Иванов закрыл заказ 5. Петров отказался от Т1 вообще (резерв пересчитался заказ закрыт!) 6. 100 единиц Т1 - все еще доступны для заказа :-) Есть две возможности уменьшить риск такого косяка: 1. Обычно первым оформляется запрос (заявка / предварительный заказ / Quote - называют по разному). В навике это отдельный тип документа Quote, в мы 1С делали дополнительный статус для документа "Заказ". С помощью этого документа можно посчитать общую цену с учетом скидок и посмотреть наличие товара (сколько есть незарезервированного товара и на каких складах), но товар не резервируется. И только если клиента всё устраивает - из квоты создается заказ. И только иногда (например, для постоянных клиентов) сразу создается заказ с резервированием строк. То есть резервы создаются тогда, когда риск отказа от заказа небольшой. 2. По каждому товару можно установить максимальное количество, которое может быть зарезервировано одним заказом. Например, известны "желаемые" (которые должны быть по плану) остатки товара на всех складах. И устанавливаем максимальное количество резервирования по одному заказу покупателя 20% от общего желаемого количества остатков. Если надо больше - оформляется поставка под заказ. В особых случаях директор филиала (согласовав с менеджером этой группы товаров) может оформить резерв на большее количество, но это исключение. В результате косяки, когда одному клиенту оформили резерв, по этой причине отказали другому клиенту, а потом первый клиент отказался - встречаются относительно редко. Хотя полностью исключить такие косяки нельзя. ну отлично 1. Всего есть 100 единиц Т1 2. На заказ Петрова ПРЕДзарезервировали 100 Т1 (резерв пересчитался? - заказ не закрыт) 3. Иванов хочет ПРЕДзарезервировать 50 Т1, но его нет? или есть? дальше события могут развиваться двумя путями: 4А. Предзарезервировали Т1 на оба заказа. 5А. Окончательно зарезервировали и продали и отгрузили 50 Т1 Иванову. 6А. С Петровым была согласована цена 100 Т1, при покупке 50 Т1 цена будет другая, но Петрову нужно именно 100 штук. А он уже тендер на поставку выиграл )))) 4Б. Та же история, что и в самом начале: Иванову отказали в предрезервировании. 5Б. Петров отказался от покупки 6Б. 100 единиц Т1 - все еще доступны для заказа :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 09:58 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Что точно будет работать! Опыт из производства скоропорта работающего с розницей Число операторов приема заявок от 10 и выше Предпосылки: а) скоропорт не производится в момент и доложен быть реализован быстро и желательно без остатка б) на первый план выходит планирование производства исходя из планируемого(!) объема заявок 1. У каждой торговой точки Заказчика есть волатильность, которая достаточно хорошо прогнозируется (по дням недели, датам выдачи зарплаты-аванса, праздникам) 2. Каждая точка заказывает(с учетом п.1 (!)) обычно одно и тоже количество 3. Есть крупные заказчики (точки) для которых отклонение от среднего количества заказа не является столь критичным, как для малых точек Подходы: Заказы на поставку принимаются заранее ( с учетом затрат времени на производство) Время приема заявок от крупных точек согласовывается заранее и устанавливается на максимально поздний срок есть договоренность с крупными торговыми точками о возможном изменении количества из заказов как в большую так и в меньшую сторону но не более 10% от среднего объема (как вариант!) Система должна мониторить заказы и предлагать для каждой торговой точки расчетное (обычное для этого дня, количество) После получения заказов от мелочи, остатки закрываются на крупные торговые точки Ну как-то так :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 11:56 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobну отлично 1. Всего есть 100 единиц Т1 2. На заказ Петрова ПРЕДзарезервировали 100 Т1 (резерв пересчитался? - заказ не закрыт) 3. Иванов хочет ПРЕДзарезервировать 50 Т1, но его нет? или есть? Если для Петрова зарезервировали товар - его на складе в свободном остатке нет _bobдальше события могут развиваться двумя путями: 4А. Предзарезервировали Т1 на оба заказа. 5А. Окончательно зарезервировали и продали и отгрузили 50 Т1 Иванову. 6А. С Петровым была согласована цена 100 Т1, при покупке 50 Т1 цена будет другая, но Петрову нужно именно 100 штук. А он уже тендер на поставку выиграл )))) Нет "предрезервирования". В свое время долго обсуждали такие вещи. Нельзя быть немного беременной, и товар не может быть "предрезервирован". Именно по описанной вами причине. Товар или зарезервирован, или нет. Для Иванова сформируется резерв с типом "надо закупить", и до тех пор, пока товар не приедет от поставщика или пока не отменят заказ Петрову - система не даст ничего отгрузить Иванову. _bob4Б. Та же история, что и в самом начале: Иванову отказали в предрезервировании. 5Б. Петров отказался от покупки 6Б. 100 единиц Т1 - все еще доступны для заказа :-) Именно так и должно быть. Неприятно, но если "Петрову нужно именно 100 штук. А он уже тендер на поставку выиграл", а уже "отгрузили 50 Т1 Иванову" - будет еще хуже. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 14:15 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov, какой то у вас черно-белый мир все зависит от ситуации, штрафных санкций, значимости клиента, характеристик заделов и т.д. для этого существуют политики резервирования, некоторые политики запросто могут разрешать нарушение обязательств по резервированию по другим политикам и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 14:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
ViPRos, правила нужны для того что бы можно было бы управлять алгоритмом оптимизации по заданным критериям с учетом деловых обычаев - и только, главное критерии ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 14:23 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
startegЧто точно будет работать! Опыт из производства скоропорта работающего с розницей Число операторов приема заявок от 10 и выше Предпосылки: а) скоропорт не производится в момент и доложен быть реализован быстро и желательно без остатка б) на первый план выходит планирование производства исходя из планируемого(!) объема заявок 1. У каждой торговой точки Заказчика есть волатильность, которая достаточно хорошо прогнозируется (по дням недели, датам выдачи зарплаты-аванса, праздникам) 2. Каждая точка заказывает(с учетом п.1 (!)) обычно одно и тоже количество 3. Есть крупные заказчики (точки) для которых отклонение от среднего количества заказа не является столь критичным, как для малых точек Подходы: Заказы на поставку принимаются заранее ( с учетом затрат времени на производство) Время приема заявок от крупных точек согласовывается заранее и устанавливается на максимально поздний срок есть договоренность с крупными торговыми точками о возможном изменении количества из заказов как в большую так и в меньшую сторону но не более 10% от среднего объема (как вариант!) Система должна мониторить заказы и предлагать для каждой торговой точки расчетное (обычное для этого дня, количество) После получения заказов от мелочи, остатки закрываются на крупные торговые точки Ну как-то так :-) Я со скоропортом не сталкивался... Алгоритм, который я описал, для скоропорта точно не сработает. Тут, как я понимаю, именно резервирования вообще нет, а есть планирование продаж (заказов) + производство под заказы (с возможностью для поставщика изменить заказ покупателя)... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 14:57 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovНо возник вопрос - а насколько эта задача решается штатными средствами 1С? То есть решить эту задачу в 1С можно - путем написания кода на SQL. Но это не совсем феншуйный вариант. А при использовании только штатных инструментов 1С лично мне не очень понятно, как вызывать модуль пересчета резервов, чтобы была приемлемая скорость работы и не было блокировок. Так как описание алгоритма резервирования может пригодиться и само по себе - подробно расписал мой вариант алгоритма и выкладываю в отдельной теме (в следующих сообщениях). От обычного резервирования в типовых решениях 1С ваше отличается тем, что в регистрах резервов нужно добавить измерения дата и способ резерва. Но ваше решение - очищать резервы при каждом пересчете очень спорное. Почему нельзя делать сторнирующие или корректирующие движения при изменениях. Например при уменьшении количества в одном из заказов клиента, сделать движение в минус по резервам и одновременно поискать размещение этой позиции в заказах поставщика у других заказов, движение в минус там и в плюс по складскому резерву ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 15:37 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
ViPRoss_ustinov, какой то у вас черно-белый мир все зависит от ситуации, штрафных санкций, значимости клиента, характеристик заделов и т.д. для этого существуют политики резервирования, некоторые политики запросто могут разрешать нарушение обязательств по резервированию по другим политикам и т.д. Такое вполне может быть, но я на практике не сталкивался с настолько сложными бизнес-процессами. Тот алгоритм, который я описал, реализует довольно примитивную логику: - Автоматическое резервирование - товар получает тот, под кого раньше создали резерв (FIFO) - "Ручное" управление резервами - резервы вручную перебрасываются с одного клиента на другого клиента. А чтобы резервировать с учетом приоритета клиентов или штрафных санкций... Я могу себе представить такой алгоритм, но у тех фирм, где работал, не было необходимости в таком усложнении. Все исключения из логики FIFO встречались относительно редко и решались в ручном режиме. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 15:58 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov _bob4Б. Та же история, что и в самом начале: Иванову отказали в предрезервировании. 5Б. Петров отказался от покупки 6Б. 100 единиц Т1 - все еще доступны для заказа :-) Именно так и должно быть. Неприятно, но если "Петрову нужно именно 100 штук. А он уже тендер на поставку выиграл", а уже "отгрузили 50 Т1 Иванову" - будет еще хуже. тогда поздравляю! ваш гениальный алгоритм практически полностью повторяет сильно усеченный документ "заказ" из 1С_УТ: там у заказа куча статусов, для вашего алгоритма хватит и части: заказан, зарезервирован, отгружен, доставлен ну и следующий вопрос: чем навик удобнее для написания логики на SQL по сравнению с 1С? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 16:55 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoderОт обычного резервирования в типовых решениях 1С ваше отличается тем, что в регистрах резервов нужно добавить измерения дата и способ резерва. Но ваше решение - очищать резервы при каждом пересчете очень спорное. Почему нельзя делать сторнирующие или корректирующие движения при изменениях. Например при уменьшении количества в одном из заказов клиента, сделать движение в минус по резервам и одновременно поискать размещение этой позиции в заказах поставщика у других заказов, движение в минус там и в плюс по складскому резерву Отличия с типовыми 1С не только в "измерения дата и способ резерва". Я переделывал типовое резервирование в УПП, и ограничился относительно небольшими изменениями. В результате получил те же проблемы, которые видел и у других - блокировки и как результат медленный расчет резервов (иногда) и потери резервов. Например при перемещении с центрального склада на склад филиала одновременно должен "переместиться" и резерв, и вот тут то и возникали проблемы (тормоза и потери резервов). Но там было немного пользователей и относительно немного заказов - проблемы возникали редко и это не было критичным. А в другой фирме (где навик) количество операций было на порядок больше. Изначально там было реализованно похожее решение - документы при учете переписывали резервы. И в один не очень прекрасный момент склад не смог отгрузить все перемещения, так как медленно учитывались отгрузки - кладовщики блокировали друг друга (пересчет резервов при учете перемещений). И пришлось придумывать другую реализацию - без блокировок . Заодно и проблему с "потерянными" резервами решили (она в старой реализации тоже была). А по поводу очищения резервов... У очищения есть небольшой плюс - размер таблицы с резервами не растет со временем, а только при росте оборотов (количества обрабатываемых заказов). Но это не было основной причиной выбора варианта с очисткой. Алгоритм с очисткой банально оказалось проще реализовать. И он оказался быстрее (по крайней мере первые пробные варианты). Попробуйте прописать алгоритм действий при событии "уменьшение количества в одном из заказов клиента", а потом при событии "уменьшение остатка на складе" (например при недостаче). Тогда будет видно, что если не сторнировать все старые резервы и считать новые резервы с нуля логика получается довольно сложная. А просто удалить старые резервы проще, чем найти резервы, которые надо сторнировать, создать сторнирующие записи и потом создать новые резервы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 17:41 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinov Именно так и должно быть. Неприятно, но если "Петрову нужно именно 100 штук. А он уже тендер на поставку выиграл", а уже "отгрузили 50 Т1 Иванову" - будет еще хуже. тогда поздравляю! ваш гениальный алгоритм практически полностью повторяет сильно усеченный документ "заказ" из 1С_УТ: там у заказа куча статусов, для вашего алгоритма хватит и части: заказан, зарезервирован, отгружен, доставлен И в какой же именно версии УТ реализовано автоматическое создание резервов на нескольких складах по определенным приоритетам? Не так, чтобы пользователь выбирал, где ему резервировать, а система сама всё резервировала? И чтобы при перемещениях резервы сохранялись? _bobну и следующий вопрос: чем навик удобнее для написания логики на SQL по сравнению с 1С? В решении проблемы с блокировками (тормоза и потери резервов). Сделать быстрый асинхронный пересчет резервов в навике проще - можно ЛЕГКО писать с помощью SQL прямо в таблицы навика. А вот как сделать что то с аналогичным результатом в 1С (не с помощью SQL - писать сиквелом в таблички БД, в которых "хранятся" регистры 1С мне как-то совсем не хотелось) я в свое время придумать так и не успел (перешел на другую работу). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 17:54 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovВ результате получил те же проблемы, которые видел и у других - блокировки и как результат медленный расчет резервов (иногда) и потери резервов. Например при перемещении с центрального склада на склад филиала одновременно должен "переместиться" и резерв, и вот тут то и возникали проблемы (тормоза и потери резервов). Зачем вы ставите в один ряд абсолютно независимые события, тормоза не могут являться причиной потери резервов, к этому может привести только ошибка в логике авторИ в один не очень прекрасный момент склад не смог отгрузить все перемещения, так как медленно учитывались отгрузки - кладовщики блокировали друг друга (пересчет резервов при учете перемещений). Взаимоблокировки это всегда ошибка в логике авторИ пришлось придумывать другую реализацию - без блокировок . Заодно и проблему с "потерянными" резервами решили (она в старой реализации тоже была). Как и в исходной ветке весь спор скатывается к сравнению блокировочников и версионников. Ответить на вопрос справится ли 1с с той нагрузкой, с которой у вас справляется навик сможет только реализация и испытание подобной системы резеруирования на платформе 1с. Но я не думаю, что будут какие то проблемы. авторПопробуйте прописать алгоритм действий при событии "уменьшение количества в одном из заказов клиента", а потом при событии "уменьшение остатка на складе" (например при недостаче).. Не вижу особой сложности, просто не нужно пытаться каскадно поменять все резервы, достаточно обработать существующие резервы, начиная с последнего. Если вы пообещали клиенту, что его заказ прибудет 10 числа, ничего плохого не произойдет, если резерв отмененного заказа на 5 число, достанется заказу, который был запланирован на 15 число Есть схемы резервирования, для которых без полного пересчета резервов не обойтись, например когда за определенный период должна соблюдаться некоторая пропорция отгрузок между группами клиентов, но в вашем случае это кажется излишним ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 21:29 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov _bobну и следующий вопрос: чем навик удобнее для написания логики на SQL по сравнению с 1С? В решении проблемы с блокировками (тормоза и потери резервов). Сделать быстрый асинхронный пересчет резервов в навике проще - можно ЛЕГКО писать с помощью SQL прямо в таблицы навика. А вот как сделать что то с аналогичным результатом в 1С (не с помощью SQL - писать сиквелом в таблички БД, в которых "хранятся" регистры 1С мне как-то совсем не хотелось) я в свое время придумать так и не успел (перешел на другую работу). 1. чем таблицы навика эскуэльнее таблиц 1С? То, что вы не разобрались в архитектуре хранения данных и не умеете отследить профайлером что куда пишется, это понятно...вопрос именно об эскуэльности таблиц ))) 2. что помешало хранить пересчитанные резервы в отдельной таблице? все равно функционал нетиповой, какая разница, с регистрами играться или завести просто SQL таблицу и спокойненько в нее пересчитывать....или регистр сведений, в который писать кодом SQL куда как проще, чем в остатки ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 21:42 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoders_ustinovВ результате получил те же проблемы, которые видел и у других - блокировки и как результат медленный расчет резервов (иногда) и потери резервов. Например при перемещении с центрального склада на склад филиала одновременно должен "переместиться" и резерв, и вот тут то и возникали проблемы (тормоза и потери резервов). Зачем вы ставите в один ряд абсолютно независимые события, тормоза не могут являться причиной потери резервов, к этому может привести только ошибка в логике s_ustinovИ в один не очень прекрасный момент склад не смог отгрузить все перемещения, так как медленно учитывались отгрузки - кладовщики блокировали друг друга (пересчет резервов при учете перемещений). Взаимоблокировки это всегда ошибка в логике В целом согласен - это ошибки логики. svcoders_ustinovИ пришлось придумывать другую реализацию - без блокировок . Заодно и проблему с "потерянными" резервами решили (она в старой реализации тоже была). Как и в исходной ветке весь спор скатывается к сравнению блокировочников и версионников. Ответить на вопрос справится ли 1с с той нагрузкой, с которой у вас справляется навик сможет только реализация и испытание подобной системы резеруирования на платформе 1с. Но я не думаю, что будут какие то проблемы. авторПопробуйте прописать алгоритм действий при событии "уменьшение количества в одном из заказов клиента", а потом при событии "уменьшение остатка на складе" (например при недостаче).. Не вижу особой сложности, просто не нужно пытаться каскадно поменять все резервы, достаточно обработать существующие резервы, начиная с последнего. Если вы пообещали клиенту, что его заказ прибудет 10 числа, ничего плохого не произойдет, если резерв отмененного заказа на 5 число, достанется заказу, который был запланирован на 15 число Есть схемы резервирования, для которых без полного пересчета резервов не обойтись, например когда за определенный период должна соблюдаться некоторая пропорция отгрузок между группами клиентов, но в вашем случае это кажется излишним Ок. Давайте обсудим конкретный пример. Три события происходят "почти одновременно", то есть с разницей в несколько миллисекунд. Событие 1. На "Склад А" учитывается поступление от поставщика, которое включает поступление 100 штук товара "Т". Событие 2. Со "Склад В" списывается 5 штук товара "Т" (обнаружили недостачу). Событие 3. В филиале "Склад С" учитывается заказ продажи (формируются резервы) на 15 штук товара "Т". Филиалу "Склад С" разрешено резервировать товары на "Склад С", "Склад В", "Склад А". При этом существует несколько других заказов продажи с товаром "Т", под которые сформированы резервы. В том числе резервы были и в заказе покупки, по которому идет поступление на склад (событие 1), и на "Склад В", на котором обнаружили недостачу (событие 2), и на "Склад С", где учитываем новый заказ. Каким, по вашему мнению, должен быть корректный (без ошибок логики) алгоритм резервирования и как он должен отработать в данном случае? svcoder Взаимоблокировки это всегда ошибка в логике ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 22:55 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovпропущено... В решении проблемы с блокировками (тормоза и потери резервов). Сделать быстрый асинхронный пересчет резервов в навике проще - можно ЛЕГКО писать с помощью SQL прямо в таблицы навика. А вот как сделать что то с аналогичным результатом в 1С (не с помощью SQL - писать сиквелом в таблички БД, в которых "хранятся" регистры 1С мне как-то совсем не хотелось) я в свое время придумать так и не успел (перешел на другую работу). 1. чем таблицы навика эскуэльнее таблиц 1С ? То, что вы не разобрались в архитектуре хранения данных и не умеете отследить профайлером что куда пишется, это понятно...вопрос именно об эскуэльности таблиц ))) Во первых, в 1С надо дополнительно ковыряться, чтобы определить, какие таблицы за что отвечают. Согласитесь, это уже сложнее, чем в навике - там ковыряться не надо. Во вторых, есть такая вещь, как изменение версии платформы 1С. Иногда версию менять надо (по разным причинам), а что может произойти при смене версии платформы вы, вероятно, и сами знаете. Ну и в третьих - а где вы вообще видели "таблицы 1С"? В конфигураторе их точно нет. И в документации 1С их тоже нет. Ну и смотрим "во вторых". Да и просто написать селект с "интуитивно понятными" названиями полей - удовольствие сильно ниже среднего. Можно, разумеется, сделать вьюшку и работать с ней. Но это всё лишний геморрой. _bob2. что помешало хранить пересчитанные резервы в отдельной таблице? все равно функционал нетиповой, какая разница, с регистрами играться или завести просто SQL таблицу и спокойненько в нее пересчитывать....или регистр сведений, в который писать кодом SQL куда как проще, чем в остатки Примерно так и собирались поступить, если не смогли бы найти возможность сделать штатными средствами 1С (реализовать полностью отдельный модуль с расчетами на SQL). Только это не настолько легко, как вы описываете. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 23:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovОк. Давайте обсудим конкретный пример. Три события происходят "почти одновременно", то есть с разницей в несколько миллисекунд. Событие 1. На "Склад А" учитывается поступление от поставщика, которое включает поступление 100 штук товара "Т". Событие 2. Со "Склад В" списывается 5 штук товара "Т" (обнаружили недостачу). Событие 3. В филиале "Склад С" учитывается заказ продажи (формируются резервы) на 15 штук товара "Т". Филиалу "Склад С" разрешено резервировать товары на "Склад С", "Склад В", "Склад А". Зачем вы вносите неопределенность в условия задачи? Если в начале алгоритма резервирования установить необходимые блокировки, все эти события очень даже упорядочены и их логика очевидна. При поступлении резервы в заказе заменяются на резервы склада, списание со склада меняет последние резервы со склада на следующие по доступности. Ну про заказ и так все понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2017, 23:50 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovВо первых, в 1С надо дополнительно ковыряться, чтобы определить, какие таблицы за что отвечают. Согласитесь, это уже сложнее, чем в навике - там ковыряться не надо В исходной ветки уже писали, что можно сделать парсер имет таблиц в нативный SQL с помощью функции платформы ПолучитьСтруктуруХраненияБазыДанных. Я вам больше скажу простейший триггер позволит выполнять команды SQL в одной транзакции с транзакцией платформы. s_ustinovВо вторых, есть такая вещь, как изменение версии платформы 1С. Иногда версию менять надо (по разным причинам), а что может произойти при смене версии платформы вы, вероятно, и сами знаете. Последние изменения в языке запросов происходили при переходе с 8.1 на 8.2 т.е. 8 лет назад. Из-за необходимости поддержки oracle, пришлось отказаться от некоторых конструкций, а для некоторых добавили ограничения s_ustinovНу и в третьих - а где вы вообще видели "таблицы 1С"? В конфигураторе их точно нет. И в документации 1С их тоже нет. Ну и смотрим "во вторых". Да и просто написать селект с "интуитивно понятными" названиями полей - удовольствие сильно ниже среднего. Можно, разумеется, сделать вьюшку и работать с ней. Но это всё лишний геморрой. см.п.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 00:03 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoders_ustinovОк. Давайте обсудим конкретный пример. Три события происходят "почти одновременно", то есть с разницей в несколько миллисекунд. Событие 1. На "Склад А" учитывается поступление от поставщика, которое включает поступление 100 штук товара "Т". Событие 2. Со "Склад В" списывается 5 штук товара "Т" (обнаружили недостачу). Событие 3. В филиале "Склад С" учитывается заказ продажи (формируются резервы) на 15 штук товара "Т". Филиалу "Склад С" разрешено резервировать товары на "Склад С", "Склад В", "Склад А". Зачем вы вносите неопределенность в условия задачи? Если в начале алгоритма резервирования установить необходимые блокировки , все эти события очень даже упорядочены и их логика очевидна. При поступлении резервы в заказе заменяются на резервы склада, списание со склада меняет последние резервы со склада на следующие по доступности. Ну про заказ и так все понятно А где оно, начало алгоритма резервирования, для события 1? И какие блокировки необходимо установить? При старте проведения поступления на склад? Или после проведения (записи в регистры) модуль резервирования вызывается отдельно? Если при старте проведения - то учет поступления может выполняться довольно долго (несколько сотен позиций + пересчеты резервов) - и всё это время остальные документы заблокированы... А если после проведения - то получится, что остатки уже обновлены, а резервы еще нет, и может вклиниться заказ покупателя (событие 3) и забрать резервы себе... Например, при старте учета поступления на склад блокируем регистр резервов для всех товаров, которые в этом поступлении. Но тогда мы не сможем учесть ни одного документа с этими товарами (перемещение между складами, списание, отрузка покупателю и т.п.) - ведь все эти документы должны менять резервы... А установив менее строгие блокировки можем получить в результате взаимные блокировки и потери резервов. Когда рассуждаешь "в принципе" - всё легко. А при попытке это реализовать проявляются нюансы... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 00:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoders_ustinovВо вторых, есть такая вещь, как изменение версии платформы 1С. Иногда версию менять надо (по разным причинам), а что может произойти при смене версии платформы вы, вероятно, и сами знаете. Последние изменения в языке запросов происходили при переходе с 8.1 на 8.2 т.е. 8 лет назад. Из-за необходимости поддержки oracle, пришлось отказаться от некоторых конструкций, а для некоторых добавили ограничения При чем тут язык запросов? Сама 1С ясно написала: http://v8.1c.ru/metod/faq2/answer.jsp?id=493]Как просмотреть структуру таблиц информационной базы? ... Для этого используется функция ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает информацию о структуре таблиц базы данных всех объектов конфигурации (в виде таблицы значений). ... ВНИМАНИЕ Полученная информация предназначается для административных задач обслуживания базы данных и анализа записей технологического журнала. Не рекомендуется использовать её для реализации какой-либо части прикладной функциональности . Я даже догадываюсь, почему не рекомендуется: http://downloads.v8.1c.ru/content//Platform/8_3_7_1845/1cv8upd.htm]Переход с предыдущей версии на версию 8.3.6 Конвертация конфигураций, информационных баз, внешних обработок и внешних отчетов при переходе от предыдущей версии к версии 8.3.6 не требуется. Для использования некоторых новых возможностей версии 8.3.6 необходимо отключить режим совместимости. При отключении и включении режима совместимости выполняется изменение структуры некоторых объектов базы данных . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 01:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoder, вас действительно не напрягает вариант с записью в таблицы 1С (которые создала платформа) с помощью SQL? Лично мне такой вариант совсем не нравится... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 01:08 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob, svcoder Не надо меня убеждать, что в 1С с помощью кода на SQL можно создать модуль резервирования - я знаю, что можно. Вопрос в другом - как можно реализовать резервирование штатными средствами 1С (в конфигураторе)? Естественно, реализовать без ошибок в логике и тормозов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 01:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov, а вы знаете, обычно после написания и внедрения нетипового функционала ни конфигурацию ни технологическую платформу НЕ ОБНОВЛЯЮТ ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 01:51 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bob, svcoder Не надо меня убеждать, что в 1С с помощью на SQL можно создать модуль резервирования - я знаю, что можно. Вопрос в другом - как можно реализовать резервирование штатными средствами 1С (в конфигураторе)? Естественно, реализовать без ошибок в логике и тормозов. а зачем? вы на навике штатными средствами без ошибок в логике и тормозов сделать этого не смогли воплотить практически любой замудреный алгоритм резервирования товара штатными средствами 1С (в конфигураторе) МОЖНО, но есть шанс налететь на тормоза все же надо отдавать себе отчет, что существуют ограничения, и некоторые процессы даже для очень небольшой компании невозможно воплотить на 1С ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 01:56 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinov, а вы знаете, обычно после написания и внедрения нетипового функционала ни конфигурацию ни технологическую платформу НЕ ОБНОВЛЯЮТ Знаю. Довольно много фирм до сих пор на 1С 7.7 Вы считаете, что это хорошо? Технический долг Да и в некоторых случаях платформу приходится обновлять... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 02:33 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobа зачем? вы на навике штатными средствами без ошибок в логике и тормозов сделать этого не смогли воплотить практически любой замудреный алгоритм резервирования товара штатными средствами 1С (в конфигураторе) МОЖНО, но есть шанс налететь на тормоза все же надо отдавать себе отчет, что существуют ограничения, и некоторые процессы даже для очень небольшой компании невозможно воплотить на 1С Когда разбирались с этой задачей в навике - почти сразу стало понятно, что средствами нава (на C/AL) эту задачу не решить - не хватит скорости. А когда начали разбирать такую же задачу в 1С (в другой фирме) - то всё было не столь очевидно. Платформа 1С намного больше фич содержит. Язык запросов, менеджер временных таблиц - вроде бы почти всё получалось... Да и навик подружить с сиквелом существенно проще и удобнее, чем 1С с сиквелом... Вот и думали, как это в 1С сделать... Потом я переехал, и, насколько знаю, резервирование до ума там так и не довели - кроме меня некому было на сиквеле писать, все остальные только с 1С работали. А меня до сих пор мучает вопрос - может, все же можно это в самой 1С сделать? Мы могли упустить какую-то возможность... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 03:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovА где оно, начало алгоритма резервирования, для события 1? И какие блокировки необходимо установить? При старте проведения поступления на склад? Или после проведения (записи в регистры) модуль резервирования вызывается отдельно? Если при старте проведения - то учет поступления может выполняться довольно долго (несколько сотен позиций + пересчеты резервов) - и всё это время остальные документы заблокированы... А если после проведения - то получится, что остатки уже обновлены, а резервы еще нет, и может вклиниться заказ покупателя (событие 3) и забрать резервы себе... При поступлении никаких алгоритмрв резервирования вызывать не нужно. Нужно перенести резервы из размещения заказа на склад. При списании нужно блокировать, но в чем проблема? Это не такая частая операция по сравнению с обычным порядком резерв-поступление-отгрузка. Вы пробовали использовать управляемые блокировки 1с? Они работают быстрее блокировок БД и гораздо позже эскалируются. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 10:09 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovsvcoder, вас действительно не напрягает вариант с записью в таблицы 1С (которые создала платформа) с помощью SQL? Лично мне такой вариант совсем не нравится... Я написал лишь что есть возможность общаться с таблицами 1с с помощью языка SQL не сложнее чем в навике, кому надо пусть использует. Но я против такого подхода, мне средств 1с достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 10:12 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoders_ustinovА где оно, начало алгоритма резервирования, для события 1? И какие блокировки необходимо установить? При старте проведения поступления на склад? Или после проведения (записи в регистры) модуль резервирования вызывается отдельно? Если при старте проведения - то учет поступления может выполняться довольно долго (несколько сотен позиций + пересчеты резервов) - и всё это время остальные документы заблокированы... А если после проведения - то получится, что остатки уже обновлены, а резервы еще нет, и может вклиниться заказ покупателя (событие 3) и забрать резервы себе... При поступлении никаких алгоритмрв резервирования вызывать не нужно. Нужно перенести резервы из размещения заказа на склад . При списании нужно блокировать, но в чем проблема? Это не такая частая операция по сравнению с обычным порядком резерв-поступление-отгрузка. Вы пробовали использовать управляемые блокировки 1с? Они работают быстрее блокировок БД и гораздо позже эскалируются. Перенос резервов - это тоже алгоритм резервирования. Просто перенести резервы не получится - поступление далеко не всегда равно заказу. Мы не в идеальном мире живем, и всегда можно наткнуться на разницы (пересортица, например). Поэтому резервы надо пересчитать. Вопрос - в какой момент использовать блокировки, чтобы не нарушить логику работы? Если вызвать слишком рано - автоматом появятся тормоза, так как резервы будут узким местом. Если чуть позже - риск взаимных блокировок и потери резервов. И управляемые блокировки в данном случае ничем не помогают. При детальном анализе у меня получилось, что единственный вариант с правильной логикой работы и без тормозов - асинхронный вызов пересчета резервов. Но как сделать это в 1С - не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2017, 13:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovДовольно много фирм до сих пор на 1С 7.7 Вы считаете, что это хорошо? я считаю что это замечательно, когда люди не тратят деньги на ненужные обновления софта как замечательный пример: система бронирования билетов в РЖД, система бронирования авиабилетов в США, обе написаны на коболе под AS/400 столетие назад, ну и знаменитая АБС Equation (PRG/400 под AS/400), в Альфа-банке радостно юзают и не жужжат а вы про 7.7....да хоть на Акцессе под Win_3.11, лишь бы софт удовлетворял потребности бизнеса и не требовал много денег на поддержку ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 11:38 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПри детальном анализе у меня получилось, что единственный вариант с правильной логикой работы и без тормозов - асинхронный вызов пересчета резервов. Но как сделать это в 1С - не понятно. вот вы, s_ustinov, холивар тут развели, 1с ругаете, а сами на 1С не умеете сделать элементарную весчь: организовать очередь с асинхронным разбором делюсь опытом: 1. делаем регистр сведений "задания_пересчитывателю", в нем ИД задания и несколько полей с сутью (артикул, склад где количество изменилось, еще ченить) 2. делаем регистр сведений "выполненные_пересчитывателем_задания", в нем ИД выполненных заданий ***попытка сделать все в один регистр наткнется на блокировки и будут тормоза (проверено на практике), поэтому оптимальностей придумывать не нужно 3. каждый документ, вызывающий пересчет, при проведении/отмене пишет в регистр "задания_пересчитывателю" чего там надо пересчитать 4. РЗ "пересчитыватель" которое по таймеру берет из регистров задания, пересчитывает резервы и записывает в регистр "выполненные_пересчитывателем_задания" ИД выполненных заданий, чтоб их второй раз не выполнять 5. РЗ "очистка_очереди_пересчитывателя" чистит по ночам или в период низкой активности старые записи в обоих регистрах схема эта успешно реализована и работает в качестве асинхронного обмена между УТ и четырьмя WMS (четыре склада, две разные системы WMS, резервирование в УТ происходит через подтверждение предварительного резервирования в WMS) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 11:54 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob, а зачем 2 разные wms? Или Вы склады арендуете вместе с wms? ps Сейчас как раз занимаюсь wms на базе axelot. Планирую на всех складах ее запустить. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 12:15 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Уважаемые коллеги. Поскольку я не являюсь специалистом 1С и MS Dynamics мне не совсем понятно почему в этой теме говорят о проблемах с блокировками и как следствие с "тормозами"? Как работает механизм блокировок? Есть ли возможность при обработке данных управлять транзакциями и уровнями изоляции транзакций? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 12:57 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПри детальном анализе у меня получилось, что единственный вариант с правильной логикой работы и без тормозов - асинхронный вызов пересчета резервов. Но как сделать это в 1С - не понятно. Если вам во время одной транзакции необходимо запустить другую транзакцию можно использовать механизм фоновых заданий. Если необходимо запустить процесс после выполнения транзакции - добавить регистр сведений и регламентное задание. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 13:10 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob, ну я никогда не утверждал, что крут именно как программист 1С В 1С у меня средний уровень. _bob4. РЗ "пересчитыватель" которое по таймеру берет из регистров задания , пересчитывает резервы и записывает в регистр "выполненные_пересчитывателем_задания" ИД выполненных заданий, чтоб их второй раз не выполнять А можно уточнить, как именно вы это сделали? Я думал использовать: Код: sql 1.
Но мне сказали, что это не будет работать так, как нужно. Нужно, чтобы каждую секунду запускался новый экземпляр процедуры пересчета резервов независимо ни от чего. Например в 11:40:10 запустился один экземпляр процедуры "ПересчитатьРезервы", в 11:40:11, не дожидаясь завершения предыдущего запуска, запустился еще один экземпляр процедуры "ПересчитатьРезервы", в 11:40:12 запустился третий экземпляр (при этом всё еще работает запущенный в 11:40:10, а например запущенный в 11:40:11 уже завершил работу) и т.д. Мне сказали, что так в 1С не будет параллельно выполняться несколько экземпляров процедуры "ПересчитатьРезервы". Или мне сказали неточные сведения, и ПодключитьОбработчикОжидания будет работать так, как надо для этой задачи? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 14:30 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobя считаю что это замечательно, когда люди не тратят деньги на ненужные обновления софта как замечательный пример: система бронирования билетов в РЖД, система бронирования авиабилетов в США, обе написаны на коболе под AS/400 столетие назад, ну и знаменитая АБС Equation (PRG/400 под AS/400), в Альфа-банке радостно юзают и не жужжат Одно дело, когда обновление не нужно. А другое дело, когда обновление очень нужно (новые фичи всем бы пригодились), но из-за "технического долга" перейти на новую версию очень дорого. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 14:48 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxУважаемые коллеги. Поскольку я не являюсь специалистом 1С и MS Dynamics мне не совсем понятно почему в этой теме говорят о проблемах с блокировками и как следствие с "тормозами"? Как работает механизм блокировок? Есть ли возможность при обработке данных управлять транзакциями и уровнями изоляции транзакций? Именно для резервирования на нескольких складах тема блокировок является ключевой. Если реализовывать алгоритм без логических ошибок "в лоб" - надо очень рано вызывать блокировки, и тогда пользователи будут постоянно блокировать друг друга - всё будет тормозить. А если попытаться блокировать данные попозже, чтобы уменьшить блокировки - начинаются логические ошибки (потери резервов). И в 1С, и в навике управлять блокировками можно... Но... В 1С сделали свой механизм управляемых блокировок, который работает "выше" транзакций СУБД, и программисту надо самому продумывать, что и в какой момент блокировать для обеспечения целостности данных. Автоматические блокировки в 1С тоже есть, но с ними масштабируемость совсем плохая. В навике блокировки автоматические на уровне MS SQL, сам нав только стартует транзакции. Из кода нава можно вызвать коммит, если принудительно надо разбить код на несколько транзакций. Но в наве проблема с масштабируемостью не связана напрямую с транзакциями. У многих таблиц есть поле "Entry No" - номер операции, которые идут последовательно по возрастанию - 1,2,3,4 и т.д. И этот номер генерируется кодом нав, а не автоинкремнтом СУБД... Так что всё печально... А уровнем изоляции транзакций, насколько знаю, ни там ни там управлять нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 15:06 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
svcoders_ustinovПри детальном анализе у меня получилось, что единственный вариант с правильной логикой работы и без тормозов - асинхронный вызов пересчета резервов. Но как сделать это в 1С - не понятно. Если вам во время одной транзакции необходимо запустить другую транзакцию можно использовать механизм фоновых заданий. Если необходимо запустить процесс после выполнения транзакции - добавить регистр сведений и регламентное задание. Регламентные задания наверно не подойдут - надо запускать одновременно много экземпляров, а, как я понимаю, с регламентными заданиями так нельзя. Фоновые задания возможно подходят, в том числе о них думал, но проверить не успел. Вот только меня смутило в описании фоновых заданий, что если их больше 1000 было, то лог чистится. А как вообще 1С будет себя вести, если одновременно запущенно несколько тысяч фоновых заданий (тысячи экземпляров процедуры)? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 15:47 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1с_bob, а зачем 2 разные wms? Или Вы склады арендуете вместе с wms? ps Сейчас как раз занимаюсь wms на базе axelot. Планирую на всех складах ее запустить. ну...если вас устраивает акселот, вашим работодателям остается только посочувствовать )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 16:23 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bob, ну я никогда не утверждал, что крут именно как программист 1С В 1С у меня средний уровень. _bob4. РЗ "пересчитыватель" которое по таймеру берет из регистров задания , пересчитывает резервы и записывает в регистр "выполненные_пересчитывателем_задания" ИД выполненных заданий, чтоб их второй раз не выполнять А можно уточнить, как именно вы это сделали? Я думал использовать: Код: sql 1.
Но мне сказали, что это не будет работать так, как нужно. Нужно, чтобы каждую секунду запускался новый экземпляр процедуры пересчета резервов независимо ни от чего. Например в 11:40:10 запустился один экземпляр процедуры "ПересчитатьРезервы", в 11:40:11, не дожидаясь завершения предыдущего запуска, запустился еще один экземпляр процедуры "ПересчитатьРезервы", в 11:40:12 запустился третий экземпляр (при этом всё еще работает запущенный в 11:40:10, а например запущенный в 11:40:11 уже завершил работу) и т.д. Мне сказали, что так в 1С не будет параллельно выполняться несколько экземпляров процедуры "ПересчитатьРезервы". Или мне сказали неточные сведения, и ПодключитьОбработчикОжидания будет работать так, как надо для этой задачи? Регламентные задания - это общие объекты конфигурации. Они являются частью механизма заданий и позволяют автоматически выполнять процедуры на встроенном языке по расписанию. ( http://v8.1c.ru/overview/Term_000000154.htm) Т.е. по расписанию, в отдельном потоке, независимо ни от чего выполняется написанный код. Если специально не изголяться, будет выполняться несколько параллельно выполняющихся РЗ. Но лучше (во избежание блокировок) выполнять их строго последовательно. Я напоминаю: в моем примере 1 экземпляр РЗ пересчитывает не один резерв, а все имеющиеся на данный момент задачи по очереди. коллега! я в прошлом посте намекал, теперь говорю прямо: вам рано спорить здесь, прочитайте учебник ДО КОНЦА и это при том, что я не только НЕ крут как прогер 1С, я написал от силы пару-тройку тысяч строк, я с 2006 года работаю ИТ-директором, однако УЧИТЬ МАТЧАСТЬ НЕОБХОДИМО, КУРСАНТ!!! Модератор: _bob, то, что Вы ИТ-директор, не дает Вам права переходить на личности. Вы получаете предупреждение. Прошу быть сдержаннее. Оппонентов - тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 16:31 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovНо мне сказали, что это не будет работать так, как нужно... Или мне сказали неточные сведения... мне м.с.горбачев по телевизору сказал, что к 2000 году каждая советская семья получит отдельную квартиру вам смешно? многим нет ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 16:35 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobПрограммист 1с_bob, а зачем 2 разные wms? Или Вы склады арендуете вместе с wms? ps Сейчас как раз занимаюсь wms на базе axelot. Планирую на всех складах ее запустить. ну...если вас устраивает акселот, вашим работодателям остается только посочувствовать ))))Все так плохо? ps Предыдущие 3 системы wms (не 1с) уже провалились... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 21:58 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1с_bobпропущено... ну...если вас устраивает акселот, вашим работодателям остается только посочувствовать ))))Все так плохо? ps Предыдущие 3 системы wms (не 1с) уже провалились... Акселотовскую ВМСку я внедрял в 2009 году в Альбе (обувь, опт и розница)...ну внедрили и внедрили, работало нормально ))) там главное подробно прописать весь необходимый функционал, а то у акселотов всегда оказывается, что если надо добавить небольшую фичу, например инвентаризацию, то для этого якобы полсистемы надо переворошить и данные перезаливать, потому что потому. и инструментария админского там нету от слова совсем....типа откатить кривую транзакцию только вручную тыком по регистрам...пришлось самим обработки писать. Доработки стоят очень дорого, внутри ОЧЕНЬ накручено, сами толком не разобрались, решили не рисковать, благо меня познакомили с уволенным экс-разрабом, он все дорабатывал, а то допилы обошлись бы нам дороже основного внедрения. Каждая версия акселота совершенно не похожа на предыдущую архитектурно, то ли каждый раз убеждаются в неудачности, то ли разработчики у них разбегаются и каждый раз другие. я бы посоветовал посмотреть WMS Arena сразу скажу, что я не совсем объективен, я эту систему доводил до ума и до коробочного состояния у арены гигантский плюс: система изначально написана и дорабатывается компанией TDM Electric, причем компания сама на этой системе работает. соответственно, все неудобности и шероховатости устраняются не потому что так надо клиентам, а потому что так надо им самим ))) ну и все вкусности, придуманные за 9 лет существования TDM, вошли в эту систему...ну и не пропадет никуда ни сама система, ни экспертиза ее доработок и эксплуатации изначально содрана наполовину с Exceed, наполовину с манхэттена, написана на 1С, правила, шаблоны и т.д. настраиваются в текстовых окнах без программистов и конфигураторов. на удивление нетребовательна: склад в 50 000 ячеек, 20 000 артикулов, 20 терминалов, 3 оператора фунциклировал на "сервере" в один четырехъядерник с 32 гигами ОЗУ крупнейшее внедрение: склады сети ОллГуд компания АвтоАльянс, та вообще внедрила у себя эту систему самостоятельно...все люди были брошены на ОллГуд, альянсу сказали что сейчас заниматься ими некому, максимум по телефону подсказать, так они сами справились еще из плюсов: можно обучать и стажировать своих складских прям на складе TDM, там народ опытный уже 9 лет на ней работает если интересно или будут вопросы, свяжитесь со мной, я вас с ведущим внедренцем познакомлю, он вам все покажет, расскажет и скидку предложит ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 23:52 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1с_bob, а зачем 2 разные wms? Или Вы склады арендуете вместе с wms? этому есть анекдотическое объяснение: какой-то злодей подсунул собственнику бизнеса книжку "1С Управление Торговлей в вопросах и ответах" мужик прочитал первые страниц 50, остальное додумал сам, книга очень понравилась, чел забил на торговлю и весь погрузился в ИТ, поперло внедрение "типового функционала", причем типовой функционал или не типовой определялось по оглавлению: если в оглавлении было что-то похожее, значит типовой на центральном московском складе было заваленное внедрение питерской какой-то странной ВМСки, которую надо было реанимировать, а на филиальные склады решили что ставить ее дорого и сначала сделали прям на УТ ячеистый склад, а потом, чтоб не мучиться, поставили арену из моего предыдущего поста вот тут-то и пригодился асинхронный обмен со сквозным резервированием по всем складам там вообще много безумных решений было, у шефа с фантазией и рабоспособностью очень круто было ))) здорово прокачал скилл "автоматизация бешеных идей и их внедрение без вреда для работоспособности системы" ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 00:31 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobЕсли специально не изголяться, будет выполняться несколько параллельно выполняющихся РЗ. Но лучше (во избежание блокировок) выполнять их строго последовательно. Я напоминаю: в моем примере 1 экземпляр РЗ пересчитывает не один резерв, а все имеющиеся на данный момент задачи по очереди. Скорость. Последовательное выполнение задач по очереди означает, что последнее в списке задание будет выполнено после выполнения всех предыдущих. Иногда это слишком долго. _bobколлега! я в прошлом посте намекал, теперь говорю прямо: вам рано спорить здесь, прочитайте учебник ДО КОНЦА Коллега, в настоящее время я читаю учебники по другим технологиям, и свободного времени на 1С нет. Да и не планирую в ближайшее время плотно работать с 1С. Что же касается споров, то спорил я только об одной вещи - о возможности использовать РИБ для любых задач (и соответствующим образом масштабировать систему). Но, насколько я вижу, все согласны, что конкретно для задачи резервирования использование РИБ противопоказано. Впрочем, апологеты " 1000 баз в РИБ" могут рассказать своё видение - я с удовольствием послушаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 11:57 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobтам вообще много безумных решений было, у шефа с фантазией и рабоспособностью очень круто было ))) здорово прокачал скилл "автоматизация бешеных идей и их внедрение без вреда для работоспособности системы" ))) сейчас вспомнил самую бешеную реализованную идею: внедрение WMS поэтапно: сначала внедрили прием и размещение, вторым этапом подбор, третьим контроль и консолидацию, ну и напоследок отгрузку длилось это "внедрение" полгода параллельно с переводом офиса с самописки на 1С_УТ и компания не только нормально функционировала, но и показатели улучшались (манагеры видели все более и более правильные остатки) ну и чтоб жизнь медом не казалась, задолженность клиентов сначала контролировалась в старой самописке (туда транслировались отгрузки), потом наоборот, из самописки в УТ транслировались оплаты, потом полностью перешли на УТ (в Москве) и начали переводить первый филиал с самописки на УТ ))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 12:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovСкорость. Последовательное выполнение задач по очереди означает, что последнее в списке задание будет выполнено после выполнения всех предыдущих. Иногда это слишком долго. для задачи резервирования уровень изоляции должен быть Read uncommitted, что фактически предопределяет ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений и от применяемой СУБД s_ustinovЧто же касается споров, то спорил я только об одной вещи - о возможности использовать РИБ для любых задач (и соответствующим образом масштабировать систему). Но, насколько я вижу, все согласны, что конкретно для задачи резервирования использование РИБ противопоказано. Впрочем, апологеты " 1000 баз в РИБ" могут рассказать своё видение - я с удовольствием послушаю. я убежденный противник РИБ, тем не менее, асинхронное дергание веб-сервисов решает эту проблему, только надо сделать резервирование двухфазным: запрос и собсно само резервирование и сделать брокер, который будет получать задание от одной базы и раскидывать его по всем остальным (тоже асинхронно), получать ответы и рапортовать базе, отправившей задание о выполнении ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 12:17 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovСкорость. Последовательное выполнение задач по очереди означает, что последнее в списке задание будет выполнено после выполнения всех предыдущих. Иногда это слишком долго. для задачи резервирования уровень изоляции должен быть Read uncommitted, что фактически предопределяет ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений и от применяемой СУБД Последовательное для каждого товара . Если нам надо создать резервы для 10 разных товаров, можно создать 10 очередей с последовательно выполняющимися транзакциями. Разумеется, есть вариант, когда мы резервируем не строки заказов, а заказы в целом (документы). И, например, при невозможности зарезервировать одну из строк заказа "откатываем" резервирование всего заказа. В таком варианте действительно - только одна очередь будет нормально работать. Но такая схема будет сильно тормозить и непонятно, как обрабатывать ошибки (например не нашли товар при пересортице или недостаче). Я видел однажды такую схему работы, но работало всё плохо, и эту схему планировали поменять. А что касается уровня изоляции... По моему мнению, в ERP системах всегда надо использовать только Serializable. В том числе и для резервирования. _bobs_ustinovЧто же касается споров, то спорил я только об одной вещи - о возможности использовать РИБ для любых задач (и соответствующим образом масштабировать систему). Но, насколько я вижу, все согласны, что конкретно для задачи резервирования использование РИБ противопоказано. Впрочем, апологеты " 1000 баз в РИБ" могут рассказать своё видение - я с удовольствием послушаю. я убежденный противник РИБ, тем не менее, асинхронное дергание веб-сервисов решает эту проблему, только надо сделать резервирование двухфазным: запрос и собсно само резервирование и сделать брокер, который будет получать задание от одной базы и раскидывать его по всем остальным (тоже асинхронно), получать ответы и рапортовать базе, отправившей задание о выполнении Можно, разумеется, и так сделать. Но скорость будет явно не реал тайм. И логика работы резервирования существенно усложняется. Особенно если надо автоматически обрабатывать обнаруженные отклонения в количестве (излишки / недостачи). По моему мнению, это всё из серии "создать себе трудности и потом их героически преодолевать". Подобную схему имеет смысл использовать для взаимодействия поставщик - покупатель при автоматическом подтверждении заказов покупки. И интегрировать с EDI. А для резервирования получается слишком сложно и медленно. Модератор: s_ustinov, Вы тоже получаете предупреждение за переход на личности. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 12:55 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov А что касается уровня изоляции... По моему мнению, в ERP системах всегда надо использовать только Serializable. В том числе и для резервирования. дада, крупнейший аптечный дистрибьютор США именно так и поступил, когда с самописки на САП перешел (Serializable, как сказали консультанты) в результате одни и те же остатки ререзвировались сразу под три заказа через год контора обанкротилась тут длинная статья об этом есть, прям в этом форуме про ЕРП еще очень хорошо билеты так продавать. главное - выгодно один билет трем разным людям ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 13:35 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovЛюбая современная СУБД с легкостью выдержит тот поток данных, который генерируется даже в самой большой компании - надо просто правильно написать код системы. ну не любая, мой любимый "стебелек" ляжет ))) но топовые выдержат легко я изначально сказал, что противник РИБ сделал 4 проекта перевода с РИБ на работу в единой базе ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 13:38 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovА что касается уровня изоляции... По моему мнению, в ERP системах всегда надо использовать только Serializable. В том числе и для резервирования. дада, крупнейший аптечный дистрибьютор США именно так и поступил, когда с самописки на САП перешел (Serializable, как сказали консультанты) в результате одни и те же остатки ререзвировались сразу под три заказа через год контора обанкротилась тут длинная статья об этом есть, прям в этом форуме про ЕРП еще очень хорошо билеты так продавать. главное - выгодно один билет трем разным людям А какая связь между кривой реализацией алгоритма и уровнем изоляции транзакций? Резервы под три заказа - это именно косяки в реализации алгоритма на уровне системы. Serializable просто позволяет меньше думать о "низкоуровневых" нарушениях в данных, но СУБД не способна помешать криворукому программисту записать в неё неверные данные. Вы что, всерьез полагаете, что если бы использовался Read uncommitted, то ошибок было бы меньше? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 14:08 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobну не любая, мой любимый "стебелек" ляжет ))) но топовые выдержат легко А мне одно время SQLite нравился... И как я про него забыл - он ведь тоже "ляжет"... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 14:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov Вы что, всерьез полагаете, что если бы использовался Read uncommitted, то ошибок было бы меньше? я не думаю, я это знаю совершенно точно пример про одновременную продажу одного билета двум пассажирам является хрестоматийным описанием максимального уровня изоляции транзакций последний раз читал в книге писателя по фамилии Сеппа, еще есть такой популярный в прошлом писатель, а ныне вице-през Оракла, г-н Кайт, тот тоже такой пример приводил ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 14:37 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovВы что, всерьез полагаете, что если бы использовался Read uncommitted, то ошибок было бы меньше? я не думаю, я это знаю совершенно точно пример про одновременную продажу одного билета двум пассажирам является хрестоматийным описанием максимального уровня изоляции транзакций последний раз читал в книге писателя по фамилии Сеппа, еще есть такой популярный в прошлом писатель, а ныне вице-през Оракла, г-н Кайт, тот тоже такой пример приводил ??? То есть описывается, что при Read uncommitted не возникает ошибки с продажей одного билета двум пассажирам, а при Serializable - возникает такая ошибка? Вы точно ничего не путаете? Может наоборот? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 15:00 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bobпропущено... я не думаю, я это знаю совершенно точно пример про одновременную продажу одного билета двум пассажирам является хрестоматийным описанием максимального уровня изоляции транзакций последний раз читал в книге писателя по фамилии Сеппа, еще есть такой популярный в прошлом писатель, а ныне вице-през Оракла, г-н Кайт, тот тоже такой пример приводил ??? То есть описывается, что при Read uncommitted не возникает ошибки с продажей одного билета двум пассажирам, а при Serializable - возникает такая ошибка? Вы точно ничего не путаете? Может наоборот? нет, не путаю Serializable - это максимальный уровень изоляции транзакций, транзакции полностью изолируются друг от друга, каждая выполняется так, как будто параллельных транзакций не существует ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 15:07 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
а вот Read Uncommited - наоборот Типичный способ реализации данного уровня изоляции — блокировка данных на время выполнения команды изменения, что гарантирует, что команды изменения одних и тех же строк, запущенные параллельно, фактически выполнятся последовательно, и ни одно из изменений не потеряется. Если несколько параллельных транзакций пытаются изменять одну и ту же строку таблицы, то в окончательном варианте строка будет иметь значение, определенное всем набором успешно выполненных транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 15:09 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob, По-моему, Вы что-то напутали. https://msdn.microsoft.com/ru-ru/library/ms173763.aspx READ UNCOMMITTED Указывает, что инструкции могут считывать строки, которые были изменены другими транзакциями, но еще не были зафиксированы. Транзакции, работающие на уровне READ UNCOMMITTED, не используют совмещаемые блокировки, чтобы предотвратить изменение считываемых текущей транзакцией данных другими транзакциями. Транзакции READ UNCOMMITTED также не блокируются монопольными блокировками, которые не позволили бы текущей транзакции считывать измененные другими транзакциями, но не зафиксированные строки. Установка этого параметра позволяет считывать незафиксированные изменения, которые называются чтением«грязных» данных. Значения в данных могут быть изменены и до окончания транзакции строки могут появляться и исчезать в наборе данных. Этот параметр действует так же, как и настройка NOLOCK всех таблиц во всех инструкциях SELECT в транзакции. Это наименьшее ограничение уровней изоляции. В SQL Server конфликты блокировок при защите транзакций от чтения «грязных» данных незафиксированных изменений данных можно сократить с помощью следующего: •уровня изоляции READ COMMITTED с параметром базы данных READ_COMMITTED_SNAPSHOT, находящимся в состоянии ON; •Уровень изоляции моментального снимка (SNAPSHOT). ... SERIALIZABLE Указывает следующее. •Инструкции не могут считывать данные, которые были изменены другими транзакциями, но еще не были зафиксированы. •Другие транзакции не могут изменять данные, считываемые текущей транзакцией, до ее завершения. •Другие транзакции не могут вставлять новые строки со значениями ключа, которые входят в диапазон ключей, считываемых инструкциями текущей транзакции, до ее завершения. Блокировка диапазона устанавливается в диапазоне значений ключа, соответствующих условиям поиска любой инструкции, выполненной во время транзакции. Обновление и вставка строк, удовлетворяющих инструкциям текущей транзакции, блокируется для других транзакций. Это гарантирует, что если какая-либо инструкция транзакции выполняется повторно, она будет считывать тот же самый набор строк. Блокировки диапазона сохраняются до завершения транзакции. Это самый строгий уровень изоляции, поскольку он блокирует целые диапазоны ключей и сохраняет блокировку до завершения транзакции. Из-за низкого параллелизма этот параметр рекомендуется использовать только при необходимости. Этот параметр действует так же, как и настройка HOLDLOCK всех таблиц во всех инструкциях SELECT в транзакции. Таким образом, продать три раза билет на одно и то же место можно как раз при уровне изоляции READ UNCOMMITTED, если все три транзакции "квазиодновременно" определили в транзакции, что место еще не продано, а затем продали его также "квазиодновременно". Уровень SERIALIZABLE не позволит прочитать статус места, пока с ним работает другая транзакция. Однако, это вызовет дополнительные "тормоза". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 15:20 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovТо есть описывается, что при Read uncommitted не возникает ошибки с продажей одного билета двум пассажирам, а при Serializable - возникает такая ошибка? Вы точно ничего не путаете? Может наоборот? нет, не путаю Serializable - это максимальный уровень изоляции транзакций, транзакции полностью изолируются друг от друга, каждая выполняется так, как будто параллельных транзакций не существует а вот Read Uncommited - наоборот Типичный способ реализации данного уровня изоляции — блокировка данных на время выполнения команды изменения, что гарантирует, что команды изменения одних и тех же строк, запущенные параллельно, фактически выполнятся последовательно, и ни одно из изменений не потеряется. Если несколько параллельных транзакций пытаются изменять одну и ту же строку таблицы, то в окончательном варианте строка будет иметь значение, определенное всем набором успешно выполненных транзакций. Единственное, что можно сказать: _bobпрочитайте учебник ДО КОНЦА ... УЧИТЬ МАТЧАСТЬ НЕОБХОДИМО, КУРСАНТ!!! Вы неправильно понимаете разницу между уровнями изоляции транзакций, и, вероятно, не совсем верно понимаете, что такое транзакция. Еще раз почитайте про ACID, вам это будет полезно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 15:21 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
GaryaПардон, продать три раза одно и то же место может получиться и при том, и при этом уровне изоляции - зависит от логики работы транзакции. ну наконец-то Garya понял что я имею в виду и наверняка понял, почему я настаиваю на последовательном пересчете ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 15:35 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobGaryaПардон, продать три раза одно и то же место может получиться и при том, и при этом уровне изоляции - зависит от логики работы транзакции. ну наконец-то Garya понял что я имею в виду и наверняка понял, почему я настаиваю на последовательном пересчете )))Решил удалить свой пост и написать более детально, извините, коллеги. Кто-то успел увидеть краткое резюме без объяснения. SERIALISEBLE вызывает блокировку данных только после записи в одной из параллельных транзакций. Однако, прочитать, что место свободно могут все параллельные транзакции перед модификацией статуса места. Если логика работы такова, что пытается модифицировать статус, предварительно проверив его, может возникнуть ситуация, когда три параллельных транзакции установили факт, что место - свободно. Затем та из транзакций, которая попытается модифицировать значение первой, установит блокировку на данные. Вторая и третья транзакции выполнить модификацию не смогут - у них возникнет ошибка блокировки. Если эта ошибка корректно обрабатывается на клиенте, тогда клиент попытается повторно считать статус и модифицировать его. Если она не обрабатывается, либо обрабатывается некорректно, либо проверка статуса места и модификация производятся в разных транзакциях, могут возникнуть проблемы. Однако, в общем случае SERIALIZEBLE как раз лучше защищает от подобных ситуаций, нежели READ UNCOMMITED. Однако, SERIALIZEBLE может вызвать вал взаимных блокировок и страшные тормоза. Так что, с моей точки зрения s_ustinov всё же более прав, нежели _bob, который не нашел в себе силы признать 20084955 , что перепутал эти уровни изоляции, хотя и начал в своем ответе корректировать свою позицию. Коллеги, по моему, Вы слишком ополчились друг на друга. Человеку свойственно ошибаться, не следует злорадствовать по поводу чужих ошибок, потому что когда-нибудь ошибетесь и вы. И _bob, и s_ustinov - оба весьма грамотные специалисты. Но, к великому моему сожалению, не достаточно сдержанные. Подобная несдержанность - весьма нехарактерная черта для ИТ-директоров, которые должны иметь в себе силы сдерживать эмоции, это одно из ценных качеств менеджера высокого уровня. И не только менеджеров, но и вообще всех людей, которые считают себя интеллигентными и не хотят опускаться до базарного уровня. Модератор: Если попытки взаимных наездов не прекратятся, мне придется данный тред прикрыть, а нарушителей забанить. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 16:02 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garya Если эта ошибка корректно обрабатывается на клиенте, тогда клиент попытается повторно считать статус и модифицировать его. Если она не обрабатывается, либо обрабатывается некорректно, либо проверка статуса места и модификация производятся в разных транзакциях, могут возникнуть проблемы. Однако, в общем случае SERIALIZEBLE как раз лучше защищает от подобных ситуаций, нежели READ UNCOMMITED. Однако, SERIALIZEBLE может вызвать вал взаимных блокировок и страшные тормоза. Так что, с моей точки зрения s_ustinov всё же более прав, нежели _bob, который не нашел в себе силы признать 20084955 , что перепутал эти уровни изоляции, хотя и начал в своем ответе корректировать свою позицию. разумеется, я названия перепутал однако сути это не меняет, мы ж не о блокировках спорили, а о некорректности параллельного резервирования моя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 16:26 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobмоя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставьЕсли писать код, не задумываясь о взаимодействиях и возможных блокировках (как это обычно и происходит), тогда да. Лично мне Ваш подход вполне себе понравился. Однако, существуют методы написания и тестирования именно параллельных процессов, и если грамотно распараллелить процессы, то можно получить вместо дополнительных проблем дополнительный выигрыш. Одна точка зрения предпочитает вполне обоснованно обходить возможные трудно выявляемые проблемы с блокировками, а не бороться с ними. Эта точка зрения мне вполне понятна, когда нужно получить достаточно быстро результат, который не заведет в тупик. Другая точка зрения - управлять блокировками при распараллеливании. Такой подход более рискованный, но позволяет получить более качественное решение, правда, более серьезными усилиями и более высокими затратами времени (как правило). Возможно, приверженец этого подхода имеет настолько большой опыт, что научился видеть проблемы параллельной обработки данных на стадии написания кода и может грамотно их разруливать на этой стадии. А возможно он недооценивает риски такого подхода, тут мне трудно судить. По-моему, в принципе оба подхода имеют право на жизнь. ПМСМ, ваш спор - о предпочтениях. Кстати, о параллелизме. Существует очень классная нотация именно для параллельных процессов - BPMN. Изначально она нацелена на распараллеливание именно бизнес -процессов, но по-моему, идеи, которые в нее заложены, позволяют на ее основе реализовать также визуальное программирование любых параллельных процессов. В такой нотации лично мне были бы совершенно не страшны блокировки и иные проблемы параллельной обработки - они очень красиво в ней разруливаются. Так что обобщать, ПМСМ, не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 17:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Добрый день Много лет эксплуатировал и дорабатывал систему, в которой работа с резервами строилась на основе механизмов уровней изоляции и блокировок на уровне SQL сервера(sybase). Собственно в SQL серверах эти механизмы для таких задач и сделаны. Не скажу что была высоко нагруженная, но около 130 человек в ней постоянно молотили продажи товаров с нескольких складов с резервированием, с обменом резервами, с переносом резервом при перемещении между складами и т.п. Никаких ошибок(резервы потерялись, резервы выше чем склад и т.п.) и тормозов не наблюдалось при работе с резервами. Никто ничего специально не параллелил. Каждая транзакция запускалась в своей сессии на SQL сервере по мере необходимости. + постоянно шло обращение к данным по складам для рассылки клиентам, интернет магазина, отчетам и т.п. Глобальными переделками резервов занимались автоматы по ночам через те же процедуры с транзакциями(для оптимизации логистики, чтобы товар не гонять между складами), но и при этом в системе работали удаленно люди и тоже все было нормально. Были и удаленные склады в системе(базы разнесены и в репликации). Резервировали через заявки на резервирование на удаленном складе, которая посылалась в другую базу и в результате устанавливался/не устанавливался резерв. Прочитав пост, засомневался, сложилось мнение что так было делать нехорошо. Надо было все последовательно делать(резервирование по очереди), т.к. уровни изоляции "не решают". Или запускать постоянно процедуру пересчета резервов по всем заказам с очисткой старых. Или все это обсуждается чисто в рамках 1С или NAV, в которых какие-то проблемы с этим по каким-то своим причинам? Тогда извиняюсь, просто автор просил поделится у кого как в других системах. Я конечно понимаю, что если хочется полного автомата резервирования, который очень умный и прямо в момент резервирования будет анализировать остатки, продажи, коэффициенты реализации резервов, ограничения на суммы, на лету оптимизировать резервы, где лучше зарезервировать и т.п., то алгоритм внутри транзакции будет очень сложным и эта транзакция может всех держать. Но так транзакции не стоит писать, транзакции с блокировками должны быть быстрыми. Тогда можно по другому - быстро в транзакции зарезервировать где получится максимально быстро, а потом запускать параллельно процесс оптимизации. Неужели у автора надо резервы оптимизировать постоянно, при каждом событии на товаре? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 18:45 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobразумеется, я названия перепутал однако сути это не меняет, мы ж не о блокировках спорили, а о некорректности параллельного резервирования моя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставь Резервирование товара "Гвозди" никак не влияет на процесс резервирования товара "Молотки", и эти два процесса могут выполняться параллельно без плачевных результатов . Но тут как раз важен уровень изоляции. Если мы используем Read uncommitted, то при ошибках в алгоритме у нас будут некорректные данные в системе. А вот при уровне SERIALIZABLE часть ошибок (не все!!!) отловит и предотвратит СУБД. В частности, СУБД сможет предотвратить большую часть ошибок, связанных с одновременной работой многих пользователей, в том числе с параллельным резервированием. Да, мы можем получить блокировки (и тормоза) при неоптимальном алгоритме. Но тормоза мы заметим сразу, и сразу же сможем их исправить. А логические ошибки резервирования часто сразу не видны. Я знаю примеры, когда фирмы годами работали с системой, в которой регулярно возникали ошибки резервирования. И не исправляли их как раз потому, что воспроизвести и локализовать ошибку, возникающую именно при параллельной работе пользователей, очень сложно. Последовательное резервирование имеет большой плюс - проще реализовать корректную логику работы. Но, к сожалению, при росте фирмы (больше магазинов, сотрудников, заказов) не всегда возможно придерживаться строго последовательного вычисления резервов - расчет резервов начинает сильно тормозить и становится узким местом. И приходится параллелить расчет резервов и использовать прочие хитрости, чтобы ускорить расчет резервов. Разумеется, всё сильно зависит от специфики бизнеса. В некоторых случаях резервирование в течении 20-30 минут - вполне приемлемо, а в других случаях 10 секунд - уже очень долго и необходимо ускорять. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 18:50 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
GaryaКстати, о параллелизме. Существует очень классная нотация именно для параллельных процессов - BPMN. Изначально она нацелена на распараллеливание именно бизнес -процессов, но по-моему, идеи, которые в нее заложены, позволяют на ее основе реализовать также визуальное программирование любых параллельных процессов. В такой нотации лично мне были бы совершенно не страшны блокировки и иные проблемы параллельной обработки - они очень красиво в ней разруливаются. Я бы разделял понятия бизнес-процесс и бизнес-операция, т.к. бизнес-процесс, как правило, состоит из нескольких бизнес-операций, которые выполняются в различных транзакциях.Бизнес-операция, на мой взгляд, это набор действий выполняемых в пределах одной транзакции. Конкурируют за свободные ресурсы именно бизнес-операции, например, при установке резерва конкурентным ресурсом является свободное количество товара. Поэтому мне не понятно, как BPMN поможет "разрулить" конкуренцию за ресурсы. Мы в системе Oremax широко используем возможности СУБД для разрешения конкуренции бизнес-операций за ресурсы - транзакционный механизм. Для увеличения производительности мы рекомендуем нашим клиентам использовать уровень изоляции транзакций Read Commited. Параноики могут использовать и более жёсткие уровни. При этом, для надёжности функционирования мы внутри транзакций предварительно блокируем записи, которые будут изменены в процессе работы. Например, если говорить о резервировании, то у нас есть таблица сводной информации о количестве свободного товара на складе и количестве резерва в разрезе Номенклатура+Склад, в которой мы блокируем записи перед началом резервирования. Поскольку задания (запросы) на резервирование поступают постоянно от разных пользователей, то, естественно, возникает конкуренция, которую "разруливает" СУБД за счёт своего тразакционного механизма. s_ustinov, мне кажется, что вы излишне усложняете алгоритм. Задачу резервирования мы решили другим способом, при том, что система может работать при оффлайновых репликациях. Я не знаю насколько наш подход применим для вас, т.к. Oremax не имеет ничего общего ни с 1С ни с MS Dynamics. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 19:08 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
antand, привет!!!! antand, будучи пользователем Oremax, описал своё впечатление о её работе :-). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 19:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxЯ бы разделял понятия бизнес-процесс и бизнес-операция, т.к. бизнес-процесс, как правило, состоит из нескольких бизнес-операций, которые выполняются в различных транзакциях.Бизнес-операция, на мой взгляд, это набор действий выполняемых в пределах одной транзакции. Конкурируют за свободные ресурсы именно бизнес-операции, например, при установке резерва конкурентным ресурсом является свободное количество товара. Поэтому мне не понятно, как BPMN поможет "разрулить" конкуренцию за ресурсы.В BPMN имеется собственное понятие "длинной транзакции" (или "бизнес-транзакции"). В отличие от "короткой" СУБД-шной транзакции такие транзакции, в соответствии с их концепцией, могут длиться месяцами. Однако, такие транзакции реализуются без взаимных блокировок. Каким образом? Таким, что нотация предполагает доступ к данным иных выполняющихся в данный момент экземпляров процесса. Из любого экземпляра процесса (транзакции) можно получить доступ к данным других экземплярам как этого же самого процесса, так и других процессов, определить, какие данные наиболее приоритетны в данный момент для каких процессов и "разрулить" конфликты доступа несколькими разными способами, которые на уровне СУБД выглядели бы как "низкоуровневые". В частности, откат "длинной транзакции" может быть осуществлен не "на полном автомате" возвратом всех данных в исходное состояние на момент "до транзакции", но и явно указанными действиями, которые могут корректировать и/или дополнять механизм отката по умолчанию. Обращение к данным может быть организовано с использованием механизма "событий" которые обрабатываются от многих совершенно разных процессов единообразно, если эти процессы обращаются к дефицитным ресурсам, например, с помощью "самодельных очередей", которые реализуются отдельными подпроцессами, к которым обращаются все остальные процессы, которым может потребоваться дефицитный ресурс. И тут уже только от фантазии и профессионализма разработчика зависит, как реализовать механизмы разруливания различных конфликтов. Важно, что эти механизмы открыты, их можно делать самим, оперируя не "таблицами", "строками", "индексами" и иными объектами концепции СУБД и "данностью" в виде правил ACID, а можно самому явно прописать механизмы блокировок при обращении к данным из разных процессов и с разными целями. Кажется, что это делает разработку более низкоурвневой. С одной стороны это действительно так. С другой стороны, нотация BPMN имеет специальные средства для распараллеливания потоков данных и потоков управления, сбора "пучка потоков" в один поток, взаимодействия различных потоков между собой посредством сигналов или сообщений. Посредством этой нотации можно совмещать довольно сложные участки обработки данных, которые требуют отчасти строго-последовательной обработки, а местами допускают распараллеливание. Легко и просто делается "пообъектная" обработка, которую можно выполнить для коллекции объектов либо путем "последовательного перебора" объектов, либо созданием отдельного экземпляра процесса для каждого объекта, требующего обработки. Потому такая нотация, если ею заменяется "программирование вообще" может творить чудеса. Все эти "мютексы", "сигналы", "сообщения", которые есть в операционной системе - это классно, но где они в языках высокого уровня? Их нет! Нужно писать код с использованием древнего "последовательного" алгоритмического подхода, а взаимодействие параллельных процессов рисовать где-то отдельно на бумажке или пытаться впихнуть в мозг до получения вывиха мозга. Удобных средств визаулизации параллельного программирования, параллельных алгоритмов - не было. Пока не появился BPMN. В нем реализованы революционные идеи. Разработчик, глядя на схему процессов, "проваливаясь" в детализацию схемы (детализируя, выполняя декомпозицию), либо выходя на верхний уровень, может одновременно наблюдать и удобно укладывать у себя в голове множество совершенно разных процессов, выполняющихся в разных ритмах, имеющих множество экземпляров каждый, но при этом взаимодействующих таким образом, что это взаимодействие не выносит мозг. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 20:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobПрограммист 1спропущено... Все так плохо? ps Предыдущие 3 системы wms (не 1с) уже провалились... Акселотовскую ВМСку я внедрял в 2009 году в Альбе (обувь, опт и розница)...ну внедрили и внедрили, работало нормально ))) там главное подробно прописать весь необходимый функционал, а то у акселотов всегда оказывается, что если надо добавить небольшую фичу, например инвентаризацию, то для этого якобы полсистемы надо переворошить и данные перезаливать, потому что потому. и инструментария админского там нету от слова совсем....типа откатить кривую транзакцию только вручную тыком по регистрам...пришлось самим обработки писать. Доработки стоят очень дорого, внутри ОЧЕНЬ накручено, сами толком не разобрались, решили не рисковать, благо меня познакомили с уволенным экс-разрабом, он все дорабатывал, а то допилы обошлись бы нам дороже основного внедрения. Каждая версия акселота совершенно не похожа на предыдущую архитектурно, то ли каждый раз убеждаются в неудачности, то ли разработчики у них разбегаются и каждый раз другие. я бы посоветовал посмотреть WMS Arena сразу скажу, что я не совсем объективен, я эту систему доводил до ума и до коробочного состояния у арены гигантский плюс: система изначально написана и дорабатывается компанией TDM Electric, причем компания сама на этой системе работает. соответственно, все неудобности и шероховатости устраняются не потому что так надо клиентам, а потому что так надо им самим ))) ну и все вкусности, придуманные за 9 лет существования TDM, вошли в эту систему...ну и не пропадет никуда ни сама система, ни экспертиза ее доработок и эксплуатации изначально содрана наполовину с Exceed, наполовину с манхэттена, написана на 1С, правила, шаблоны и т.д. настраиваются в текстовых окнах без программистов и конфигураторов. на удивление нетребовательна: склад в 50 000 ячеек, 20 000 артикулов, 20 терминалов, 3 оператора фунциклировал на "сервере" в один четырехъядерник с 32 гигами ОЗУ крупнейшее внедрение: склады сети ОллГуд компания АвтоАльянс, та вообще внедрила у себя эту систему самостоятельно...все люди были брошены на ОллГуд, альянсу сказали что сейчас заниматься ими некому, максимум по телефону подсказать, так они сами справились еще из плюсов: можно обучать и стажировать своих складских прям на складе TDM, там народ опытный уже 9 лет на ней работает если интересно или будут вопросы, свяжитесь со мной, я вас с ведущим внедренцем познакомлю, он вам все покажет, расскажет и скидку предложит )))Разбираюсь с акселотом сам. Пока не перейду на уровень разработчика - не начну внедрение. (Версия последняя - вроде вполне ничего.) А доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда. ps За арену - спасибо. Не знал что есть и такой вариант - посмотрю на досуге. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 20:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
antand работа с резервами строилась на основе механизмов уровней изоляции и блокировок на уровне SQL сервера(sybase). ... около 130 человек в ней постоянно молотили продажи товаров с нескольких складов с резервированием, с обменом резервами, с переносом резервом при перемещении между складами и т.п. Никаких ошибок(резервы потерялись, резервы выше чем склад и т.п.) и тормозов не наблюдалось при работе с резервами. ... Никто ничего специально не параллелил. Если у вас резервирование работает "на основе механизмов уровней изоляции и блокировок на уровне SQL", то очень вероятно, что специально параллелить ничего и не надо. Такая система достаточно неплохо масштабируется без дополнительных усилий. Надо помнить, что современные "промышленные" СУБД рассчитаны на совсем другие нагрузки. antandПрочитав пост, засомневался, сложилось мнение что так было делать нехорошо. Надо было все последовательно делать(резервирование по очереди), т.к. уровни изоляции "не решают". Или запускать постоянно процедуру пересчета резервов по всем заказам с очисткой старых. Нормальный подход, если у вас ничего не тормозит и не возникает ошибок. Всё дело в задачах и нагрузке. antandЯ конечно понимаю, что если хочется полного автомата резервирования, который очень умный и прямо в момент резервирования будет анализировать остатки, продажи, коэффициенты реализации резервов, ограничения на суммы, на лету оптимизировать резервы, где лучше зарезервировать и т.п., то алгоритм внутри транзакции будет очень сложным и эта транзакция может всех держать. Но так транзакции не стоит писать, транзакции с блокировками должны быть быстрыми. Тогда можно по другому - быстро в транзакции зарезервировать где получится максимально быстро, а потом запускать параллельно процесс оптимизации. Неужели у автора надо резервы оптимизировать постоянно, при каждом событии на товаре? Во первых, для резервирования "прямо в момент резервирования ... анализировать остатки, продажи, коэффициенты реализации резервов, ограничения на суммы" не надо. Вы путаете с алгоритмами расчета пополнения складов. Для резервирования нужны остатки и всё. А вот сколько модулей делать - долго думал. Можно было сделать два модуля. Один бы быстро делал резервирование, второй бы выполнял различные коррекции (учтенные перемещения, приходы от поставщиков, списания и т.д.). Или можно было все совместить в одном модуле. Проще оказалось реализовать всё в одном модуле. Просто резервирование (где придется не получалось бы, все равно надо по приоритетам) без корректировок можно было сделать со средним временем работы примерно 1 секунда. Но тогда при каждом подборе для межскладских перемещений (а их создавалось несколько десятков в день) пришлось бы выполнять корректировки резервов. То есть как минимум делать в системе при создании межскладского перемещения вызов этого отдельного модуля корректировок, ждать, когда он выполнится, продумать, как во время этого пересчета должны блокироваться записи резервирования и т.д.. А вариант с одним модулем (резервирование + корректировки) работает ненамного дольше (в среднем 2-4 секунды). И при этом модуль резервирования работает "автономно" от системы - напрямую он ниоткуда не вызывается. А так как один модуль это всегда проще, чем два модуля, и для пользователей разница в 2-3 секунды не критична, то решили обойтись одним модулем. Это сильно упростило разработку - когда таблицу резервов меняет код, который расположен строго в одном единственном месте - это сильно упрощает проблему с блокировками и отлов ошибок. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 20:58 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxМы в системе Oremax широко используем возможности СУБД для разрешения конкуренции бизнес-операций за ресурсы - транзакционный механизм. Для увеличения производительности мы рекомендуем нашим клиентам использовать уровень изоляции транзакций Read Commited . Параноики могут использовать и более жёсткие уровни. При этом, для надёжности функционирования мы внутри транзакций предварительно блокируем записи , которые будут изменены в процессе работы. Например, если говорить о резервировании, то у нас есть таблица сводной информации о количестве свободного товара на складе и количестве резерва в разрезе Номенклатура+Склад, в которой мы блокируем записи перед началом резервирования. Поскольку задания (запросы) на резервирование поступают постоянно от разных пользователей, то, естественно, возникает конкуренция, которую "разруливает" СУБД за счёт своего тразакционного механизма. А не проще использовать SERIALIZABLE и ничего внутри транзакции дополнительно не блокировать? Oremaxs_ustinov, мне кажется, что вы излишне усложняете алгоритм. Задачу резервирования мы решили другим способом, при том, что система может работать при оффлайновых репликациях. Я не знаю насколько наш подход применим для вас, т.к. Oremax не имеет ничего общего ни с 1С ни с MS Dynamics. Описанный алгоритм резервирования (не реализация) - специфика фирм, работающих с запчастями и им подобных. У таких фирм значительная часть заказов резервируют товары на других складах (не на том складе, откуда будет отгрузка). В результате и резервирование на нескольких складах, и межскладские перемещения на основе резервирований должны создаваться автоматически. Если вы решили эту проблему более простым способом - опишите ваше решение. Лично мне интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:08 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1сА доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда . А как это у вас получилось? Сумма уж очень внушительная... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:12 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1с А доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда. ps За арену - спасибо. Не знал что есть и такой вариант - посмотрю на досуге. круто барин гуляет! мне за каждые полляма мозг размножают, а тут люди ярды теряют а возьмите меня к себе, у меня WMSы взлетают всегда, даже когда собственник активно помогает ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:45 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПрограммист 1сА доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда . А как это у вас получилось? Сумма уж очень внушительная... да exceed c полным циклом предобследований, доработками, интеграциями и лицензиями на столько потянет а коллега наверняка имел в виду еще и потери бизнеса, там же склады штормило и, судя по отказу от использования системы, штормило так, что решили утопиться и возродиться заново ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garya_bobмоя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставьЕсли писать код, не задумываясь о взаимодействиях и возможных блокировках (как это обычно и происходит), тогда да. Лично мне Ваш подход вполне себе понравился. Однако, существуют методы написания и тестирования именно параллельных процессов, и если грамотно распараллелить процессы, то можно получить вместо дополнительных проблем дополнительный выигрыш. Одна точка зрения предпочитает вполне обоснованно обходить возможные трудно выявляемые проблемы с блокировками, а не бороться с ними. Эта точка зрения мне вполне понятна, когда нужно получить достаточно быстро результат, который не заведет в тупик. Самое любопытное, что предпочитаем мы одно и то же. По моему мнению, правильный подход при написании ERP системы - включить SERIALIZABLE и "писать код, не задумываясь о взаимодействиях и возможных блокировках". С точки зрения прикладного программиста СУБД сама обеспечит "ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений". Фактически, спор был только об используемых терминах. GaryaДругая точка зрения - управлять блокировками при распараллеливании. Такой подход более рискованный, но позволяет получить более качественное решение, правда, более серьезными усилиями и более высокими затратами времени (как правило). Возможно, приверженец этого подхода имеет настолько большой опыт, что научился видеть проблемы параллельной обработки данных на стадии написания кода и может грамотно их разруливать на этой стадии. А возможно он недооценивает риски такого подхода, тут мне трудно судить. По-моему, в принципе оба подхода имеют право на жизнь. ПМСМ, ваш спор - о предпочтениях. А вот здесь вы описываете подход, который предлагает 1С. Управляемый режим позволяет повысить параллельность работы пользователей в клиент-серверном варианте работы за счет использования более низкого уровня изоляции транзакций базы данных (Read Committed). При записи данных в транзакции объекты встроенного языка автоматически блокируют необходимые данные. Разработчику требуется управлять блокировками данных в тех случаях, когда бизнес-логика требует согласованного и целостного чтения данных в транзакции. Лично мне такой подход очень не нравится. Это весьма сложная задача - "вручную" обеспечить в прикладном коде ACID. Подавляющее большинство прикладных программистов не имеют необходимых навыков и знаний, чтобы сделать это без ошибок. Лично моё мнение - целостностью данных должна заниматься СУБД, а: https://msdn.microsoft.com/ru-ru/library/jj856598(v=sql.120).aspx]Программисты SQL ответственны за начало и завершение транзакций в точках, которые осуществляют логическую целостность данных. Программист должен определить последовательность изменений данных, которые оставляют данные в целостном состоянии по отношению к деловым правилам организации . Программист включает эти инструкции модификации в одну транзакцию, чтобы Компонент SQL Server Database Engine смог обеспечить физическую целостность транзакции. То есть, если есть проблема с тормозами (блокировками), надо не пытаться вручную управлять блокировками, а проанализировать и исправить код. Тормоза всегда являются следствием "длинных" транзакций, а длинные транзакции, в свою очередь - результат некорректного и/или неоптимального кода. И только в самом-самом крайнем случае нужно управлять блокировками. Но я с трудом представляю себе такие ситуации в ERP системах пусть даже для очень крупных компаний. Ну нет в этой области задач с настолько большими потоками данных и с настолько высокими требованиями к "отзывчивости" системы. Это не АСУТП, где иногда надо обеспечить гарантированную скорость отклика в несколько миллисекунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 22:05 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovпропущено... А как это у вас получилось? Сумма уж очень внушительная... да exceed c полным циклом предобследований, доработками, интеграциями и лицензиями на столько потянет а коллега наверняка имел в виду еще и потери бизнеса, там же склады штормило и, судя по отказу от использования системы, штормило так, что решили утопиться и возродиться заново )))Естественно потери бизнеса. Оплата всех услуг внедерния wms от силы 5млн рублей. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 22:16 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПо моему мнению, правильный подход при написании ERP системы - включить SERIALIZABLE и "писать код, не задумываясь о взаимодействиях и возможных блокировках". С точки зрения прикладного программиста СУБД сама обеспечит "ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений".Это не всегда срабатывает. Более того, такой подход может привести к дедлокам, если в транзакции Т1 производится блокирование ресурса Р1 с ожиданием освобождения ресурса Р2, а транзакция Т2 блокирует ресурс Р2 и ожидает освобождения ресурса Р1, заблокированного транзакцией Т1. Использования "правильных" уровней блокировок недостаточно - все равно приходится вникать в логику. Кроме того, когда используется некий промежуточный язык, который сам формирует запросы к СУБД, например, язык 1С, при не совсем правильном использовании, может статься, проверка статуса будет выполнена в одном SQL запросе в первой транзакции, а модификация записи после проверки статуса - в другом запросе, во второй отдельной транзакции. И между этими транзакциями СУБД успеет изменить статус проверяемой записи за счет третьей транзакции, выполненной, к примеру, совсем другим пользователем. Так что включать мозг и думать тщательно требуется по любому. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 23:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garya… С другой стороны, нотация BPMN имеет специальные средства для распараллеливания потоков данных и потоков управления, сбора "пучка потоков" в один поток, взаимодействия различных потоков между собой посредством сигналов или сообщений. Посредством этой нотации можно совмещать довольно сложные участки обработки данных, которые требуют отчасти строго-последовательной обработки, а местами допускают распараллеливание. Легко и просто делается "пообъектная" обработка, которую можно выполнить для коллекции объектов либо путем "последовательного перебора" объектов, либо созданием отдельного экземпляра процесса для каждого объекта, требующего обработки. Потому такая нотация, если ею заменяется "программирование вообще" может творить чудеса. Все эти "мютексы", "сигналы", "сообщения", которые есть в операционной системе - это классно, но где они в языках высокого уровня? Их нет! Нужно писать код с использованием древнего "последовательного" алгоритмического подхода, а взаимодействие параллельных процессов рисовать где-то отдельно на бумажке или пытаться впихнуть в мозг до получения вывиха мозга. Удобных средств визаулизации параллельного программирования, параллельных алгоритмов - не было. Пока не появился BPMN. В нем реализованы революционные идеи. Разработчик, глядя на схему процессов, "проваливаясь" в детализацию схемы (детализируя, выполняя декомпозицию), либо выходя на верхний уровень, может одновременно наблюдать и удобно укладывать у себя в голове множество совершенно разных процессов, выполняющихся в разных ритмах, имеющих множество экземпляров каждый, но при этом взаимодействующих таким образом, что это взаимодействие не выносит мозг. Согласен красиво. Но на мой взгляд весьма трудоёмко. Обычно при столкновении красоты с жизнью страдает красота - заказчики платят за вариант, который решает их насущные задачи за минимальные деньги. Есть ли примеры систем автоматизации бизнеса, реализованных с помощью BPMN? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:09 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov А не проще использовать SERIALIZABLE и ничего внутри транзакции дополнительно не блокировать? Это не профессионально :-). В этом случае Дидлоки, «тормоза» и проблемы обеспечены. К тому же, тогда мы не будем отличаться в лучшую сторону от слишком известных систем. s_ustinov Описанный алгоритм резервирования (не реализация) - специфика фирм, работающих с запчастями и им подобных. У таких фирм значительная часть заказов резервируют товары на других складах (не на том складе, откуда будет отгрузка). В результате и резервирование на нескольких складах, и межскладские перемещения на основе резервирований должны создаваться автоматически. Кратко о резервировании в Oremax. Места резервирования: • «Свои» склады. Разрешено прямое резервирование. • «Чужие» склады, например, территориально удалённые склады. Прямое резервирование запрещено. Направляется заявка на резерв. • В пути (товары ещё не поступившие от поставщика). Объекты резервирования: • Номенклатурная единица на складе • Номенклатурная единица в пути • Конкретный экземпляр товара на складе Места размещения данных: • Локальная база данных. • Удалённая база данных. Синхронизация удалённых баз данных осуществляется с помощью офлайновых репликаций (SQL Remote). Имеется таблица Резервы (код записи, код состояния, код склада, код номенклатуры, количество резерва, количество запрошено, …). Одна запись – один резерв. По одной строке заказа может быть несколько резервов на разных складах. Запись резерва может имеет состояния: • Проект - Хранение в базе данных и не более того • Заявка - Передача заявки на резервирование владельцу склада • Действующий - Резерв действует • Завершен - Резерв полностью завершен • Аннулирован - Резерв не действует • Отклонён - отрицательный ответ на заявку • В пути • Обработан – служебное состояние ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:12 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov, Продолжение. Упрощённая схема резервирования на «чужом» складе в отрыве от общей схемы документооборота: • Запуск процедуры резервирования для строки заказа. • В соответствии с имеющейся информацией о наличии свободного товара на «чужом» складе создаётся запись в Резервах с указанием «количество запрошено». • Запись переводится в состояние Заявка. После этого запись становится недоступной (алгоритмически, не блокировка) для модификации тому, кто создал заявку. • Если есть репликации, то через SQLRemote запись попадает в такую же таблицу Резервы в другой базе с учётом транзакционной последовательности операций в исходной базе. • Каждые пару минут в базе запускается событие, которое вызывает процедуру обработки Заявок на резерв. • Процедура обработки Заявок в соответствии с имеющейся информацией о наличии свободного товара обрабатывает заявку и присваивает состояние Отклонён при отсутствии свободного товара или присваивает состояние Действующий и доступное количество резерва при наличии некоторого свободного количества. Если пользователь подписан на получение оповещений об изменении в резервах, то ему направляется сообщение о результатах операции. • Если есть репликации, то SQLRemote запись попадает в такую же таблицу Резервы в локальной базе. • Запись резерва становится доступной для модификации в локальной базе как человеком (например, уменьшить резерв), так процедурам автоматической обработки (например, процедурам передачи товара на другой склад) При перемещении товара, зарезервированного на «чужом» складе на другой склад, например, склад отгрузки, вместе с товаром перемещается резерв. Запись в Резервах для удалённого склада приобретает состояние Завершён далее создаётся новая запись в Резервах для склада получения с сохранением остальных реквизитов и в состоянии Действующий. Что касается автоматического создания документов на перемещение, то это, разумеется, возможно и делается при внедрении в соответствии с требованиями заказчика, например, на основании плана отгрузок. Для этого в заданное время запускается пользовательская процедура, которая создаёт пакет документов. Эта процедура оформляется как пользовательская процедура без изменения стандартных процедур и, следовательно, без потери возможности обновления программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garyas_ustinovПо моему мнению, правильный подход при написании ERP системы - включить SERIALIZABLE и "писать код, не задумываясь о взаимодействиях и возможных блокировках". С точки зрения прикладного программиста СУБД сама обеспечит "ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений".Это не всегда срабатывает. Более того, такой подход может привести к дедлокам, если в транзакции Т1 производится блокирование ресурса Р1 с ожиданием освобождения ресурса Р2, а транзакция Т2 блокирует ресурс Р2 и ожидает освобождения ресурса Р1, заблокированного транзакцией Т1. Использования "правильных" уровней блокировок недостаточно - все равно приходится вникать в логику. Согласен. Более того, такой подход не просто может, а почти наверняка приведед к дедлокам. Но в том то и прелесть SERIALIZABLE, что проблемы с блокировками появятся существенно раньше, чем при другом уровне изоляции. И уже на раннем этапе мы увидим большинство "проблемных" мест. А дальше - надо сидеть и анализировать код. И убирать проблемные места, оптимизируя и правильно разбивая код на отдельные транзакции (как Микрософт советует). Полностью от блокировок и взаимных блокировок избавиться, скорее всего, не получится. Но снизить их до приемлемого уровня - вполне. Например, в моей реализации резервирования, весь код процедуры разбит на отдельные транзакции, блокировок по которым очень мало. - Прочитали данные по остаткам, скопировали во временные таблицы - завершили транзакцию. Очень короткая транзакция, может блокироваться только чтение из таблиц остатков. - Делаем длинный пересчет резервов во временных таблицах - транзакция длинная (несколько секунд), но блокировок нет по определению, так как для каждого экземпляра процедуры СУБД создает свой экземпляр временных таблиц, в которых и выполняются расчеты. - Удалили в таблице резервов старые записи и записали новые резервы (скопировали из временной таблицы) - завершили транзакцию (единственное место в коде, где меняются данные в таблице резервов). Очень короткая транзакция - таблица резервов относительно небольшая, индексов мало, удаляется / вставляется несколько сотен записей за одну транзакцию. Блокировки могут быть только от других экземпляров процедуры, но одновременно несколькими экземплярами процедуры резервы по одному и тому же товару не считаются. А чтение из таблицы (например, проверить при отгрузке, что резервов хватает) можно и с более низким уровнем изоляции делать - на логику работы не повлияет. В текущем варианте такая операция выполняется раз в секунду (больше просто не надо), но легко можно несколько десятков раз в секунду обновлять данные. В результате блокировок практически нет, и без особых усилий можно довести пиковую скорость расчета резервов до ста - двухсот тысяч товаров в минуту (а по каждому товару может быть несколько резервов по разным заказам). А это уже уровень крупных внедрений. GaryaКроме того, когда используется некий промежуточный язык, который сам формирует запросы к СУБД, например, язык 1С, при не совсем правильном использовании, может статься, проверка статуса будет выполнена в одном SQL запросе в первой транзакции, а модификация записи после проверки статуса - в другом запросе, во второй отдельной транзакции. И между этими транзакциями СУБД успеет изменить статус проверяемой записи за счет третьей транзакции, выполненной, к примеру, совсем другим пользователем. А это как раз ошибка в ДНК Но не программистов, а систем. И 1С, и навик "выросли" из десктопных приложений - вот у них и остались "родовые травмы". При желании поставщика исправить это можно относительно малой кровью. Другое дело, что ни Microsoft, ни 1С это не очень надо. У Microsoft есть AX, у которого с масштабируемостью более-менее нормально. У 1С... Не знаю, но скорее всего они считают, что не имеет смысла напрягаться - и так купят. Да и даже в текущем виде не настолько всё плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:20 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxs_ustinov А не проще использовать SERIALIZABLE и ничего внутри транзакции дополнительно не блокировать? Это не профессионально :-). В этом случае Дидлоки, «тормоза» и проблемы обеспечены. К тому же, тогда мы не будем отличаться в лучшую сторону от слишком известных систем. А можно привести хотя бы один пример, в котором при использовании SERIALIZABLE "Дидлоки, «тормоза» и проблемы обеспечены"? Просто я таких примеров не знаю, и на данный момент считаю, что проблемы возникают не от SERIALIZABLE, а от недостаточно качественного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:43 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxУпрощённая схема резервирования на «чужом» складе в отрыве от общей схемы документооборота: • Запуск процедуры резервирования для строки заказа. • В соответствии с имеющейся информацией о наличии свободного товара на «чужом» складе создаётся запись в Резервах с указанием «количество запрошено». Предположим, свободные остатки есть на 10 разных складах. Как система определит, на каком складе пытаться сделать резерв? OremaxПри перемещении товара, зарезервированного на «чужом» складе на другой склад, например, склад отгрузки, вместе с товаром перемещается резерв. Запись в Резервах для удалённого склада приобретает состояние Завершён далее создаётся новая запись в Резервах для склада получения с сохранением остальных реквизитов и в состоянии Действующий. А как обрабатываются ошибки? Например, на складе было 10 штук. Все они были зарезервированы под конкретный заказ покупателя и перемещены на другой склад. Но при приемке на склад получатель в коробке нашли только 8 штук. 2 штуки то ли потерялись в пути, то ли их никогда в коробке не было... Но в результате на складе отправителе у нас 0 штук, на складе получателе 8 штук в резерве под заказ покупателя. Что происходит с резервом на потерянные 2 штуки товара? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:51 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovOremaxпропущено... Это не профессионально :-). В этом случае Дидлоки, «тормоза» и проблемы обеспечены. К тому же, тогда мы не будем отличаться в лучшую сторону от слишком известных систем. А можно привести хотя бы один пример, в котором при использовании SERIALIZABLE "Дидлоки, «тормоза» и проблемы обеспечены"? Просто я таких примеров не знаю, и на данный момент считаю, что проблемы возникают не от SERIALIZABLE, а от недостаточно качественного кода. Поскольку данный уровень предполагает блокирование считанных данных даже без их модификации, то, например, если такой уровень устанавливается на сессию и на экран выводятся какие-либо списки, то программа фактически становится "однопользовательской". Если в процедуре - чтение также может стать несколько затруднительным при активных операциях в базе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 14:43 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПредположим, свободные остатки есть на 10 разных складах. Как система определит, на каком складе пытаться сделать резерв? У нас: 1) Склад отгрузки 2) Свои склады 3) Чужие склады в согласованном порядке s_ustinovА как обрабатываются ошибки? Например, на складе было 10 штук. Все они были зарезервированы под конкретный заказ покупателя и перемещены на другой склад. Но при приемке на склад получатель в коробке нашли только 8 штук. 2 штуки то ли потерялись в пути, то ли их никогда в коробке не было... Но в результате на складе отправителе у нас 0 штук, на складе получателе 8 штук в резерве под заказ покупателя. Что происходит с резервом на потерянные 2 штуки товара? В данном случае резерв это только часть бизнес операции и рассматривать его отдельно от решения учёта товара не имеет смысла ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 14:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxна экран выводятся какие-либо списки, то программа фактически становится "однопользовательской". Курсоры? Тяжело придумать пример более плохого кода. OremaxЕсли в процедуре - чтение также может стать несколько затруднительным при активных операциях в базе. А можно пример задачи, где это будет возникать? Если все транзакции с таблицей короткие, то просто чтение и само отработается без проблем, и блокировок не создаст. Если, повторюсь, чтение оформить как отдельную транзакцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 15:06 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxs_ustinovПредположим, свободные остатки есть на 10 разных складах. Как система определит, на каком складе пытаться сделать резерв? У нас: 1) Склад отгрузки 2) Свои склады 3) Чужие склады в согласованном порядке То есть есть таблица приоритетов? Или что значит "в согласованном порядке"? Например, есть свободные остатки на: склад отгрузки - 10 штук Свой склад 1 - 5 штук Свой склад 2 - 40 штук Свой склад 3 - 20 штук Чужой склад 1 - 50 штук Чужой склад 2 - 30 штук Надо зарезервировать 30 штук - где именно будут созданы резервы? Oremaxs_ustinovА как обрабатываются ошибки? Например, на складе было 10 штук. Все они были зарезервированы под конкретный заказ покупателя и перемещены на другой склад. Но при приемке на склад получатель в коробке нашли только 8 штук. 2 штуки то ли потерялись в пути, то ли их никогда в коробке не было... Но в результате на складе отправителе у нас 0 штук, на складе получателе 8 штук в резерве под заказ покупателя. Что происходит с резервом на потерянные 2 штуки товара? В данном случае резерв это только часть бизнес операции и рассматривать его отдельно от решения учёта товара не имеет смысла А можно поподробнее - в связке с решением учета товара? :) Это действительно интересный вопрос - именно при подобных ситуациях часто начинаются проблемы с резервами. То резервы пропадают, то кладовщики не могут нормально учесть складские операции из-за резервов. Как вы решили задачу обработки таких ситуаций? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 15:15 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovOremaxна экран выводятся какие-либо списки, то программа фактически становится "однопользовательской". Курсоры? Тяжело придумать пример более плохого кода. OremaxЕсли в процедуре - чтение также может стать несколько затруднительным при активных операциях в базе. А можно пример задачи, где это будет возникать? Если все транзакции с таблицей короткие, то просто чтение и само отработается без проблем, и блокировок не создаст. Если, повторюсь, чтение оформить как отдельную транзакцию. Когда покажите результаты лучше чем эти Тестирование производительности №1 Стресс-тест и эти Тестирование производительности №2 Нагрузочное тестирование тогда будем обсуждать качество кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 15:24 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovOremaxпропущено... В данном случае резерв это только часть бизнес операции и рассматривать его отдельно от решения учёта товара не имеет смысла А можно поподробнее - в связке с решением учета товара? :) Это действительно интересный вопрос - именно при подобных ситуациях часто начинаются проблемы с резервами. То резервы пропадают, то кладовщики не могут нормально учесть складские операции из-за резервов. Как вы решили задачу обработки таких ситуаций?s_ustinovПрограммист 1спропущено... Просто нет слов. Судя по всему я Вас переоценил. Вы смотрите на задачу с стороны кодера. А я смотрю с стороны логиста, ит директора, директора магазина, директора склада, владельца бизнеса. pa Остановимся на том, что Вам чтобы сделать критичные алгоритмы, не нужно знать ничего. Вполне достаточно знаний языка программирования. Да-да, я понял. Вам очень много информации нужно узнать. Очень-очень много. Москва.80-й год. Дефицит всего, но в преддверии Олимпиады продавцам запрещено говорить, что чего-то нет. В магазин заходит дама и спрашивает перчатки. Перчаток, конечно, нет и продавец начинает выкручиваться: А какие перчатки вам нужны - кожаные, шерстяные или лайковые? - Кожаные. - А из какой кожи - свиной, телячьей? - Из свиной. - А какого цвета? - Коричневые, под цвет пальто. - Тогда приносите пальто, мы вам подберем. Тут вмешивается стоящий рядом мужчина: - Дамочка, не верьте им - я уже и жопу показывал и унитаз приносил - НЕТ У НИХ ТУАЛЕТНОЙ БУМАГИ!!! Странно - зачем Вам как кодеру цвет ж*пы знать? Вы же сами говорили что Вам достаточно знаний кодера, а всякие там бизнес процессы- этим глупостями пусть другие занимаются... ps Я бы конечно сначала разобрался в причинах пропажи резервов, причин невозможности сборок, разобрался бы почему и из-за чего подобные ситуация возникают и возможно решил их не используя ни одной строчки кода. Но мы же не ищем легких путей? Код наше все? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 15:27 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxs_ustinovпропущено... Курсоры? Тяжело придумать пример более плохого кода. пропущено... А можно пример задачи, где это будет возникать? Если все транзакции с таблицей короткие, то просто чтение и само отработается без проблем, и блокировок не создаст. Если, повторюсь, чтение оформить как отдельную транзакцию. Когда покажите результаты лучше чем эти Тестирование производительности №1 Стресс-тест и эти Тестирование производительности №2 Нагрузочное тестирование тогда будем обсуждать качество кода. Резервирование товара Строк в секунду 342,95 Я когда тестировал производительность моего кода резервирования, получил чуть меньше 1000 товаров в секунду - 900 с чем то. У многих товаров по несколько строк резервирования, так что строк в секунду раза в полтора больше, но не считал, сколько именно строк было. К сожалению, я в той фирме больше не работаю, и сделать более полные тесты не могу. Я и тот тест сделал только один раз. Увидел, что пиковая производительность значительно перекрывает потребность, и больше не тестировал. Ну и скорость больше не оптимизировал, хотя было что оптимизировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 16:55 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremax, я не хочу сказать, что у вас плохая или медленная система. Но использование курсоров - мягко говоря не лучшая идея. Вы что, действительно их постоянно используете в своей системе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 17:19 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovЯ когда тестировал производительность моего кода резервирования, получил чуть меньше 1000 товаров в секунду - 900 с чем то. У многих товаров по несколько строк резервирования, так что строк в секунду раза в полтора больше, но не считал, сколько именно строк было. К сожалению, я в той фирме больше не работаю, и сделать более полные тесты не могу. Я и тот тест сделал только один раз. Увидел, что пиковая производительность значительно перекрывает потребность, и больше не тестировал. Ну и скорость больше не оптимизировал, хотя было что оптимизировать. s_ustinov, я считаю, что было бы хорошим тоном вместе с цифрами описать методику и условия тестирования или не приводить цифры вовсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 18:26 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1сСтранно - зачем Вам как кодеру цвет ж*пы знать? Вы же сами говорили что Вам достаточно знаний кодера, а всякие там бизнес процессы- этим глупостями пусть другие занимаются... ps Я бы конечно сначала разобрался в причинах пропажи резервов, причин невозможности сборок, разобрался бы почему и из-за чего подобные ситуация возникают и возможно решил их не используя ни одной строчки кода. Но мы же не ищем легких путей? Код наше все? Я не спрашивал про детали бизнес - процесса, а спрашивал про поведение (возможности) программы в ситуации, когда кладовщик принял на склад меньше товаров, чем указано в документах. И мне действительно интересен ответ на этот вопрос - в свое время потратил много времени, чтобы найти решение, и интересно, как другие решали эту же задачу. В свою очередь я могу объяснить, как такие ситуации решаются в моем алгоритме. Программист 1с, когда человек начинает задавать не относящиеся к предмету обсуждения вопросы только для того, чтобы скрыть, что ему нечего ответить по существу - это всегда очень заметно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 18:34 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov... Но использование курсоров - мягко говоря не лучшая идея. Вы что, действительно их постоянно используете в своей системе? Сказано: "Не судите и не судимы будете". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 18:36 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПрограммист 1сСтранно - зачем Вам как кодеру цвет ж*пы знать? Вы же сами говорили что Вам достаточно знаний кодера, а всякие там бизнес процессы- этим глупостями пусть другие занимаются... ps Я бы конечно сначала разобрался в причинах пропажи резервов, причин невозможности сборок, разобрался бы почему и из-за чего подобные ситуация возникают и возможно решил их не используя ни одной строчки . Но мы же не ищем легких путей? Код наше все? Я не спрашивал про детали бизнес - процесса, а спрашивал про поведение (возможности) программы в ситуации, когда кладовщик принял на склад меньше товаров, чем указано в документах. поведение программы следующее: приходуется факт, генерятся документы расхождения, если резервов в пути было больше чем факт, по правилам отбираются и отменяются резервы, менеджеры этих резервов получают СМС или емайлы я вас больше скажу: бывают повторные приемки: когда часть товара не удалось опознать, эту часть приходуют повторно в рамках прихода. отыскавшийся товар снова падает в резервы, снова смски менеджерам: а вдруг клиент еще не отменил заказ...да, жизнь, она такая ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 19:12 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxs_ustinovЯ когда тестировал производительность моего кода резервирования, получил чуть меньше 1000 товаров в секунду - 900 с чем то. У многих товаров по несколько строк резервирования, так что строк в секунду раза в полтора больше, но не считал, сколько именно строк было. К сожалению, я в той фирме больше не работаю, и сделать более полные тесты не могу. Я и тот тест сделал только один раз. Увидел, что пиковая производительность значительно перекрывает потребность, и больше не тестировал. Ну и скорость больше не оптимизировал, хотя было что оптимизировать. s_ustinov, я считаю, что было бы хорошим тоном вместе с цифрами описать методику и условия тестирования или не приводить цифры вовсе. Ок. К сожалению, у меня не было возможности провести полноценное тестирование. Поэтому тестировал "на коленке": На тестовом сервере (характеристики не помню, но далеко не самый новый и мощный - в 2013 году ему было уже несколько лет) была копия рабочей базы. Я сформировал список товаров, по которым необходимо было создать резервы (есть в заказах покупателей или в неучтенных межскладских перемещениях). Таких всего оказалось меньше 15 тысяч. После чего написал простую процедуру. Эта процедура с помощью Service Broker запускала много экземпляров процедуры пересчета резервов. Фактически, я смотрел, как работают сообщения, тестирование производительности было второстепенным. В результате у меня очень быстро запустилось много экземпляров процедуры пересчета резервов, каждый экземпляр процедуры пересчитывал резервы для 200 товаров (точно уже не помню, может и 100). И за чуть больше чем 15 секунд все экземпляры процедуры завершили работу (некоторые отработали за 3 секунды, другие подольше, а один то ли 15, то ли 16 секунд работал). Я тогда посчитал - больше 900 товаров в секунду обработано. В результате было создано около 40 тысяч строк резервов. Методика тестирования не самая совершенная, но мне хватило. На рабочей базе использовался другой механизм запуска пересчета резервов. Джоб каждую секунду запускал новый экземпляр процедуры пересчета резервов. Так было проще и такой скорости обработки хватало для реальных задач. Ну и при тестировании все ядра процессора были загружены почти полностью (много экземпляров процедуры работало), то есть могли тормозиться другие транзакции. В реальности пересчитать резервы для нескольких сотен товаров нужно только при учете прихода от поставщика или большого межскладского перемещения, а в таких случаях быстрый пересчет резервов не очень нужен, если пересчитаются через 15-30 секунд - это всех устроит. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 19:18 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovOremaxпропущено... s_ustinov, я считаю, что было бы хорошим тоном вместе с цифрами описать методику и условия тестирования или не приводить цифры вовсе. Ок. К сожалению, у меня не было возможности провести полноценное тестирование. Поэтому тестировал "на коленке": На тестовом сервере (характеристики не помню, но далеко не самый новый и мощный - в 2013 году ему было уже несколько лет) была копия рабочей базы. Я сформировал список товаров, по которым необходимо было создать резервы (есть в заказах покупателей или в неучтенных межскладских перемещениях). Таких всего оказалось меньше 15 тысяч. После чего написал простую процедуру. Эта процедура с помощью Service Broker запускала много экземпляров процедуры пересчета резервов. Фактически, я смотрел, как работают сообщения, тестирование производительности было второстепенным. В результате у меня очень быстро запустилось много экземпляров процедуры пересчета резервов, каждый экземпляр процедуры пересчитывал резервы для 200 товаров (точно уже не помню, может и 100). И за чуть больше чем 15 секунд все экземпляры процедуры завершили работу (некоторые отработали за 3 секунды, другие подольше, а один то ли 15, то ли 16 секунд работал). Я тогда посчитал - больше 900 товаров в секунду обработано. В результате было создано около 40 тысяч строк резервов. Методика тестирования не самая совершенная, но мне хватило. На рабочей базе использовался другой механизм запуска пересчета резервов. Джоб каждую секунду запускал новый экземпляр процедуры пересчета резервов. Так было проще и такой скорости обработки хватало для реальных задач. Ну и при тестировании все ядра процессора были загружены почти полностью (много экземпляров процедуры работало), то есть могли тормозиться другие транзакции. В реальности пересчитать резервы для нескольких сотен товаров нужно только при учете прихода от поставщика или большого межскладского перемещения, а в таких случаях быстрый пересчет резервов не очень нужен, если пересчитаются через 15-30 секунд - это всех устроит. Спасибо. К сожалению, у нас совершенно разные методики тестирования поэтому наши и ваши результаты сравнивать некорректно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 20:09 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxЕсть ли примеры систем автоматизации бизнеса, реализованных с помощью BPMN?Конечно. Наиболее всего - в банковской сфере. Можно зайти на сайт любой BPMS, использующую данную нотацию, и посмотреть информацию о наиболее крупных внедрениях. Однако, я не хочу вводить в заблуждение. Нотация BPMN используется системами BPMS, которые позволяют получать исполняемые WEB-приложения "от схемы бизнес-процесса". Однако, такой подход требует специального "движка", быстродействие которого рассчитано именно на операции, выполняемые в составе бизнес-процессов. Мне неизвестны случаи, когда эту нотацию использовали бы, например, для разработки многопоточных WIN-приложений с распараллеливанием вычислений. Однако, эта нотация, по моему мнению , содержит в себе такой потенциал - идеи, реализованные в ней, могут быть использованы, ПМСМ, для разработки вообще любых приложений. Но пока не используются . Посредством схожих подходов можно автоматизировать не только бизнес-процессы, но и технологические процессы, и вообще любые процессы, ПМСМ . Но пока эта нотация используется только для автоматизации бизнес-процессов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 20:16 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovТо резервы пропадают, то кладовщики не могут нормально учесть складские операции из-за резервов. Как вы решили задачу обработки таких ситуацийs_ustinovПрограммист 1сСтранно - зачем Вам как кодеру цвет ж*пы знать? Вы же сами говорили что Вам достаточно знаний кодера, а всякие там бизнес процессы- этим глупостями пусть другие занимаются... ps Я бы конечно сначала разобрался в причинах пропажи резервов, причин невозможности сборок, разобрался бы почему и из-за чего подобные ситуация возникают и возможно решил их не используя ни одной строчки кода. Но мы же не ищем легких путей? Код наше все? Я не спрашивал про детали бизнес - процесса, а спрашивал про поведение (возможности) программы в ситуации, когда кладовщик принял на склад меньше товаров, чем указано в документах. И мне действительно интересен ответ на этот вопрос - в свое время потратил много времени, чтобы найти решение, и интересно, как другие решали эту же задачу. В свою очередь я могу объяснить, как такие ситуации решаются в моем алгоритме. Программист 1с, когда человек начинает задавать не относящиеся к предмету обсуждения вопросы только для того, чтобы скрыть, что ему нечего ответить по существу - это всегда очень заметно.Тоесть пропажа резервов, или проблемы с учетом резервов - это мелочь неинтересная Вам? И из-за того что Вы не разорались в бизнес процессах, вы решаете эту задачу кодом? Может надо было просто подумать получше? ps И в ответ на разумные вопросы - один и тот же ответ, то анекдот про ж*опу. то рассказ что оппонент ничего не понимает... Уже интересно какую очередную глупую отмазку придумаете, из-за Вашего неумения посмотреть на проблему целиком, а не рассуждать как недальновидный кодер. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 20:42 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1сТоесть пропажа резервов, или проблемы с учетом резервов - это мелочь неинтересная Вам? И из-за того что Вы не разорались в бизнес процессах, вы решаете эту задачу ? Может надо было просто подумать получше? ps И в ответ на разумные вопросы - один и тот же ответ, то анекдот про ж*опу. то рассказ что оппонент ничего не понимает... Уже интересно какую очередную глупую отмазку придумаете, из-за Вашего неумения посмотреть на проблему целиком, а не рассуждать как недальновидный кодер. да много чего не учтено и самая главная тема с резервами даже не затронута! а ведь это бич всех дистрибьюторов! давайте сыграем в угадайку, а я завтра в 10 часов напишу что имел в виду ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 21:24 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1сs_ustinovТо резервы пропадают, то кладовщики не могут нормально учесть складские операции из-за резервов. Как вы решили задачу обработки таких ситуацийs_ustinovпропущено... Я не спрашивал про детали бизнес - процесса, а спрашивал про поведение (возможности) программы в ситуации, когда кладовщик принял на склад меньше товаров, чем указано в документах. И мне действительно интересен ответ на этот вопрос - в свое время потратил много времени, чтобы найти решение, и интересно, как другие решали эту же задачу. В свою очередь я могу объяснить, как такие ситуации решаются в моем алгоритме. Программист 1с, когда человек начинает задавать не относящиеся к предмету обсуждения вопросы только для того, чтобы скрыть, что ему нечего ответить по существу - это всегда очень заметно.Тоесть пропажа резервов, или проблемы с учетом резервов - это мелочь неинтересная Вам? И из-за того что Вы не разорались в бизнес процессах, вы решаете эту задачу кодом? Может надо было просто подумать получше? ps И в ответ на разумные вопросы - один и тот же ответ, то анекдот про ж*опу. то рассказ что оппонент ничего не понимает... Уже интересно какую очередную глупую отмазку придумаете, из-за Вашего неумения посмотреть на проблему целиком, а не рассуждать как недальновидный кодер. А почему вы решили, что я не разобрался в бизнес процессах? И какая связь между бизнес процессами и пропажей резервов или проблемами с учетом резервов? Причину проблем с резервами мы выяснили - "длинные" транзакции и как следствие дедлоки. Когда начали использовать новую процедуру резервирования, ни пропаж резервов, ни других проблем не осталось. И к складским бизнес процессам это не имеет ни малейшего отношения. Или вы решаете технические проблемы с блокировками путем изменения бизнес процессов? Тоже, конечно, вариант, но если причина проблем - медленная работа системы, надо такую проблему решать техническими средствами, а не административными. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 22:20 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПрограммист 1спропущено... пропущено... Тоесть пропажа резервов, или проблемы с учетом резервов - это мелочь неинтересная Вам? И из-за того что Вы не разорались в бизнес процессах, вы решаете эту задачу кодом? Может надо было просто подумать получше? ps И в ответ на разумные вопросы - один и тот же ответ, то анекдот про ж*опу. то рассказ что оппонент ничего не понимает... Уже интересно какую очередную глупую отмазку придумаете, из-за Вашего неумения посмотреть на проблему целиком, а не рассуждать как недальновидный кодер. А почему вы решили, что я не разобрался в бизнес процессах? И какая связь между бизнес процессами и пропажей резервов или проблемами с учетом резервов? Причину проблем с резервами мы выяснили - "длинные" транзакции и как следствие дедлоки. Когда начали использовать новую процедуру резервирования, ни пропаж резервов, ни других проблем не осталось. И к складским бизнес процессам это не имеет ни малейшего отношения. Или вы решаете технические проблемы с блокировками путем изменения бизнес процессов? Тоже, конечно, вариант, но если причина проблем - медленная работа системы, надо такую проблему решать техническими средствами, а не административными.Забавно смотреть как кодеры решают вопрос "а я на секунду ускорил время обработки Х, а я на 2" и хвастаются друг другу. А потом приходит начальник (пусть склад) и говорит - а завтра будет отгружать через А (а не Б и С как ранее), и все обработки кодеров летят в помойку. И тут же на форумах идет новый рассказ о медленной работе системы и ее геройском решении... ps Вы не разобрались в бизнес процессах, ни тем более в складских по 2 причинам: 1 - Вы высмеиваете оппонентов когда Вам это предлагают. 2 - Вы вместо "Я разобрался" пишете "Мы разобрались", а это всегда значит что кто-то подумал за Вас. Модератор: Программист 1с, очень прошу Вас быть чуточку тактичнее. Мне что, каждого отдельно нужно упрашивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 22:54 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinov спрашивал про поведение (возможности) программы в ситуации, когда кладовщик принял на склад меньше товаров, чем указано в документах. поведение программы следующее: приходуется факт, генерятся документы расхождения, если резервов в пути было больше чем факт, по правилам отбираются и отменяются резервы, менеджеры этих резервов получают СМС или емайлы я вас больше скажу: бывают повторные приемки: когда часть товара не удалось опознать, эту часть приходуют повторно в рамках прихода. отыскавшийся товар снова падает в резервы, снова смски менеджерам: а вдруг клиент еще не отменил заказ...да, жизнь, она такая То есть при отклонениях резервы просто теряются и корректировки надо делать вручную... А как "отыскавшийся товар снова падает в резервы"? Если резерв уже отменен и менеджеру смс отправлен? Или снова падает в резервы тоже вручную? И как "по правилам отбираются и отменяются резервы" - отбирается самый поздний заказ и его резервы отменяются или используются более сложные правила? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 00:07 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Я бы упорядочил обсуждение темы. Или обсуждаются бизнес-процессы и бизнес-правила связанные с резервированием. Или уже больше техническая реализация, в том числе решение проблем блокировок и производительности. Правильнее конечно сначала первое определить, но изначально автор сделал посыл(как мне показалось) именно про техническую реализацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 09:10 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bobпропущено... поведение программы следующее: приходуется факт, генерятся документы расхождения, если резервов в пути было больше чем факт, по правилам отбираются и отменяются резервы, менеджеры этих резервов получают СМС или емайлы я вас больше скажу: бывают повторные приемки: когда часть товара не удалось опознать, эту часть приходуют повторно в рамках прихода. отыскавшийся товар снова падает в резервы, снова смски менеджерам: а вдруг клиент еще не отменил заказ...да, жизнь, она такая То есть при отклонениях резервы просто теряются и корректировки надо делать вручную... А как "отыскавшийся товар снова падает в резервы"? Если резерв уже отменен и менеджеру смс отправлен? Или снова падает в резервы тоже вручную? И как "по правилам отбираются и отменяются резервы" - отбирается самый поздний заказ и его резервы отменяются или используются более сложные правила? не теряются, а отменяются. заказ меняет свой статус, менеджер заказа предупреждается и дальше ДА: связывается с заказчиком, переносит строки заказа, либо удаляет позиции..........а у вас как-то иначе? вы вообще нарисовали тут красивый воздушный замок, при этом при покупке запчастей я что-то не заметил скорости и бесперебойности работы заказываешь запчасть, что в экзисте, что в академии, заказывается она почти мгновенно, но шансы получить "отказ поставщика" есть, и они прямо пропорциональны остаткам. я те детали которые в малом количестве на остатках почти никогда не заказываю: наверняка их не привезут или вы про какие-то другие автозапчасти тут нам рассказываете? или мы с вами в разных реальностях находимся? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 10:36 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
antandЯ бы упорядочил обсуждение темы. Или обсуждаются бизнес-процессы и бизнес-правила связанные с резервированием. Или уже больше техническая реализация, в том числе решение проблем блокировок и производительности. Правильнее конечно сначала первое определить, но изначально автор сделал посыл(как мне показалось) именно про техническую реализацию. техническая реализация сферического бизнес-процесса в вакууме.....а это стоит обсуждать? или сначала спуститься на землю, где не всегда привозят заказанный товар, где иногда приводят не то, где не находится товар на складе, а потом находится, где (кто бы мог поверить!) манагеры связываются с заказчиком и отменяют/корректируют заказ ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 10:38 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bobпропущено... поведение программы следующее: приходуется факт, генерятся документы расхождения, если резервов в пути было больше чем факт, по правилам отбираются и отменяются резервы, менеджеры этих резервов получают СМС или емайлы я вас больше скажу: бывают повторные приемки: когда часть товара не удалось опознать, эту часть приходуют повторно в рамках прихода. отыскавшийся товар снова падает в резервы, снова смски менеджерам: а вдруг клиент еще не отменил заказ...да, жизнь, она такая И как "по правилам отбираются и отменяются резервы" - отбирается самый поздний заказ и его резервы отменяются или используются более сложные правила? более сложные правила вы знаете, у нас все равны, но некоторые более равны так и с клиентами а вы с таким не сталкивались? в жизни оно так. иногда машины возвращают обратно на склад, чтобы товар переложить в заказ более важного клиента. и это все делается вручную, по телефонному звонку ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 10:43 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob, Да я не против, но я вижу содержание первых постов автора в теме И вижу что потом обсуждение начало "прыгать" то про бизнес-процессы и правила резервирования, то про техническую реализацию(блокировки и т.п.), все в кучу. Вы не находите что неправильно и непродуктивно? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 12:30 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
antand_bob, Да я не против, но я вижу содержание первых постов автора в теме И вижу что потом обсуждение начало "прыгать" то про бизнес-процессы и правила резервирования, то про техническую реализацию(блокировки и т.п.), все в кучу. Вы не находите что неправильно и непродуктивно? я нахожу, что обсуждения на форуме в рабочее время сами по себе неправильны и непродуктивны а я вижу еще 18 страниц бессмысленного холивара в соседнем форуме, из которого обсуждение s_ustinov перенес сюда ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 12:55 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob не теряются, а отменяются. заказ меняет свой статус, менеджер заказа предупреждается и дальше ДА: связывается с заказчиком, переносит строки заказа, либо удаляет позиции..........а у вас как-то иначе? вы вообще нарисовали тут красивый воздушный замок, при этом при покупке запчастей я что-то не заметил скорости и бесперебойности работы заказываешь запчасть, что в экзисте, что в академии, заказывается она почти мгновенно, но шансы получить "отказ поставщика" есть, и они прямо пропорциональны остаткам. я те детали которые в малом количестве на остатках почти никогда не заказываю: наверняка их не привезут или вы про какие-то другие автозапчасти тут нам рассказываете? или мы с вами в разных реальностях находимся? У вас немного другая страна, так что не могли заметить. http://www.elit.ua/ Когда я обсуждал с менеджерами, что надо делать, если товар не приехал в перемещении, все отвечали одинаково - если он где-то есть - привозить. Разумеется, клиентам не нравится, что пообещали товар завтра, а он приехал послезавтра. Но еще больше им не нравится, если товар вообще не приехал. И случаи, когда клиент отказывается от заказа по причине срыва сроков - редкость. Не имеет смысла им звонить и уточнять - у нас небольшая накладка произошла, сегодня товар не привезли, должны привезти завтра - сохраняем заказ? В 99% клиент подтверждает заказ. Поэтому в моем варианте алгоритма ситуация, когда товар не приехал, вообще никак не обрабатывается . Алгоритм просто "не видит", полностью приехало перемещение или нет - он никак не анализирует те резервы, которые были и уже учтенные перемещения - это сложно и долго. Он просто резервирует товар там, где найдет. И если в перемещении с центрального склада товар не приехал, но на центральном складе этот товар есть - зарезервирует на центральном складе и товар приедет следующим перемещением. С одной стороны, в этом есть некоторая проблема. Нет события, к которому можно привязать отправку емаил или смс с предупреждением, что сроки выполнения заказа срываются. С другой стороны, резервирование вообще не требует от менеджеров и кладовщиков дополнительных телодвижений. Оно полностью работает в фоновом режиме. И если товар где-то есть - он будет доставлен (возможно, позже, чем обещали). У проблемы оповещения о срыве сроков есть другой вариант решения. Для каждой строки заказа можно рассчитать и сохранить ожидаемый срок выполнения (если товар есть на локальном складе - дата заказа, если на центральном - дата заказа + 1 день и т.д.). И регулярно запускать проверку (например, пару раз в день) - соответствуют ли ожидаемые сроки выполнения текущим резервам. Например, срок выполнения 09.01, сейчас 11.01, товар зарезервирован на складе, откуда будет отгрузка - все хорошо. Или срок выполнения 12.01, товар зарезервирован на центральном складе, срок поставки с которого +1 день, 11.01 + 1 день = 12.01 - тоже всё хорошо. А например срок выполнения 11.01, товар зарезервирован на центральном складе, срок поставки с которого +1 день, 11.01 + 1 день = 12.01 - сроки сорваны. И рассылать менеджерам отчет о срыве сроков. Или же включить эти данные в отчет о готовности заказов к отгрузке - есть специальный отчет, показывающий, какие заказы полностью готовы к отгрузке (все товары зарезервированы под заказ на складе отгрузки), какие частично. Правда, сроки доставки я не доделал, и не знаю, сделали этот функционал или нет. Вообще тема резервов для подобных фирм часто достаточно болезненная. _bobно шансы получить "отказ поставщика" есть, и они прямо пропорциональны остаткам. я те детали которые в малом количестве на остатках почти никогда не заказываю: наверняка их не привезут - это во многом именно проблемы резервирования. Те варианты реализации резервирования, что я видел, работали ненадежно и требовали много ручного контроля. Например, межскладские перемещения. Даже если всё приехало, не факт, что резерв не потеряется. Когда резервы "переносятся" с перемещения на локальный склад, из-за дедлоков процедура может слететь, и резерв в результате "потеряется" - будет числиться за перемещением, которого уже нет (учтено), а товар, который есть на складе (который привезли) находится в свободном остатке, и другой менеджер может продать другому клиенту. А потом начинаются разборки в стиле "мой клиент этот товар 2 недели ждал, пока его привезут - что мне ему говорить?!?!" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 13:13 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovпропущено... И как "по правилам отбираются и отменяются резервы" - отбирается самый поздний заказ и его резервы отменяются или используются более сложные правила? более сложные правила вы знаете, у нас все равны, но некоторые более равны так и с клиентами а вы с таким не сталкивались? в жизни оно так. иногда машины возвращают обратно на склад, чтобы товар переложить в заказ более важного клиента. и это все делается вручную, по телефонному звонку Сталкивался, но "это все делается вручную, по телефонному звонку" Я ни разу не сталкивался с ситуацией, что в системе реализуются более сложные правила, чем FIFO. Всегда хватало связки "автоматическое FIFO" + "ручные корректировки". Я именно про это и спрашивал - когда возникает отклонение, изменение (отмена) резервов - полностью ручной процесс, или автоматом отменяются более поздние резервы (по FIFO)? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 13:29 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПоэтому в моем варианте алгоритма ситуация, когда товар не приехал, вообще никак не обрабатывается . Алгоритм просто "не видит", полностью приехало перемещение или нет - он никак не анализирует те резервы, которые были и уже учтенные перемещения - это сложно и долго. Он просто резервирует товар там, где найдет. И если в перемещении с центрального склада товар не приехал, но на центральном складе этот товар есть - зарезервирует на центральном складе и товар приедет следующим перемещением. ок, а если товара нет нигде? ни на каком складе или есть у партнера, но за совсем другие деньги а алгоритм и знать не знает, что часть товара не приехала ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 13:29 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bobпропущено... более сложные правила вы знаете, у нас все равны, но некоторые более равны так и с клиентами а вы с таким не сталкивались? в жизни оно так. иногда машины возвращают обратно на склад, чтобы товар переложить в заказ более важного клиента. и это все делается вручную, по телефонному звонку Сталкивался, но "это все делается вручную, по телефонному звонку" Я ни разу не сталкивался с ситуацией, что в системе реализуются более сложные правила, чем FIFO. Всегда хватало связки "автоматическое FIFO" + "ручные корректировки". Я именно про это и спрашивал - когда возникает отклонение, изменение (отмена) резервов - полностью ручной процесс, или автоматом отменяются более поздние резервы (по FIFO)? вот вам правила, которые мы применям в разных сочетаниях (как правило несколько правил с весовыми коэфф): 1. заказ оплачен/не оплачен 2. ПДЗ клиента/среднемесячный оборот 3. скидочная группа клиента (косвенный признак объемов и нашей лояльности к клиенту) 4. спецпризнак заказа "не снимать резерв" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 13:36 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobя нахожу, что обсуждения на форуме в рабочее время сами по себе неправильны и непродуктивны а я вижу еще 18 страниц бессмысленного холивара в соседнем форуме, из которого обсуждение s_ustinov перенес сюда Вопрос "когда обсуждать на форуме" к этой теме вроде не относиться. Что в соседнем форуме происходит - лишний раз говорит о необходимости направить эту тему в конструктивное русло. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 13:45 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovПоэтому в моем варианте алгоритма ситуация, когда товар не приехал, вообще никак не обрабатывается . Алгоритм просто "не видит", полностью приехало перемещение или нет - он никак не анализирует те резервы, которые были и уже учтенные перемещения - это сложно и долго. Он просто резервирует товар там, где найдет. И если в перемещении с центрального склада товар не приехал, но на центральном складе этот товар есть - зарезервирует на центральном складе и товар приедет следующим перемещением. ок, а если товара нет нигде? ни на каком складе или есть у партнера, но за совсем другие деньги а алгоритм и знать не знает, что часть товара не приехала Алгоритм проверит все "места", где товар можно зарезервировать. В том числе в заказах закупки (с точки зрения алгоритма это просто еще один "склад"). Если же товара вообще нигде нет, то создается строка резервирования без привязки к конкретному остатку с типом резерва "Надо закупить". Не факт, что товар реально будет закуплен, если сформировался такой резерв - это просто означает, что товара нет. Вообще закупка к самому алгоритму резервирования имеет только опосредованное отношение, но вкратце опишу. Бизнес процессы закупки сильно зависит от вида товаров, взаимоотношений с поставщиками и прочих вещей. Но во многих случаях в сфере торговли запчастями и подобными товарами можно использовать такую схему: Все товары делятся на несколько групп, например: - Стабильный хороший спрос - Покупают редко, но на складе держать надо - Поставляем под заказ Для каждого товара также можно предусмотреть пометки "Уточнять цену", "Уточнять условия поставки", "Больше не закупаем (распродажа остатков)" Если товар относится к категории “Стабильный хороший спрос” и запрашиваемое количество не превышает некоторого предела (например, 20% от квартального объема продаж) - просто включаем это количество в очередной заказ поставщику. Теоретически менеджер по закупкам вообще может не видеть этого заказа - система сама сформировала заказ, сама отправила поставщику, получила от него подтверждение и перевела заказ в статус подтвержденный. Если товар относится к категории “Покупают редко, но на складе держать надо”, то менеджер по закупкам просматривает такие запросы, часть из них утверждает к закупке сразу, часть отправляет на утверждение к менеджеру по продажам. Например, поставить сможем только через два месяца - клиент согласен ждать? Если товар относится к категории “Поставляем под заказ”, то кроме отдельного подтверждения от менеджера может потребоваться утверждение директором филиала или предоплата от клиента. Если клиент откажется от заказа, то такой товар “зависнет”, и к подобным заказам особый контроль. Если Заказывается большое количество (например, 100 штук, а всего за год обычно продаем 40 штук), то заказ получает статус “поставка под заказ” и также утверждается отдельно. Такой статус не блокирует продажи товара по обычным (мелким) заказам. Если у нас на всех складах 30 штук товара, а заказали 100 штук - при обычном статусе все они будут зарезервированы. Но при поставке под заказ алгоритм резервирования сформирует резерв “Надо закупить” на все 100 штук, а 30 останутся в свободных остатках. И если завтра придет клиент с заказом на 2 штуки (обычным заказом) - под него зарезервируются товары из 30 штук, которые в наличии. Нужен еще отчет или автоматическая рассылка уведомлений, по которым менеджеры по продажам будут отслеживать те заказы, которые требуют от них определенных действий. Например, в системе числится 1 штука в наличии. Клиент её заказал. На следующий день оказалось, что товара нет (он бракованный). У товара категория “Поставляем под заказ” и пометка "Больше не закупаем (распродажа остатков)" - менеджер должен или получить сообщение, или увидеть в отчете, что заказ выполнить невозможно. То есть в заказе есть строка, по которой есть резерв с типом "Надо закупить”, а товар имеет пометку "Больше не закупаем (распродажа остатков)". И далее созванивается с клиентом и или отменяет заказ, или меняет товар на аналог, или оказывается, что клиенту очень нужен вот именно этот товар и он готов заплатить нормальную цену, а не цену распродажи - тогда товар закупают под заказ, несмотря на все статусы. И если создали заказ поставщику - алгоритм резервирования тут же создаст в нем резерв под этот заказ продажи, несмотря на все статусы на товаре. Похожим образом “отлавливаются” все заказы, по которым люди должны принимать дополнительные решения. На самом деле процесс закупок содержит намного больше нюансов, это только поверхностное описание. Да и подходит такой вариант не всем фирмам. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:13 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovпропущено... Сталкивался, но "это все делается вручную, по телефонному звонку" Я ни разу не сталкивался с ситуацией, что в системе реализуются более сложные правила, чем FIFO. Всегда хватало связки "автоматическое FIFO" + "ручные корректировки". Я именно про это и спрашивал - когда возникает отклонение, изменение (отмена) резервов - полностью ручной процесс, или автоматом отменяются более поздние резервы (по FIFO)? вот вам правила, которые мы применям в разных сочетаниях (как правило несколько правил с весовыми коэфф): 1. заказ оплачен/не оплачен 2. ПДЗ клиента/среднемесячный оборот 3. скидочная группа клиента (косвенный признак объемов и нашей лояльности к клиенту) 4. спецпризнак заказа "не снимать резерв" В том варианте, что я делал, дополнительные "статусы" заказов / клиентов не участвовали. Но добавить такие правила относительно несложно. Если есть формула (например "несколько правил с весовыми коэфф"), которая переводит все эти признаки в итоговое число "приоритета", так чтобы можно было сказать, что заказы с приритетом "105" надо всегда обрабатывать раньше, чем заказы с "приоритетом" "108" (так как 105 < 108), то можно просто включить в алгоритм сортировку не по одному полю "приоритет FIFO", а по двум - "приоритет заказа", "приоритет FIFO". Для моего алгоритма важно, чтобы все строки, которые надо зарезервировать, можно было однозначно отсортировать по приоритету. А будет сортировка по одному полю, по двум или по нескольким полям - не важно. Но надо понимать, что такие приоритеты могут приводить к неожиданным последствиям. Например, привезли товар под заказ на региональный склад, позвонили клиенту, что он может забирать заказ. И тут VIP клиент делает заказ на 20 штук, а свободный остаток 10 штук. И когда обычный клиент приедет за своим заказам, товар не смогут отгрузить, так как он окажется зарезервированным за заказом VIP клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:28 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobда много чего не учтено и самая главная тема с резервами даже не затронута! а ведь это бич всех дистрибьюторов! давайте сыграем в угадайку, а я завтра в 10 часов напишу что имел в виду _bob, как будет свободное время - напишите про "главную тему". А то заинтриговали, и молчите. Интересно же! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 16:26 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov_bobда много чего не учтено и самая главная тема с резервами даже не затронута! а ведь это бич всех дистрибьюторов! давайте сыграем в угадайку, а я завтра в 10 часов напишу что имел в виду _bob, как будет свободное время - напишите про "главную тему". А то заинтриговали, и молчите. Интересно же! :) а я думал, никто внимания не обратил так вот: на мой взгляд, в резервировании товара на складе самый важный момент - это контроль и ограничение резервов, т.к. в резервах замораживаются огромные деньги на прошлой работе ПОСТОЯННО была ситуация: склад битком, а менеджеры кричат что торговать нечем. весь ходовой товар на резервах. причем менеджеры из резервов устраивают персональные склады и начинает процветать коррупция: дай мне то, а я тебе дам вот это и т.д. пытались решать проблему технически установкой правил, лимитов, но пока не прислушались ко мне и не поняли, что проблема решается организационными мерами - не искоренили ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 17:07 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bob на мой взгляд, в резервировании товара на складе самый важный момент - это контроль и ограничение резервов, т.к. в резервах замораживаются огромные деньги на прошлой работе ПОСТОЯННО была ситуация: склад битком, а менеджеры кричат что торговать нечем. весь ходовой товар на резервах. причем менеджеры из резервов устраивают персональные склады и начинает процветать коррупция: дай мне то, а я тебе дам вот это и т.д. пытались решать проблему технически установкой правил, лимитов, но пока не прислушались ко мне и не поняли, что проблема решается организационными мерами - не искоренили скорость оборота... как много в этих звуках... Да, если не контролировать резервы с точки зрения их обоснованности - это ЛЕГКО превращается в большую проблему. Согласен, в первую очередь проблема должна решаться на административном уровне. Проблему "неоправданных" резервов можно разделить на две части. 1. Запасы на филиалах. Часто директора филиалов имеют полномочия принимать решения по своим складским остаткам. И практически всегда это завершается плохо. Причин несколько: Во первых, у них нет ни времени, ни знаний, чтобы правильно спланировать и управлять запасами. Во вторых, редко контролируется скорость оборота именно локального склада. Просто поделить продажи филиала за период на средние остатки за период нельзя, но это часто не понимают даже "менеджеры" по управлению запасами. Да и функции локального склада не только в обеспечении продаж, но и быть своеобразной витриной - "Вот, смотрите как выглядит железяка. Вам 10 штук? Ну, столько мы на локальном складе не держим, завтра привезем с центрального склада." Часто директора других филиалов, чтобы что-то взять из товара себе, должны согласовать с директором филиала, где лежит товар. А ему очень легко сказать - нет, это я держу для любимого клиента - "и начинает процветать коррупция: дай мне то, а я тебе дам вот это и т.д." В результате довольно большие запасы на филиалах лежат мертвым грузом. Технически в системе этот товар может и не числиться как "резерв", а по факту является резервом - ведь другие продавцы не могут получить к нему доступ. 2. Резервы "на всякий случай" на уровне менеджеров. Когда "весь ходовой товар на резервах. причем менеджеры из резервов устраивают персональные склады и начинает процветать коррупция: дай мне то, а я тебе дам вот это и т.д." По большому счету, решение есть только одно - резерв может быть только под продажу . Нельзя просто "зарезервировать" товар, потому что тебе захотелось иметь его в резерве. И надо достаточно жестко следить за резервами (иначе будет много левых заказов с резервами). Во первых, легко строится отчет - сколько по менеджеру товара в резерве и какие у него продажи. Это позволяет быстро выявить любителей резервировать без оснований. А во вторых, надо четко контролировать сроки по каждому заказу - сколько дней лежит товар в резерве. Легко сделать отчет, показывающий, когда и что резервировалось. И технические ограничения - просто резерв держится максимум 2-3 дня. После чего должен автоматически сниматься с резерва. Если дольше - это уже исполнение заказа. Товар не просто лежит, а перемещается с других складов. И опять же - если товар переместили и заказ готов к отгрузке больше чем 2-3 дня - надо спрашивать у менеджера, в чем дело? Если клиент отказался от заказа - надо закрыть заказ (и резерв). Если надо чуть больше, чем 2-3 дня - пусть клиент как минимум заплатит предоплату. С филиалами во многом аналогично. Первое - если у них нет заказа продажи - их товар может продать любой филиал без всякого согласования. То есть резервировать и забирать товар могут все филиалы без ограничений, и директор филиала обязан собрать и отгрузить перемещение на все запрошенные позиции (по крайней мере спрашивать будут с него, а не кладовщика))). Но если такое правило еще не внедрено - крику будет... Потом, конечно, привыкают, но только потом... Второе - установить лимит на хотелки. Например - у тебя на складе будут лежать вот эти УУУ тысяч наименований в вот таких количествах, можешь набрать еще товара на склад по своему усмотрению на ХХХ тысяч денег. И всё. Есть дополнительные пожелания по товару сверх этой суммы - обоснуй необходимость. У некоторых действительно такая необходимость есть, и им надо дополнительно увеличить склад, но обычно это максимум пара десятков наименований. Правда, к самому алгоритму все эти контроли резервов не относятся. Задача алгоритма - просто создать резервы под те заказы, под которые надо зарезервировать товар. А контроль того, чтобы менеджеры не резервировали лишнее - это отдельная задача. Для такого контроля система должна выполнить несколько правил: - Автоматически отменять "бланковые" резервы через некоторое время (2-3 дня) - ставить на заказ признак "не резервировать" или закрывать заказ. У менеджера должен быть отчет, какие резервы будут сняты - чтобы можно было уточнить у клиента статус заказа. - Автоматически резервировать на всех складах (чтобы не хранились на филиалах залежи товара, которые вроде есть, но продать их нельзя). - Позволять формировать несколько отчетов по резервам, в частности по срокам резервов (например, показать только те заказы, по которым товар зарезервирован 10 и более дней). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 19:18 |
|
|
start [/forum/topic.php?all=1&fid=29&tid=1525788]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
170ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 376ms |
0 / 0 |