Как удалить документ с некорректной датой (например, 0015 года) в 1С:Бухгалтерия 8?

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

При работе в конфигурации «1С:Бухгалтерия предприятия 3.0» пользователи иногда сталкиваются с ситуацией, когда в базу данных попадает документ с некорректным годом — например, «0015» вместо «2015». Обычно это происходит при автоматической загрузке данных из внешних файлов (Excel, XML) или сервисов обмена, где двухзначный год («15») распознается платформой как начало нашей эры.

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

Почему возникает блокировка при пометке на удаление?

В типовых решениях на базе «Библиотеки стандартных подсистем» (БСП) в обработчиках ПередЗаписью и ОбработкаПроверкиЗаполнения встроен жесткий контроль допустимого интервала дат документов (как правило, от 01.01.2000 года). Любое интерактивное действие по пометке объекта на удаление вызывает процедуру записи объекта, которая инициирует проверку и прерывает операцию.

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

Способ 1. Использование типовой обработки «Групповое изменение реквизитов»

Разберем вариант исправления даты без доработки конфигурации с помощью стандартного инструмента администратора:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. Выберем вид документа, в котором допущена ошибка (например, Отчет комиссионера (агента) о продажах).
  3. Настроим отбор по конкретному документу (по номеру или ссылке), чтобы случайно не затронуть другие объекты.
  4. Откроем Дополнительные параметры обработки, включим режим разработчика (пункт «Разрешить редактирование реквизитов объектов») и снимем флаги выполнения стандартных проверок при записи.
  5. В табличной части реквизитов найдем поле Дата и укажем корректный год (например, 2015 год вместо 0015).
  6. Нажмем Изменить реквизиты.

После того как дата примет корректное значение, документ можно будет стандартным образом пометить на удаление и выполнить регламентную процедуру «Удаление помеченных объектов».

Способ 2. Программная пометка на удаление с отключением проверок

Если мы обладаем правами администратора и имеем доступ к внешней обработке или консоли кода, рассмотрим наиболее универсальный и безопасный программный способ. Для обхода встроенных проверок модуля объекта используем свойство ОбменДанными.Загрузка:


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

Если ДокОбъект <> Неопределено Тогда
    // Отключаем выполнение бизнес-логики и проверок перед записью
    ДокОбъект.ОбменДанными.Загрузка = Истина;
    
    // Устанавливаем пометку на удаление и при необходимости корректируем дату
    ДокОбъект.ПометкаУдаления = Истина;
    ДокОбъект.Дата = Дата(2015, Месяц(ДокОбъект.Дата), День(ДокОбъект.Дата));
    
    ДокОбъект.Записать();
КонецЕсли;

Установка свойства ОбменДанными.Загрузка = Истина позволяет временно отключить платформенные и конфигурационные валидаторы модуля объекта. После успешной записи объект попадает в список помеченных на удаление, откуда окончательно стирается штатным механизмом администрирования с проверкой ссылочной целостности базы.

Способ 3. Непосредственное удаление через метод Удалить()

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


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

Если ДокОбъект <> Неопределено Тогда
    // Прямое удаление объекта из информационной базы
    ДокОбъект.Удалить();
КонецЕсли;

Важно: вызов метода Удалить() требует максимальной осторожности. Если документ ранее проводился, данный метод удалит только саму запись документа, оставив некорректные «зависшие» движения в регистрах бухгалтерии (Хозрасчетный) или накопления. Поэтому рекомендуется отдавать предпочтение установке пометки на удаление через свойство ОбменДанными.Загрузка с последующим типовым удалением объектов.

← На главную