Как правильно изменить номер и дату документа в 1С 8.1 без нарушения последовательности?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Мы выясним, какие методы существуют для изменения номера и даты документа, начиная от ручной корректировки и заканчивая использованием универсальных обработок и программного кода. Наша цель — не только изменить требуемые поля, но и убедиться, что все связанные движения и проводки остаются актуальными и правильными, а общая последовательность документов в системе сохранена.

Понимание проблемы: почему прямое изменение может быть опасным?

Прежде чем приступать к изменениям, нам необходимо понять, почему простое редактирование номера и даты документа может вызвать проблемы. В 1С номер и дата документа используются не только для идентификации, но и для упорядочивания данных в регистрах. Многие документы формируют движения, которые зависят от их даты и времени. Если мы изменим дату документа задним числом, это может нарушить хронологию движений, привести к "отрицательным остаткам" или некорректному расчету себестоимости, взаиморасчетов и других учетных показателей. Система 1С, особенно версии 8.1, требует внимательного подхода к таким операциям.

Также важно учитывать, что если в системе используется сквозная нумерация документов (например, "Бухгалтерские операции"), то изменение номера одного документа может создать дубликаты или пропуски в нумерации, что является нарушением учетной политики.

Ручное изменение номера и даты документа

Для простых случаев, когда документ не имеет сложных движений или изменение даты не затрагивает критичные для учета периоды, мы можем использовать ручную корректировку. Однако, при этом крайне важно соблюдать осторожность.

Первое, что мы должны сделать, это отключить контроль уникальности номеров документов. Это временная мера, которая позволит нам установить новый номер, даже если он уже существует в системе, но с другим документом (что, конечно, крайне нежелательно для сквозной нумерации). Чтобы отключить контроль, нам потребуется доступ к конфигуратору или специальной настройке, если она предусмотрена в вашей конфигурации. В конфигураторе мы можем найти модуль формы документа и временно закомментировать строку, отвечающую за проверку уникальности номера.

После изменения номера и даты, мы должны перепровести документ. Перепроведение гарантирует, что все движения документа будут сформированы заново с учетом новой даты и, следовательно, попадут в правильный период учета. Если документ является частью сложной последовательности (например, цепочка "Поступление - Реализация"), то, возможно, придется перепровести и все зависимые документы в хронологическом порядке, чтобы восстановить корректность.

Для изменения номера документа нам также может понадобиться установить режим "только просмотр" для поля номера, чтобы его можно было отредактировать. Обычно номер документа автоматически присваивается при создании и заблокирован для редактирования после записи. Мы можем изменить это поведение через свойства элемента формы или программно, если у нас есть соответствующие права.

Пример действий:

  1. Откроем документ, который необходимо изменить.
  2. Если поле номера заблокировано, временно разблокируем его (это может потребовать изменения конфигурации или использования универсальной обработки с правами администратора).
  3. Изменим номер на желаемый.
  4. Изменим дату документа.
  5. Запишем документ.
  6. Перепроведем документ (кнопка "Провести" или "ОК").

Важно помнить, что такой подход подходит только для изолированных документов или когда мы точно уверены, что изменение не повлияет на другие учетные процессы. Мы всегда должны быть готовы к тому, что после таких изменений может потребоваться анализ и корректировка смежных данных.

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

Ручное изменение одного документа — это одно, но если нам нужно изменить большое количество документов или документы, которые имеют сложную взаимосвязь, ручной труд становится неэффективным и рискованным. В таких случаях мы прибегаем к использованию универсальных обработок. Одна из наиболее популярных и мощных — это "Универсальная обработка объектов", которая часто поставляется с типовыми конфигурациями или доступна на различных 1С-ресурсах.

Эта обработка позволяет нам выполнить следующие действия:

  1. Выбрать тип документа, реквизиты которого мы хотим изменить.
  2. Отфильтровать документы по определенным критериям (например, по периоду, организации, текущему номеру).
  3. Пакетно изменить реквизиты, такие как номер и дата.
  4. Пакетно перепровести документы, чтобы обновить их движения.

Преимущества использования универсальной обработки:

Порядок работы с универсальной обработкой (например, "УниверсальныйПодборИОбработкаОбъектов"):

  1. Запустим обработку (через меню "Файл -> Открыть" или из раздела "Администрирование").
  2. На вкладке "Работа с объектами" выберем тип объекта "Документ" и конкретный вид документа (например, "РеализацияТоваровУслуг").
  3. В поле "Отбор" установим условия для выбора нужных документов (например, по дате или части номера).
  4. Перейдем на вкладку "Изменение реквизитов".
  5. Найдем реквизиты "Номер" и "Дата".
  6. Укажем новое значение или правило для его формирования (например, с помощью выражения).
  7. Если требуется, установим флажок "Перепроводить документы" или выполним это отдельной операцией.
  8. Нажмем кнопку "Выполнить".

При использовании универсальной обработки для изменения номеров, особенно если нумерация сквозная, мы должны быть предельно внимательны. Например, если нам нужно изменить номер "РТ0000001" на "РТ0000010", а номер "РТ0000010" уже существует, то обработка может выдать ошибку или перезаписать номер, что недопустимо. В таких случаях нам может потребоваться более сложная логика: сначала изменить номер "РТ0000010" на временный, затем "РТ0000001" на "РТ0000010", и только потом вернуть оригинальному документу его номер.

Для 1С 8.1 часто используется обработка "Групповое изменение реквизитов". Мы можем добавить эту обработку в рабочую область или открыть через меню "Файл - Открыть".

  1. Откроем обработку "Групповое изменение реквизитов".
  2. Выберем вид документа, который хотим изменить.
  3. Установим отбор по тем документам, которым нужно изменить дату/номер.
  4. В поле "Что изменять" найдем реквизиты "Дата" и "Номер".
  5. Укажем новое значение для даты и номера.
  6. Нажмем кнопку "Изменить".

Важно: После изменения номера и даты мы обязательно должны перепровести документы. Это можно сделать той же обработкой, если она поддерживает пакетное перепроведение, либо стандартными средствами, отобрав документы по новым датам.

Программное изменение номера и даты документа

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

Для программного изменения мы будем использовать встроенный язык 1С. Основной подход заключается в получении объекта документа, изменении его реквизитов и записи обратно. Однако, мы должны учитывать, что простое изменение номера и даты может быть недостаточным, и нам потребуется дополнительно работать с движениями регистра.

Пример программного кода для изменения номера и даты:


Функция ИзменитьНомерИДатуДокумента(СсылкаНаДокумент, НовыйНомер, НоваяДата) Экспорт

    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

    Если ДокументОбъект.Проведен Тогда
        ДокументОбъект.ОтменитьПроведение(); // Сначала отменяем проведение
    КонецЕсли;

    // Изменяем номер и дату
    ДокументОбъект.Номер = НовыйНомер;
    ДокументОбъект.Дата  = НоваяДата;

    Попытка
        ДокументОбъект.Записать(); // Записываем изменения
        ДокументОбъект.Провести(); // Проводим документ заново с новой датой и номером
        Сообщить("Документ " + СсылкаНаДокумент + " успешно изменен и перепроведен.");
        Возврат Истина;
    Исключение
        Сообщить("Ошибка при изменении документа " + СсылкаНаДокумент + ": " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытка;

КонецФункции

// Пример вызова функции:
// Ссылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000001", НачалоГода(ТекущаяДата()));
// Если Ссылка.Пустая() Тогда
//     Сообщить("Документ не найден.");
// Иначе
//     ИзменитьНомерИДатуДокумента(Ссылка, "РТ0000010", '20230115');
// КонецЕсли;

В этом примере мы сначала получаем объект документа, затем отменяем его проведение (чтобы "очистить" старые движения). После этого мы меняем реквизиты Номер и Дата, записываем документ и проводим его заново. Этот подход гарантирует, что движения будут сформированы с новой датой. Мы всегда должны использовать метод ОтменитьПроведение() перед изменением данных, если документ был проведен, а затем Провести().

Корректировка движений регистра

Иногда простого перепроведения документа может быть недостаточно, особенно если документ формирует движения в регистрах, которые не очищаются при отмене проведения, или если в конфигурации есть нетиповая логика. В таких случаях нам может потребоваться прямая корректировка движений регистров.

Мы можем получить набор записей регистра, относящихся к нашему документу, изменить у них дату (и, при необходимости, другие реквизиты, такие как период) и записать набор записей обратно. Это очень ответственная операция, требующая глубокого понимания структуры регистров и последствий изменений.

Пример программного кода для корректировки движений регистра:


Функция ИзменитьДатуДвиженийРегистра(СсылкаНаДокумент, ИмяРегистра, НоваяДата) Экспорт

    // Получаем менеджер регистра
    МенеджерРегистра = РегистрыНакопления[ИмяРегистра]; // Или РегистрыСведений, РегистрыБухгалтерии

    НаборЗаписей = МенеджерРегистра.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
    НаборЗаписей.Прочитать();

    Если НаборЗаписей.Количество() > 0 Тогда
        Для Каждого ЗаписьРегистра Из НаборЗаписей Цикл
            ЗаписьРегистра.Период = НоваяДата; // Меняем период движения
            // Дополнительно, если в регистре есть поле ДатаДокумента, его тоже можно поменять
            // Если ЗаписьРегистра.Свойство("ДатаДокумента") Тогда
            //     ЗаписьРегистра.ДатаДокумента = НоваяДата;
            // КонецЕсли;
        КонецЦикла;
        Попытка
            НаборЗаписей.Записать();
            Сообщить("Даты движений регистра " + ИмяРегистра + " для документа " + СсылкаНаДокумент + " успешно изменены.");
            Возврат Истина;
        Исключение
            Сообщить("Ошибка при изменении дат движений регистра " + ИмяРегистра + ": " + ОписаниеОшибки());
            Возврат Ложь;
        КонецПопытка;
    Иначе
        Сообщить("Для документа " + СсылкаНаДокумент + " не найдено движений в регистре " + ИмяРегистра + ".");
        Возврат Истина; // Считаем, что все хорошо, если нет движений
    КонецЕсли;

КонецФункции

// Пример вызова:
// Ссылка = Документы.ПриходныйКассовыйОрдер.НайтиПоНомеру("ПК00000001", НачалоГода(ТекущаяДата()));
// Если Не Ссылка.Пустая() Тогда
//     ИзменитьДатуДвиженийРегистра(Ссылка, "ДенежныеСредства", '20230115');
//     ИзменитьДатуДвиженийРегистра(Ссылка, "ВзаиморасчетыСКонтрагентами", '20230115');
// КонецЕсли;

Мы видим, что такой подход требует знания имени регистра (например, РегистрНакопления.ДенежныеСредства) и может быть применен к нескольким регистрам, с которыми работает документ. Всегда рекомендуем выполнять такие операции в тестовой базе и с предварительным резервным копированием.

Работа с блокировками и последовательностями документов

При изменении документов задним числом мы сталкиваемся с потенциальными проблемами нарушения последовательности. В 1С 8.1 есть механизм "Установка границы последовательности". Это важный инструмент, который позволяет системе понять, с какого момента ей необходимо восстановить правильную хронологию. Если мы изменили документ, который был проведен, а после него были проведены другие документы, система может "потерять" правильную последовательность.

Для восстановления последовательности нам нужно выполнить следующие шаги:

  1. Определим дату, до которой все документы были проведены корректно.
  2. Установим границу последовательности на эту дату или на дату самого раннего измененного документа. Это можно сделать через стандартные обработки или программно.
  3. Перепроведем все документы, начиная с установленной границы последовательности. Это может занять много времени, особенно на больших базах.

Программный пример установки границы последовательности:


Функция УстановитьГраницуПоследовательности(ИмяПоследовательности, ДатаГраницы) Экспорт

    Последовательность = Последовательности[ИмяПоследовательности];
    Последовательность.УстановитьГраницу(ДатаГраницы);

    Сообщить("Граница последовательности '" + ИмяПоследовательности + "' установлена на " + Формат(ДатаГраницы, "ДФ=dd.MM.yyyy HH:mm:ss") + ".");
    Возврат Истина;

КонецФункции

// Пример вызова:
// УстановитьГраницуПоследовательности("РасчетыПоЗакупкам", НачалоДня(ТекущаяДата()) - 60*60*24); // Установить границу на вчера

В типовых конфигурациях 1С существуют регламентные задания и обработки для восстановления последовательностей (например, "Проведение по партиям"). Мы должны использовать их после любых существенных изменений дат и номеров документов.

Дополнительные рекомендации и предупреждения

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

← На главную