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