Как отключить контроль цены в документах реализации и поступления товаров в 1С:Комплексная автоматизация?

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

При работе в 1С:Комплексная автоматизация (КА) пользователи часто сталкиваются с необходимостью проводить документы реализации или поступления товаров с нулевой ценой. Это особенно актуально для операций с возвратной тарой, а также для безвозмездной передачи или получения других товарно-материальных ценностей. Стандартные механизмы 1С обычно контролируют заполнение цен, не допуская нулевые значения. Рассмотрим подробнее, как можно обойти или настроить этот контроль, используя как типовые возможности, так и программные доработки.

1. Учет возвратной тары по нулевой цене: стандартные механизмы

Для работы с возвратной тарой в 1С:КА предусмотрен специальный функционал, который позволяет передавать и получать тару без указания залоговой стоимости, то есть фактически по нулевой цене в рамках документа реализации или поступления товаров.

  1. Включаем опцию "Многооборотная тара":

    Первым шагом нам необходимо убедиться, что соответствующая функциональность включена в настройках программы. Перейдите в раздел "НСИ и администрирование" – "Номенклатура" – "Разрезы учета" и установите флаг "Многооборотная тара". Эта настройка активирует необходимые поля и механизмы для учета тары.

  2. Создаем вид номенклатуры "Тара":

    Для самой возвратной тары (например, поддонов, ящиков, бутылок) создадим отдельный элемент в справочнике "Виды номенклатуры". Укажем для него Тип номенклатуры как "Тара". Это позволит системе различать обычные товары от многооборотной тары и применять к ней специализированные правила учета.

  3. Оформляем документы без залоговой стоимости:

    При оформлении документов закупки или реализации, например, в документе "Реализация товаров и услуг" или "Приобретение товаров и услуг", обратим внимание на закладку "Дополнительно". Здесь появится флаг "Вернуть многооборотную тару". Если мы передаем тару по нулевой цене и не требуем залога, нам нужно не устанавливать флаг "Требуется залог за тару". Это указывает системе, что тара передается без финансового обеспечения.

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

  4. Анализируем движение тары:

    Для контроля за движением принятой и переданной возвратной тары мы можем использовать специализированные отчеты, доступные в системе 1С:КА. Это поможет нам отслеживать количество тары у контрагентов и контролировать ее своевременный возврат.

2. Обход контроля цены для товаров с нулевой стоимостью: использование 100% скидки

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

  1. Включаем опцию "Скидки и наценки в продажах":

    Прежде всего, нам необходимо убедиться, что функционал скидок активен в системе. Перейдите в раздел "Настройки – Еще больше возможностей – Продажи" и установите флаг "Скидки и наценки в продажах".

  2. Устанавливаем 100% ручную скидку:

    В документе "Реализация товаров и услуг" или аналогичном документе, на закладке с товарами, мы можем вручную установить скидку в размере 100% для тех позиций, которые должны быть проданы по нулевой цене. Система рассчитает итоговую сумму к оплате как 0 рублей, при этом базовая цена товара будет видна в документе.

    Преимущества: это стандартный механизм, не требующий программирования.

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

3. Учет безвозмездно полученных товаров

Если товар поступает к нам безвозмездно (то есть его стоимость для нас равна нулю), стандартный подход в 1С:КА заключается в приходовании таких товаров документом "Приобретение товаров и услуг". При этом обычно товар приходуется по его рыночной стоимости. В учете формируются соответствующие проводки для признания прочего дохода, что соответствует требованиям бухгалтерского и налогового учета для безвозмездно полученных активов.

Этот метод не отключает контроль цены напрямую, но позволяет корректно отразить операцию с юридически нулевой стоимостью приобретения, при этом товар все равно получает стоимостную оценку для целей учета.

4. Программный обход контроля цены с использованием расширений (рекомендуемый подход)

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

  1. Почему расширения?

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

  2. Где искать проверки цены в коде?

    Проверки цен и сумм обычно находятся в модулях объектов документов, таких как Поступление товаров и услуг и Реализация товаров и услуг. Также они могут быть реализованы в общих модулях, отвечающих за проведение документов и контроль корректности данных.

    Обычно эти процедуры проверяют наличие нулевых цен или сумм и устанавливают флаг Отказ = Истина, если обнаруживают "ошибку". Нам нужно искать места, где происходит присвоение Истина этому параметру. Например, в модулях, связанных с закупками, можно обнаружить процедуры типа СообщитьОбОшибкахКонтрольЗаполненияЦен (модуль ЗакупкиСервер) или аналогичные в модулях продажи.

    Ключевыми местами для поиска являются обработчики событий "ОбработкаПроведения", "ПередЗаписью" в модулях объектов документов, а также функции, вызываемые из этих обработчиков для валидации табличных частей (например, ПроверитьТабличнуюЧасть).

  3. Как реализовать обход через расширение?

    Мы можем создать расширение конфигурации и в нем "подменить" или "добавить" свою логику в стандартные процедуры проверки цен, используя механизмы перехвата вызовов — обработчики &Вместо или &После.

    Наша задача будет заключаться в том, чтобы либо:

    • Использовать &Вместо: Полностью заменить стандартную процедуру проверки цен своей собственной, в которой мы пропишем исключения для нашей номенклатуры или условий.
    • Использовать &После: Выполнить свою логику после выполнения стандартной процедуры. Если стандартная процедура установила флаг Отказ = Истина, мы можем проанализировать причину отказа и, если он связан с нашей "нулевой тарой", сбросить флаг Отказ = Ложь.

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

    Рассмотрим пример логики, которую можно реализовать в расширении. Предположим, мы определили, что контроль цены происходит в некоторой процедуре ПроверитьЦеныВДокументе, которая принимает объект документа и флаг Отказ.

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

    Важно: При работе с &Вместо мы полностью берем на себя ответственность за логику, которая была в оригинальной процедуре. Если часть оригинальной логики нужна, ее придется воспроизвести или найти способ вызвать оригинальную процедуру (что не всегда просто). Иногда проще использовать &После и сбросить Отказ, если он был установлен по нашей причине.

    Для корректной работы расширения может потребоваться отключить "безопасный режим" (в режиме отладки или для некоторых операций), если расширение обращается к каким-либо системным функциям или объектам, требующим полного доступа.

5. Контроль минимальных цен (дополнительная информация)

Для полноты картины стоит упомянуть о связанном функционале: контроле минимальных цен продажи. В 1С:КА также существует возможность настроить систему таким образом, чтобы не позволять продавать товары ниже определенной стоимости. Этот механизм настраивается через "Виды цен" и "Настройки минимальных цен", где мы можем задать пороговые значения для различных видов номенклатуры и сегментов партнеров. Хотя эта задача прямо противоположна продаже по нулевой цене, она является частью общего механизма контроля ценообразования и показывает гибкость системы 1С в управлении ценами.

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

← На главную