Как реализовать автозаполнение характеристики номенклатуры при добавлении строки в документ?

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

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

Постановка задачи и анализ ситуации

Рассмотрим ситуацию: при добавлении новой строки в документ и выборе номенклатуры поле ХарактеристикаНоменклатуры остается пустым, хотя система позволяет выбрать значение из списка. Наша задача — сделать так, чтобы система сама подставляла значение. Если у товара всего одна характеристика, она должна заполниться автоматически. Если характеристик несколько, мы реализуем логику выбора первой из списка или «основной» характеристики.

Проанализируем, где именно следует вносить изменения. В типовых конфигурациях на обычных формах (таких как УПП 1.3, КА 1.1 или УТ 10.3) логика обработки строк ТЧ вынесена в общие модули. Оптимальной точкой входа является процедура ПриИзмененииНоменклатурыТабЧасти в общем модуле ОбработкаТабличныхЧастей.

Вариант 1: Простой подбор первой характеристики через запрос

Самый быстрый способ — написать функцию, которая будет обращаться к справочнику ХарактеристикиНоменклатуры и возвращать первую попавшуюся запись, владельцем которой является выбранный товар. Разберем код такой функции подробнее. Важно использовать конструкцию ВЫБРАТЬ ПЕРВЫЕ 1, чтобы не нагружать систему лишними данными.


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

Эту функцию удобно разместить в общем модуле, чтобы вызывать её из любого документа. Обратите внимание: мы добавили проверку на пометку удаления, чтобы система не подставила неактуальное значение.

Вариант 2: Использование «Основной характеристики» (Рекомендуемый)

Подстановка «первой попавшейся» характеристики по алфавиту не всегда логична с точки зрения бизнеса. Более правильный подход — добавить в справочник Номенклатура новый реквизит ОсновнаяХарактеристика (тип СправочникСсылка.ХарактеристикиНоменклатуры) с соответствующим отбором по владельцу. Проанализируем, как изменится наш код в этом случае:

  1. Проверяем, заполнена ли ОсновнаяХарактеристика в карточке товара.
  2. Если заполнена — возвращаем её.
  3. Если не заполнена — используем механизм поиска «первой» или оставляем поле пустым.

Такой подход позволяет пользователям самостоятельно управлять автоматизацией для каждой позиции товара отдельно.

Интеграция решения в типовую конфигурацию

Теперь выясним, куда именно вставить вызов нашей функции. Найдем процедуру ПриИзмененииНоменклатурыТабЧасти. В ней обычно происходит очистка зависимых реквизитов (единиц измерения, цен, серий). Нам нужно дописать код в конце этой процедуры, чтобы поле характеристики заполнилось сразу после выбора товара.

Пример изменения в коде:


// Внутри процедуры ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти
// ... (типовой код заполнения единиц и цен)

// Наша вставка:
Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) 
    И СтрокаТабличнойЧасти.Номенклатура.ВестиУчетПоХарактеристикам Тогда
    
    // Вызываем нашу функцию
    НайденнаяХарактеристика = ОпределитьПервуюХарактеристику(СтрокаТабличнойЧасти.Номенклатура);
    
    Если ЗначениеЗаполнено(НайденнаяХарактеристика) Тогда
        СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры = НайденнаяХарактеристика;
    КонецЕсли;
    
КонецЕсли;

Важный нюанс: Обязательно проверяйте флаг ВестиУчетПоХарактеристикам в карточке номенклатуры. Если учет по характеристикам для данного товара не ведется, программное заполнение может привести к некорректному поведению системы или визуальному мусору в документах.

Особенности реализации для управляемых форм (ERP, УТ 11)

Если вы работаете в современной конфигурации на платформе 8.3 с управляемыми формами, рекомендуется использовать Расширения. Это позволит не снимать конфигурацию с поддержки. Рассмотрим по шагам этот алгоритм:

Проанализируем производительность: если документ содержит сотни строк, выполнение запроса на каждую смену номенклатуры может вызвать небольшие задержки. В таких случаях можно использовать метод Справочники.ХарактеристикиНоменклатуры.Выбрать(ТекущаяНоменклатура). Он работает чуть быстрее простого запроса при поиске по владельцу, так как использует встроенные индексы платформы для иерархических связей.

Почему это не реализовано в «коробке»?

Многие задаются вопросом: почему разработчики 1С не сделали автоподстановку стандартной функцией? Причина кроется в методологии учета. Характеристика — это критически важный разрез (цвет, размер, срок годности). Автоматическое заполнение «наугад» может привести к пересортице: в программе числится «Синий диван», а кладовщик по факту отгрузил «Красный». Внедряйте автоматизацию только в тех случаях, когда характеристики используются формально или их действительно всегда по одной на объект.

Таким образом, мы разобрали основные способы решения задачи: от простейшего запроса до использования расширений и дополнительных реквизитов. Выбор конкретного метода зависит от вашей конфигурации и требований к точности учета.

← На главную