Вход | Регистрация


1С:Предприятие ::

Метки: 

Как сократить количество записей в РС?

Я
   RomaH
 
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% из них различаются только по ключу НСИ

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

(1) а наоборот если - только не догоняю как
сделать справочник "Варианты сочетаний НСИ"

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

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

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

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

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

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

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

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

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

https://www.dropbox.com/s/qi93luyiwdjjq1v/2018-06-14_11h10_37.png?dl=0
   RomaH
 
31 - 14.06.18 - 11:16
ну и код
&НаСервереБезКонтекста
Процедура ЗаполнитьПоНСИНаСервере()

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

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

    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ВариацииНСИДействуетДляНСИ.ВерсияНСИ КАК ВерсияНСИ,
    |    ВариацииНСИДействуетДляНСИ1.Ссылка КАК Ссылка1
    |ПОМЕСТИТЬ втУмножение
    |ИЗ
    |    втТаблицаНСИ КАК ВариацииНСИДействуетДляНСИ
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариацииНСИ.ДействуетДляНСИ КАК ВариацииНСИДействуетДляНСИ1
    |        ПО (ИСТИНА)
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

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





Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует