Имя: Пароль:
1C
1С v8
Одинаковые коды справочника
,
0 Угрюмый73
 
02.10.18
11:25
Добрый день. Платформа 8.3.11 конфигурация Бухгалтерия 3.0, сервер SQL 2008 (пользователей около 150). В конфигурацию добавлен справочник, контроль уникальности номера отключен. При генерации номера запросом определяется количество элементов, добавленных за данное число; номер = количество()+1. Так вот, периодически появляются дубли номеров, когда пользователи одновременно записывают элементы данного справочника. При этом, подпиской "ПриЗаписи" осуществляется запись в независимый регистр сведений, где код справочника является составляющей частью ресурса регистра. При этом, при записи в регистр в менеджере записи стоит контроль с помощью запроса уникальности данного ресурса. Но контроль также не срабатывает и в регистре сведений появляются записи с одинаковым значением ресурса. Понимаю, что решение связано с применением блокировок. Но данную тему только начал изучать. Во-избежании печальных результатов экспериментов на рабочей базе, может подскажете текст решения, чтобы избежать отказов при программной записи элементов справочника?
1 Гипервизор
 
02.10.18
11:54
Разрешите поинтересоваться в цельях повышения образованности - а почему "контроль уникальности номера отключен"?
2 бомболюк
 
02.10.18
12:05
Лучше всего наверное заменить справочник на документ с периодичностью нумерации "В пределах дня". Иначе считывать количество элементов и записывать новый элемент надо в транзакции с наложением эксклюзивной блокировки.
3 ASU_Diamond
 
02.10.18
12:08
(0) нах... для чего всё это сделано?
4 d4rkmesa
 
02.10.18
12:09
(0) В типовых делается с блокировкой. К примеру(из УТ10/УПП):

// Записывает в журнал регистрации событие записи ЭД.
//
// Параметры:
//  СсылкаНаЭД - ссылка на элемент справочника ЭДПрисоединенныеФайлы.
//
Процедура ЗаписатьСобытиеЖурналаРегистрацииПоОбменуЭД(СсылкаНаЭД)
    
    Если ТипЗнч(СсылкаНаЭД) = Тип("СправочникСсылка.ЭДПрисоединенныеФайлы") Тогда
        
        УстановитьПривилегированныйРежим(Истина);
        
        НачатьТранзакцию();
        
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЖурналСобытийЭД");
        ЭлементБлокировки.УстановитьЗначение("ПрисоединенныйФайл", СсылкаНаЭД);
        Блокировка.Заблокировать();
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ЕСТЬNULL(МАКСИМУМ(ЖурналСобытийЭД.НомерЗаписи), 0) + 1 КАК НомерЗаписи
        |ИЗ
        |    РегистрСведений.ЖурналСобытийЭД КАК ЖурналСобытийЭД
        |ГДЕ
        |    ЖурналСобытийЭД.ПрисоединенныйФайл = &ПрисоединенныйФайл";
        Запрос.УстановитьПараметр("ПрисоединенныйФайл", СсылкаНаЭД);
        НомерЗаписи = Запрос.Выполнить().Выгрузить()[0].НомерЗаписи;
        
        МенеджерЗаписи                    = РегистрыСведений.ЖурналСобытийЭД.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.ПрисоединенныйФайл = СсылкаНаЭД;
        МенеджерЗаписи.НомерЗаписи        = НомерЗаписи;
        МенеджерЗаписи.ВладелецЭД         = СсылкаНаЭД.ВладелецФайла;
        МенеджерЗаписи.СтатусЭД           = СсылкаНаЭД.СтатусЭД;
        МенеджерЗаписи.Дата               = ТекущаяДатаСеанса();
        МенеджерЗаписи.Пользователь       = ПараметрыСеанса.ТекущийПользователь;
        МенеджерЗаписи.Ответственный      = СсылкаНаЭД.Ответственный;
        МенеджерЗаписи.Комментарий        = СсылкаНаЭД.Описание;
        МенеджерЗаписи.Записать();
        
        ЗафиксироватьТранзакцию();
        
    КонецЕсли;
    
КонецПроцедуры
5 unregistered
 
02.10.18
12:11
(3) Страшно даже подумать - для чего такой бред может понадобиться...
6 d4rkmesa
 
02.10.18
12:14
(5) Ну, к примеру, при отсылке сообщений куда-нибудь требуется их нумеровать по порядку, в пределах указанного вида сообщений/периода/совокупности измерений и т.д..
7 dmitn
 
02.10.18
12:17
(0) С какой целью отключен контроль уникальности номера?
8 Угрюмый73
 
02.10.18
12:23
(1),(3),(7) Для реализации уникальности номера в пределах дня. Понимаю, что требование нумерации элементов в пределах дня можно было реализовать, например, отдельным реквизитом. Но, это уже сделано...
9 unregistered
 
02.10.18
12:31
(6) > нумеровать по порядку, в пределах указанного вида сообщений/периода/совокупности измерений и т.д..

Ты всерьез считаешь, что вот этот бред "номер = количество()+1" можно отнести к тому о чем ты говоришь?... )))
10 Угрюмый73
 
02.10.18
12:37
(9) Может подскажете правильное и красивое решение создание уникальной нумерации элементов справочника в пределах дня?
11 unregistered
 
02.10.18
12:40
(8)(10) > Для реализации уникальности номера в пределах дня

Для этого есть документы. Зачем было делать справочник?...
Писать свой нумератор - тупиковый путь развития. Постоянно будете сталкиваться со сбоями в нумерации. Не говоря уже о вопросах изменения номера в случае изменения даты, к которой привязан элемент.
12 Лефмихалыч
 
02.10.18
12:48
(1) скучно, видимо
13 Лефмихалыч
 
02.10.18
12:49
(8) оооох**еть
не встать
14 Лефмихалыч
 
02.10.18
12:49
справочник... уникальность в пределах ДНЯ...
охенительно
15 Угрюмый73
 
02.10.18
13:22
(4) Спасибо. Жаль, что форум все больше стал напоминать сборище троллей...
16 unregistered
 
02.10.18
13:57
(15) Если под троллями понимать "специалистов", не умеющий принимать правильные методические решения при разработке, то полностью с тобой согласен. Дебилов с "альтернативным", сука, мышлением с каждым днём становится всё больше и больше.