Как программно записать дополнительные реквизиты в 1С:Управление торговлей 8.3

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

При переходе с более простых конфигураций (например, «1С:Розница» старых версий) на современные решения вроде «Управление торговлей 11» или «Управление торговлей для Казахстана 3», разработчики часто сталкиваются с проблемой: старый код записи дополнительных реквизитов перестает работать. Номенклатура создается, но табличная часть с дополнительными сведениями остается пустой или данные исчезают сразу после сохранения. Разберем детально, почему это происходит и как правильно реализовать этот механизм, используя возможности Библиотеки стандартных подсистем (БСП).

Анализ проблемы: почему данные «исчезают»

Проанализируем ситуацию, описанную в теме. Основная причина того, что реквизиты не записываются или «пропадают» при открытии формы, заключается в архитектуре подсистемы «Управление свойствами». В современных конфигурациях 1С дополнительные реквизиты — это не просто строки в табличной части ДополнительныеРеквизиты. Это сложная структура, завязанная на планы видов характеристик (ПВХ) и наборы свойств.

Рассмотрим основные причины неудачи:

  1. Отсутствие ссылки: Попытка добавить данные в табличную часть объекта, который еще не записан в базу данных. Для корректной привязки многих механизмов БСП требуется наличие постоянной ссылки.
  2. Несоответствие набору свойств: В «Управлении торговлей» каждый вид номенклатуры имеет свой «Набор свойств». Если вы программно добавляете реквизит «Размер», но этот реквизит не включен в набор свойств конкретного ВидаНоменклатуры, система при записи или проверке может просто очистить «лишние» данные.
  3. Типизация значений: Если дополнительный реквизит имеет тип «Дополнительное значение», то запись в него обычной строки "Красный" приведет к ошибке или обнулению. Система ожидает ссылку на элемент справочника ЗначенияСвойствОбъектов.

Метод 1. Правильная последовательная запись объекта

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

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


// 1. Создаем и записываем основной объект
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = "Наименование из файла";
НовыйОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
НовыйОбъект.Записать(); // Получаем ссылку

// 2. Теперь работаем с доп. реквизитами
НазваниеДопРеквизита = "Размер";
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НазваниеДопРеквизита);

Если Не СвойствоСсылка.Пустая() Тогда
    // Добавляем строку в табличную часть
    НоваяСтрока = НовыйОбъект.ДополнительныеРеквизиты.Добавить();
    НоваяСтрока.Свойство = СвойствоСсылка;
    
    // ВАЖНО: Проверяем тип значения (строка или ссылка)
    ТипЗначенияСвойства = СвойствоСсылка.ТипЗначения;
    Если ТипЗначенияСвойства.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда
        // Здесь должен быть поиск или создание значения в справочнике ЗначенияСвойствОбъектов
        НоваяСтрока.Значение = НайтиИлиСоздатьЗначениеСвойства(СвойствоСсылка, "XL");
    Иначе
        НоваяСтрока.Значение = "Значение строкой";
    КонецЕсли;
    
    НовыйОбъект.Записать();
КонецЕсли;

Метод 2. Использование программного интерфейса БСП (Рекомендуется)

В современных конфигурациях «Управление торговлей» рекомендуется использовать методы общего модуля УправлениеСвойствами. Это гарантирует, что все проверки (вхождение в набор свойств, индексация для поиска) будут выполнены корректно. Рассмотрим, как это сделать.

Посмотрим на пример использования функции ЗаписатьДополнительныеРеквизиты. Этот метод принимает объект и таблицу значений со свойствами. Мы избавимся от необходимости вручную манипулировать строками табличной части.

Шаги выполнения:

  1. Подготовим таблицу значений с колонками Свойство и Значение.
  2. Заполним её нужными данными.
  3. Вызовем процедуру БСП, которая сама обновит табличную часть объекта.

// Подготовка таблицы свойств
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");

// Поиск свойства
СвойствоОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Материал");

Если Не СвойствоОбъект.Пустая() Тогда
    НоваяЗапись = ТаблицаСвойств.Добавить();
    НоваяЗапись.Свойство = СвойствоОбъект;
    // Предположим, это текстовое свойство
    НоваяЗапись.Значение = "Хлопок 100%";
КонецЕсли;

// Записываем данные в объект номенклатуры (ОбъектНоменклатуры уже должен быть записан ранее)
УправлениеСвойствами.ЗаписатьДополнительныеРеквизиты(ОбъектНоменклатуры, ТаблицаСвойств);

Работа со ссылочными типами данных (Значения свойств)

Разберем ситуацию, упомянутую в Сообщении 8 темы форума. Если доп. реквизит «Материал» имеет набор значений, это означает, что тип данных свойства — СправочникСсылка.ЗначенияСвойствОбъектов. Просто передать туда строку нельзя — 1С не сможет сопоставить текст со ссылкой и очистит поле.

Проанализируем функцию для поиска или создания значения в этом справочнике:


Функция НайтиИлиСоздатьЗначениеСвойства(ВладелецСвойства, ТекстЗначения)
    
    // Ищем значение среди подчиненных данному свойству
    ЗначениеСсылка = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ТекстЗначения, Истина, , ВладелецСвойства);
    
    Если ЗначениеСсылка.Пустая() Тогда
        // Если не нашли — создаем новое значение
        НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
        НовоеЗначение.Владелец = ВладелецСвойства;
        НовоеЗначение.Наименование = ТекстЗначения;
        НовоеЗначение.Записать();
        Возврат НовоеЗначение.Ссылка;
    КонецЕсли;
    
    Возврат ЗначениеСсылка;
    
КонецФункции

Проверка привязки к Набору свойств

Если код отрабатывает без ошибок, но данные в форме номенклатуры все равно не видны, проверим настройки в самой программе 1С. Дополнительные реквизиты в УТ отображаются на форме только в том случае, если они включены в Набор свойств, привязанный к Виду номенклатуры.

Проанализируем ситуацию шаг за шагом:

  1. Откройте карточку товара, в который загружаете данные.
  2. Посмотрите поле Вид номенклатуры.
  3. Перейдите в настройки этого Вида номенклатуры, на закладку «Дополнительные реквизиты».
  4. Убедитесь, что реквизиты (например, «Размер» или «Материал») добавлены в список.

Если реквизит отсутствует в наборе, программная запись в табличную часть ДополнительныеРеквизиты может быть проигнорирована платформой или затерта при открытии формы элемента, так как система считает эти данные нерелевантными для данного объекта.

Итоги и рекомендации

Для успешной загрузки данных из CSV или других внешних источников в 1С:УТ 8.3, придерживайтесь следующих правил:

Соблюдение этих структурных особенностей конфигураций на базе БСП позволит избежать «исчезновения» данных и обеспечит корректную работу поиска и отчетов по дополнительным реквизитам в дальнейшем.

← На главную