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