Как программно заполнить дополнительные реквизиты в справочнике Номенклатура при изменении артикула

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

В современных конфигурациях 1С, таких как Управление торговлей 11, ERP или Комплексная автоматизация, механизм работы с дополнительными реквизитами реализован через Библиотеку стандартных подсистем (БСП). Часто возникает задача автоматизировать заполнение этих данных, например, когда нужно, чтобы при вводе Артикула его значение автоматически дублировалось в определенный дополнительный реквизит (например, "Товарный код").

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

Анализ структуры хранения дополнительных реквизитов

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

  1. Свойство — ссылка на элемент плана видов характеристик ДополнительныеРеквизитыИСведения.
  2. Значение — само значение реквизита (имеет составной тип данных).

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

Способ 1: Прямая работа с табличной частью на форме

Если нам нужно, чтобы пользователь сразу видел результат изменения на экране, мы создаем обработчик события ПриИзменении для поля Артикул. Выясним причину часто возникающей ошибки: в коде часто пишут ПланВидовХарактеристик (в единственном числе), в то время как обращение к менеджеру объекта в глобальном контексте всегда идет во множественном числе — ПланыВидовХарактеристик.

Рассмотрим пример кода, который можно разместить в модуле формы элемента справочника:


&НаСервере
Процедура ЗаполнитьТоварныйКодНаСервере()
    
    // 1. Ищем само свойство в Плане видов характеристик
    // Поиск по наименованию — не самый надежный метод, но самый простой для начала
    СсылкаНаСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Товарный код");
    
    Если СсылкаНаСвойство.Пустая() Тогда
        Возврат; // Свойство не найдено, выходим
    КонецЕсли;
    
    // 2. Пытаемся найти строку с этим свойством в табличной части объекта
    ПараметрыПоиска = Новый Структура("Свойство", СсылкаНаСвойство);
    НайденныеСтроки = Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыПоиска);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        // Если нашли — перезаписываем значение
        СтрокаСвойства = НайденныеСтроки[0];
    Иначе
        // Если не нашли — добавляем новую строку
        СтрокаСвойства = Объект.ДополнительныеРеквизиты.Добавить();
        СтрокаСвойства.Свойство = СсылкаНаСвойство;
    КонецЕсли;
    
    // 3. Устанавливаем значение из артикула
    СтрокаСвойства.Значение = Объект.Артикул;
    
КонецПроцедуры

&НаКлиенте
Процедура АртикулПриИзменении(Элемент)
    ЗаполнитьТоварныйКодНаСервере();
КонецПроцедуры

Способ 2: Использование «Имени для разработчиков»

Посмотрим на ситуацию со стороны стабильности кода. Если пользователь переименует «Товарный код» в «Внутренний код», поиск по наименованию перестанет работать. Правильнее использовать специальное поле в настройках дополнительного реквизита — Имя для разработчиков. Проанализируем, как изменится поиск свойства:


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

Это гарантирует, что даже при смене визуального заголовка ваш алгоритм продолжит корректно отрабатывать.

Способ 3: Автоматизация через модуль объекта (ПередЗаписью)

Если вы хотите, чтобы артикул синхронизировался всегда (даже при загрузке данных из Excel или через обмены), лучше перенести логику в модуль объекта. Рассмотрим, как это сделать в процедуре ПередЗаписью. Важно помнить, что в модуле объекта мы работаем напрямую с данными, без приставки Объект..


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

Важные нюансы работы с типами данных

Проанализируем возможные проблемы с типами значений. Дополнительные реквизиты в 1С могут быть разных типов: Строка, Число, Дата или Дополнительное значение (ссылка на специальный справочник).

Если ваш реквизит «Товарный код» имеет тип «Дополнительное значение», вы не сможете просто записать туда строку Объект.Артикул. Программа не выдаст ошибку, но поле останется пустым или очистится, так как типы не совпадают. В этом случае сначала нужно программно найти или создать элемент в подчиненном справочнике ЗначенияСвойствОбъектов, и только потом записывать ссылку на него в табличную часть.

Использование программного интерфейса БСП

В профессиональной разработке для работы со свойствами рекомендуется использовать функции общих модулей, которые уже встроены в систему. Например, модуль УправлениеСвойствами. Рассмотрим метод, позволяющий быстро записать значение свойства, не заботясь о ручном переборе строк табличной части:

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

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

← На главную