Вход | Регистрация

1С:Предприятие ::

Метки:

Как сделать прайс?

Я
   Львенок
 
28.02.04 - 13:29
Люблю нетривиальные задачки. А задача такая.

           Исходные данные:
Есть справочник Номенклатура, есть регистр ОстаткиТоваров, есть регистр Резервы (на самом деле есть вообще вся ТиС).
В справочнике Номенклатура, есть много вложенных групп (бывает более пяти уровней вложенности), а еще у каждого элемента есть вот такие реквизиты ВключатьВПрайс (Булево и может быть Да, Нет, и не задано) и МинимальныйОстатокДляПрайса (Число). Соответственно товыры могут быть или не быть физически (Остаток < или > или =0), а могут быть но зарезервированы частично или полностью (резерв =0 или < остатка или =Остатку).

                  Условия:
Если у товара реквизит: ВключатьВПрайс = Да, тогда он в любом случае попадает в прайс (в зависимости от его наличия и зарезервированности может с разными значками типа *,?,- добавленными к наиманованию), Если у товара ВключатьВПрайс = Нет, товар в любом случае в прайс не попадает.
Если у товара ВключатьВПрайс не задан вообще, то действут следующее условие: Если ОстатокТовара-Резерв<Товар.МинимальныйОстатокДляПрайса Тогда товар не включается в прайс, иначе он включается.

                 Цели:
А) Напечатать прайс на листах в две колонки (нетривиальная задача на 1С сама по себе), учитывая что ввиду того, что колонки относительно короткие и если название товара не умещается на одной строке, его хорошобы разбить на две строки (без использования Свойства->Контроль->Переносить), а именно две строки.
Б) Группы! О, да! Самое интересное! Если в группе и всех ее подргруппах, ни один товар не попадает в прайс (не проходит по условиям), то группа и все ее подгруппы не выводятся. Если в какой-то группе любого уровня есть хоть один товар в прайс попадающий, название группы и всех ее материнских групп в прайсе присутствуют.
                Задачи:
Как реализовать это? Экспериментально установил (используя _GetPerformanceCounter()), что при моих условиях, перебирать всю номенклатуру используя для подсчета Остатков и Резервов метод СводныйОстаток() гораздо быстрее запросов (один фиг запросы в чистом виде прикрутить я не смог, т.к. в прайс должны попадать и товары по которым никаких движений никогда не было - новые товары, которых нет в наличии и никогда не будет, если никто не захочет их приобрести под заказ). И уж точно я сломал себе голову с выводом названий групп.

              Пример:
В номенклатуре (плюс означает что в итоге по всем уловиям элемент попадает в прайс, а минус что не попадает):

Группа 1
  Группа 11
    Группа 111
      Элемент 1111 +
      Элемент 1112 -
      Элемент 1113 -
    Группа 112
      Элемент 1121 -
  Группа 12
    Элемент 121 -
    Группа 122
      Элемент 1221 -
  Группа 13
    Группа 131
      Элемент 1311 +
Группа 2
  Группа 21
    Группа 211
      Элемент 2111 -
      Элемент 2112 -
      Элемент 2113 -
    Группа 112
      Элемент 1121 -

А в прайсе будет:
Группа 1
Группа 11
Группа 111
Элемент 1111 Цена, КолВо *
Группа 13
Группа 131
Элемент 1311 Цена, КолВо *

Автовывод групп, это забавно.

              Вопрос:
Впринципе, задачу я решил. Однако не раскрывая методов... у кого-то есть идеи, как это сделать быстро? Может быть мои алгоритмы далеко не оптимальны и кто-то предложит более рациональные варианты?

P.S.: Если будет интерес, позже выложу то, что я наропал по этому поводу.
___
Искренне Ваш, Львенок.
 
  Рекламное место пустует
   skunk
 
4 - 28.02.04 - 13:53
ТекстЗапроса = "
|Товар = Справочник.Номенклатура.ТекущийЭлемент;
|Родитель = Справочник.Номенклатура.Родитель;
|Группировка Родитель;
|Группировка Товар Упорядочить по Товар.Наименование без групп;";

не имеешь родителя без товара в выборке
   Композитор
 
6 - 28.02.04 - 14:06
(0) Что в Вашей задаче нетривиального? Элеменарная задача для программиста, умеющего работать с циклами.
Перебор -> ТЗ -> Анализ ТЗ -> Печать (Сколько угодно колонок). Стркутура ТЗ создается программно с учетом количества уровней справочника Номенклатура, количества фирм, складов, количества типов цен. Я решал подобную задачу для формирования файлов выгрузки номенклатуры на сайт.
   Inside
 
8 - 28.02.04 - 14:10
(5) Открою Вам секрет...
Мне совершенно безразлично в чём база... MSSQL или DBF.
DBF будет немного дольше.
Всё это проблемы ADO, а не мои :)
   Львенок
 
14 - 28.02.04 - 14:19
(10) Чего ж трудного?
Пока Спр.ПолучитьЭлемент()>0 Цикл
    Товар=Спр.ТекущийЭлемент();
            Остаток=Регистр.ОстаткиТоваров.СводныйОстаток(Товар,,"ОстатокТовара");
            Резерв=Регистр.РезервыТоваров.СводныйОстаток(Товар,,"РезервТовара");
    КонецЦикла;
   GrayT
 
16 - 28.02.04 - 15:19
Помоему, это задача для конструктора запросов:)
"//{{ЗАПРОС(Сформировать)

|Без итогов;
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент, Регистр.ОстаткиТМЦ.Номенклатура, Регистр.РезервыТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество;
|Количество1 = Регистр.РезервыТМЦ.Количество;
|Функция Остаток = КонОст(Количество);
|Функция Резерв = НачОст(Количество1);
|Группировка ТекущийЭлемент;
|Условие((ТекущийЭлемент.НеВключатьВпрайс=0) или ((Количество>Количество1) И (ТекущийЭлемент.НеВключатьВпрайс=1)));
|//}}ЗАПРОС


Использовал стантартную ТиС. Вместо НеВключатьВпрайс использовать свое перечисление и в условие добавить еще И (НеВклюяать=Перечисление.ВходимостьВПрас.НеВходит)


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует