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

30.01.23

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка «Максимальный код (номер) объекта»
.epf 12,67Kb
9
9 Скачать (1 SM) Купить за 1 850 руб.

Иногда случается, когда пользователь записывает новый документ появляется ошибка подобно «Значение "ТД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.

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

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

См. также

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

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

1800 руб.

21.11.2024    3885    16    15    

19

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

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

27.12.2024    3819    PROSTO-1C    15    

44

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

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    4066    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    1089    Iaskeliainen    2    

7

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

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3533    milkers    3    

12

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

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1832    PROSTO-1C    0    

19

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1429    PROSTO-1C    4    

14
Оставьте свое сообщение