В процессе складского учета часто возникает задача отслеживания не только количества товара, но и его текущего состояния, которое может меняться со временем. Классический пример — измерительные приборы (нивелиры, теодолиты), которые требуют регулярной поверки или калибровки. В этой статье мы проанализируем ситуацию, когда один и тот же товар может находиться в разных состояниях («новый», «поверен», «требуется калибровка»), и разберем наиболее эффективные способы реализации такого учета в системе 1С.
Рассмотрим ситуацию: на склад поступило 3 единицы товара «Нивелир». Через некоторое время одну единицу отправили на поверку, вторую — на калибровку. В итоге мы имеем три позиции с разными свойствами, хотя физически это одна и та же номенклатура. Основная сложность заключается в том, что состояние «поверен» имеет срок действия. Когда срок поверки истекает, характеристика товара должна автоматически измениться обратно на «не поверен» или «требуется поверка».
Нам необходимо решить две задачи:
Первое решение, которое приходит в голову — использование типового механизма Характеристики. В этом случае для каждой номенклатуры создаются записи: «Нивелир (поверен)», «Нивелир (калиброван)» и так далее.
Преимущества:
Недостатки:
Комплектация номенклатуры или Пересортица. Это порождает огромный документооборот.Проанализируем более гибкий подход, который часто применяется в профессиональной разработке. Поскольку каждый прибор индивидуален, нам необходимо идентифицировать его с помощью Серийных номеров. Если в вашей конфигурации нет полноценного учета по сериям, его можно реализовать через справочник, подчиненный номенклатуре.
Вместо того чтобы менять саму характеристику товара (справочник), мы будем хранить состояние этого прибора в периодическом Регистре сведений. Разберем структуру такого регистра:
Номенклатура, СерийныйНомер.ВидСостояния (Перечисление: Поверен, Калиброван, ТребуетсяРемонт), ДатаОкончанияДействия.Этот метод позволяет нам не «двигать» товар по складам документами пересортицы, а просто фиксировать факт прохождения поверки в регистре.
Выясним важный нюанс: хранить в базе само значение «Поверен» — не совсем корректно, так как оно зависит от текущей даты. Правильнее хранить дату поверки. Имея дату поверки и нормативный срок (например, 1 год), мы всегда можем вычислить статус прибора «на лету» в любом отчете.
Рассмотрим пример реализации логики получения статуса в запросе:
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.СерийныйНомер,
Остатки.КоличествоОстаток,
ВЫБОР
КОГДА Состояния.ДатаПоверки >= &ТекущаяДата
ТОГДА "Поверен"
ИНАЧЕ "Срок истек / Требуется поверка"
КОНЕЦ КАК ТекущийСтатус
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ИсторияПоверок.СрезПоследних(&Период, ) КАК Состояния
ПО
Остатки.Номенклатура = Состояния.Номенклатура
И Остатки.СерийныйНомер = Состояния.СерийныйНомер
Такой подход избавляет систему от необходимости физически перемещать товар между категориями. В базе данных нивелир остается нивелиром, а его «поверенность» — это лишь свойство, которое проверяется по дате.
Разберем по шагам, как внедрить эту систему, если вы работаете с нетиповой или старой конфигурацией (например, на базе Бухгалтерии 1.6):
СерийныеНомера, владельцем которого будет Номенклатура. Добавьте этот справочник в качестве субконто на счета учета или в измерения регистров накопления.СведенияОПоверках. Сделайте его периодическим (периодичность — день). Это позволит хранить всю историю «жизни» прибора.АктПоверкиПриборов. Этот документ не должен делать проводок по бухгалтерии, его задача — записывать данные в ваш новый регистр сведений.Статус, которое будет сравнивать дату из регистра с текущей датой.Проанализируем ситуацию, когда менеджер пытается продать прибор, срок поверки которого истек. Если мы используем предложенную схему с регистром сведений, мы можем легко внедрить проверку в модуле объекта документа РеализацияТоваровУслуг:
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Для Каждого СтрокаТЧ Из Товары Цикл
Статус = ПолучитьСтатусПрибора(СтрокаТЧ.Номенклатура, СтрокаТЧ.СерийныйНомер);
Если Статус = "Просрочено" Тогда
Сообщить("Нельзя отгрузить прибор с истекшим сроком поверки!");
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Этот код позволяет гарантировать, что клиенту попадет только качественный и проверенный товар, что невозможно реализовать стандартными средствами при использовании простого складского учета без доработок.
Для учета изменяющихся характеристик товара наиболее стабильным решением является отделение количественного учета (где товар — это просто единица номенклатуры) от учета состояний (где фиксируются даты и результаты технических процедур). Использование связки Номенклатура + Серийный Номер + Регистр Сведений обеспечивает максимальную точность и позволяет строить отчеты на любую дату в прошлом или будущем, предсказывая моменты, когда приборы потребуют повторной калибровки.