Как правильно связать реквизиты Номенклатура и СерияНоменклатуры в новом документе в 1С:УТ 11.5?

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

При разработке собственных документов в конфигурации «Управление торговлей» редакции 11.5 разработчики часто сталкиваются с задачей организации выбора серий. Если реквизиты Номенклатура и СерияНоменклатуры расположены непосредственно в шапке документа, попытка настроить стандартную платформенную связь по владельцу приводит в тупик. Выясним причину такого поведения системы, проанализируем архитектуру серийного учета и разберем варианты правильной реализации этой связи.

Архитектурные особенности серий в УТ 11.5

Проанализируем структуру метаданных конфигурации. В отличие от простых справочников, справочник СерииНоменклатуры не подчинен напрямую справочнику Номенклатура и не имеет платформенного реквизита Владелец.

Связь серии с позицией номенклатуры организована опосредованно:

  1. На уровне нормативно-справочной информации: в серии присутствует реквизит ВидНоменклатуры. В зависимости от политики учета одна и та же серия может относиться как к отдельному товару, так и в целом к группе товаров определенного вида номенклатуры.
  2. На уровне движений: непосредственное сопоставление конкретной номенклатуры, ее характеристики, склада и серии фиксируется только в регистрах накопления, в частности в ТоварыНаСкладах и ДвиженияСерийТоваров.

Таким образом, организовать тривиальную связь параметров выбора «по владельцу» невозможно. Рассмотрим два основных способа решения задачи: упрощенную фильтрацию и интеграцию с типовой подсистемой указания серий.

Вариант 1. Упрощенная привязка и фильтрация серий на форме

Если для разрабатываемого документа не требуется сложный типовой складской контур с проверкой статусов серий, разберем по шагам, как настроить отбор серий под выбранную номенклатуру.

Шаг 1. Отбор по виду номенклатуры через свойства реквизита

В свойствах элемента формы СерияНоменклатуры настроим свойство Связи параметров выбора:

  1. Имя отбора: Отбор.ВидНоменклатуры.
  2. Путь к данным: Объект.Номенклатура.ВидНоменклатуры.

В этом случае при открытии формы выбора серий пользователь увидит только те серии, которые принадлежат тому же виду номенклатуры, что и товар в шапке.

Шаг 2. Отбор только серий с остатками (по данным регистра)

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


&НаКлиенте
Процедура СерияНоменклатурыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем массив доступных серий с остатком на складе
    МассивСерий = ПолучитьСерииНаОстатках(Объект.Номенклатура, Объект.Склад);
    
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("Отбор", Новый Структура("Ссылка", МассивСерий));
    
    ОткрытьФорму("Справочник.СерииНоменклатуры.ФормаВыбора", ПараметрыВыбора, Элемент);
    
КонецПроцедуры

На сервере реализуем запрос к регистру ТоварыНаСкладах или ДвиженияСерийТоваров:


&НаСервереБезКонтекста
Функция ПолучитьСерииНаОстатках(Номенклатура, Склад)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |   Остатки.Серия КАК Серия
        |ИЗ
        |   РегистрНакопления.ДвиженияСерийТоваров.Остатки(
        |       ,
        |       Номенклатура = &Номенклатура
        |           И Склад = &Склад) КАК Остатки";
        
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Склад", Склад);
    
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Серия");
    
КонецФункции

Вариант 2. Использование механизмов типовой конфигурации

Посмотрим на пример типового документа конфигурации, где номенклатура и серия также расположены в шапке — документ СборкаТоваров. В типовой архитектуре задействована подсистема серийного учета.

Рассмотрим подробнее реализацию этого механизма в модуле формы и менеджера:

  1. Экспортные функции модуля менеджера: документ должен поддерживать программный интерфейс работы с сериями. В модуле менеджера создаются процедуры:
    
    Функция ИменаРеквизитовДляЗаполненияПараметровУказанияСерий() Экспорт
        Возврат "Склад, Дата";
    КонецФункции
    
    Функция ПараметрыУказанияСерий(Объект) Экспорт
        ПараметрыУказанияСерий = НоменклатураКлиентСервер.ПараметрыУказанияСерий();
        ПараметрыУказанияСерий.ИмяТабличнойЧасти = "Товары"; // или шапка
        ПараметрыУказанияСерий.Склад = Объект.Склад;
        ПараметрыУказанияСерий.Дата = Объект.Дата;
        Возврат ПараметрыУказанияСерий;
    КонецФункции
    
  2. Реквизиты и обработчики на форме: в форму документа добавляется реквизит ПараметрыУказанияСерий с типом Произвольный. В обработчиках ПриСозданииНаСервере и ПриЧтенииНаСервере вызывается служебный код пересчета состояния:
    
    ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(
        НоменклатураСервер.ПараметрыУказанияСерий(Объект, Метаданные().Имя)
    );
    НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, "Товары");
    
  3. Служебный реквизит: для корректной индикации ввода серий добавляется числовой реквизит СтатусУказанияСерий.

Важные ограничения и подводные камни

При разработке своего механизма серий обратим внимание на следующие правила:

  1. Настройки видов номенклатуры и складов: если вы используете стандартный механизм, серии будут доступны только при включенной функциональной опции ИспользоватьСерииНоменклатуры, включенном флаге серийного учета в ВидеНоменклатуры и настроенной политике учета серий для комбинации «Вид номенклатуры — Склад». Если политика не настроена, типовые методы заблокируют ввод серий.
  2. Автоматическая очистка реквизита: если в документе вызывается общий механизм НоменклатураСервер.ОчиститьНеиспользуемыеСерии(...), система проверяет статус серий. Если реквизит СтатусУказанияСерий равен 0, система посчитает, что серии по данному товару вестись не должны, и сотрет значение поля СерияНоменклатуры при записи объекта.

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

← На главную