При работе с системой 1С:Предприятие, особенно в конфигурациях, связанных с управлением торговлей и складом, мы часто сталкиваемся с необходимостью автоматизации процессов. Один из таких сценариев — ввод документов на основании, например, создание документа реализации, который должен учитывать остатки товара и, при необходимости, инициировать формирование заказа поставщику. Давайте вместе разберем, как реализовать этот функционал корректно, избегая распространенных ошибок и используя типовые возможности системы.
Прежде всего, давайте выясним, как правильно подходить к контролю остатков и проведению документов. Ключевой принцип, который нам необходимо усвоить: никогда не выдавайте интерактивные вопросы пользователю в процессе проведения документа. Почему? Потому что в этот момент документ держит транзакцию, и любой вопрос, требующий ответа от пользователя, блокирует работу системы, замедляет проведение и может привести к серьезным проблемам с производительностью и целостностью данных.
Вместо вопросов типа "Нехватка товара, сделать заказ поставщику?" мы должны выдавать информационные сообщения: "Нехватка товара, сделайте заказ поставщику". Такие сообщения информируют пользователя, но не блокируют транзакцию и не останавливают работу.
Рассмотрим подробнее механизм контроля остатков:
Проверка наличия товара: При проведении документа (например, реализации) система должна проверить наличие товара. Существуют различные методы проверки: до формирования движений документа или после.
После формирования движений: Наиболее надежный подход — сначала записать движения документа (в рамках транзакции), а затем проверить, не привели ли эти движения к образованию отрицательных остатков. Если отрицательные остатки появились, документ не проводится, и пользователю выдается соответствующее сообщение о нехватке товаров.
Учетная политика: В зависимости от учетной политики на фирме, документ может либо не проводиться вовсе при нехватке, либо проводиться "в минус". Если разрешено проведение "в минус", то уже после проведения (например, в подписке на событие ПриЗаписи или ОбработкаПроведения) мы можем инициировать дальнейшие действия.
"Старая" и "новая" методики контроля: В 1С:Предприятие 8.3 существуют разные подходы. "Старая" методика обычно предполагает получение остатков и данных документа запросом, проверку достаточности в цикле и отмену проведения при нехватке. "Новая" методика часто использует временные таблицы для группировки табличной части документа и более эффективной проверки остатков.
Например, для проверки отрицательных остатков после проведения, мы можем использовать запрос к регистру накопления:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровНаСкладахОстатки.Номенклатура,
| ОстаткиТоваровНаСкладахОстатки.Склад,
| ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &Дата,
| Номенклатура В (&СписокНоменклатурыДокумента)
| И Склад В (&СписокСкладовДокумента)
| ) КАК ОстаткиТоваровНаСкладахОстатки
|ГДЕ
| ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("Дата", МоментВремени());
Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", ТабличнаяЧасть.ВыгрузитьКолонку("Номенклатура"));
Запрос.УстановитьПараметр("СписокСкладовДокумента", ТабличнаяЧасть.ВыгрузитьКолонку("Склад"));
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
// Обнаружены отрицательные остатки, отменяем проведение или сообщаем
Отказ = Истина;
Сообщить("Не удалось провести документ! Обнаружена нехватка товара по номенклатуре: "
+ РезультатЗапроса.Номенклатура + " на складе: " + РезультатЗапроса.Склад);
КонецЕсли;
Гибкость настройки: В 1С существует возможность включать и отключать автоматический контроль отрицательных остатков. Например, в 1С:Бухгалтерия 3.0 это можно настроить в разделе Администрирование – Настройки программы – Проведение документов, установив флаг "Разрешить списание запасов при отсутствии остатков". В 1С:Управление торговлей 11.4 контроль отключается в НСИ и администрирование – Настройка НСИ и разделов – Финансовый результат и контроллинг, снятием флага Контролировать остатки товаров организаций.
Контроль в рознице: Для специфики розничной торговли (1С:УНФ, 1С:Розница) предусмотрены отдельные настройки для контроля остатков при пробитии Чеков ККМ и проведении Отчетов о розничных продажах.
Если документ все же проводится "в минус", дальнейшие действия по формированию заказа поставщику следует вынести в отдельную процедуру. Эту процедуру можно вызывать, например, в подписке на событие ПриЗаписи документа или как отдельное регламентное задание, которое будет обрабатывать все "минусовые" документы за период. Это позволяет, например, в конце дня сформировать один или несколько заказов поставщикам сразу по всем необеспеченным потребностям.
Давайте проанализируем ситуацию с точки зрения типового функционала 1С. Очень важно понимать, что современные конфигурации, такие как 1С:Управление торговлей (УТ) и 1С:ERP, в первую очередь оперируют понятием свободных остатков. Это не просто количество товара на складе, а количество, доступное для отгрузки с учетом уже зарезервированных позиций.
Типовые схемы обеспечения уже придуманы и включены в функционал. Вместо того чтобы изобретать велосипед, мы можем и должны использовать их:
Рабочее место "Формирование заказов по потребностям": В УТ и ERP это основной инструмент для автоматического формирования заказов поставщикам, заказов на перемещение, заказов на производство и т.д. Оно позволяет анализировать текущие и будущие потребности, учитывать уже созданные заказы и формировать новые с учетом реальной необходимости. Мы можем настроить его так, чтобы он автоматически подхватывал данные о нехватках.
Типы потребностей: Система различает потребности по заявкам (например, отгрузки по заказам клиентов, перемещения между складами) и потребности для поддержания неснижаемого остатка на складе.
Методы обеспечения: Программа предлагает различные методы обеспечения:
Настройка способов обеспечения: В 1С:ERP и УТ используются способы обеспечения потребностей. Эти справочники описывают полный цикл товародвижения: тип обеспечения (закупка, перемещение, собственное производство), срок обеспечения, ограничения использования, обеспечиваемый период и гарантированные сроки. Правильная настройка этих способов критически важна для автоматизации.
Автоматизация создания заказов: Система позволяет автоматически формировать заказы поставщикам на основе анализа текущих запасов, заказов клиентов и планируемых продаж. При этом возможно автоматическое разделение товаров по варианту обеспечения (со склада или под заказ).
Обособленное обеспечение: В 1С:ERP предусмотрено обособленное обеспечение заказов, которое позволяет резервировать товары под конкретные заказы. Это гарантирует, что товар, предназначенный для одного клиента, не будет отгружен другому.
Использование этих механизмов позволяет избежать ситуации, когда 10 менеджеров-продаванов создают 10 отдельных документов ЗаказПоставщику, что может привести к хаосу в отделе закупок.
Давайте разберем ключевые понятия, чтобы лучше понимать логику работы 1С с запасами:
Запас: Это общее количество товара, которое физически находится на складе, а также ожидаемые поступления по уже оформленным заказам поставщикам.
Свободный остаток: Это запас за вычетом количества, которое уже зарезервировано или требуется для обеспечения текущих потребностей, зафиксированных в заказах клиентов. Именно свободный остаток является показателем того, сколько товара мы можем реально отгрузить.
В строках заказов на отгрузку (например, ЗаказКлиента) в 1С:ERP предусмотрены различные действия для управления обеспечением товаров:
Отгрузить: Указывает, что товар будет отгружен со склада. При этом уменьшается и общий запас, и свободный остаток. Система контролирует наличие свободного остатка.
Резервировать: Фиксирует резерв товара на складе под конкретный заказ. Это действие уменьшает свободный остаток, но не изменяет общий запас. Товар становится недоступным для других отгрузок.
Резервировать по мере поступления: Товар встает в резерв, если он есть в наличии, либо использует ожидаемое поступление по заказам поставщикам. Это позволяет планировать отгрузки, даже если товара еще нет на складе.
К обеспечению: Фиксирует потребность в товаре без автоматического резервирования. Это означает, что товар нужен, но его еще не зарезервировали и, возможно, еще не заказали. Система будет учитывать эту потребность при формировании заказов поставщикам.
Не обеспечивать: Указывает, что данный товар не требует обеспечения или резервирования в рамках этого заказа.
Для получения актуальной информации о свободных остатках и доступности товаров используйте типовые отчеты, такие как Остатки и доступность товаров или Ведомость по товарам на складах. Эти отчеты позволяют увидеть количество в наличии, отгружаемое, в резерве и доступное для заказа.
Как мы уже выяснили, интерактивные диалоги при проведении документов категорически нежелательны, так как они блокируют транзакции. Давайте посмотрим, как можно информировать пользователя, не нарушая этот принцип.
Асинхронные методы: В 1С существуют асинхронные методы для показа сообщений, которые не блокируют выполнение программного кода, в отличие от модальных окон. Это позволяет информировать пользователя без остановки процесса проведения.
Сообщения вместо вопросов: Вместо того чтобы задавать вопрос, мы должны просто сообщить пользователю о ситуации. Например:
// В подписке на событие "ПриЗаписи" или "ОбработкаПроведения"
// после проверки остатков и обнаружения нехватки:
Если Отказ Тогда
Сообщить("Документ не проведен из-за нехватки товара. Проверьте остатки и создайте заказ поставщику.", СтатусСообщения.Важное);
ИначеЕсли ЕстьНеобеспеченныеПотребности Тогда
// Если документ проведен "в минус" или есть необеспеченные позиции
Сообщить("Внимание! Обнаружена нехватка товара по некоторым позициям. Рекомендуем сформировать заказ поставщику через рабочее место 'Формирование заказов по потребностям'.", СтатусСообщения.Информация);
// Здесь же можно вызвать процедуру по созданию заказа поставщику,
// но важно, чтобы она не блокировала проведение
// Например, добавить документ в список для последующей обработки регламентным заданием
КонецЕсли;
Метод Сообщить() выводит информацию в окно сообщений пользователя, но не требует немедленного ответа и не прерывает выполнение кода.
Отложенное формирование заказов: Если нам нужно автоматически создать ЗаказПоставщику, это должно происходить либо в фоновом режиме, либо быть инициировано после проведения документа, например, через отдельную обработку или регламентное задание. Таким образом, мы разделяем процесс проведения документа и процесс формирования заказа, избегая блокировок.
В целом, современные конфигурации 1С, такие как УТ и ERP, обладают мощным функционалом для управления запасами и обеспечения потребностей. Наша задача — правильно настроить и использовать эти механизмы в соответствии с бизнес-процессами компании, избегая ошибок, связанных с интерактивными диалогами и блокировкой транзакций. Это позволит нам создать эффективную и стабильную систему учета.
← К списку