Где найти код копирования номенклатуры в 1С:Розница и как исправить потерю данных при копировании?

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

При переходе на современные релизы конфигурации 1С:Розница (начиная с версий 2.2 и выше) многие разработчики сталкиваются с тем, что привычная логика работы справочников "растворяется" в недрах Библиотеки Стандартных Подсистем (БСП). Одной из частых проблем является некорректное копирование реквизитов номенклатуры, например, когда поле ЦеноваяГруппа остается пустым в новом объекте, хотя в исходном оно было заполнено. Разберем по шагам, где теперь искать программный код, отвечающий за это действие, и как правильно выполнять отладку в условиях асинхронности.

Шаг 1. Анализируем модуль объекта

Первым делом проверим стандартное событие, которое срабатывает на стороне сервера при создании копии. В модуле объекта справочника Номенклатура за это отвечает процедура ПриКопировании(ОбъектКопирования). Рассмотрим, что там обычно происходит в типовых решениях:


Процедура ПриКопировании(ОбъектКопирования)
    Если НЕ ЭтоГруппа Тогда
        // Очистка ссылок на присоединенные файлы, так как у нового объекта будет свой набор файлов
        ФайлКартинки = Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка();
    КонецЕсли;
КонецПроцедуры

Если в данной процедуре нет явной очистки реквизита ЦеноваяГруппа, значит, платформа 1С по умолчанию скопировала значение из ОбъектКопирования. Если же на форме значение всё равно пустое, значит, оно затирается позже, в процессе инициализации формы или при работе механизмов БСП.

Шаг 2. Исследуем модуль формы номенклатуры

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

Проанализируем типовой фрагмент кода в процедуре ПриСозданииНаСервере:


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

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

Шаг 3. Механизм БСП: Заполнение по параметрам и обновление признаков

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

Справочники.Номенклатура.ОбновитьПризнакиНоменклатуры(ЭтотОбъект, Ответ);

Проанализируем ситуацию подробнее. Когда мы копируем номенклатуру, система может инициировать перезаполнение реквизитов "по умолчанию" на основании Вида номенклатуры. Если в Виде номенклатуры не указана ценовая группа или заданы настройки, подразумевающие очистку определенных полей, то механизм БСП выполнит это автоматически, перекрывая данные, скопированные платформой.

Шаг 4. Проблема асинхронности и обработчиков ожидания

Вы спросите: "Что за НачатьПодключение... и ПодключитьОбработчикОжидания встречаются в коде?". Это следствие перехода платформы на асинхронную модель работы. Рассмотрим, почему это усложняет отладку:

  1. Асинхронные вызовы: Программа не может блокировать интерфейс, ожидая ответа от сервера или внешнего оборудования. Вместо этого она вызывает процедуру и "забывает" о ней, передавая управление дальше. Результат обработки придет позже в процедуру-оповещение.
  2. Обработчики ожидания: Используются для выполнения действий "сразу после открытия формы", когда нужно, чтобы форма уже отрисовалась пользователю. Например, проверка уникальности штрихкода или обновление цен.

Чтобы эффективно дебажить такой код, выполним следующие действия:

Шаг 5. Влияние Вида номенклатуры на копирование

Выясним, почему именно ЦеноваяГруппа может пропадать. В 1С:Розница реквизиты сильно завязаны на объект Вид номенклатуры. Разберем по шагам логику системы при копировании:

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

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

Итоги

Современный код 1С — это сложная сеть взаимосвязанных общих модулей. Для решения задачи копирования реквизитов нам пришлось:

Такой подход позволяет не просто найти место, где "пропадает" значение, но и понять общую архитектуру решения, что критически важно для поддержки актуальных версий 1С.

← На главную