При разработке функционала на платформе 1С:Предприятие часто требуется вынести алгоритм вычислений в общий модуль и обращаться к нему из форм документов, справочников или внешних обработок. Разберем типичные ошибки, возникающие при таком вызове, и выясним, как правильно передавать параметры и получать результат.
Проанализируем ситуацию: в форме выполняется вызов функции общего модуля, однако платформа прерывает работу с ошибкой времени выполнения:
{ВнешняяОбработка.ЗагрузкаИзXlsx.Форма.Форма.Форма(592)}: Недостаточно фактических параметров
СтрокаРасчета = 100;
Тест = мт_Счет.Расчет(СтрокаРасчета);
Выясним причину такого поведения. Ошибка возникает тогда, когда в заголовке функции объявлено больше обязательных параметров, чем передается при фактическом вызове. Например, сигнатура функции в общем модуле мт_Счет имеет вид:
Функция Расчет(СтрокаРасчета, Организация, ДокументСсылка, МесяцНачисления) Экспорт
// Алгоритм расчета
Возврат Результат;
КонецФункции
Если при вызове передать только один аргумент вместо четырех объявленных (как в примере: мт_Счет.Расчет(СтрокаРасчета)), платформа 1С сообщает о нехватке параметров.
Рассмотрим два основных варианта исправления данной ситуации в зависимости от бизнес-логики алгоритма.
Если для вычисления функции обязательны все данные, необходимо передать все аргументы в точном соответствии с сигнатурой функции:
// В коде формы обработки
СтрокаРасчета = 100;
Организация = Объект.Организация;
ДокументСсылка = Объект.Ссылка;
МесяцНачисления = Объект.ПериодРегистрации;
Тест = мт_Счет.Расчет(СтрокаРасчета, Организация, ДокументСсылка, МесяцНачисления);
Если часть параметров является необязательной, укажем для них значения по умолчанию прямо в заголовке метода с помощью оператора =:
Функция Расчет(СтрокаРасчета, Организация = Неопределено, ДокументСсылка = Неопределено, МесяцНачисления = Неопределено) Экспорт
// Внутри проверяем заполненность необязательных параметров
Если Организация = Неопределено Тогда
// Дополнительная логика
КонецЕсли;
Возврат Результат;
КонецФункции
В таком случае вызов мт_Счет.Расчет(СтрокаРасчета) выполнится успешно, а остальные аргументы автоматически примут значение Неопределено.
Разберем по шагам, какие свойства общего модуля критически важны для корректной работы клиент-серверного взаимодействия:
Экспорт, иначе она будет доступна только внутри самого модуля.
Посмотрим на важную техническую особенность клиент-серверной архитектуры 1С:Предприятие. При вызове серверного общего модуля с клиента через границу контекстов запрещено передавать мутабельные объекты. К ним относятся:
ТаблицаЗначений и ДеревоЗначений;ДокументОбъект, СправочникОбъект);ЭтаФорма, Объект).Допускается передача только сериализуемых типов: примитивных типов (числа, строки, даты, булево), ссылок на объекты информационной базы (например, ДокументСсылка, СправочникСсылка), а также структур, массивов и соответствий, содержащих только сериализуемые значения.
Если для расчета требуется обработать данные табличной части формы, рекомендуется вызывать серверный общий модуль не напрямую с клиента, а через серверную процедуру или функцию формы с директивой &НаСервереБезКонтекста:
&НаКлиенте
Процедура ВыполнитьРасчет(Команда)
Результат = ВыполнитьРасчетНаСервере(Объект.Ссылка, Объект.Организация);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьРасчетНаСервере(ДокументСсылка, Организация)
СтрокаРасчета = 100;
МесяцНачисления = ТекущаяДатаСеанса();
Возврат мт_Счет.Расчет(СтрокаРасчета, Организация, ДокументСсылка, МесяцНачисления);
КонецФункции
Такой подход оптимизирует сетевой трафик и защищает код от непредвиденных ошибок передачи типов.