Отправляет email-рассылки с помощью сервиса Sendsay

Записки программиста

  Все выпуски  

Записки программиста Специальная цена


Сегодня подвернулось "творческое" задание. Это значит, что на пару минут пришлось задуматься о способе реализации, а может просто выбрать из подходящих вариантов. В-общем задание такое. Торговая фирма, самописная конфигурация, что означает свободу в дополнении и изменении документов, справочников, регистров и пр. (главное - не переборщить), обычное движение товаров, ну и для крупного торгующего предприятия вполне нормальная ситуация - клиентов много, номенклатура обширная, нужно некоторым клиентам  некоторые товары отпускать по персональным (далее назову "специальные") ценам либо с персональной скидкой. Даже жалко стало смотреть как мониторы операторов набора накладных обрастают записками с названиями клиентов и их ценами. Короче говоря - без нашего брата не обойтись.
Сразу придумалась схема - к клиенту привязать список товаров с их ценами и при выборе товара в накладной проверять список и если товар в списке - подставлять специальную цену.
Первый шаг: создаем новый справочник с подчинением справочнику контрагентов.

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

Теперь можно нарисовать форму списка. На ней я не стал отображать поля Код и Наименование - они не понадобятся, для ограничений ненужных манипуляций пользователей в модуль вставил единственную процедуру:

Процедура ПриОткрытии()
    ИерархическийСписок(1,0);
КонецПроцедуры


это на тот случай если пользователь откроет справочник не открыв клиента и чтобы не смог сменить режим иерархии - если клиент не выбран список будет пуст а запрет отключения иерархии дает гарантию что перед нами список конкретного клиента.
Еще нюанс - в справочнике товаров уже мною была предусмотрена специальная форма списка для выбора как товаров так и групп товаров, именно эту форму списка надо выставить в свойствах столбца Товар на форме нашего нового справочника. Выбор групп нужен для того чтобы задавать скидку сразу для группы товара.
Чтобы сделать форму списка с выбором групп достаточно в процедуру ПриОткрытии() добавить вызов метода ВыборГруппы(), например

Процедура ПриОткрытии()
    ВыборГруппы(1);
КонецПроцедуры


С этим все, теперь на форму списка справочника Контрагентов я прицепил кнопку для открытия списка товаров, это обычная кнопка в формуле которой записано ОткрытьФормуМодально("Справочник.СпецЦены")

Теперь накладная. В ней есть реквизит Контрагент, есть вариант перебирать список товаров по контрагенту каждый раз при выборе товара в накладной, но мне захотелось реализовать иначе (выпендреж!) - я описал отдельную процедуру, в которой выполняется запрос по справочнику СпецЦены с отбором по выбранному контрагенту, а потом при выборе товара делается выборка из запроса методом Получить(), по-моему так выглядит грамотнее.
Порядок действий такой. Определяем перменную, в которой будет храниться запрос - зСпецЦены (перменная для всего модуля формы). Вышеупомянутая процедура, ПолучитьСпецЦены(), приведу текст запроса:

Обрабатывать НеПомеченныеНаУдаление
Владелец=Справочник.СпецЦены.Владелец;
Товар=Справочник.СпецЦены.Товар;
Цена=Справочник.СпецЦены.Цена;
Скидка=Справочник.СпецЦены.Скидка;
Группировка Товар;
Условие (Владелец=Контрагент);


в процедуру выбора товара добавляем выборку цены

Если ПустоеЗначение(зСпецЦены)=0 Тогда
    зСпецЦены.вНачалоВыборки();
    Если зСпецЦены.Получить(ТМЦ)=1 Тогда
        Цена=зСпецЦены.Цена;
    КонецЕсли;
КонецЕсли;


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

Процедура ПриВводеСтроки()
    Если КоличествоСтрок()=0 Тогда
        ПолучитьСпецЦены();
    КонецЕсли;
КонецПроцедуры


для перестраховки в процедуру ПолучитьСпецЦены() не помешает поставить проверку на "выбранность" контрагента.

Я тут совсем не упомянул о скидке, но думаю по аналогии с ценой догадаться нетрудно, мне важно было рассказать про способы реализации, так что если интересуют подробности - пишите.

В избранное