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

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

При разработке документов в конфигурациях 1С часто возникает необходимость автоматизировать ввод данных, чтобы пользователю не приходилось заполнять их вручную. Рассмотрим задачу заполнения реквизита Штрихкод в табличной части документа на основе данных из регистра сведений ШтрихкодыНоменклатуры при выборе товара.

Подход первый: использование процедуры «ПриИзменении»

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

Шаг 1: Создание серверной функции для получения данных

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


&НаСервере
Функция ПолучитьШтрихкодНаСервере(Номенклатура, Характеристика, Упаковка)
    Возврат РегистрыСведений.ШтрихкодыНоменклатуры.ШтрихкодыНоменклатуры(Номенклатура, Характеристика, Упаковка);
КонецФункции

Шаг 2: Реализация клиентской процедуры

В модуле формы документа добавим обработчик события ПриИзменении для колонки Номенклатура. Этот код получает данные текущей строки и вызывает серверную функцию.


&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ТекЭлемент = Элементы.Товары.ТекущиеДанные;
    Если ТекЭлемент = Неопределено Тогда
        Возврат;
    КонецЕсли;

    МассивШтрихКодов = ПолучитьШтрихкодНаСервере(
        ТекЭлемент.Номенклатура, 
        ТекЭлемент.ХарактеристикиНоменклатуры, 
        ТекЭлемент.УпаковкиЕдиницыИзмерения);

    Если МассивШтрихКодов.Количество() > 0 Тогда
        ТекЭлемент.ШтрихКод = МассивШтрихКодов[0];
    КонецЕсли;
КонецПроцедуры

Подход второй: оптимизация через массовый запрос

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

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


Соответствие = Новый Соответствие;
МассивНоменклатуры = Новый Массив;

Для каждого СтрТЧ Из Объект.Товары Цикл
    Соответствие.Вставить(СтрТЧ.Номенклатура, СтрТЧ);
    МассивНоменклатуры.Добавить(СтрТЧ.Номенклатура);
КонецЦикла;

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Массив", МассивНоменклатуры);
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ШтрихкодНоменклатуры.Номенклатура КАК Номенклатура,
    |    ШтрихкодНоменклатуры.Штрихкод КАК Штрихкод
    |ИЗ
    |    РегистрСведений.ШтрихкодНоменклатуры КАК ШтрихкодНоменклатуры
    |ГДЕ
    |    ШтрихкодНоменклатуры.Номенклатура В(&Массив)";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    СтрокаТЧ = Соответствие.Получить(Выборка.Номенклатура);
    Если ПустаяСтрока(СтрокаТЧ.Штрихкод) Тогда
        СтрокаТЧ.Штрихкод = Выборка.Штрихкод;
    КонецЕсли;
КонецЦикла;

Важные нюансы реализации

  1. Несколько штрихкодов: У одной позиции может быть несколько штрихкодов (для разных упаковок). При проектировании кода учитывайте, что выбор «первого попавшегося» (через [0]) может быть неверным, если вы не передаете параметры упаковки и характеристики в отбор запроса.
  2. Безопасность и чистота кода: Избегайте прямого обращения к регистрам в коде формы, если в конфигурации есть типовые общие модули, такие как РаботаСоШтрихкодами. Использование типовых функций упростит дальнейшее обновление конфигурации.
  3. Проверка на пустоту: Всегда проверяйте, есть ли у найденной номенклатуры штрихкод, чтобы не заполнять поле некорректными данными или не сбрасывать уже установленные вручную значения.
  4. Валидация: Если наличие штрихкода критично для продажи, добавьте проверку при записи документа, чтобы система уведомляла пользователя о незаполненном поле.

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

← На главную