При работе в конфигурации «1С:Управление торговлей 11» (а также в аналогичных по архитектуре «1С:Комплексная автоматизация» и «1С:ERP Управление предприятием») часто возникает ситуация: в документе Заказ клиента взведен флаг «Отгружать одной датой», одна позиция есть на складе, а вторая ожидает поступления от поставщика. Менеджер переводит имеющийся товар в действие «Отгрузить», после чего складская подсистема автоматически создает Расходный ордер на товары или позволяет выписать накладную на часть позиций. Разберем архитектурные причины такого поведения программы и найдем практические способы исключить частичную отгрузку не полностью собранных заказов.
Проанализируем, за что на самом деле отвечает флаг «Отгружать одной датой». В типовом решении этот признак выполняет исключительно расчетно-плановую функцию:
Товары документа Заказ клиента.К обеспечению или Резервировать к дате.Рассмотрим, как формируются распоряжения на отгрузку. В 1С действует построчный принцип: движения по регистрам накопления Товары к отгрузке и Заказы клиентов формируются индивидуально по каждой строке табличной части. Как только строке с имеющимся остатком присваивается действие Отгрузить, документ фиксирует потребность к немедленной выдаче товара. Если в настройках склада включена автоматическая генерация расходных ордеров регламентным заданием или кладовщик открывает рабочее место отгрузки, система видит зарегистрированное движение и немедленно создает ордер на доступную часть заказа. Аналогично ведет себя и документ Реализация товаров и услуг при вводе на основании: накладная заполняется теми строками, по которым дано прямое распоряжение на отгрузку.
Выясним, как правильно выстроить процесс обеспечения, чтобы не допустить преждевременной сборки и отправки товара покупателю без изменения программного кода.
Главная ошибка пользователей заключается в установке статуса Отгрузить для товаров, которые уже присутствуют на складе, в то время как остальные позиции еще ожидаются от поставщика. Чтобы зафиксировать товар за клиентом, но не отправлять команду на склад, разберем порядок действий по шагам:
Резервировать на складе. При таком значении товар надежно закрепляется за данным заказом и не будет списан под нужды других контрагентов, однако запись в регистр Товары к отгрузке не формируется. Соответственно, автоматическое создание расходного ордера не инициируется, а при попытке ввода накладной строка не попадет в отгрузку.Обособленно или формируем строку с действием К обеспечению. Использование обособленного обеспечения гарантирует, что поступивший от поставщика товар закрепится строго под данный заказ покупателя и не будет перехвачен другими заказами.Приобретение товаров и услуг, менеджер открывает Заказ клиента и выполняет команду «Обеспечение» — «Заполнить обеспечение» (или использует сочетание клавиш Shift + F10). В открывшейся обработке система определяет доступность всех позиций и централизованно переводит все строки заказа в статус Отгрузить. Только после этого заказ становится доступен к оформлению ордера и накладной в полном объеме.К отбору только после комплектации всех позиций.В типовой конфигурации отсутствует функциональная опция, жестко запрещающая неполную отгрузку при установленном флаге Отгружать одной датой. Если регламентных мер недостаточно и требуется исключить человеческий фактор менеджеров, разберем вариант доработки системы через механизм расширений.
Наиболее надежный подход — реализовать программный контроль непосредственно в модуле документа Заказ клиента в событии ОбработкаПроверкиЗаполнения или через подписку на событие ПередЗаписью. Алгоритм проверяет: если флаг ОтгружатьОднойДатой включен, и хотя бы в одной строке выбрано действие Отгрузить, система должна убедиться в отсутствии строк в статусах ожидания (К обеспечению, Резервировать к дате).
Посмотрим на пример программной проверки, которую можно разместить в расширении конфигурации:
&Вместо("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Вызываем базовую логику проверки
ПродолжитьВызов(Отказ, ПроверяемыеРеквизиты);
Если Отказ Или Не ЭтотОбъект.ОтгружатьОднойДатой Тогда
Возврат;
КонецЕсли;
ЕстьСтрокиКОборудованию = Ложь;
ЕстьСтрокиКОтгрузке = Ложь;
Для Каждого Стр Из ЭтотОбъект.Товары Цикл
// Проверяем неотмененные строки заказа
Если Не Стр.Отменено Тогда
Если Стр.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить
Или Стр.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.ОтгрузитьОбособленно Тогда
ЕстьСтрокиКОтгрузке = Истина;
ИначеЕсли Стр.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.ТребуетсяПодпитка
Или Стр.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.КПредоставлению
Или Стр.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Обособленно Тогда
ЕстьСтрокиКОборудованию = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Блокируем проведение, если часть товара отправлена в отгрузку при наличии непоставленных позиций
Если ЕстьСтрокиКОтгрузке И ЕстьСтрокиКОборудованию Тогда
ТекстСообщения = "Для заказа включена опция ""Отгружать одной датой"". "
+ "Нельзя переводить отдельные позиции в действие ""Отгрузить"", "
+ "пока остальные строки не обеспечены на складе! Используйте статус ""Резервировать на складе"".";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, , , Отказ);
КонецЕсли;
КонецПроцедуры
Также при автоматическом формировании ордеров регламентным заданием полезно добавить фильтрацию в обработчик формирования распоряжений, чтобы заказы с признаком ОтгружатьОднойДатой отбирались для сборки исключительно при условии, что все активные строки документа переведены в состояние фактической готовности к передаче покупателю.