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