Работа с Custom Function Unit (CFU) в 1С:Предприятие 8.3 открывает новые возможности для гибкой настройки бизнес-логики без глубокой модификации типовых конфигураций. Этот механизм позволяет инкапсулировать повторяемую функциональность в отдельные модули, которые можно переиспользовать в разных частях системы или даже в различных базах. Однако многие разработчики сталкиваются с трудностями при первом создании CFU: от непонимания структуры до ошибок компиляции.

В этой статье мы разберём процесс создания CFU с нуля — от подготовки среды разработки до тестирования готового модуля. Особое внимание уделим практическим примерам кода для типовых задач (работа с документами, справочниками, регистрами), которые можно адаптировать под свои нужды. Материал будет полезен как начинающим программистам 1С, так и опытным специалистам, желающим систематизировать знания о CFUs.

Что такое CFU в 1С и зачем оно нужно

CFU (Custom Function Unit) — это пользовательский функциональный модуль в 1С:Предприятие 8.3, который представляет собой набор процедур и функций, объединённых общей логикой. В отличие от обычных общих модулей, CFU имеет чётко определённый интерфейс и может использоваться как самостоятельный компонент.

Основные преимущества CFU:

  • 🔄 Переиспользуемость кода — один модуль можно подключать к разным объектам конфигурации
  • 🛠️ Упрощение поддержки — изменения в одном месте автоматически применяются везде, где используется CFU
  • 📦 Инкапсуляция логики — скрытие внутренней реализации от внешнего кода
  • 🔗 Гибкая интеграция — возможность подключения к различным событиям и объектам

Типичные сценарии применения CFU включают:

  • 📄 Обработку сложных алгоритмов работы с документами (например, автоматическое заполнение реквизитов)
  • 🗃️ Работу со справочниками (поиск, фильтрация, создание элементов по шаблонам)
  • 📊 Формирование отчётов с нестандартной логикой
  • 🔄 Обмен данными между системами с преобразованием форматов
📊 Для каких задач вы чаще всего создаёте CFU в 1С?
Работа с документами
Обработка справочников
Интеграция с внешними системами
Формирование отчётов
Другое

Подготовка среды разработки для работы с CFU

Перед созданием CFU необходимо убедиться, что ваша среда разработки соответствует требованиям. Минимальные условия:

  • 🖥️ 1С:Предприятие 8.3 версии не ниже 8.3.18 (для полной поддержки CFU)
  • 🛠️ Конфигуратор с правами администратора
  • 📁 Резервная копия базы данных (обязательно!)

Проверьте текущую версию платформы в меню Справка → О программе. Если версия ниже 8.3.18, обновите платформу через центр лицензирования .

☑️ Подготовка к созданию CFU

Выполнено: 0 / 4
⚠️ Внимание: При работе с CFU в конфигурациях на управляемых формах (8.3.8+) учитывайте, что некоторые методы могут требовать явного указания контекста выполнения. Это особенно важно при вызове CFU из клиентских процедур.

Для удобной работы рекомендуется:

  • 📌 Настроить горячие клавиши для быстрого перехода между модулями
  • 🔍 Включить подсветку синтаксиса в настройках конфигуратора
  • 📂 Создать отдельную папку в дереве конфигурации для хранения CFU

Структура CFU: из чего состоит функциональный модуль

Каждый CFU в 1С:Предприятие состоит из нескольких обязательных компонентов:

Компонент Назначение Пример содержимого
Заголовок модуля Метоинформация о модуле (имя, версия, автор) // CFU: ОбработкаЗаказовПокупателя v1.2
Объявление переменных Глобальные переменные модуля Перем мТаймаут Соответствие;
Экспортные процедуры/функции Интерфейс модуля (доступно извне) Процедура ЗаполнитьДанныеКлиента(Документ) Экспорт
Внутренние процедуры Служебные методы (не доступны извне) Функция ПолучитьДанныеКлиента(КодКлиента)
Обработчики событий Реакция на системные события Процедура ПриНачалеРаботыСистемы()

Особенности структуры CFU:

  • 📜 Все экспортные процедуры должны быть явным образом помечены словом Экспорт
  • 🔐 Внутренние методы (без Экспорт) доступны только внутри самого CFU
  • 📚 Допускается использование вложенных областей (#Область) для логической группировки кода
💡

Для удобства отладки добавляйте в начало каждого CFU комментарий с датой последнего изменения и автором. Это поможет при коллективной разработке.

Пошаговая инструкция по созданию CFU

Рассмотрим процесс создания CFU на примере модуля для работы с заказами покупателей. Этот сценарий покрывает 80% типовых задач.

Шаг 1. Создание нового объекта конфигурации

В дереве конфигурации:

  1. Правой кнопкой по ветке Общие → CommonModules
  2. Выберите Добавить → Общий модуль
  3. Задайте имя: CFU_ОбработкаЗаказов
  4. Установите флаги:
    • 📌 Глобальный (если нужен доступ из других баз)
    • 📌 Клиент (управляемое приложение)
    • 📌 Сервер

Шаг 2. Определение интерфейса модуля

В модуле создаём экспортные процедуры, которые будут доступны внешнему коду:

// CFU: ОбработкаЗаказовПокупателя v1.0

// Автор: Иванов И.И.

// Дата: 15.05.2026

Перем мЛог Соответствие; // Хранение лога операций

// Основной экспортный метод

Процедура ОбработатьНовыйЗаказ(ДокументОбъект) Экспорт

// Логика обработки заказа

мЛог.Вставить(ДокументОбъект.Ссылка, ТекущаяДата());

// Вызов внутреннего метода

ЗаполнитьРеквизитыПоУмолчанию(ДокументОбъект);

КонецПроцедуры

// Внутренний метод (не доступен извне)

Процедура ЗаполнитьРеквизитыПоУмолчанию(Документ)

// Логика заполнения

Если НЕ ЗначениеЗаполнено(Документ.Ответственный) Тогда

Документ.Ответственный = Пользователи.ТекущийПользователь();

КонецЕсли;

КонецПроцедуры

Шаг 3. Подключение CFU к объектам конфигурации

Чтобы использовать созданный CFU в документе "Заказ покупателя":

  1. Откройте объект Документ.ЗаказПокупателя
  2. Перейдите на вкладку Модуль объекта
  3. Добавьте строку подключения:
    #Использовать CFU_ОбработкаЗаказов
  4. В обработчике события ПередЗаписью добавьте вызов:
    Процедура ПередЗаписью(Отказ)
    

    CFU_ОбработкаЗаказов.ОбработатьНовыйЗаказ(ЭтотОбъект);

    КонецПроцедуры

  5. Что делать если CFU не подключается?

    Проверьте правильность имени модуля в директиве #Использовать (регистрозависимо!). Убедитесь, что модуль помечен как Клиент/Сервер при необходимости. Перезагрузите конфигуратор после создания CFU.

    Типичные ошибки при создании CFU и как их избежать

    Даже опытные разработчики сталкиваются с проблемами при работе с CFU. Рассмотрим наиболее распространённые ошибки и способы их решения:

    1. Ошибка компиляции "Неопределённый идентификатор"

    Причина: Попытка использовать в CFU объекты конфигурации, которые не объявлены в параметрах метода.

    Решение: Все внешние объекты должны передаваться как параметры:

    // Неверно:
    

    Функция ПолучитьНаименованиеТовара() Экспорт

    Возврат Справочники.Номенклатура.Наименование; // Ошибка!

    КонецФункции

    // Правильно:

    Функция ПолучитьНаименованиеТовара(СсылкаНаТовар) Экспорт

    Возврат СсылкаНаТовар.Наименование;

    КонецФункции

    2. Проблемы с контекстом выполнения

    Причина: Вызов серверных процедур из клиентского кода без явного указания контекста.

    Решение: Используйте директивы компиляции:

    &НаСервере
    

    Процедура СервернаяОбработка() Экспорт

    // Код выполняется на сервере

    КонецПроцедуры

    &НаКлиенте

    Процедура КлиентскаяОбработка()

    // Вызов серверного метода

    СервернаяОбработкаНаСервере();

    КонецПроцедуры

    3. Утечки памяти при работе с временными данными

    Причина: Некорректная работа с временными таблицами значений и коллекциями.

    Решение: Всегда очищайте временные объекты:

    Процедура ОбработатьДанные() Экспорт
    

    ТЗ = Новый ТаблицаЗначений;

    ТЗ.Колонки.Добавить("Поле1");

    // ... обработка ...

    ТЗ.Очистить(); // Важно!

    КонецПроцедуры

    ⚠️ Внимание: При использовании CFU в распределённых информационных базах (РИБ) учитывайте, что глобальные переменные модуля не синхронизируются между узлами. Для обмена данными используйте специальные механизмы РИБ.

    Практические примеры CFU для разных задач

    Рассмотрим готовые примеры CFU для типовых бизнес-задач, которые можно адаптировать под свои нужды.

    Пример 1: CFU для работы с номенклатурой

    // CFU: РаботаСНоменклатурой v1.1
    
    

    Процедура СоздатьНоменклатуруПоШаблону(Шаблон, НовоеНаименование) Экспорт

    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

    НовыйЭлемент.Наименование = НовоеНаименование;

    НовыйЭлемент.Артикул = Шаблон.Артикул + "_Копия";

    НовыйЭлемент.Группа = Шаблон.Группа;

    НовыйЭлемент.Записать();

    Возврат НовыйЭлемент.Ссылка;

    КонецПроцедуры

    Функция ПолучитьОстаткиПоСкладам(СсылкаНаНоменклатуру) Экспорт

    Запрос = Новый Запрос;

    Запрос.Текст =

    "ВЫБРАТЬ

    | РегистрыНакопления.ОстаткиТоваровОрганизаций.Склад КАК Склад,

    | СУММА(РегистрыНакопления.ОстаткиТоваровОрганизаций.КоличествоОстаток) КАК Количество

    |ИЗ

    | РегистрНакопления.ОстаткиТоваровОрганизаций КАК РегистрыНакопления.ОстаткиТоваровОрганизаций

    |ГДЕ

    | РегистрыНакопления.ОстаткиТоваровОрганизаций.Номенклатура = &Номенклатура

    |СГРУППИРОВАТЬ ПО

    | РегистрыНакопления.ОстаткиТоваровОрганизаций.Склад";

    Запрос.УстановитьПараметр("Номенклатура", СсылкаНаНоменклатуру);

    Результат = Запрос.Выполнить();

    Возврат Результат.Выгрузить();

    КонецФункции

    Пример 2: CFU для интеграции с внешними системами

    // CFU: ИнтеграцияСAPI v2.0
    
    

    Функция ОтправитьЗапросНаСервер(URL, ТелоЗапроса, Заголовки = Неопределено) Экспорт

    HTTPСоединение = Новый HTTPСоединение(URL);

    HTTPСоединение.УстановитьТаймаут(30);

    Если Заголовки <> Неопределено Тогда

    Для Каждого Заголовок Из Заголовки Цикл

    HTTPСоединение.УстановитьЗаголовок(Заголовок.Ключ, Заголовок.Значение);

    КонецЦикла;

    КонецЕсли;

    Попытка

    Ответ = HTTPСоединение.ОтправитьДляОбработки(ТелоЗапроса);

    Возврат Ответ.ПолучитьТекст();

    Исключение

    ЗаписатьЖурналРегистрации(НСтр("ru = 'Ошибка интеграции: '") + ОписаниеОшибки());

    Возврат Неопределено;

    КонецПопытки;

    КонецФункции

    Процедура ЗаписатьЖурналРегистрации(Сообщение) Экспорт

    Регистратор = РегистрыСведений.ЖурналИнтеграции.СоздатьМенеджерЗаписи();

    НоваяЗапись = Регистратор.СоздатьЗапись();

    НоваяЗапись.Период = ТекущаяДата();

    НоваяЗапись.Сообщение = Сообщение;

    НоваяЗапись.Записать();

    КонецПроцедуры

    Пример 3: CFU для работы с документами

    // CFU: ОбработкаДокументов v1.3
    
    

    Процедура ПровестиДокументСКонтролем(ДокументОбъект) Экспорт

    Попытка

    ДокументОбъект.Провести();

    Исключение

    Сообщить(ОписаниеОшибки());

    Отказ = Истина;

    Возврат Ложь;

    КонецПопытки;

    Возврат Истина;

    КонецПроцедуры

    Функция ПолучитьСвязанныеДокументы(ДокументСсылка, ВидДокумента) Экспорт

    Запрос = Новый Запрос;

    Запрос.Текст =

    "ВЫБРАТЬ

    | СвязанныйДокумент.Ссылка КАК Ссылка

    |ИЗ

    | Документ." + ВидДокумента + " КАК СвязанныйДокумент

    |ГДЕ

    | СвязанныйДокумент.Основание = &Основание";

    Запрос.УстановитьПараметр("Основание", ДокументСсылка);

    Результат = Запрос.Выполнить();

    Возврат Результат.ВыгрузитьКолонку("Ссылка");

    КонецФункции

    💡

    При разработке CFU для интеграции всегда реализуйте механизм логирования ошибок. Это значительно упростит диагностику проблем в продуктивной среде.

    Тестирование и отладка CFU

    Правильное тестирование CFU — залог стабильной работы системы. Используйте комбинацию методов:

    1. Unit-тестирование

    Создайте тестовый модуль с проверкой всех экспортных методов:

    Процедура ТестОбработкиЗаказа()
    

    // Создание тестового документа

    ТестовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();

    ТестовыйЗаказ.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Тест");

    // Вызов CFU

    Попытка

    CFU_ОбработкаЗаказов.ОбработатьНовыйЗаказ(ТестовыйЗаказ);

    Сообщить("Тест пройден успешно!");

    Исключение

    Сообщить("Ошибка: " + ОписаниеОшибки());

    КонецПопытки;

    КонецПроцедуры

    2. Отладка в пользовательском режиме

    • 🔍 Установите точки останова в коде CFU через конфигуратор
    • 🖱️ Используйте отладчик для пошагового выполнения
    • 📝 Проверяйте значения переменных в окне "Выражения"

    3. Стресс-тестирование

    Для проверки производительности:

    • 📊 Создайте тестовые данные (1000+ документов)
    • ⏱️ Замерьте время выполнения CFU на большом объёме данных
    • 📈 Используйте 1С:Анализ производительности для выявления узких мест
    ⚠️ Внимание: При тестировании CFU в клиент-серверном варианте работы проверяйте корректность выполнения как на сервере, так и на клиенте. Некоторые ошибки (например, связанные с контекстом) могут проявляться только в одном из режимов.

    Для автоматизации тестирования можно использовать:

    • 🤖 1С:Тест-центр — для создания комплексных тестовых сценариев
    • 📋 Vanessa-ADD — для автоматизированного тестирования
    • 🔄 Стандартные средства отладки 1С (журнал регистрации, трассировка)

    Оптимизация и документирование CFU

    Хорошо оптимизированный и документированный CFU проще поддерживать и модифицировать. Следуйте этим рекомендациям:

    Оптимизация кода:

    • 🚀 Избегайте вложенных циклов при работе с большими данными
    • 🗃️ Используйте временные таблицы вместо многократных обращений к базе
    • 🔍 Кэшируйте часто используемые данные в переменных модуля
    • 📊 Оптимизируйте запросы (индексы, выборка только нужных полей)

    Документирование:

    • 📝 Добавляйте комментарии к каждому экспортному методу с описанием:
      • Назначения метода
      • Параметров (типы, обязательность)
      • Возвращаемого значения
      • Пример использования
    • 📋 Ведите журнал изменений в начале модуля
    • 🔖 Используйте теги // TODO: для пометки незавершённых задач

Пример хорошо документированного метода:

/// <summary>

/// Получает остатки товара на всех складах

/// </summary>

/// <param name="СсылкаНаНоменклатуру" type="СправочникСсылка.Номенклатура">

/// Ссылка на элемент справочника Номенклатура

/// </param>

/// <returns type="ТаблицаЗначений">

/// Таблица с колонками: Склад (СправочникСсылка.Склады), Количество (Число)

/// </returns>

/// <example>

/// Остатки = ПолучитьОстаткиПоСкладам(Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));

/// </example>

Функция ПолучитьОстаткиПоСкладам(СсылкаНаНоменклатуру) Экспорт

// Реализация метода...

КонецФункции

Для сложных CFU рекомендуется создавать отдельную инструкцию по использованию в формате Markdown или Word, где подробно описываются:

  • 📌 Назначение модуля
  • 📋 Список всех экспортных методов с примерами
  • ⚠️ Возможные ошибки и способы их решения
  • 🔄 Сценарии типового использования
  • FAQ: Частые вопросы по работе с CFU в 1С

    Можно ли использовать CFU в базовых версиях 1С?

    Да, механизм CFU доступен во всех редакциях 1С:Предприятие 8.3, включая базовые версии. Однако в базовых версиях есть ограничение на модификацию конфигурации, поэтому создавать новые CFU можно только в режиме "1С:Предприятие" через внешние обработки или расширения.

    Как обновить CFU в продуктивной базе без остановки работы пользователей?

    Для безопасного обновления:

    1. Создайте новую версию CFU с другим именем (например, CFU_ОбработкаЗаказов_v2)
    2. Обновите все вызовы модуля в конфигурации
    3. Протестируйте работу в тестовой базе
    4. Обновите продуктивную базу в нерабочее время

    Используйте механизм Расширений конфигурации для минимизации рисков.

    Можно ли вызывать CFU из внешних обработок?

    Да, для этого:

    1. Поместите CFU в общие модули конфигурации
    2. Установите флаг Глобальный для модуля
    3. Во внешней обработке используйте директиву:
      #Использовать &НаСервере CFU_ИмяМодуля

Учтите, что при таком подходе обработка должна иметь права на вызов серверных методов.

Как организовать командную работу с CFU?

Рекомендации для командной разработки:

  • 📁 Храните CFU в системе контроля версий (Git, SVN)
  • 📝 Ведите документацию в формате Confluence или Notion
  • 🔄 Используйте соглашение об именовании (например, CFU_[Область]_[Назначение])
  • 📊 Проводите код-ревью перед внедрением в продуктив
Что делать если CFU перестал работать после обновления платформы?

Алгоритм действий:

  1. Проверьте журнал регистрации на предмет ошибок
  2. Сравните версию платформы с требованиями вашего CFU
  3. Проверьте изменения в синтаксисе (например, новые ключевые слова)
  4. Протестируйте CFU на чистой базе с новой версией платформы
  5. При необходимости адаптируйте код под новые требования

Частая проблема — изменения в работе с HTTPСоединение и другими системными объектами.