Имя: Пароль:
1C
 
Как сократить количество записей в РС?
,
0 RomaH
 
naïve
13.06.18
14:02
Суть
Тер. Фонд ОМС раз 6 в год обновляет НСИ для работы в системе ОМС
и есть там табличка на 70 метров в XML (только коды) 500 000 записей

для случая лечения определяется какая версия НСИ для него должна использоваться, а потом надо найти запись по ключевым реквизитам этого случая лечения из этих 500 000

записи я храню в РС : https://www.dropbox.com/s/dkavy01nl9rmajd/2018-06-13_13h45_43.png?dl=0

проблема:
со временем в РС образовалось 40 000 000 записей

но практически 98% из них различаются только по ключу НСИ

вот как организовать хранение что бы можно было сократить количество записей/избавиться от дублей?
1 formista2000
 
13.06.18
14:06
Загнать одинаковые в справочник, а в регистре указывать только связь с НСИ?
2 МихаилМ
 
13.06.18
14:09
что такое нси
3 piter3
 
13.06.18
14:10
(2) нормативно-справочная информация
4 RomanYS
 
13.06.18
14:10
Если есть полный список актуальных, то очищай регистр перед его загрузкой.
5 Cool_Profi
 
13.06.18
14:11
(2) Нормативно-справочная информация. Стыдо не знать такого
6 RomaH
 
naïve
13.06.18
14:20
(4) очищать - не вариант, может быть случай пересчета случая лечения год и два назад

(1) а наоборот если - только не догоняю как

сделать справочник "Варианты сочетаний НСИ"

т.е. при загрузке - ищу запись по ключу (исключая НСИ)
если есть - то в "Варианты" из записи добавляем в неё в ТЧ НСИ

если не нашли - создаю новую запись "Варианты" - и добавляю в неё НСИ, и создаю новую запись в РС
7 RomaH
 
naïve
13.06.18
14:21
(1) они все разные как можно заметить по составу измерений в РС
т.е. при таком варианте остануться все теже 40 000 000 записей
8 МихаилМ
 
13.06.18
14:21
для названия реквизита очень странно.

создавать рс только с измерениями - делитантизм
9 RomaH
 
naïve
13.06.18
14:23
(8) предлагаешь справочник?
10 anatoly
 
13.06.18
14:33
(8) от слова "дИлЕтант"? ))
11 lodger
 
13.06.18
14:43
что-то не так с архитектурой решения. может все таки ваше "НСИ" это не одно измерение? может не одно, может и не только измерение?
разложите перед собой наборы входящих данных, и что от регистра требуется.
12 Tateossian
 
13.06.18
14:44
(10) Мне тоже кажется, что Диагноз и прочее - это все ресурсы. По идее, НСИ можно хранить как Период, а само НСИ - в ресурсы. И у тебя будет срез на дату и номер НСИ.
13 RomaH
 
naïve
13.06.18
14:47
(12) и как мне 50 000 в одно измерение засунуть?
14 RomaH
 
naïve
13.06.18
14:48
измерение - это же ключ записи - с одинаковым ключем нельзя

или я глючу?
15 Tateossian
 
13.06.18
14:50
(13) ДатаМайнинг. Пишешь запрос, выкидываешь НСИ, группируешь по различные - смотришь, сколько схлопнулось.
16 RomaH
 
naïve
13.06.18
14:50
(12) НСИ можно как период - а толку? заменим ссылочный тип на простой в измерении, но добавим ресурс ссылочного
17 Tateossian
 
13.06.18
14:51
(14) С набором измерений - ключ - это структура.
18 RomaH
 
naïve
13.06.18
14:51
(15) схлопнется 98%

но мне надо получить действующие для НСИ
19 RomaH
 
naïve
13.06.18
14:52
(17) ИМХается мне, ты фигню какую-то постишь
20 Tateossian
 
13.06.18
14:52
(16) У тебя итоговые будут таблицы только. Разумеется, при загрузке XML анализируется и повторные записи исключаются.
21 Tateossian
 
13.06.18
14:53
(19) Имхается, у тебя решение кривое. И аукнулось это спустя N лет.
22 olegves
 
13.06.18
14:54
(10) не угадал, возможно, он так величает жителей столицы Индии :))
23 Tateossian
 
13.06.18
14:54
(18) Ну, в ресурсе будешь получать НСИ, которое ввело изменение.
24 RomaH
 
naïve
13.06.18
14:58
(20)
допустим в НСИ 1 - актуальная запись 101
в НСИ 2 - такой записи нет

в НСИ 3 - запись опять есть

покажи мне итоговую таблицу
25 RomaH
 
naïve
13.06.18
15:01
(25) ну ты крут
т.е. я работаю с этим решением 10 лет, а ты вон за 10 минут удаленно видишь, что оно кривое
:)
26 Tateossian
 
13.06.18
15:06
(23) Смотри, сделай как в РАУЗ - все измерения, кроме НСИ. НСИ - ресурс. Это ссылка на справочник. И другой регистр - ключи НСИ. Там измерение - этот ключ, а ресурс - номер НСИ.
27 Tateossian
 
13.06.18
15:07
(25) Ну 10 лет ты новичок был глупый и неопытный и так далеко не смотрел. А сейчас видишь оно проблемы тебе приносит.
28 polosov
 
13.06.18
15:11
29 Tateossian
 
13.06.18
15:18
(24) Сделай хеш версий, храни в ресурсе этот хеш. И справочник с расшифровкой хеша, можно подкрутить регистр. Это как в (23), только чуть сложнее, но оптимальнее.
30 RomaH
 
naïve
14.06.18
11:12
в общем сделал так:
добавил справочник "Вариации НСИ" - его в реквизит РС
и при каждой записи ищу существующие похожие и дополняю справочник вариаций


потом отбор по НСИ - ищем все Вариации содержащие этот НСИ

потом отбор по РС по найденным Вариациям

https://www.dropbox.com/s/qi93luyiwdjjq1v/2018-06-14_11h10_37.png?dl=0
31 RomaH
 
naïve
14.06.18
11:16
ну и код

&НаСервереБезКонтекста
Процедура ЗаполнитьПоНСИНаСервере()

    Набор = РегистрыСведений.НСИ_СоответствиеФКСГИДиагнозов1.СоздатьНаборЗаписей();
    
    Набор.Записать();
    
    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("КСГ",Справочники.НСИ_ФедеральныеКлиникоСтатистическиеГруппы_ст.НайтиПоКоду("343"));
    Запрос.Текст =
    "ВЫБРАТЬ
    |    НСИ_СоответствиеФКСГИДиагнозов.НСИ КАК НСИ,
    |    НСИ_СоответствиеФКСГИДиагнозов.ВидСтационара КАК ВидСтационара,
    |    НСИ_СоответствиеФКСГИДиагнозов.КСГ КАК КСГ,
    |    НСИ_СоответствиеФКСГИДиагнозов.Диагноз КАК Диагноз,
    |    НСИ_СоответствиеФКСГИДиагнозов.ДиагнозДоп КАК ДиагнозДоп,
    |    НСИ_СоответствиеФКСГИДиагнозов.ДиагнозДоп1 КАК ДиагнозДоп1,
    |    НСИ_СоответствиеФКСГИДиагнозов.ПростаяМедицинскаяУслуга КАК ПростаяМедицинскаяУслуга,
    |    НСИ_СоответствиеФКСГИДиагнозов.Пол КАК Пол,
    |    НСИ_СоответствиеФКСГИДиагнозов.ВозрастнаяКатегория КАК ВозрастнаяКатегория,
    |    НСИ_СоответствиеФКСГИДиагнозов.Профиль КАК Профиль,
    |    НСИ_СоответствиеФКСГИДиагнозов.КатегорияДлительности КАК КатегорияДлительности,
    |    НСИ_СоответствиеФКСГИДиагнозов.ДКК КАК ДКК
    |ИЗ
    |    РегистрСведений.НСИ_СоответствиеФКСГИДиагнозов КАК НСИ_СоответствиеФКСГИДиагнозов
    |ГДЕ
    |    НСИ_СоответствиеФКСГИДиагнозов.ВидСтационара <> ЗНАЧЕНИЕ(Перечисление.ПоликлиникаСтационар.ПустаяСсылка)
    |    И НСИ_СоответствиеФКСГИДиагнозов.ВидСтационара = ЗНАЧЕНИЕ(Перечисление.ПоликлиникаСтационар.ДневнойСтационар)
    |
    |УПОРЯДОЧИТЬ ПО
    |    НСИ_СоответствиеФКСГИДиагнозов.НСИ.ДатаНачалаДействия
    |ИТОГИ ПО
    |    НСИ";
    
    ВыборкаНСИ = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"НСИ");
    
    Пока ВыборкаНСИ.Следующий() Цикл
        
        Выборка = ВыборкаНСИ.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            
            Запись = РегистрыСведений.НСИ_СоответствиеФКСГИДиагнозов1.СоздатьМенеджерЗаписи();
            
            ЗаполнитьЗначенияСвойств(Запись,Выборка);
            
            Запись.Прочитать();
            
            Если Запись.Выбран() Тогда
                
                ВариацияНСИ = Запись.ВариацияНСИ;
                
                ТаблицаНСИ = ВариацияНСИ.ДействуетДляНСИ.Выгрузить();
                СтрокаНСИ = ТаблицаНСИ.Добавить();
                СтрокаНСИ.ВерсияНСИ = ВыборкаНСИ.НСИ;
                
                ВариацияНСИ = ПолучитьВариациюНСИ(ТаблицаНСИ);
                
                Запись.ВариацияНСИ = ВариацияНСИ;
                
                Запись.Записать();
                
            Иначе
                
                ВариацияНСИ = Справочники.ВариацииНСИ.СоздатьЭлемент();
                ТаблицаНСИ = ВариацияНСИ.ДействуетДляНСИ.Выгрузить();
                
                СтрокаНСИ = ТаблицаНСИ.Добавить();
                СтрокаНСИ.ВерсияНСИ = ВыборкаНСИ.НСИ;
                
                ВариацияНСИ = ПолучитьВариациюНСИ(ТаблицаНСИ);
                
                ЗаполнитьЗначенияСвойств(Запись,Выборка);
                
                Запись.ВариацияНСИ = ВариацияНСИ;
                
                Запись.Записать();
                
            КонецЕсли;
            
        КонецЦикла;
        
        
    КонецЦикла;
    
        
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьВариациюНСИ(Знач ТаблицаНСИ)
    
    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("ТаблицаНСИ",    ТаблицаНСИ);    
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ТаблицаНСИ.ВерсияНСИ КАК ВерсияНСИ
    |ПОМЕСТИТЬ втТаблицаНСИ
    |ИЗ
    |    &ТаблицаНСИ КАК ТаблицаНСИ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ВариацииНСИДействуетДляНСИ.ВерсияНСИ КАК ВерсияНСИ,
    |    ВариацииНСИДействуетДляНСИ1.Ссылка КАК Ссылка1
    |ПОМЕСТИТЬ втУмножение
    |ИЗ
    |    втТаблицаНСИ КАК ВариацииНСИДействуетДляНСИ
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариацииНСИ.ДействуетДляНСИ КАК ВариацииНСИДействуетДляНСИ1
    |        ПО (ИСТИНА)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВариацииНСИ.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.ВариацииНСИ КАК ВариацииНСИ
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |            ЕСТЬNULL(втУмножение.Ссылка1, ВариацииНСИДействуетДляНСИ.Ссылка) КАК Ссылка1
    |        ИЗ
    |            втУмножение КАК втУмножение
    |                ПОЛНОЕ СОЕДИНЕНИЕ Справочник.ВариацииНСИ.ДействуетДляНСИ КАК ВариацииНСИДействуетДляНСИ
    |                ПО втУмножение.Ссылка1 = ВариацииНСИДействуетДляНСИ.Ссылка
    |                    И втУмножение.ВерсияНСИ = ВариацииНСИДействуетДляНСИ.ВерсияНСИ
    |        ГДЕ
    |            (ВариацииНСИДействуетДляНСИ.Ссылка ЕСТЬ NULL
    |                    ИЛИ втУмножение.Ссылка1 ЕСТЬ NULL)) КАК Исключаемые
    |        ПО (Исключаемые.Ссылка1 = ВариацииНСИ.Ссылка)
    |ГДЕ
    |    Исключаемые.Ссылка1 ЕСТЬ NULL";
    
    РезультатЗапроса = Запрос.Выполнить();    
    
    ВыборкаВариаций = РезультатЗапроса.Выбрать();
    
    Если ВыборкаВариаций.Следующий() Тогда
        ВариацияНСИ = ВыборкаВариаций.Ссылка;    
    Иначе
        НоваяВариацияНСИ = Справочники.ВариацииНСИ.СоздатьЭлемент();
        НоваяВариацияНСИ.ДействуетДляНСИ.Загрузить(ТаблицаНСИ);
        НоваяВариацияНСИ.Записать();
        ВариацияНСИ = НоваяВариацияНСИ.Ссылка;
    КонецЕсли;
    
    Возврат ВариацияНСИ;
    
КонецФункции

Закон Брукера: Даже маленькая практика стоит большой теории.