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

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

В практике торговых компаний часто возникает ситуация, когда заказы поставщикам оформлены на месяцы вперед. Менеджеры по продажам, видя ожидаемое поступление в системе, спешат зарезервировать товар для клиента. Однако, если поставка ожидается только в следующем календарном году, это может создать проблемы с планированием и обязательствами. Рассмотрим подробно, как реализовать частичный запрет на продажу товаров «в пути» в конфигурациях 1С:Комплексная автоматизация 2 и 1С:ERP.

Метод 1. Использование механизмов обеспечения заказов

Прежде всего, разберем, как работает стандартный механизм контроля остатков. В программах 1С:КА и 1С:ERP возможность резервирования товара, которого еще нет на складе, напрямую зависит от настроек обеспечения. Проанализируем основные точки контроля:

  1. Варианты обеспечения: В строках документа Заказ клиента менеджер может выбрать вариант «Резервировать к дате». В этом случае система анализирует документы Заказ поставщику.
  2. Контроль графика: Если дата поступления по заказу поставщика слишком далека, мы можем ограничить возможность установки статуса «Отгрузить». Однако стандартная функциональность не позволяет гибко задать условие «запретить все, что позже 31 декабря».

Для решения задачи мы можем изменить подход к работе с заказами поставщикам. Если поставки следующего года будут иметь статус «Не согласован» или «Подтвержден», но с определенной пометкой, они не будут учитываться как доступный остаток для обеспечения. Разберем этот момент подробнее: в настройках системы можно указать, какие статусы заказов считаются надежным источником. Исключив «далекие» заказы из этого списка, мы добьемся того, что менеджеры просто не увидят их как свободный остаток.

Метод 2. Динамические сегменты номенклатуры (решение без программирования)

Посмотрим на один из самых изящных способов ограничения, который не требует внесения изменений в программный код. Это использование сегментов номенклатуры. Мы можем создать сегмент, который будет автоматически наполняться товарами, поставка которых ожидается в следующем году.

Проанализируем шаги настройки:

  1. Создаем новый сегмент номенклатуры с названием «Товары с дальним сроком поставки».
  2. Настраиваем способ формирования «Периодически обновлять» или «Формировать динамически».
  3. В схеме компоновки данных (СКД) сегмента прописываем запрос к регистру накопления ЗаказыПоставщикам. Условием будет наличие остатка по приходу с датой поступления больше 31.12 текущего года.
  4. Далее используем этот сегмент в Типовом соглашении с клиентами. В 1С можно настроить запрет продаж для определенных сегментов или установить на них «нулевые» цены, что не позволит провести Заказ клиента.

Метод 3. Программное решение через расширение конфигурации

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

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


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

Теперь разберем, как применить эту проверку. Оптимально вставить вызов этой функции в процедуру ПередЗаписью документа Заказ клиента. Если дата прихода больше конца текущего года, система должна выдать предупреждение и установить параметр Отказ = Истина.


&Вместо("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Для Каждого СтрокаТЧ Из ЭтотОбъект.Товары Цикл
        // Проверяем только те товары, которых нет на складе
        Если СтрокаТЧ.ВариантОбеспечения = ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.РезервироватьКДате") Тогда
            ДатаПрихода = ПроверитьДатуПоступленияТовара(СтрокаТЧ.Номенклатура, ЭтотОбъект.Склад);
            Если ДатаПрихода > Дата('20221231235959') Тогда
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Товар " + СтрокаТЧ.Номенклатура + " поступит только в " + Формат(ДатаПрихода, "ДФ=yyyy") + " году. Продажа запрещена!";
                Сообщение.Сообщить();
                Отказ = Истина;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Метод 4. Контроль через документ «Реализация товаров и услуг»

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

В этом случае логика проверки переносится из Заказа клиента в РТУ. Плюс этого метода в том, что он не ограничивает работу отдела продаж по сбору заявок (предзаказов), но защищает склад от попыток отгрузить то, чего фактически нет и не будет в ближайшее время. Однако для автора вопроса важно было ограничить именно менеджеров на этапе формирования заказа, чтобы не давать клиентам ложных надежд.

Метод 5. Управление горизонтом планирования

Проанализируем еще одну стандартную возможность. В настройках склада и обеспечения в 1С:КА 2 существует понятие «Горизонт обеспечения». Вы можете настроить систему так, чтобы она просто не «видела» заказы поставщикам, дата поступления которых выходит за рамки текущего месяца или квартала.

Преимущества этого метода:

Резюме и рекомендации

Мы рассмотрели несколько способов решения задачи. Выбор конкретного метода зависит от строгости бизнес-правил вашей компании:

  1. Если нужен жесткий запрет на ввод данных — используйте Программное расширение (Метод 3).
  2. Если нужно решение без изменения конфигурации — используйте Сегменты номенклатуры (Метод 2).
  3. Если важно правильно управлять ожиданиями менеджеров — настройте Горизонты обеспечения (Метод 5).

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

← На главную