При ведении учета в программе «1С:Бухгалтерия» (включая локализованные версии, такие как «Бухгалтерия для Кыргызстана») пользователи часто сталкиваются с ситуацией, когда система блокирует проведение документа реализации, если цена товара равна нулю. Это происходит при попытке выдать бонус покупателю, провести рекламную акцию или передать образцы продукции. Разберем подробно, почему это происходит и какими способами можно решить эту задачу, сохранив корректность учета.
Прежде чем вносить изменения в конфигурацию, проанализируем ситуацию. В типовых решениях 1С запрет на нулевую цену может быть обусловлен тремя факторами:
Цена в табличной части Товары может быть установлено свойство Проверка заполнения: Выдавать ошибку. В этом случае платформа 1С блокирует запись или проведение документа еще до того, как управление передается в программный код модуля.Если система выдает ошибку в момент нажатия кнопки «Провести», но в модуле документа процедура ОбработкаПроведения (или ПриПроведении) не содержит явных условий сравнения с нулем, заглянем в свойства самого объекта. Рассмотрим шаги для программиста:
РеализацияТоваровУслуг.Товары.Цена и откроем его палитру свойств.Важно: Менять это свойство напрямую не рекомендуется, так как это может привести к случайным ошибкам пользователей в будущем. Лучше использовать программные механизмы исключения проверки.
Разберем, как можно программно разрешить нулевую цену для определенных случаев. Для этого в модуле формы документа или в модуле объекта используется обработчик события ОбработкаПроверкиЗаполнения. Посмотрим на пример кода, который исключает цену из списка обязательных полей:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Если нам нужно разрешить нулевую цену при определенных условиях
// (например, если в строке стоит признак "Бонус")
Для Каждого СтрокаТЧ Из Товары Цикл
Если СтрокаТЧ.Цена = 0 Тогда
// Находим индекс реквизита в массиве проверяемых
Индекс = ПроверяемыеРеквизиты.Найти("Товары.Цена");
Если Индекс <> Неопределено Тогда
// Удаляем обязательность проверки для всего документа,
// если мы уверены в корректности данных
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если же проверка зашита глубоко в общих модулях, рекомендуется использовать Замер производительности. Включим замер, нажмем «Провести», получим ошибку и остановим замер. В списке выполненных строк кода мы легко найдем ту самую проверку Если Строка.Цена = 0 Тогда.
Проанализируем самый правильный с точки зрения методологии учета способ. Вместо того чтобы устанавливать цену в 0, укажем реальную цену товара, но применим к ней скидку 100%. Рассмотрим, как это работает:
% Скидки установим значение 100.Этот способ позволяет избежать правок кода и корректно отразить маркетинговую акцию в отчетах по продажам. Программа увидит, что товар был отгружен, но по нему предоставлена полная скидка.
Если целью является именно списание товара в пользу контрагента без возникновения задолженности, воспользуемся специализированным документом Безвозмездная передача. Посмотрим на его преимущества:
В ситуациях, когда время ограничено, а конфигурацию править нельзя, применим практическую хитрость. Установим цену в 0.01 (1 копейка или 1 тыйын). Это позволит системе провести документ, так как цена формально заполнена и больше нуля. Итоговая сумма задолженности клиента будет ничтожной, и её можно будет списать в конце периода документом Корректировка долга.
Пользователи часто ищут результат проведения в общем журнале операций, но не находят его, если документ не провелся. Помните: пока система выдает ошибку заполнения, проводки не формируются. Как только вы добьетесь успешного проведения одним из вышеуказанных способов, нажмите кнопку Дт/Кт в форме документа или в списке. Рассмотрим, на что обратить внимание:
Таким образом, мы выяснили, что блокировка нулевой цены — это защитный механизм системы. Наиболее корректным способом решения является использование 100% скидки или документа безвозмездной передачи, а для разработчиков — работа с массивом ПроверяемыеРеквизиты в модуле объекта.