Как сохранить значения реквизитов (Бренд, Производитель, НДС) при копировании номенклатуры в 1С:Розница?

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

При работе в конфигурации 1С:Розница пользователи часто сталкиваются с тем, что при копировании существующей карточки номенклатуры часть важных полей — таких как Страна происхождения, Производитель, Бренд, Ставка НДС и Единица измерения — оказываются пустыми. Это поведение системы заложено разработчиками намеренно, чтобы избежать случайного дублирования специфических данных, однако в условиях массового ввода однотипных товаров это существенно замедляет работу.

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

Выясним причину: почему 1С очищает поля при копировании?

Для начала проанализируем ситуацию с технической стороны. В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) за создание новых объектов отвечает процедура ОбработкаЗаполнения, расположенная в модуле объекта справочника. Когда мы нажимаем кнопку "Копировать", система создает новый объект и передает в него ссылку на старый (объект-оригинал). Стандартный механизм 1С выполняет копирование всех реквизитов, но затем принудительно очищает те поля, которые считаются уникальными или требующими обязательной перепроверки пользователем.

К таким полям в «Рознице» относятся артикулы, штрихкоды и, в зависимости от версии, производители или бренды. Кроме того, логика очистки может быть прописана и в модуле формы (процедуры ПриСозданииНаСервере или ЗаполнитьПоПараметрам), чтобы гарантировать "чистоту" новой карточки.

Способ 1. Использование настроек Вида номенклатуры (Штатный метод)

Прежде чем приступать к программированию, рассмотрим наиболее правильный с точки зрения методологии 1С путь. В «Рознице» большинство реквизитов (НДС, единица измерения, страна) могут быть привязаны к Виду номенклатуры.

Проанализируем шаги по настройке:

  1. Перейдем в раздел НСИ — Номенклатура — Виды номенклатуры.
  2. Откроем нужную категорию (например, "Одежда" или "Продукты").
  3. В карточке Вида номенклатуры найдем настройки "Значения по умолчанию".
  4. Укажем здесь основную ставку НДС, единицу хранения и, если это применимо для всей группы, производителя.

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

Способ 2. Программное сохранение реквизитов через расширение

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

Разберем создание программного перехвата в модуле объекта:

  1. Создадим новое расширение и добавим в него справочник Номенклатура.
  2. В модуле объекта справочника расширения создадим процедуру-обработчик для события ОбработкаЗаполнения с аннотацией &После.
  3. Напишем код, который будет проверять, что происходит именно копирование, и возвращать нужные нам значения.

Рассмотрим пример кода:


&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Проверяем, что заполнение происходит на основании другого объекта номенклатуры (копирование)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Номенклатура") Тогда
        
        // Используем ЗаполнитьЗначенияСвойств для копирования конкретных реквизитов из оригинала
        // Третьим параметром перечисляем поля, которые 1С очистила, а мы хотим вернуть
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения, "СтавкаНДС, ЕдиницаИзмерения, Производитель, СтранаПроисхождения, ТоварнаяМарка");
        
    КонецЕсли;
    
КонецПроцедуры

Этот метод является самым надежным, так как он срабатывает на уровне сервера до того, как форма будет отрисована пользователю. Мы принудительно переписываем пустые значения данными из ДанныеЗаполнения.

Способ 3. Корректировка в модуле формы (для продвинутых)

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

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

Если вы обнаружили, что очистка происходит в форме, в расширении формы нужно перехватить метод заполнения:


&После("ЗаполнитьПоПараметрам")
Процедура Расш1_ЗаполнитьПоПараметрам(ПараметрыЗаполнения)
    // Если в параметрах есть ссылка на копируемый объект
    Если ПараметрыЗаполнения.Свойство("ЗначениеКопирования") 
        И ЗначениеЗаполнено(ПараметрыЗаполнения.ЗначениеКопирования) Тогда
        
        // Дозаполняем объект формы из оригинала
        ОбъектОригинал = ПараметрыЗаполнения.ЗначениеКопирования;
        Объект.Производитель = ОбъектОригинал.Производитель;
        Объект.ТоварнаяМарка = ОбъектОригинал.ТоварнаяМарка;
        
    КонецЕсли;
КонецПроцедуры

Дополнительные настройки пользователя и НДС

Стоит также обратить внимание на Настройки пользователей. В некоторых версиях «Розницы» ставка НДС и единица измерения по умолчанию берутся не из копируемого объекта, а из персональных настроек текущего пользователя или настроек организации. Если в этих настройках выбрано "пустое значение", система может затирать данные оригинала значениями "по умолчанию" от текущего пользователя.

Проанализируем настройки:

Подведем итоги

Для решения проблемы очистки полей при копировании номенклатуры в 1С:Розница мы рекомендуем следующий алгоритм действий:

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

Использование ЗаполнитьЗначенияСвойств в расширении — наиболее гибкий и профессиональный подход, который позволит вам тонко настроить поведение программы под требования бизнеса, сохраняя стабильность системы.

← На главную