Как в 1С:УТ 11 реализовать отображение и редактирование цены за погонный метр при продаже в рулонах?

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

В типовых конфигурациях 1С, таких как «Управление торговлей 11» или «Комплексная автоматизация 2», при использовании механизма упаковок (например, рулонов с определенным метражом) система оперирует ценой за конкретную упаковку. Однако в реальной торговле, особенно в сфере стройматериалов или текстиля, продавцам и клиентам гораздо удобнее видеть цену за базовую единицу измерения — погонный метр. Рассмотрим, как доработать документ Реализация товаров и услуг, чтобы добавить возможность видеть и редактировать цену за метр с автоматическим пересчетом общей суммы и цены за рулон.

Анализ проблемы и выбор стратегии доработки

Проанализируем стандартное поведение системы: когда в табличную часть Товары добавляется номенклатура с выбранной упаковкой (рулон 10 м), в колонку Цена подставляется стоимость за весь рулон. Если базовая цена метра составляет 2 у.е., то в документе отобразится цена 20 у.е. Продавцу неудобно пересчитывать это в уме, если клиент просит скидку на метр или если цена метра изменилась оперативно.

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

Шаг 1: Добавление реквизита через расширение

Первым делом создадим расширение и добавим в него документ РеализацияТоваровУслуг. Нам необходимо расширить табличную часть Товары, добавив новый реквизит. Назовем его ЦенаВБазовыхЕдиницах (тип: Число, длина 15, точность 2).

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

Шаг 2: Реализация программной логики пересчета

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

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


&НаКлиенте
Процедура ПересчитатьЦенуВБазовыхЕдиницах(ТекущиеДанные)
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Проверяем, заполнено ли количество, чтобы избежать деления на ноль
    Если ТекущиеДанные.Количество <> 0 Тогда
        // Вычисляем цену за метр исходя из цены упаковки и коэффициента
        // Коэффициент обычно хранится в ТекущиеДанные.КоличествоУпаковок / ТекущиеДанные.Количество
        ТекущиеДанные.ЦенаВБазовыхЕдиницах = (ТекущиеДанные.КоличествоУпаковок / ТекущиеДанные.Количество) * ТекущиеДанные.Цена;
    Иначе
        ТекущиеДанные.ЦенаВБазовыхЕдиницах = 0;
    КонецЕсли;
КонецПроцедуры

Теперь создадим обработчик события ПриИзменении для нашей новой колонки ЦенаВБазовыхЕдиницах. Здесь мы должны реализовать обратный расчет: пользователь вводит цену за метр, а система вычисляет цену за рулон и пересчитывает сумму строки.


&НаКлиенте
Процедура ТоварыЦенаВБазовыхЕдиницахПриИзменении(Элемент)
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        // Рассчитываем цену за упаковку
        Коэффициент = 1;
        Если ТекущиеДанные.КоличествоУпаковок <> 0 Тогда
             Коэффициент = ТекущиеДанные.Количество / ТекущиеДанные.КоличествоУпаковок;
        КонецЕсли;
        
        ТекущиеДанные.Цена = Окр(ТекущиеДанные.ЦенаВБазовыхЕдиницах * Коэффициент, 2);
        
        // Вызываем типовой механизм пересчета суммы строки
        // В УТ 11 это обычно делается через обработку событий в модуле клиента
        ОбработкаТабличнойЧастиТоварыКлиент.РассчитатьСуммуПриИзмененииЦены(ТекущиеДанные);
    КонецЕсли;
КонецПроцедуры

Шаг 3: Где искать типовой код пересчета

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

В УТ 11 логика работы с ТЧ «Товары» сосредоточена в следующих местах:

  1. Общий модуль ОбработкаТабличнойЧастиТоварыКлиент: здесь находятся процедуры расчета цен и сумм. Проверьте метод РассчитатьЦенуПриИзмененииУпаковки.
  2. Модуль формы документа: найдите событие ТоварыУпаковкаПриИзменении. Вам нужно будет добавить вызов вашей процедуры ПересчитатьЦенуВБазовыхЕдиницах после того, как типовые механизмы определят новую цену за упаковку.

Важные технические нюансы

Проблема округления: При работе с мерным товаром и пересчетами «туда-обратно» часто возникают копейки. Например, если рулон равен 3 метрам, а цена метра 100 рублей, то при определенных условиях деления может возникнуть погрешность. Всегда используйте функцию Окр(Значение, 2), чтобы итоговая сумма документа совпадала с бухгалтерскими ожиданиями.

Событийная модель: Не забудьте, что ваша колонка должна обновляться в трех случаях:

Альтернативный метод: Учет по сериям

Если специфика вашего бизнеса такова, что каждый рулон уникален (в одном 9.8 м, в другом 10.1 м), то использование множества упаковок — это путь к замусориванию базы. Проанализируем другой вариант: учет по сериям. В 1С:УТ 11 можно настроить политику учета серий так, что в каждой серии будет храниться конкретное количество метров. В этом случае цена в документе всегда остается базовой (за 1 метр), а количество товара в строке указывается в метрах, которые списываются из конкретного рулона-серии. Это позволяет избежать сложных доработок цен и использовать стандартный функционал.

Вывод для печатных форм

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

Выбор метода зависит от того, нужно ли менеджеру именно редактировать цену через метр в реальном времени. Если да — используйте доработку через расширение с добавлением реквизита в ТЧ, как мы разобрали выше.

← На главную