К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как писать обработки в 1С: практическое руководство

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

Внешняя обработка в 1С — это файл с расширением .epf, который выполняет прикладную задачу без изменения конфигурации: массово изменяет данные, формирует отчёты, загружает и выгружает информацию, запускает сервисные операции. Именно поэтому обработки — первый инструмент, который осваивает начинающий разработчик 1С, и основной способ решения разовых задач для опытного специалиста.

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

Материал рассчитан на тех, кто уже знаком с конфигуратором и базовым синтаксисом встроенного языка 1С. Разберём полный цикл: от создания пустой обработки до регистрации её в базе, с примерами кода, проверкой результата и разбором типичных ошибок.

Когда нужна внешняя обработка, а когда — доработка конфигурации

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

Дорабатывать конфигурацию стоит, когда функционал нужен постоянно и должен быть встроен в бизнес-процесс: новые документы, изменение проведения, дополнительные кнопки в существующих формах, регламентные задания с жёсткими требованиями к надёжности. Внешняя обработка не может добавить новый объект метаданных — справочник, документ или регистр.

Маршрут решения

Как выбрать подход

Задача разовая или запускается вручную по требованиюПишите внешнюю обработку — конфигурацию не трогаем
Нужен новый объект метаданных или изменение проведения документовТолько доработка конфигурации, обработка не поможет
Нужен отчёт по данным без изменения данныхРассмотрите внешний отчёт (.erf) или обработку с СКД
Функционал нужен всем пользователям постоянноДоработка конфигурации или расширение (.cfe)

Отдельный вариант — расширение конфигурации. Оно занимает промежуточное положение: позволяет добавлять формы, подписки на события и даже собственные объекты, не снимая конфигурацию с поддержки. Если обработка начинает «обрастать» постоянной логикой, имеет смысл перенести её в расширение.

Создание обработки в конфигураторе

Откройте конфигуратор и выполните команду «Файл → Новый → Внешняя обработка». Задайте имя — оно станет именем объекта в коде, поэтому используйте осмысленный идентификатор без пробелов, например ЗагрузкаПрайсовПоставщиков. Синоним увидят пользователи в списке дополнительных обработок.

У обработки есть два ключевых места для кода. Модуль объекта содержит серверную логику: процедуры работы с данными, экспортные функции, сведения о внешней обработке для регистрации. Модуль формы содержит клиентскую логику: обработчики кнопок, полей ввода, команд. Для управляемых форм код делится директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста.

Добавьте форму через контекстное меню обработки — «Добавить форму». На форму поместите нужные элементы: поля ввода параметров, кнопку запуска, табличное поле для отображения результата. Реквизиты формы создаются в панели реквизитов и служат для хранения данных между вызовами сервера.

Порядок создания обработки
  1. 1
    Файл → Новый → Внешняя обработка, задайте имя и синоним
  2. 2
    Добавьте основную форму и разместите элементы управления
  3. 3
    Напишите серверную логику в модуле объекта или серверных процедурах формы
  4. 4
    Сохраните файл .epf и откройте его в режиме Предприятие на копии базы
  5. 5
    Проверьте результат на тестовых данных, затем подключите в рабочую базу

Структура кода: клиент, сервер и запросы

Типовая схема работы обработки с управляемой формой: пользователь нажимает кнопку на клиенте, клиентская процедура вызывает серверную, серверная выполняет запрос и изменяет данные, результат возвращается на клиент и отображается. Всю работу с базой данных размещайте только на сервере — попытка выполнить запрос в клиентской процедуре приведёт к ошибке компиляции.

&НаКлиенте

Процедура ВыполнитьОбработку(Команда)

ВыполнитьОбработкуНаСервере();

ПоказатьПредупреждение(, "Обработка завершена");

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

&НаСервере

Процедура ВыполнитьОбработкуНаСервере()

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.ЭтоГруппа = ЛОЖЬ

| И Номенклатура.ПометкаУдаления = ЛОЖЬ";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

// логика обработки каждого элемента

КонецЦикла;

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

При обходе больших выборок учитывайте производительность. Не выполняйте запросы внутри цикла — это классическая ошибка, которая превращает секундную операцию в многочасовую. Получайте все нужные данные одним запросом с соединениями и обходите результат. Если нужно изменить тысячи объектов, используйте транзакции с разумным размером пачки, чтобы не держать длинные блокировки.

Изменение данных: транзакции и безопасность

Обработки, которые изменяют данные, — самый рискованный класс инструментов. Ошибка в условии отбора может изменить или удалить тысячи записей, и откатить это без резервной копии невозможно. Правило номер один: перед первым запуском на рабочей базе сделайте выгрузку через конфигуратор или средствами СУБД.

Множественные изменения заворачивайте в транзакцию: если на середине цикла произойдёт ошибка, база не останется в половинчатом состоянии. Для очень больших объёмов используйте пакетную обработку — коммит каждые несколько сотен объектов с записью прогресса в журнал.

НачатьТранзакцию();

Попытка

Пока Выборка.Следующий() Цикл

Объект = Выборка.Ссылка.ПолучитьОбъект();

Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

Объект.Записать();

КонецЦикла;

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение ОписаниеОшибки();

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

Полезный приём — режим «только показать». Добавьте на форму флажок «Тестовый режим»: при установленном флажке обработка выводит список объектов, которые будут изменены, но не записывает их. Пользователь сначала видит объём изменений и только потом запускает реальную обработку.

Регистрация обработки в базе

Простейший способ запуска — «Файл → Открыть» в режиме «Предприятие». Это удобно для разработчика, но не для пользователей. Для постоянного использования обработку регистрируют в справочнике «Дополнительные отчеты и обработки» (в типовых конфигурациях на БСП — раздел «Администрирование → Печатные формы, отчеты и обработки»).

Чтобы обработка корректно зарегистрировалась, в модуле объекта должна быть функция СведенияОВнешнейОбработке(), возвращающая структуру с видом обработки, версией, безопасным режимом и таблицей команд. Вид определяет поведение: «ЗаполнениеОбъекта» добавляет кнопку в формы документов, «ДополнительнаяОбработка» — просто пункт в общем списке, «СозданиеСвязанныхОбъектов» — ввод на основании.

Типичные ошибки при регистрации
01
Отсутствует функция СведенияОВнешнейОбработке — база отказывается принимать файл или регистрирует его без команд
02
Неверно указан вид обработки — кнопка не появляется там, где ожидалось, или обработка недоступна
03
Назначение использования не заполнено — обработка не видна ни у одного пользователя или, наоборот, у всех
04
Безопасный режим отключён без необходимости — обработка получает полный доступ к файловой системе сервера

Обратите внимание на безопасный режим. По умолчанию дополнительные обработки выполняются в безопасном режиме: запрещены операции с файловой системой, COM-объекты, внешние компоненты. Если обработке нужно, например, прочитать файл с диска, безопасный режим придётся отключить — но делайте это осознанно и только для проверенного кода.

Отладка и проверка результата

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

Для диагностики в рабочей базе, где конфигуратор недоступен, используйте Сообщить() для вывода промежуточных значений и запись в журнал регистрации через ЗаписьЖурналаРегистрации(). Второй способ предпочтительнее для длительных операций: сообщения могут потеряться при разрыве сеанса, а журнал сохраняется.

Контрольные точки

Как проверить результат обработки

Количество обработанных объектов
Норма

Совпадает с числом строк в тестовом запросе до записи

Тревожный признак

Обработано больше или меньше объектов, чем отобрано — ошибка в условиях

Значения изменённых реквизитов
Норма

Случайная выборка из 5–10 объектов показывает ожидаемые значения

Тревожный признак

Часть объектов не изменилась или содержит неверные данные

Журнал регистрации
Норма

Нет ошибок записи и конфликтов блокировок за время работы

Тревожный признак

Ошибки блокировок, обрывы транзакций — часть данных могла не записаться

Проведение связанных документов
Норма

Документы после изменения перепроводятся без ошибок

Тревожный признак

Случились ошибки проведения — обработка нарушила логику данных

Частые ошибки и ограничения

Кроме запросов в цикле и работы без транзакций, распространены ещё несколько проблем. Первая — использование метода Записать() без учёта прав: обработка выполняется под пользователем, и если у него нет прав на объект, запись молча не выполнится или выдаст ошибку. Для сервисных операций иногда используют УстановитьПривилегированныйРежим(Истина), но это обход системы безопасности — применяйте точечно.

Вторая — игнорирование обмена данными. Изменение объектов через обработку регистрируется в планах обмена, и в распределённых базах это может породить огромные пакеты синхронизации. Если изменения служебные и не должны мигрировать, используйте Объект.ОбменДанными.Загрузка = Истина — но помните, что этот режим также отключает проверки при записи.

Третья — хранение обработки «на рабочем столе». Файлы обработок разъезжаются по почте и папкам, версии путаются, никто не знает, какая актуальна. Храните обработки в системе контроля версий или хотя бы в едином сетевом каталоге с нумерацией версий в имени файла и описанием изменений.

Полезно добавить в обработку вывод версии и даты сборки прямо на форму или в заголовок. Когда пользователь сообщает об ошибке, вы сразу поймёте, какой именно файл он запускал — это экономит часы на воспроизведение проблемы.
ПЗ
Практическое замечание

FAQ

Чем внешняя обработка отличается от внешнего отчёта?

Технически это разные типы файлов: обработка (.epf) предназначена для действий над данными, отчёт (.erf) — для их представления. На практике граница размыта: обработка может строить отчёт через СКД, а отчёт — содержать кнопки с логикой. Выбирайте по основному назначению: если результат — табличный документ для просмотра, делайте отчёт; если изменение данных или сервисная операция — обработку.

Можно ли запускать обработку по расписанию?

Да, если конфигурация построена на Библиотеке стандартных подсистем: при регистрации дополнительной обработки доступна настройка расписания, и команда будет выполняться фоновым заданием на сервере. Учтите, что в фоновом выполнении недоступен интерактив — никаких вопросов пользователю и открытия форм; все параметры должны задаваться заранее в настройках команды.

Почему обработка работает в файловой базе, но падает в клиент-серверной?

Чаще всего причины три: код работы с данными размещён в клиентской процедуре, используются локальные пути к файлам (на сервере диск C: — это диск сервера, а не пользователя) или обработка обращается к COM-объектам, которых нет на сервере. Проверяйте директивы компиляции и передавайте файлы на сервер через временное хранилище.

Как передать обработке файл Excel для загрузки?

На клиенте поместите файл во временное хранилище через НачатьПомещениеФайла(), передайте адрес хранилища в серверную процедуру, там извлеките данные через ПолучитьИзВременногоХранилища() и читайте табличный документ методом Прочитать() табличного документа — так обработка не потребует установленного Excel на сервере. Чтение через COM-объект Excel.Application — альтернатива, но она требует самого Excel и не работает на Linux-сервере.

Опасно ли давать пользователям право открывать внешние обработки?

Да. Право «Интерактивное открытие внешних отчетов и обработок» позволяет запустить любой файл, включая вредоносный код с полными правами пользователя. Выдавайте его только разработчикам и администраторам. Обычным пользователям давайте доступ к конкретным обработкам через справочник «Дополнительные отчеты и обработки» — там действует безопасный режим и контроль назначений.

Как обновить обработку, уже зарегистрированную в базе?

Откройте элемент справочника «Дополнительные отчеты и обработки», используйте команду замены файла (в типовых — «Заменить на внешнюю обработку» или загрузка из файла) и выберите новую версию .epf. Настройки назначения и расписания сохранятся. Увеличивайте номер версии в СведенияОВнешнейОбработке, чтобы было видно, какая редакция загружена.

Итог

Что важно запомнить

Внешняя обработка — безопасный способ решить задачу без доработки конфигурации. Пишите работу с данными на сервере, изменения заворачивайте в транзакции, тестируйте на копии базы с ограниченной выборкой, регистрируйте через «Дополнительные отчеты и обработки» и контролируйте версии файлов.