Часто пользователи сталкиваются с задачей копирования документов из завершающегося года в новый. При изменении даты документа на следующий год стандартная нумерация 1С может не сработать, если программа продолжает использовать «старый» счетчик. Давайте разберем, почему это происходит и как настроить систему для корректной работы.
Первым делом проанализируем настройки метаданных. Многие ошибки с «бесконечной» нумерацией возникают из-за неправильно выбранного периода. Если у вида документа установлена периодичность По всем документам, программа считает, что нумерация сквозная и не требует обновления при смене года.
Метаданные -> Документы.Периодичность выбрано значение В пределах года.Если вы изменили этот параметр, обязательно протестируйте базу на копии, так как это влияет на логику формирования всех будущих номеров.
Если настройки периодичности верны, но номер все равно не меняется, значит, 1С не «видит» смену периода в момент изменения даты в форме. Для решения этой задачи создадим механизм, который будет отслеживать смену года при записи документа.
Разберем создание универсальной функции для контроля даты, которую можно вызывать из модуля документа.
В процедуре ПриОткрытии() модуля формы документа необходимо запомнить исходную дату:
Процедура ПриОткрытии()
НачальнаяДатаДокумента = ДатаДок;
КонецПроцедуры
Далее, создадим функцию глКонтрольДатыДокумента, которая будет проверять, изменился ли год, и если да — присваивать новый номер.
Функция глКонтрольДатыДокумента(ПереданКонтекст, НачальнаяДатаДокумента) Экспорт
Если ДатаГод(ПереданКонтекст.ДатаДок) <> ДатаГод(НачальнаяДатаДокумента) Тогда
// Устанавливаем новый номер, учитывая префикс
ПереданКонтекст.УстановитьНовыйНомер(ПрефиксДокументов);
Возврат 1; // Номер был изменен
КонецЕсли;
Возврат 0; // Изменений не было
КонецФункции
Теперь необходимо внедрить вызов этой проверки в процедуру ПриЗаписи(). Важно правильно обработать результат: если номер был изменен, мы должны запретить стандартную запись и позволить пользователю сохранить документ уже с новым номером.
Процедура ПриЗаписи()
Если глКонтрольДатыДокумента(Контекст, НачальнаяДатаДокумента) = 1 Тогда
Предупреждение("Год документа изменен! Номер был пересчитан.");
СтатусВозврата(0); // Отменяем запись, чтобы пользователь подтвердил новый номер
Возврат;
КонецЕсли;
КонецПроцедуры
При использовании УстановитьНовыйНомер() в контексте уже записанного документа, система может обращаться к «старой» дате, хранящейся в базе данных. Именно поэтому реализация логики через проверку в ПриЗаписи() и использование СтатусВозврата(0) является наиболее надежным способом. Вы принудительно заставляете 1С пересчитать номер после того, как дата была изменена в диалоговом окне.
Полезный совет: Если вы работаете в конфигурациях, близких к типовым (например, «Торговля и Склад»), посмотрите, как реализован механизм создания «дубликата» документа. В сложных случаях разработчики сначала создают временный объект с новой датой, получают для него новый номер, а затем присваивают этот номер оригиналу. Это гарантирует отсутствие конфликтов при многопользовательской работе.
Всегда помните о создании резервных копий перед внесением изменений в алгоритмы нумерации. Успешной автоматизации!