Имя: Пароль:
1C
1С v8
Подскажите как удобнее хранить величину Долю в Квартире внутри базы 1С
0 m1_1976
 
26.11.15
10:58
Есть необходимость хранить в ресурсе регистра сведений долю в квартире. А она чаще всего выделена как 5/16, или может быть 35/76...

Потом надо ее еще в число приводить и использовать в расчетах. Как организовать? Доли могут быть разными  7/101 - да! Даже 1/11000 доли... :(

В голове только справочник с двумя реквизитами число - ЧИСЛИТЕЛЬ и ЗНАМЕНАТЕЛЬ... и в наименование их "конкатенировать" при записи...
Но чего-то мне самому такое решение не очень.
Может кто уже делал более красивао?
1 m1_1976
 
26.11.15
11:01
Или хранить число как строку с форматом типа "NNNN/NNNNN"...
2 Лефмихалыч
 
26.11.15
11:05
(0) технически эта задача ни чем не отличается от хранения курсов валют. Там в общем случае тоже два числа - курс и кратность
3 Лефмихалыч
 
26.11.15
11:06
ну и раздели в голове хранение от пользовательского представления. Так жить проще сразу станет.
4 m1_1976
 
26.11.15
11:06
еще нужно удобство ручного ввода при заполнении картчоки... Курсы валют руками никто давно не заполняет!
пробую через маску 99999/99999...
5 Лефмихалыч
 
26.11.15
11:10
(4) >Курсы валют руками никто давно не заполняет!
и чо?
6 m1_1976
 
26.11.15
11:12
(3) да разделил. С маской не удобно. Просто Проверяю при вводе строки вида дроби правильность заполнения...
Закрыто.
Спасибо.
7 spock
 
26.11.15
11:13
(2) Не совсем. В случае с курсами есть общественная договоренность, что курс имеет точность 4 символа + стандартная кратность, при операциях с которым получаем значение с точностью до копеек нац. валюты.

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

Пример с 1/3 <> 0.333 + 0.333 + 0.333 показателен, и кратность здесь не сильно спасет.
8 stix2010
 
26.11.15
11:15
(0) 1/11000 - это че хатой 11 000 чел владеют?
9 Лефмихалыч
 
26.11.15
11:15

...
10 Лефмихалыч
 
26.11.15
11:16
(8) это одному принадлежит 1/11000, а второму - все остальное
11 m1_1976
 
26.11.15
11:16
(8) Вот такие бывают. Да... :( прописка в РФ - когда то это было важно.
12 Лодырь
 
26.11.15
11:17
За числитель и знаменатель. Такой формат хранения позволит в запросе чтото считать.
13 VikingKosmo
 
26.11.15
11:18
(8) нормальная таджикская квартира...
14 m1_1976
 
26.11.15
11:18
(12) в виде числа каждый?
наверное добавлю и хранение текстового вида. И два числа. Всегда пригодиться. Верно.
Спасибо
15 m1_1976
 
26.11.15
11:19
Закрыто.
Спасибо.
16 Лефмихалыч
 
26.11.15
11:23
(14) >добавлю и хранение текстового вида
тогда в передЗаписью набора записей надо втрумлять проверку на соответствие строкового преставления числовым значениям. Или там же без проверки всегда строковое представление апдэйтить.
Избыточность - она, бессердечная сука, всегда дорого обходится...
17 m1_1976
 
26.11.15
11:41
Вот так сделал.

Это модуль формы записи регистра.

Процедура АктиввироватьДОлю()
    Предупреждение("Доля всегда должна вводиться в виде ЧИСЛО / ЧИСЛО");
    ЭтаФорма.ТекущийЭлемент = ЭтаФорма.ЭлементыФормы.Доля;
КонецПроцедуры    

Функция ТолькоЦифры(СтрокаПроверяемая)
    СтрокаПроверяемая = СТРЗаменить(СтрокаПроверяемая," ","");
    ДЛя а1 =1 по СтрДлина(СтрокаПроверяемая)  Цикл
        если Найти("0123456789",Сред(СтрокаПроверяемая,а1,1)) = 0 Тогда
            Возврат ЛОЖЬ;
        Конецесли;
    КонецЦикла;    
    Возврат Истина;
КонецФункции    // ТолькоЦифры(СтрокаПроверяемая)

Процедура ДоляПриИзменении(Элемент)
    Симвпалки = Найти(Доля,"/") ;
    Если Симвпалки = 0 Тогда
        АктиввироватьДОлю();
        Возврат;    
    Конецесли;    
    
    // наклонная палка есть!
    ЛЕВ_Число = ЛЕВ(Доля,Симвпалки-1);
    ПравЧисло = Сред(Доля,Симвпалки+1);
    Если ПустаяСтрока(ЛЕВ_Число) или ПустаяСтрока(ПравЧисло) Тогда
        АктиввироватьДОлю();
        Возврат;
    Конецесли;
    ///////////////////////////////
    Если (НЕ ТолькоЦифры(ЛЕВ_Число)) или (НЕ ТолькоЦифры(ПравЧисло)) ТОгда
        АктиввироватьДОлю();
        Возврат;
    Конецесли;    
        
КонецПроцедуры