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