gifts2017

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

Опубликовал Александр Колесников (magobato) в раздел Обработки - Обработка документов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. Сергей (seermak) 07.11.15 14:11
+ за подробность и старание)))
2. Roman Rezschikov (Angel_19) 18.12.15 10:22
Блин, это только для управляемых форм?
3. Александр Колесников (magobato) 19.12.15 14:03
4. Александр Колесников (magobato) 19.12.15 14:16
(2) Angel_19, да, обработка работает только в управляемом интерфейсе. в крайнем случае, если позволяет платформа, можете запустить конфигурацию в режиме тонкого клиента и после этого воспользоваться обработкой.
5. Константин Куликов (Светлый ум) 11.04.16 15:50
Для документов пришлось сделать так:
//соответственно нехватает скриншота с настройкой как переключать между типами, пришлось лезть в конфигуратор

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

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

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

...Показать Скрыть

Как Вам такой подход. Главное, что все заработало.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа