Что происходит внутри обработки 1С: от открытия формы до записи данных в базу
Содержание
Обработка в 1С — это объект, который выполняет код над данными базы, но сам ничего в базе не хранит. Она работает так: пользователь открывает форму, заполняет параметры, нажимает кнопку, а код обработки читает документы и справочники, меняет их или формирует результат. После закрытия формы от обработки не остаётся ни одной записи — остаются только изменения, которые она сделала в других объектах.
Обработки бывают встроенными (часть конфигурации) и внешними (отдельный файл .epf). Механизм выполнения у них одинаковый, а различаются они способом подключения, обновления и уровнем доверия. Именно от этого зависят права, безопасность и то, как искать ошибку.
Как устроена обработка: модули, форма и контекст выполнения
У обработки три составные части. Каждая отвечает за своё.
- 🧩 Реквизиты и табличные части — это переменные обработки. Они живут в памяти, пока открыта форма, и в базу не записываются.
- 📄 Модуль объекта — серверная логика: запросы, запись объектов, расчёты. Здесь же размещают служебные экспортные функции, например функцию регистрации для внешней обработки.
- 🖥 Форма и модуль формы — то, что видит пользователь. Код формы делится по директивам компиляции:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекста.
Что происходит после нажатия кнопки
Возьмём типичную обработку «Перезаполнить реквизит у документов за период». Порядок выполнения такой:
- Пользователь нажимает кнопку. Срабатывает клиентская процедура-обработчик команды.
- Клиентская процедура вызывает серверную (
&НаСервере). Данные формы передаются на сервер. - На сервере код получает объект обработки через
РеквизитФормыВЗначение("Объект")и вызывает его экспортный метод. - Метод модуля объекта выполняет запрос, получает ссылки на документы и меняет их.
- Результат возвращается в форму, клиент показывает сообщение.
Каждый переход клиент → сервер — это серверный вызов. В файловой базе он почти незаметен, в клиент-серверной и тем более через веб-клиент каждый вызов стоит десятки миллисекунд. Отсюда главное правило производительности, о котором ниже.
Клиент и сервер: что где можно
| Где выполняется код | Что доступно | Чего нет |
|---|---|---|
&НаКлиенте | элементы формы, диалоги, работа с локальными файлами | запросы, запись объектов, ссылки на объекты базы «изнутри» |
&НаСервере | всё серверное + данные формы | интерактивные диалоги |
&НаСервереБезКонтекста | серверные методы | данные формы (передаются только параметрами) |
| модуль объекта | запросы, запись, транзакции | форма и её элементы |
Если серверной процедуре не нужны реквизиты формы, делайте её &НаСервереБезКонтекста. На сервер не будет гоняться вся форма, вызов станет легче.
Встроенные и внешние обработки: в чём разница
Работает код одинаково, но жизненный цикл разный. От этого зависит, где обработку хранить и кто её может запускать.
| Признак | Встроенная | Внешняя (.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")));
КонецПроцедуры
В рабочем коде запись внутри транзакции оборачивают в Попытка … Исключение, а в ветке исключения вызывают ОтменитьТранзакцию() и пишут ошибку в журнал регистрации. Иначе исключение оставит транзакцию незакрытой.
Для долгих операций в конфигурациях на БСП используют фоновые задания через общий модуль ДлительныеОперации. Форма не зависает, а пользователь видит индикатор и может продолжать работу в других окнах.
ОбменДанными.Загрузка = Истина перед записью отключает большинство проверок и подписок и сильно ускоряет запись. Но вместе с ними отключается и логика, которая должна была сработать: регистрация изменений для обмена, заполнение служебных полей. Используйте этот приём только когда точно знаете, что пропускаете.
Как найти ошибку в обработке
Обработка упала или «ничего не сделала» — разбирайтесь по сообщению и по журналу.
Отладка внешней обработки
- Откройте Конфигуратор той же базы, затем
Файл → Открытьи выберите.epf. - Поставьте точку останова в нужной процедуре (
F9). - Запустите 1С:Предприятие в режиме отладки из Конфигуратора (
F5). - В клиенте откройте тот же файл через
Файл → Открытьи выполните команду. - Выполнение остановится на точке, можно смотреть значения переменных.
Дополнительную обработку из справочника удобно отлаживать так: выгрузите файл из её карточки на диск, откройте его в Конфигураторе, поставьте точки останова и запустите тот же файл в клиенте через Файл → Открыть под администратором. Код один и тот же, а отлаживать внешний файл проще. В клиент-серверной базе для отладки серверного кода сервер 1С должен быть запущен с разрешённой отладкой — это настраивает администратор сервера.
Типичные симптомы и причины
После ошибки откройте журнал регистрации: Администрирование → Обслуживание → Журнал регистрации. Отбор по пользователю и времени покажет текст исключения и объект, на котором обработка остановилась.
Где обработки применяют на практике
Обработка закрывает задачи, для которых в типовой конфигурации нет кнопки или кнопка неудобна.
- 🔄 Групповое изменение данных. Сменить ставку НДС в 3 000 номенклатурных позициях, проставить подразделение в документах за квартал. Частично это делает типовая обработка группового изменения реквизитов, своя нужна при нестандартных условиях отбора.
- 📥 Загрузка из Excel и других систем. Прайс поставщика в номенклатуру и цены, остатки при старте учёта, выписки нестандартного формата.
- 🧾 Печатные формы. Своя накладная или договор, привязанные к документу, без изменения конфигурации.
- ⚙️ Заполнение документов. Кнопка «Заполнить» в документе, которая подбирает строки по своему алгоритму.
- 🗓 Регламентные задания. Дополнительная обработка может выполняться по расписанию: ночная выгрузка цен на сайт, рассылка остатков.
- 🧹 Разовая чистка. Удалить дубли контрагентов, исправить ошибочно загруженные данные после обмена.
Мини-кейс
Бухгалтер получает от поставщика акты в Excel на 400 строк в месяц и вводит их руками полдня. Дополнительная обработка вида «Заполнение объекта» добавляет в документ поступления кнопку: выбрать файл, сопоставить номенклатуру по артикулу, заполнить строки. Ввод сокращается до нескольких минут, а файл обновляется без вмешательства в конфигурацию.
Прежде чем запустить обработку в рабочей базе
Любая обработка, которая пишет данные, может испортить их быстрее, чем пользователь. Короткая проверка перед запуском:
Массовое перепроведение документов задним числом меняет остатки и закрытые периоды. Если обработка перепроводит документы, проверьте дату запрета изменения данных и согласуйте запуск с главным бухгалтером.
Частые вопросы
Чем обработка отличается от отчёта в 1С?
Можно ли открыть внешнюю обработку в веб-клиенте?
Файл → Открыть файл загружается на сервер. Права нужны те же. Удобнее зарегистрировать её как дополнительную — тогда загружать файл каждый раз не придётся.