Остатки кодов маркировки в 1С: почему их нет в регистрах и как их посчитать
Иван Недомолков · Опубликовано:
Готового остатка по коду маркировки в типовой 1С нет. В Управлении торговлей 11.5 ни один регистр накопления не ведёт учёт в разрезе кода: код хранится элементом справочника ШтрихкодыУпаковокТоваров, а документы ссылаются на него из табличной части ШтрихкодыУпаковок. Какие коды сейчас лежат на складе, приходится вычислять самим, по последнему проведённому движению каждого кода.
Структуру мы смотрели по выгрузке метаданных типовой УТ 11.5.22.67, расчёт по последнему движению гоняли на стенде.
Где в УТ 11.5 хранится код маркировки
Сам код живёт в справочнике ШтрихкодыУпаковокТоваров: значение штрихкода, тип упаковки, номенклатура с характеристикой и серией, количество, а у групповой упаковки ещё и вложенные коды в табличной части.
Документ знает о коде через табличную часть ШтрихкодыУпаковок: в каждой строке реквизит ШтрихкодУпаковки со ссылкой на элемент справочника. В 11.5.22.67 эту табличную часть несут 34 вида документов.
Регистра накопления с измерением по коду мы не нашли, перебрав все регистры конфигурации. Код встречается только в регистрах сведений (пул кодов СУЗ, коды к передаче между организациями, результаты проверки кассой, вскрытые упаковки), и остатка ни один из них не ведёт. ДвиженияСерийТоваров считается по серии, до кода он не доходит.
Что типовая уже умеет и почему это не остаток
Всё, что есть в типовой, работает либо в момент операции с кодом, либо со стороны ГИС МТ:
- “Список КИ на балансе” в документе
ОтчетИСМПзабирает из ГИС МТ архив с кодами, а отчётСписокКИНаБалансеИСМПтолько перечитывает его. С остатками 1С он ничего не сопоставляет. - Регистр
ОперацииПроверкиКМхранит проверки разрешительного режима в момент пробития чека. - Модуль
СверкаКодовМаркировкиИСМПсверяет коды поступления с УПД поставщика и готовит ТОРГ-2. - Четыре регламентных задания ИСМП обмениваются данными с ИС МП, загружают сведения об отклонениях и чистят коды.
Выходит, что код, который лежит на полке и никуда не движется, типовая не проверяет совсем. Касса спросит о нём систему, только когда товар начнут продавать.
Как посчитать остаток по коду
Правило одно: код на складе, если его последнее проведённое движение приходное. Берутся все проведённые документы с табличной частью ШтрихкодыУпаковок, каждому виду документа назначается направление, строки складываются в одну выборку и сортируются по коду и дате.
Механика на двух документах, приобретении и реализации:
ВЫБРАТЬ
ШК.ЗначениеШтрихкода КАК Код,
ШК.Номенклатура КАК Номенклатура,
Т.Ссылка.Дата КАК Дата,
1 КАК Направление
ИЗ
Документ.ПриобретениеТоваровУслуг.ШтрихкодыУпаковок КАК Т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ШтрихкодыУпаковокТоваров КАК ШК
ПО Т.ШтрихкодУпаковки = ШК.Ссылка
ГДЕ
Т.Ссылка.Проведен
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ШК.ЗначениеШтрихкода,
ШК.Номенклатура,
Т.Ссылка.Дата,
-1
ИЗ
Документ.РеализацияТоваровУслуг.ШтрихкодыУпаковок КАК Т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ШтрихкодыУпаковокТоваров КАК ШК
ПО Т.ШтрихкодУпаковки = ШК.Ссылка
ГДЕ
Т.Ссылка.Проведен
УПОРЯДОЧИТЬ ПО
Код,
Дата,
Направление УБЫВ
Сортировка направления по убыванию решает спор двух движений с одинаковой датой документа: приход встаёт раньше расхода, и последним по коду окажется расход.
Дальше обход выборки оставляет по каждому коду последнее движение:
НаОстатке = Новый Массив;
ТекущийКод = Неопределено;
Последнее = 0;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Код <> ТекущийКод Тогда
Если Последнее = 1 Тогда
НаОстатке.Добавить(ТекущийКод);
КонецЕсли;
ТекущийКод = Выборка.Код;
КонецЕсли;
Последнее = Выборка.Направление;
КонецЦикла;
Если Последнее = 1 Тогда
НаОстатке.Добавить(ТекущийКод);
КонецЕсли;
Если учёт идёт по нескольким организациям, в условие каждой части добавьте отбор по организации документа.
Какие документы считать приходом, а какие расходом
Два документа из примера это только начало. Из 34 видов документов с кодами в УТ 11.5.22 направление очевидно у 18. Остальные 16 либо не меняют владельца кода, либо меняют его так, что без разбора не угадаешь.
| Направление | Документы в УТ 11.5 |
|---|---|
| приход | приобретение товаров, приёмка и маркировка ИСМП, возврат от клиента, приходный ордер, прочее оприходование, поступление от хранителя, приёмка на хранение |
| расход | реализация, отгрузка ИСМП, вывод из оборота, списание кодов маркировки, возврат поставщику, внутреннее потребление, расходный ордер, передача хранителю и между организациями, отгрузка с хранения |
| владельца не меняют | перемещение, отбор и размещение: для сверки с ГИС МТ важно, ваш код или нет, а склад значения не имеет |
| требуют разбора | корректировки приобретения и реализации, акты о расхождениях, сборка, возврат между организациями, документы ВЕТИС и ЕГАИС с кодами |
Корректировки владение кодом меняют по-настоящему, и если в базе их много, остаток без них будет неполным. В Бухгалтерии предприятия 3.0 набор свой: коды несут поступление и реализация, и корректировки поступления и реализации так же меняют владельца. Поэтому список направлений между конфигурациями вслепую не переносят: сначала перебор документов с табличной частью ШтрихкодыУпаковок через Метаданные.Документы, потом решение по каждому виду.
Где такой расчёт ошибается
- Непроведённые документы в выборку не попадают. Код, пришедший документом, который забыли провести, числится отсутствующим.
- Документы без направления выпадают молча, и ваши собственные с табличной частью кодов тоже. Хороший расчёт перечисляет виды, которые не смог отнести ни к приходу, ни к расходу, иначе неполный остаток выглядит полным.
- Склады в правиле последнего движения не участвуют. Ответ получается на вопрос “наш код или нет”, для складского учёта этого мало.
Вторая половина сверки: список кодов из ГИС МТ
Остаток по документам говорит, что лежит у вас. Что Честный Знак числит за организацией, отвечает список кодов владельца, его отдаёт метод cises/search в True API. Три детали, на которых спотыкаются чаще всего:
- Статус фильтруется массивом
states. Поляstatus,cisStatusиstatusesсервис принимает без ошибки и просто не применяет: в ответ приходят коды не того статуса, который просили. “В обороте” этоINTRODUCED, выбывшие приходят какRETIRED. - Страницы листаются курсором. На следующей странице в
paginationпередаютlastEmissionDateиsgtinпоследней записи предыдущей, размер страницы до 1 000, конец поisLastPage. Параметрыlimit,pageиoffsetне работают, общего числа кодов в ответе нет. - Товарная группа обязательна и передаётся только в теле. Имена групп берут из поля
product_group_infoтокена авторизации: числовой код из справочника видов продукции сервис отклоняет.
Тело запроса для первой страницы:
{
"filter": {
"productGroups": ["gadgets"],
"ownerInn": "ИНН организации",
"states": [{"status": "INTRODUCED"}]
},
"pagination": {"perPage": 1000}
}
Ответ 429 значит, что сервис просит сбавить темп: нужна пауза между вызовами и повтор с растущей задержкой. И про ключ: если отдать его типовому слою отправки структурой, а не строкой, сервис ответит “Токен не действителен”, тем же текстом, что на просроченный.
Сопоставить два списка, разложить расхождения по типам и открыть документ, которым код попал на остаток, умеет наша обработка аудита кодов маркировки. Она работает с российской ГИС МТ, берёт ключ из типовых настроек обмена с ИС МП и ничего не пишет ни в данные базы, ни в Честный Знак. Файл и описание лежат в карточке на Инфостарте, цена 10 SM.