Как правильно записывать данные в дополнительные реквизиты номенклатуры в 1С:УТ 11.4?

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

При работе с расширениями в 1С:УТ 11.4 часто возникает задача автоматического заполнения дополнительных реквизитов номенклатуры при ее записи. Часто разработчики сталкиваются с тем, что данные в табличной части успешно меняются в процессе отладки, но после завершения записи они не сохраняются в базе данных. Давайте разберем, почему это происходит и как правильно решить эту задачу.

Почему не сохраняются изменения?

Основная ошибка заключается в выборе события для внесения изменений. Выполнение кода в процедуре ПослеЗаписи или ПослеЗаписиНаСервере формы объекта происходит уже после того, как стандартный механизм платформы 1С завершил транзакцию записи объекта в базу данных. В этот момент объект Объект в памяти формы уже «отвязан» от транзакции записи, и любые изменения его табличных частей просто игнорируются системой.

Попытка вызвать метод Объект.Записать() внутри этих процедур приведет к бесконечной рекурсии, так как метод Записать() снова вызовет событие ПослеЗаписи, и процесс зациклится.

Рекомендуемый способ: использование расширения метода ПередЗаписью

Чтобы изменения в дополнительных реквизитах гарантированно попали в базу данных, логику необходимо перенести в модуль объекта (а не формы) через расширение метода ПередЗаписью. Это событие происходит непосредственно внутри транзакции записи до фиксации данных в СУБД.

Рассмотрим пошаговое выполнение:

  1. Создайте расширение для модуля объекта справочника Номенклатура.
  2. Добавьте метод ПередЗаписью с аннотацией &Перед или &Вместо.
  3. Внесите в расширение код для заполнения табличной части ДополнительныеРеквизиты.

При таком подходе платформа 1С автоматически «подхватит» внесенные вами изменения в табличной части и запишет их вместе с остальными данными объекта в рамках одной транзакции.

Пример реализации кода

Разберем, как должен выглядеть код для автоматического заполнения свойства «Штрихкод для сайта»:


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

Важные замечания

При реализации данной задачи обязательно обратите внимание на следующие моменты:

Следуя этим рекомендациям, вы сможете корректно автоматизировать процесс записи дополнительных данных в справочник Номенклатура, избежав проблем с их сохранением и потенциальной рекурсией при записи.

← На главную