Как реализовать выбор цены в заказе с отображением списка «Вид цены — Цена» в управляемых формах 1С?

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

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

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

Метод 1. Использование списка значений с форматированным представлением

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

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

  1. Создадим на клиенте обработчик события НачалоВыбора для поля Цена или ВидЦены.
  2. Установим СтандартнаяОбработка = Ложь, чтобы прервать открытие стандартного справочника.
  3. Вызовем серверную функцию, которая соберет актуальные цены для номенклатуры в текущей строке.

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


&НаСервере
Функция ПолучитьСписокЦенДляВыбора(Номенклатура, АктуальнаяДата)
    Список = Новый СписокЗначений;
    
    // Предположим, мы получили таблицу цен запросом или через типовой механизм
    // ТЗЦен содержит колонки: ВидЦены, Цена, Валюта
    Для Каждого СтрокаЦены Из ТЗЦен Цикл
        ТекстПредставления = СтрШаблон("%1  ---  %2 %3", 
            СтрокаЦены.ВидЦены, 
            СтрокаЦены.Цена, 
            СтрокаЦены.Валюта);
            
        Список.Добавить(СтрокаЦены.Цена, ТекстПредставления);
    КонецЦикла;
    
    Возвращает Список;
КонецФункции

В этом примере мы используем функцию СтрШаблон для формирования наглядной строки. Чтобы колонки выглядели ровнее, можно использовать дополнение пробелами, хотя в пропорциональных шрифтах 1С идеального выравнивания «колонкой» добиться сложно — в таких случаях лучше использовать разделители типа вертикальной черты.

Метод 2. Оптимизация передачи данных через реквизиты формы

Часто программисты допускают ошибку, пытаясь передать выбранную строку обратно на сервер и там ее «разбирать» (парсить), чтобы вычленить цену или вид цены. Выясним причину, почему это неудобно: это порождает лишний код и ошибки при изменении форматов строк. Правильнее использовать возможности объекта Структура.

Если нам нужно, чтобы при выборе одной строки в списке в документ подставлялось сразу несколько значений (и цена, и вид цены), мы можем поместить в поле Значение элемента списка целую структуру. Рассмотрим подробнее, как это реализовать:


&НаКлиенте
Процедура ТабличнаяЧастьЦенаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ТекущаяСтрока = Элементы.ТабличнаяЧасть.ТекущиеДанные;
    СписокЦен = ПолучитьСписокСтруктурЦен(ТекущаяСтрока.Номенклатура);
    
    // Вызываем интерактивное окно выбора из сформированного списка
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораЦены", ЭтотОбъект);
    ПоказатьВыборИзСписка(ОписаниеОповещения, СписокЦен, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораЦены(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // ВыбранныйЭлемент.Значение — это структура, переданная с сервера
        ТекущаяСтрока = Элементы.ТабличнаяЧасть.ТекущиеДанные;
        ТекущаяСтрока.Цена = ВыбранныйЭлемент.Значение.Цена;
        ТекущаяСтрока.ВидЦены = ВыбранныйЭлемент.Значение.ВидЦены;
    КонецЕсли;
КонецПроцедуры

Использование ОписаниеОповещения и метода ПоказатьВыборИзСписка позволяет сделать интерфейс асинхронным и современным, что соответствует стандартам разработки на управляемых формах.

Метод 3. Использование свойства «СписокВыбора» для мгновенного отображения

Если вы хотите, чтобы список выпадал сразу при нажатии на стрелку вниз в поле ввода (без открытия дополнительных окон), можно использовать свойство СписокВыбора самого элемента формы.

Разберем ситуацию: список цен зависит от того, какая номенклатура выбрана в строке. Значит, заполнять СписокВыбора нужно в момент активации строки табличной части.

Важный нюанс: Не стоит делать тяжелые запросы к базе данных в событии ПриАктивацииСтроки, так как это замедлит работу пользователя при простом перемещении по таблице. Лучше заполнять список «лениво» — в момент первого нажатия на кнопку выпадающего списка или использовать кэширование данных в реквизите формы типа Соответствие или ТаблицаЗначений.

Где посмотреть типовые примеры в конфигурациях

Чтобы не выдумывать велосипед, полезно изучить, как подобные задачи решены разработчиками фирмы «1С». В типовых конфигурациях КА 2 и ERP реализованы механизмы подбора, которые можно взять за эталон:

Проанализировав эти подходы, можно сделать вывод: наиболее «кошерный» путь для программиста — это программное формирование СписокЗначений, где в Значение кладется Структура с данными, а в Представление — красиво оформленный текст. Это избавляет от необходимости парсить строки и делает код надежным и легким в поддержке.

← На главную