В типовых конфигурациях 1С, таких как Комплексная автоматизация 2.4, ERP 2.5 или Управление торговлей 11, часто возникает задача автоматизации ценообразования. Одной из классических ситуаций является расчет стоимости изделия в зависимости от его физических параметров, например, метража, веса или объема, которые хранятся в дополнительных реквизитах номенклатуры. Рассмотрим, как реализовать этот алгоритм правильно, используя механизмы произвольных запросов.
Предположим, у нас есть товар, базовая цена которого установлена за 1 метр (например, 100 рублей). Сама номенклатура при этом создается как конкретное изделие определенной длины (2 метра, 3 метра и т.д.). Эта длина записана в дополнительном реквизите Метраж. Наша цель — сделать так, чтобы при установке цен система автоматически умножала базовую цену на значение из этого реквизита.
Для начала проанализируем, где хранятся эти данные. Дополнительные реквизиты в 1С не являются полями основной таблицы справочника Номенклатура. Они располагаются в подчиненной табличной части ДополнительныеРеквизиты. Каждая строка этой таблицы содержит два ключевых поля: Свойство (ссылка на План видов характеристик) и Значение (составной тип данных).
Это основной и самый гибкий метод решения задачи. В настройках Вида цен выберем способ задания цены «Произвольный запрос к данным ИБ». Разберем по шагам, как составить запрос в СКД (Схеме компоновки данных).
Шаг 1. Выбор источника данных. Нам необходимо соединить основную таблицу номенклатуры с её табличной частью дополнительных реквизитов. Рассмотрим пример запроса:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ХАРАКТЕРИСТИКИ.Ссылка КАК Характеристика,
// Получаем базовую цену за 1 метр (например, из другого вида цен)
ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК БазоваяЦена,
// Получаем значение метража из доп. реквизитов
ЕСТЬNULL(ВЫРАЗИТЬ(ДопРеквизиты.Значение КАК ЧИСЛО(15, 3)), 0) КАК КоэффициентМетража
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО ДопРеквизиты.Ссылка = Номенклатура.Ссылка
И ДопРеквизиты.Свойство = &СвойствоМетраж
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &БазовыйВидЦены) КАК ЦеныНоменклатурыСрезПоследних
ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = Номенклатура.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Данные.Номенклатура,
ВТ_Данные.Характеристика,
ВТ_Данные.БазоваяЦена * ВТ_Данные.КоэффициентМетража КАК Цена,
&Валюта КАК Валюта
ИЗ
ВТ_Данные КАК ВТ_Данные
ГДЕ
ВТ_Данные.КоэффициентМетража > 0
Важные нюансы запроса:
Значение имеет составной тип. Чтобы умножение сработало, мы используем оператор ВЫРАЗИТЬ(... КАК ЧИСЛО). Если этого не сделать, система выдаст ошибку несовместимости типов.&СвойствоМетраж должен указывать на конкретный элемент плана видов характеристик «Дополнительные реквизиты и сведения». В СКД его можно задать на закладке «Параметры».ЕСТЬNULL, чтобы избежать получения значения NULL, которое при умножении даст пустой результат.В последних версиях 1С:КА 2.4 и 2.5 появилась возможность использовать дополнительные реквизиты напрямую в формулах, если они правильно описаны в системе. Однако, если реквизиты динамические или их сложно «вытащить» в редактор формул, программисты используют расширение конфигурации.
Проанализируем ситуацию: если ваш доп. реквизит имеет тип Число, вы можете попробовать вывести его в схему компоновки данных как доступное поле. В настройках компоновки (СКД) для вида цен нужно убедиться, что поле Номенклатура.Метраж (где Метраж — имя вашего реквизита) доступно для выбора. В этом случае расчетная формула будет выглядеть максимально просто: [ЦенаБазовая] * [Метраж].
Выясним причину, почему многие эксперты советуют не использовать дополнительные реквизиты для этих целей. Дело в том, что в 1С существует штатный механизм Упаковок.
Рассмотрим, как это работает:
Этот способ надежнее, так как не требует написания кода и сложных запросов, а также исключает ошибки при вводе данных в текстовые поля дополнительных реквизитов.
Проанализируем основные проблемы, с которыми сталкиваются пользователи:
ВЫРАЗИТЬ вернет 0 или ошибку. Дополнительный реквизит обязан иметь тип Число.Таким образом, мы рассмотрели основной технический способ реализации задачи через произвольный запрос СКД и альтернативные варианты штатного функционала. Выбор зависит от архитектуры вашего учета, но для гибкой автоматизации «под ключ» запрос к ДополнительнымРеквизитам остается самым мощным инструментом программиста 1С.