Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Дайте свежую мысль :) (число прочтений - 3631 )
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Дайте свежую мысль :)
09. Декабря 2006 :: 14:22
Печать  
Есть документ, содержащий около 30 реквизитов + есть взаимосвязь этих рекизитов со внешними источниками данных.
Почти все реквизиты взаимосвязаны друг с другом, и должны вводиться строго без ошибок.
Например в документе есть 4 даты, и они должны вводиться строго в определенной последовательности. (ДатаПродажи -> ДатаДок -> ДатаРемонта ->ДатаВыдачи)

Суть проблемы. Периодически мне необходимо разрешить менеджеру забить на несоответствие данных. Но разрешить так, чтобы он мог отменить только определенную проверку.
Если я сделаю в документе один единственный флаг, то включив его, например, закрывая глаза на теже даты, можно нарваться на ошибки в других полях.

Был вариант сделать флаг двоичным. Но количество проверок в документе постоянно увеличивается, и можно потом запутаться что к чему.

Задача
1. Как реализовать этот флаг
2. Как реализовать интерфейс включения/отключения флагов (может ПропертиГрид?)
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Дайте свежую мысль :)
Ответ #1 - 09. Декабря 2006 :: 17:27
Печать  
Не знаю, насколько моя мысль для тебя нова, но я бы поступил примерно так:
- создаем набор классов-валидаторов;
- в модуле, выполняющем роль модели документа, собрираем их в коллекцию (скажем, список с пометками);
- на форме даем каждому валидатору осмысленное название и даем пользователю снять/поставить нужные галки;
- при выполнении проверки в модуле документа пробегаем по отмеченным валидаторам и вызываем их.
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Дайте свежую мысль :)
Ответ #2 - 10. Декабря 2006 :: 10:22
Печать  
Я бы также сделал.
Ну, может быть у меня класс-валидатор был бы один, а его методы были бы конкретными тестами.
Схема нормально масштабируется, к ней легко прикрутить контроль прав доступа (что можно нарушать, что нет), журнализацию и т.д.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Дайте свежую мысль :)
Ответ #3 - 10. Декабря 2006 :: 11:04
Печать  
Так уже и реализовал Улыбка
Вопрос был в способе хранения флагов + интерфейсе.
Сделал на базе справочника + обычная ТЗ на форме.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Дайте свежую мысль :)
Ответ #4 - 11. Декабря 2006 :: 07:01
Печать  
Учитывая, что в 1С можно хранить в базе десятичное число длинной 19 знаков, получаем 63 независимых двоичных флагов.
Реализовать двоичную логику на языке 1С довольно просто.
Либо использовать класс Math.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Дайте свежую мысль :)
Ответ #5 - 11. Декабря 2006 :: 09:03
Печать  
Math с двоичными не работает...
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Дайте свежую мысль :)
Ответ #6 - 11. Декабря 2006 :: 09:41
Печать  
Arta писал(а) 11. Декабря 2006 :: 09:03:
Math с двоичными не работает...

Работает Улыбка

Цитата:
Число / Long
-------------------------------------------------------------------------
   :Синтаксис:
       Long(Параметр, чБаза =0)


т.е.
Код
Выбрать все
Long(1000, 2) == 8
 


Ну а дальше применить флаг путем OR/AND - это дело техники.
Но ограничение Long - 32 бита.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Дайте свежую мысль :)
Ответ #7 - 11. Декабря 2006 :: 11:12
Печать  
kms писал(а) 11. Декабря 2006 :: 09:41:
Ну а дальше применить флаг путем OR/AND - это дело техники.


Эээ... для дЭбила разжуй, а... Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Дайте свежую мысль :)
Ответ #8 - 11. Декабря 2006 :: 11:40
Печать  
Дык все вроде просто.

Если у тебя всего 32 теста или меньше - с ними вообще можно запросто работать:
1. Допустим, полный набор тестов 1111b
2. Обязательный набор тестов 0101b

Необязательный набор тестов вычисляется как XOR(1111b, 0101b) = 1010b
Проверка конкретного теста на вхождение в список обязательных, например: BITAND(0001b, 0101b) <> 0
т.е. BITAND(0001b, 0101b) = 1 - обязательный тест, BITAND(0010b, 0101b) = 0 - необязательный
Журнализация непрошедших тестов: флаги = BITOR(0001b, флаги). Флаги эти можно хранить в базе для быстрого анализа.

А вообще, для хранения цепочек битов длиннее 32, есть разные способы:
1. Как сказал orefkov, макс число = это 19 цифр. Это ln(10^19)/ln(2) = 63 двоичных флага. Для стандартного Math это слишком много, но действительно можно реализовать свою логику внутри 1С.
2. Можно хранить, к примеру в виде шестнадцатеричных строк, их легко резать в группы по 8 цифр и применять булеву логику последовательно. (перевод из строки в числа просто делается функцией Long()).

P.S.
Собственно, можно сделать логику какой угодно длины в каком-нибудь другом Math1024, но зачем Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Дайте свежую мысль :)
Ответ #9 - 13. Декабря 2006 :: 16:06
Печать  
На счет тестов, у меня нет НЕобязательных.
Мне надо просто выставить (перевожу на русскодоступный, а не как у тебя матными словами Улыбка  ) седьмой тест в единицу, например так "0000001000000000".

Иными словами мне нуно наверное из 36-чной в двоичную, это самое экономное...


На крайний случай перевести можно так http://www.kb.mista.ru/article.php?id=78
но это не по нашему Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать