При работе в программе 1С:Розница редакции 2.3 (особенно в релизах ветки 2.3.9 и начале 2.3.10) пользователи часто сталкиваются с неприятной ситуацией: в Рабочем месте кассира (РМК) при попытке пробить чек с использованием промокода или однократного купона возникает критическая ошибка: «Поле объекта не обнаружено (КлючСвязи)». Несмотря на то, что сама продажа может физически завершиться, система выдает окно с дампом ошибки, а данные о применении купона записываются некорректно. Рассмотрим подробнее, почему это происходит и как исправить ситуацию.
Проанализируем ситуацию с технической точки зрения. Данная ошибка является типовым программным багом конфигурации, допущенным разработчиками в процессе масштабного обновления подсистемы лояльности. В новых версиях РМК был изменен механизм распределения скидок между строками товаров. Для корректной связи между основной таблицей Товары и вспомогательными таблицами (например, СкидкиРассчитанные) используется служебный реквизит КлючСвязи.
Выясним причину сбоя: программный код обработки РМКУправляемыйРежим в цикле обходит строки табличной части и пытается обратиться к колонке КлючСвязи. Однако в метаданных конкретного релиза или во временных структурах данных, создаваемых при расчете купонов, эта колонка просто отсутствует. Система ожидает увидеть поле для идентификации строки, но не находит его, что и приводит к аварийной остановке выполнения скрипта.
Разберем по шагам, как найти место ошибки в коде. Для этого нам потребуется запустить Конфигуратор и выполнить следующие действия:
Обработки.РМКУправляемыйРежим и откроем его основную форму (обычно это Форма или ФормаРМК).В этом месте кода мы увидим конструкцию, похожую на следующую:
Если СтрокаТабличнойЧасти[ИмяРеквизитаКлюча] = 0 Тогда
// Логика обработки связи скидки и товара
ИначеЕсли //...
КонецЕсли;
Переменная ИмяРеквизитаКлюча в данном контексте принимает значение "КлючСвязи". Поскольку в текущей табличной части (например, при обработке временных данных промокодов) этой колонки нет, система выбрасывает исключение.
Если проблему нужно устранить «здесь и сейчас», чтобы касса могла продолжить работу, рассмотрим самый быстрый вариант — подавление ошибки. Мы можем обернуть проблемный участок в защитный блок. Посмотрим на пример модификации кода:
Попытка
Если СтрокаТабличнойЧасти[ИмяРеквизитаКлюча] = 0 Тогда
// Выполнение действий, если ключ равен нулю
КонецЕсли;
Исключение
// Если поля не существует, просто пропускаем проверку
КонецПопытки;
Важное предупреждение: этот метод уберет само сообщение об ошибке, и кассир сможет закрыть чек. Однако, как показывает практика, это решение не является полным. При использовании этого метода данные в регистре Использование купонов могут не связаться с конкретным документом Чек ККМ. Кроме того, в справочнике Купоны могут начать плодиться пустые или технические записи с идентификаторами типа GUID (например, 651bce91-8343-11ec...), что со временем приведет к замусориванию базы данных.
Проанализируем более правильный подход, который не снимает конфигурацию с поддержки. Профессиональное решение заключается в создании Расширения. В расширении необходимо программно добавить колонку КлючСвязи в структуру, которую обрабатывает РМК, если она там отсутствует.
Рассмотрим пример кода, который можно поместить в расширение в процедуру ПриСозданииНаСервере или перед вызовом расчета скидок:
&После("ИнициализироватьТабличныеЧастиРМК")
Процедура Расш_ИнициализироватьТабличныеЧастиРМК(Форма)
// Проверяем наличие колонки в таблице скидок
МетаданныеТЧ = Форма.Объект.СкидкиРассчитанные;
Если МетаданныеТЧ.Колонки.Найти("КлючСвязи") = Неопределено Тогда
// Добавляем колонку программно, чтобы избежать ошибки "Поле не обнаружено"
Форма.Объект.СкидкиРассчитанные.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
КонецЕсли;
КонецПроцедуры
Этот метод позволяет системе корректно отрабатывать штатные алгоритмы 1С, так как поле, к которому обращается программа, теперь физически существует в памяти, даже если оно остается пустым.
Поскольку проблема носит массовый характер и признана разработчиками 1С, наиболее надежным способом решения будет обновление конфигурации. Разберем, как это сделать правильно:
Администрирование — Обслуживание — Обновление программы.Установленные исправления (патчи). Программа автоматически проверит наличие исправлений для вашего релиза.Если патчи недоступны, рекомендуется выполнить полноценное обновление до актуального релиза (ветки 2.3.11 или выше), где данная ошибка была исправлена на уровне кода основной конфигурации.
Разберем ситуацию, когда после применения «костыльного» решения с Попытка...Исключение в справочнике Купоны появляются странные записи. Выясним причину: при сканировании промокода система создает временный объект для расчета. Если процедура завершения чека прерывается ошибкой (или подавляется «Попыткой»), транзакция по очистке временных данных может не сработать. В итоге временный GUID купона сохраняется в базе как постоянная запись. Чтобы этого избежать, используйте только официальные патчи или полноценное добавление колонки через расширение, как описано выше.
Резюмируем: ошибка Поле объекта не обнаружено (КлючСвязи) — это следствие несоответствия структуры таблиц в РМК и программного кода. Оптимальный путь решения — установка официального патча от фирмы 1С или обновление конфигурации до актуальной версии. При невозможности обновления используйте механизм расширений для добавления недостающего реквизита в коллекции данных формы РМК.