Сброс неверной нумерации объектов

Публикация № 415406

Обработки - Обработка документов

нумерация автонумерация

61
Кратко о выправлении нумерации объектов

Как-то на работе возникла проблема с нумерацией документов. Пользователь ввёл номер нового документа вручную, причём вместо "000000675" указал "00_000675". После этого все последующие документы стали нумероваться с префиксом "00_". При этом ни банальное пересохранение объекта с номером "правильного" формата, ни пометка на удаление, ни удаление его из базы не помогли исправить ситуацию. Пришлось разбираться с механизмом автонумерации 1С.

Прежде всего я, естественно, обратился к ресурсам ИТС (благо фирма предоставляет такую возможность). Максимум, что я смог найти по своей тематике, - это две статьи Автонумерация и Особенности работы механизма автонумерации. Данные в них, мягко говоря, не свежие и где-то даже противоречащие реальности (например, там утверждается, что для восстановления нумерации достаточно удалить объекты), но общие представления о механизме дают. Из них стало понятно, что одним из решений вставшей проблемы является установка настройки конфигурации "Режим автонумерации объектов" в значение "Освобождать автоматически". Но, во-первых, это неприменимо в случае использования типовой конфигурации "на поддержке", а, во-вторых, противоречит продвигаемому 1С "новому" режиму нумерации. Поэтому я продолжил рыть дальше.

Как выяснилось, типовых механизмов работы с автонумерацией, как-то обработки, отчёты и прочее, нет. Но, слава Нуралиеву, нам предоставили методы встроенного языка: ОбновитьНумерациюОбъектовУстановитьНовыйКод и УстановитьНовыйНомер

ОбновитьНумерациюОбъектов, согласно СП, "выполняет обновление номеров в соответствии с номерами, записанными в базе данных. После вызова данного метода все выданные, но не записанные номера, становятся невалидными, т.к. не гарантируется их уникальность." Соотнеся это описание со статьями по этой тематике и тестовыми данными, становится понятно, что в базе хранится таблица выданных номеров, которые независимо от того, существуют объекты, для которых они были записаны в таблицу или нет, повторно быть выданы уже не могут, если не осуществить "сброс". Как раз процедура ОбновитьНумерациюОбъектов и применяется для "выправления" нумерации объектов. Главное, перед запуском не забудьте удалить из базы объекты с "неправильными" номерами. Это может быть как реальное удаление, так и перезапись их с предварительным присвоением "правильных" номеров.

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

В 1С нет возможности напрямую получить текущий максимальный номер объекта метаданных. Решить эту проблему можно двумя способами:

  • использовать запрос;
  • получить следующий номер, используя методы УстановитьНовыйКод или УстановитьНовыйНомер.

При формировании запроса система считывает данные базы данных. Можно отсортировать объекты по коду/номеру по убыванию, т.о. верхним в списке окажется обладатель максимального номера. Тут существуют следующие "загвоздки":

  • результат не будет содержать данные о занятых номерах, а только о записанных;
  • сортировка не всегда выводит наверх "максимальные" с точки зрения системы номера (например, объект с номером "0_01" в результате запроса будет расположен ниже номера "0001", но при вводе нового объекта ему будет присвоен номер с префиксом "0_").

УстановитьНовыйКод и УстановитьНовыйНомер устанавливают код или номер соответственно и заносят это значение в таблицу номеров. При этом неважно, будет ли записан объект или нет, "максисальный номер" всё равно будет обновлён на выданный. Таким образом, если использовать эти методы для проверки, то после этого необходимо обновить нумерацию объектов.

К публикации прикреплена обработка обновления нумерации. В ней:

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

Буду рад комментариям и замечаниям. 

61

Скачать файлы

Наименование Файл Версия Размер
Сброс нумерации объектов
.epf 12,65Kb
05.11.15
560
.epf 12,65Kb 560 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. seermak 659 07.11.15 14:11 Сейчас в теме
+ за подробность и старание)))
Serg_1C(M); +1 Ответить
3. magobato 64 19.12.15 14:03 Сейчас в теме
14. progr-2008 118 11.04.18 16:03 Сейчас в теме
(1)А есть такая обработка для обычных форм?
2. Angel_19 4 18.12.15 10:22 Сейчас в теме
Блин, это только для управляемых форм?
4. magobato 64 19.12.15 14:16 Сейчас в теме
(2) Angel_19, да, обработка работает только в управляемом интерфейсе. в крайнем случае, если позволяет платформа, можете запустить конфигурацию в режиме тонкого клиента и после этого воспользоваться обработкой.
5. Светлый ум 226 11.04.16 15:50 Сейчас в теме
Для документов пришлось сделать так:
//соответственно нехватает скриншота с настройкой как переключать между типами, пришлось лезть в конфигуратор

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
		
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("Справочники");
	Элементы.ВидМетаданных.СписокВыбора.Добавить("Документы");
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("БизнесПроцессы");
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("Задачи");
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("ПланыВидовРасчета");
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("ПланыВидовХарактеристик");
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("ПланыОбмена");
	//Элементы.ВидМетаданных.СписокВыбора.Добавить("ПланыСчетов");
	
	ВидМетаданных	= Элементы.ВидМетаданных.СписокВыбора[0].Значение;
Показать
6. jobkostya1c8 12.08.16 10:20 Сейчас в теме
А я проще сделал, обработка с двумя реквизитами - (ссылку на плохую счет-фактуру и "НовыйНомер") и тремя кнопками код ниже:
//1. Шаг Прочитать некорректный и макс номер
Процедура КнопкаВыполнитьНажатие(Кнопка)
	СФОбъект = СсылкаНаОбъект.ПолучитьОбъект();
	//СФОбъект.Номер = ""; // 12 цифр
	Сообщить("До функции УстановитьНовыйНомер() СФ "+СФОбъект.Номер);
	СФОбъект.УстановитьНовыйНомер();
	Сообщить("после применения функции Некорректный номер "+СФОбъект.Номер);
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СчетФактураВыданный.Ссылка,
	|	СчетФактураВыданный.Номер КАК Номер,
	|	СчетФактураВыданный.Дата
	|ИЗ
	|	Документ.СчетФактураВыданный КАК СчетФактураВыданный
	|
	|УПОРЯДОЧИТЬ ПО
	|	Номер УБЫВ";
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	Сообщить("Максимальный номер "+Выборка.Номер);
	// Вставить содержимое обработчика.
КонецПроцедуры

// Шаг 2 установить новый  номер
Процедура ОсновныеДействияФормыДействие(Кнопка)
	СФОбъект = СсылкаНаОбъект.ПолучитьОбъект();
	//СФОбъект.Номер = ""; // 12 цифр
	СФОбъект.УстановитьНовыйНомер();
	Сообщить("Новый номер "+СФОбъект.Номер);
	СФОбъект.Номер = СокрЛП(ЭтотОбъект.НовыйНомер);
	СФОбъект.Записать();
	Сообщить("СФ стала"+СсылкаНаОбъект);
КонецПроцедуры

// Шаг 3 ОбновитьНумерациюОбъектов("ИмяДок") гл контекст
Процедура КоманднаяПанель1ОбновитьНумерациюОбъектов(Кнопка)
	парамОбъектМетаданных = СсылкаНаОбъект.Метаданные();
	ОбновитьНумерациюОбъектов(парамОбъектМетаданных);
	Сообщить("Для объекта метаданных "+парамОбъектМетаданных+" обновлена нумерация. Все ранее выданные, но незаписанные в базу стали недействительными!");
КонецПроцедуры

Показать

Как Вам такой подход. Главное, что все заработало.
acanta; Mr.Fermer; kn; +3 Ответить
7. sly2k 21.08.17 15:08 Сейчас в теме
лично у меня простой подход - вызываю ОбновитьНумерациюОбъектов() без парамтеров, предварительно в ручную подправив неправильные номера в уже существующих документах. То что он вызывается в данном случае без фильтра по объектам совершенно не мешает правильно пронумерованным объектам.
alex-l19041; jobkostya1c8; +2 Ответить
8. zvv77 22.10.17 17:38 Сейчас в теме
На серверной базе может понадобится еще и чистка кэша из папки кластера в srvinfo с предварительной остановкой Агента сервера.
msergeev79; Ujine1313; vis_tmp; +3 Ответить
9. BBDragon 05.11.17 10:50 Сейчас в теме
Странно, а у меня нумерация не исправляется. Кэш на сервере чистил, Агент сервера предварительно остановив. Как я ни делаю - следующий номер остается неправильным
10. user856012 10 05.11.17 11:02 Сейчас в теме
(9)
Как я ни делаю - следующий номер остается неправильным
Или что-то не так делаете, или в базе реально существует объект с номером, предшествующим "неправильному". Тогда никакой "сброс" не поможет, надо сначала найти этот объект и исправить его номер.
BBDragon; +1 Ответить
11. BBDragon 05.11.17 12:19 Сейчас в теме
Я поясню. В октябре сбили нумерацию счетов-фактур в УТ 11.3, вручную изменив номер и он теперь стал начинаться с 2 нулей, а не с 3 как было. Последний такой номер, присвоенный вручную был 8956, т.е. вместо 00ЦБ-0008956, сделали 00ЦБ-008956. Я изменил этот номер вручную на правильный формат 00ЦБ-0008956 и перезапустил обработку - не помогло(
Единственное, если раньше он показывал, что следующий номер будет 00ЦБ-008957, то теперь на единицу меньше - 00ЦБ-008956.
Перенумерация с помощью обработки "Универсальный подбор и обработка объектов" также не дала результатов (префикс там тоже пробовал менять). Существующие СФ она перенумеровывает, а новой опять присваивается номер с двумя нулями, а не с тремя. Пробовал вручную парочку новых СФ сформировать и прописать правильный номер - опять не помогает. Как все-таки можно изменить этот параметр "Следующее значение"?
12. user856012 10 05.11.17 12:30 Сейчас в теме
(11)
Единственное, если раньше он показывал, что следующий номер будет 00ЦБ-008957, то теперь на единицу меньше - 00ЦБ-008956.
Заставляет предположить, что где-то сидит счет-фактура с номером 00ЦБ-008955.

Возможно, он помечен на удаление или криво записался, так что не попадает в отборы (по организации, по дате и т.д.), но наверняка он есть.

Проверить это несложно: создать 00ЦБ-008956, можно еще для уверенности 00ЦБ-008957, потом их удалить и сбросить автонумерацию. Если после этого программа будет предлагать 00ЦБ-008958 - значит, обработка не сработала, нумерация не сбросилась.

Ну, а если вернется к предложению 00ЦБ-008956 - наверняка существует 00ЦБ-008955, надо его искать и удалять.
BBDragon; +1 Ответить
13. BBDragon 05.11.17 13:09 Сейчас в теме
Да, есть такая.. Их там вообще куча в 3-ем квартале еще..

00ЦБ-005763 10.07.2017 0:00:00
00ЦБ-006915 01.08.2017 23:59:59
00ЦБ-007515 15.08.2017 23:59:59
00ЦБ-007606 08.08.2017 23:59:59
00ЦБ-008170 11.09.2017 23:59:59
00ЦБ-008225 12.09.2017 23:59:59
00ЦБ-008598 01.07.2017 14:50:19
00ЦБ-008606 14.07.2017 17:42:48
00ЦБ-008607 14.07.2017 17:42:50
00ЦБ-008609 21.07.2017 23:59:59
00ЦБ-008611 21.07.2017 23:59:59
00ЦБ-008616 05.07.2017 18:15:46
00ЦБ-008618 05.07.2017 18:15:48
00ЦБ-008619 05.07.2017 18:15:50
00ЦБ-008620 05.07.2017 18:15:52
00ЦБ-008621 05.07.2017 18:15:54
00ЦБ-008785 06.07.2017 9:04:44
00ЦБ-008790 20.07.2017 23:59:59
00ЦБ-008791 31.07.2017 23:59:59
00ЦБ-008796 18.08.2017 23:59:59
00ЦБ-008799 19.08.2017 23:59:59
00ЦБ-008807 12.09.2017 23:59:59
00ЦБ-008808 04.09.2017 23:59:59
00ЦБ-008810 29.09.2017 23:59:59
00ЦБ-008817 16.06.2017 17:06:20
00ЦБ-008818 14.06.2017 19:50:18
00ЦБ-008819 23.06.2017 16:46:35
00ЦБ-008820 22.06.2017 23:59:59
00ЦБ-008821 21.06.2017 0:00:00
00ЦБ-008885 10.10.2017 23:59:59
00ЦБ-008924 22.07.2017 22:12:17
00ЦБ-008925 18.07.2017 23:59:59
00ЦБ-008926 12.07.2017 20:00:28
00ЦБ-008927 07.07.2017 17:38:37
00ЦБ-008928 23.08.2017 23:59:59
00ЦБ-008930 28.09.2017 23:59:59
00ЦБ-008931 26.09.2017 23:59:59
00ЦБ-008932 25.09.2017 23:59:59
00ЦБ-008933 14.09.2017 23:59:59
00ЦБ-008934 13.09.2017 23:59:59
00ЦБ-008935 12.09.2017 23:59:59
00ЦБ-008937 10.09.2017 14:33:46
00ЦБ-008938 07.09.2017 23:59:59
00ЦБ-008939 06.09.2017 23:59:59
00ЦБ-008941 06.09.2017 23:59:59
00ЦБ-008942 20.07.2017 23:59:59
00ЦБ-008947 11.10.2017 0:00:00
00ЦБ-008948 04.10.2017 23:59:59
00ЦБ-008949 02.10.2017 23:59:59
00ЦБ-008951 14.09.2017 23:59:59
00ЦБ-008952 13.09.2017 23:59:59
00ЦБ-008953 15.07.2017 12:00:52
00ЦБ-008954 19.08.2017 23:59:59
00ЦБ-008955 12.09.2017 23:59:59

При этом в 4 квартале уже есть счета-фактуры с такими же номерами, только с 3 нулями в начале (8924-8955). В общем решил не трогать 3 квартал, оставить как есть, с 2 нулями, надо теперь лишь нумерацию в 4 квартале поправить, чтобы не было дублирующих номеров. Ибо в СФ на печати лидирующие нули уходят и получается что счет-фактуры к 2 разным реализациям имеют одинаковый номер.
15. quietbuh 12.07.18 12:44 Сейчас в теме
Объясните пожалуйста на пальцах в какой последовательности нужно выполнять чтобы исправить нумерацию. Не получается, все равно создает след. кривой номер.
16. magobato 64 12.07.18 16:24 Сейчас в теме
(15) последовательность в конце статьи указана. По сути:
выбираете тип объекта.
система подбирает объекты
флагом Макс. указываете на тот номер, который хотите чтобы считался максимальным
нажимаете на "обновить".

Но тут возможен следующий момент, т.к. объекты подбираются и сортируются запросом, то происходит это не всегда корректно (в статье об этом написано).
Если это так, то перед нажатием на кнопку "обновить" следует самостоятельно в списке отыскать все объекты с кривыми номерами и ручками поправить номера или удалить эти объекты из ИБ.
17. churlena 08.10.18 02:40 Сейчас в теме
Спасибо за обработку! Мне очень помогла в критический момент)
18. k992007 19 17.10.18 17:05 Сейчас в теме
19. aljir 3 08.04.19 12:02 Сейчас в теме
20. GlukAl 20.05.19 11:44 Сейчас в теме
в модуле справочника написать
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	Если ЭтоНовый() Тогда УстановитьНовыйКод("0"); КонецЕсли;
КонецПроцедуры

и не важно, что пользователи вводили в поле код ранее
нумерация для новых элементов будет с 0000
Оставьте свое сообщение