Давайте проанализируем довольно интересную и нетривиальную ситуацию, с которой пользователи могут столкнуться в программе 1С:ERP Управление предприятием. Ситуация возникает при попытке сделать частичную отгрузку (реализацию) на минимально возможную сумму — 1 копейку (0,01 руб.), когда в исходном заказе клиента настроен многоэтапный график оплат, например, 50% предоплата и 50% после отгрузки.
Рассмотрим симптомы проблемы. При вводе документа РеализацияТоваровУслуг на основании заказа, система переносит утвержденный график оплат. В первую строку она ставит 0,01 руб. (что составляет 100% суммы реализации), а во второй строке остается нулевая сумма и пустое значение процента оплаты. При попытке провести документ система выдает ошибку, так как пустое значение процента или нулевая сумма в строке недопустимы. При этом вручную поправить табличную часть пользователю система не дает.
Выясним причину этой ошибки. Она кроется в математических ограничениях алгоритмов распределения 1С:ERP и жестком системном контроле заполнения графиков оплат. Механизм просто не рассчитан на такие микро-суммы.
Система пытается пропорционально распределить сумму реализации (0,01 руб.) по этапам (50% и 50%). Поскольку разделить 1 копейку на два без остатка невозможно (0,005 руб. не поддерживается системой), алгоритм из-за математического округления забирает всю копейку на первый этап. В результате для второго этапа остается ровно 0 рублей. Платформа 1С жестко контролирует табличную часть графика: строка с пустым процентом или нулем не может существовать. Документ блокируется при проведении.
Невозможность ручного исправления обусловлена настройками СоглашениеСКлиентом или выбранным вариантом детализации взаиморасчетов, при которых графики жестко диктуются заказом и любые отклонения в накладных запрещены.
Посмотрим на самое очевидное и простое решение. Если проблема кроется в математическом неделимом остатке, мы можем изменить сумму документа так, чтобы она стала кратной этапам оплаты.
Вместо продажи дополнительного товара за 1 копейку, попробуйте продать его за 2 копейки (0,02 руб.). В этом случае система корректно разделит сумму на два этапа по 0,01 руб. (50% и 50%), пустых строк в документе не возникнет, и реализация успешно проведется.
Если изменить цену невозможно, рассмотрим вариант отказа от отдельной частичной реализации на копейку. Проблема возникает исключительно из-за нехватки общей суммы документа для ее дробления на проценты.
Если отгрузку нужно произвести именно отдельным документом на 0,01 руб., мы можем временно изменить графики на уровне самого заказа клиента.
Для этого перед созданием реализации зайдем в исходный документ ЗаказКлиента. Мы можем разбить строку с копеечным товаром и для нее задать индивидуальный график оплат, состоящий только из одного этапа (например, 100% предоплата или 100% кредит). Либо же временно поменять общий график заказа. После того как реализация на 1 копейку будет проведена с одним этапом оплаты, график оставшейся (невыполненной) части заказа можно будет вернуть к исходным настройкам 50/50.
Разберем вариант изменения настроек НСИ. Если ваши бизнес-процессы и политики безопасности это позволяют, можно разрешить отклонения от графика оплат в типовом или индивидуальном соглашении.
Если снять жесткий запрет на отклонения, табличная часть графика оплат в документе РеализацияТоваровУслуг станет доступной для ручного редактирования. Пользователь сможет просто зайти в табличную часть, вручную удалить зависшую вторую строку с нулевой суммой и провести документ.
Если продажа бонусных или дополнительных товаров за 1 копейку при графике 50/50 — это частая бизнес-практика в вашей компании, есть смысл автоматизировать решение этой проблемы силами программиста. Оптимально использовать механизм расширений, чтобы не снимать типовую конфигурацию с поддержки.
В расширении можно перехватить обработчик заполнения документа и добавить проверку: если итоговая сумма документа реализации равна минимальной (0,01 руб.), система должна автоматически свернуть график оплат в одну строку, назначив 100% оплату, и программно удалить остальные пустые строки из табличной части этапов оплат.
Пример логики, которую можно реализовать в процедуре модуля объекта:
Если СуммаДокумента = 0.01 Тогда
Для Каждого СтрокаОплаты Из ЭтапыГрафикаОплаты Цикл
Если СтрокаОплаты.СуммаПлатежа = 0 Тогда
ЭтапыГрафикаОплаты.Удалить(СтрокаОплаты);
Иначе
СтрокаОплаты.ПроцентПлатежа = 100;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Это полностью избавит пользователей от необходимости каждый раз обращаться к администраторам или придумывать обходные схемы при оформлении подобных копеечных документов реализации.