При внедрении сторонних расширений или разработке собственных модулей в среде 1С:Управление торговлей 11 (УТ 11) программисты часто сталкиваются с ошибкой Значение не является значением объектного типа (Организация). Эта проблема особенно характерна для ситуаций, когда новый документ из расширения пытается использовать стандартные механизмы налогообложения или проведения, заложенные в типовой конфигурации. Рассмотрим подробно, почему это происходит и как правильно решить проблему, сохранив чистоту кода и архитектуры.
Давайте проанализируем ситуацию. Ошибка возникает в Модуле менеджера документа РеализацияТоваровУслуг, в функции ПараметрыЗаполненияНалогообложенияНДСПродажи. Если мы изучим код этой функции, то увидим следующую логику:
Функция ПараметрыЗаполненияНалогообложенияНДСПродажи(Объект) Экспорт
ПараметрыЗаполнения = УчетНДСУПКлиентСервер.ПараметрыЗаполненияНалогообложенияНДСПродажи;
Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Или ТипЗнч(Объект) = Тип("ДанныеФормыСтруктура") Тогда
ДанныеОбъекта = Объект;
ИначеЕсли ТипЗнч(Объект) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ДанныеОбъекта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект, "Организация,Договор,Склад,Дата,НаправлениеДеятельности,ХозяйственнаяОперация,Подразделение");
КонецЕсли;
ПараметрыЗаполнения.Организация = ДанныеОбъекта.Организация; // Ошибка здесь
// ... дальнейший код
КонецФункции
Разберем по шагам, что здесь происходит. Программа проверяет тип переданного в функцию параметра Объект. Типовой код ожидает только три варианта: объект реализации, структуру данных формы или ссылку на реализацию. Когда расширение передает в эту функцию объект нового документа (например, ДокументОбъект.ТУ_УниверсальныйСервис), ни одно из условий Если или ИначеЕсли не выполняется.
В результате переменная ДанныеОбъекта остается инициализированной значением Неопределено. Как только код доходит до строки ДанныеОбъекта.Организация, система пытается обратиться к свойству "пустоты", что и вызывает фатальную ошибку. Выясним причину: это происходит из-за того, что типовая конфигурация ничего не знает о вашем новом документе из расширения.
Наиболее правильный и безопасный способ решения проблемы без вмешательства в типовой код модуля менеджера — это правильная подготовка данных перед вызовом функции. Вместо того чтобы передавать в функцию ЭтотОбъект (весь документ целиком), мы сформируем структуру, которую функция сможет корректно обработать.
Рассмотрим пример кода, который должен быть размещен в модуле вашего нового документа (например, в процедуре ОбработкаЗаполнения или перед вызовом расчетов НДС):
// Вместо прямого вызова:
// Параметры = Документы.РеализацияТоваровУслуг.ПараметрыЗаполненияНалогообложенияНДСПродажи(ЭтотОбъект);
// Используем правильный подход:
ПараметрыДляПередачи = Новый Структура;
ПараметрыДляПередачи.Вставить("Организация", ЭтотОбъект.Организация);
ПараметрыДляПередачи.Вставить("Дата", ЭтотОбъект.Дата);
ПараметрыДляПередачи.Вставить("Склад", ЭтотОбъект.Склад);
ПараметрыДляПередачи.Вставить("Договор", ЭтотОбъект.Договор);
ПараметрыДляПередачи.Вставить("НаправлениеДеятельности", ЭтотОбъект.НаправлениеДеятельности);
ПараметрыДляПередачи.Вставить("ХозяйственнаяОперация", ЭтотОбъект.ХозяйственнаяОперация);
ПараметрыДляПередачи.Вставить("Подразделение", ЭтотОбъект.Подразделение);
// Теперь передаем структуру, которую функция воспримет как "ДанныеФормыСтруктура"
ПараметрыЗаполнения = Документы.РеализацияТоваровУслуг.ПараметрыЗаполненияНалогообложенияНДСПродажи(ПараметрыДляПередачи);
Важный момент: Для того чтобы этот метод сработал, убедитесь, что в вашем новом документе есть все перечисленные реквизиты. Если какого-то реквизита (например, Подразделение) нет, его все равно нужно добавить в структуру со значением Справочники.СтруктураПредприятия.ПустаяСсылка() или Неопределено, иначе функция снова упадет при обращении к недостающему свойству.
Если вы хотите, чтобы типовая функция "научилась" работать с вашим типом документа напрямую, можно использовать механизм расширений с аннотацией &Вместо или &Перед. Это позволит добавить проверку вашего типа документа прямо в логику функции ПараметрыЗаполненияНалогообложенияНДСПродажи.
Проанализируем пример реализации в расширении:
&Вместо("ПараметрыЗаполненияНалогообложенияНДСПродажи")
Функция ТУ_ПараметрыЗаполненияНалогообложенияНДСПродажи(Объект)
// Если это наш документ, обрабатываем его особо
Если ТипЗнч(Объект) = Тип("ДокументОбъект.ТУ_УниверсальныйСервис") Тогда
ПараметрыЗаполнения = УчетНДСУПКлиентСервер.ПараметрыЗаполненияНалогообложенияНДСПродажи;
ДанныеОбъекта = Объект;
ПараметрыЗаполнения.Организация = ДанныеОбъекта.Организация;
ПараметрыЗаполнения.Дата = ДанныеОбъекта.Дата;
// ... заполняем остальные параметры
Возврат ПараметрыЗаполнения;
КонецЕсли;
// Для всех остальных случаев вызываем стандартную логику
Возврат ПродолжитьВызов(Объект);
КонецФункции
Этот способ более трудозатратен, так как требует внесения изменений в расширение для модуля менеджера существующего объекта РеализацияТоваровУслуг, но он позволяет избежать дублирования кода подготовки структуры в разных местах вашего нового модуля.
Рассмотрим часто предлагаемый на форумах совет: закомментировать строку с ошибкой или жестко прописать организацию через НайтиПоНаименованию. Проанализируем, почему это плохая практика:
Организация, код упадет на следующей же строке — ДанныеОбъекта.Дата, так как объект по-прежнему не определен.Чтобы окончательно убедиться в причине ошибки, выполним следующие действия в режиме отладчика:
ПараметрыЗаполненияНалогообложенияНДСПродажи в модуле менеджера РеализацияТоваровУслуг.ТипЗнч(Объект).Если...ИначеЕсли. Это подтвердит необходимость использования одного из описанных выше методов.Таким образом, системный подход к решению данной проблемы заключается в понимании того, как типовые механизмы 1С взаимодействуют с новыми объектами метаданных. Используя структуры-контейнеры для передачи данных, вы обеспечиваете стабильную работу системы и совместимость вашего расширения с будущими обновлениями конфигурации.