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