1с при создании нового документа и отказа от его записи номер документа

Обновлено: 07.07.2024

Особенности работы механизма автонумерации

Механизм автонумерации в "1С:Предприятии 8.1" имеет целью обеспечить более эффективную и предсказуемую работу с номерами, по сравнению с механизмом автонумерации предыдущей версии платформы.

В "1С:Предприятии 8.1" реализован специальный менеджер автонумерации, который отвечает за выдачу номеров. Использование менеджера автонумерации позволяет существенно повысить параллельность работы за счет отсутствия блокировок базы данных.

Существуют две возможные стратегии нумерации для разных категорий объектов:

  • для объектов, требующих непрерывной нумерации, - нумерация при записи с поддержкой заполнения пропусков в нумерации, образующихся при откатах транзакций;
  • для объектов, не требующих непрерывной нумерации, - нумерация при открытии формы, но без какого-либо переиспользования номеров.

Режимы автонумерации

Механизм автонумерации позволяет работать в двух режимах: в режиме с возвратом неиспользованных номеров и в режиме без возврата неиспользованных номеров. Режим устанавливается свойством объекта метаданных "Конфигурация" РежимАвтонумерацииОбъектов .

  • Значение данного свойства ОсвобождатьАвтоматически проставляется для ранее созданных конфигураций и используется для обеспечения режима работы нумерации, аналогичного версии 8.0. Полученные автоматически номера и коды будут в дальнейшем использоваться, если объект, для которого они получены, не записан. Этот вариант предполагается использовать для конфигураций, разработанных для версии 8.0 и использующихся в версии 8.1 без изменений.
  • Значение данного свойства НеОсвобождатьАвтоматически используется для поддержки нового режима работы с нумерацией, реализованного в версии 8.1. Этот вариант предполагается использовать для конфигураций, в которых для объектов, требующих непрерывной нумерации, будет реализована нумерация при записи, а не при открытии формы.

Свойство Автонумерация формы объекта (элемента справочника, документа. ) отвечает за автоматическое получение номера при открытии формы. Если в этом свойстве указано значение НеИспользовать, это означает, что при открытии формы номер будет не заполнен и он будет получен автоматически при записи объекта.

Таким образом, для реализации возможных стратегий нумерации рекомендуется использовать следующие значения описанных свойств:

  • для объектов, требующих непрерывной нумерации, - РежимАвтонумерацииОбъектов = НеОсвобождатьАвтоматически, Автонумерация = НеИспользовать ;
  • для объектов, не требующих непрерывной нумерации, - РежимАвтонумерацииОбъектов = НеОсвобождатьАвтоматически, Автонумерация = Авто;
  • для работы механизма автонумерации аналогично версии 8.0 - РежимАвтонумерацииОбъектов = ОсвобождатьАвтоматически , Автонумерация = Авто .

Особенности хранения номеров и использования префиксов

Механизм автонумерации выдает номера в разрезе пространств номеров и префиксов. Пространство номера в зависимости от типа объекта может содержать метаданные, владельца, период и др. В пределах пространства номеров номер выдается в разрезе префиксов. По каждому префиксу хранится максимальный выданный номер, на основании которого выдается следующий номер. Один и тот же максимальный номер может соответствовать нескольким префиксам.

Например, в БД хранится максимальный номер 001. Мы получили очередной номер по префиксу 0, нам вернули 002. Далее мы получили очередной номер по префиксу 00, нам вернули номер 003, т. к. в этом случае максимальный номер соответствует обоим префиксам. Механизм автонумерации учитывает этот факт и изменяет максимальный номер зависимых префиксов соответствующим образом. Следует отметить, что на максимальный номер, соответствующий пустому префиксу, влияет изменение максимального номера по любому префиксу, если он превышает максимальный номер по пустому префиксу. Например, мы по пустому префиксу получили номер 001, далее по префиксу 0 получили номер 002, далее по префиксу А получили номер А01, далее по пустому префиксу получили номер А02, т. к. максимальный номер по пустому префиксу соответствует наибольшему из максимальных выданных номеров.

В режиме автоматического возврата номеров механизм автонумерации по каждому пространству номеров и префиксу хранит список свободных номеров. Номер становится свободным, если он не записан в базу данных, а объект был удален из памяти или после автоматического получения номера номер был установлен явно. Под явной установкой номера подразумеваем любое изменение номера объекта, не связанное с его автоматическим получением. Это может быть программная установка номера через свойство объекта Номер или Код (в зависимости от типа объекта) или заполнение номера в форме объекта вручную. Номер может стать свободным также при откате транзакции.

При получении очередного номера механизм автонумерации сначала ищет свободный номер. Если номер найден, то он удаляется из списка свободных и выдается объекту. Если номер не найден, выполняется увеличение максимального номера и полученный номер выдается объекту. Свободные номера хранятся до перезапуска сервера для серверных информационных баз и до момента закрытия последнего клиентского приложения, работающего с данной информационной базой, для файловых информационных баз. Если необходимо, чтобы номер переиспользовался только в пределах заданного периода (день, месяц), то нужно явно установить номер, больший максимального номера по данному пространству номеров и префиксу. Тогда механизм автонумерации удалит все свободные номера меньше устанавливаемого, и следующий номер будет получен от установленного.

Работа автонумерации в различных режимах

Рассмотрим, как работает механизм автонумерации при первом получении номера, при очередном получении номера, при явной установке номера, при удалении объекта, при изменении реквизитов объекта, касающихся автонумерации, а также при фиксации и откате транзакции.

При первом получении номера по определенному пространству номеров и префиксу выполняется неблокирующее чтение максимального номера из базы данных, т. е. механизм автонумерации использует базу данных для получения максимального номера по определенному пространству номеров и префиксу только один раз.

При последующих попытках получить очередной номер механизм автонумерации использует свободные номера, а также максимальный номер по данному пространству номеров и префиксу, как было описано ранее.

При явной установке номера механизм автонумерации увеличивает максимальный номер, если явно устанавливаемый номер больше максимального, и блокирует все свободные номера меньше явно устанавливаемого номера. Блокированные свободные номера не используются при получении очередного номера. При явной установке номера префикс не указывается, поэтому механизм автонумерации использует уже выданные номера для определения префикса. Для этого по всем префиксам пространства номеров ищется, подходит ли явно устанавливаемый номер под префикс. Если да, то найденный префикс используется при явной установке номера (таких префиксов может быть несколько). Следствием этого алгоритма является то, что явная установка номера может повлиять на выдачу номеров по нескольким префиксам. Например, по префиксу 00 мы получили номер 001, далее по префиксу 0 мы получили номер 002, далее мы установили номер 005, по префиксу 0 будет получен номер 006, а по префиксу 00 будет получен номер 007, т. к. префиксы 0 и 00 являются зависимыми.

При удалении объекта автонумератор уведомляется об этом факте с тем, чтобы если максимальный номер по пространству номеров (или нескольким пространствам номеров), соответствующему удаляемому номеру, еще не был загружен, учесть факт наличия удаляемого номера при загрузке максимального номера.

Некоторые реквизиты объекта могут неявно влиять на номер. Так, например, владелец и родитель справочника, родитель плана вида характеристик, дата документа или бизнес-процесса участвуют в формировании пространства номеров, в рамках которого выдается номер объекта. Их изменение неявно приводит к изменению пространства номеров объекта и эквивалентно тому, как автонумератор реагирует на явную установку номера. Например, имеем справочник с нумерацией в пределах подчинения. Имеем элемент справочника с номером 001, который находится в группе 001. При переносе элемента справочника в группу с номером 002 механизм автонумерации возвращает номер 001 по пространству номеров родителя 001 и выполняет действия по явной установке номера 001 в пространстве номеров родителя 002.

При фиксации транзакции блокированные свободные номера удаляются из списка свободных, а при откате транзакции разблокируются и снова могут использоваться для получения очередного номера.

Восстановление при ошибочно введенном максимальном номере

Механизм автонумерации имеет возможности по восстановлению максимального номера после исправления или удаления неверно введенного максимального номера. Например, имеем текущий максимальный номер АА001, пользователь при вводе документа ошибся и явно ввел номер ААБСД. После этого автонумератор запомнил введенный номер и перестал выдавать корректные номера, все время выдавая номер ААБСД. Пользователь исправил неправильно введенный номер документа на АА002. Поcле этого автонумератор стал выдавать правильные номера - АА003, АА004. Альтернативой исправлению может быть удаление объекта с неверно введенным номером.

Данная возможность избавляет пользователя от проблем, связанных с остановкой сервера или вызовом функции ОбновитьНумерациюОбъектов , которые были необходимы ранее для восстановления нумерации объектов.

В связи с этим прошу посоветовать как можно обходить или решить данную ситуацию. Пока что придумал (но не реализовал) только один механизм: записывать документ с номером (дата-время), в одну секунду документы не записываются как правило в это базе.

(1) b-dm, эмс.. номер присваивается при записи же. у вас нумерация документов какая то особая ? Ну вообщето механизм следующих образом должен работать: вы создаете документ, пока его незаписываете у него нет номера, При записи (удачной) номер автомат проставляется Да-да, spa07 верно говорит. У Вас такие проблемы только с дописанными документами? С типовыми все хорошо? Если так, то смотрите, как настроена нумерация у новых документов? А вообще для своих документов необходимо перенести типовые процедуры работы с номером, типа:
ДобавитьВМенюДействияКнопкуРедактированияНомера
УстановитьДоступностьПоляВводаНомера
ОбновитьПодсказкуКодНомерОбъекта
и т.д. по аналогии с типовыми документами
И ничего придумывать не надо В Бухгалтерии как я увидел это сделано в общем модуле:
МеханизмНумерацииОбъектов.
Сейчас посмотрю как у пользователя получалось создать 2 объекта с одним номером одновременно.
Ну то есть по его слвам как то следующее:
создает документ с номером 1234, а у другого полтьзователя создается документ с таким же номером, но второй пользователь раньше записал документ и теперь первому епольховаетлю надо создавать документ с другим номером) UPD: Галка уникальности у данных документов стоит, странно как то , не могут же они в одну секунду создавать данный документ :) Да даже если и так, то кто то раньше кто то позже. Вот проблема: В настоящее время номер заявке присваивается при ее создании и к моменту окончательного оформления заявки, при нажатии кнопки сохранить заявку,
выдается надпись - "номер не уникален"
в связи с чем сохранение созданной и полностью оформленной заявки становиться невозможным. (9) b-dm, см. п6, если типовые процедуры не довалять, то по умолчанию работает как вы написали: номер создается при создании документа а ни при записи.

Офигеть что я обнаружил:

оказывается в каждой конфигурации есть такое свойство:
Режим автонумерации объектов и 2 значения:
Освобождать автоматически и
Не освобождать автоматически.

Вот интересно, какую опцию лучше ставить и что она реально обозначает.
В типовой Бух стоит по умолчанию "Не освобождать автоматически",
а в Подрядчике например стоит "Освобождать автоматически".

Какой вариант подходит больше в случае присваивания номера документу в момент создания ?

А то пользователи начали жаловаться что пока до кнопки "Записать" доберутся программа пишет:
Номер неуникальный и приходиться пересоздавать документ.

(11) b-dm, освобождать или не освобождать автоматически работает когда удаляешь элементы справочника\документа и тд. чтобы старые (удаленные) номера нельзя было использовать повторно. к твоему вопросу это не относится помоему (12) - где про это почитать можно ? Т.е. если документ под номером 256 помечен на удаление, то этот номер система освобождает, так что ли ?

(21) b-dm, нет, на простом примере:
Создали документ 1, 2, 3.

Документы 2 и 3 пометили на удаление, затем "Удалением помеченных объектов" их удалили из базы полностью. Если стоит признак "Освобождать", то при создании следующего документа он получит номер 2. Если стоит признак "Не освобождать", то номер следующего документа будет 4. В результате у вас в базе не будет документов под номерами 2 и 3 :)

(23) insurgut,
а если пока удаляли уже создали документы и 4 и 5 номерами, будет ли после удаления задействован 2 и 3 номер или присвоется 6 номер? (28) 2791, Прочтите внимательно 23 пост..
Всё зависит от настроек в свойствах конфигурации (29) Bukaska,
прочитав (23) и возник у меня этот вопрос. По ответу (30) в этом случае настройка не имеет значения. (31) 2791, как же не имеет. В случае если признак "Освобождать" стоит и никто документов во время удаления новых не создал, то нумерация продолжиться со 2 номера. Просто вы указали нештатный пример, т.к. удаление помеченных на удаление объектов производится обычно в монопольном режиме. (32) insurgut,
в (31) я имела ввиду именно нештатный пример. Именно для этого примера получается что не имеет. А в нормальном случае конечно имеет. (21) b-dm, вот видите какая бурная переписка возникла.
Не видел, где бы этот механизм описывался.
Исходя из того, о чем была переписка с insurgut, получается, что этот механизм в разных конфигурациях по-разному реализован.
Самое интересное, что с проблемой перенумерации я сталкивался только в бухгалтерии. А вот в УТП такая проблема вообще не возникала.
Просто если конфигурацию открыли для редактирования, то почему бы не попробовать механизм, который есть в той же УТ для конкретного документа.
Вот, кстати, вопрос для обсуждения: авторские права 1С мы так нарушаем, или нет? (24) sbr, конечно нет :) Если конфигурация куплена официально - переписывать вы ее для себя можете вдоль и поперек. Продавать - нельзя :) (25) insurgut, приятно было пообщаться в конечном итоге.
Желаю удачи в нашем нелегком деле.
На этом прощаюсь, тема, думаю, исчерпана.
Еще раз СПС за конструктивную информацию.

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

Зпр = Новый Запрос;
Зпр.Текст ;
Зпр.УстановитьПараметр("Вал",ВалютаДокумента);
Зпр.УстановитьПараметр("Год",Год(Дата));
Рез = Зпр.Выполнить().Выбрать();
Если Рез.Количество() = 0 Тогда
ЭтотОбъект.Номер = "00001";
Иначе
Пока Рез.Следующий() Цикл
Попытка
Ном = Число(Рез.Номер) + 1;
ЭтотОбъект.Номер = Формат(Ном,"ЧЦ=6; ЧВН=; ЧГ=0");
Прервать;
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;

После этого все успокоились, потому что знают - есть кнопочка - выручалочка, которая присвоит номер.
Как вариант может и вам пригодится.

(13) sbr, простите, но вы извращенец :) красивее было бы префикс присваивать, а нумерацию оставить платформе. (15) insurgut,
О, класс!
Заработал себе лейбл - буду использовать!
А что, дорогой, по жизни не приходилось сталкиваться с тем что клиент говорит, что хочу так и хоть потолок пробивай лбом, надо сделать как клиент хочет.
А ему надо чтобы в этом квартале номера валютный счетов с 9 начинались.
И бегом срочно за 15 минут сделай, работа стоит, счас к генеральному директору побегу стучать!
Давай умник через 15 минут жду решения!
Применю и спасибо большое скажу!!
Жду - время пошло.

интересно в каком случае будет исключение? :-)
просто присвоение. Записи то Объекта нету. пока пользователь будет тупить этот же номер получит следующий документ

(17) sbr, для Ут 10.3 смотрим событие ПриУстановкеНовогоНомераДокумента - проваливаемся в процедуру ОбщегоНазначения.ПриУстановкеНовогоНомераДокументаПриУстановкеНовогоНомера , добавляем примерно такой код:

С клиентами такого типа сталкивался, и знаю, что ничего невозможного по сути нет в 1С, разница лишь в том, сколько усилий и времени на это будет затрачено. Про 15 минут - преувеличивать не надо (хотя я код набросал ну максимум минут за 5, ну если бы впервые с этим столкнулся, и не знал о префиксах, ну может за полчаса). Если у вас такие условия работы, что начальник, который в программировании не разбирается - всегда прав, это мягко говоря неправильная постановка вашей позиции :) Сразу нужно обозначать, что на это будет затрачено минимум столько времени - если устраивает, то делаем доработку, если же не устраивает - тогда работаем как раньше.

Читайте также: