Инвентаризация кодов маркировки в 1С через True API: сроки годности, виртуальный склад и объёмно-сортовой учёт
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Инвентаризация кодов маркировки в 1С через True API: сроки годности, виртуальный склад и объёмно-сортовой учёт
Продолжение разработки «Запрос списка кодов маркировки „Честный знак“ по заданным фильтрам и списание».
От инвентаризации марок к контролю сроков годности
В феврале 2026 года я опубликовал внешнюю обработку для инвентаризации кодов маркировки в 1С:Розница 2.3.
Первая публикация на Инфостарте
Первоначальная задача была достаточно простой: получить из «Честного знака» список кодов маркировки, числящихся за организацией, определить магазин, в который поступила марка, и провести инвентаризацию сканированием.
Если марка физически присутствует, оператор сканирует её, и соответствующая строка отмечается в таблице. Отсутствующие марки можно выбрать и перенести в документ «Вывод из оборота ИС МП».
Обработка использует штатные механизмы 1С для авторизации в ГИС МТ, поэтому не требуется создавать собственную систему хранения токенов.
За время эксплуатации появились дополнительные задачи:
-
Получать не только статус марки, но и дату производства и срок годности.
-
Выявлять просроченную продукцию, которая по данным ГИС МТ продолжает находиться в обороте.
-
Работать с товарными группами, где применяется объёмно-сортовой учёт.
-
Отличать отсутствие индивидуальных марок от отсутствия товара на виртуальном складе.
В результате первоначальная обработка превратилась в более функциональный инструмент контроля маркированной продукции.
1. Почему для сигарет всё работало, а для мороженого — нет?
Один из интересных случаев возник при попытке получить список марок мороженого.
Для табачной продукции обработка корректно возвращала коды маркировки через метод:
POST /api/v4/true-api/cises/search
При выборе мороженого запрос выполнялся успешно, но возвращал пустой список:
{
"result": [],
"isLastPage": true
}
Первоначально возникло подозрение на неправильно сформированный фильтр.
Проверили товарную группу:
{
"filter": {
"productGroups": ["milk"]
},
"pagination": {
"perPage": "110",
"lastEmissionDate": "2027-01-01T00:00:00.000Z",
"sgtin": "0"
}
}
Для диагностики последовательно исключили фильтрацию по GTIN, периоду эмиссии, статусу марки и виду упаковки.
Результат не изменился.
При этом в организации имелись остатки молочной продукции.
Возник закономерный вопрос: если товар числится за организацией, почему API не возвращает индивидуальные марки?
Причина — особенности учёта маркированной продукции
В системе «Честный знак» применяются разные механизмы учёта.
При поэкземплярном учёте отслеживаются конкретные коды маркировки.
При объёмно-сортовом учёте (ОСУ) сведения о движении продукции передаются по GTIN и количеству, без обязательной передачи индивидуальных кодов каждой упаковки.
Поэтому наличие товара на балансе организации не всегда означает наличие соответствующего количества индивидуальных марок в результатах поиска.
Важное уточнение: пустой ответ cises/search сам по себе не доказывает ОСУ. Он показывает лишь отсутствие записей по условиям конкретного запроса.
Для проверки количественных остатков нужен другой метод API.
2. Получение остатков виртуального склада
В True API предусмотрен метод получения баланса виртуального склада:
POST /api/v3/true-api/warehouse/balance
Для молочной продукции используем параметр товарной группы:
?pg=milk
Пример запроса для одного GTIN:
{
"gtins": [
"04620021194272"
],
"pagination": {
"page": 0,
"perPage": 100
}
}
В ходе тестирования выяснилась важная деталь: для получения первой страницы мы использовали page = 0.
Первоначальные запросы с page = 1 возвращали пустой результат.
После изменения номера страницы API вернул сведения об остатке.
Пример реального ответа, полученного при тестировании:
{
"code": 0,
"description": "Ok",
"balances": [
{
"saldo": 1,
"actualInput": 0,
"actualOutput": 0,
"quantity": 1,
"netWeight": 78,
"volume": 0,
"actualOperationsCount": 0
}
]
}
Из ответа исключён GTIN.
Таким образом, получили два результата:
-
Поиск индивидуальных марок — пустой список.
-
Баланс виртуального склада — положительный остаток.
Для рассматриваемого товара это согласуется с объёмно-сортовым учётом.
Однако следует учитывать, что баланс виртуального склада не всегда позволяет однозначно определить способ учёта конкретного остатка.
Поэтому в обработке правильнее показывать отдельно количество найденных индивидуальных марок и баланс виртуального склада.
Универсальная работа с товарными группами
Важное требование — не ограничивать эту проверку молочной продукцией.
В существующей обработке товарная группа уже определяется автоматически по виду номенклатуры:
ГруппаТоваров =
ИнтеграцияИСРТКлиентСервер.
ОсобенностьУчетаПоВидуПродукции(
Товар.ВидНоменклатуры.ОсобенностьУчета);
Далее используется функция преобразования значения перечисления 1С в код товарной группы True API:
КодГруппы = ТоварнаяГруппа(ГруппаТоваров);
Это позволяет использовать одну архитектуру для различных товарных групп, при условии поддержки соответствующего метода API.
Проверку применимости метода к товарной группе необходимо выполнять отдельно.
3. Получаем срок годности каждой марки
Следующая задача оказалась ещё интереснее.
При инвентаризации важно знать не только то, находится ли марка в обороте, но и не истёк ли срок годности товара.
Для этого можно использовать метод:
POST /api/v3/true-api/cises/info
Он позволяет получать дополнительную информацию по списку кодов маркировки.
В частности, для поддерживаемых товарных групп в ответе могут присутствовать:
-
productionDate — дата производства.
-
expirationDate — срок годности.
-
status — статус кода маркировки.
-
cis — код идентификации.
В нашей обработке список марок сначала получается через cises/search, а затем найденные коды передаются в cises/info.
Используем существующую авторизацию 1С
Для получения токена применяется штатный механизм:
КлючСессии =
ИнтерфейсАвторизацииИСМПСлужебный.
ПроверитьОбновитьКлючСессии(
ИнтерфейсИСМПОбщегоНазначенияКлиентСервер.
ПараметрыЗапросаКлючаСессии(Организация));
Далее выполняется HTTP-запрос:
КодГруппы = ТоварнаяГруппа(ГруппаТоваров);
URLЗапроса =
"api/v3/true-api/cises/info?pg="
+ КодГруппы;
РезультатЗапроса =
ОбменДаннымиИСМПКлиентСервер.
ОтправитьДанныеВСервис(
URLЗапроса,
ТелоЗапроса,
КлючСессии,
"POST",
ИнтерфейсИСМПОбщегоНазначенияКлиентСервер.
ПараметрыОтправкиHTTPЗапросов(, Истина));
Здесь ТелоЗапроса содержит JSON-массив кодов маркировки.
Небольшой нюанс с версиями API
При разработке столкнулись с ошибкой:
HTTP: 404
{
"error_message": "Метод с указанным URL не найден"
}
Ошибка возникала при обращении по адресу:
/api/v4/true-api/cises/info
После перехода на /api/v3/true-api/cises/info удалось получить данные о сроках годности.
Поэтому при реализации интеграции стоит проверять актуальный адрес конкретного метода, а не предполагать, что все методы True API работают с одинаковой версией URL.
4. Заполняем сроки годности в табличной части
В существующую таблицу кодов маркировки добавлены три реквизита:
| Реквизит | Тип |
|---|---|
| ДатаПроизводства | Дата |
| ГоденДо | Дата |
| СрокГодности | Строка |
Поскольку API возвращает даты в формате ISO 8601, для заполнения реквизитов 1С используется преобразование даты.
После получения даты годности определяем состояние товара:
Функция ОпределитьСрокГодностиКМ(ДатаГодности)
Если ДатаГодности = Дата(1, 1, 1) Тогда
Возврат "Не указан";
КонецЕсли;
Сегодня = НачалоДня(ТекущаяДата());
Если ДатаГодности < Сегодня Тогда
Возврат "Просрочен";
ИначеЕсли ДатаГодности <= Сегодня + 7 * 86400 Тогда
Возврат "Истекает";
Иначе
Возврат "Годен";
КонецЕсли;
КонецФункции
В приведённом варианте порог предупреждения составляет семь дней. Его можно сделать настраиваемым.
Для промышленного использования желательно дополнительно учитывать точное время окончания срока годности, если оно передаётся в ответе API.
5. Практический результат: среди 94 марок обнаружены просроченные
Проверку провели на маркированной пивной продукции.
Метод cises/search вернул 94 индивидуальные марки.
После дополнительного запроса сведений о кодах получили даты годности.
В таблице появились строки двух типов:
Первая группа:
-
Статус марки: INTRODUCED.
-
Годен до: 22.01.2027.
-
Состояние: «Годен».
Вторая группа:
-
Статус марки: INTRODUCED.
-
Годен до: 29.10.2026.
-
Состояние: «Просрочен».
Проверка выполнялась 5 ноября 2026 года.
Таким образом, удалось обнаружить продукцию, срок годности которой уже истёк, хотя коды маркировки продолжали иметь статус INTRODUCED.
Именно ради этого стоило добавлять второй запрос.
Статус марки «В обороте» не означает, что товар пригоден для реализации по сроку годности.
Теперь при инвентаризации можно видеть обе характеристики одновременно.
Здесь целесообразно разместить скриншот обработки с обезличенными названиями организаций, магазинов, товаров, GTIN и кодами маркировки.
Что это даёт на практике
Обработка теперь позволяет выявлять товары, которые:
-
Числятся за организацией в ГИС МТ.
-
Имеют индивидуальные коды маркировки.
-
Физически проверяются сканированием.
-
Могут иметь истёкший срок годности.
Следующим этапом можно автоматизировать отбор просроченной продукции для формирования документов списания.
При этом списание не должно происходить автоматически только на основании даты из API: необходимо подтвердить фактическое наличие, причину выбытия и корректность выбранного документа.
6. Почему нельзя просто считать количество марок остатком товара?
Это ещё один вывод, к которому пришли в процессе разработки.
Для продукции с поэкземплярным учётом количество найденных марок может использоваться для инвентаризации индивидуальных кодов.
Но для продукции с ОСУ такая логика неприменима.
Например:
| Источник | Результат |
|---|---|
| cises/search | 0 индивидуальных марок |
| warehouse/balance | Есть количественный остаток |
| Вывод | Требуется проверка способа учёта |
Причём нельзя автоматически складывать баланс виртуального склада и количество найденных марок: эти показатели могут пересекаться.
Поэтому универсальная обработка должна рассматривать два источника данных отдельно.
В перспективе это позволит реализовать разные сценарии инвентаризации: индивидуальных марок и количественных остатков.
7. Что планируется доработать
На следующем этапе хочу добавить:
-
Отбор марок по сроку годности: годные, истекающие, просроченные.
-
Подсветку просроченной продукции в таблице.
-
Сводную информацию о количестве просроченных марок по магазинам.
-
Отдельный сценарий инвентаризации для товаров с объёмно-сортовым учётом.
-
Формирование документов списания по результатам инвентаризации.
-
Дополнительную проверку корректности сведений о принадлежности кодов организации.
Также планируется дальнейшая проверка обработки на других товарных группах.
Заключение
Первоначально задача заключалась в том, чтобы получить из «Честного знака» список марок и проверить их физическое наличие.
Но в процессе эксплуатации выяснилось, что одного списка кодов недостаточно.
Информация о сроках годности позволяет обнаруживать продукцию, которая формально остаётся в обороте, но уже не должна продаваться.
А запрос баланса виртуального склада помогает разобраться в ситуациях, когда индивидуальные марки не возвращаются, хотя у организации имеются количественные остатки.
В результате постепенно формируется инструмент, который позволяет не только инвентаризировать маркированную продукцию, но и контролировать её состояние по сведениям ГИС МТ.
Работу над обработкой продолжаю. По мере проверки новых товарных групп и сценариев учёта буду публиковать результаты.
Предыдущая публикация:
Запрос списка кодов маркировки «Честный знак» по заданным фильтрам и списание
Документация и материалы:
-
Официальное сообщество «Честный знак»: проверка маркированной продукции через True API
-
Актуальная спецификация True API — раздел «Помощь» личного кабинета ГИС МТ.
Проверено на следующих конфигурациях и релизах:
- Розница, редакция 2.3, релизы 2.3.26.24
Вступайте в нашу телеграмм-группу Инфостарт