При разработке новой функциональности или создании новых справочников на обычных формах разработчики часто сталкиваются с неожиданным поведением системы: пользователь открывает форму нового элемента, поле кода уже заполнено значением (например, 000001), а при закрытии формы крестиком без сохранения и повторном создании код с каждым разом увеличивается. В результате первый сохраненный элемент может получить код 000014, а в нумерации образуются нежелательные пропуски. Разберем детально, почему это происходит и как вернуть привычное поведение, когда код генерируется только при фактической записи объекта.
Проанализируем механику работы платформы «1С:Предприятие» в режиме обычных форм. Подобная проблема возникает из-за сочетания двух параметров конфигурации:
Автонумерация в значение Авто. В этом режиме платформа инициирует генерацию нового кода объекта еще до интерактивных действий пользователя — в момент между системными событиями ПередОткрытием и ПриОткрытии.Выясним причину, почему в типовых справочниках конфигураций (например, в «Управление торговлей 10.3» или «УПП») такой проблемы нет. В типовых конфигурациях разработчики вручную отключают стандартную автонумерацию на уровне форм, а доступностью поля и формированием кода управляют программно через общие модули. Создавая новый справочник с нуля или перенося его через буфер обмена, разработчик получает стандартную форму платформы со значением Авто, из-за чего поведение нового объекта резко отличается от типовых.
Разберем по шагам, как перевести генерацию кода в транзакцию записи объекта:
После отключения этого свойства поле ввода кода при создании нового элемента будет оставаться пустым. Платформа сформирует код и проверит его на уникальность только тогда, когда пользователь нажмет кнопку «Записать» или «ОК» (непосредственно внутри транзакции записи).
Если во время тестирования пустая база уже успела накрутить счетчик номеров, платформа в клиент-серверном режиме может продолжать выдавать следующий завышенный номер из кэша сервера «1С:Предприятие». Посмотрим, как сбросить этот кэш и вернуть правильный отсчет.
Для принудительного обновления механизма нумерации в соответствии с реальными данными таблиц базы данных вызовем метод встроенного языка:
ОбновитьНумерациюОбъектов(Метаданные.Справочники.НовыйСправочник);
Данную команду достаточно выполнить один раз во внешней обработке. В клиент-серверной базе для окончательного сброса заблокированных кэшированных диапазонов номеров также может потребоваться перезапуск рабочего процесса или службы сервера 1С.
Рассмотрим подробнее, как изменился этот подход в управляемом интерфейсе. Начиная с платформы 8.2, в управляемых формах разработчики полностью избавлены от ручного управления свойством Автонумерация на форме: код или номер документа по умолчанию формируется исключительно в транзакции записи. Если пользователь в управляемой форме пытается вручную заполнить код, платформа выдает системное предупреждение о том, что номер присваивается автоматически при записи. Однако при поддержке и доработке конфигураций на обычных формах важно помнить о свойстве Автонумерация каждой создаваемой формы.