Как изменить номер документа в 1С 7.7 при смене даты на другой год?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Шаг 1: Проверка периодичности нумерации

Первым делом проанализируем настройки метаданных. Многие ошибки с «бесконечной» нумерацией возникают из-за неправильно выбранного периода. Если у вида документа установлена периодичность По всем документам, программа считает, что нумерация сквозная и не требует обновления при смене года.

  1. Откройте Конфигуратор.
  2. Перейдите в Метаданные -> Документы.
  3. Найдите нужный документ и откройте его свойства.
  4. Убедитесь, что в поле Периодичность выбрано значение В пределах года.

Если вы изменили этот параметр, обязательно протестируйте базу на копии, так как это влияет на логику формирования всех будущих номеров.

Шаг 2: Реализация контроля смены даты при записи

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

Разберем создание универсальной функции для контроля даты, которую можно вызывать из модуля документа.

В процедуре ПриОткрытии() модуля формы документа необходимо запомнить исходную дату:


Процедура ПриОткрытии()
    НачальнаяДатаДокумента = ДатаДок;
КонецПроцедуры

Далее, создадим функцию глКонтрольДатыДокумента, которая будет проверять, изменился ли год, и если да — присваивать новый номер.


Функция глКонтрольДатыДокумента(ПереданКонтекст, НачальнаяДатаДокумента) Экспорт
    Если ДатаГод(ПереданКонтекст.ДатаДок) <> ДатаГод(НачальнаяДатаДокумента) Тогда
        // Устанавливаем новый номер, учитывая префикс
        ПереданКонтекст.УстановитьНовыйНомер(ПрефиксДокументов);
        Возврат 1; // Номер был изменен
    КонецЕсли;
    Возврат 0; // Изменений не было
КонецФункции

Шаг 3: Вызов контроля в процедуре записи

Теперь необходимо внедрить вызов этой проверки в процедуру ПриЗаписи(). Важно правильно обработать результат: если номер был изменен, мы должны запретить стандартную запись и позволить пользователю сохранить документ уже с новым номером.


Процедура ПриЗаписи()
    Если глКонтрольДатыДокумента(Контекст, НачальнаяДатаДокумента) = 1 Тогда
        Предупреждение("Год документа изменен! Номер был пересчитан.");
        СтатусВозврата(0); // Отменяем запись, чтобы пользователь подтвердил новый номер
        Возврат;
    КонецЕсли;
КонецПроцедуры

Почему это работает?

При использовании УстановитьНовыйНомер() в контексте уже записанного документа, система может обращаться к «старой» дате, хранящейся в базе данных. Именно поэтому реализация логики через проверку в ПриЗаписи() и использование СтатусВозврата(0) является наиболее надежным способом. Вы принудительно заставляете 1С пересчитать номер после того, как дата была изменена в диалоговом окне.

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

Всегда помните о создании резервных копий перед внесением изменений в алгоритмы нумерации. Успешной автоматизации!

← На главную