Как исправить ошибку «Поле не обнаружено (КлючСвязи)» при использовании купонов в 1С:Розница?

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

При работе в программе 1С:Розница редакции 2.3 (особенно в релизах ветки 2.3.9 и начале 2.3.10) пользователи часто сталкиваются с неприятной ситуацией: в Рабочем месте кассира (РМК) при попытке пробить чек с использованием промокода или однократного купона возникает критическая ошибка: «Поле объекта не обнаружено (КлючСвязи)». Несмотря на то, что сама продажа может физически завершиться, система выдает окно с дампом ошибки, а данные о применении купона записываются некорректно. Рассмотрим подробнее, почему это происходит и как исправить ситуацию.

Анализируем причину возникновения ошибки

Проанализируем ситуацию с технической точки зрения. Данная ошибка является типовым программным багом конфигурации, допущенным разработчиками в процессе масштабного обновления подсистемы лояльности. В новых версиях РМК был изменен механизм распределения скидок между строками товаров. Для корректной связи между основной таблицей Товары и вспомогательными таблицами (например, СкидкиРассчитанные) используется служебный реквизит КлючСвязи.

Выясним причину сбоя: программный код обработки РМКУправляемыйРежим в цикле обходит строки табличной части и пытается обратиться к колонке КлючСвязи. Однако в метаданных конкретного релиза или во временных структурах данных, создаваемых при расчете купонов, эта колонка просто отсутствует. Система ожидает увидеть поле для идентификации строки, но не находит его, что и приводит к аварийной остановке выполнения скрипта.

Локализация проблемного участка в конфигураторе

Разберем по шагам, как найти место ошибки в коде. Для этого нам потребуется запустить Конфигуратор и выполнить следующие действия:

  1. Откроем дерево конфигурации и перейдем в ветку Обработки.
  2. Найдем объект РМКУправляемыйРежим и откроем его основную форму (обычно это Форма или ФормаРМК).
  3. Перейдем в модуль формы и воспользуемся поиском или переходом к строке (сочетание клавиш Ctrl + G). Согласно логам ошибки, нас интересует строка в районе 9163.

В этом месте кода мы увидим конструкцию, похожую на следующую:


Если СтрокаТабличнойЧасти[ИмяРеквизитаКлюча] = 0 Тогда
    // Логика обработки связи скидки и товара
ИначеЕсли //...
КонецЕсли;

Переменная ИмяРеквизитаКлюча в данном контексте принимает значение "КлючСвязи". Поскольку в текущей табличной части (например, при обработке временных данных промокодов) этой колонки нет, система выбрасывает исключение.

Решение 1: Использование конструкции «Попытка...Исключение» (быстрый обход)

Если проблему нужно устранить «здесь и сейчас», чтобы касса могла продолжить работу, рассмотрим самый быстрый вариант — подавление ошибки. Мы можем обернуть проблемный участок в защитный блок. Посмотрим на пример модификации кода:


Попытка
    Если СтрокаТабличнойЧасти[ИмяРеквизитаКлюча] = 0 Тогда
        // Выполнение действий, если ключ равен нулю
    КонецЕсли;
Исключение
    // Если поля не существует, просто пропускаем проверку
КонецПопытки;

Важное предупреждение: этот метод уберет само сообщение об ошибке, и кассир сможет закрыть чек. Однако, как показывает практика, это решение не является полным. При использовании этого метода данные в регистре Использование купонов могут не связаться с конкретным документом Чек ККМ. Кроме того, в справочнике Купоны могут начать плодиться пустые или технические записи с идентификаторами типа GUID (например, 651bce91-8343-11ec...), что со временем приведет к замусориванию базы данных.

Решение 2: Корректное исправление через расширение конфигурации

Проанализируем более правильный подход, который не снимает конфигурацию с поддержки. Профессиональное решение заключается в создании Расширения. В расширении необходимо программно добавить колонку КлючСвязи в структуру, которую обрабатывает РМК, если она там отсутствует.

Рассмотрим пример кода, который можно поместить в расширение в процедуру ПриСозданииНаСервере или перед вызовом расчета скидок:


&После("ИнициализироватьТабличныеЧастиРМК")
Процедура Расш_ИнициализироватьТабличныеЧастиРМК(Форма)
    // Проверяем наличие колонки в таблице скидок
    МетаданныеТЧ = Форма.Объект.СкидкиРассчитанные;
    Если МетаданныеТЧ.Колонки.Найти("КлючСвязи") = Неопределено Тогда
        // Добавляем колонку программно, чтобы избежать ошибки "Поле не обнаружено"
        Форма.Объект.СкидкиРассчитанные.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
    КонецЕсли;
КонецПроцедуры

Этот метод позволяет системе корректно отрабатывать штатные алгоритмы 1С, так как поле, к которому обращается программа, теперь физически существует в памяти, даже если оно остается пустым.

Решение 3: Официальные патчи и обновление программы

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

  1. Проверьте текущую версию программы в меню «Справка» — «О программе». Если ваша версия ниже 2.3.10.39, вы находитесь в зоне риска.
  2. Перейдите в раздел Администрирование — Обслуживание — Обновление программы.
  3. Нажмите на ссылку Установленные исправления (патчи). Программа автоматически проверит наличие исправлений для вашего релиза.
  4. Ищите патчи с описанием, содержащим ключевые слова «РМК», «Купоны» или «КлючСвязи». Установите их и перезапустите сеанс.

Если патчи недоступны, рекомендуется выполнить полноценное обновление до актуального релиза (ветки 2.3.11 или выше), где данная ошибка была исправлена на уровне кода основной конфигурации.

Почему появляются лишние записи в справочнике купонов?

Разберем ситуацию, когда после применения «костыльного» решения с Попытка...Исключение в справочнике Купоны появляются странные записи. Выясним причину: при сканировании промокода система создает временный объект для расчета. Если процедура завершения чека прерывается ошибкой (или подавляется «Попыткой»), транзакция по очистке временных данных может не сработать. В итоге временный GUID купона сохраняется в базе как постоянная запись. Чтобы этого избежать, используйте только официальные патчи или полноценное добавление колонки через расширение, как описано выше.

Резюмируем: ошибка Поле объекта не обнаружено (КлючСвязи) — это следствие несоответствия структуры таблиц в РМК и программного кода. Оптимальный путь решения — установка официального патча от фирмы 1С или обновление конфигурации до актуальной версии. При невозможности обновления используйте механизм расширений для добавления недостающего реквизита в коллекции данных формы РМК.

← На главную