Имя: Пароль:
1C
 
1cV8: справочник или периодический регистр сведений?
Ø
0 Abel
 
15.09.05
10:21
Пытаемся с коллегами разобраться, что предпочтительнее использовать Справочник или Периодический регистр сведений. Положили одни и те же данные в Справочник и Регистр, сделали Запросы к ним и через SQLProfiler посмотрели sql-скрипты. Скрипты идентичны абсолютно, разница лишь в том, что при создании Регистра созданы индексы по измерениям, датам и т.п. А по справочникам индексы созданы только для Наименования, Кода и Родителя. Поскольку рекомендуется использовать запросы,а не объектную модель при работе с регистром, то возникает вопрос почему бы не использовать в подавляющем большинстве случаев вместо регистра справочник.
1 homutke
 
15.09.05
10:28
все определяеся твоим желание , при желаниии документы и регистры на базе справочников сделать можно :). Только гемороя побольше , но функционал будет зато :)
2 User256
 
15.09.05
10:42
Даже если нет разницы в производительности, это разные объекты
Например на запись регистра не может быть ссылок, иногда это + иногда -, от этого во многом зависит что выбрать справочник или регистр.
Кроме того писать в запросе СрезПоследних() намного удобнее чем писать отдельный подзапрос, так запрос удобнее читать и понимать.
3 Abel
 
15.09.05
10:43
Насколько мы поняли, разработчикам 1С на учебных курсах вбивают в голову, что регистры рулят, а справочники нет. И быстрее они и идеологически более правильно их использовать. Насчет гемороя... да он будет, но при этом снимаются ограничения накладываемые использованием регистра.
Рассмотрим пример: есть ответственный квартиросьемщик и есть члены семьи. Нужно отслеживать время проживания в квартире членов семьи. Можно создать ПРС с измерением Квартиросъемщик и ресурс ЧленСемьи. При этом необходим некий третий параметр (измерение) для того чтоб занести нескольких членов семьи. Минус такого решения так же в том, что нужно еще отслеживать состояние живет или нет (измерением или ресурсом). В справочнике же достаточно четырех полей: квартиросъемщик, член, датаЗаселения и датаВыселения
4 User256
 
15.09.05
10:51
В регистре сведений тоже достаточно 3 полей
Измерения:
Квартиросъемщик ЧленСемьи
Ресурс
Живет- булево
Я начинаю сомневаться в правильности ваших замеров
5 User256
 
15.09.05
10:56
Немного поразмыслив пришел к выводу что вы предлагаете полнейший изврат.
1.ЧленСемьи вселился создаем запись в справочнике с открытой датой выселения
2.Выселился НАХОДИМ ЭТОТ ЭЛЕМЕНТ СПРАВОЧНИКА и записываем туда дату выселения
3.Он снова вселился ..... создаем новый элемент
4.При этом надо отслеживать чтобы периоды элементов не пересекались, иначе будет удвоение срока проживания
5.ужас, руки за такое надо отрывать
6 Abel
 
15.09.05
10:57
А разве что то писалось про замеры?
В регистр запихнуть мой пример разумеется можно, при этом в справочнике для анализа периода проживания достаточно выбрать одну запись, тогда как в регистре их уже нужно будет две
7 User256
 
15.09.05
11:01
если бы это была 7.7. В которой не было SQL запросов такое решение может быть и имело бы право на жизнь. Ну или если у вас где-нибудь 10^9 запией
и член может вселиться только 1 раз.
8 Abel
 
15.09.05
11:02
1) Чем плоха открытая дата выселения.. Живет себе человек, никому не
мешает.
2) Найти запись проблема?
3) Или может нужны большие усилия для создания новой записи в справочнике?
4) А в регистре типа пересечения периодов не будет. Что мешает сначала занести две записи подряд "вселился" и только потом "выехал"
5) руки коротки
9 User256
 
15.09.05
11:05
Ладно не будем пиписьками меряться.
Удачи вам в автоматизайии родного ЖКХ.
10 Мимохожий Однако
 
15.09.05
11:07
(0)Глупости.
11 Abel
 
15.09.05
11:07
Так ведь в "семерке" запросы ваще были неживые и вопрос то задан именно применительно к восьмой версии.
12 Abel
 
15.09.05
11:10
Всё как это не прискорбно малоубедительно. Объяснить прелесть регистра видать не дано...
13 Мимохожий Однако
 
15.09.05
11:11
(0)Более внимательное изучение предназначения справочников и регистров сведений неминуемо приведет Вас к отказу от подобного подхода. Вам , возможно, сложно изучить возможности нового объекта. Очень помогают виртуальные таблицы регистра. Если продолжить Вашу мысль, то не проще ли в таблицы Экселя собрать списочек?
14 Abel
 
15.09.05
11:16
Откуда у вас такая уверенность, что виртуальные таблицы создаются при адресном запросе к регистру (т.е. получение конкретной записи регистра). Так написали разработчики 1с? Не поленитесь посмотрите sql-запросы.
Запрос к справочнику:
ехес sp_ехесutesql N'SELECT
_Reference13_Q_000_T_001._Description f_1
FROM
_Reference13 _Reference13_Q_000_T_001 WITH(NOLOCK)
WHERE
_Reference13_Q_000_T_001._Description LIKE @P1
SELECT @@TRANCOUNT', N'@P1 nvarchar(5)', N'%алх%'
Запрос к регистру:
ехес sp_ехесutesql N'SELECT
_InfoReg1996_Q_000_T_001._Fld1999 f_1
FROM
_InfoReg1996 _InfoReg1996_Q_000_T_001 WITH(NOLOCK)
WHERE
_InfoReg1996_Q_000_T_001._Fld1999 LIKE @P1
SELECT @@TRANCOUNT', N'@P1 nvarchar(4)', N'%алх%'
15 Мимохожий Однако
 
15.09.05
11:22
(14) Ну не надо так расстраиваться.:0)
Делайте так как Вы поняли. ... или не делайте.
Практика лучшее доказательство
16 snc1
 
15.09.05
11:56
Есть две методики - ввод в справочники/регистры при помощи документов и вручную.
И только если у Вас с помощью документов (что в принципе правильно), то нужно выбирать только регистр, т.к. при перепроведении по справочникам старые действия автоматом НЕ ОТМЕНЯЮТСЯ.
17 homutke
 
15.09.05
12:05
to 16 не правда ваша дяденька, если вы хотите делать отмену каких либо действий в справочниках ( если они заменяют регистр сведений ), то просто надо использовать ПередУдалением (BeforeDelete) или ОбработкаУдаленияПроведения (UndoPosting) или ОбработкаПроведения (Posting) и вычищать или перезаполнять не нужные справочники.
18 alexii
 
15.09.05
12:24
(17) 16 писал: "...старые действия автоматом НЕ ОТМЕНЯЮТСЯ"
ключевое словл автоматом.
19 snc1
 
15.09.05
12:28
(17) Ну у меня то опыта побольше...
Подумайте над словом "Перепроведение".
Это значит был проведен док с элементом1, а потом зашли, изменили на элемент2 и перепровели.
Спрашивается почему не вызывается ОбработкаУдаленияПроведения ? Ошибка двух платформ? (в 7.7 тоже самое)
20 homutke
 
15.09.05
12:37
(19) Подумайте над пунктом ОбработкаПроведения (Posting) если вы храните в справочнике какую либо периодическую информацию ( например Цену и документ который это сделал в табличной части ) и хотите , что бы она при перепроведенеии вашего документа изменялась, то программист с опытом сначала сделает отбор по табличной части справочника с фильтром по документу вытрет все ссылки ,а только потом запишет новую информацию.
21 Denk
 
15.09.05
12:40
(19) Для "перепроведения" в (17) упоминается об "ОбработкаПроведения", кроме того можно запретить менять элементы без отмены проведения
В 7.7 есть УстановитьРеквизитСправочника()
22 snc1
 
15.09.05
12:55
(20) При чем тут изменение цены, если я говорю об изменении самого элемента справочника. Как Вы его проведение будете отменять, если при перепроведении не вызывается ОбработкаУдаленияПроведения ? Можно сначала отменить проведение, а потом провести, но это уже ручная работа.
(21) Я имел ввиду обычные реквизиты (без галочки периодический)
23 homutke
 
15.09.05
13:39
(20) какое проведение справочника ? Вы все одну кучу начали сваливать см (0)
24 snc1
 
15.09.05
14:58
(23) Не проведение справочника, а изменение реквизита документа типа справочник в проведенном документе. Вы непонимаете потому что этого никогда не делали. А Ваше предложение в (20) не сработает, т.к. в ОбработкеПроведения у Вас реквизит документа типа справочник уже будет установлен в элемент2 и у Вас неполучится "вытереть" все ссылки в элементе1, так как Вы не будете знать что до элемента1 был элемент2, если, конечно, не заниматься сохранением всех реквизитов документа до перепроведения - но это будет очень КРИВО! Готов ли автор (0) к этому? Нет, конечно. Он лучше будет вручную редактировать справочники, чем делать это с помощью документов!
Поэтому моя основная мысль осталась (для тех кто это понимает):
Если изменение вручную - то справочники вполне подойдут, а также ПРС.
Если изменение документами, то ТОЛЬКО РЕГИСТРЫ!
25 homutke
 
15.09.05
15:45
Вот написал за 5 минут хранение изменений справочника , документами. Два справочника один подчинен другому у подчиненного два реквизита реквизита Цена и Регистратор. При проведении ищем ссылки удаляем их и записываем новое значение цены.
Процедура ОбработкаПроведения(Отказ, Режим)
  Запрос = Новый Запрос(
  "ВЫБРАТЬ
  | ИсторияЦены.Ссылка
  |ИЗ
  | Справочник.ИсторияЦены КАК ИсторияЦены
  |
  |ГДЕ
  | ИсторияЦены.Регистратор = &Регистратор");
  
  Запрос.УстановитьПараметр("регистратор" , Ссылка);
  результат = Запрос.Выполнить();
  если не результат.Пустой() тогда
    Выборка = результат.Выбрать();
    Пока Выборка.Следующий() Цикл
     УдаляемССылку = Выборка.Ссылка.ПолучитьОбъект()
         УдаляемССылку.Удалить();
    КонецЦикла;
  КонецЕсли;
  
  ССылкаНаЦену = Тест.получитьОбъект();
  Новаязапись = Справочники.ИсторияЦены.СоздатьЭлемент();
  Новаязапись.Владелец = Тест;
  Новаязапись.Регистратор = Ссылка;
  Новаязапись.Цена = Цена;
  Новаязапись.Записать();
КонецПроцедуры