Разработка и Конфигурация · 13 мин
Как писать обработки в 1С: практическое руководство
Как создать внешнюю обработку в 1С с нуля: структура модуля, формы, запросы, регистрация в базе, отладка и типичные ошибки. Практические примеры кода.
Внешняя обработка в 1С — это файл с расширением .epf, который выполняет прикладную задачу без изменения конфигурации: массово изменяет данные, формирует отчёты, загружает и выгружает информацию, запускает сервисные операции. Именно поэтому обработки — первый инструмент, который осваивает начинающий разработчик 1С, и основной способ решения разовых задач для опытного специалиста.
Главное преимущество внешней обработки перед доработкой конфигурации — безопасность. Обработку можно открыть в режиме «Предприятие», выполнить и закрыть, не снимая конфигурацию с поддержки и не обновляя базу. Это особенно важно в типовых решениях, где любое изменение усложняет последующие обновления.
Материал рассчитан на тех, кто уже знаком с конфигуратором и базовым синтаксисом встроенного языка 1С. Разберём полный цикл: от создания пустой обработки до регистрации её в базе, с примерами кода, проверкой результата и разбором типичных ошибок.
Когда нужна внешняя обработка, а когда — доработка конфигурации
Прежде чем писать код, определите, правильный ли это инструмент. Внешняя обработка подходит для разовых и периодических операций, которые не требуют постоянного присутствия в интерфейсе: массовая замена реквизитов, загрузка прайсов из Excel, выгрузка данных для обмена, тестирование гипотез, сервисные проверки целостности данных.
Дорабатывать конфигурацию стоит, когда функционал нужен постоянно и должен быть встроен в бизнес-процесс: новые документы, изменение проведения, дополнительные кнопки в существующих формах, регламентные задания с жёсткими требованиями к надёжности. Внешняя обработка не может добавить новый объект метаданных — справочник, документ или регистр.
Как выбрать подход
Отдельный вариант — расширение конфигурации. Оно занимает промежуточное положение: позволяет добавлять формы, подписки на события и даже собственные объекты, не снимая конфигурацию с поддержки. Если обработка начинает «обрастать» постоянной логикой, имеет смысл перенести её в расширение.
Создание обработки в конфигураторе
Откройте конфигуратор и выполните команду «Файл → Новый → Внешняя обработка». Задайте имя — оно станет именем объекта в коде, поэтому используйте осмысленный идентификатор без пробелов, например ЗагрузкаПрайсовПоставщиков. Синоним увидят пользователи в списке дополнительных обработок.
У обработки есть два ключевых места для кода. Модуль объекта содержит серверную логику: процедуры работы с данными, экспортные функции, сведения о внешней обработке для регистрации. Модуль формы содержит клиентскую логику: обработчики кнопок, полей ввода, команд. Для управляемых форм код делится директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста.
Добавьте форму через контекстное меню обработки — «Добавить форму». На форму поместите нужные элементы: поля ввода параметров, кнопку запуска, табличное поле для отображения результата. Реквизиты формы создаются в панели реквизитов и служат для хранения данных между вызовами сервера.
- 1Файл → Новый → Внешняя обработка, задайте имя и синоним
- 2Добавьте основную форму и разместите элементы управления
- 3Напишите серверную логику в модуле объекта или серверных процедурах формы
- 4Сохраните файл .epf и откройте его в режиме Предприятие на копии базы
- 5Проверьте результат на тестовых данных, затем подключите в рабочую базу
Структура кода: клиент, сервер и запросы
Типовая схема работы обработки с управляемой формой: пользователь нажимает кнопку на клиенте, клиентская процедура вызывает серверную, серверная выполняет запрос и изменяет данные, результат возвращается на клиент и отображается. Всю работу с базой данных размещайте только на сервере — попытка выполнить запрос в клиентской процедуре приведёт к ошибке компиляции.
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
ВыполнитьОбработкуНаСервере();
ПоказатьПредупреждение(, "Обработка завершена");
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОбработкуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
| И Номенклатура.ПометкаУдаления = ЛОЖЬ";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// логика обработки каждого элемента
КонецЦикла;
КонецПроцедуры
При обходе больших выборок учитывайте производительность. Не выполняйте запросы внутри цикла — это классическая ошибка, которая превращает секундную операцию в многочасовую. Получайте все нужные данные одним запросом с соединениями и обходите результат. Если нужно изменить тысячи объектов, используйте транзакции с разумным размером пачки, чтобы не держать длинные блокировки.
Изменение данных: транзакции и безопасность
Обработки, которые изменяют данные, — самый рискованный класс инструментов. Ошибка в условии отбора может изменить или удалить тысячи записей, и откатить это без резервной копии невозможно. Правило номер один: перед первым запуском на рабочей базе сделайте выгрузку через конфигуратор или средствами СУБД.
Множественные изменения заворачивайте в транзакцию: если на середине цикла произойдёт ошибка, база не останется в половинчатом состоянии. Для очень больших объёмов используйте пакетную обработку — коммит каждые несколько сотен объектов с записью прогресса в журнал.
НачатьТранзакцию();
Попытка
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
Объект.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
Полезный приём — режим «только показать». Добавьте на форму флажок «Тестовый режим»: при установленном флажке обработка выводит список объектов, которые будут изменены, но не записывает их. Пользователь сначала видит объём изменений и только потом запускает реальную обработку.
Регистрация обработки в базе
Простейший способ запуска — «Файл → Открыть» в режиме «Предприятие». Это удобно для разработчика, но не для пользователей. Для постоянного использования обработку регистрируют в справочнике «Дополнительные отчеты и обработки» (в типовых конфигурациях на БСП — раздел «Администрирование → Печатные формы, отчеты и обработки»).
Чтобы обработка корректно зарегистрировалась, в модуле объекта должна быть функция СведенияОВнешнейОбработке(), возвращающая структуру с видом обработки, версией, безопасным режимом и таблицей команд. Вид определяет поведение: «ЗаполнениеОбъекта» добавляет кнопку в формы документов, «ДополнительнаяОбработка» — просто пункт в общем списке, «СозданиеСвязанныхОбъектов» — ввод на основании.
Обратите внимание на безопасный режим. По умолчанию дополнительные обработки выполняются в безопасном режиме: запрещены операции с файловой системой, COM-объекты, внешние компоненты. Если обработке нужно, например, прочитать файл с диска, безопасный режим придётся отключить — но делайте это осознанно и только для проверенного кода.
Отладка и проверка результата
Отладка внешней обработки выполняется стандартно: откройте файл обработки в конфигураторе, запустите отладку режима «Предприятие», откройте обработку в сеансе — точки останова в файле сработают. Убедитесь, что в настройках отладки разрешена остановка по ошибке и выбран нужный тип клиента.
Для диагностики в рабочей базе, где конфигуратор недоступен, используйте Сообщить() для вывода промежуточных значений и запись в журнал регистрации через ЗаписьЖурналаРегистрации(). Второй способ предпочтительнее для длительных операций: сообщения могут потеряться при разрыве сеанса, а журнал сохраняется.
Как проверить результат обработки
Совпадает с числом строк в тестовом запросе до записи
Обработано больше или меньше объектов, чем отобрано — ошибка в условиях
Случайная выборка из 5–10 объектов показывает ожидаемые значения
Часть объектов не изменилась или содержит неверные данные
Нет ошибок записи и конфликтов блокировок за время работы
Ошибки блокировок, обрывы транзакций — часть данных могла не записаться
Документы после изменения перепроводятся без ошибок
Случились ошибки проведения — обработка нарушила логику данных
Частые ошибки и ограничения
Кроме запросов в цикле и работы без транзакций, распространены ещё несколько проблем. Первая — использование метода Записать() без учёта прав: обработка выполняется под пользователем, и если у него нет прав на объект, запись молча не выполнится или выдаст ошибку. Для сервисных операций иногда используют УстановитьПривилегированныйРежим(Истина), но это обход системы безопасности — применяйте точечно.
Вторая — игнорирование обмена данными. Изменение объектов через обработку регистрируется в планах обмена, и в распределённых базах это может породить огромные пакеты синхронизации. Если изменения служебные и не должны мигрировать, используйте Объект.ОбменДанными.Загрузка = Истина — но помните, что этот режим также отключает проверки при записи.
Третья — хранение обработки «на рабочем столе». Файлы обработок разъезжаются по почте и папкам, версии путаются, никто не знает, какая актуальна. Храните обработки в системе контроля версий или хотя бы в едином сетевом каталоге с нумерацией версий в имени файла и описанием изменений.
Полезно добавить в обработку вывод версии и даты сборки прямо на форму или в заголовок. Когда пользователь сообщает об ошибке, вы сразу поймёте, какой именно файл он запускал — это экономит часы на воспроизведение проблемы.
FAQ
Чем внешняя обработка отличается от внешнего отчёта?
Технически это разные типы файлов: обработка (.epf) предназначена для действий над данными, отчёт (.erf) — для их представления. На практике граница размыта: обработка может строить отчёт через СКД, а отчёт — содержать кнопки с логикой. Выбирайте по основному назначению: если результат — табличный документ для просмотра, делайте отчёт; если изменение данных или сервисная операция — обработку.
Можно ли запускать обработку по расписанию?
Да, если конфигурация построена на Библиотеке стандартных подсистем: при регистрации дополнительной обработки доступна настройка расписания, и команда будет выполняться фоновым заданием на сервере. Учтите, что в фоновом выполнении недоступен интерактив — никаких вопросов пользователю и открытия форм; все параметры должны задаваться заранее в настройках команды.
Почему обработка работает в файловой базе, но падает в клиент-серверной?
Чаще всего причины три: код работы с данными размещён в клиентской процедуре, используются локальные пути к файлам (на сервере диск C: — это диск сервера, а не пользователя) или обработка обращается к COM-объектам, которых нет на сервере. Проверяйте директивы компиляции и передавайте файлы на сервер через временное хранилище.
Как передать обработке файл Excel для загрузки?
На клиенте поместите файл во временное хранилище через НачатьПомещениеФайла(), передайте адрес хранилища в серверную процедуру, там извлеките данные через ПолучитьИзВременногоХранилища() и читайте табличный документ методом Прочитать() табличного документа — так обработка не потребует установленного Excel на сервере. Чтение через COM-объект Excel.Application — альтернатива, но она требует самого Excel и не работает на Linux-сервере.
Опасно ли давать пользователям право открывать внешние обработки?
Да. Право «Интерактивное открытие внешних отчетов и обработок» позволяет запустить любой файл, включая вредоносный код с полными правами пользователя. Выдавайте его только разработчикам и администраторам. Обычным пользователям давайте доступ к конкретным обработкам через справочник «Дополнительные отчеты и обработки» — там действует безопасный режим и контроль назначений.
Как обновить обработку, уже зарегистрированную в базе?
Откройте элемент справочника «Дополнительные отчеты и обработки», используйте команду замены файла (в типовых — «Заменить на внешнюю обработку» или загрузка из файла) и выберите новую версию .epf. Настройки назначения и расписания сохранятся. Увеличивайте номер версии в СведенияОВнешнейОбработке, чтобы было видно, какая редакция загружена.
Что важно запомнить
Внешняя обработка — безопасный способ решить задачу без доработки конфигурации. Пишите работу с данными на сервере, изменения заворачивайте в транзакции, тестируйте на копии базы с ограниченной выборкой, регистрируйте через «Дополнительные отчеты и обработки» и контролируйте версии файлов.