При работе в системе 1С:Предприятие 7.7, особенно в конфигурации «Торговля и Склад» (ТиС), пользователи часто сталкиваются с неприятной ситуацией в начале нового календарного года. При попытке закрыть смену и провести документ ОтчетККМ система выдает критическую ошибку: «Код не уникальный! Документ не проводится!». При этом документ может успешно записываться, но на этапе проведения процесс прерывается.
В этой статье мы подробно разберем, почему возникает данная коллизия, чем «Код» отличается от «Номера» и как пошагово локализовать и устранить причину сбоя.
Первое и самое важное, что нам необходимо усвоить: в терминах платформы 1С 7.7 сообщение «Код не уникальный» практически всегда относится к справочникам. Если бы проблема была в самом документе ОтчетККМ, система бы выдала сообщение «Номер не уникальный». Это фундаментальное различие, которое часто сбивает с толку начинающих разработчиков и пользователей.
Проанализируем ситуацию: документ записывается (метод Записать() проходит успешно), но не проводится (метод Провести() вызывает ошибку). Это означает, что в теле процедуры ОбработкаПроведения, которая находится в модуле документа, происходит обращение к какому-либо справочнику. Программа пытается создать новый элемент справочника или изменить существующий, и именно в этот момент срабатывает контроль уникальности кода.
Давайте выясним, какие справочники чаще всего задействуются при проведении ОтчетаККМ в типовой конфигурации «Торговля и Склад»:
Партии. Если нумерация в этом справочнике сбилась или достигла своего предела в прошлом году, создание новой партии с кодом «00001» может вызвать конфликт.ОтчетККМ тесно связан со сменами. При проведении система может пытаться создать или обновить запись о смене.Рассмотрим фрагмент кода, который часто используется в обработке закрытия смены. Обратите внимание на использование метода УстановитьНовыйНомер(). Если мы программно создаем документ, важно понимать, в какой момент и как назначается номер.
// Пример из типовой обработки закрытия смены
ДокОКС = СоздатьОбъект("Документ.ОтчетККМ");
ДокОКС.Новый();
ДокОКС.ДатаДок = РабочаяДата();
// Если включена автонумерация, УстановитьНовыйНомер может быть избыточным
// или вызывать конфликты, если префикс определен неверно
ДокОКС.УстановитьНовыйНомер(Константа.ПрефиксАвтонумерации);
// Заполнение табличной части...
// ...
Попытка
ДокОКС.Записать();
Исключение
Предупреждение("Не удалось записать документ: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Если ДокОКС.Провести() = 0 Тогда
// Именно здесь вылетает "Код не уникальный!"
Предупреждение("Ошибка проведения!");
КонецЕсли;
Если мы видим, что Записать() отрабатывает, а Провести() — нет, значит, нам нужно заглянуть внутрь модуля самого документа ОтчетККМ.
Чтобы точно определить, какой справочник «капризничает», проанализируем ситуацию с помощью отладчика. Нам необходимо выполнить следующие действия:
ОтчетККМ.ОбработкаПроведения.Спр.Записать() или Регистр.Записать(), вызывающий создание партий) возникает ошибка.Как только мы найдем строку вида СпрПартии.Записать(), мы поймем, в каком справочнике нарушена уникальность.
Допустим, мы выяснили, что ошибка связана со справочником Партии. Почему это произошло в новом году? Рассмотрим основные причины:
Чтобы исправить это, найдем в справочнике элемент с самым большим кодом. Попробуем переименовать его или убедиться, что автоматический счетчик сможет его «перешагнуть». В 1С 7.7 полезно бывает найти последний введенный элемент и проверить его код на наличие лишних пробелов или символов в конце.
Если проблема все же в номере документа (автор темы мог ошибиться в терминологии), проверим, как работает УстановитьНовыйНомер(). Иногда в коде обработки закрытия смены этот метод вызывается несколько раз или с некорректным префиксом. Посмотрим на пример правильного вызова:
Док = СоздатьОбъект("Документ.ОтчетККМ");
Док.Новый();
// Указываем префикс, если он используется в организации
Док.УстановитьНовыйНомер("КБ-");
Док.Записать();
Важно помнить, что если в конфигураторе для документа установлена Автоматическая нумерация, то при вызове метода Новый() номер будет присвоен автоматически в момент записи, и принудительный вызов УстановитьНовыйНомер() может привести к дублированию, если алгоритм генерации не учитывает уже занятые в этой транзакции номера.
Если программный код корректен, справочники проверены, а ошибка «Код не уникальный» все равно появляется при проведении, возможно, проблема кроется в индексных файлах базы данных. В 1С 7.7 таблицы (DBF) и индексы (CDX) иногда рассинхронизируются.
Проанализируем алгоритм действий для лечения базы:
После реиндексации система заново построит списки уникальных кодов, и проблема может исчезнуть сама собой, если она была вызвана «битым» индексом.
Подведем итоги. Ошибка «Код не уникальный!» при проведении документа в 1С 7.7 — это сигнал о конфликте в справочниках, а не в самом документе. Чаще всего это связано с:
Для решения достаточно определить проблемный справочник через отладчик и подправить в нем нумерацию либо провести полное переиндексирование информационной базы. Следуя этим шагам, мы сможем оперативно восстановить работоспособность закрытия смены и обеспечить корректный учет в новом году.