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