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