Ошибка механизма автонумерации объектов. Обработка «Максимальный код (номер) объекта» (БСП 3.1.7.61)

30.01.23

Разработка - БСП (Библиотека стандартных подсистем)

Сбой механизма автонумерации документов и справочников 1С:Предприятие 8.3. Методика исправления проблемы. Вспомогательная обработка.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Обработка «Максимальный код (номер) объекта»
.epf 12,67Kb
12 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Иногда случается, когда пользователь записывает новый документ появляется ошибка подобно «Значение "ТД000007063" поля "Номер" не уникально». Также и при программном создании документов разработчик может столкнуться с той же проблемой.

Это значит, что сбилась автонумерация документов и документ с данным служебным номером уже существует в базе данных за данный отчетный период (периодичность может быть месяц, квартал, год). Новый номер при записи объекта генерируется неверно! Результат - документ не записывается!

Между тем отмечу, что механизм автонумерации в 1С:Предприятие 8.3 работает довольно стабильно и с подобными проблемами я сталкиваюсь весьма редко. Предполагаю, что многие пользователи никогда не испытывали подобных сложностей, работая с современными типовыми продуктами фирмы «1С».

Для исправления данной ошибки я вручную создаю новый документ и сам указываю подходящий номер для документа (по формуле: Префикс + (МаксимальныйНомер + 1)), а также указываю дату документа, если документ нужно ввести в прошлый отчетный период. Для надежности создаю сразу же второй документ со следующим номером. После сразу помечаю тестовые документы на удаление! Введенные ранее документы с неверными номерами, отраженные в учете, на данном этапе я не трогаю, перенумеровать документы за отчетный период не пытаюсь. Меня неверные номера совершенно не смущают!

Если автонумерация восстановилась, то тогда задача решена и тестовые документы в конце месяца можно удалить из базы данных. Документы с неверными номерами я снова не трогаю!

Если не помогло, то стоит вручную или программно исправить ошибочные номера, перезапустить «Сервер приложений 1С» или вручную вызвать функцию ОбновитьНумерациюОбъектов платформы, которая выполняет обновление номеров в соответствии с номерами, записанными в базе данных. Возможно, стоит еще создать тестовые документы с новым номером по шаблону Префикс + (МаксимальныйНомер + 50..100). Мне такого делать не приходилось на рабочих базах. У меня получалось исправить проблему до этого этапа.

В последний раз, решая данную задачу, оказалось сложнее, так как механизм автонумерации для документа был реализован через объект платформы «Нумератор». Теперь появилась промежуточная задача — найти максимальный номер для нескольких видов документов за период. Сортировкой в форме списка документов я воспользоваться уже не мог, так как нумератор для данного документа был задействован дополнительно еще в 4 документах. Журнала, включающего эти 5 документов, я не нашел. Можно было бы визуально найти максимальный код или придумать быстрый запрос для 5 документов, но хотелось бы иметь возможность получать максимальный номер более быстрым и удобным способом.

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

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

 

 

#Область СлужебныеАлгоритмы

&НаСервере
Процедура ОбновитьНумерациюНаСервере()
	СписокОбъектовКонфигурации = Новый Массив;
	
	Если ТипОбъектаМетаданных = 0 Или (ТипОбъектаМетаданных = 1 И ОдинДокумент) Тогда
		СписокОбъектовКонфигурации.Добавить(ИмяСлужебногоОбъекта);
	ИначеЕсли ТипОбъектаМетаданных = 1 И Не ОдинДокумент Тогда
		Для каждого ОбъектДокумент Из Метаданные.Документы Цикл
			Если ОбъектДокумент.Нумератор <> Неопределено И ОбъектДокумент.Нумератор.Имя = ИмяСлужебногоОбъекта Тогда
				СписокОбъектовКонфигурации.Добавить(ОбъектДокумент.Имя);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	МассивОбъектовМетаданных = Новый Массив;
	
	Для каждого ИмяТаблицы Из СписокОбъектовКонфигурации Цикл
		Если ТипОбъектаМетаданных = 0 Тогда
			МассивОбъектовМетаданных.Добавить(Метаданные.Справочники[ИмяТаблицы]);
			
			ТекстСообщения = "Справочник." + Метаданные.Справочники[ИмяТаблицы].Имя + " (" + Метаданные.Справочники[ИмяТаблицы].Синоним + ")";
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		ИначеЕсли ТипОбъектаМетаданных = 1 Тогда
			МассивОбъектовМетаданных.Добавить(Метаданные.Документы[ИмяТаблицы]);
			
			ТекстСообщения = "Документ." + Метаданные.Документы[ИмяТаблицы].Имя + " (" + Метаданные.Документы[ИмяТаблицы].Синоним + ")";
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		КонецЕсли;
	КонецЦикла;
	
	ОбновитьНумерациюОбъектов(МассивОбъектовМетаданных);
	
	Если ТипОбъектаМетаданных = 1 И Не ОдинДокумент Тогда
		ТекстСообщения = "НумераторДокументов." + Метаданные.НумераторыДокументов[ИмяСлужебногоОбъекта].Имя
			+ " (" + Метаданные.НумераторыДокументов[ИмяСлужебногоОбъекта].Синоним + ")";
			
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		
		ОбновитьНумерациюОбъектов(Метаданные.НумераторыДокументов[ИмяСлужебногоОбъекта]);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПеренумероватьНаСервере()
	СписокОбъектовКонфигурации = Новый Массив;
	
	Если ТипОбъектаМетаданных = 0 Или (ТипОбъектаМетаданных = 1 И ОдинДокумент) Тогда
		СписокОбъектовКонфигурации.Добавить(ИмяСлужебногоОбъекта);
	ИначеЕсли ТипОбъектаМетаданных = 1 И Не ОдинДокумент Тогда
		Для каждого ОбъектДокумент Из Метаданные.Документы Цикл
			Если ОбъектДокумент.Нумератор <> Неопределено И ОбъектДокумент.Нумератор.Имя = ИмяСлужебногоОбъекта Тогда
				СписокОбъектовКонфигурации.Добавить(ОбъектДокумент.Имя);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Если ТипОбъектаМетаданных = 0 Тогда
		ПрефиксИБ = СокрЛП(Объект.Префикс);
		ПрефиксСлужебныйНовый = ПрефиксИБ;
		//ПрефиксСлужебныйНовый = "УТ-";
		ПеренумероватьСправочники(ПрефиксИБ, ПрефиксСлужебныйНовый, СписокОбъектовКонфигурации);
	КонецЕсли;
	
	Если ТипОбъектаМетаданных = 1 Тогда
		ПрефиксИБ = СокрЛП(Объект.Префикс);
		ПрефиксСлужебныйНовый = ПрефиксИБ;
		//ПрефиксСлужебныйНовый = "ТДУТ-";
		ПеренумероватьДокументы(ПрефиксИБ, ПрефиксСлужебныйНовый, СписокОбъектовКонфигурации);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПолучитьМаксимальныйНомерНаСервере()
	ПарамПрефикс = СокрЛП(Объект.Префикс);
	
	СписокОбъектовКонфигурации = Новый Массив;
	
	Если ТипОбъектаМетаданных = 0 Тогда
		ТекстТипОбъекта = "Справочник.";
		СписокОбъектовКонфигурации.Добавить(ИмяСлужебногоОбъекта);
		ДлинаНомера = Метаданные.Справочники[ИмяСлужебногоОбъекта].ДлинаКода;
	ИначеЕсли ТипОбъектаМетаданных = 1 Тогда
		ТекстТипОбъекта = "Документ.";
		
		Если ОдинДокумент Или ТестовыйРежим Тогда
			СписокОбъектовКонфигурации.Добавить(ИмяСлужебногоОбъекта);
			ДлинаНомера = Метаданные.Документы[ИмяСлужебногоОбъекта].ДлинаНомера;
		Иначе
			Для каждого ОбъектДокумент Из Метаданные.Документы Цикл
				Если ОбъектДокумент.Нумератор <> Неопределено И ОбъектДокумент.Нумератор.Имя = ИмяСлужебногоОбъекта Тогда
					СписокОбъектовКонфигурации.Добавить(ОбъектДокумент.Имя);
				КонецЕсли;
			КонецЦикла;
			
			ДлинаНомера = Метаданные.НумераторыДокументов[ИмяСлужебногоОбъекта].ДлинаНомера;
		КонецЕсли;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ДатаНачала", Объект.Период.ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", Объект.Период.ДатаОкончания);
	Запрос.УстановитьПараметр("Префикс", ?(ПустаяСтрока(ПарамПрефикс), "0%", ПарамПрефикс + "%"));
	Запрос.Текст =
	"ВЫБРАТЬ
	|	""0"" КАК Номер
	|ГДЕ
	|	ЛОЖЬ";
	
	Для каждого ИмяТаблицы Из СписокОбъектовКонфигурации Цикл
		ШаблонТекст =
		"
		|ОБЪЕДИНИТЬ
		|";
		
		ШаблонТекст = ШаблонТекст +
		"ВЫБРАТЬ
		|	Т.Номер КАК Номер
		|ИЗ
		|	Документ.ТелефонныйЗвонок КАК Т
		|ГДЕ
		|	ИСТИНА
		|	И Т.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
		|	И Т.Номер ПОДОБНО &Префикс";
		
		ШаблонТекст = СтрЗаменить(ШаблонТекст, "Документ.ТелефонныйЗвонок", ТекстТипОбъекта + ИмяТаблицы);
		
		Если (ТипОбъектаМетаданных = 0 И Метаданные.Справочники[ИмяТаблицы].ТипКода = Метаданные.СвойстваОбъектов.ТипКодаСправочника.Число)
			Или (ТипОбъектаМетаданных = 1 И Метаданные.Документы[ИмяТаблицы].ТипНомера = Метаданные.СвойстваОбъектов.ТипНомераДокумента.Число)
			Или (ТипОбъектаМетаданных = 0 И ПустаяСтрока(ПарамПрефикс)) Тогда
			
			ШаблонТекст = СтрЗаменить(ШаблонТекст, "И Т.Номер ПОДОБНО &Префикс", "");
		КонецЕсли;
		
		Если ТипОбъектаМетаданных = 0 Тогда // Справочники
			ШаблонТекст = СтрЗаменить(ШаблонТекст, "И Т.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания", "");
			ШаблонТекст = СтрЗаменить(ШаблонТекст, "Т.Номер", "Т.Код");
		КонецЕсли;
		
		Запрос.Текст = Запрос.Текст + ШаблонТекст;
	КонецЦикла;
	
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		РезультатМаксимальныйКодНомер = ТекстРезультатПустой(ПарамПрефикс);
		ОбновитьОбщееОписаниеТестовыйРежим(СписокОбъектовКонфигурации);
		Возврат;
	КонецЕсли;
	
	ТЗ_Номера = Новый ТаблицаЗначений;
	ТЗ_Номера.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число"));
	
	Выборка = Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		ТекстНомер = ПодстрокаТолькоЦифровыеСимволы(Выборка.Номер);
		Если Не ПустаяСтрока(ТекстНомер) Тогда
			НоваяСтрока = ТЗ_Номера.Добавить();
			НоваяСтрока.Номер = Число(ТекстНомер);
		КонецЕсли;
	КонецЦикла;
	
	Если ТЗ_Номера.Количество() > 0 Тогда
		ТЗ_Номера.Свернуть("Номер");
		ТЗ_Номера.Сортировать("Номер УБЫВ");
		
		МаксКод = ТЗ_Номера[0].Номер;
		
		Если ПустаяСтрока(ПарамПрефикс) Тогда
			РезультатМаксимальныйКодНомер = ПредставлениеКода(МаксКод, ДлинаНомера);
		Иначе
			РезультатМаксимальныйКодНомер = ПарамПрефикс + ПредставлениеКода(МаксКод, ДлинаНомера - СтрДлина(ПарамПрефикс));
		КонецЕсли;
		
		ОбновитьОбщееОписаниеТестовыйРежим(СписокОбъектовКонфигурации);
	Иначе
		РезультатМаксимальныйКодНомер = ТекстРезультатПустой(ПарамПрефикс);
		ОбновитьОбщееОписаниеТестовыйРежим(СписокОбъектовКонфигурации);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

 

Внешнюю обработку «Максимальный код (номер) объекта» можно подключить к информационной базе штатными средствами БСП. Обработка разрабатывалась и тестировалась на платформе 1С:Предприятие 8.3 (8.3.22.1750) в информационной демо-базе БСП 3.1.7.61 в операционных системах Windows 10 и Linux Mint 21.1. Также проводил тестирование в учебных информационных базах Управление торговлей 11.4.2.132, Управление небольшой фирмой 1.6.5.28 и Бухгалтерия предприятия 3.0.35.27. Думаю, в актуальных коммерческих версиях тоже все будет работать!

Обработка была также протестирована на серверной тестовой базе клиента 1С:ERP Управление предприятием 2.4.7.151.

Согласно различным комментариям на форумах и другим публикациям, данный способ решения сбоя механизма автонумерации объекта может не сработать! Видимо, мне везло и такой способ решал мою проблему. С другими случаями я не сталкивался. Если у меня появится другой полезный опыт, то позже обновлю обработку. Но это уже будет совсем другая история...

Вступайте в нашу телеграмм-группу Инфостарт

БСП внешний обработка автонумерация нумератор документ справочник код номер

См. также

Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)

Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С

25000 руб.

06.03.2026    1144    1    0    

3

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

3254 руб.

21.11.2024    13478    49    26    

56

БСП (Библиотека стандартных подсистем) Программист 1С 8.3 1С:Библиотека стандартных подсистем Бесплатно (free)

Каждый раз, когда разработчик 1С пишет очередной цикл для свертки массива или использует конструкцию Попытка / Исключение для проверки наличия реквизита, где-то грустит один архитектор фирмы «1С». Мы привыкли изобретать велосипеды там, где в Библиотеке стандартных подсистем (БСП) уже давно лежат готовые, оптимизированные и протестированные на тысячах баз решения. Ниже — практическая подборка из 8 методов актуальных релизов БСП (3.X), которые сделают ваш код чище, быстрее и профессиональнее. Разберем на примерах «Было / Стало».

04.06.2026    8267    Kaliostr0    16    

35

БСП (Библиотека стандартных подсистем) Универсальные функции Программист 1С 8.3 1С:Библиотека стандартных подсистем Бесплатно (free)

Когда появляется необходимость сделать подключаемую внешнюю обработку, будь это печатная форма или отчет - нам всегда приходится прописывать сведения о внешней обработке для подключения их в соответствующий справочник. И это занимает некоторое время, что не очень удобно. Как для себя, так и для вас - я подготовил ряд примеров использования этой функции, можете выбрать один из них, чтобы в дальнейшем использовать их в шаблонах текста. Комментарии по дополнению и исправлению статьи - приветствуются.

06.02.2026    13504    manul1c    6    

25

Рефакторинг и качество кода БСП (Библиотека стандартных подсистем) Механизмы платформы 1С Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Бесплатно (free)

Использование Библиотеки стандартных подсистем позволяет разработчикам 1С значительно ускорить процесс создания решений за счет готового универсального кода, поддерживаемого и обновляемого официальным вендором. В статье рассказывается про роль и применение «Библиотеки стандартных подсистем» (БСП), примеры интеграции и подключения подсистем.

23.09.2025    14256    AlexeyPROSTO_1C    1    

18

БСП (Библиотека стандартных подсистем) Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Бесплатно (free)

Уже заезженная тема с выводом в Word макетов при помощи БСП, но некоторые коллеги все равно спрашивают. Поэтому размещаю тут материал, как это сделать за три простых шага. Решение, которым я успешно пользуюсь в случаях, когда не нужна универсальность подключаемых внешних печатных форм.

16.09.2025    6949    _seerco2002    0    

36
Для отправки сообщения требуется регистрация/авторизация