Как определить номенклатуру по серии в 1С:ERP, УТ 11 и КА

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

В современных конфигурациях на базе 1С:ERP (ERP, КА, УТ 11) работа с сериями реализована достаточно гибко, что иногда вызывает затруднения у разработчиков при попытке быстро получить номенклатуру, зная только ссылку на серию. Трудность заключается в том, что связь между серией и товаром не всегда является прямой (через владельца). Рассмотрим подробно, как устроена эта связь и какими способами можно программно определить номенклатуру по конкретной серии.

Анализируем структуру хранения данных

Прежде чем переходить к коду, разберем, почему стандартное обращение к реквизиту Владелец в справочнике СерииНоменклатуры не всегда дает нужный результат. В системе существует два основных подхода к настройке серий в справочнике ВидыНоменклатуры:

  1. Экземпляр товара (уникальный серийный номер): В этом случае владельцем серии действительно является конкретная Номенклатура. Проблема решается простым обращением к свойству ссылки.
  2. Партия товаров: Здесь владельцем серии выступает ВидНоменклатуры. Это означает, что одна и та же серия (например, номер партии производителя) может теоретически относиться к разным товарам, входящим в этот вид.

Проанализируем ситуацию, когда политика учета серий настроена как "Управление остатками", а указание серий происходит "При планировании отгрузки". В этом случае финансовые регистры (например, АналитикаУчетаНоменклатуры) могут не содержать информацию о сериях, так как они не влияют на себестоимость, а для контроля данных может потребоваться сравнение оборотов товаров.

Способ 1. Использование регистра «Движения серий товаров»

Как показывает практика и анализ работы платформы, наиболее достоверным источником связи серии с конкретным товаром является регистр накопления ДвиженияСерийТоваров. Именно в нем фиксируются все складские операции в разрезе серий, номенклатуры и характеристик.

Рассмотрим пример запроса, который позволяет получить номенклатуру и ее представление по известной серии. Этот метод полезен тем, что он находит связь, даже если серия физически была введена в систему, но еще не отражена в остатках (например, был только приход):


ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
    ДвиженияСерийТоваров.Номенклатура КАК Номенклатура,
    ДвиженияСерийТоваров.Характеристика КАК Характеристика,
    ДвиженияСерийТоваров.Номенклатура.Представление КАК НоменклатураПредставление
ИЗ
    РегистрНакопления.ДвиженияСерийТоваров КАК ДвиженияСерийТоваров
ГДЕ
    ДвиженияСерийТоваров.Серия = &Серия

Важный нюанс: поскольку одна серия в теории может быть привязана к разным товарам (если владелец — Вид номенклатуры), использование ключевого слова РАЗЛИЧНЫЕ или группировки обязательно. Если серия уникальна в рамках базы, мы получим одну корректную запись, что важно для маркировки на ТСД.

Способ 2. Анализ механизма автоподбора (ОбработкаПолученияДанныхВыбора)

Многие замечали "волшебство": когда в поле ввода серии мы начинаем набирать номер, платформа сама подсказывает, к какой номенклатуре она относится, в формате "Серия (Номенклатура)". Выясним причину такого поведения. Это не встроенная магия платформы, а программный код в менеджере справочника.

В модуле менеджера справочника СерииНоменклатуры переопределен обработчик ОбработкаПолученияДанныхВыбора. Он вызывает функции общего модуля, которые динамически строят запрос к остаткам и оборотам серий. Посмотрим на упрощенную логику того, как система формирует эти данные:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    // Вызов типового механизма, который анализирует контекст
    НоменклатураВызовСервера.СерииНоменклатурыОбработкаПолученияДанныхВыбора(
        ДанныеВыбора, 
        Параметры, 
        СтандартнаяОбработка
    );
КонецПроцедуры

Если нам нужно программно повторить логику платформы для получения представления, мы можем обратиться к функции ДанныеАвтоподбора или выполнить аналогичный запрос к регистру движений серий, как было показано в первом способе.

Способ 3. Поиск через остатки на складах

Если серия используется для управления остатками, то информацию о номенклатуре можно получить из регистра накопления ТоварыНаСкладах. Это более "строгий" метод, так как он вернет номенклатуру только в том случае, если по этой серии есть фактический остаток на каком-либо складе.

Разберем, в каких случаях какой регистр использовать:

Рекомендации по реализации

При написании собственного кода для определения номенклатуры по серии рекомендуем придерживаться следующего алгоритма:

  1. Проверить владельца серии. Если это Справочник.Номенклатура — задача решена.
  2. Если владелец — ВидНоменклатуры, выполнить запрос к РегистрНакопления.ДвиженияСерийТоваров с фильтром по ссылке серии.
  3. Учитывать, что в конфигурациях ERP/УТ 11/КА для этих целей часто используются временные таблицы в динамических списках, чтобы обеспечить высокую скорость поиска при вводе по строке.

Таким образом, самым универсальным и "аккуратным" способом получения номенклатуры для серии (при условии, что серия уже где-то фигурировала в документах) является прямое обращение к регистру ДвиженияСерийТоваров. Это гарантирует получение связи даже в сложных случаях настройки политик учета.

← На главную