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