При разработке механизмов интеграции или загрузки данных в современные конфигурации 1С, такие как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей 11, программисты часто сталкиваются с ошибкой при вызове метода Записать() для нового объекта справочника Номенклатура. Текст ошибки обычно выглядит следующим образом: «Преобразование значения к типу Булево не может быть выполнено», а отладчик указывает на модуль менеджера или модуль объекта.
В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем внутренние механизмы работы типовых конфигураций и научимся правильно программно создавать номенклатуру, избегая подобных ошибок.
Давайте проанализируем ситуацию, описанную в обращении. При попытке записи объекта система выполняет стандартные проверки в обработчике ПередЗаписью. В современных конфигурациях проверка часто обращается к свойствам связанного Вида номенклатуры. Рассмотрим конкретную строку кода, на которой происходит сбой:
И Не ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура.ВидНоменклатуры, "СодержитДрагоценныеМатериалы") Тогда
Ошибка «Преобразование значения к типу Булево не может быть выполнено» в данном контексте означает, что функция ЗначениеРеквизитаОбъекта вернула не логическое значение (Истина или Ложь), а нечто иное — чаще всего Неопределено или Null. Когда оператор Не пытается инвертировать Неопределено, платформа 1С выдает исключение.
Почему реквизит «СодержитДрагоценныеМатериалы» может вернуть Неопределено? Выясним основные причины:
НайтиПоНаименованию система находит группу (папку) справочника, а не конкретный элемент. У групп справочника ВидыНоменклатуры отсутствуют многие специфические реквизиты, включая признаки содержания драгметаллов.ВидНоменклатуры записывается пустая ссылка. При обращении к свойствам пустой ссылки через универсальные функции часто возвращается Неопределено.Первым делом нам необходимо убедиться, что мы передаем в объект корректную ссылку на элемент справочника. Давайте модифицируем исходный код, добавив проверку на то, что найденный объект является именно элементом, а не группой.
Проанализируем пример исправленного кода:
ВидНоменклатурыСсылка = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(Тип);
// Проверяем, что ссылка не пустая и это не группа
Если ВидНоменклатурыСсылка.Пустая() Тогда
Сообщить("Вид номенклатуры с наименованием '" + Тип + "' не найден!");
Возврат;
ИначеЕсли ВидНоменклатурыСсылка.ЭтоГруппа Тогда
Сообщить("Указанное наименование принадлежит группе, а не элементу вида номенклатуры!");
Возврат;
КонецЕсли;
СоздНоменклатура.ВидНоменклатуры = ВидНоменклатурыСсылка;
Этот простой шаг исключает большинство базовых ошибок, связанных с человеческим фактором при заполнении справочников в режиме «1С:Предприятие».
В конфигурациях на базе БСП (Библиотеки стандартных подсистем) логика работы справочников вынесена в специальные экспортные процедуры. Простое присвоение СоздНоменклатура.ВидНоменклатуры = Ссылка не инициирует заполнение настроек по умолчанию, которые важны для корректной записи объекта.
Посмотрим на пример правильного программного создания объекта, используя возможности модуля менеджера. В большинстве современных конфигураций (ERP, КА, УТ) существует процедура ЗаполнитьРеквизитыПоВидуНоменклатуры.
Рассмотрим алгоритм действий:
Пример кода для реализации этого подхода:
СоздНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
СоздНоменклатура.Артикул = Артикул;
СоздНоменклатура.Наименование = Наименование;
ВидСсылка = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(Тип);
Если Не ВидСсылка.Пустая() Тогда
СоздНоменклатура.ВидНоменклатуры = ВидСсылка;
// Важнейший шаг: вызываем заполнение по правилам конфигурации
// Параметры: ОбъектНоменклатуры, СсылкаНаВидНоменклатуры
Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(СоздНоменклатура, ВидСсылка);
КонецЕсли;
Попытка
СоздНоменклатура.Записать();
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Давайте выясним, что происходит «под капотом» при вызове ЗаполнитьРеквизитыПоВидуНоменклатуры. В этот момент система устанавливает значение реквизита ТипНоменклатуры (Товар, Услуга, Работа и т.д.). Многие проверки в модуле менеджера, включая проверку на драгоценные материалы, выполняются только для типа Товар. Если этот реквизит останется пустым, логика проверок может сработать некорректно, пытаясь обратиться к данным, которых нет.
Также важно помнить про обработчики обновления. Если база данных прошла через множество обновлений, некоторые реквизиты могут требовать специфического заполнения. Использование методов, заложенных вендором (фирмой 1С), гарантирует, что ваш код будет работать стабильно даже после очередного обновления конфигурации.
Если ошибка сохраняется, выполните следующие действия в режиме конфигуратора:
Записать().СоздНоменклатура.ВидНоменклатуры.СодержитДрагоценныеМатериалы.<Объект не обнаружен> или Неопределено, значит, ссылка на вид номенклатуры некорректна.ТипНоменклатуры в создаваемом объекте. В 90% случаев проблема кроется в его отсутствии.Подведем итог: для успешного программного создания номенклатуры всегда проверяйте, что вы не выбрали группу справочника, и обязательно используйте типовой механизм ЗаполнитьРеквизитыПоВидуНоменклатуры для инициализации всех бизнес-свойств объекта.