Как вызвать функцию или процедуру при вычислении выражений в обработке загрузки данных в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Выясним причину изоляции контекста исполнения

Проанализируем механизм работы обработки загрузки. Вычисление выражений для колонок таблицы выполняется динамически на стороне сервера с использованием встроенных операторов платформы Вычислить() или Выполнить(). Из-за этого возникают следующие ограничения:

  1. Область видимости модуля формы: серверный алгоритм загрузки не имеет прямого доступа к локальным и даже экспортным процедурам и функциям, объявленным внутри модуля формы. Модуль формы отвечает исключительно за клиентский интерфейс и недоступен при исполнении серверной логики документа или объекта.
  2. Неявное указание контекста: даже если метод перенесен в модуль объекта обработки, прямой вызов по имени вида ПоискПоШК(ТекстыЯчеек[1]) внутри динамически скомпилированной строки не сработает без явной ссылки на объект.
  3. Разница между выражением и исполняемым кодом: если в настройках колонки задан режим многострочного алгоритма (через Выполнить()), платформа не обрабатывает оператор Возврат. Результат должен напрямую присваиваться специальной служебной переменной (например, Значение).

Способ 1. Перенос функции в модуль объекта внешней обработки

Рассмотрим основной и самый надежный способ решения для внешних обработок. Внешняя обработка (файл .epf), как и встроенный объект конфигурации, имеет собственный Модуль объекта.

Разберем по шагам порядок действий:

  1. Откроем внешнюю обработку в конфигураторе. В дереве метаданных обработки нажмем правой кнопкой мыши на корневой элемент и выберем пункт «Открыть модуль объекта».
  2. Перенесем функцию поиска из модуля формы в модуль объекта и обязательно добавим ключевое слово Экспорт.

Посмотрим на пример реализации функции в модуле объекта:


Функция ПоискПоШК(ШтрихкодЗначение) Экспорт

    Если ПустаяСтрока(ШтрихкодЗначение) Тогда
        Возврат Справочники.Номенклатура.ПустаяСсылка();
    КонецЕсли;

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

    Возврат Справочники.Номенклатура.ПустаяСсылка();

КонецФункции
  1. В поле вычисления формулы обработки укажем обращение к методу через ключевое слово ЭтотОбъект:

ЭтотОбъект.ПоискПоШК(ТекстыЯчеек[1])

Если для колонки используется вариант с выполнением блока кода, присвоим результат служебной переменной контекста:

Значение = ЭтотОбъект.ПоискПоШК(ТекстыЯчеек[1]);

Способ 2. Использование серверного общего модуля

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

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

  1. Создадим или выберем существующий общий модуль (например, НоменклатураСервер) со свойствами «Сервер» и «Вызов сервера» (при необходимости).
  2. Объявим экспортную функцию поиска.
  3. В строке вычисления обработки обратимся к общему модулю напрямую без указания ЭтотОбъект:

НоменклатураСервер.ПоискПоШК(ТекстыЯчеек[1])

Особенности реализации нечеткого поиска номенклатуры

Когда требуется перейти от точного поиска по штрихкоду к нечеткому сопоставлению по наименованию, важно учитывать ограничения платформы 1С:

  1. Штатный полнотекстовый поиск: механизм полнотекстового поиска платформы работает только по актуальному индексу и выполняет поиск с масками и словоформами, но не исправляет опечатки и не сопоставляет переставленные слова.
  2. Производительность алгоритмов подобия: посимвольный расчет расстояния Левенштейна или коэффициента Джаро — Винклера на встроенном языке при обработке большого справочника номенклатуры в цикле приведет к сильному падению скорости загрузки.
  3. Двухэтапная оптимизация: сначала сформируем запрос с грубым отбором (например, по первым нескольким символам наименования или совпадению группы), и только к полученной выборке из 10–30 записей применим программный нечеткий алгоритм сопоставления строк.
← На главную