Почему не сохраняется признак использования характеристик номенклатуры в 1С:УТ 11 при программной записи?

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

При разработке обработок для массового обновления справочника Номенклатура в конфигурации 1С:Управление торговлей 11 программисты часто сталкиваются с ситуацией, когда код выполняется без ошибок, метод Записать() отрабатывает штатно, но при открытии карточки товара изменения не обнаруживаются. Особенно это актуально для реквизитов ИспользованиеХарактеристик и ВариантОформленияПродажи. Рассмотрим подробно, почему это происходит и как правильно организовать программное изменение этих данных.

Анализ проблемы на примере кода

Представим типовой фрагмент кода, который должен отключать использование характеристик для элемента номенклатуры:


Об = СсылкаНаНоменклатуру.ПолучитьОбъект();
Об.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать;  
Об.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;  
Попытка 
    Об.Записать();
    Сообщить("Успешно записано: " + Об.Ссылка);
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

На первый взгляд, код корректен. Однако, если после его выполнения зайти в справочник, можно увидеть, что настройки остались прежними. Разберем по шагам причины такого поведения системы.

Причина 1: Отсутствие заполненного Вида номенклатуры

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

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

Причина 2: Жесткая зависимость от настроек Вида номенклатуры

Проанализируем архитектуру конфигурации. В современных версиях УТ 11 (11.4 и выше) логика характеристик определяется в справочнике Виды номенклатуры. Там существует реквизит ВариантИспользованияХарактеристик, который диктует правила для всех товаров этого вида:

  1. Не использовать — характеристики отключены глобально для вида.
  2. Общие для вида номенклатуры — список характеристик един для всех товаров этого вида.
  3. Индивидуальные для номенклатуры — каждый товар имеет свой уникальный список.
  4. Общие с другими видами — использование общей базы характеристик.

Если в Виде номенклатуры жестко задано использование общих характеристик, система при попытке программной записи конкретной позиции номенклатуры с флагом НеИспользовать может автоматически восстановить значение, соответствующее настройкам владельца (Вида). Чтобы программное изменение сработало, убедитесь, что в Виде номенклатуры разрешены индивидуальные характеристики или измените сначала настройки самого Вида.

Причина 3: Использование механизма ОбменДанными.Загрузка

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

Проанализируем пример использования:


Об = СсылкаНаНоменклатуру.ПолучитьОбъект();
Об.ОбменДанными.Загрузка = Истина; // Отключаем проверки
Об.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать;
Об.Записать();

Важно: Этот метод следует использовать с осторожностью. Если вы принудительно отключите характеристики для товара, по которому уже есть остатки на складах или движения в регистрах с заполненными характеристиками, это приведет к невозможности корректного списания товара и ошибкам в отчетах по запасам.

Причина 4: Проверка на наличие существующих записей

Система 1С:УТ 11 защищает целостность данных. Разберем, в каких случаях запись может блокироваться внутренними алгоритмами:

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

Причина 5: Нюансы реквизита ВариантОформленияПродажи

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

Практические рекомендации по массовой обработке

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

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

Таким образом, успех программного изменения справочника номенклатуры в УТ 11 зависит не только от правильности написания кода, но и от понимания глубокой взаимосвязи между реквизитами объекта и настройками его Вида. Всегда начинайте диагностику с проверки заполнения ВидНоменклатуры и анализа установленных в нем правил ведения учета.

← На главную