Форум OlegON > Ресурсы OlegON > Вопросы сервера > Архив > Домино

Домино 7.х - справочник товаров : Домино

16.04.2024 14:47


13.12.2014 13:22
KirillHome
 
По мотивам
Цитата:
AndreyZh Нормальный и правильный вопрос! Один товар - один ШК, одно ГТД, один срок хранения, одно - многое другое.

В УС Лэнд ИСКЛЮЧИТЕЛЬНО партиционный учет и соответственно для товара "одной партии" все эти реквизиты товара уникальны.
.....
решил чуть-чуть описать структуру/правила/возможности товарного справочника в Домино.



В "Домино" 7-ых версий справочник товаров имеет строгое деление на "два типа объектов" - базовый товар и партия.
Базовая карточка описывает "общие" для данного товара характеристики - товарная группа, единица измерения, розничная цена, коэффициент наценки и т.п.
Партия, в свою очередь, описывает "частные" характеристики партии - закупочная цена, дата поставки, поставщик и т.п.

Соответственно, код товара имеет вид типа хххххх (для базового товара) или xxxxxx.yyyy (для партионного), где xxxxxx - базовый код, yyyy - код партии.

Ну, и "системные функции":
ТОВАР.КОД, БАЗОВЫЙ_ТОВАР.КОД (для партии - ТОВАР.КОД <> БАЗОВЫЙ_ТОВАР.КОД, для базовой карточки ТОВАР.КОД = БАЗОВЫЙ_ТОВАР.КОД) - для обращения к определённой карточке товара.

ТОВАР.ОСТАТОК, БАЗОВЫЙ_ТОВАР.ОСТАТОК, БАЗОВЫЙ_ТОВАР.ОБЩИЙ_ОСТАТОК (остаток на базовой карточке, и на всех партионных карточках данного товара) - для обращения к остаткам

ТОВАР.ПАРАМЕТР, БАЗОВЫЙ_ТОВАР.ПАРАМЕТР - для обращения к параметрам.

Есть подчинённый справочник продажных кодов (штрихкодов).
Структура справочника продажных кодов такова:
Код Товара - Продажный код - Количество в продажном коде - Коэффициент цены

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

Всё остальное - параметры для базовой карточки товара или для партии; типы товаров - товары, услуги, тара; связи между товарами - всё это ограничено только нашими потребностями и нашей фантазией.

Для определения типа товара существуют "системные функции":
ТОВАР.ТИП, БАЗОВЫЙ_ТОВАР.ТИП

Есть ещё системные понятия - использование цветов/размеров, но я с ними не сталкивался, поэтому ничего сказать не могу, но, по идее - позволяет более комфортно работать, к примеру, одеждой (не плодить кучу карточек для одинаковых товаров с различным цветом/размерами, и при этом иметь аналитику по данным характеристикам).
14.12.2014 11:44
AndreyZh
 
Вы описали в общем стандартный подход, принятый в большинстве известных программ типа СМ+, 1С:УТ 8.х, ...

Покажите и желательно со скринами, как решаются в общем обычные, более для оптовок задачка?

1. У Вас куча остатков по разным партиям товаров одной номенклатуры, например весь ассортимент пива "Балтика", имеющего десяток производителей и постоянно меняющиеся цены... как понимаю товары разных производителей или цен относятся к разным партиям? Босс даёт задачу вернуть поставщику остаток всего пива "Балтика" конкретного производителя - покажите пошагово решение данной обычной задачки?

2. Вероятно к партиям можно определять сроки годности товара? ... и необязательно в "свежей" партии более поздний срок. Покажите пожалуйста, как продавец розницы будет выполнять задание руководства продавать товар с наименьшим сроком годности?

P.S. В принципе полезно бы было видет решение таких обычных задачек в СМ+ или в программах на платформе 1с:Предприятие 8.х (на 7.7 они, знаю не решаемы)?
14.12.2014 14:40
KirillHome
 
Цитата:
AndreyZh Вы описали в общем стандартный подход, принятый в большинстве известных программ типа СМ+, 1С:УТ 8.х, ...

Покажите и желательно со скринами, как решаются в общем обычные, более для оптовок задачка?

1. У Вас куча остатков по разным партиям товаров одной номенклатуры, например весь ассортимент пива "Балтика", имеющего десяток производителей и постоянно меняющиеся цены... как понимаю товары разных производителей или цен относятся к разным партиям? Босс даёт задачу вернуть поставщику остаток всего пива "Балтика" конкретного производителя - покажите пошагово решение данной обычной задачки?
Дело в том, что "Домино" - это не "закрытая система", а полностью открытая, в которой определены только базовые (основополагающие) функции и правила
Соответственно, задачи (по мере возникновения) решаются дописыванием модулей ("скриптов") под нужды предприятия.

Вот и сейчас я просто написал скрипт, который будет выполнять данную задачу:
Текст скрипта:

Код:
ВЕРСИЯ=3
NAME= Импорт товаров в документ

// Один товар, или несколько товаров, по контрагенту из шапки документа

//Опишем используемые переменные
Integer НачалоИмпорта=0,
        НазваниеСовпало,
        СловоЕсть=0,
        СловоВведено=1,
        НомерКоличества=1,   //В Домино можно использовать несколько измерений количества (такая вот абстракция)
        НомерЦены=1;         //Номер цены для себестоимости

String ВыбранныйТоварКод,
       СловоДляПоиска,
       СтрокаКоличество,
       СтрокаЦены,
       СтрокаПараметры='';

//Опишем временную таблицу товаров (уникальные строки)
Table ВыбранныеТовары  unique
    (ВыбранныеТовары
       поля
       +ВыбранныйТоварКод);

//Опишем временную таблицу слов для поиска в наименовании
Table СловаДляПоиска  unique
    (СловаДляПоиска
       поля
       +СловоДляПоиска);


//Проверим, что строк ещё нет.
if ДОКУМЕНТ.ЕСТЬ_СТРОКИ
{
   ShowErrMessage('В документе - есть строки....||Импорт - невозможен!!!');
   Cancel;
}

//Узнаем, а как мы хотим выбирать товар
ВЫБОР.ИНИЦИАЛИЗАЦИЯ;
ВЫБОР.ДОБАВИТЬ_СТРОКУ('Выбираем один товар');
ВЫБОР.ДОБАВИТЬ_СТРОКУ('Выбираем несколько товаров');
ВЫБОР.ДОБАВИТЬ_СТРОКУ('Выбираем товары с определёнными словами в наименовании');

Case ВЫБОР.ВЫБРАТЬ(0,'Выберите режим работы')
{
     of 1: //Выберем один товар
           ТОВАР.ВЫБОР(0);
           ВыбранныйТоварКод = БАЗОВЫЙ_ТОВАР.КОД;
           //Запишем во временную таблицу
           add ВыбранныеТовары;

     of 2: //Выберем несколько товаров
           ТОВАР.ВЫБОР(1);
           //Пройдёмся по списку выбранных товаров
           Select Товары(1)
           {
                  after Товары.Товар:
                        ВыбранныйТоварКод = БАЗОВЫЙ_ТОВАР.КОД;
                        //Запишем во временную таблицу
                        add ВыбранныеТовары;
           };

     of 3: //Вводим слова для поиска товаров
           LOOP WHILE СловоВведено=1
           {
                //Запрашиваем слово
                СловоДляПоиска = ЗАПРОС.СТРОКА('Введите слово',0);
                //Если слово введено, то запомним его
                if СловоДляПоиска != ''
                {
                   СловоЕсть = 1;
                   add СловаДляПоиска;
                }
                else
                {
                   //Проверим - хотя бы одно слово ввели?
                   //Если да - то тогда можем выйти из цикла
                   if СловоЕсть = 1
                      СловоВведено=0;
                }
                   
           }
           //Теперь ищем товары, содержащие введённые слова
           Select Товар('ТОВАР.БАЗОВЫЙ')
           {
                  after Товар.ТоварБазовый:
                        НазваниеСовпало = 1;
                        Select СловаДляПоиска
                        {
                               after СловаДляПоиска:
                                     //В случае отсутствия искомого слова в названии - сбросим флаг "Найдено"
                                     if pos(UPPER(СловоДляПоиска),UPPER(ТОВАР.ИМЯ),1) = 0
                                        НазваниеСовпало = 0;
                        };
                        if НазваниеСовпало = 1
                        {
                           ВыбранныйТоварКод = БАЗОВЫЙ_ТОВАР.КОД;
                           //Запишем во временную таблицу
                           add ВыбранныеТовары;
                        }
           };
           

     else Halt;
}


//И теперь - бежим по нашей таблице ВыбранныеТовары
Select ВыбранныеТовары
{
       after ВыбранныеТовары:
             ТОВАР.КОД = ВыбранныйТоварКод;

              //Пробежимся по партиям товара
              //Не включая базовую карточку
              Select ПартионныеТовары(БАЗОВЫЙ_ТОВАР.КОД,0)
              {
                     after ПартионныеТовары.ТОВАР:
                           //Проверим, что товар нужного контрагента
                           if ТОВАР.ПОСТАВЩИК.ПОЛНЫЙ_КОД = ДОКУМЕНТ.КОНТРАГЕНТ.ПОЛНЫЙ_КОД
                           {
                              //Проверим, что остаток больше 0
                              if ТОВАР.ОСТАТОК(1) > 0
                              {
                                 //Проверим, что строки ещё не добавляли
                                 if НачалоИмпорта = 0
                                 {
                                    ДОКУМЕНТ.ПАКЕТНОЕ_ДОБАВЛЕНИЕ_СТРОК.НАЧАТЬ;
                                    НачалоИмпорта = 1; 
                                 }
                                 //Сколько возвращаем
                                 СтрокаКоличество = '1,'&НомерКоличества&',1,'&ТОВАР.ОСТАТОК(НомерКоличества);
                                 //По какой цене
                                 СтрокаЦены = '1,'&НомерЦены&',1,'&ТОВАР.ЦЕНА(НомерЦены);
                                 //Добавим строку в документ
                                 ДОКУМЕНТ.ПАКЕТНОЕ_ДОБАВЛЕНИЕ_СТРОК.СТРОКА(ТОВАР.КОД,СтрокаКоличество,СтрокаЦены,СтрокаПараметры);
                              }
                          }
              };
};

//Завершили добавление строк, если надо.
if НачалоИмпорта = 1
   ДОКУМЕНТ.ПАКЕТНОЕ_ДОБАВЛЕНИЕ_СТРОК.ЗАВЕРШИТЬ;
else
   ShowErrMessage('По выбранным товарам нет партий данного контрагента с остатком');

//Сообщим о завершении
ShowOkMessage('Всё завершено');
, в которой можно выбрать один товар из справочника товаров, несколько товаров из справочника товаров, или - товары, содержащие определённые слова в наименовании (я, конечно, не полностью описал разбор вводимой оператором строки на слова, но, для понимания смысла, думаю, достаточно), а дальше - уже строки (партии) по данному контрагенту, в которых есть остаток - будут импортированы в документ.
Данный скрипт кладётся в каталог проекта как простой текстовый файл с расширением PRG (в данном случае это будет imp.prg), а в меню данного документа (меню - это тоже текстовый файл, с расширением MNU) прописывается (добавляется) строка, которая вызывает данный скрипт
Код:
"BRK","",""," Импорт товаров по поставщику","ВЫПОЛНИТЬ ПРОГРАММА={ACTION}TOWDOC\imp",""
Цитата:
AndreyZh 2. Вероятно к партиям можно определять сроки годности товара? ... и необязательно в "свежей" партии более поздний срок. Покажите пожалуйста, как продавец розницы будет выполнять задание руководства продавать товар с наименьшим сроком годности?
Если честно - я считаю данную задачу не программной, а административной.
Продавец розницы должен "выставить вперёд" (в случае самообслуживания) или выдать покупателю сам (в случае прилавка) товар, срок годности которого заканчивается раньше.

И да, здесь есть своеобразная "накладка", которая (на мой взгляд) плохо решается при полностью автоматическом списании по FIFO или LIFO партий товаров.
Весьма вероятно, что мы продали товар из последней поставки, но списан он всё равно будет из первой (для FIFO); и наоборот - продали товар из первой поставки, а списан он будет из последней (для LIFO).

Т.е. когда товар попал к нам на склад, мы, программным образом - не можем сказать - из какой он партии (если мы не заводим какие-либо уникальные характеристики данной конкретной партии в систему - что позволит нам отличить одну партию от другой визуально; и если мы не присваиваем данной партии уникальный штрихкод - что позволит нам отличить одну партию от другой программно).
14.12.2014 14:59
KirillHome
 
Подумал-подумал, и решил дополнить вторую часть
Цитата:
AndreyZh 2. Вероятно к партиям можно определять сроки годности товара? ... и необязательно в "свежей" партии более поздний срок. Покажите пожалуйста, как продавец розницы будет выполнять задание руководства продавать товар с наименьшим сроком годности?
"Домино" - это не "фронт", это "бэк".

Хотя, если допустить необходимость организации места продажи через "Домино", то можно...
Можно нарисовать экранную форму, которая, после выбора товара - будет анализировать имеющиеся партии, и говорить оператору - найди партию с такой-то датой (анализируя остатки, в том числе, и по полю "Срок годности").
Так же на данной форме можно указать, помимо стандартных полей - товар, количество, цена - ещё и поле "Срок годности", обязательное для заполнения (с проверкой на допустимые значения). Или предлагая выбрать из имеющегося списка актуальных (который мы так же можем подготовить при выборе товара).
А дальше - уже выбирать партии по FIFO (LIFO?), у которых указан данный срок годности.

Но - проблема в том, что торговая система не должна задерживать покупателя, не должна запрещать продавать товар.
А оператор может - неправильно указать дату, найти товар (внезапно, да? ) с какой-то совсем странной датой (которую мы, по каким-то причинам, не ввели в систему) и т.д.
14.12.2014 16:53
AndreyZh
 
Во первых конечно спасибо и моё восхищение за обстоятельную подготовку к ответу и подробный, четкий и честный ответ!

Всё же!

1. Как догадывался и Вы подтвердили для гибкого функционирования Домино (1С и частично СМ+) нужен программист-аналитик... и да с той или иной степенью точности/сложности может быть решена почти любая задача. Для УС Лэнд и Купец достаточно "простого" аналитика... крайне редко (в силу некой развитости систем) возможны дописывания от разработчика.

2. У меня программист так же может добавить "внешний" новый функционал, в частности все экзотичные новые задачи я выношу за рамки системы... т.е. некий "программисткий" паритет.

3. Подход Ваш так же понятен... Есть КОНКРЕТНАЯ задача - пишу для неё КОНКРЕТНУЮ внешнюю разработку. Но я сходу дал две небольшие задачки по товару, а в реальности они появляются со сроком выполнения "вчера".

Могу отметить и Вы подтвердили, что на некоторых задачах связка товар.партия заставляет приложить усилия для их решения, так же как и у меня связка товар.ассортимент (партия.товар) так же не идеальна... Что же "мир разнообразен", что и прекрасно!
14.12.2014 16:56
AndreyZh
 
Цитата:
KirillHome ..."Домино" - это не "фронт", это "бэк"...
"Мой" недостаток, что УС - это и фронт и бэк, и прокладка между системами, и некий консолидирующий механизм для разных программ... Всё это пользуется в практически всех сферах бизнеса и система должна на идеологическом уровне накладываться на любые бизнес-процесс... возможно от сюда у меня есть некоторые "неправильности" в её проектировании
Часовой пояс GMT +3, время: 14:47.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.