Как исправить ошибку «Значение не является значением объектного типа (Свойство)» при подборе товаров в 1С:Розница?

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

При работе в конфигурации «1С:Розница 2.2» (особенно на релизах линейки 2.2.12.30 – 2.2.13.8) многие пользователи столкнулись со сбоем программы при попытке добавить товары в документ через форму подбора. При переносе выбранных позиций в документ «Реализация товаров» (или другие складские и товарные документы) система аварийно завершает работу, выдавая ошибку следующего вида:

{ОбщийМодуль.ОбработкаТабличнойЧастиТоварыСервер.Модуль(5141)}: Значение не является значением объектного типа (Свойство) Если СтруктураПараметровДействия.Свойство("ОбработатьБезМаркировки") Тогда

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

Выясняем причину: почему возникает ошибка?

Давайте проанализируем внутреннюю логику работы конфигурации в момент переноса товаров. Когда оператор или кассир выбирает позиции в форме подбора и нажимает кнопку «Перенести в документ», программа запускает цепочку обработчиков событий на сервере:

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

Именно здесь и кроется уязвимость кода. Программа ожидает, что второй параметр — СтруктураПараметровДействия (переданный как СтруктураДействий) — инициализирован как объект типа Структура. Однако при вызове из формы подбора в данных релизах этот параметр передается со значением Неопределено.

Поскольку у примитивного типа Неопределено нет и не может быть метода Свойство(), платформа 1С закономерно выбрасывает исключение: «Значение не является значением объектного типа».

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

---

Способ 1. Официальное обновление конфигурации (Рекомендуемый метод)

Разработчики фирмы «1С» оперативно зарегистрировали данную ошибку и выпустили исправление. Проблема полностью устранена в релизе 2.2.13.11 конфигурации «1С:Розница 2.2» и во всех последующих версиях.

Если ваша база находится на стандартной поддержке и не содержит специфических доработок, лучшим решением будет обновление конфигурации:

  1. Выполните резервное копирование вашей информационной базы (создайте копию файла 1Cv8.1CD для файлового варианта или сделайте бэкап средствами СУБД для клиент-серверного).
  2. Откройте базу в режиме «Конфигуратор».
  3. Перейдите в меню Конфигурация — Поддержка — Обновить конфигурацию.
  4. Следуйте указаниям помощника обновления, выбрав релиз 2.2.13.11 или более новый.
  5. После завершения обновления запустите программу в режиме «Предприятие» и обязательно дождитесь завершения всех процедур обновления данных в пользовательском режиме.

---

Способ 2. Исправление ошибки с помощью расширения (Если нельзя обновиться)

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

Разберем процесс создания и настройки такого расширения по шагам:

  1. Запустите «Конфигуратор» вашей рабочей или тестовой базы.
  2. Откройте меню Конфигурация — Расширения конфигурации.
  3. В открывшемся окне нажмите кнопку Добавить. Задайте имя расширения (например, ИсправлениеПодбора), синоним и оставьте назначение как Исправление. Нажмите ОК.
  4. В списке расширений обязательно снимите галочку в колонке «Безопасный режим». Это необходимо для того, чтобы расширение имело доступ к серверным процедурам общих модулей.
  5. В основном дереве конфигурации найдите общий модуль ОбработкаТабличнойЧастиТоварыСервер. Нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.
  6. Перейдите в дерево объектов вашего нового расширения, откройте добавленный общий модуль и добавьте переопределяющий метод.

Для исправления проблемы мы можем перехватить процедуру ОбработатьСтрокуТЧСервер непосредственно перед ее выполнением и принудительно инициализировать структуру действий, если она оказалась пустой. Рассмотрим пример программного кода в расширении:


&Перед("ОбработатьСтрокуТЧСервер")
Процедура Расш1_ОбработатьСтрокуТЧСервер(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения)
	
	// Если структура действий не определена, инициализируем ее как пустую структуру
	Если ТипЗнч(СтруктураДействий) <> Тип("Структура") Тогда
		СтруктураДействий = Новый Структура;
	КонецЕсли;
	
КонецПроцедуры

Этот лаконичный код решает проблему на корню: перед тем как передать управление вложенным процедурам (включая проверку акцизных марок), мы проверяем тип переменной СтруктураДействий. Если она равна Неопределено, мы создаем новый пустой объект Структура. В результате вложенный вызов метода Свойство() отрабатывает штатно и возвращает значение Ложь, не вызывая аварийных остановок.

После написания кода сохраните расширение (клавиши Ctrl + S) и обновите конфигурацию базы данных (клавиша F7). Перезапустите сеанс «1С:Предприятие» и проверьте работу подбора.

---

Способ 3. Исправление в конфигураторе (Для доработанных баз)

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

Проанализируем этот вариант исправления:

  1. Откройте «Конфигуратор» и найдите общий модуль ОбработкаТабличнойЧастиТоварыСервер.
  2. Перейдите к строке 5141 (или воспользуйтесь глобальным поиском по тексту ОбработатьБезМаркировки).
  3. Найдите процедуру ПроверитьНеобходимостьВводаАкцизнойМарки.
  4. Замените проблемный участок кода безопасной проверкой типа данных:

// Было:
Если СтруктураПараметровДействия.Свойство("ОбработатьБезМаркировки") Тогда

// Стало:
Если ТипЗнч(СтруктураПараметровДействия) = Тип("Структура") 
   И СтруктураПараметровДействия.Свойство("ОбработатьБезМаркировки") Тогда

Благодаря использованию логического оператора И, если первая часть условия (проверка типа) возвращает ложь, платформа 1С даже не пытается вычислять вторую часть выражения, что полностью защищает систему от падения.

---

Временный обходной путь для кассиров и операторов

Если ошибка возникла прямо посреди рабочего дня, а программиста или системного администратора нет на месте, вы можете временно обойти проблему организационным путем. Научите ваших сотрудников работать без использования стандартного диалогового окна подбора:

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

← На главную