В практической деятельности торговых и производственных предприятий часто возникает задача жесткого закрепления номенклатурных позиций за конкретными складами. Например, когда на специализированный склад (химикатов, ценных металлов, брака или лицензируемой продукции) должен поступать строго определенный перечень товаров. И наоборот — необходимо исключить случайное оприходование или перемещение этих спецтоваров на обычные оптовые склады компании.
В рамках данной статьи мы подробно проанализируем ситуацию, разберем ограничения типового функционала систем 1С:Комплексная автоматизация 2.4 и 1С:ERP Управление предприятием, а также рассмотрим все возможные пути решения этой задачи — от штатных механизмов до разработки собственного расширения.
При первом анализе настроек системы у многих специалистов возникает идея задействовать справочник СхемыОбеспечения. На первый взгляд, это кажется логичным: мы можем настроить схему так, чтобы товар принудительно заказывался только на конкретный склад. Однако давайте разберем, почему этот механизм не дает жесткой блокировки:
ПриобретениеТоваровУслуг или ПеремещениеТоваров. Система не выдаст никаких предупреждений и успешно проведет документ.Поэтому для реализации жесткого запрета нам потребуются другие инструменты. Рассмотрим их подробнее.
Если склад, для которого необходимо настроить ограничения, можно классифицировать как розничный магазин, мы можем применить полностью штатный и очень жесткий механизм контроля ассортимента. Разберем этот процесс по шагам:
Результат: После проведения документа ИзменениеАссортимента система начнет жестко контролировать все операции. При попытке оформить поступление, перемещение или продажу любого товара, не входящего в разрешенный список для этого формата магазина, программа заблокирует проведение документа и выдаст ошибку. К сожалению, для классических оптовых складов данный функционал штатно недоступен.
Если склад должен оставаться оптовым, мы можем настроить физическое ограничение размещения товаров в ячейках. Это реализуется через адресный склад:
СпецТовары и ОбычныеТовары. Присвоим их соответствующим карточкам номенклатуры.СпецТовары могла размещаться только в спецобласти, а группа ОбычныеТовары — только в общей области.Результат: С финансовой точки зрения документ ПриобретениеТоваровУслуг провести удастся (так как он работает на уровне всего склада). Однако на уровне складского учета (приходный ордер, задание на размещение) система выдаст ошибку и физически не позволит положить обычный товар в ячейки для спецтоваров, и наоборот. Товар зависнет в зоне приемки, что оперативно вскроет ошибку менеджера.
Если наша цель — полностью защитить складской контур от ошибок человеческого фактора на этапе подбора товаров, мы можем настроить разделение прав:
Результат: Пользователи физически не смогут выбрать «запрещенные» позиции, так как они просто не будут отображаться у них в списках выбора и подбора в документах.
Если ни один из штатных методов не подходит (например, склад должен оставаться оптовым без адресного хранения, а RLS слишком сильно нагружает базу данных), оптимальным решением будет создание небольшого расширения конфигурации. Это позволит сохранить конфигурацию на поддержке и гарантировать 100% контроль.
Давайте проанализируем программную реализацию. Мы можем привязаться к реквизиту ВидНоменклатуры (это более надежно, чем текстовые маркеры в комментариях) и блокировать проведение любых документов, делающих движения по складу, если связка нарушена. Нам потребуется создать подписку на событие ОбработкаПроведения для документов товародвижения или перехватить проведение конкретных документов через расширение.
Рассмотрим пример кода для расширения, проверяющий соответствие склада и вида номенклатуры в документе ПеремещениеТоваров:
&После("ОбработкаПроведения")
Процедура Инт_ПроверитьСвязкуНоменклатурыИСклада(Отказ, РежимПроведения)
// Определим параметры контроля
СпецВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Специальная номенклатура");
СпецСклад = Справочники.Склады.НайтиПоНаименованию("Специальный склад");
Если Не ЗначениеЗаполнено(СпецВидНоменклатуры) Или Не ЗначениеЗаполнено(СпецСклад) Тогда
Возврат; // Настройки контроля не заданы
КонецЕсли;
// Проверим склад-отправитель и склад-получатель в документе перемещения
СкладОтправитель = ЭтотОбъект.СкладОтправитель;
СкладПолучатель = ЭтотОбъект.СкладПолучатель;
Для Каждого СтрокаТовара Из ЭтотОбъект.Товары Цикл
ТекущийВид = СтрокаТовара.Номенклатура.ВидНоменклатуры;
// 1. Контроль: спецноменклатуру нельзя перемещать на обычные склады
Если ТекущийВид = СпецВидНоменклатуры Тогда
Если СкладОтправитель <> СпецСклад И СкладПолучатель <> СпецСклад Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товар '" + СтрокаТовара.Номенклатура + "' может храниться только на складе '" + СпецСклад + "'!";
Сообщение.Поле = "Товары[" + (СтрокаТовара.НомерСтроки - 1) + "].Номенклатура";
Сообщение.Сообщить();
КонецЕсли;
КонецЕсли;
// 2. Контроль: обычную номенклатуру нельзя перемещать на спецсклад
Если ТекущийВид <> СпецВидНоменклатуры Тогда
Если СкладОтправитель = СпецСклад Или СкладПолучатель = СпецСклад Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На склад '" + СпецСклад + "' запрещено перемещать обычный товар '" + СтрокаТовара.Номенклатура + "'!";
Сообщение.Поле = "Товары[" + (СтрокаТовара.НомерСтроки - 1) + "].Номенклатура";
Сообщение.Сообщить();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Аналогичные проверки можно легко внедрить для документов ПриобретениеТоваровУслуг, РеализацияТоваровУслуг и СборкаТоваров. Если на предприятии используется гибкая матрица ограничений (много складов и много различных групп номенклатуры), рекомендуется создать в расширении собственный регистр сведений «Матрица разрешенных складов» и производить запрос к нему при проведении любых складских документов.
Для решения задачи жесткой привязки товаров к складам в 1С:КА 2.4 / ERP 2.5 мы можем выбрать один из путей: