Почему при проведении Отчета ККМ в 1С 7.7 возникает ошибка «Код не уникальный» и как ее устранить?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При работе в системе 1С:Предприятие 7.7, особенно в конфигурации «Торговля и Склад» (ТиС), пользователи часто сталкиваются с неприятной ситуацией в начале нового календарного года. При попытке закрыть смену и провести документ ОтчетККМ система выдает критическую ошибку: «Код не уникальный! Документ не проводится!». При этом документ может успешно записываться, но на этапе проведения процесс прерывается.

В этой статье мы подробно разберем, почему возникает данная коллизия, чем «Код» отличается от «Номера» и как пошагово локализовать и устранить причину сбоя.

Различие между кодом справочника и номером документа

Первое и самое важное, что нам необходимо усвоить: в терминах платформы 1С 7.7 сообщение «Код не уникальный» практически всегда относится к справочникам. Если бы проблема была в самом документе ОтчетККМ, система бы выдала сообщение «Номер не уникальный». Это фундаментальное различие, которое часто сбивает с толку начинающих разработчиков и пользователей.

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

Типичные «виновники» среди справочников

Давайте выясним, какие справочники чаще всего задействуются при проведении ОтчетаККМ в типовой конфигурации «Торговля и Склад»:

  1. Справочник «Партии»: Если в настройках базы включено автоматическое формирование партий при проведении, 1С создает новый элемент в справочнике Партии. Если нумерация в этом справочнике сбилась или достигла своего предела в прошлом году, создание новой партии с кодом «00001» может вызвать конфликт.
  2. Справочник «Кассовые смены»: Документ ОтчетККМ тесно связан со сменами. При проведении система может пытаться создать или обновить запись о смене.
  3. Справочник «Единицы» или «Цены»: В редких случаях, если при проведении обнаруживается отсутствие необходимых единиц измерения для номенклатуры, логика проведения может инициировать их создание.
  4. Справочник «Номера ГТД» или «Серийные номера»: Если ведется специфический учет, запись в эти справочники также может происходить в момент формирования движений.

Шаг 1: Анализ программного кода создания документа

Рассмотрим фрагмент кода, который часто используется в обработке закрытия смены. Обратите внимание на использование метода УстановитьНовыйНомер(). Если мы программно создаем документ, важно понимать, в какой момент и как назначается номер.


// Пример из типовой обработки закрытия смены
ДокОКС = СоздатьОбъект("Документ.ОтчетККМ");
ДокОКС.Новый();
ДокОКС.ДатаДок = РабочаяДата();
// Если включена автонумерация, УстановитьНовыйНомер может быть избыточным
// или вызывать конфликты, если префикс определен неверно
ДокОКС.УстановитьНовыйНомер(Константа.ПрефиксАвтонумерации); 

// Заполнение табличной части...
// ...

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

Если ДокОКС.Провести() = 0 Тогда
    // Именно здесь вылетает "Код не уникальный!"
    Предупреждение("Ошибка проведения!");
КонецЕсли;

Если мы видим, что Записать() отрабатывает, а Провести() — нет, значит, нам нужно заглянуть внутрь модуля самого документа ОтчетККМ.

Шаг 2: Работа с отладчиком

Чтобы точно определить, какой справочник «капризничает», проанализируем ситуацию с помощью отладчика. Нам необходимо выполнить следующие действия:

  1. Откроем конфигуратор и найдем модуль документа ОтчетККМ.
  2. Установим точку останова в самом начале процедуры ОбработкаПроведения.
  3. Запустим закрытие смены в режиме предприятия.
  4. Когда выполнение остановится на точке останова, будем проходить код пошагово (клавиша F8).
  5. Внимательно следим, после какой именно строки (обычно это Спр.Записать() или Регистр.Записать(), вызывающий создание партий) возникает ошибка.

Как только мы найдем строку вида СпрПартии.Записать(), мы поймем, в каком справочнике нарушена уникальность.

Шаг 3: Проверка нумерации в справочнике

Допустим, мы выяснили, что ошибка связана со справочником Партии. Почему это произошло в новом году? Рассмотрим основные причины:

Чтобы исправить это, найдем в справочнике элемент с самым большим кодом. Попробуем переименовать его или убедиться, что автоматический счетчик сможет его «перешагнуть». В 1С 7.7 полезно бывает найти последний введенный элемент и проверить его код на наличие лишних пробелов или символов в конце.

Шаг 4: Использование метода УстановитьНовыйНомер

Если проблема все же в номере документа (автор темы мог ошибиться в терминологии), проверим, как работает УстановитьНовыйНомер(). Иногда в коде обработки закрытия смены этот метод вызывается несколько раз или с некорректным префиксом. Посмотрим на пример правильного вызова:


Док = СоздатьОбъект("Документ.ОтчетККМ");
Док.Новый();
// Указываем префикс, если он используется в организации
Док.УстановитьНовыйНомер("КБ-"); 
Док.Записать();

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

Шаг 5: Тестирование и исправление базы

Если программный код корректен, справочники проверены, а ошибка «Код не уникальный» все равно появляется при проведении, возможно, проблема кроется в индексных файлах базы данных. В 1С 7.7 таблицы (DBF) и индексы (CDX) иногда рассинхронизируются.

Проанализируем алгоритм действий для лечения базы:

  1. Обязательно создаем резервную копию базы данных.
  2. Заходим в режим «Конфигуратор».
  3. Выбираем пункт меню «Администрирование» — «Тестирование и исправление ИБ».
  4. Устанавливаем галочки «Реиндексация таблиц» и «Проверка целостности логической структуры».
  5. Запускаем процесс.

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

Резюме

Подведем итоги. Ошибка «Код не уникальный!» при проведении документа в 1С 7.7 — это сигнал о конфликте в справочниках, а не в самом документе. Чаще всего это связано с:

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

← На главную