Волшебный штрихкод

habr.png

Рустам подошел к Стасу, передал ему пачку бумаг — грязных, в масле, с помятыми уголками и какими-то пометками.

— Что за макулатура? — спросил Сергей, заглядывая через плечо Рустама.

— Сам ты макулатура. — обиделся Рустам. — Накладная это, на сборку.

— А нам ты ее зачем принес? — спросил Сергей.

— Да вон… — махнул рукой Рустам. — Даша опять чего-то намудрила, надо разбираться.

— Чего я намудрила, чё ты гонишь? — Даша была родом из деревни, что было видно невооруженным взглядом. Да она и не скрывала. — Мне сказали, я сделала!

— Кто тебе что сказал? — удивился Сергей. — Что тут вообще происходит?

— Да они документ меняют в системе, а потом Рустам вой поднимает. — ответил за всех Стас. — Обычно ничего страшного — позиции там местами передвинут, или одну строку на две разобьют.

— Нафига? — недоуменно спросил Сергей.

— Надо, чё ты. — с вызовом сказала Даша. — Я чего сделаю, если там минуса прут?

— Где какие минуса?

— В оборотке, где еще. Одна позиция, а лежит на разных счетах. Вот и разбиваю — немного отсюда, немного оттуда.

— Ну, это нормально. — кивнул Сергей. — А Рустам чего тогда докопался?

— Я не докопался, а задолбался! — сказал Рустам. — Мне дают в понедельник эту бумажку, с двумя сотнями позиций, я иду собирать. А во вторник захожу, а Даша говорит — возьми новую бумажку, там мы немного поменяли. Печатает — мать честная, а там уже двести пятьдесят позиций!

— Ну, она только что объяснила. — кивнул Сергей. — Разбивает позиции на несколько строк. Общее количество и позиции остаются без изменения.

— А я-то почем знаю, с изменениями или нет? — возмутился Рустам. — Наменяют чего-то, а мы потом виноваты, не то положили, не туда утащили.

— Даша, а давай запретим тебе документы менять? — прищурился Сергей. — Чтобы Рустаму спокойнее было.

— Щас! — Даша сделала руки в боки. — Я тебе запрещу! Меня главбух сожрет!

— Я сам тебя сожру! — с доброй улыбкой сказал Рустам.

— Ну-ну, обещаешь только. — с улыбкой ответила Даша.

— Так, друзья, валите отсюда, воркуйте под забором. — тоже улыбнулся Сергей.

— Ну щас, разберемся, и пойдем. — ответил Рустам.

— Все нормально. — Стас, все это время ковырявшийся в системе, повернулся к коллегам. — Я проверил. Работай дальше.

— А как ты проверил? — нахмурился Сергей.

— А у меня тут инструментик есть. — с гордостью заявил Стас. — Он старые версии документа достает, и сверяет с текущей. Я там строчки сворачиваю — ну, чтобы убрать все эти разбиения — и общие количества проверяю. На, Рустам, забирай.

— О, спасибо, Стасяндра! — заулыбался Рустам, взял бумажки и пошел к выходу. Даша направилась следом.

— И что, нормально это, по-твоему? — спросил Сергей, когда парочка закрыла за собой дверь.

— Что именно? — нахмурился Стас.

— Чтобы люди к тебе бегали за этой сверкой?

— А какие варианты есть? — немного обиженно ответил Стас. — Я сначала их самих заставлял сверять, но это адская работа, сам посуди — у нас, обычно, бумажки длинные, на несколько листов, потому что позиций много за раз перемещают, для сборки одной единицы оборудования.

— Ну да, это точно не вариант… — кивнул Сергей.

— Ну вот, и я так подумал. Потом думаю — о, есть же версии! Пусть версии сравниваются! Ну и написал этот инструментик, простенький. Только…

— Только что?

— Ну…Не всегда он помогает.

— Почему?

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

— Может, на бумажке выводить какую-то информацию об оригинале и версии? Ну, типа, распечатано второго октября в двенадцать часов.

— Я думал об этом, но не стал пока делать. Это ж какой геморрой — надо во все виды бумажек эту фигню выводить.

— Почему? — недоумевал Сергей.

— Ну как… На перемещение — одна форма бумажки, на отгрузку — другая, на передачу в производство — третья, и так далее. Некоторые бумажки еще и унифицированные, в смысле по государственному стандарту печатаются, там нельзя всякую фигню выводить, типа даты распечатки.

— А, ну да… И что?

— Что-то, не знаю я. — пожал плечами Стас. — Вот так и мучаемся.

— Не, так не годится… — задумчиво сказал Сергей. — Надо что-то придумать…

— Да пробовали мы, разные варианты. — чуть повысил тон Стас. — Еще до тебя пробовали. Терминалы сбора данных, например.

— Во, кстати, отличная ведь идея! — подхватил Сергей. — Никаких бумажек, и связь с системой прямая. Сделал бухгалтер документ — он сразу у кладовщика появился!

— Не, неудобно и дорого. — покачал головой Стас.

— Почему? Давай объясняй.

— Во-первых, дорого. — начал Стас. — Сам посуди. Обычный ТСД, с маленьким экранчиком — не годится, хотя он и не дорогой.

— Почему не годится?

— Ну ты попробуй сам с таким экранчиком пособирать две сотни позиций. — улыбнулся Стас. — ТСД для другого нужен — для розницы, там. Здесь он реально только мешать и бесить будет. Другое дело — планшет.

— Ну вот, заработала мысль! — снова подхватил Сергей.

— Заработала и отработала. — улыбнулся Стас. — Это реально дорого, потому что планшет нужен защищенный. Мы брали один, на пробу — бешеных денег стоит.

— Нафига защищенный? — нахмурился Сергей. — У нас же обычные условия, не жарко, не мокро.

— Ну как… Мокро. Видел, в каком состоянии бумажки?

— Грязные.

— Да. Потому что у нас, повторюсь, не розница. Детали без упаковки, зато — в смазке. Руки постоянно грязные.

— Перчатки может выдать?

— В перчатках планшетом пользоваться не получится, ты чего? — улыбнулся Стас. — Да и все равно промокают они, от масла, или чем там детали смазывают… Не годится, короче. Да и неудобно.

— Чего неудобно?

— С планшетом неудобно. На бумажке же как: взял позицию, положил в ящик — ручкой галочку поставил. Взял меньше — поставил количество, ручкой опять же. Бумажек можно с собой несколько таскать. Одну — в один карман, другую — в другой. Не надо ничего искать там в компьютере, листать, материться. Собираешь один заказ, принесли другой, более срочный — убрал бумажку в карман, и спокойно пошел дальше. Опять же, бумажку удобно в ящик с деталями положить.

— Это зачем?

— Ну как… Один кладовщик собирал, смена закончилась, выходит вторая. Подходит кладовщик к ящику, берет бумажку, и доделывает — собирает то, что осталось. Бумажку — хоть в зубы бери, хоть…

— Я понял. — нахмурился Сергей.

— Ну вот…

— А ты откуда так все детально знаешь, про бумажки? — вдруг осенило Сергея.

— Так я с ними сколько провозился тогда. — сказал Стас. — Прям сам пробовал эти ящики собирать. Вот и понимаю теперь, что у них там и как.

— Ладно, ну делать-то что-то надо? Допустим, оставляем бумажки. Как сверить бумажку и систему?

— Распознавать, наверное, надо…

— Не, это вообще дебилизм. — покачал головой Сергей. — Во-первых, бумажек несколько, на одну накладную. Во-вторых, формат разный — ты сам говорил. Тут на полгода работы хватит, чтобы их распознать, да еще потом и сопоставлять.

— Ну да… — задумчиво сказал Стас.

— Какие еще варианты есть?

— Может, нам унифицировать бумажки? — вдруг сказал Стас. — Ну, для внутреннего пользования.

— В смысле? Как? Разве можно заменить типовую форму, принятую в каком-нибудь законе?

— Нет, ты не понял. Смотри сам. Вот у него сейчас какая накладная была? — спросил Сергей.

— На перемещение вроде…

— Типовая форма?

— Ну да, какая-то типовая.

— И что с ней потом будет? Когда перемещение свершится?

— В бухгалтерию сдаст, на хранение, наверное.

— В таком виде? Грязную, помятую?

— Нет, наверное… А как тогда?

— Я думаю, они ее перепечатают, и он ее подпишет. Там же есть подпись?

— Да, отправитель и получатель.

— Ну вот, оба и подпишут. — кивнул Сергей. — А раз ее перепечатают, то нафига в первый раз была типовая форма? Тем более, что она содержит ненужную информацию, а нужной — не содержит.

— Кстати, да… — как будто что-то вспомнил Стас. — Они жаловались тогда, еще конфликт был, когда пометки свои ручкой ставили на накладной для отгрузки. Бухгалтерия возмущалась, потом менеджеры — ну, что клиентам такое свинство отправляют. Тогда вроде и решили перепечатывать сызнова. Ну и там места не было для этих пометок, на полях только.

— Ну! Я и говорю! — Сергей начал воодушевляться. — Давай сделаем универсальную бумажку! Они ведь чем отличаются? Складские операции в смысле. Надо что-то взять и куда-от отнести, правильно?

— Ну, так… — кивнул Стас.

— Или со склада на склад, или — со склада в цех, или — со склада в автомобиль, или — наоборот, когда приход.

— А комплектация?

— А что комплектация? — удивился Сергей. — А, да… Там же из четырех деталек собирают одну?

— Да.

— Ну ладно, будет одна бумажка немного от других отличаться. Везде будет одна таблица товаров, а для комплектации — другая. А главное — мы там ничего лишнего выводить не будем, и место для пометок им оставим!

— Кстати, может, тогда и номер версии вывести? — вспомнил Стас. — Ну, чтобы сверять-то…

— Точно! Молодец, Стас! — заулыбался Сергей.

— Стараюсь! — гордо ответил Стас.

— Единственное… — по лицу Сергея мелькнула тень.

— Ну что опять… — скис Стас.

— Версии я не люблю, им нельзя доверять…

— Почему? — уныло спросил Стас.

— Мы их чистим периодически.

— А, да… — сокрушенно покивал головой Стас. — Они ж места много занимают…

— Да и тяжеловатый способ какой-то получается. — Сергей задумчиво вертел в руках смартфон. — Версии-то сравнивать. Надо что-то попроще выбрать…

— Какой-то бы другой признак, идентификатор найти…

— Типа штрихкода? — с надеждой спросил Стас.

— Ну да, типа штрихкода… Ну, чтобы…Как объяснить-то…

— Да я понял.

— Что ты понял?

— Чтобы этот штрихкод, или какой-то другой идентификатор, однозначно определял эту бумажку.

— Не, ты не понял. — покачал головой Сергей. — Однозначно определить бумажку может ее номер, тут и штрихкод не нужен. Вот ты когда вручную сверял, какую информацию использовал? То есть, что именно проверял?

— Так… Дату документа проверял — ну, чтобы день тот же самый был, а внутри дня пусть двигают, как хотят…

— Так, еще что? — заинтересовался Сергей.

— Еще отправителя и получателя…

— Да, это понятно, дальше что?

— Номенклатуру и количество, после свертки таблицы. Ну, чтобы дублирующихся строк не было.

— Ну вот. Считаем. — Сергей стал загибать пальцы. — Дата, отправитель, получатель, таблица с номенклатурой и количеством. Это — суть документа, его ключевые поля. Остальное, с точки зрения складского учета — чушь.

— Это ты про что?

— Там полно полей еще, особенно в отгрузке. Договоры всякие, счета учета, комментарии, заказы и т.д. — вся аналитика, нужная для управленческого, бухгалтерского учета, CRM и т.д. С точки зрения склада все это — чушь.

— А, понял, понял. — немного пристыженно закивал Стас.

— Так вот, как-то бы вот все эти поля, нужные нам идентифицировать, понимаешь? Ну, чтобы по какому-то признаку, что ли, раз! — и проверить состав документа. Вот этот, наш, складской состав. Понимаешь?

— Да, понимаю. Только не понимаю, как это сделать. — покачал головой Стас. — С версией я понимаю. Я там, в принципе, то же самое и делаю. А как такую информацию на бумажке хранить? Ты же этого хочешь? Хранить на бумажке, сверять с программой?

— Да. Может, все-таки штрихкод?

— Штрихкод документа?

— Ну да… Хотя… Нет. — замотал головой Сергей. — Не подойдет штрихкод. Он же сам по себе живет, и никакой полезной информации в себе не содержит.

— Почему? Как? — удивился Стас.

— Ну ты просто присваиваешь документам штрихкоды, по порядку, и все. Один документ — один штрихкод. Меняешь документ — штрихкод не меняется. Это, как длинный номер, или второй номер, не знаю… Просто пригодный для сканирования. Пикаешь, программа ищет его, и определяет, какой документ отсканировали. Все.

— Ну ты мне рассказывай… — махнул рукой Стас. — Я с розницей несколько раз работал, будет он мне про штрихкоды рассказывать…

— Ну давай, просвети меня, умник. — ухмыльнулся Сергей.

— Ща, докурим и сдадим. — с улыбкой произнес Стас фразу из старого анекдота про студентов. — Слышал про плушки?

— Плушки? Я очень любить русский язык и много говорить на он?

— Ой деревня… Ты фрукты в супермаркете покупаешь?

— Ну да, конечно.

— Тебя никогда не удивляло, что на кассе твои бананы нормально пробиваются, с определением веса, цены и т.д.? Заметь, по штрихкоду.

— Да, а что тут… Погоди… — задумался Сергей. — Они что, хранят эти штрихкоды? После каждого взвешивания запоминают результат в базе? И потом по штрихкоду ищут мой результат взвешивания?

— Ну, я говорю, деревня. Шибко умная. — засмеялся Стас. — Там все намного проще. Вся информация, необходимая для продажи, содержится в самом штрихкоде.

— То есть как? — удивился Сергей.

— То есть так. Деталей я не помню, примерно расскажу. Там плушка, то есть PLU — это то ли три, то ли четыре цифры, они однозначно идентифицируют товар.

— Да, что-то припоминаю такое… — пробормотал Сергей. Потом вдруг стал картинно кричать. — Галя! Какой плу на яблоко роял гала?

— Ну да, оно и есть. — кивнул Стас. — Это где весов в зале нет, там кассир должен плушку знать, потому что сам взвешивает. Но там и штрихкод, как таковой, не возникает.

— Про плушку понял, дальше что? — заинтересованно спросил Сергей.

— Дальше вес и цена, вроде, но это уже не суть. — махнул рукой Стас. — Я ж тебе к тому рассказал, что в штрихкод можно засовывать любую информацию, особенно в сто двадцать восьмой.

— Какой?

— Ну они же разные есть, штрихкоды-то. Блин, какой ты тупой, а? — улыбнулся Стас.

— Давай рассказывай. — не стал отвлекаться Сергей.

— Короче, есть разные виды, или типы, не знаю как называется эта классификация. Наиболее распространенный — EAN13, ты его видишь чаще всего. Но, если тебе надо много информации в штрихкод запихать, то лучше подходит Code128 — там даже буквы писать можно, и они кодируются, и раскодируются, и читаются любым сканером современным.

— Буквы? — округлил глаза Сергей. — Серьезно?

— Ну.

— Блин, это ж кайф! — улыбался Сергей. — Тогда все на свои места встает! Мы можем весь состав документа — ну, те поля, что я перечислил — загнать в одну длинную строку, как в стек, и закодировать в штрихкод! А потом — быстро сверять!

— Ну, не знаю…Представь, двести позиций, по каждой надо, хотя бы, код номенклатуры, количество… Очень длинная строка получится. Такую и сканер может не взять, обычный. Широкий какой-то нужен, я не знаю…

— И что, как быть-то? — скис Сергей. — Давай, умник, гений штрихкодирования, подсказывай.

— Ее бы как-то заархивировать, что ли, не знаю…

— Погоди… — в голову Сергея пришла какая-то мысль. — Точно, хорошо что ты про архиватор заговорил! Контрольную сумму надо вычислять!

— Чего?

— Да не тупи, Стас. — улыбнулся Сергей. — Ну, контрольная сумма, по длинной строке. Она там по разным алгоритмам вычисляется, это не важно. Важно, что она — короткая, понимаешь?

— Нет.

— Ну строка — длинная, хоть километр, а контрольная сумма — короткая, всегда короткая. И она всегда однозначно идентифицирует эту строку! Точнее, не саму строку, а нам это и не надо. Она скажет главное — изменился документ или нет!

— Начинаю понимать… — задумчиво сказал Стас. — Ты будешь вычислять контрольную сумму документа, сохранять ее, а при печати — выводить в виде штрихкода прямо на бумажку?

— Да!

— А дальше?

— А дальше они к тебе придут со своими бумажками грязномазыми, а ты сканером пик! — и говоришь — все, валите, ничего не изменилось. Система сама сходит, поищет эту контрольную сумму, и если нашла — значит, все хорошо. А если не нашла — значит, документ поменялся. Тогда подойдет твой тяжелый алгоритм, с версиями.

— О, точно! — поддержал Стас. — Тогда мы просто к информации о версии добавим контрольную сумму! Блин, кайф! Тогда, даже если документ поменялся, я однозначно определю версию, из которой была печать!

— Ну. Тогда и бегать к тебе им не надо, в общем-то… Дашь ей сканер, дешманский какой-нибудь, и пусть себе пикает. Или даже Рустаму дашь сканер, жалко что ли.

— Клево, слушай… — мечтательно сказал Стас. — Прям решение классное, мне нравится. Главное — не будет реагировать на изменения, не связанные со складом. Это, типа, такое умное версионирование, с быстрым откликом и определением ключевых отличий.

— Ага, но самое интересное в другом. — кивнул Сергей. — В том, что мы с тобой придумали, как быстро сверить бумажку с программой.

— А что? Это важно?

— Безмерно. В нашем проекте по складу.

Оглавление

© Habrahabr.ru