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

30.01.23

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка «Максимальный код (номер) объекта»
.epf 12,67Kb
8
8 Скачать (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.

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

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

См. также

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

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

24.10.2024    1083    PROSTO-1C    0    

12

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

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

08.10.2024    977    PROSTO-1C    4    

10

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

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

04.10.2024    1829    MadRave    11    

24

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

Пример отслеживания прогресса фонового выполнения дополнительной обработки с использованием программного интерфейса длительных операций БСП.

10.09.2024    1815    MadRave    1    

17

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

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1253    n_mezentsev    10    

8

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

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4103    John_d    10    

52

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

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5353    PROSTO-1C    12    

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