КодКипер — склад кодов маркировки
«КодКипер» хранит коды «Честного знака», которые вы закупаете помногу, и отдаёт их в печать по мере надобности.
Загруженный файл становится партией, а каждая его строка — кодом со статусом «Создан»: код лежит на складе, и его можно выдать.
Когда коды нужны на линию, вы делаете выгрузку: указываете артикул и количество, а в ответ получаете файл для принтера. Выданные коды переходят в статус «Выведен».
Испорченный при печати код списывают — он получает статус «Списан» и перестаёт считаться доступным. Ошибочную выгрузку отменяют целиком, и коды возвращаются в остаток.
Печатать этикетки можно здесь же: раздел «Этикетки» собирает шаблон в миллиметрах, а печать открывается из карточки выгрузки — по одной этикетке на выданный код. Отдельная программа для принтера не нужна: печатает браузер.
Три статуса кода
| Статус | Что значит | Когда появляется |
|---|---|---|
| Создан | Код лежит на складе и доступен для выгрузки | Сразу после загрузки файла |
| Выведен | Код выдан в печать и закреплён за выгрузкой | После выгрузки |
| Списан | Код испорчен и из остатка убран, но из базы не удалён | После списания с указанием причины |
Безвозвратно коды удаляет только откат партии, и он запрещён, если из партии уже что-то выдали. Списание, возврат в оборот и отмена выгрузки обратимы.
Первый вход, пароль и роли
Организация заводится регистрацией на сайте: «Цены» → «Попробовать 14 дней» → форма. Тот, кто её заполнил, становится владельцем: организация, учётная запись и пробный период создаются одним шагом, второго входа не требуется. Остальных сотрудников владелец и администраторы приглашают из «Настройки → Пользователи» — приглашение приходит письмом, человек открывает ссылку и придумывает себе пароль сам.
Одна учётная запись может работать в нескольких организациях: роль принадлежит паре «человек и организация», а не человеку. Если организаций больше одной, после входа открывается их список, а переключатель живёт в меню учётной записи справа вверху.
При неверном логине или пароле экран отвечает одинаково — «Неверный логин или пароль». Это сделано намеренно: по ответу нельзя понять, существует ли такая учётная запись. После 10 неудачных попыток за минуту с одного адреса вход временно блокируется, и в сообщении будет указано, через сколько секунд можно повторить. Есть и второй предел — 30 неудачных попыток по одному логину за 15 минут.
Вход через Яндекс ID и VK ID
Под формой входа есть кнопки «Войти через Яндекс» и «Войти через VK» — но только если установка их настроила: ненастроенный провайдер не рисует кнопку вовсе. Тем же способом можно и зарегистрироваться, и принять приглашение.
Два правила стоит знать заранее. Учётная запись, заведённая через провайдера, пароля не имеет: входить в неё нужно той же кнопкой, а поле пароля для неё не сработает никогда. И наоборот — вход через провайдера сам собой не привязывается к учётной записи с тем же адресом почты: совпадение адреса это не подтверждение личности, и такой вход отклоняется с просьбой войти паролем.
Второй фактор
Код из приложения-аутентификатора (Google Authenticator, Яндекс Ключ, 1Password и любое другое) включается на вкладке «Настройки → Безопасность» и только себе: потребовать его со всей организации нельзя. После включения пароль перестаёт быть входом сам по себе — за ним спрашивается шестизначный код.
Там же выписываются резервные коды — их печатают или кладут в менеджер паролей. Они и есть путь назад, если телефон потерян: каждый работает один раз. Если потеряны и телефон, и коды, второй фактор снимает администратор организации на вкладке «Пользователи»; он откажет, только если этот человек работает ещё и в другой организации, — тогда останется обратиться к тому, кто обслуживает сервер.
Смена пароля второй фактор не снимает, и сброс пароля администратором — тоже.
Смена пароля
Свой пароль меняет сам пользователь: значок учётной записи в правом верхнем углу → «Сменить пароль». Нужен текущий пароль, новый — не короче 6 символов, не совпадающий с текущим и повторённый в поле «Новый пароль ещё раз». Других требований к паролю нет.
Четыре роли
Роли строго старшинствуют: наблюдатель < оператор < администратор < владелец. Каждая следующая умеет всё, что умеет предыдущая, и сверх того своё. Владелец в организации ровно один.
| Действие | Наблюдатель | Оператор | Администратор | Владелец |
|---|---|---|---|---|
| Просмотр остатков, кодов, партий, выгрузок и журнала | да | да | да | да |
| Выгрузка файлов: коды, экспорт реестра, журнал в CSV | нет | да | да | да |
| Загрузка, выгрузка, списание, возврат в оборот | нет | да | да | да |
| Правка артикулов, порога остатка, архив | нет | да | да | да |
| Отмена выгрузки | нет | да | да | да |
| Откат партии | нет | нет | да | да |
| Пользователи, приглашения и API-токены | нет | нет | да | да |
| Умолчания выгрузки, резервная копия и обслуживание базы | нет | нет | да | да |
| Тариф, оплата и передача организации | нет | нет | нет | да |
- «Пользователи» — таблица скрыта, вместо неё строка о том, что учётные записи заводит администратор; сменить свой пароль и включить себе второй фактор может каждый.
- экран «API» — панель токенов не показывается вовсе, открывается сразу справочник;
- «Экспорт» — переключатель формата, флажок BOM и выбор часового пояса видны, но выключены, а внизу написано «Менять умолчания может администратор».
- «База данных» — вкладка открывается целиком на чтение: размер базы, журнал WAL, свободное место внутри файла базы и счётчики строк видны. Нет только двух кнопок и пути к файлу базы, вместо них строка «Резервную копию и обслуживание базы выполняет администратор».
Загрузка кодов
Главная операция приёмки: файл от «Честного знака» превращается в партию, а строки — в коды со статусом «Создан».
Как устроен код маркировки
Код лёгкой промышленности состоит из четырёх частей. Каждая начинается со своего двузначного номера — это номера полей стандарта GS1, по ним и разбирается строка.
- 01 — GTINКод товара, ровно 14 цифр
- 21 — серийный номерОт 1 до 20 любых печатных символов
- 91 — ключ проверкиРовно 4 символа
- 92 — код проверкиРовно 44 символа
- GS — разделительБайт 0x1D между частями
Пример показывает код в том виде, в каком его выдаёт «Честный знак».
Так же разбираются ещё две товарные группы. У табака после серийного номера (он там всегда ровно 7 символов) идёт поле 8005 — максимальная розничная цена, шесть цифр в копейках, — и поле 93, код проверки из четырёх символов; разделителей два, как и у лёгкой промышленности. У молочной продукции после серийного номера сразу идёт поле 93, и разделитель в коде всего один. Тот же вид кода имеют упакованная вода, пиво и альтернативный табак: по самой строке они не различаются никак, поэтому «КодКипер» честно называет группу «молочная продукция, вода и пиво» и не выдумывает, какая из них перед ним.
Строки остальных товарных групп — обувь, шины, лекарства и прочие — на поля не разбираются: их можно сохранить как есть, включив флажок «Загружать строки с нестандартным форматом».
Зачем нужен разделитель и почему он ломается
Серийный номер имеет переменную длину — от 1 до 20 символов. Именно поэтому после него стоит разделитель: без него нельзя понять, где серийный номер закончился и началось поле 91. Разделитель — это невидимый служебный байт (в технической записи 0x1D): на экране и на бумаге он ничего не рисует.
Именно из-за невидимости разделитель и теряется. Пока файл идёт от «Честного знака» через почту, Excel, экспорт из чужой системы и обратно, разделитель может остаться на месте, превратиться в текст, подмениться знаком вопроса или пропасть совсем. Переключите вкладки — увидите, как одна и та же строка выглядит в каждом случае и что «КодКипер» с ней сделает.
Восстановление работает потому, что длины полей 91 и 92 известны заранее: строка разбирается с конца, а всё, что осталось слева, — серийный номер.
Если разделить строку однозначно не выходит, «КодКипер» не угадывает: строка попадает в отчёт с пометкой «Неоднозначный разделитель: не удалось определить границу серийного номера».
Экран загрузки
Раздел «Загрузка» в левом меню. Форма слева, предпросмотр справа — он обновляется сразу.
Куда лягут коды: два режима
Первое, о чём спрашивает форма, — куда класть коды. Ответа два, и переключаются они парой кружков в самом верху. Оба названы вслух, а не спрятаны за одним переключателем: это единственный выбор на экране загрузки, который потом нельзя отменить, — код, положенный не в тот артикул, «КодКипер» не удаляет никогда.
| Режим | Как выбирается артикул |
|---|---|
| «Загрузить в один выбранный артикул» | Все строки файла лягут в артикул, который вы укажете в поле ниже. Так было всегда, это значение по умолчанию, и менять его без причины не нужно |
| «Разложить по артикулам автоматически, по GTIN» | Артикул не выбирается: его называет GTIN каждой строки — по справочнику «GTIN → артикул». Поле «Артикул» при этом с формы снимается |
Второй режим — это маршрутизация по GTIN; так он назван и в сообщениях программы. Работает он только по заполненному справочнику: GTIN должен быть закреплён за артикулом заранее — на карточке артикула, в окне «Новый артикул» или колонкой «GTIN» при импорте справочника (раздел «Артикулы»). На пустом справочнике этот режим не разложит ничего и честно вернёт список номеров, которых он не знает.
Партий у такого файла столько, сколько разных артикулов он назвал. Обычно это одна: «Честный знак» выдаёт коды на GTIN, а GTIN — это товар, поэтому обычный файл однороден и маршрутизация даёт ровно ту же партию, какую дал бы выбор артикула руками. Смешанный файл разойдётся по нескольким, и тогда:
- партия заводится на своей первой строке, а не заранее, — пустых партий не появляется;
- «Строк в файле» у такой партии — строки, легшие в неё, а не длина всего файла: повтори «КодКипер» длину файла у каждой из трёх партий, колонка «строк» перестала бы складываться хоть во что-нибудь;
- номера строк остаются номерами файла. Внутри партии они поэтому идут с пропусками — 1, 3, 5 у одного артикула и 2, 4, 6 у другого, — и это правильный ответ: по такому номеру строка находится в исходном файле, который лежит у вас на диске;
- скачивание партии отдаёт её строки в порядке файла — своё подмножество, байт в байт;
- все партии одного файла записываются одной транзакцией: сбой на последней строке не оставит ни одной.
Строка, которой артикул не нашёлся, не сохраняется, и отчёт называет её причину. Причин ровно три: GTIN не закреплён ни за одним артикулом; закреплён за артикулом, который убран в архив (архив — это «такого товара у нас нет»); строку не разобрал ни один шаблон. Флажок «Загружать строки с нестандартным форматом» в этом режиме погашен, и подпись под ним говорит почему: у строки вне шаблона нет GTIN, а значит, и артикула, в который её положить.
Справочник GTIN проверяет и ручной выбор
В первом режиме справочник тоже работает — не как выбор, а как проверка. Если хотя бы одна строка файла несёт GTIN, закреплённый за другим артикулом, загрузка отклоняется целиком, с номером строки и именами обоих артикулов:
Код в строке 1 несёт GTIN 04620439375515, и этот GTIN закреплён
за артикулом «ФТБ-40» — а коды загружаются в «ФТБ-42».
Ни одна строка не записана.
Это самая дорогая ошибка загрузки и единственная, которой не видно в самом файле: коды правильные, не дубликаты, они просто лягут не туда. С этой минуты остаток обоих артикулов неверен, а выдача отдаёт коды одного товара под другой. Удалением это не чинится — только списанием целой партии, то есть записью об ошибке, а не исправлением.
Снятая проверка не остаётся тайной. Если она действительно что-то пропустила, это записано в трёх местах: в отчёте о загрузке — сразу, списком «GTIN, артикул-владелец, сколько строк»; на карточке партии — значком «Мимо справочника GTIN» в заголовке и тем же списком, который открывается и через год; в журнале — отдельной записью «Загрузка мимо справочника GTIN», по которой такие загрузки находятся фильтром. Владелец в этих записях назван так, как его называл справочник в момент загрузки: справочник правится, а решение принималось против тогдашнего ответа. Отмеченный флажок на файле, где чужих GTIN не оказалось, не пишет ничего — отметка это про запрос, а запись про то, что попало на склад.
Запись экрана: выбор артикула, выбор файла на 100 000 строк и предпросмотр. Без звука, 16 с. Воспроизведение — по нажатию.
Что показывает предпросмотр
Файл разбирается прямо в браузере той же программой, что и на сервере. Ещё до отправки видно, сколько в файле строк, какой разделитель обнаружен, как выглядят первые коды и сколько строк не прошло проверку формата. Если что-то не так, файл можно убрать, не тронув базу.
Ещё две строки в предпросмотре стоит прочитать: «Дубликатов в файле» — сколько раз один и тот же код встречается внутри самого файла, и GTIN — какие GTIN оказались в файле. Если ожидали один GTIN, а их два, файл собрали неправильно.
Что происходит при нажатии
Загрузка идёт этапами, и каждый подписан. Файлы отправляются по одному, каждый в своей транзакции: сбой на третьем файле не отменит первые два, а внутри одного файла записываются либо все строки, либо ни одной.
- Разбор в браузереразбор 50 %
- Отправка на серверотправка 100 %
- Запись одной транзакциейимпорт на сервере
- Готовоимпортировано 1 200 кодов
Отчёт о загрузке
После записи форма показывает отчёт по этому файлу. На числа «Импортировано», «Дубликаты» и «Не импортировано» можно нажать — раскроется список строк.
После маршрутизации по GTIN отчёт немного другой. Четвёртым числом вместо «Строк в файле» стоит «Без артикула» — сколько строк не сохранено, потому что их GTIN не закреплён ни за одним действующим артикулом. Если файл разошёлся по нескольким артикулам, под числами появляется таблица «Файл разложен по артикулам, по GTIN каждого кода»: строка на каждую партию — артикул, её номер, принято и дубликаты, — а ссылка «открыть коды» уступает место ссылкам в этой таблице, потому что реестр фильтруется по одной партии, а не по трём. Внизу карточки идёт список того, что не легло: GTIN, сколько строк, номер первой из них и что делать. Для незнакомого номера это ссылка «Завести артикул с этим GTIN», для архивного — ссылка на артикул, который надо вернуть из архива.
Поправив справочник, загрузите тот же файл ещё раз: уже записанные коды повторно не запишутся — они уйдут в дубликаты, — а недостающие лягут в свои артикулы. Файл, из которого не легло ни одной строки, отмечен не зелёной галочкой, а предупреждением «Ни одной партии»: это не успех, и выглядеть успехом он не должен.
Как исправить отклонённые строки
Кнопка «Скачать отклонённые строки» отдаёт файл, имя которого начинается с otklonennye-: для поставка-26-07.csv получится otklonennye-postavka-26-07.csv — кириллица переводится в латиницу.
Внутри — заголовок строка ошибка содержимое и по одной записи на отклонённую строку. Колонки разделены табуляцией: в серийном номере встречаются запятые, кавычки и точки с запятой, и обычный CSV разрушил бы код. Файл открывается в Excel и 1С без настройки.
| Причина в отчёте | Что произошло | Что делать |
|---|---|---|
| «Не соответствует ни одному шаблону: 01/21/91/92, 01/21/8005/93, 01/21/93» | Строка не подошла ни под один разбираемый шаблон: обрезана, склеена с соседней или относится к товарной группе, для которой шаблона пока нет (например, обувь или шины) | Проверьте строку целиком. Если это товарная группа без шаблона — включите флажок нестандартного формата |
| «Серийный номер длиннее 20 символов» | Между полями 21 и 91 оказалось больше 20 символов — обычно из-за склеенных строк | Разбейте строку на две |
| «Неоднозначный разделитель: не удалось определить границу серийного номера» | Разделителей нет, а на их месте стоит символ, который может быть и частью серийного номера | Запросите файл заново, с настоящими разделителями |
Ограничения
Выгрузка кодов
Обратная операция: указать артикулы и количества, получить файл для печати и перевести выданные коды в статус «Выведен».
Строки выгрузки
Новая выгрузка создаётся в разделе «Выгрузка», а все ранее сделанные лежат в разделе «Выгрузки». Одна строка — один артикул и количество; строк можно добавить до 300. Под каждой строкой сразу видно, что получится. Длинный список не набирают руками — его вставляют целиком, см. «Импорт строк» ниже.
Импорт строк: сто позиций одним движением
Сборка ФБС или ФБО — это список на сто с лишним позиций, который приходит выгрузкой из маркетплейса, столбцом из Excel или строками в письме. Набивать его по одной строке незачем: кнопка «Импорт строк» в шапке панели «Строки выгрузки» открывает окно, куда список вставляют целиком или приносят файлом — книгой Excel (.xlsx), CSV, TSV или TXT.
В книге читается первый видимый лист. Колонки «Артикул» и «Количество» находятся по шапке, даже если между ними стоят чужие («№», «Наименование», «Склад»), а сама шапка — не в первой строке. Если шапки нет, работает то же правило, что и для текста: количество справа, артикул слева, причём первая колонка с порядковыми номерами за артикул не принимается.
В тексте разделитель может быть любым: точка с запятой, табуляция, запятая или пробел. Количество — это последнее число строки, всё, что левее, — артикул, поэтому артикулы с пробелами и запятыми внутри читаются правильно. Шапка таблицы вроде «Артикул;Количество» распознаётся и пропускается. При явном разделителе пробел внутри числа считается разделителем разрядов, и 1 000 из Excel читается как тысяча.
- Артикул не найден на складе — строки с ним не добавятся, и он назван по имени. Артикул заводится загрузкой кодов, из этого окна создать его нельзя;
- строка не разобрана — указан её номер в исходном тексте, сама строка и причина: нет количества, количество не число, ноль или слишком большое;
- остаток по каждому артикулу спрашивается у сервера сразу при разборе, поэтому нехватка видна ещё в окне;
- кнопка «Добавить N строк» дописывает разобранное к тому, что уже набрано, а «Заменить строки» — начисто. Повторяющиеся артикулы не сливаются: в форме они останутся отдельными строками, а количества сложатся при выгрузке.
После добавления строки — обычные строки формы: артикул и количество правятся, лишние удаляются, выгрузка происходит только по кнопке с подтверждением.
Когда кодов не хватает
Нехватка видна до подтверждения — и в строке, и в итоге справа. Кнопка «Выгрузить …» выключается, пока не хватает хотя бы одного кода.
Формат файла — и почему нужен 0x1D
Перед подтверждением выбирается, как записать разделитель в файле. Выбор запоминается в этом браузере и в следующий раз подставится сам.
| Вариант | Что в файле | Когда нужен |
|---|---|---|
0x1D | Настоящий байт-разделитель | Печать. Это значение по умолчанию, и менять его без причины не нужно |
<GS> | Четыре видимых символа <GS> | Посмотреть файл в Excel или «Блокноте» |
| Без разделителей | Ничего между частями | Сверка со сторонней системой. Для печати не подходит |
Почему принтеру нужен именно байт. Программа печати кодирует строку в квадратный штрихкод DataMatrix как есть. Байт 0x1D она превращает в служебный разделитель внутри штрихкода — тот, по которому сканер и «Честный знак» отличают конец серийного номера от начала поля 91.
Если вместо байта в файле лежат четыре символа <GS>, они станут обычными знаками внутри серийного номера: код напечатается, но проверку не пройдёт. Поэтому <GS> годится только для просмотра человеком.
Номер заказа и комментарий
Оба поля необязательны, но номер заказа стоит заполнять: он попадает в список выгрузок, в карточку, в журнал и в имя файла. Для артикула ФТБ-2х2-БЕЛ-40 и заказа ОТГР-1142 файл сохранится как FTB-2h2-BEL-40_OTGR-1142.csv — кириллица переводится в латиницу, потому что имена файлов ходят через принтеры и чужие системы. Если артикулов несколько, вместо CSV придёт ZIP vygruzka_OTGR-1142.zip с отдельным файлом на каждый артикул.
Подтверждение
После подтверждения файл скачивается сам, а «КодКипер» открывает карточку выгрузки. Коды получают статус «Выведен» и закрепляются за этой выгрузкой — всё одной транзакцией, поэтому два человека, нажавшие кнопку одновременно, не получат одни и те же коды.
Запись экрана: заполнение строки, номер заказа, подтверждение и карточка выгрузки. Без звука, 18 с.
Скачать файл ещё раз
Формат при повторном скачивании выбирается заново и не обязан совпадать с исходным: один и тот же набор кодов можно получить и с байтом 0x1D для печати, и с текстовым <GS> для проверки глазами. Состав и порядок кодов при этом всегда одни и те же.
Отмена выгрузки
Если выгрузили не то или не столько, выгрузка отменяется целиком: кнопка «Отменить выгрузку» в шапке карточки.
После отмены коды возвращаются в статус «Создан» и снова становятся доступными. Сама выгрузка остаётся в списке с пометкой «Отменена», её состав и дата сохраняются, а вот файл собираться перестаёт: скачать его повторно уже нельзя. Ранее скачанный файл становится недействительным — коды из него снова числятся в остатке, и печатать их по этому файлу нельзя.
Поиск кода
Три режима для трёх разных задач: разобраться с одним кодом, работать со сканером весь день и сверить список с личным кабинетом «Честного знака».
Вставленный код не нужно чистить. «КодКипер» приводит и запрос, и хранимые коды к одному виду — без разделителей вообще, — и сравнивает уже их. Поэтому все три записи одного кода ведут в одну карточку:
0104620439375515215LOoCvTNLXdqf<GS>91EE12<GS>92M+gw…pc4= ← текстом
0104620439375515215LOoCvTNLXdqf␝91EE12␝92M+gw…pc4= ← настоящий байт
0104620439375515215LOoCvTNLXdqf91EE1292M+gw…pc4= ← вообще без разделителей
Карточка кода
Ниже карточки — «История кода»: загрузка в составе партии, выдача в выгрузке, списание, возврат. Каждая запись с датой и с относительным временем.
Если код не найден
Чаще всего код обрезан при копировании: в нём должны быть все четыре части. Вторая причина — файл с этим кодом не загружали или он попал в отклонённые строки; это видно в разделе «Партии». Если код был скопирован целиком, но в базе есть другие коды с тем же серийным номером, «КодКипер» предложит их показать.
Сканер
Режим для склада. Курсор сам возвращается в поле ввода — после каждого сканирования и после щелчка по любому другому месту экрана.
Запись экрана: четыре сканирования подряд — выведенный код, доступный, списанный и отсутствующий в базе. Без звука, 17 с.
Массовая проверка
Для сверки с личным кабинетом «Честного знака». Вставьте список кодов или выберите файл — до 50 000 строк за раз. Список уходит на сервер частями по 2 000 строк, поэтому страница остаётся отзывчивой; рядом показан индикатор выполнения, и проверку можно остановить.
Кнопка «Экспорт CSV» сохраняет отфильтрованные строки — можно оставить только «Не найден» и сохранить именно их. В отчёте есть серийный номер, GTIN, артикул, статус, даты, партия и выгрузка; файл в UTF-8 с BOM и точкой с запятой, то есть открывается в Excel двойным щелчком.
Реестр кодов
Все коды в одной таблице, с фильтрами и групповыми действиями.
Таблица отсортирована от новых к старым и подгружается кнопкой «Показать ещё 100»; рядом всегда стоит точное общее число — например, «Показано 100 из 5 800 кодов». Фильтры «Партия» и «Выгрузка» загружают свои списки при первом открытии.
Отчёт по справочнику GTIN
Фильтр «GTIN» отвечает на два вопроса о справочнике, и отвечает по кодам, а не по артикулам, — поэтому он стоит здесь и складывается с остальными фильтрами: артикулом, партией, периодом. Найденное открывается построчно, каждая строка ведёт в карточку своего кода, а кнопка «Экспорт CSV» сохраняет всю находку целиком.
| Значение | Что показывает |
|---|---|
| «У другого артикула» | Код лежит в одном артикуле, а его GTIN закреплён в справочнике за другим. Один из двух описан неверно — исправляется GTIN на карточке артикула |
| «Нет в справочнике» | GTIN кода не закреплён ни за одним артикулом. Это не ошибка, а список незаполненного: пока номера нет в справочнике, маршрутизация по GTIN такие строки по артикулам не разложит |
Два вопроса намеренно не сведены в один «проблемный GTIN»: первый — это расхождение, которое надо разобрать, второй — работа, которую ещё не сделали. И ни один из них ничего не прячет: отчёт только сужает реестр по свойству кода, а сами коды остаются на месте и байт в байт такими, какими пришли.
Групповые действия
- Списать — требует причину; она попадёт в журнал и в карточку каждого кода.
- Вернуть в оборот — возвращает статус «Создан». Если среди отмеченных есть выведенные коды, придётся вручную набрать слово ВЕРНУТЬ: связь с выгрузкой снимается безвозвратно.
- Экспорт выбранных — файл только из отмеченных кодов, до 20 000 кодов за раз.
.csv, внутри нет ни заголовка, ни колонок: одна строка — один код, ровно как в файле для печати. Это сделано, чтобы файл можно было отдать в печать напрямую. Табличные отчёты, которые открываются в Excel, дают «Массовая проверка», журнал сессии сканера и журнал действий.
Партии
Партия — это одна загрузка одного файла. Она навсегда хранит отчёт о том, как файл был принят.
С карточки партии можно открыть все её коды, посмотреть, что с ними стало (сколько ещё в остатке, сколько выведено и списано), и скачать файл именно этой партии в любом из трёх форматов.
Откат партии
Откат — единственная операция во всём «КодКипере», которая удаляет коды из базы безвозвратно. Поэтому подтверждение здесь строже, чем у остальных операций.
Откат доступен, только пока все коды партии в статусе «Создан». Стоит одному коду уйти в выгрузку или в списание — откат запрещён целиком, частичного отката нет. Ещё три условия: откат делает администратор; повторно откатить уже откаченную партию нельзя; и откатывать нечего, если в базе не осталось ни одного кода партии — так бывает, когда весь файл оказался дубликатами. В этом случае кнопка подписана «Кодов этой партии в базе не осталось».
После отката коды удаляются, а запись о партии остаётся в списке с пометкой «Откачена»: отчёт о загрузке сохраняется, сам откат попадает в журнал. Вернуть удалённые коды можно только повторной загрузкой исходного файла — поэтому файл поставщика стоит хранить.
Артикулы
Артикул — товарная позиция, к которой привязаны коды. Чаще всего он появляется сам, при первой загрузке кодов: достаточно назвать его в форме загрузки. А кнопка «Новый артикул» вверху экрана заводит его руками — с кодом, названием и GTIN-ами сразу. Она нужна там, где кодов ещё нет: чтобы разложить файл по артикулам автоматически, GTIN должен быть закреплён в справочнике заранее. Из отчёта о такой загрузке ссылка «Завести артикул с этим GTIN» открывает это же окно с уже подставленным номером.
Порог низкого остатка
Порог — это остаток, при котором по артикулу пора докупать коды. Он ничего не запрещает: выгрузить коды ниже порога можно всегда. Порог только включает предупреждения, и появляются они здесь:
- над любым экраном — плашка «Артикулов ниже порога: N» со ссылкой на список и кнопкой «Скрыть». Скрытая плашка не возвращается сама: она поднимется, только когда порог перейдёт следующий артикул;
- на экране «Обзор» — отдельным числом с подписью «Артикул / Артикула / Артикулов ниже порога» (слово склоняется по числу) и списком таких артикулов;
- в таблице остатков на экране «Обзор» — пометкой «ниже порога» рядом с числом;
- в списке артикулов — цветом числа и строкой вида «4 артикула · ниже порога: 2» над таблицей;
- в карточке артикула — значком «Ниже порога» рядом с названием.
Полоска рядом с остатком показывает, насколько он близок к порогу: на ней есть засечка в точке порога. Артикул считается ниже порога, когда остаток равен порогу или меньше.
И письмо. Раз в сутки на организацию уходит одно письмо со списком артикулов, которые до порога дошли; про один и тот же артикул чаще раза в неделю не напоминают. Кому оно уходит, задаётся в «Настройки → Уведомления»; наблюдателям не пишут никогда. Ссылка в письме открывает список артикулов, отфильтрованный по порогу.
GTIN артикула
GTIN — код товара, те самые четырнадцать цифр в начале кода маркировки. Справочник «GTIN → артикул» связывает их с вашими артикулами, и на нём держатся три вещи: маршрутизация файла кодов по артикулам при загрузке, проверка «файл выбран не в тот артикул» и отчёт по расхождениям в реестре кодов. Пока справочник пуст, всё это просто не работает — ничего не ломается, но и не помогает.
Номера правятся полем «GTIN» на карточке артикула. Их может быть сколько угодно — пишутся через пробел или с новой строки, — но один GTIN принадлежит ровно одному артикулу: если номер уже закреплён за другим, карточка откажет и назовёт владельца. Под полем всё время видно, что именно сохранится: номер длиной 8, 12, 13 или 14 цифр приводится к четырнадцати дописыванием нулей слева. Это не починка, а его каноническая запись по GS1 — и заодно ответ на ведущий ноль, съеденный Excel-ем. Принимается и запись через пробелы или дефисы, ровно как номер напечатан под штрихкодом.
Нечитаемый обломок в поле не отбрасывается молча: пока в нём есть хоть один такой, не сохраняется ничего — иначе половина набора уехала бы в базу, а оператор узнал бы об этом, не найдя свой товар в выгрузке. Пустое поле снимает все номера артикула. Контрольная цифра не проверяется: «КодКипер» номер не судит, он только связывает его с артикулом.
Справочник файлом: экспорт и импорт
Названия и описания придумывают не на складе, а в прайсе или в карточке маркетплейса. Поэтому справочник ездит файлом. «Экспорт CSV» отдаёт все артикулы, включая архивные: артикул, название, описание, порог остатка, GTIN и справочные колонки с остатками. Файл — UTF-8 с BOM и точкой с запятой, Excel открывает его сразу.
Заполненный файл возвращают кнопкой «Импорт CSV» — и она принимает не только CSV, но и книгу Excel (.xlsx): сохранять таблицу обратно в CSV не нужно. Колонки ищутся по названиям в шапке, поэтому их можно менять местами и удалять лишние; сама шапка может стоять не в первой строке — над ней в выгрузке из чужой системы обычно заголовок отчёта. Нужна как минимум колонка «Артикул» и одна из изменяемых.
Числа и даты из книги читаются так, как их видно на экране Excel: порог остатка приходит числом, а ячейка с датой — датой, а не пятизначным числом, которым дата хранится внутри файла. Старый двоичный .xls и книги под паролем не читаются — окно прямо просит пересохранить их как .xlsx или CSV. Формат распознаётся по содержимому, поэтому книга, переименованная в .csv, тоже прочитается; CSV в кодировке Windows-1251 из складских программ — тоже.
- выгружается всегда CSV — его можно не только открыть в Excel, но и вставить текстом; принимается и CSV, и книга Excel;
- применяются только «Название», «Описание», «Порог остатка» и «GTIN»; остатки и признак архива — справочные, импорт их не трогает;
- в колонке «GTIN» может стоять несколько штрихкодов через пробел; ведущий ноль, съеденный Excel-ем, и EAN-13 приводятся к четырнадцати цифрам сами — в том числе набранный так, как он напечатан под штрихкодом, через пробелы или дефисы. Один GTIN принадлежит ровно одному артикулу: если он уже закреплён за артикулом, которого этот файл не касается, окно откажет и назовёт владельца. А вот внутри одного файла штрихкоды можно менять местами: файл читается целиком, как конечное состояние справочника, поэтому обмен двумя ячейками — обычный способ исправить два GTIN-а, заведённых не на те артикулы;
- пустая ячейка очищает поле, а колонка, которой в файле нет, не трогается вовсе — так можно залить файл всего из двух столбцов, «Артикул» и «Название». Для GTIN-ов это особенно важно: ячейка в файле — это ВЕСЬ набор артикула, и пустая снимает все. Ячейка со словом («нет», «уточнить») пустой не считается: такую строку окно покажет в пропущенных и GTIN-ы артикула не тронет;
- если один артикул назван в файле дважды, в дело идёт первая его строка, а остальные окно перечислит среди пропущенных;
- артикулы не переименовываются: код в строке — это ключ, по которому ищут, а не изменяемое поле;
- артикулы не создаются, пока не поставлена галочка «Создавать отсутствующие артикулы». Без неё строки с неизвестным артикулом пропускаются и перечисляются в окне; с ней предпросмотр сначала показывает, сколько артикулов будет заведено и каких, и только потом «Применить» их заводит — с пустыми остатками, коды к ним загружаются отдельно;
- повторный импорт того же файла не делает ничего — окно скажет «Менять нечего»;
- в журнале операция отмечается одним событием «Импорт справочника артикулов» с составом правки, а не сотней отдельных.
Архив
Ненужный артикул убирают в архив. Коды, партии, выгрузки и история остаются на месте, но артикул исчезает из подсказок при загрузке и выгрузке, а также перестаёт учитываться в остатках на экране «Обзор». Вернуть его из архива можно в любой момент — действие обратимо, поэтому подтверждающее слово вводить не нужно.
Этикетки
Раздел «Этикетки» собирает шаблон этикетки и печатает его по кодам выгрузки. Печатает браузер через обычное окно печати: отдельная программа, драйверы и настройка принтера не нужны.
Шаблон и блоки
Шаблон — это этикетка заданного размера, на которой расставлены блоки. Размер и координаты задаются в миллиметрах, поэтому напечатанная этикетка совпадает с макетом один в один — на любом экране и при любом масштабе. Кнопка «Новый шаблон» спрашивает название и размер: готовые размеры рулонов, от 30 × 20 до 100 × 100 мм, либо свой — от 10 до 210 мм по каждой стороне.
Новый шаблон заводится не пустым: в нём уже лежат три блока — код маркировки, артикул и серийный номер. Их можно двигать и удалять, но этикетка без DataMatrix — не этикетка, и окно создания говорит об этом прямо. Блоков на одной этикетке не больше сорока: они рисуются на каждой этикетке задания, и шаблон из сорока блоков на рулоне 58 × 40 мм уже нечитаем.
| Блок | Что печатает |
|---|---|
| Текст | Надпись, набранную в шаблоне, — одну и ту же на всех этикетках |
| Поле | Значение из артикула или из самого кода — своё на каждой этикетке |
| DataMatrix | Код маркировки целиком, квадратным символом GS1 DataMatrix |
| Штрихкод | Линейный штрихкод по GTIN артикула — EAN-13 или ITF-14, по виду номера |
| Линия, Рамка | Оформление: отчеркнуть подпись, обвести группу полей |
Блок «Поле» подставляет артикул, его название или описание, а из самого кода — GTIN, серийный номер, шаблон кода, срок годности (обычный и с точностью до минут), максимальную розничную цену, массу нетто или объём. Значения печатаются в человеческом виде: срок годности — как 31.12.2026, а не шестью цифрами из кода. Поле, которого в этом коде нет, остаётся пустым — этикетка из-за него не ломается.
Конструктор
Холст — не приближение. На нём лежит ровно тот рисунок, который уйдёт в принтер: его собирает тот же код и по тому же образцовому коду маркировки. Поэтому «влезает ли DataMatrix в блок» и «не налезла ли подпись на код» видно в конструкторе, а не на рулоне. Образец подбирается по тем полям, которые вы поставили на этикетку: положили «Срок годности» — образцом станет код с датой, положили «Массу нетто» — код весового товара. Настоящих кодов организации в предпросмотре нет.
Как двигают блоки. Мышью — с шагом 0,5 мм; за уголки и стороны выделенного блока его растягивают. Стрелки клавиатуры делают то же самое, встав на холст: шаг тот же, с Shift — 5 мм, с Alt стрелки не двигают, а растягивают. Блок, накрытый другим блоком, берётся щелчком с Alt. Точные миллиметры набираются числами в панели «Блок» — там же, где шесть кнопок «Выровнять по этикетке» прижимают блок к краю или ставят по середине, чтобы не считать (58 − ширина) / 2 на бумаге.
Свойства блока. «Вид блока» меняет вид уже поставленного блока и сохраняет при этом место, размер и поворот, а между текстовыми видами — ещё кегль, жирность и выравнивание: ошибиться в выпадающем списке при добавлении — обычное дело, и цена ошибки не должна равняться цене всего блока. Дальше — положение и размер в миллиметрах, поворот на 0°, 90°, 180° или 270° вокруг центра блока и содержимое: текст, подставляемое поле с приставкой («Годен до: »), кегль и начертание, вид штрихкода, толщина линии.
| Действие | Как |
|---|---|
| Отменить и вернуть правку | Ctrl+Z и Ctrl+Shift+Z, либо кнопки «Отменить» и «Вернуть» в панели шаблона |
| Копия выбранного блока | Ctrl+D — копия ложится со сдвигом на шаг сетки, чтобы её было видно |
| Выбрать блок под блоком | Щелчок с Alt — или строка в списке слева |
| Посмотреть, влезут ли длинные значения | Флажок «Показать длинными значениями»: в образец подставляется название товара длиннее обычного |
| Увеличить холст | «По размеру» или 1× … 6×. Ниже натуральной величины конструктор не опускается — уменьшенная этикетка врёт про читаемость кода |
Под холстом стоит список «Что не напечатается»: каждая строка называет блок его человеческим именем и причину — «блок слишком мал для кода DataMatrix», «в коде нет GTIN — штрихкод строить не из чего», «не заполнено поле». Строка не только называет блок, но и доводит до него: щелчок по ней выделяет виноватого на холсте. Тот же значок стоит у строки блока в списке слева.
Правка не сохраняется сама: под панелью шаблона написано «Всё сохранено» или «Есть несохранённые изменения», и кнопка «Сохранить» — единственный способ вторую фразу убрать. Правят шаблоны администратор и владелец; печатать по ним может и оператор — это то же право, что и на выгрузку файла кодов. Ненужный шаблон убирают в архив, как артикул: он исчезает из выбора при печати, но не удаляется, и вернуть его можно в любой момент. Создание, правка, архив и каждая печать записываются в «Журнал».
Печать
Кнопка «Печать этикеток» стоит в карточке выгрузки. Страница печати показывает этикетки — по одной на каждый выданный код и в том же порядке, в каком коды легли в файл выгрузки: рулон сверяется с файлом построчно. Кнопка «Печать» открывает обычное окно печати браузера.
Вида печати два, и они переключаются прямо на странице. Рулон — страница равна этикетке, полей нет: вариант для принтера этикеток, размер страницы задаёт сам шаблон. Лист A4 — этикетки раскладываются сеткой с полями, и строка «Раскладка» называет её словами: сколько этикеток в ряд, сколько рядов и сколько выйдет листов. Если этикетка целиком не помещается в печатное поле листа, страница скажет об этом до печати.
Части
Выгрузка бывает в десятки тысяч кодов, а каждая этикетка несёт свой DataMatrix — рисунок из тысячи с лишним прямоугольников. Поэтому задание печатается частями: по умолчанию сто этикеток, не больше тысячи. Обрезка не подразумевается, а объявляется: «Напечатано 100 из 150: часть 1 из 2, коды с 1-го по 100-й», — и соседние части переключаются кнопками «Предыдущая» и «Следующая» тут же, на странице.
Иногда часть уменьшается сама, и страница об этом говорит: «Часть уменьшена под шаблон». Считается не число этикеток, а число символов — DataMatrix и штрихкодов вместе, — и шаблон с десятком символов на этикетку упирается в потолок раньше, чем в сотню этикеток. Это честнее, чем принять задание и подвесить браузер.
Печатать можно только по выданному коду. У отменённой выгрузки коды вернулись в остаток и за ней больше не закреплены — страница печати это говорит и печатать не даёт.
Печать работает и тогда, когда подписка не оплачена и организация переведена в режим «только чтение»: выданные коды — ваши, и напечатать их можно всегда. Закрыта в этом режиме только правка шаблонов.
Журнал действий
Каждое изменение записано: кто, когда и что сделал.
Записывается всё, что меняет данные:
- партии — загрузка и откат, а отдельной строкой «Загрузка мимо справочника GTIN» — те загрузки, где оператор снял проверку «Загружать, даже если GTIN закреплён за другим артикулом». В ней названы номер, артикул-владелец по справочнику и сколько строк прошло; та же пометка стоит на карточке партии;
- выгрузки — создание, отмена, повторное скачивание;
- коды — списание и возврат в оборот;
- артикулы — создание, правка, импорт справочника файлом и переход остатка через порог;
- этикетки — создание и правка шаблона, архив и возврат из него, и каждая печать: сколько этикеток, по какому шаблону и какой части;
- пользователи и токены;
- настройки и резервная копия;
- второй фактор и внешний вход — включение, снятие администратором, вход по резервному коду, привязка и отвязка провайдера;
- входы в систему, включая неудачные.
Каждая строка — готовая русская фраза, а не машинный код события: Выгрузка №ОТГР-1142: 300 кодов («ФТБ-2х2-БЕЛ-40» — 300). Строки, у которых есть объект, ведут прямо на него.
Два фильтра — по пользователю и по типу действия — показывают рядом с каждым вариантом его количество, так что видно, чего в журнале много. Журнал видят все роли; скачать его в CSV может оператор и старше: точка с запятой, UTF-8 с BOM, до 20 000 строк по текущему фильтру. На экране показывается до 500 событий; чтобы увидеть остальные, скачайте журнал в CSV.
Глубина показа зависит от тарифа: более ранние записи сохранены и станут видны на старшем тарифе — это ограничение показа, а не удаления, и экран это проговаривает.
Настройки
Шесть вкладок: «Пользователи», «Безопасность», «Экспорт», «Уведомления», «База данных» и «Тариф». Последняя видна владельцу и только там, где включён биллинг, и разобрана отдельно — в разделе «Тариф и оплата». Токены и справочник API живут не здесь, а на своём экране «API» — см. «Интеграция по API».
Пользователи
Администратор приглашает человека в организацию, меняет роль, сбрасывает пароль и отключает доступ. Приглашение уходит письмом на адрес; пароль приглашённый придумывает себе сам, открыв ссылку. Отключённый участник теряет доступ немедленно: его открытые сеансы закрываются. Данные и записи в журнале при этом остаются.
Самого себя нельзя ни отключить, ни лишить прав администратора, и нельзя убрать последнего администратора — «КодКипер» откажет с объяснением. Владелец в организации ровно один; передать эту роль может только он сам.
В строке участника есть и кнопка «Снять 2ФА» — для того, кто потерял и телефон, и резервные коды. Она откажет, если этот человек работает не только в этой организации: иначе администратор одной организации снимал бы защиту с владельца соседней, пригласив его к себе наблюдателем.
Безопасность
Вкладка про себя, а не про организацию: здесь включается второй фактор и выписываются резервные коды. Подробнее — в разделе «Первый вход, пароль и роли».
Если установка не настроена на хранение секретов второго фактора, вкладка прямо об этом говорит и включить фактор не даёт. Это не поломка: секрет второго фактора — единственные учётные данные, которые нельзя держать хешем, и хранить их открытым текстом «пока не настроим» продукт отказывается.
Экспорт
0x1D — тот, что нужен для печати.
KODKEEPER_TZ; изменить её можно только при запуске сервера. Текущее значение показано на этой же вкладке.
Уведомления
Две панели. «Письма о низком остатке» — одно письмо в сутки со списком артикулов, у которых остаток дошёл до порога; порог задаётся у самого артикула. Единственная настройка — кому писать: «Владельцу и администраторам», «Всем, кроме наблюдателей» или «Не отправлять». Поля со свободным вводом адреса нет и не будет: получатели берутся из списка участников организации.
Выключенные письма ничего больше не выключают: плашка в приложении, отметка «ниже порога» в списке артикулов и записи в журнале продолжают работать.
«Исходящие» — список всех писем, которые приложение написало по этой организации: приглашения, подтверждение адреса, чеки, предупреждения об оплате и уведомления о низком остатке. По каждому видно вид письма, получателя, тему, время и чем закончилась доставка. Ссылки из писем здесь не показываются: каждая из них — одноразовые учётные данные, а вкладку видит любой сотрудник организации.
База данных
Скачать резервную копию отдаёт целый файл базы вашей организации на момент запроса — с именем вида kodkeeper-sklad-nadezhda-2026-07-26_1620.db. Короткое имя организации стоит в имени файла затем, чтобы две копии, скачанные подряд из разных организаций, не перезаписали друг друга в папке «Загрузки». Копию можно снимать на работающей системе: она снимается штатным средством SQLite, которое делает согласованный снимок базы, и никаких дополнительных файлов рядом с ней не нужно.
«Оптимизировать» переносит журнал WAL в основной файл и обновляет внутреннюю статистику базы, по которой она выбирает способ поиска. Данные не меняются, подтверждения не требуется. Размер базы после этого обычно не уменьшается — операция ускоряет работу, а не освобождает место.
Тариф и оплата
Вкладка «Настройки → Тариф»: что оплачено, до какого числа, что входит в тариф и чем это кончится, если не заплатить. Вкладку видит только владелец — и только там, где установка вообще берёт деньги.
Пробный период
Организация начинает с 14 дней бесплатно и без платёжных данных: карту не спрашивают ни при регистрации, ни потом, пока вы сами не нажмёте «Оплатить». Пробный период — это полноценная работа с меньшими лимитами: 20 000 кодов в хранилище, двое участников, один API-токен. Оплатить его нельзя и не нужно — платят уже за выбранный тариф.
Что показывает вкладка
- Текущий тариф — название, цена, состояние («Оплачено», «Пробный период», «Оплата не прошла», «Только чтение»…), дата конца оплаченного периода и сколько дней осталось. Тут же кнопка оплаты следующего периода и «Не продлевать»;
- Расход по лимитам — сколько кодов в хранилище, сколько выгружено за период, сколько участников и токенов, предел файла загрузки, глубина журнала и частота запросов к API. Рядом с каждым — предел тарифа. Чтение, поиск и скачивание не ограничены никогда;
- Способ оплаты — флажок «Списывать оплату автоматически». Пока он снят, каждый период оплачивается кнопкой: без вашего согласия деньги списаться не могут. Номер карты в «КодКипере» не хранится и не запрашивается — он вводится на стороне платёжного сервиса;
- Тарифы — карточки с ценами и лимитами. У каждой две кнопки: «Перейти сейчас» ведёт прямо на оплату, «Перейти со следующего периода» только запоминает выбор. Денег не двигает ни выбор тарифа, ни его отмена — только оплата;
- Платежи — последние двадцать попыток оплаты с их состоянием. Незавершённую строку можно закрыть самому: деньги по ней не списывались;
- Документы — нумерованные записи об оплате с периодом и суммой, отдельной кнопкой выгружаются в CSV для бухгалтерии. Фискальный чек приходит от оператора фискальных данных и может появиться позже платежа — до тех пор в строке стоит «ожидается».
Если не заплатить
Лестница неплатежа проходится по датам, а не по посещениям: заходите вы в «КодКипер» или нет, состояние считается одинаково.
| Состояние | Когда | Что работает |
|---|---|---|
| Оплачено | Период оплачен | Всё |
| Оплата не прошла | Первая неделя после конца периода | Всё. Только плашка — склад продолжает отгружать, из этого он и заплатит |
| Загрузка приостановлена | Ещё неделя | Выгрузка работает. Заморожены загрузка кодов, правка артикулов, приглашения и новые токены — то, что растит объём |
| Только чтение | Дальше | Смотреть, искать, скачивать файлы выгрузок и печатать этикетки. Ничего не удаляется |
Состояние видно не только на вкладке: плашка стоит над любым экраном, а в углу бокового меню — значок с названием тарифа и числом оставшихся дней. Про каждое состояние плашка проговаривает вслух, что данные целы, — иначе первым действием человека становится звонок в поддержку.
Отдельно стоит «По договору»: организация, которая платит по счёту, по лестнице не идёт никогда и платной стены не встречает. Тарифы ей не показываются — их меняет поставщик.
Интеграция по API
Раздел для разработчика 1С: три метода, токен в заголовке, JSON в ответе.
Токен создаётся на экране «API» — с 2026 года это отдельный пункт меню, а не вкладка настроек. Токен передаётся в каждом запросе заголовком Authorization: Bearer kodkeeper_…; cookie интерфейса для API не работают. Ограничение — 120 запросов в минуту на один токен, а там, где включены тарифы, предел берётся из тарифа. Действующее значение приходит в заголовке X-RateLimit-Limit, остаток — в X-RateLimit-Remaining. Ошибки — это JSON с русским текстом и машиночитаемым идентификатором ошибки.
Каждой внешней системе — свой токен, тогда его можно отозвать, не трогая остальные. Отзыв необратим и подтверждается вводом названия токена; отозванный токен сразу перестаёт работать, а его строка остаётся в списке с датой отзыва. Панель токенов показывается тому, кому доступно управление токенами, — администратору и владельцу; у остальных экран открывается сразу на справочнике.
Остатки по артикулам
curl -s "https://app.kodkeeper.ru/api/v1/stock" \
-H "Authorization: Bearer kodkeeper_ВАШ_ТОКЕН"
Ответ — те же числа, что на «Обзоре»:
{
"generatedAt": "2026-07-26T22:53:26.454Z",
"totals": { "available": 7335, "issued": 5800, "writtenOff": 65, "total": 13200 },
"items": [
{
"article": "ФТБ-2х2-БЕЛ-40",
"name": "Футболка 2х2, белая, размер 40",
"available": 4560,
"issued": 2600,
"writtenOff": 40,
"total": 7200,
"lowStockThreshold": 2000,
"archived": false
}
]
}
Один артикул запрашивается параметром article с его полным кодом.
Проверка одного кода
GET /api/v1/codes/{код}. Код подставляется в путь и, как и в интерфейсе, принимается в любом виде — с байтом 0x1D, с текстовым <GS> или вовсе без разделителей. Не забудьте URL-кодирование: в коде встречаются +, / и =.
curl -s "https://app.kodkeeper.ru/api/v1/codes/0104620439375515215LOoCvTNLXdqf91EE1292M%2Bgw6Q1LKyBtH%2BCGbIWuUfvsBIpPA7MKWBjXlLPrpc4%3D" \
-H "Authorization: Bearer kodkeeper_ВАШ_ТОКЕН"
{
"found": true,
"code": {
"normalized": "0104620439375515215LOoCvTNLXdqf91EE1292M+gw…pc4=",
"canonical": "0104620439375515215LOoCvTNLXdqf\u001d91EE12\u001d92M+gw…pc4=",
"gtin": "04620439375515",
"serial": "5LOoCvTNLXdqf",
"status": "issued",
"statusLabel": "Выведен",
"article": "ФТБ-2х2-БЕЛ-40",
"batch": { "id": 1, "filename": "zakaz-4412-belaya.csv", … },
"shipment": { "id": 1, "number": "ОТГР-1041", … },
"timeline": [ … ]
}
}
Показаны не все поля: ответ также содержит articleName, formatValid, createdAt, issuedAt, writtenOffAt и writeOffReason. Полный список — на экране «API».
normalized — код без разделителей, по нему идёт поиск. canonical — код с настоящими байтами 0x1D, ровно в том виде, в каком он уйдёт в печать. Если кода нет, ответ короткий: { "found": false }.
Выгрузка кодов
curl -s -X POST "https://app.kodkeeper.ru/api/v1/issue" \
-H "Authorization: Bearer kodkeeper_ВАШ_ТОКЕН" \
-H "Content-Type: application/json" \
-d '{
"items": [{ "article": "ФТБ-3х3-СЕР-44", "quantity": 10 }],
"number": "ЗАКАЗ-1177",
"includeCodes": false
}'
{
"shipmentId": 13,
"number": "ЗАКАЗ-1177",
"createdAt": "2026-07-26T22:54:09.392Z",
"total": 10,
"format": "gs",
"items": [{ "article": "ФТБ-3х3-СЕР-44", "requested": 10, "issued": 10 }]
}
Выгрузка по API создаёт настоящую выгрузку — её видно в интерфейсе и оттуда же можно скачать файл или отменить. Сами коды приходят в поле codes, если не передать "includeCodes": false; с кодами за один запрос можно заказать не больше 20 000 штук. В JSON байт 0x1D экранируется как \u001d.
Ответы на ошибки
| HTTP | code | Когда |
|---|---|---|
| 401 | unauthorized | Заголовка нет, токен неизвестен или отозван |
| 404 | article_not_found | Артикула нет. API не создаёт артикулы — заведите его загрузкой кодов |
| 409 | insufficient_stock | Кодов меньше, чем запрошено. В ответе есть массив shortage с нехваткой по каждому артикулу |
| 409 | gtin_mismatch | GTIN выдаваемых кодов закреплён в справочнике за другим артикулом. В ответе есть массив conflicts — артикул, GTIN, артикул-владелец и количество. Ни один код статуса не поменял |
| 400 | bad_request | Пустой список, некорректное количество или больше 20 000 кодов вместе с их выдачей в ответе |
| 429 | rate_limited | Запросов в минуту больше, чем разрешено. В ответе есть Retry-After |
| 402 | quota_exceeded | Квота тарифа исчерпана — например, выгрузка за период. Нужен старший тариф |
| 403 | forbidden | У токена не та роль. Токен для выгрузки создают с ролью «оператор» |
Чтобы не получать 409, запросите остаток заранее через /api/v1/stock или передайте "allowPartial": true — тогда выдастся столько, сколько есть. У gtin_mismatch ответ другой: это не нехватка, а расхождение со справочником, и чинится оно в справочнике. Поле "allowGtinMismatch": true его снимает — так же, как галочка в интерфейсе, и с той же записью в журнале.
Что делать, если…
Файл загрузился, но часть строк не принята
Это штатная ситуация, а не сбой: принятые строки уже в базе, отклонённые — нет. Нажмите «Скачать отклонённые строки» в отчёте (или откройте партию — отчёт хранится там же). В файле указаны номер строки, причина и сама строка.
Дальше по причине: «Не соответствует ни одному шаблону: 01/21/91/92, 01/21/8005/93, 01/21/93» — строка обрезана или склеена с соседней; «Серийный номер длиннее 20 символов» — почти всегда две строки слиплись в одну; «Неоднозначный разделитель: не удалось определить границу серийного номера» — файл пришёл без разделителей и восстановить их однозначно нельзя, нужен исходный файл от поставщика. Чаще всего это молочная продукция, вода или пиво: в их коде всего одна граница поля, и подтвердить её нечем — у лёгкой промышленности эту роль берёт на себя второй разделитель. Если так пришёл весь файл, предпросмотр скажет об этом отдельной строкой.
Исправленный файл загружайте тем же порядком. Уже принятые коды повторно не запишутся — они станут дубликатами и будут пропущены.
«Этот GTIN закреплён за артикулом …» — файл не принят целиком
Справочник GTIN говорит, что коды из файла принадлежат не тому артикулу, который выбран в форме. Ни одна строка не записана, база не тронута — отказ произошёл до записи.
Сначала проверьте очевидное: тот ли файл выбран и тот ли артикул подставился в поле. Ошибка выбора артикула — самая частая причина, и справочник существует ровно для того, чтобы её поймать: коды в файле правильные, не дубликаты, и без этой проверки они бы просто легли не туда.
Если артикул выбран верно, а справочник описывает товар неправильно, поправьте GTIN на карточке артикула (раздел «Артикулы») и повторите загрузку. Ещё проще — переключить режим на «Разложить по артикулам автоматически, по GTIN»: тогда артикул назовёт сам файл и промахнуться будет нечем.
Галочка «Загружать, даже если GTIN закреплён за другим артикулом» — последнее средство и осознанное решение: коды лягут в выбранный артикул навсегда, остаток обоих станет неверным, а удалить их будет уже нечем. О такой загрузке останется запись в журнале и пометка на карточке партии.
«Выгрузка остановлена» — расхождение GTIN
Коды, которые сейчас должны были уйти, несут GTIN, закреплённый в справочнике за другим артикулом. Выгрузка отменена целиком, ни один код статуса не поменял, файл не создан.
Это разговор о справочнике, а не о кодах: байты кодов правильные и меняться не будут. Откройте карточку названного в отказе артикула и разберитесь, у кого из двух GTIN указан неверно. Найти все такие коды разом можно в «Реестре кодов» фильтром «GTIN → У другого артикула».
Если товар всё равно надо отгрузить сегодня, галочка «Выгрузить, несмотря на расхождение GTIN» в окне подтверждения снимает отказ. Расхождение при этом уходит в журнал вместе с выгрузкой и остаётся видно в её строке.
При загрузке по GTIN часть строк осталась «без артикула»
Их GTIN не закреплён ни за одним действующим артикулом, поэтому класть их было некуда, и «КодКипер» их не сохранил. Артикул из четырнадцати цифр он не выдумывает: такую запись потом нельзя ни удалить, ни объяснить.
Отчёт перечисляет номера по одному: GTIN, сколько строк, номер первой из них и что делать. Для незнакомого номера там стоит ссылка «Завести артикул с этим GTIN» — она открывает окно «Новый артикул» с уже подставленным номером. Если артикул есть, но убран в архив, ссылка ведёт на него: верните его из архива.
Затем загрузите тот же файл ещё раз. Уже записанные коды повторно не запишутся — они уйдут в дубликаты, — а недостающие лягут в свои артикулы.
Файл вообще не принимается
Проверьте расширение: принимаются .csv и .txt. Проверьте размер: предел — 128 МБ на файл; файл большего размера разрежьте и загрузите по частям (каждая часть станет своей партией, это нормально).
Если в предпросмотре стоит «Ни один шаблон Честного знака не распознан» и распознано ноль кодов, скорее всего, файл сохранён не как обычный текст — например, это книга Excel с расширением .csv. Пересохраните его как обычный текст в кодировке UTF-8.
Табак и молочная продукция (а также вода и пиво) разбираются на поля наравне с лёгкой промышленностью — флажок для них не нужен. Он нужен для товарных групп, шаблона для которых пока нет: включите «Загружать строки с нестандартным форматом», и такие строки сохранятся как есть, а найти их потом можно фильтром «Только с ошибкой формата».
Код не находится в поиске
Разделители тут ни при чём: поиск принимает код и с ними, и без них. Проверьте другое.
- Код скопирован не целиком. Самая частая причина. В коде четыре части, и он длинный — при копировании из письма или PDF конец часто теряется. Попробуйте поискать только серийный номер: если код в базе есть, он найдётся.
- Файл с этим кодом не загружали. Откройте «Партии» и проверьте, была ли загрузка нужного поставщика.
- Строка попала в отклонённые. Посмотрите в карточке партии число «Строк с ошибкой формата».
- Партию откатили. Откаченная партия помечена в списке, её коды удалены из базы.
Не хватает кодов на выгрузку
«КодКипер» покажет, по какому артикулу и сколько именно не хватает, ещё до подтверждения. Варианты действий:
- нажать «Выгрузить сколько есть» — выдастся доступный остаток, недостающее закажете отдельно;
- загрузить новый файл с кодами и повторить выгрузку;
- проверить, не лежат ли нужные коды в выгрузке, которую можно отменить, или в списании — их можно вернуть в остаток.
Если остаток на экране кажется завышенным, нажмите «Обновить остаток»: пока вы заполняли выгрузку, коды мог выдать кто-то другой.
Выгрузили не то количество или не тот артикул
Откройте выгрузку (раздел «Выгрузки» или ссылка из журнала) и нажмите «Отменить выгрузку». Подтверждение — ввод номера выгрузки вручную. Все коды вернутся в статус «Создан».
Если вернуть нужно только часть, отмена не подойдёт: она работает целиком. Перейдите из карточки в «Реестр кодов», отфильтрованный по этой выгрузке, отметьте лишние строки и нажмите «Вернуть в оборот» — для выведенных кодов потребуется набрать слово ВЕРНУТЬ.
Коды испортились при печати
Их нужно списать, а не отменять выгрузку. Один код — через «Поиск»: найдите его и нажмите «Списать», указав причину. Несколько — через «Реестр кодов»: отфильтруйте по выгрузке, отметьте строки и нажмите «Списать» на полосе групповых действий.
Причина обязательна и сохраняется в карточке кода и в журнале. Списание обратимо: если код всё-таки годен, «Вернуть в оборот» возвращает его в остаток.
Забыт пароль
Пароль обычного участника сбрасывает любой администратор: «Настройки → Пользователи → Пароль» в строке нужного человека. Все открытые сеансы этого человека при этом закроются, а второй фактор, если он был включён, останется на месте.
Пароль администратора сбрасывает другой администратор или владелец тем же способом. Именно поэтому администраторов стоит держать хотя бы двух.
Самостоятельного восстановления пароля по письму в продукте нет. Если в организации не осталось никого, кто может сбросить пароль, понадобится тот, кто обслуживает сервер.
Отдельный случай — учётная запись, заведённая через Яндекс ID или VK ID: пароля у неё нет вовсе, и восстанавливать нечего. Входите той же кнопкой.
Нужна резервная копия базы
«Настройки → База данных → Скачать резервную копию». Копию можно снимать, не останавливая работу: получится согласованный снимок на момент запроса, одним файлом kodkeeper-<организация>-ГГГГ-ММ-ДД_ЧЧММ.db. Никаких сопутствующих файлов сохранять не нужно.
Копии стоит делать по расписанию и хранить вне сервера. Отдельно храните исходные файлы кодов от поставщика: только по ним можно восстановить откаченную партию.
Нужно восстановить базу из копии
В интерфейсе такой операции нет — восстановление делается на сервере, вручную. Это работа для того, кто обслуживает сервер, и она требует остановки приложения.
- Остановите приложение. Это обязательно: база открыта на запись, и подмена файла у работающей системы приведёт к порче данных.
- Найдите текущий файл базы — точный путь показан на вкладке «База данных». У каждой организации свой файл, и восстанавливать нужно именно его.
- Отложите текущий файл в сторону вместе с соседними
-walи-shm, если они есть. - Положите на его место файл резервной копии под прежним именем. Файлов
-walи-shmрядом быть не должно: старый журнал рядом с новой базой даёт «database disk image is malformed» на первом же чтении. - Проверьте, что владелец и права файла те же, что были у прежнего.
- Если копия сделана более старой версией, схему двигают отдельной командой, до запуска приложения: сервер, увидевший устаревшую схему, откажется обслуживать организацию, а не перепишет её файл молча.
- Запустите приложение.
Учётные записи и роли живут не в файле организации, а в общей управляющей базе установки, и восстановление одной организации их не трогает.
Напечаталась только часть выгрузки
Так и задумано: задание печати идёт частями — по умолчанию сто этикеток, не больше тысячи, — и страница пишет об этом прямо: «Напечатано 100 из 150: часть 1 из 2». Остальные этикетки берутся кнопкой «Следующая» в строке «Часть».
Не печатайте одну и ту же часть дважды: она отдаёт те же самые коды маркировки, и второй набор коробок получит наклейки, уже наклеенные на первый. Номер части стоит в адресе страницы — по нему всегда видно, где вы находитесь.
Если часть оказалась меньше сотни и висит плашка «Часть уменьшена под шаблон», дело в числе символов: DataMatrix и штрихкоды каждой этикетки считаются вместе, и тяжёлый шаблон упирается в потолок раньше. Уменьшить число символов на этикетке — единственный способ сделать части длиннее.
Подписка не оплачена — что будет со складом
Ничего не удаляется и не прячется ни на одном шаге. Первую неделю после конца периода работает всё, дальше замораживается только рост — загрузка кодов, правка артикулов, приглашения и новые токены, — а выгрузка продолжает работать: склад должен отгружать, из этого он и заплатит. Ещё позже остаётся режим «только чтение»: смотреть, искать, скачивать файлы выгрузок и печатать этикетки можно всегда.
Что именно сейчас доступно, написано на вкладке «Настройки → Тариф» и в плашке над экраном. Подробности — в разделе «Тариф и оплата».
Страница показала ошибку
Незавершённая операция не записывается наполовину, поэтому ошибка на экране не портит данные: загрузка либо записала весь файл, либо не записала ничего. Нажмите «Повторить».
Если ошибка повторяется, передайте администратору код ошибки с экрана — по нему запись находится в журнале сервера. Проверить, прошла ли операция, можно в разделе «Журнал»: там видно, появилось ли событие о загрузке или выгрузке.
Снимки экранов сделаны на работающей системе с демонстрационными данными: четыре артикула и 12 000 кодов.