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