При разработке документов в конфигурациях 1С часто возникает необходимость автоматизировать ввод данных, чтобы пользователю не приходилось заполнять их вручную. Рассмотрим задачу заполнения реквизита Штрихкод в табличной части документа на основе данных из регистра сведений ШтрихкодыНоменклатуры при выборе товара.
Для управляемых форм 1С основным правилом является разделение логики на клиентскую и серверную части. Поскольку работа с регистрами сведений напрямую из клиентского кода невозможна (это приведет к ошибке), мы будем использовать серверную функцию. Разберем реализацию по шагам.
Шаг 1: Создание серверной функции для получения данных
Создадим функцию, которая будет обращаться к регистру и возвращать найденный штрихкод. Важно помнить, что поиск должен учитывать не только номенклатуру, но и характеристики или упаковки, если они используются в документе.
&НаСервере
Функция ПолучитьШтрихкодНаСервере(Номенклатура, Характеристика, Упаковка)
Возврат РегистрыСведений.ШтрихкодыНоменклатуры.ШтрихкодыНоменклатуры(Номенклатура, Характеристика, Упаковка);
КонецФункции
Шаг 2: Реализация клиентской процедуры
В модуле формы документа добавим обработчик события ПриИзменении для колонки Номенклатура. Этот код получает данные текущей строки и вызывает серверную функцию.
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекЭлемент = Элементы.Товары.ТекущиеДанные;
Если ТекЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
МассивШтрихКодов = ПолучитьШтрихкодНаСервере(
ТекЭлемент.Номенклатура,
ТекЭлемент.ХарактеристикиНоменклатуры,
ТекЭлемент.УпаковкиЕдиницыИзмерения);
Если МассивШтрихКодов.Количество() > 0 Тогда
ТекЭлемент.ШтрихКод = МассивШтрихКодов[0];
КонецЕсли;
КонецПроцедуры
Если в табличной части документа планируется большое количество строк (например, при загрузке данных из файла), выполнение запроса в цикле при каждом изменении может замедлить работу системы. В этом случае правильнее использовать массовую обработку строк через Запрос.
Рассмотрим, как собрать все номенклатурные позиции из табличной части в массив и получить данные одним запросом:
Соответствие = Новый Соответствие;
МассивНоменклатуры = Новый Массив;
Для каждого СтрТЧ Из Объект.Товары Цикл
Соответствие.Вставить(СтрТЧ.Номенклатура, СтрТЧ);
МассивНоменклатуры.Добавить(СтрТЧ.Номенклатура);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Массив", МассивНоменклатуры);
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодНоменклатуры КАК ШтрихкодНоменклатуры
|ГДЕ
| ШтрихкодНоменклатуры.Номенклатура В(&Массив)";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаТЧ = Соответствие.Получить(Выборка.Номенклатура);
Если ПустаяСтрока(СтрокаТЧ.Штрихкод) Тогда
СтрокаТЧ.Штрихкод = Выборка.Штрихкод;
КонецЕсли;
КонецЦикла;
[0]) может быть неверным, если вы не передаете параметры упаковки и характеристики в отбор запроса.РаботаСоШтрихкодами. Использование типовых функций упростит дальнейшее обновление конфигурации.Используя данные методы, вы сможете добиться стабильного и быстрого заполнения данных, значительно облегчая процесс работы пользователей с документами в системе 1С.