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

30.01.23

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

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

Скачать исходный код

Наименование Файл Версия Размер
Обработка «Максимальный код (номер) объекта»
.epf 12,67Kb
6
.epf 12,67Kb 6 Скачать

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

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

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

См. также

БСП. Добавляем отчет в меню Отчеты

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

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3129    John_d    10    

89

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

01.03.2024    1684    dimanich70    8    

14

Заполнение поля адреса в своей обработке [БСП]

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

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    784    FilippovRI    0    

15

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2607    YA_418728146    11    

43

1С:БСП Дополнительные реквизиты и сведения

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

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

19.01.2024    6256    PROSTO-1C    5    

46

Бесплатный митап 9 февраля «Библиотеки и фреймворки на 1С и всё, что с этим связано»

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

Митап посвящен вопросам создания, использования и поддержке переиспользуемого кода при разработке решений на платформе 1С:Предприятие 8.

15.01.2024    3884    0    Infostart    0    

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