При работе в конфигурации «1С:Розница 2.2» (особенно на релизах линейки 2.2.12.30 – 2.2.13.8) многие пользователи столкнулись со сбоем программы при попытке добавить товары в документ через форму подбора. При переносе выбранных позиций в документ «Реализация товаров» (или другие складские и товарные документы) система аварийно завершает работу, выдавая ошибку следующего вида:
{ОбщийМодуль.ОбработкаТабличнойЧастиТоварыСервер.Модуль(5141)}: Значение не является значением объектного типа (Свойство) Если СтруктураПараметровДействия.Свойство("ОбработатьБезМаркировки") Тогда
В этой статье мы подробно разберем технические причины возникновения этой ошибки, выясним, почему она напрямую связана с продажей алкоголя и маркированной продукции, а также рассмотрим несколько детальных способов ее исправления — от официального обновления до написания корректирующего расширения.
Давайте проанализируем внутреннюю логику работы конфигурации в момент переноса товаров. Когда оператор или кассир выбирает позиции в форме подбора и нажимает кнопку «Перенести в документ», программа запускает цепочку обработчиков событий на сервере:
ОбработкаВыбораПодборНаСервере.ОбработкаТабличнойЧастиТоварыСервер.ОбработатьСтрокуТЧСервер(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения).ПроверитьНеобходимостьВводаАкцизнойМарки(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения).Именно здесь и кроется уязвимость кода. Программа ожидает, что второй параметр — СтруктураПараметровДействия (переданный как СтруктураДействий) — инициализирован как объект типа Структура. Однако при вызове из формы подбора в данных релизах этот параметр передается со значением Неопределено.
Поскольку у примитивного типа Неопределено нет и не может быть метода Свойство(), платформа 1С закономерно выбрасывает исключение: «Значение не является значением объектного типа».
Для обычных (немаркированных) товаров эта проверка зачастую обходится системой стороной, поэтому часть пользователей может даже не подозревать о наличии проблемы. Но как только в списке подбора оказывается алкоголь или маркированная продукция, проверка становится обязательной, вызывая критический сбой.
---
Разработчики фирмы «1С» оперативно зарегистрировали данную ошибку и выпустили исправление. Проблема полностью устранена в релизе 2.2.13.11 конфигурации «1С:Розница 2.2» и во всех последующих версиях.
Если ваша база находится на стандартной поддержке и не содержит специфических доработок, лучшим решением будет обновление конфигурации:
1Cv8.1CD для файлового варианта или сделайте бэкап средствами СУБД для клиент-серверного).---
Часто бывают ситуации, когда обновить рабочую базу мгновенно невозможно: конфигурация может быть сильно доработана, или обновление требует длительного тестирования. В таком случае мы можем применить механизм расширений, который позволяет точечно скорректировать программный код общего модуля, не снимая базу с замка и не нарушая типовую поддержку.
Разберем процесс создания и настройки такого расширения по шагам:
ИсправлениеПодбора), синоним и оставьте назначение как Исправление. Нажмите ОК.ОбработкаТабличнойЧастиТоварыСервер. Нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.Для исправления проблемы мы можем перехватить процедуру ОбработатьСтрокуТЧСервер непосредственно перед ее выполнением и принудительно инициализировать структуру действий, если она оказалась пустой. Рассмотрим пример программного кода в расширении:
&Перед("ОбработатьСтрокуТЧСервер")
Процедура Расш1_ОбработатьСтрокуТЧСервер(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения)
// Если структура действий не определена, инициализируем ее как пустую структуру
Если ТипЗнч(СтруктураДействий) <> Тип("Структура") Тогда
СтруктураДействий = Новый Структура;
КонецЕсли;
КонецПроцедуры
Этот лаконичный код решает проблему на корню: перед тем как передать управление вложенным процедурам (включая проверку акцизных марок), мы проверяем тип переменной СтруктураДействий. Если она равна Неопределено, мы создаем новый пустой объект Структура. В результате вложенный вызов метода Свойство() отрабатывает штатно и возвращает значение Ложь, не вызывая аварийных остановок.
После написания кода сохраните расширение (клавиши Ctrl + S) и обновите конфигурацию базы данных (клавиша F7). Перезапустите сеанс «1С:Предприятие» и проверьте работу подбора.
---
Если ваша конфигурация уже снята с поддержки («правленная»), и вы не используете механизм расширений, вы можете внести изменения непосредственно в исходный код общего модуля.
Проанализируем этот вариант исправления:
ОбработкаТабличнойЧастиТоварыСервер.ОбработатьБезМаркировки).ПроверитьНеобходимостьВводаАкцизнойМарки.
// Было:
Если СтруктураПараметровДействия.Свойство("ОбработатьБезМаркировки") Тогда
// Стало:
Если ТипЗнч(СтруктураПараметровДействия) = Тип("Структура")
И СтруктураПараметровДействия.Свойство("ОбработатьБезМаркировки") Тогда
Благодаря использованию логического оператора И, если первая часть условия (проверка типа) возвращает ложь, платформа 1С даже не пытается вычислять вторую часть выражения, что полностью защищает систему от падения.
---
Если ошибка возникла прямо посреди рабочего дня, а программиста или системного администратора нет на месте, вы можете временно обойти проблему организационным путем. Научите ваших сотрудников работать без использования стандартного диалогового окна подбора:
Используя предложенные инструкции, вы сможете быстро восстановить работоспособность торговой точки и полностью устранить неприятную ошибку в логике маркировки конфигурации «1С:Розница».