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