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