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