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