Что происходит внутри обработки 1С: от открытия формы до записи данных в базу

· 10 мин

Содержание

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

Обработки бывают встроенными (часть конфигурации) и внешними (отдельный файл .epf). Механизм выполнения у них одинаковый, а различаются они способом подключения, обновления и уровнем доверия. Именно от этого зависят права, безопасность и то, как искать ошибку.

Как устроена обработка: модули, форма и контекст выполнения

У обработки три составные части. Каждая отвечает за своё.

  • 🧩 Реквизиты и табличные части — это переменные обработки. Они живут в памяти, пока открыта форма, и в базу не записываются.
  • 📄 Модуль объекта — серверная логика: запросы, запись объектов, расчёты. Здесь же размещают служебные экспортные функции, например функцию регистрации для внешней обработки.
  • 🖥 Форма и модуль формы — то, что видит пользователь. Код формы делится по директивам компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста.

Что происходит после нажатия кнопки

Возьмём типичную обработку «Перезаполнить реквизит у документов за период». Порядок выполнения такой:

  1. Пользователь нажимает кнопку. Срабатывает клиентская процедура-обработчик команды.
  2. Клиентская процедура вызывает серверную (&НаСервере). Данные формы передаются на сервер.
  3. На сервере код получает объект обработки через РеквизитФормыВЗначение("Объект") и вызывает его экспортный метод.
  4. Метод модуля объекта выполняет запрос, получает ссылки на документы и меняет их.
  5. Результат возвращается в форму, клиент показывает сообщение.

Каждый переход клиент → сервер — это серверный вызов. В файловой базе он почти незаметен, в клиент-серверной и тем более через веб-клиент каждый вызов стоит десятки миллисекунд. Отсюда главное правило производительности, о котором ниже.

Клиент и сервер: что где можно

Где выполняется кодЧто доступноЧего нет
&НаКлиентеэлементы формы, диалоги, работа с локальными файламизапросы, запись объектов, ссылки на объекты базы «изнутри»
&НаСерверевсё серверное + данные формыинтерактивные диалоги
&НаСервереБезКонтекстасерверные методыданные формы (передаются только параметрами)
модуль объектазапросы, запись, транзакцииформа и её элементы

Если серверной процедуре не нужны реквизиты формы, делайте её &НаСервереБезКонтекста. На сервер не будет гоняться вся форма, вызов станет легче.

Встроенные и внешние обработки: в чём разница

Работает код одинаково, но жизненный цикл разный. От этого зависит, где обработку хранить и кто её может запускать.

ПризнакВстроеннаяВнешняя (.epf)Дополнительная (.epf, зарегистрированная)
Где хранитсяв конфигурацииотдельный файл на дискев справочнике базы
Как попасть в базучерез Конфигуратор или расширениеФайл → Открытьзагрузка в список дополнительных обработок
Обновлениевместе с конфигурациейзаменой файлазагрузкой новой версии в карточку
Права на запускроль с правом на объектправо на интерактивное открытие внешних обработокнастройка доступа в карточке
Безопасный режимнетнетпо умолчанию да

Встроенная обработка

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

Внешняя обработка

Файл .epf открывается командой Файл → Открыть в главном меню программы. Код выполняется с правами текущего пользователя и без ограничений безопасного режима. Удобно для разовых задач и разработки, но опасно: файл может сделать в базе всё, что разрешено пользователю.

Дополнительная обработка (через БСП)

В типовых конфигурациях на БСП — Бухгалтерия 3.0, ЗУП 3.1, УТ 11 — есть справочник дополнительных отчётов и обработок. Путь одинаковый:

Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки

Если пункта нет, включите флажок «Дополнительные отчеты и обработки» в том же разделе Печатные формы, отчеты и обработки.

Чтобы файл можно было загрузить в этот список, в его модуле объекта должна быть экспортная функция регистрации. Без неё программа откажется регистрировать файл. Минимальный пример:

Функция СведенияОВнешнейОбработке() Экспорт

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.1.1");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.БезопасныйРежим = Истина;

	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = "Перезаполнить комментарий";
	Команда.Идентификатор = "ОткрытьФорму";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	Команда.ПоказыватьОповещение = Ложь;

	Возврат ПараметрыРегистрации;

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

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

Безопасность и права доступа к обработкам

Внешняя обработка — самый простой способ испортить базу чужим кодом. Поэтому защита стоит на трёх уровнях.

1. Право на открытие внешних обработок

В ролях есть право «Интерактивное открытие внешних обработок» (и аналогичное для отчётов). Если его нет, команда Файл → Открыть для .epf выдаст ошибку о нарушении прав доступа. В типовых конфигурациях это право обычно есть только у администратора.

В БП 3.0 и ЗУП 3.1 право выдают через профиль групп доступа: Администрирование → Настройки пользователей и прав → Группы доступа. Среди ролей профиля найдите роль, связанную с открытием внешних отчётов и обработок, по слову «внешних» в поиске списка ролей.

Не выдавайте право на открытие внешних обработок всем пользователям «на всякий случай». Пользователь с этим правом может запустить любой файл из почты или мессенджера.

2. Предупреждение о защите от опасных действий

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

3. Безопасный режим

Дополнительная обработка, зарегистрированная с БезопасныйРежим = Истина, выполняется с ограничениями. Ей запрещено:

  • 🚫 обращаться к файловой системе сервера;
  • 🚫 запускать внешние программы и COM-объекты;
  • 🚫 устанавливать привилегированный режим;
  • 🚫 подключать внешние компоненты.

Если такая обработка всё-таки пытается это сделать, выполнение прерывается с сообщением о запрете действия в безопасном режиме. Решение — не снимать флажок вслепую, а запросить разрешения через профили безопасности. Для клиент-серверной базы профили безопасности настраиваются в кластере серверов, а в программе включается их использование в разделе Администрирование → Настройки программы.

Перед загрузкой чужой обработки откройте её в Конфигураторе и прочитайте модуль объекта. Ищите УстановитьПривилегированныйРежим, ЗапуститьПриложение, Новый COMОбъект, удаление объектов и прямую запись в регистры. Пять минут чтения дешевле восстановления базы.

Массовые операции: как сделать обработку быстрой

Обработка, которая перебирает 50 000 документов, может работать 3 минуты, а может — 3 часа. Разница почти всегда в четырёх местах.

Ошибка 1: серверный вызов в цикле на клиенте

Если клиентская процедура в цикле по табличной части вызывает сервер для каждой строки, 10 000 строк дадут 10 000 вызовов. Правильно — один вызов, внутри которого сервер обрабатывает всё.

Ошибка 2: чтение через точку вместо запроса

Обращение Документ.Контрагент.ИНН в цикле подгружает объект контрагента целиком при каждом проходе. Получайте все нужные поля одним запросом заранее.

Ошибка 3: одна огромная транзакция

Запись 50 000 объектов в одной транзакции держит блокировки до самого конца и съедает память. Одна ошибка на 49 999-м объекте откатывает всё. Лучше порции по 200–1000 объектов.

Ошибка 4: лишняя работа при записи

Обычная запись документа запускает подписки, проверки и перепроведение. Если меняется только комментарий, проведение не нужно — пишите в режиме записи без перепроведения.

Пример порционной обработки в модуле объекта:

Процедура ЗаменитьКомментарий(НачалоПериода, КонецПериода, НовыйТекст) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Док.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.РеализацияТоваровУслуг КАК Док
	|ГДЕ
	|	Док.Дата МЕЖДУ &Начало И &Конец
	|	И НЕ Док.ПометкаУдаления";
	Запрос.УстановитьПараметр("Начало", НачалоПериода);
	Запрос.УстановитьПараметр("Конец", КонецПериода);

	Выборка = Запрос.Выполнить().Выбрать();
	РазмерПорции = 500;
	ВПорции = 0;
	Всего = 0;

	НачатьТранзакцию();
	Пока Выборка.Следующий() Цикл
		ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
		ДокОбъект.Комментарий = НовыйТекст;
		ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
		ВПорции = ВПорции + 1;
		Всего = Всего + 1;
		Если ВПорции = РазмерПорции Тогда
			ЗафиксироватьТранзакцию();
			НачатьТранзакцию();
			ВПорции = 0;
		КонецЕсли;
	КонецЦикла;
	ЗафиксироватьТранзакцию();

	Сообщить(СтрШаблон("Изменено документов: %1", Формат(Всего, "ЧГ=0")));

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

В рабочем коде запись внутри транзакции оборачивают в Попытка … Исключение, а в ветке исключения вызывают ОтменитьТранзакцию() и пишут ошибку в журнал регистрации. Иначе исключение оставит транзакцию незакрытой.

Для долгих операций в конфигурациях на БСП используют фоновые задания через общий модуль ДлительныеОперации. Форма не зависает, а пользователь видит индикатор и может продолжать работу в других окнах.

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

Как найти ошибку в обработке

Обработка упала или «ничего не сделала» — разбирайтесь по сообщению и по журналу.

Отладка внешней обработки

  1. Откройте Конфигуратор той же базы, затем Файл → Открыть и выберите .epf.
  2. Поставьте точку останова в нужной процедуре (F9).
  3. Запустите 1С:Предприятие в режиме отладки из Конфигуратора (F5).
  4. В клиенте откройте тот же файл через Файл → Открыть и выполните команду.
  5. Выполнение остановится на точке, можно смотреть значения переменных.

Дополнительную обработку из справочника удобно отлаживать так: выгрузите файл из её карточки на диск, откройте его в Конфигураторе, поставьте точки останова и запустите тот же файл в клиенте через Файл → Открыть под администратором. Код один и тот же, а отлаживать внешний файл проще. В клиент-серверной базе для отладки серверного кода сервер 1С должен быть запущен с разрешённой отладкой — это настраивает администратор сервера.

Типичные симптомы и причины

Диагностика: выберите симптом

После ошибки откройте журнал регистрации: Администрирование → Обслуживание → Журнал регистрации. Отбор по пользователю и времени покажет текст исключения и объект, на котором обработка остановилась.

Где обработки применяют на практике

Обработка закрывает задачи, для которых в типовой конфигурации нет кнопки или кнопка неудобна.

  • 🔄 Групповое изменение данных. Сменить ставку НДС в 3 000 номенклатурных позициях, проставить подразделение в документах за квартал. Частично это делает типовая обработка группового изменения реквизитов, своя нужна при нестандартных условиях отбора.
  • 📥 Загрузка из Excel и других систем. Прайс поставщика в номенклатуру и цены, остатки при старте учёта, выписки нестандартного формата.
  • 🧾 Печатные формы. Своя накладная или договор, привязанные к документу, без изменения конфигурации.
  • ⚙️ Заполнение документов. Кнопка «Заполнить» в документе, которая подбирает строки по своему алгоритму.
  • 🗓 Регламентные задания. Дополнительная обработка может выполняться по расписанию: ночная выгрузка цен на сайт, рассылка остатков.
  • 🧹 Разовая чистка. Удалить дубли контрагентов, исправить ошибочно загруженные данные после обмена.

Мини-кейс

Бухгалтер получает от поставщика акты в Excel на 400 строк в месяц и вводит их руками полдня. Дополнительная обработка вида «Заполнение объекта» добавляет в документ поступления кнопку: выбрать файл, сопоставить номенклатуру по артикулу, заполнить строки. Ввод сокращается до нескольких минут, а файл обновляется без вмешательства в конфигурацию.

Прежде чем запустить обработку в рабочей базе

Любая обработка, которая пишет данные, может испортить их быстрее, чем пользователь. Короткая проверка перед запуском:

Перед запуском обработки, которая меняет данные
Выполнено: 0 / 6

Массовое перепроведение документов задним числом меняет остатки и закрытые периоды. Если обработка перепроводит документы, проверьте дату запрета изменения данных и согласуйте запуск с главным бухгалтером.

Частые вопросы

Чем обработка отличается от отчёта в 1С?
Отчёт предназначен для вывода данных и обычно строится на системе компоновки данных. Обработка выполняет произвольные действия, в том числе меняет данные. Технически отчёт тоже может писать в базу, но так делать не принято.
Можно ли открыть внешнюю обработку в веб-клиенте?
Да, через Файл → Открыть файл загружается на сервер. Права нужны те же. Удобнее зарегистрировать её как дополнительную — тогда загружать файл каждый раз не придётся.
Работает ли обработка, написанная для одной конфигурации, в другой?
Только если в другой конфигурации есть те же объекты и реквизиты с теми же именами. Обработка для БП 3.0, обращающаяся к документу из УТ 11, упадёт с ошибкой при выполнении запроса.
Почему после обновления конфигурации обработка перестала работать?
В новом релизе могли переименовать реквизит, поменять тип или структуру табличной части. Откройте обработку в Конфигураторе, выполните синтаксический контроль и проверьте запросы.
Где хранится дополнительная обработка после загрузки?
В самой информационной базе, в справочнике дополнительных отчётов и обработок. Исходный файл после загрузки не нужен, его можно выгрузить обратно из карточки.