При совместной работе конфигураций «1С:Управление торговлей» и «1С:Розница» пользователи часто сталкиваются с неожиданными сбоями после настройки обмена данными. Одной из наиболее неприятных проблем является внезапный отказ системы при попытке создать или отредактировать дисконтную (информационную) карту в розничной базе.
В процессе выполнения операции программа аварийно завершает работу, выдавая диагностическое сообщение: «Поле объекта не обнаружено (ПараметрыКонтактнойИнформации)». При этом до настройки синхронизации этот функционал работал абсолютно корректно. В данной статье мы подробно разберем, почему возникает эта ошибка, как она связана с обменом данными и какими способами её можно устранить.
Для начала проанализируем архитектуру конфигурации. Ошибка происходит на стороне сервера в общем модуле УправлениеКонтактнойИнформацией. При создании новой дисконтной карты система инициализирует элементы управления для ввода адресов и телефонов на форме. Алгоритм пытается прочитать настройки отображения полей контактной информации, обращаясь к реквизиту формы:
СохраненноеПоложениеЗаголовка = Форма.ПараметрыКонтактнойИнформации.ПоложениеЗаголовка;
Проблема заключается в том, что на форме элемента справочника ИнформационныеКарты (или ФизическиеЛица в зависимости от настроек) данный реквизит либо отсутствует в структуре управляемой формы, либо структура ПараметрыКонтактнойИнформации не была инициализирована при создании формы на сервере.
Но почему эта ошибка «вылезает» именно после настройки обмена с 1С:Управление торговлей? Ответ кроется в логике работы функциональных опций:
ПараметрыКонтактнойИнформации, которое до активации обмена просто игнорировалось системой.Эта ошибка носила массовый характер в релизах линейки 1С:Розница 2.2.12.x (включая популярный релиз 2.2.12.30), а также в отраслевых решениях от компании «Рарус» (например, «Магазин одежды и обуви»).
---
Поскольку данная проблема официально признана разработчиками фирмы «1С» как программный дефект интеграции БСП, наиболее правильным и безопасным решением является обновление программных продуктов до актуальных релизов.
Рассмотрим последовательность действий для успешного обновления:
---
Если по каким-то причинам оперативно обновить конфигурацию невозможно (например, база сильно доработана или находится на поддержке без возможности быстрого обновления), мы можем решить проблему локально с помощью механизма расширений. Это позволит нам не снимать основную конфигурацию с поддержки.
Разберем этот процесс по шагам:
ИсправлениеОшибкиКонтактнойИнформации). Снимите для него флажки «Безопасный режим» и «Защита от опасных действий».ИнформационныеКарты (или ДисконтныеКарты, в зависимости от вашей версии) и найдите форму элемента.ПараметрыКонтактнойИнформацииПроизвольныйПриСозданииНаСервере, выбрав тип вызова &Перед или &После, и добавьте инициализацию структуры параметров:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Инициализируем структуру, чтобы БСП не вызывала исключение при обращении к ней
Если Не ЗначениеЗаполнено(ПараметрыКонтактнойИнформации) Тогда
ПараметрыКонтактнойИнформации = УправлениеКонтактнойИнформацией.ПараметрыКонтактнойИнформации();
КонецЕсли;
КонецПроцедуры
Применение этого расширения позволит системе корректно инициализировать требуемые свойства формы при её создании на сервере, даже если обмен данными активен.
---
Если ваша конфигурация уже снята с поддержки и вы можете вносить изменения напрямую в код, то проблему можно решить точечным исправлением общего модуля УправлениеКонтактнойИнформацией.
Проанализируем ситуацию: чтобы программа не падала с ошибкой при обращении к несуществующему реквизиту формы, мы можем добавить безопасную проверку существования свойства объекта с помощью механизмов самой платформы.
Найдите в общем модуле строку, вызывающую ошибку, и замените её на следующий безопасный блок кода:
// Безопасное получение свойства формы во избежание аварийного завершения
СохраненноеПоложениеЗаголовка = Неопределено;
Если ОбщегоНазначенияКлиентСервер.ЕстьСвойствоОбъекта(Форма, "ПараметрыКонтактнойИнформации") Тогда
Если Форма.ПараметрыКонтактнойИнформации <> Неопределено
И ОбщегоНазначенияКлиентСервер.ЕстьСвойствоОбъекта(Форма.ПараметрыКонтактнойИнформации, "ПоложениеЗаголовка") Тогда
СохраненноеПоложениеЗаголовка = Форма.ПараметрыКонтактнойИнформации.ПоложениеЗаголовка;
КонецЕсли;
КонецЕсли;
В крайнем случае, если вы хотите максимально быстро восстановить работоспособность касс и дисконтных карт «здесь и сейчас», можно обернуть проблемный участок в стандартную конструкцию исключения:
Попытка
СохраненноеПоложениеЗаголовка = Форма.ПараметрыКонтактнойИнформации.ПоложениеЗаголовка;
Исключение
СохраненноеПоложениеЗаголовка = Неопределено;
КонецПопытки;
Использование конструкции Попытка...Исключение гарантирует, что даже при отсутствии реквизита на форме программа не прервет работу пользователя, а просто пропустит шаг форматирования заголовков контактной информации.
Мы выяснили, что ошибка с полем ПараметрыКонтактнойИнформации является следствием конфликта настроек синхронизации данных с алгоритмами Библиотеки стандартных подсистем. Наиболее концептуально верным решением является плановое обновление конфигурации «1С:Розница». Однако в экстренных случаях использование расширения формы элемента дисконтной карты или небольшая корректировка серверного кода общего модуля помогут вам быстро восстановить стабильную работу розничного магазина.