При работе с Системой Компоновки Данных (СКД) в 1С:Предприятии мы часто сталкиваемся с необходимостью использования сложных вычислений, которые не могут быть выполнены непосредственно в языке запросов или выражениях СКД. В таких случаях мы обращаемся к функциям общих модулей. Однако иногда при попытке вызвать такую функцию в вычисляемом поле СКД, мы получаем неожиданную синтаксическую ошибку, хотя сама функция корректна и работает при прямом вызове.
Давайте разберемся, почему возникает эта ошибка и как ее эффективно устранить.
Представьте ситуацию: вы создали отчет на СКД. В его вычисляемом поле вам требуется сложная логика, которую вы реализовали в экспортной функции общего модуля. Например, это может быть функция МойОбщийМодуль.МояФункция(МояПеременная). Вы убедились, что функция существует, доступна, и даже попробовали упростить ее до элементарного возврата числа (например, Возврат 11;). Тем не менее, при формировании отчета система выдает "Синтаксическую ошибку", отказываясь выполнять вычисление. Тип возвращаемого значения и тип переменной в функции соответствуют друг другу – везде используется числовой тип.
Эта проблема чаще всего проявляется при программной реализации отчетов, когда мы вручную управляем процессом компоновки данных, а не используем стандартный механизм формирования отчета.
Ключевым моментом здесь является способ формирования отчета. Если мы работаем со стандартным объектом "Отчет" и запускаем его через пользовательский интерфейс, система 1С автоматически разрешает использование внешних функций из общих модулей. Однако, когда мы выполняем компоновку данных программно, используя объекты системы компоновки данных, такие как ПроцессорКомпоновкиДанных, нам необходимо явно указать системе, что мы хотим разрешить вызовы внешних функций.
Причина синтаксической ошибки кроется в том, что по умолчанию объект ПроцессорКомпоновкиДанных инициализируется с запретом на использование внешних функций. Если этот параметр не установлен в Истина, процессор компоновки не может найти или интерпретировать вызовы функций общих модулей в выражениях полей СКД, что приводит к ошибке, часто маскирующейся под "синтаксическую ошибку" или "функция не найдена".
Для устранения проблемы нам необходимо явно разрешить использование внешних функций при инициализации объекта ПроцессорКомпоновкиДанных. Это делается путем передачи значения Истина в качестве четвертого параметра метода Инициализировать().
Метод ПроцессорКомпоновкиДанных.Инициализировать() имеет следующий синтаксис (в упрощенном виде):
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, ВозможностьИспользованияВнешнихФункций)
Нас интересует именно четвертый параметр — ВозможностьИспользованияВнешнихФункций. По умолчанию его значение равно Ложь. Нам необходимо установить его в Истина.
Рассмотрим подробнее шаги, которые мы должны предпринять в модуле отчета или в том месте, где выполняется программная компоновка данных:
ПроцессорКомпоновкиДанных:
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
Где:
МакетКомпоновкиДанных: Это объект, содержащий схему компоновки данных, по которой будет строиться отчет. Мы получаем его обычно из макета отчета.ВнешниеНаборыДанных: Это коллекция внешних наборов данных, которые могут использоваться в СКД. Если внешние наборы данных не используются, можно передать Неопределено или пустую коллекцию.ДанныеРасшифровки: Это объект типа ДанныеРасшифровкиКомпоновкиДанных, который будет заполнен информацией для расшифровки. Если расшифровка не требуется, также можно передать Неопределено.Истина: Этот параметр, ВозможностьИспользованияВнешнихФункций, является нашим спасением от синтаксической ошибки. Его установка в Истина явно разрешает процессору компоновки данных вызывать функции общих модулей.После внесения этого изменения в код программной компоновки данных, вы обнаружите, что синтаксическая ошибка исчезнет, и функции общих модулей начнут корректно работать в вычисляемых полях СКД.
Помимо корректной инициализации ПроцессорКомпоновкиДанных, важно учитывать и другие аспекты использования функций общих модулей в СКД. Давайте рассмотрим их подробнее:
Экспорт: Функции, которые мы хотим вызывать из СКД, обязательно должны быть объявлены с ключевым словом Экспорт. Это делает их видимыми для внешнего вызова.
// Пример функции в общем модуле
Функция МояФункция(МояПеременная) Экспорт
// ... ваш код вычислений ...
Возврат 11;
КонецФункции
МояФункция(Параметр).МойОбщийМодуль.МояФункция(Параметр).Чтобы лучше понять, как выглядит вызов функции в схеме компоновки данных, рассмотрим пример. В одном из сообщений форума был приведен рабочий пример, где функция общего модуля успешно используется в выражении вычисляемого поля:
Выбор
Когда РаботалВЭтотДень И ВремяОтставания = 0
Тогда "0"
Когда НЕ РаботалВЭтотДень
Тогда "-"
Иначе ОбщийМодульГлобальный.РазностьДатПрописью(ДатаВремя(1,1,1), ДобавитьКДате(ДатаВремя(1,1,1), "Секунда", ВремяОтставания))
Конец
В этом примере мы видим, как в секции Иначе вызывается функция РазностьДатПрописью из глобального общего модуля ОбщийМодульГлобальный. Эта функция принимает два параметра типа "ДатаВремя" и, предположительно, возвращает строковое представление разности дат. Такой код будет работать без синтаксической ошибки при условии, что ПроцессорКомпоновкиДанных был инициализирован с четвертым параметром Истина, как мы рассмотрели ранее.
Обратите внимание, что если бы ОбщийМодульГлобальный не был глобальным, то его имя должно было бы быть указано полностью, например, МойНеГлобальныйОбщийМодуль.РазностьДатПрописью(...).
Итак, если вы столкнулись с загадочной "синтаксической ошибкой" при использовании функций общих модулей в вычисляемых полях отчетов СКД, которые формируются программно, первым делом проверьте инициализацию объекта ПроцессорКомпоновкиДанных. Добавление параметра Истина в качестве четвертого аргумента метода Инициализировать() является проверенным и надежным решением этой проблемы.
Мы рассмотрели не только само решение, но и все сопутствующие аспекты, такие как требования к экспортным и серверным функциям, особенности обращения к ним и ограничения. Эти знания помогут вам уверенно работать с СКД и эффективно использовать возможности общих модулей для создания мощных и гибких отчетов в 1С:Предприятии.