Как разрешить ставить цену 0.00 в заказе покупателя в 1С:УНФ 1.6?

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

При оформлении сделок в программе «1С:Управление нашей фирмой» (УНФ 1.6) пользователи часто сталкиваются с необходимостью отпустить товар бесплатно — например, в рамках рекламной кампании, в качестве подарка к основному заказу или по гарантийным обязательствам. Однако при попытке установить цену товара в значение 0.00 система выдает ошибку заполнения реквизита и блокирует проведение документа.

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

Почему система запрещает проводить заказы с нулевой ценой?

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

Проверка заполнения цены в 1С:УНФ происходит на двух уровнях:

  1. Интерфейсный уровень (форма документа): свойство колонки табличной части АвтоОтметкаНезаполненного. Если оно включено, платформа визуально подчеркивает поле красным пунктиром и не дает записать документ прямо из формы.
  2. Объектный уровень (код конфигурации): специализированный обработчик события ОбработкаПроверкиЗаполнения в модуле объекта документа. Даже если мы снимем проверку на форме, при попытке записи или проведения документа платформа вызовет этот метод, который принудительно проверит, заполнена ли цена, и в случае равенства нулю выдаст ошибку проведения.

Давайте подробно рассмотрим три основных метода решения этой проблемы.

---

Способ №1. Использование механизма 100% скидки (без программирования)

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

Рассмотрим по шагам, как настроить этот процесс:

  1. Перейдем в раздел «Настройки», далее выберем пункт «Еще больше возможностей».
  2. В открывшемся окне перейдем в раздел «Продажи».
  3. В группе настроек «Цены и скидки» установим флажок напротив опции «Скидки и наценки в продажах». Сохраним настройки.
  4. Откроем нужный документ «Заказ покупателя» (или создадим новый).
  5. В табличной части «Запасы» выберем товар, укажем его реальную учетную цену.
  6. В колонке «Скидка руч. %» укажем значение 100.

После этого система автоматически пересчитает итоговую сумму в строке — она станет равной 0.00. При этом колонка «Цена» формально останется заполненной базовой стоимостью товара, благодаря чему документ без проблем проведется системой, не вызывая никаких ошибок незаполненности реквизитов.

---

Способ №2. Программное отключение проверки через доработку кода (для программистов)

Если бизнес-процессы компании требуют, чтобы в печатных формах и документах фигурировала именно цена 0.00 без указания скидок, нам потребуется внести изменения в код программы.

Выясним причину ошибки проведения, пройдя отладчиком по коду. Ошибка незаполненности возникает в обработчике события ОбработкаПроверкиЗаполнения модуля объекта документа ЗаказПокупателя. В типовой конфигурации УНФ этот алгоритм обходит строки табличной части «Запасы» и проверяет заполнение цены с помощью функции ЗначениеЗаполнено(). Для числовых типов данных значение 0.00 воспринимается платформой как пустое (незаполненное), что и вызывает отказ в проведении.

Для устранения этой проверки нам необходимо закомментировать следующий участок кода в модуле объекта документа ЗаказПокупателя:


//Если НЕ ЗначениеЗаполнено(Стр.Цена) Тогда
//    ТекстСообщения = СтрШаблон(
//        ТекстКолонкаНеЗаполненаШаблон,
//        МетаданныеДокумента.ТабличныеЧасти.Запасы.Реквизиты.Цена.Синоним,
//        Стр.НомерСтроки,
//        МетаданныеДокумента.ТабличныеЧасти.Запасы.Синоним
//    );
//    УправлениеНебольшойФирмойСервер.СообщитьОбОшибке(ЭтотОбъект, ТекстСообщения, "Запасы", Стр.НомерСтроки, "Цена", Отказ);
//КонецЕсли;

Важное примечание: Также убедитесь, что в форме документа ФормаДокумента для элемента управления (колонки цены) свойство АвтоОтметкаНезаполненного установлено в значение Нет, а в свойствах реквизита объекта Цена в метаданных свойство Проверка заполнения переведено в состояние Не проверять.

---

Способ №3. Правильная доработка с помощью расширения конфигурации (Рекомендуется!)

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

Проанализируем, как реализовать это корректно с помощью механизма расширений:

  1. Откроем конфигуратор, перейдем в меню «Конфигурация» — «Расширения конфигурации» и создадим новое расширение (например, с именем РазрешитьНулевыеЦены).
  2. Найдем в дереве объектов основной конфигурации документ ЗаказПокупателя, нажмем по нему правой кнопкой мыши и выберем «Добавить в расширение».
  3. Перейдем в модуль объекта заимствованного документа в расширении.
  4. Для перехвата стандартной процедуры проверки создадим метод-обработчик с аннотацией &После или &Вместо.

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


&После("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Удаляем реквизит "Цена" табличной части "Запасы" из списка обязательных к заполнению
    Индекс = ПроверяемыеРеквизиты.Найти("Запасы.Цена");
    Если Индекс <> Неопределено Тогда
        ПроверяемыеРеквизиты.Удалить(Индекс);
    КонецЕсли;
    
КонецПроцедуры

Если же в вашей версии УНФ проверка жестко прописана в коде модуля объекта (как показано в Способе №2), вам потребуется использовать аннотацию &Вместо("ОбработкаПроверкиЗаполнения"), скопировать код типового метода в расширение и исключить из него блок проверки заполнения цены номенклатуры.

---

Возможные риски и последствия использования нулевых цен

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

Резюме: Если нулевые продажи носят разовый характер, настоятельно рекомендуется использовать Способ №1 (скидка 100%). Если же бесплатные отгрузки являются неотъемлемой частью вашей бизнес-логики и происходят регулярно, внедряйте решение через механизм расширений (Способ №3), предварительно согласовав правила отражения таких операций с вашей бухгалтерской службой.

← На главную