Почему код справочника в 1С присваивается до записи и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При разработке новой функциональности или создании новых справочников на обычных формах разработчики часто сталкиваются с неожиданным поведением системы: пользователь открывает форму нового элемента, поле кода уже заполнено значением (например, 000001), а при закрытии формы крестиком без сохранения и повторном создании код с каждым разом увеличивается. В результате первый сохраненный элемент может получить код 000014, а в нумерации образуются нежелательные пропуски. Разберем детально, почему это происходит и как вернуть привычное поведение, когда код генерируется только при фактической записи объекта.

Причины автоматической генерации кода при открытии формы

Проанализируем механику работы платформы «1С:Предприятие» в режиме обычных форм. Подобная проблема возникает из-за сочетания двух параметров конфигурации:

  1. Свойство формы «Автонумерация». По умолчанию при создании новой обычной формы элемента справочника конструктор форм выставляет свойство формы Автонумерация в значение Авто. В этом режиме платформа инициирует генерацию нового кода объекта еще до интерактивных действий пользователя — в момент между системными событиями ПередОткрытием и ПриОткрытии.
  2. Режим автонумерации объектов в свойствах конфигурации. Если в корневых свойствах конфигурации для параметра «Режим автонумерации объектов» выбрано значение Не освобождать автоматически, платформа гарантирует уникальность и строго фиксирует выданный номер. Код, сгенерированный вне транзакции записи при открытии формы, считается зарезервированным. При простом закрытии окна без записи этот код сгорает и больше не возвращается в пул свободных номеров.

Выясним причину, почему в типовых справочниках конфигураций (например, в «Управление торговлей 10.3» или «УПП») такой проблемы нет. В типовых конфигурациях разработчики вручную отключают стандартную автонумерацию на уровне форм, а доступностью поля и формированием кода управляют программно через общие модули. Создавая новый справочник с нуля или перенося его через буфер обмена, разработчик получает стандартную форму платформы со значением Авто, из-за чего поведение нового объекта резко отличается от типовых.

Пошаговое исправление поведения формы

Разберем по шагам, как перевести генерацию кода в транзакцию записи объекта:

  1. Откроем дерево метаданных конфигурации и перейдем к проблемному справочнику.
  2. Развернем ветку Формы и откроем форму элемента справочника.
  3. Вызовем палитру свойств самой формы (клик правой кнопкой мыши по рабочей области формы или ее заголовку — пункт меню Свойства).
  4. В палитре свойств найдем категорию Использование.
  5. Найдем свойство Автонумерация и изменим его значение с Авто на Не использовать.
  6. Сохраним форму и обновим конфигурацию базы данных.

После отключения этого свойства поле ввода кода при создании нового элемента будет оставаться пустым. Платформа сформирует код и проверит его на уникальность только тогда, когда пользователь нажмет кнопку «Записать» или «ОК» (непосредственно внутри транзакции записи).

Сброс завышенного счетчика номеров

Если во время тестирования пустая база уже успела накрутить счетчик номеров, платформа в клиент-серверном режиме может продолжать выдавать следующий завышенный номер из кэша сервера «1С:Предприятие». Посмотрим, как сбросить этот кэш и вернуть правильный отсчет.

Для принудительного обновления механизма нумерации в соответствии с реальными данными таблиц базы данных вызовем метод встроенного языка:

ОбновитьНумерациюОбъектов(Метаданные.Справочники.НовыйСправочник);

Данную команду достаточно выполнить один раз во внешней обработке. В клиент-серверной базе для окончательного сброса заблокированных кэшированных диапазонов номеров также может потребоваться перезапуск рабочего процесса или службы сервера 1С.

Особенности управляемых форм

Рассмотрим подробнее, как изменился этот подход в управляемом интерфейсе. Начиная с платформы 8.2, в управляемых формах разработчики полностью избавлены от ручного управления свойством Автонумерация на форме: код или номер документа по умолчанию формируется исключительно в транзакции записи. Если пользователь в управляемой форме пытается вручную заполнить код, платформа выдает системное предупреждение о том, что номер присваивается автоматически при записи. Однако при поддержке и доработке конфигураций на обычных формах важно помнить о свойстве Автонумерация каждой создаваемой формы.

← На главную