Как исправить ошибку преобразования к типу Булево при программном создании номенклатуры?

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

При разработке механизмов интеграции или загрузки данных в современные конфигурации 1С, такие как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей 11, программисты часто сталкиваются с ошибкой при вызове метода Записать() для нового объекта справочника Номенклатура. Текст ошибки обычно выглядит следующим образом: «Преобразование значения к типу Булево не может быть выполнено», а отладчик указывает на модуль менеджера или модуль объекта.

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

Разбор причины возникновения ошибки

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


И Не ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура.ВидНоменклатуры, "СодержитДрагоценныеМатериалы") Тогда

Ошибка «Преобразование значения к типу Булево не может быть выполнено» в данном контексте означает, что функция ЗначениеРеквизитаОбъекта вернула не логическое значение (Истина или Ложь), а нечто иное — чаще всего Неопределено или Null. Когда оператор Не пытается инвертировать Неопределено, платформа 1С выдает исключение.

Почему реквизит «СодержитДрагоценныеМатериалы» может вернуть Неопределено? Выясним основные причины:

  1. Выбор группы вместо элемента. Если при поиске вида номенклатуры методом НайтиПоНаименованию система находит группу (папку) справочника, а не конкретный элемент. У групп справочника ВидыНоменклатуры отсутствуют многие специфические реквизиты, включая признаки содержания драгметаллов.
  2. Пустая ссылка. Если поиск не увенчался успехом, в реквизит ВидНоменклатуры записывается пустая ссылка. При обращении к свойствам пустой ссылки через универсальные функции часто возвращается Неопределено.
  3. Неполное заполнение объекта. В типовых решениях недостаточно просто присвоить ссылку на вид номенклатуры. Существует ряд зависимых настроек (использование характеристик, серий, тип номенклатуры), которые должны быть инициализированы в объекте перед его записью.

Решение №1: Проверка на группу и пустую ссылку

Первым делом нам необходимо убедиться, что мы передаем в объект корректную ссылку на элемент справочника. Давайте модифицируем исходный код, добавив проверку на то, что найденный объект является именно элементом, а не группой.

Проанализируем пример исправленного кода:


ВидНоменклатурыСсылка = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(Тип);

// Проверяем, что ссылка не пустая и это не группа
Если ВидНоменклатурыСсылка.Пустая() Тогда
    Сообщить("Вид номенклатуры с наименованием '" + Тип + "' не найден!");
    Возврат;
ИначеЕсли ВидНоменклатурыСсылка.ЭтоГруппа Тогда
    Сообщить("Указанное наименование принадлежит группе, а не элементу вида номенклатуры!");
    Возврат;
КонецЕсли;

СоздНоменклатура.ВидНоменклатуры = ВидНоменклатурыСсылка;

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

Решение №2: Использование типовых процедур заполнения

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

Посмотрим на пример правильного программного создания объекта, используя возможности модуля менеджера. В большинстве современных конфигураций (ERP, КА, УТ) существует процедура ЗаполнитьРеквизитыПоВидуНоменклатуры.

Рассмотрим алгоритм действий:

  1. Создаем новый объект номенклатуры.
  2. Находим нужный вид номенклатуры.
  3. Вызываем процедуру заполнения, которая «пробросит» все настройки из вида номенклатуры в сам объект (тип номенклатуры, настройки учета и те самые признаки, на которых спотыкается система).

Пример кода для реализации этого подхода:


СоздНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
СоздНоменклатура.Артикул = Артикул;
СоздНоменклатура.Наименование = Наименование;

ВидСсылка = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(Тип);

Если Не ВидСсылка.Пустая() Тогда
    СоздНоменклатура.ВидНоменклатуры = ВидСсылка;
    
    // Важнейший шаг: вызываем заполнение по правилам конфигурации
    // Параметры: ОбъектНоменклатуры, СсылкаНаВидНоменклатуры
    Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(СоздНоменклатура, ВидСсылка);
КонецЕсли;

Попытка
    СоздНоменклатура.Записать();
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

Почему это важно?

Давайте выясним, что происходит «под капотом» при вызове ЗаполнитьРеквизитыПоВидуНоменклатуры. В этот момент система устанавливает значение реквизита ТипНоменклатуры (Товар, Услуга, Работа и т.д.). Многие проверки в модуле менеджера, включая проверку на драгоценные материалы, выполняются только для типа Товар. Если этот реквизит останется пустым, логика проверок может сработать некорректно, пытаясь обратиться к данным, которых нет.

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

Рекомендации для отладки

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

Подведем итог: для успешного программного создания номенклатуры всегда проверяйте, что вы не выбрали группу справочника, и обязательно используйте типовой механизм ЗаполнитьРеквизитыПоВидуНоменклатуры для инициализации всех бизнес-свойств объекта.

← На главную