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

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

В типовых конфигурациях 1С, таких как Комплексная автоматизация 2.4, ERP 2.5 или Управление торговлей 11, часто возникает задача автоматизации ценообразования. Одной из классических ситуаций является расчет стоимости изделия в зависимости от его физических параметров, например, метража, веса или объема, которые хранятся в дополнительных реквизитах номенклатуры. Рассмотрим, как реализовать этот алгоритм правильно, используя механизмы произвольных запросов.

Постановка задачи и анализ структуры данных

Предположим, у нас есть товар, базовая цена которого установлена за 1 метр (например, 100 рублей). Сама номенклатура при этом создается как конкретное изделие определенной длины (2 метра, 3 метра и т.д.). Эта длина записана в дополнительном реквизите Метраж. Наша цель — сделать так, чтобы при установке цен система автоматически умножала базовую цену на значение из этого реквизита.

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

Способ 1: Использование произвольного запроса в Виде цен

Это основной и самый гибкий метод решения задачи. В настройках Вида цен выберем способ задания цены «Произвольный запрос к данным ИБ». Разберем по шагам, как составить запрос в СКД (Схеме компоновки данных).

Шаг 1. Выбор источника данных. Нам необходимо соединить основную таблицу номенклатуры с её табличной частью дополнительных реквизитов. Рассмотрим пример запроса:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    ХАРАКТЕРИСТИКИ.Ссылка КАК Характеристика,
    // Получаем базовую цену за 1 метр (например, из другого вида цен)
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК БазоваяЦена,
    // Получаем значение метража из доп. реквизитов
    ЕСТЬNULL(ВЫРАЗИТЬ(ДопРеквизиты.Значение КАК ЧИСЛО(15, 3)), 0) КАК КоэффициентМетража
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
        ПО ДопРеквизиты.Ссылка = Номенклатура.Ссылка
        И ДопРеквизиты.Свойство = &СвойствоМетраж
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &БазовыйВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = Номенклатура.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Данные.Номенклатура,
    ВТ_Данные.Характеристика,
    ВТ_Данные.БазоваяЦена * ВТ_Данные.КоэффициентМетража КАК Цена,
    &Валюта КАК Валюта
ИЗ
    ВТ_Данные КАК ВТ_Данные
ГДЕ
    ВТ_Данные.КоэффициентМетража > 0

Важные нюансы запроса:

  1. Типизация: Поле Значение имеет составной тип. Чтобы умножение сработало, мы используем оператор ВЫРАЗИТЬ(... КАК ЧИСЛО). Если этого не сделать, система выдаст ошибку несовместимости типов.
  2. Фильтрация свойства: Параметр &СвойствоМетраж должен указывать на конкретный элемент плана видов характеристик «Дополнительные реквизиты и сведения». В СКД его можно задать на закладке «Параметры».
  3. Обработка пустых значений: Мы используем функцию ЕСТЬNULL, чтобы избежать получения значения NULL, которое при умножении даст пустой результат.

Способ 2: Настройка формул в Видах цен

В последних версиях 1С:КА 2.4 и 2.5 появилась возможность использовать дополнительные реквизиты напрямую в формулах, если они правильно описаны в системе. Однако, если реквизиты динамические или их сложно «вытащить» в редактор формул, программисты используют расширение конфигурации.

Проанализируем ситуацию: если ваш доп. реквизит имеет тип Число, вы можете попробовать вывести его в схему компоновки данных как доступное поле. В настройках компоновки (СКД) для вида цен нужно убедиться, что поле Номенклатура.Метраж (где Метраж — имя вашего реквизита) доступно для выбора. В этом случае расчетная формула будет выглядеть максимально просто: [ЦенаБазовая] * [Метраж].

Альтернатива: Использование упаковок и единиц измерения

Выясним причину, почему многие эксперты советуют не использовать дополнительные реквизиты для этих целей. Дело в том, что в 1С существует штатный механизм Упаковок.

Рассмотрим, как это работает:

  1. Создаем базовую единицу измерения — Метр.
  2. Для каждой номенклатуры (например, «Труба 3м») создаем индивидуальную упаковку с названием «3 метра» и коэффициентом 3.
  3. Устанавливаем цену за базовую единицу (1 метр).
  4. При продаже или в документах система сама пересчитает цену за упаковку (изделие), умножив базовую цену на коэффициент.

Этот способ надежнее, так как не требует написания кода и сложных запросов, а также исключает ошибки при вводе данных в текстовые поля дополнительных реквизитов.

Типичные ошибки при реализации

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

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

← На главную