Посоветуйте алгоритм!

  1. 9 г. назад
    19.09.2014 13:57:11 отредактировано БухиТог

    Есть две выдачи товара "Терминал №1", "Терминал №2". Кладовщику практически одинаково нести товар что на терминал 1, что на терминал 2. Надо сделать так чтобы при выписке менеджерами накладных, сборки (список товаров для кладовщиков и на какой терминал нести) отправлялись поочередно то на первый терминал, то на второй.
    Самое очевидное использовать константу.

    Если Константы.НашаКонстанта.Получить() = 1 Тогда
    //отправляем сборку на второй терминал
    Константы.НашаКонстанта.Установить(2);
    Иначе
    //отправляем сборку на первый терминал
    Константы.НашаКонстанта.Установить(1);
    КонецЕсли;

    Но что то я очкую, что константа при таком использовании будет постоянно заблокирована на запись и все менеджеры торгового зала будут ждать пока она разблокируется.
    Или несколько менеджеров прочитают одновременно одно и то же значение константы.
    В час пик выписка накладных идёт очень интенсивно.

    Вообщем, что посоветуете?!

    Ответы: (1) (7) (8) (44) (55)
  2. БухиТог и все менеджеры торгового зала будут ждать пока она разблокируется

    более того, она не разблокируется. зависончик будет мама-не-горюй.

    Ответы: (3) (7) (8) (60)
  3. самое первое, что приходит в голову - проверить четность/нечетность номера документа.

    Ответы: (4)
  4. (1) Что посоветуешь?

  5. (2) Не вариант. Документы трёх видов и с разных Организаций. Нумерация у всех разная.

    Ответы: (6)
  6. А доп.флажок у накладной? При записи если не выбран и не заполнен, прочитать последний записанный документ и сравнивать с его флажком.

    Ответы: (34)
  7. (4) Как вариант: константа. Обнуляется в начале дня. Первый док - константа=1, следующий - константа=2 (то есть простое добавление 1). Терминал - если константа четная - 2, если нечетная - 1.

    Ответы: (7) (11)
  8. (6) так я в (0) так и предлагаю, но Бекас пугает в (1)

    Ответы: (8)
  9. (7) В (0) я вижу только 1 и 2 (в константе). Я не много про другое.
    Про (1) - не скажу. А что мешает попробовать?

  10. а обязательно константу? нельзя использовать типа глобальную переменноу?

    Ответы: (10) (15) (26)
  11. (9) и как её будут видеть остальные менеджеры?

    Ответы: (18) (26)
  12. (6) хоть чередование 1/2, хоть инкремент, всяко требуется запись константы. В моей задаче было полегче - константа устанавливалась в ДА, только если текущее значение было НЕТ, в противном случае ничего не записывалось. И то периодически кирдык наставал, и пока все не выйдут из базы, висячок-с...

    Ответы: (12)
  13. (11) Тогда нужно смотреть на вариант с переменной.
    А можно проще: четные дни - 2 терминал, нечетные 1 [smile=:D]

    Ответы: (14)
  14. О! 2 константы - терминал1 и терминал2.

  15. (12) что за вариант с переменной?

    Ответы: (15) (16)
  16. (14) См. (9)

    Ответы: (18)
  17. (14) тот же принцип, что и с константами, только вместо константы - используешь переменную

    Ответы: (18)
  18. + к тому же, хранить терминал в базе - не айс... оно ни к чему )

    Ответы: (18)
  19. 19.09.2014 14:27:53 отредактировано БухиТог

    (15)(16) см. (10)

    Ответы: (19) (20) (25)
  20. (18) А зачем ее видеть? Пусть в док-е пишет "Терминал такой-то".

    Ответы: (22) (34)
  21. (18) не вижу проблему с доступностью другим менеджерам. эта переменная глобальная. первый манагер записал в нее, к примеру, 1. второй - прочитал, что она = 1, записал 2... и т.д....
    или я чего не пойму?

    Ответы: (21) (25) (26)
  22. (20) никогда не слышали про глобальную переменную, например, глПользователь?

    Ответы: (23)
  23. +(19) Док создали, накидали, при сохранении константа/переменная инкремировалавась и в доке записался терминал.

  24. (21) слышал конечно!
    Но каждый менеджер в глПользователь видит своё значение, заполненное им при начале сеанса.
    А не все одно и то же.

    Ответы: (24)
  25. (23) Вот и я о том же. Глобальная переменная для этой задачи не годится.

    Ответы: (26)
  26. lubja (18) не вижу проблему с доступностью другим менеджерам. эта переменная глобальная. первый манагер записал в нее, к примеру, 1. второй - прочитал, что она = 1, записал 2... и т.д....
    или я чего не пойму?

    Глобальная переменная, она глобальна в одном сеансе.

  27. 19.09.2014 14:42:31 отредактировано БухиТог

    (24) я вообще эту мысль еще с поста (10) пытаюсь до девушек донести, но см. (20)

  28. поняла! не надо напирать )))

  29. 19.09.2014 14:44:05 отредактировано Эльниньо

    ОтправляемНаТерминал(СтатусВозврата(1 - СтатусВозврата()) + 1)

    Ответы: (29) (30) (51)
  30. (28) [...]!
    Чо то не могу догнать...

    Ответы: (30)
  31. БухиТог (28) [...]!
    Чо то не могу догнать...

    СтатусВозврата() - глобальна для всех сеансов

    Ответы: (32) (36)
  32. 19.09.2014 14:47:56 отредактировано Bekas

    Процедура ПриЗаписи()
    Если Выбран()=0 Тогда
    //
    запросом выбрать за текущий день все документы необходимого вида
    посчитать их количество
    //
    Если КоличествоДокументов=чётное Тогда
    Отправляем На 1-й терминал
    Иначе
    ...

    как-то так.

    Ответы: (33)
  33. (30) а оно в 8-ке еще используется?

    Ответы: (36)
  34. Фишка в (31) - избавляемся от излишней записи куда-либо, избегаем лишних блокировок

    Ответы: (34)
  35. 19.09.2014 14:51:56 отредактировано БухиТог

    (33) угу я всё таки решил завязаться на реквизит документа "НомерТерминала", а не количество документов. Как ты предлагал в (5) и Масянька в (19)

  36. смотри время дока, если четное терминал 1, иначе 2
    по статистике будет 50/50

    Ответы: (37) (45)
  37. 19.09.2014 15:20:31 отредактировано Эльниньо

    БухиТог (30) а оно в 8-ке еще используется?

    А тут снеговик, штоле?
    Фу, испачкался. Пойду руки мыть.

  38. x86 смотри время дока, если четное терминал 1, иначе 2
    по статистике будет 50/50

    Ставлю дайм, будет 75/25

    Ответы: (38) (39)
  39. (37)почему?

    ок, посмотреть статистику, и на основе коэффициентов распределять терминалы

    Ответы: (39) (40)
  40. x86 (37)почему?

    жизненное наблюдение.

  41. (38) в течении дня нагрузка совсем не равномерная. Есть периоды ни одного человека, есть периоды- очереди к каждому из менеджеров.

    Ответы: (41) (43)
  42. (40) Можно еще менеджеров поделить: эти - направо (терминал1), а эти - налево (терминал2). [smile=:D]

    Ответы: (42)
  43. (41) нет-нет, самый плохой вариант

  44. (40)отчасти согласен
    имхо щитать доки за день самое то

  45. (0) предлагаю использовать 1совский нумератор.
    чётный номер - туда, нечётный - сюда

    Ответы: (46)
  46. (35) ориентироваться на время - это фаталити.

    если и ударяться в случайности - так хотя бы с научным подходом wiki:Метод_обратного_преобразования

  47. (44) это который нумератор документов?

    Ответы: (49)
  48. ВЫБРАТЬ ПЕРВЫЕ 1
    МК_РозничнаяПродажаЧек.Подсклад КАК Подсклад,
    МК_РозничнаяПродажаЧек.Дата КАК Дата
    ПОМЕСТИТЬ ПоследниеДокументы
    ИЗ
    Документ.МК_РозничнаяПродажаЧек КАК МК_РозничнаяПродажаЧек
    ГДЕ
    МК_РозничнаяПродажаЧек.Склад = &Склад
    И (МК_РозничнаяПродажаЧек.Дата >= &ДатаНачала
    И МК_РозничнаяПродажаЧек.Подсклад = "1"
    ИЛИ МК_РозничнаяПродажаЧек.Подсклад = "2")

    УПОРЯДОЧИТЬ ПО
    Дата УБЫВ
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 1
    ЕСТЬNULL(МК_ПодтверждениОтгрузки.Подсклад, ПоследниеДокументы.Подсклад) КАК Подсклад,
    ЕСТЬNULL(МК_ПодтверждениОтгрузки.Дата, ПоследниеДокументы.Дата) КАК Дата
    ПОМЕСТИТЬ ПоследниеДокументы2
    ИЗ
    ПоследниеДокументы КАК ПоследниеДокументы
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.МК_ПодтверждениОтгрузки КАК МК_ПодтверждениОтгрузки
    ПО (МК_ПодтверждениОтгрузки.Дата > ПоследниеДокументы.Дата
    И МК_ПодтверждениОтгрузки.Подсклад = "1"
    ИЛИ МК_ПодтверждениОтгрузки.Подсклад = "2")
    И (МК_ПодтверждениОтгрузки.Склад = &Склад)

    УПОРЯДОЧИТЬ ПО
    ЕСТЬNULL(МК_ПодтверждениОтгрузки.Дата, ПоследниеДокументы.Дата) УБЫВ
    ;

    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ ПоследниеДокументы
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ЕСТЬNULL(МК_ЧекККМ.Подсклад, ПоследниеДокументы.Подсклад) КАК Подсклад,
    ЕСТЬNULL(МК_ЧекККМ.Дата, ПоследниеДокументы.Дата) КАК Дата
    ИЗ
    ПоследниеДокументы2 КАК ПоследниеДокументы
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.МК_ЧекККМ КАК МК_ЧекККМ
    ПО (МК_ЧекККМ.Дата > ПоследниеДокументы.Дата)
    И (МК_ЧекККМ.Склад = &Склад)
    И (МК_ЧекККМ.Подсклад = "1"
    ИЛИ МК_ЧекККМ.Подсклад = "2")

    УПОРЯДОЧИТЬ ПО
    ЕСТЬNULL(МК_ЧекККМ.Дата, ПоследниеДокументы.Дата) УБЫВ

    Хотел делать через объединение, но там бардак выходит с упорядочиванием

    Ответы: (54)
  49. в последнем подзапросе конечно тоже "ВЫБРАТЬ ПЕРВЫЕ 1"

  50. (46) хоть документов, хоть справочника. не суть важно.

    идея в том, чтобы тупо записывать новую сущность и использовать назначенный номер.

    раз в сутки ненужные накопленные сущности можно вычищать регламентом, например

    Ответы: (50) (51)
  51. (49) а что у справочников тоже есть объект "Нумератор"? В конфигураторе у документов вижу, у Справочника нет.

    Ответы: (53)
  52. (49) как думаешь это рабочий код в (28) для 1С77, или Эльниньо фантазмирует?

    Ответы: (52)
  53. (51) вряд ли рабочий

  54. (50) ну, коды же присваиваются

  55. (47) блин, фигня а не запрос. Всё рушится, если нет документа МК_РозничнаяПродажаЧек

    Ответы: (58)
  56. (0) если лень использовать классические управляемые блокировки - просто перед записью константы попробуй ее заблокировать

    Ответы: (57)
  57. Но тупо кидать туда - сюда это конечно не выход, надо анализировать количество на сборке, поэтому управляемые блокировки

  58. (55) так в том то и дело что менеджеры выстроятся в очередь в ожидании когда константа разблокируется

    Ответы: (59)
  59. 20.09.2014 10:45:03 отредактировано andrewks

    (54) переписал так:

    ВЫБРАТЬ ПЕРВЫЕ 1
    	МК_РозничнаяПродажаЧек.Подсклад КАК Подсклад,
    	МК_РозничнаяПродажаЧек.Дата КАК Дата
    ПОМЕСТИТЬ ПоследниеДокументы
    ИЗ
    	Документ.МК_РозничнаяПродажаЧек КАК МК_РозничнаяПродажаЧек
    ГДЕ
    	МК_РозничнаяПродажаЧек.Склад = &Склад
    	И (МК_РозничнаяПродажаЧек.Дата >= &ДатаНачала
    				И МК_РозничнаяПродажаЧек.Подсклад = "1"
    			ИЛИ МК_РозничнаяПродажаЧек.Подсклад = "2")
    
    УПОРЯДОЧИТЬ ПО
    	Дата УБЫВ
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 1
    	МК_ПодтверждениОтгрузки.Подсклад,
    	МК_ПодтверждениОтгрузки.Дата
    ПОМЕСТИТЬ ПоследниеДокументы2
    ИЗ
    	Документ.МК_ПодтверждениОтгрузки КАК МК_ПодтверждениОтгрузки
    ГДЕ
    	(МК_ПодтверждениОтгрузки.Дата >= &ДатаНачала
    				И МК_ПодтверждениОтгрузки.Подсклад = "1"
    			ИЛИ МК_ПодтверждениОтгрузки.Подсклад = "2")
    	И МК_ПодтверждениОтгрузки.Склад = &Склад
    
    УПОРЯДОЧИТЬ ПО
    	МК_ПодтверждениОтгрузки.Дата УБЫВ
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 1
    	МК_ЧекККМ.Подсклад,
    	МК_ЧекККМ.Дата
    ПОМЕСТИТЬ ПоследниеДокументы3
    ИЗ
    	Документ.МК_ЧекККМ КАК МК_ЧекККМ
    ГДЕ
    	МК_ЧекККМ.Дата > &ДатаНачала
    	И МК_ЧекККМ.Склад = &Склад
    	И (МК_ЧекККМ.Подсклад = "1"
    			ИЛИ МК_ЧекККМ.Подсклад = "2")
    
    УПОРЯДОЧИТЬ ПО
    	МК_ЧекККМ.Дата УБЫВ
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 1
    	ЗапросПоТрём.Подсклад,
    	ЗапросПоТрём.Дата КАК Дата
    ИЗ
    	(ВЫБРАТЬ
    		ПоследниеДокументы.Подсклад КАК Подсклад,
    		ПоследниеДокументы.Дата КАК Дата
    	ИЗ
    		ПоследниеДокументы КАК ПоследниеДокументы
    	
    	ОБЪЕДИНИТЬ ВСЕ
    	
    	ВЫБРАТЬ
    		ПоследниеДокументы2.Подсклад,
    		ПоследниеДокументы2.Дата
    	ИЗ
    		ПоследниеДокументы2 КАК ПоследниеДокументы2
    	
    	ОБЪЕДИНИТЬ ВСЕ
    	
    	ВЫБРАТЬ
    		ПоследниеДокументы3.Подсклад,
    		ПоследниеДокументы3.Дата
    	ИЗ
    		ПоследниеДокументы3 КАК ПоследниеДокументы3) КАК ЗапросПоТрём
    
    УПОРЯДОЧИТЬ ПО
    	Дата УБЫВ
    Ответы: (60) (61)
  60. (57) записать константу - дело недолгое, а Заблокировать() - вообще думаю мгновенно отрабатывает

    Ответы: (60)
  61. 20.09.2014 10:31:47 отредактировано БухиТог

    (59) наверное ты права мудрая гипножаба, но пока тебя не было Бекас влез со своим авторитетным мнением в (1), и я сделал так (58)

  62. (58) здесь есть форматирование кода запроса. пользуйся - так красивее

  63. ГСЧ = Новый ГенераторСлучайныхЧисел(255);
    НомерТерминала = ГСЧ.СлучайноеЧисло(1, 2);

    Теория вероятности какбэ говорит нам, что выпадать числа будут примерно поровну

    Ответы: (63)
  64. (62) а 1совский ГСЧ точно реализован по нормальному распределению?

    Ответы: (64)
  65. (63) не обязательно его использовать, можно взять более другой.

    вот например как из звуковой карты ГСЧ сделать: http://habrahabr.ru/post/133320/

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

    Или вот квантовый генератор совершенно случайных чисел продают http://qcphotonics.com/trbg/

    Ответы: (66)
  67. Гефест Или вот квантовый генератор совершенно случайных чисел продают

    как это по-одинесовски - впарить клиенту ненужную дорогостоящую хрень для реализации какой-то возможности, которая прекрасно решается и без этой дорогостоящей хрени ;)

или зарегистрируйтесь чтобы ответить!