Как добавить и рассчитать колонку с ценой за килограмм в форме Реализации товаров и услуг в УТ 11

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

Переход с платформы 1С:Предприятие 7.7 или обычных форм 8.2 на управляемые формы 1С 8.3 (особенно в таких сложных конфигурациях, как Управление торговлей 11) часто вызывает трудности у разработчиков. Одной из типовых задач является кастомизация табличной части документов. Рассмотрим ситуацию, когда учет ведется в килограммах, но отгрузка осуществляется в упаковках, и менеджеру необходимо видеть в форме документа цену за килограмм для контроля правильности ценообразования.

В этой статье мы подробно разберем, как добавить колонку "Цена за кг" в документ РеализацияТоваровУслуг, как настроить автоматический пересчет этой цены при изменении данных в строке и как правильно интегрировать этот функционал в архитектуру УТ 11.

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

Проанализируем специфику работы УТ 11. В данной конфигурации расчеты в табличных частях (ТЧ) редко описываются напрямую в модуле формы. Вместо этого используются специализированные общие модули, такие как ОбработкаТабличнойЧастиКлиент, ПродажиКлиентСервер и другие. Это сделано для унификации логики между различными документами. Наша задача — вклиниться в этот механизм, чтобы при любом изменении количества, упаковки или цены за упаковку, наше поле "Цена за кг" обновлялось автоматически.

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

Цена за кг = Цена за упаковку / Коэффициент упаковки

Или, если мы хотим более универсальный расчет на основе итогов строки:

Цена за кг = Сумма строки / Количество в кг

Шаг 1: Подготовка интерфейса и метаданных

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

  1. Откроем форму документа ФормаДокумента.
  2. Найдем таблицу Товары и добавим в нее новый элемент — Поле формы.
  3. В свойствах поля укажем Путь к данным: Объект.Товары.ЦенаЗаКг.

Важно: При работе в управляемом интерфейсе напрямую обратиться к строке как Объект.Товары.ЦенаЗаКг нельзя. Программа выдаст ошибку "Поле объекта не обнаружено". Необходимо работать с ТекущиеДанные элемента формы (таблицы).

Шаг 2: Программная реализация расчета

Рассмотрим наиболее правильный путь реализации через модификацию типовых механизмов пересчета. В УТ 11 за пересчет цен отвечает процедура ПересчитатьЦенуЗаУпаковкуВСтрокеТЧ. Нам необходимо расширить структуру полей, участвующих в расчете.

Для этого в общем модуле ОбработкаТабличнойЧастиКлиент (или через расширение с методом &После) найдем место, где подготавливается структура действий. Проанализируем пример кода для реализации пересчета:


// В общем модуле ОбработкаТабличнойЧастиКлиентСервер
// Добавляем наше поле в структуру полей ТЧ
Процедура ПриНеобходимостиДобавитьПолеЦенаЗаКг(СтруктураПолейТЧ)
    Если Не СтруктураПолейТЧ.Свойство("ЦенаЗаКг") Тогда
        СтруктураПолейТЧ.Вставить("ЦенаЗаКг", 0);
    КонецЕсли;
КонецПроцедуры

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


// Пример расчета в контексте текущей строки
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

Если ТекущаяСтрока.Коэффициент <> 0 Тогда
    ТекущаяСтрока.ЦенаЗаКг = ТекущаяСтрока.Цена / ТекущаяСтрока.Коэффициент;
Иначе
    // Если упаковка не указана, считаем, что цена и так за кг
    ТекущаяСтрока.ЦенаЗаКг = ТекущаяСтрока.Цена;
КонецЕсли;

Шаг 3: Внедрение в обработчики событий формы

Чтобы расчет срабатывал "на лету", нужно вызвать нашу логику в событиях элементов формы. Разберем по шагам, какие события нам нужны:

  1. ТоварыКоличествоУпаковокПриИзменении — при изменении физического количества товара.
  2. ТоварыЦенаПриИзменении — при изменении основной цены.
  3. ТоварыУпаковкаПриИзменении — если меняется тип упаковки (например, с коробок на паллеты), коэффициент меняется, а значит, меняется и цена за кг.

Пример интеграции в типовой код формы документа:


&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    // Вызов стандартных механизмов УТ 11
    СтруктураДействий = Новый Структура;
    ОбработкаТабличнойЧастиКлиент.ДобавитьВСтруктуруДействияПриИзмененииЦены(СтруктураДействий, Объект);
    ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
    
    // Наш дополнительный расчет
    РассчитатьЦенаЗаКгНаФорме(ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьЦенаЗаКгНаФорме(ТекущаяСтрока)
    // Извлекаем коэффициент из данных упаковки или реквизита строки
    Коэффициент = ?(ТекущаяСтрока.Коэффициент = 0, 1, ТекущаяСтрока.Коэффициент);
    ТекущаяСтрока.ЦенаЗаКг = ТекущаяСтрока.Цена / Коэффициент;
КонецПроцедуры

Шаг 4: Особенности работы со сканером штрихкодов

Часто возникает вопрос: почему при ручном вводе цена считается, а при сканировании сканером — нет? Выясним причину. При сканировании в УТ 11 срабатывает оповещение ОбработкаОповещения, которое вызывает программное добавление строки. В этом случае события формы ПриИзменении не генерируются.

Чтобы цена за кг рассчитывалась при сканировании, необходимо убедиться, что ваша процедура расчета вызывается внутри общего механизма обработки подбора товаров. Рекомендуется использовать расширение для модуля ОбработкаТабличнойЧастиКлиентСервер.РассчитатьСтандартныеПоказателиСтроки (название может варьироваться в зависимости от релиза УТ). Добавив расчет туда, вы обеспечите его выполнение независимо от способа добавления товара в корзину — будь то ручной ввод, сканирование или подбор из каталога.

Подведем итоги

Мы проанализировали процесс добавления кастомного расчета в типовую конфигурацию УТ 11. Основные выводы, которые помогут в работе:

Следуя этим шагам, вы сможете гибко настраивать визуальное представление данных для пользователей, делая работу в системе 1С:Управление торговлей более прозрачной и удобной.

← На главную