Имя: Пароль:
1C
1С v8
Ошибки нумерации документов.
0 Падаван в среде 1с
 
10.12.13
11:09
Доброе утро. Проблема такого плана.

В УТ 10.3 добавили префиксы (если в документах Авансовый отчет, ПсотуплениеТУ,реализация, ПКО и РКО стоит флаг БУ - то префкса нет, если стоит флаг БУ не стоит, но стоит флаг УУ, то есть префикс АФ).

Создали дополнительную подписку на событие: Перед записью - в источнике указали все перечисленные выше документы. Процедуры выглядит следующим образом:

Если НЕ Источник.ПометкаУдаления Тогда
        Если Источник.ОтражатьВБухгалтерскомУчете Тогда
            Префикс = СокрЛП(ЗСГлобальныеМетоды.ЗСПолучитьЗначениеПеременной("ЗС_ПрефиксБухУчета"));
            ПрефиксПр = Префикс;
            Попытка
                Проверка = Число(Префикс);
            Исключение
            КонецПопытки;
            Если (ТипЗнч(Источник) = Тип("ДокументОбъект.ПриходныйКассовыйОрдер") ИЛИ ТипЗнч(Источник) = Тип("ДокументОбъект.РасходныйКассовыйОрдер"))И  Проверка=0 Тогда
                Префикс = "";
                ПрефиксПр = Префикс + Источник.Касса.Префикс+"0";
            КонецЕсли    
        Иначе
            Префикс = СокрЛП(ЗСГлобальныеМетоды.ЗСПолучитьЗначениеПеременной("ЗС_ПрефиксУпрУчета"));
            Если (ТипЗнч(Источник) = Тип("ДокументОбъект.ПриходныйКассовыйОрдер") ИЛИ ТипЗнч(Источник) = Тип("ДокументОбъект.РасходныйКассовыйОрдер")) Тогда
                ПрефиксПр = ""+Префикс + Источник.Касса.Префикс;
            КонецЕсли
        КонецЕсли;
    Иначе
        Префикс = "_";
        ПрефиксПр = Префикс;
    КонецЕсли;

    ТекущийПрефикс = Лев(Источник.Номер,СтрДлина(ПрефиксПр));
    Если ТекущийПрефикс = ПрефиксПр Тогда
        Возврат;
    КонецЕсли;
    РИБ = ПараметрыСеанса.ИспользованиеРИБ;
    ПрефиксУзла = ПараметрыСеанса.ПрефиксУзлаРаспределеннойИнформационнойБазы;
    ПараметрыСеанса.ИспользованиеРИБ = Истина;
    ПараметрыСеанса.ПрефиксУзлаРаспределеннойИнформационнойБазы = СокрЛП(Префикс) + ПрефиксУзла;
    
    Источник.УстановитьНовыйНомер();
    ПараметрыСеанса.ИспользованиеРИБ = РИБ;
    ПараметрыСеанса.ПрефиксУзлаРаспределеннойИнформационнойБазы = ПрефиксУзла;
    


Поясню его.Сначала проверяется не помечен ли на удаление документ, если помечен, то префикс будет "_", иначе проверяется наличие флагов БУ и УУ и получается префикс.

В документах ПКО и РКО есть еще префиксы касс! поэтому пришлось добавить дополнительную проверку на эти документы.

Проверка на префикс БУ (преобразование в число) сделана для того,чтобы проверить не пустой ли префикс(если префикс не указывать,оставить пустое поле, то непонятно откуда берется значение(ставится префикс, которого нет в базе, или когда-то был)).


Далее идет проверка(если префикс не изменился, то номер не меняем, иначе формируем новый номер, чтобы не получать ошибки типа : Номер не уникален).

Присвоение префикса через префикс РИБ(подсмотрел это код на этом форуме) реализовано для того,чтобы не потерять наш префикс, дело в том, что функция УстановитьНовыйНомер очищает префикс(ей пофик что мы там передали, она все равно очистит его или установит из перфикса организации).

В общем код работает. Но проблема возникла на документе ПКО.

Ставлю флаг УУ - основная касса - документ запсиался, номер сформировался верно (префикс УУ = АФ, префикс кассы = АФ, итого у документа префикс АФАФ).

Ставлю флаг БУ - основная касса - документ записался, но вот номер неверно софрмировался префикс стал АФУУ (АФ - префикс кассы - ВЕРНО, у БУ префикс 00(в коде выше видно,что он в пустую строку переводится дя ПКО и РКО) - ВЕРНО, а вот откуда берется префикс УУ - вопрос).

Поисками нашел, что подобный префикс стоит у другой кассы - но если выбрать ее, то номер формируется отлично (будет просто префикс УУ).


В отладчике смотел формирование номера - после процедуры: ПриУстановкеНовогоНомераДокументаПриУстановкеНовогоНомера префикс верный, а вот как покидаем процедуру и возвращаемся, то номер уже содержит другой префикс - собственно вопрос - что происходит после процедуры ПриУстановкеНовогоНомераДокументаПриУстановкеНовогоНомера ? Подскажите пожалуйста (т.к. УстановитьНовыйНомер - функция платформы, то есть предположение, что код найти нельзя, но хочется понять,откуда берется "лишний" префикс)

Надеюсь мозг не взорвал:)
1 х86
 
10.12.13
11:14
(0)вот реально проще отладчиком пройтись чем писать километры сабжа
2 НЕА123
 
10.12.13
11:17
(0)
много букв.
длина сформированных префиксов разная?
3 Падаван в среде 1с
 
10.12.13
11:25
Не длина, сами префиксы. Если кратко - то непонятно откуда берется лишний префикс.


Т.е. в процедуру УстановитьНовыйНомер уходит префикс АФ, а возвращается АФУУ (УУ берется непонятно откуда)
4 acsent
 
10.12.13
11:28
(3) последний номер был с уу
5 Падаван в среде 1с
 
10.12.13
11:38
Нет. В списке на данный момент (после групповой перенумерации) с УУ вообще ничего нет.

УУ есть у документов, у которых снят флаг БУ (еще раз обращу внимание, что это разная нумерация, с БУ и без БУ).

В итоге последний документ у которого есть флаг БУ имеет номер: АФ000000039, этот после записи получает номер: АФУУ0000084 (т.е. как-будто продолжается чужая номерация, та, где нет флага БУ)
6 Падаван в среде 1с
 
10.12.13
11:39
(5) , УУ - это в данном контексте префикс (управленческий учет я подразумеваю фразой: без БУ)
7 Maxus43
 
10.12.13
11:45
>>Создали дополнительную подписку на событие: Перед записью

Всё не читал, ошибка в этом.

Префикс должен устанавливаться при созданиии документа, постоянно меняющиеся номера документов это адский бардак.
Имхо
8 Maxus43
 
10.12.13
11:48
ну и Источник.УстановитьНовыйНомер(Префикс);
9 Падаван в среде 1с
 
10.12.13
11:56
(7) странно, я думал что любой номер именно перед записью формируется.
(8) надо было прочитать) Не использовал из-за того,что эта конструкция игнорирует префикс(дальше он очистится)
10 acsent
 
10.12.13
11:57
(5) все таки есть с уу?
Делай тогда префикс АФ0
11 acsent
 
10.12.13
11:58
У тебя один префикс есть часть другого префикса. А так нельзя
12 Maxus43
 
10.12.13
12:01
(9) >>странно, я думал что любой номер именно перед записью формируется.
Он формируется при специальном событии ПриУстановкеНовогоНомера, и типовая подписка по установке оного так и называется
13 Maxus43
 
10.12.13
12:04
>>Не использовал из-за того,что эта конструкция игнорирует префикс(дальше он очистится)
именно в типовой подписке он и чистится скорей всего, она срабатывает после Источник.УстановитьНовыйНомер()
14 Падаван в среде 1с
 
10.12.13
12:08
(10) Эту мысль я почему-то до конца не довел.  Т.е. в коде у меня есть такая строчка:

ПрефиксПр = Префикс + Источник.Касса.Префикс+"0";

Но использовал я ее только для проверки, в установке нового префикса я использовал префикс без "0".

(12) Да, я в модуле документа создавал эту процедуру и там устанавливал префикс - все равно игнорировалось.

Чистится во время выполнения Источник.УстановитьНовыйНомер()

Я писал,что попадает после этого в процедуру ПриУстановкеНовогоНомераДокументаПриУстановкеНовогоНомера и вот после нее уже получаю новый префикс (после нее по кнопке F11 никуда не попадаю, а сразу возвращаюсь с уже сформированным номером)
15 НЕА123
 
10.12.13
13:42
может оно?

Режим автонумерации объектов
Определяет, переиспользовать или нет автоматически полученные номера (кодов) объектов, если они не записаны в базу данных.
Если выбрано значение Освобождать автоматически - номер вне транзакции освобождается автоматически. При откате транзакции номера освобождаются автоматически вне зависимости от режима автонумерации объектов. Не освобождать автоматически - номер не освобождается автоматически.