1. Администирование: «Номенклатура» характеристика номенклатуры, серии товаров, множество видов номенклатуры; «Склад и доставка» ордерные склады.
2. Создать склад «Экзамен». Установить галку «Использовать ордерную схему документооборота «при отражении излишков, недостач и порчи», иначе серии можно использовать только справочно, а нам по условию нужно знать остатки в разрезе серий.
3. Создать вид номенклатуры «Экзамен», поставить галку «Использовать серии». Указать что серии идентифицируют «Партия товаров, имеющих одинаковый номер серии». Для склада «Экзамен» указать политику учета серий с типом «Управление остатками серий».
4. Создать номенклатуру с видом номенклатуры «Экзамен» и создать поступления с разными сериями.
5. Решение:
Хранить «плохие» серии нужно в периодическом регистре сведений. Периодичность регистра день. Нужно это для того, чтобы была возможность перепровести документы, которые введены до внесения в систему «плохих» серий. Второй момент, вроде бы было логично сделать через подписку на проведения документа поступления, но это неправильно и за это снимают балы на экзамене с формулировкой «задание выполнено некорректно, пользователю предоставляется возможность работы с плохими сериями, после чего выполняется контроль, приводящий к отмене действий», т.е. нужно в момент выбора серии. Делать это нужно в обработке ПодборСерийВДокументы.
В форме регистрации серий нужно:
- На вкладке «Ввод» при изменении колонки «Номер» проверять не является ли серия «плохой» и если да, то предупреждать об этом и обнулять колонку «Количество». При изменении количества проверять если серия «плохая», то обнулять колонку «Количество».
- На вкладке «Выбор» если серия «плохая», то обнулять колонку «Количество».
И все равно нужно делать проверку при проведении, т.к. можно взять созданный документ, поменять дату и провести.
- Создать регистр сведения «ПлохиеСерии» (независимый, периодичность в пределах дня). Измерения:
- (тип СправочникСсылка.СерииНоменклатуры),
- (тип СправочникСсылка.Номенклатура), ведущее
- (тип СправочникСсылка.ХарактеристикиНоменклатуры)
Создать общий модуль «ПроверкаПлохихСерий» (сервер, вызов сервера), в нем функцию которая срезом последних под дате документа из регистра «Плохие серии» возвращает на переданную номенклатуру, характеристику и серию Истина или Ложь.
Функция ПроверкаПлохихСерий(ДатаСреза,Номенклатура,Характеристика,Серии) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПлохиеСерииСрезПоследних.Период
|ИЗ
| РегистрСведений.ПлохиеСерии.СрезПоследних(
| &ДатаСреза,
| Номенклатура = &Номенклатура
| И Серии = &Серии
| И Характеристика = &Характеристика) КАК ПлохиеСерииСрезПоследних";
Запрос.УстановитьПараметр("ДатаСреза", ДатаСреза);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Серии", Серии);
Запрос.УстановитьПараметр("Характеристика", Характеристика);
возврат Запрос.Выполнить().Пустой();
КонецФункции
- В форме «ФормаРегистрацииСерий» на странице «Выбор» обработки ПодборСерийВДокументы в табличной части для колонки «Количество» в процедуру ПриИзменении в начале добавить проверку для строки из которой открывается обработка ПодборСерийВДокументы. В функцию проверка плохих серий нужно передать:
ДатуСреза (Этаформа.ВладелецФормы.Объект.Дата)
Номеклатуру (Этаформа.Номенклатура)
Характеристика (Этаформа.Характеристика)
Серии (Этаформа.Элементы.ОстаткиСерий.ТекущиеДанные.Серия)
Если функция вернет Истина, то обнулить в текущих данных КоличествоУпаковок
Этаформа.Элементы.ОстаткиСерий.ТекущиеДанные.КоличествоУпаковок = 0;
И сообщить что эту серию использовать нельзя.
- В форме «ФормаРегистрацииСерий» на странице «Ввод» обработки ПодборСерийВДокументы в табличной части для колонки «Количество» в процедуру ПриИзменении в начале и для колонки «Номер» в процедуру ПриИзменении в конец добавить проверку на плохие серии. Только серии брать не с табличной части ОстаткиСерий, как в предыдущем пункте, а с табличной части Серии.
Серии (Элементы.Серии.ТекущиеДанные.Серия)
и у неё же обнулять КоличествоУпаковок, если возвращается Истина
Этаформа.Элементы.Серии.ТекущиеДанные.КоличествоУпаковок = 0;
- Теперь нужно сделать проверку при проведении поступления. Создать подписку на события «ОбработкаПроведения» для документа поступления товаров. Обработчик события разместить в том же общем модуле «Рарус_ПроверкаПлохихСерий».
- В обработчике сделать запрос к табличной части «Серии» документа поступления и соединить её внутренним соединением со срезом последних регистра сведений «ПлохиеСерии». Т.о., если запрос что-то вернет, то это и будет плохая серия с номенклатурой и характеристикой.
- Опишем таблицы запроса
1)Серии Источник табличная часть «Серии» документа ПоступлениеТоваровУслуг
Поля:
Серия (Серии.Серия)
Номенклатура (Серии.Номенклатура)
Характеристика (Серии.Характеристика)
2)ПлохиеСерииСрезПоследних
Источник: срез последних регистра сведений «ПлохиеСерии» (&ДатаСреза)
Условие: Серии.Ссылка = &Документ"
Связи: Внутреннее по полям Номенклатура, Серия, Характеристика.
Парамеры: &ДатаСреза = Источник.Дата, &Документ = Источник.Ссылка
Если запрос не пустой, тогда Отказ = Истина , обходим результат запроса и формируем строку сообщения с учетом того, что у одной номенклатуры и характеристики может быть несколько плохих серий. Т.е. нужно каждую строку сравнивать с предыдущей номенклатурой и характеристикой и если они одинаковые, то просто дописывать серию к текущей строке, если не равны, то вывести сообщение и начать формировать новую.
- Серии так же есть еще у приходного ордера на товары, который используется при ордерном на ордерном складе. Если есть время, то нужно сделать проверку при проведении ордера. В подборе ничего делать не надо, т.к. вызывается та же обработка, а вот для проверки проведения нужно сделать следующее:
1) В подписку события добавить документ ПриходныйОрдерНаТовары.
2) В начале процедуры добавить поиск полного имени документа
ДокументПоиска = Метаданные.НайтиПоТипу(ТипЗнч(Источник)).ПолноеИмя();
3) В запросе вместо
ИЗ Документ.ПоступлениеТоваровУслуг.Серии КАК СерииДокумента "+ДокументПоиска+".Серии КАК СерииДокумента
Поскольку табличная часть «Серии» у документов одинаковые, менять больше ничего не надо.
Процедура Рарус_ПроведениеОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
ДокументПоиска = Метаданные.НайтиПоТипу(ТипЗнч(Источник)).ПолноеИмя();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СерииДокумента.Серия,
| СерииДокумента.Номенклатура,
| СерииДокумента.Характеристика
|ИЗ
| "+ДокументПоиска+".Серии КАК СерииДокумента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПлохиеСерии.СрезПоследних(&ДатаСреза, ) КАК ПлохиеСерииСрезПоследних
| ПО СерииДокумента.Номенклатура = ПлохиеСерииСрезПоследних.Номенклатура
| И СерииДокумента.Характеристика = ПлохиеСерииСрезПоследних.Характеристика
| И СерииДокумента.Серия = ПлохиеСерииСрезПоследних.Серии
|ГДЕ
| СерииДокумента.Ссылка = &Документ";
Запрос.УстановитьПараметр("ДатаСреза", Источник.Дата);
Запрос.УстановитьПараметр("Документ", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ПредыдущаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка();
ПредыдущаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
СтрокаСообщения = "";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ПредыдущаяНоменклатура = ВыборкаДетальныеЗаписи.Номенклатура и ПредыдущаяХарактеристика = ВыборкаДетальныеЗаписи.Характеристика Тогда
СтрокаСообщения = СтрокаСообщения + ", "+ВыборкаДетальныеЗаписи.Серия;
Иначе
Если СтрокаСообщения <> "" Тогда
Сообщить(СтрокаСообщения);
КонецЕсли;
СтрокаСообщения = "Для номенклатуры """+ВыборкаДетальныеЗаписи.Номенклатура+""" с характеристикой """+ВыборкаДетальныеЗаписи.Характеристика+""" указаны плохие серии:"+ВыборкаДетальныеЗаписи.Серия;
КонецЕсли;
ПредыдущаяНоменклатура = ВыборкаДетальныеЗаписи.Номенклатура;
ПредыдущаяХарактеристика = ВыборкаДетальныеЗаписи.Характеристика;
КонецЦикла;
Сообщить(СтрокаСообщения);
Отказ = Истина;
КонецЕсли
КонецПроцедуры
6. Создать отчет «Движение ИспорченныхСерий»
Две временные таблицы «Приход» и «Расход» Серий (отличаются условием Документ ССЫЛКА Документ.ПоступлениеТоваровУслуг):
ВЫБРАТЬ
ПлохиеСерии.Номенклатура,
ПлохиеСерии.Характеристика,
ПлохиеСерии.Серии,
ДвиженияСерийТоваровОбороты.Документ.Дата КАК ДатаПоступления,
ДвиженияСерийТоваровОбороты.Документ.Партнер КАК Поставщик
ПОМЕСТИТЬ ПриходСерий
ИЗ
РегистрСведений.ПлохиеСерии КАК ПлохиеСерии
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияСерийТоваров.Обороты(
&НачалоПериода,
&КонецПериода,
Регистратор,
Документ ССЫЛКА Документ.ПоступлениеТоваровУслуг
ИЛИ Документ ССЫЛКА Документ.ПрочееОприходованиеТоваров) КАК ДвиженияСерийТоваровОбороты
ПО ПлохиеСерии.Номенклатура = ДвиженияСерийТоваровОбороты.Номенклатура
И ПлохиеСерии.Характеристика = ДвиженияСерийТоваровОбороты.Характеристика
И ПлохиеСерии.Серии = ДвиженияСерийТоваровОбороты.Серия
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПлохиеСерии.Номенклатура,
ПлохиеСерии.Характеристика,
ПлохиеСерии.Серии,
ДвиженияСерийТоваровОбороты.Документ.Партнер КАК Клиент
ПОМЕСТИТЬ РасходСерий
ИЗ
РегистрСведений.ПлохиеСерии КАК ПлохиеСерии
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияСерийТоваров.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Документ ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ДвиженияСерийТоваровОбороты
ПО ПлохиеСерии.Номенклатура = ДвиженияСерийТоваровОбороты.Номенклатура
И ПлохиеСерии.Характеристика = ДвиженияСерийТоваровОбороты.Характеристика
И ПлохиеСерии.Серии = ДвиженияСерийТоваровОбороты.Серия
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПриходСерий.Номенклатура,
ПриходСерий.Характеристика,
ПриходСерий.Серии,
ПриходСерий.ДатаПоступления,
ПриходСерий.Поставщик,
РасходСерий.Клиент,
ТоварыНаСкладахОстатки.ВНаличииОстаток
ИЗ
ПриходСерий КАК ПриходСерий
ЛЕВОЕ СОЕДИНЕНИЕ РасходСерий КАК РасходСерий
ПО ПриходСерий.Характеристика = РасходСерий.Характеристика
И ПриходСерий.Номенклатура = РасходСерий.Номенклатура
И ПриходСерий.Серии = РасходСерий.Серии
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки
ПО ПриходСерий.Характеристика = ТоварыНаСкладахОстатки.Характеристика
И ПриходСерий.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
И ПриходСерий.Серии = ТоварыНаСкладахОстатки.Серия
Далее Соединить их (слева – главная «ПриходСерий)
Добавить его как внешний и в «ЗапасыИЗакупки»
«ЖЕЛАТЕЛЬНО ЕЩЁ СДЕЛАТЬ В ПРОЧЕМ ОПРИХОДЫВАНИИ»
5 Создать свой склад, «Использовать ордера при отражении излишков и недостач», Создать «ВидТовара», несколько своего товара, на каждый товар - серию:
6. Создать поступление, продать. Оприходовать товар