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