При работе в конфигурации «1С:Бухгалтерия предприятия 3.0» пользователи иногда сталкиваются с ситуацией, когда в базу данных попадает документ с некорректным годом — например, «0015» вместо «2015». Обычно это происходит при автоматической загрузке данных из внешних файлов (Excel, XML) или сервисов обмена, где двухзначный год («15») распознается платформой как начало нашей эры.
Попытка интерактивно пометить такой документ на удаление в интерфейсе пользователя приводит к ошибке: «Дата документа должна быть не ранее 2000 года» (или аналогичному системному предупреждению контроля дат). При этом платформа не позволяет ни отредактировать дату в форме, ни записать изменения. Проанализируем причину такого поведения системы и рассмотрим по шагам надежные способы устранения ошибки.
В типовых решениях на базе «Библиотеки стандартных подсистем» (БСП) в обработчиках ПередЗаписью и ОбработкаПроверкиЗаполнения встроен жесткий контроль допустимого интервала дат документов (как правило, от 01.01.2000 года). Любое интерактивное действие по пометке объекта на удаление вызывает процедуру записи объекта, которая инициирует проверку и прерывает операцию.
Выясним, какими способами можно безопасно снять блокировку и удалить ошибочный документ из информационной базы.
Разберем вариант исправления даты без доработки конфигурации с помощью стандартного инструмента администратора:
Дата и укажем корректный год (например, 2015 год вместо 0015).После того как дата примет корректное значение, документ можно будет стандартным образом пометить на удаление и выполнить регламентную процедуру «Удаление помеченных объектов».
Если мы обладаем правами администратора и имеем доступ к внешней обработке или консоли кода, рассмотрим наиболее универсальный и безопасный программный способ. Для обхода встроенных проверок модуля объекта используем свойство ОбменДанными.Загрузка:
// Получаем объект документа по ссылке
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Если ДокОбъект <> Неопределено Тогда
// Отключаем выполнение бизнес-логики и проверок перед записью
ДокОбъект.ОбменДанными.Загрузка = Истина;
// Устанавливаем пометку на удаление и при необходимости корректируем дату
ДокОбъект.ПометкаУдаления = Истина;
ДокОбъект.Дата = Дата(2015, Месяц(ДокОбъект.Дата), День(ДокОбъект.Дата));
ДокОбъект.Записать();
КонецЕсли;
Установка свойства ОбменДанными.Загрузка = Истина позволяет временно отключить платформенные и конфигурационные валидаторы модуля объекта. После успешной записи объект попадает в список помеченных на удаление, откуда окончательно стирается штатным механизмом администрирования с проверкой ссылочной целостности базы.
В исключительных случаях, когда документ не имеет движений по регистрам и на него отсутствуют ссылки в других объектах базы, программист с полными административными правами может применить прямое физическое удаление объекта из базы данных:
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Если ДокОбъект <> Неопределено Тогда
// Прямое удаление объекта из информационной базы
ДокОбъект.Удалить();
КонецЕсли;
Важно: вызов метода Удалить() требует максимальной осторожности. Если документ ранее проводился, данный метод удалит только саму запись документа, оставив некорректные «зависшие» движения в регистрах бухгалтерии (Хозрасчетный) или накопления. Поэтому рекомендуется отдавать предпочтение установке пометки на удаление через свойство ОбменДанными.Загрузка с последующим типовым удалением объектов.