Разработка и Конфигурация · 13 мин
Что значит «интерактивно» в 1С и как работает интерактивный режим
Что значит «интерактивно» в 1С: интерактивная запись, проведение, добавление и удаление. Отличия от программного режима, ошибки и практические примеры.
Термин «интерактивно» в 1С встречается повсюду: в сообщениях об ошибках, в синтакс-помощнике, в свойствах методов и в вопросах на форумах. Слово обозначает режим, при котором действие выполняет пользователь через интерфейс программы — мышью, клавиатурой, кнопками формы, — а не программный код. Платформа при этом ведёт себя иначе: показывает диалоги, задаёт вопросы, проверяет права и заполняемость полей.
Понимание разницы между интерактивным и программным выполнением критично в двух случаях. Первый — разработка: методы вроде Записать() могут вызываться с параметром, задающим режим, и от этого зависит поведение обработчиков. Второй — диагностика ошибок: сообщение «действие недоступно в интерактивном режиме» или «данные были изменены интерактивно» указывает на конфликт между действиями пользователя и кода.
Ниже разобрано, что именно платформа считает интерактивным действием, где этот режим применяется, чем он отличается от программного и как избежать типовых ошибок при записи, проведении и удалении объектов.
Что платформа считает интерактивным действием
Интерактивным считается любое действие, инициированное пользователем через элементы интерфейса: нажатие кнопки «Записать», «Провести», «Пометить на удаление», выбор пункта меню, ввод данных в поле формы, перетаскивание строки в табличной части. Ключевой признак — наличие живого пользователя, который видит результат и может ответить на вопрос системы.
Программное действие, напротив, выполняется кодом встроенного языка: обработкой, регламентным заданием, обменом данными, фоновым процессом. Здесь диалог с пользователем невозможен или нежелателен — например, регламентное задание на сервере в принципе не имеет окна, в котором можно показать вопрос.
Именно поэтому ряд методов платформы имеет параметры, управляющие режимом. Например, у метода записи документа можно указать режим проведения, а у некоторых операций — признак, разрешающий или запрещающий интерактивные вопросы. Если код пытается показать модальный вопрос в контексте, где интерактивность запрещена (например, на сервере или в фоновом задании), возникает ошибка выполнения.
Где встречается интерактивный режим: основные сценарии
Чаще всего термин всплывает в четырёх ситуациях: записи и проведении документов, добавлении элементов в справочники, удалении объектов и работе обработчиков событий формы. В каждом случае поведение платформы заметно различается в зависимости от того, кто инициировал действие.
Интерактивная запись и проведение документа
Когда пользователь нажимает «Провести» в форме документа, платформа выполняет целую цепочку: проверяет заполнение обязательных реквизитов, при необходимости задаёт вопросы («Перепровести документ?»), вызывает обработчики ПередЗаписью, ПриЗаписи, ОбработкаПроведения и показывает сообщения об ошибках в окне сообщений. Если проведение невозможно, пользователь видит причину и может исправить данные.
При программном вызове ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение) вопросы не задаются. Если в обработчике проведения код формирует отказ, пользователь увидит только итоговое сообщение, а при выполнении на сервере или в фоне ошибка может вообще остаться незамеченной без записи в журнал регистрации.
Интерактивное добавление и копирование
В формах списков есть команды «Добавить», «Скопировать», «Добавить группу». Это интерактивное добавление: платформа открывает новую форму элемента, и пользователь заполняет её вручную. В расширениях и при разработке форм можно программно запретить или переопределить интерактивное добавление — например, чтобы новые элементы создавались только через специальную обработку с контролем дублей.
Интерактивное удаление и пометка удаления
Пометка удаления через интерфейс вызывает проверку ссылочной целостности только при непосредственном удалении помеченных объектов, а сама пометка проходит быстро. Интерактивное непосредственное удаление (Shift+Delete в некоторых конфигурациях) платформа может блокировать в зависимости от прав. Программное удаление через Удалить() выполняется без вопросов — поэтому ошибочный код способен удалить данные, которые пользователю интерфейс удалить бы не позволил.
Чем интерактивный режим отличается от программного
Различия сводятся к четырём группам: диалоги с пользователем, проверки прав, обработчики событий формы и контроль заполнения. Понимание этих различий помогает предсказать, почему один и тот же объект «нормально записывается руками, но не записывается из обработки» — или наоборот.
| Аспект | Интерактивный режим | Программный режим |
|---|---|---|
| Диалоги и вопросы | Показываются, пользователь отвечает | Не показываются; модальный вызов может вызвать ошибку |
| Проверка заполнения | Выполняется платформой для полей формы | Зависит от вызова и свойств объекта; код должен контролировать сам |
| Обработчики формы | Срабатывают (ПриОткрытии, ПередЗаписью формы и т.д.) | Форма не создаётся, её обработчики не выполняются |
| Права доступа | Контролируются интерфейсом и платформой | Контролируются платформой; в привилегированном режиме отключаются |
| Скорость массовых операций | Низкая, каждое действие вручную | Высокая, подходит для пакетной обработки |
Важный нюанс: обработчики модуля объекта (ПередЗаписью, ОбработкаПроведения) срабатывают в обоих режимах, а обработчики модуля формы — только при интерактивной работе. Если бизнес-логика вынесена в форму, программная запись «молча» её пропустит. Это одна из самых частых причин расхождения данных при обменах и загрузках.
Как определить и задать режим в коде
Во встроенном языке есть инструменты и для определения контекста выполнения, и для явного управления режимом. Знание этих приёмов нужно при написании универсальных обработчиков, которые должны корректно работать и из формы, и из фонового задания.
- 1Определите, будет ли код выполняться интерактивно: проверьте контекст (клиент/сервер, фоновое задание) и не используйте модальные вопросы там, где они запрещены.
- 2Вынесите все проверки и заполнение обязательных данных в модуль объекта или в отдельную экспортную процедуру общего модуля.
- 3При программной записи явно указывайте режим: Записать(РежимЗаписиДокумента.Проведение) или РежимЗаписиДокумента.Запись.
- 4Обрабатывайте отказ: проверяйте результат, выводите сообщения через Сообщить() или в журнал регистрации для фоновых операций.
- 5Протестируйте оба пути: запись из формы пользователем и запись из обработки — результаты должны совпадать.
Для вывода сообщений пользователю из серверного кода используется объект сообщения пользователю с привязкой к полям формы — так ошибки программной записи становятся видны так же, как при интерактивной проверке заполнения. Для фоновых заданий, где пользователя нет, единственный надёжный приём — запись в журнал регистрации или в специальный регистр ошибок.
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДатаСеанса();
ДокументОбъект.Заполнить(ДанныеЗаполнения);
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("Проведение", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;Типичные ошибки и сообщения, связанные с интерактивным режимом
На практике с термином «интерактивно» сталкиваются чаще всего через ошибки. Разберём самые распространённые ситуации и способы их устранения.
Модальный вызов в запрещённом контексте. Код вызывает Вопрос() или открывает модальное окно на сервере, в фоновом задании или при отключённых модальных окнах. Платформа сообщает, что интерактивная операция недоступна. Решение — перенести вопрос на клиентскую часть с использованием асинхронных методов (ПоказатьВопрос с описанием оповещения) либо убрать диалог из серверной логики.
«Данные были изменены» при записи. Пользователь редактирует документ, а в это время другой пользователь или обработка изменила тот же объект программно. При попытке записи платформа сообщает о конфликте версий. Это не сбой, а штатная защита: нужно перечитать объект (закрыть без сохранения и открыть заново) и повторить изменения.
Расхождение результата «руками» и «из обработки». Документ, проведённый пользователем, формирует одни движения, а проведённый кодом — другие или не проводится вовсе. Причина почти всегда в логике, завязанной на форму или на интерактивные параметры. Диагностика: сравнить заполнение объекта до записи в обоих сценариях и проверить, не используются ли в модуле объекта обращения к элементам формы.
Как проверить результат и выбрать правильный подход
После внедрения или изменения кода, работающего с записью объектов, полезно пройти контрольные точки: совпадают ли результаты интерактивной и программной записи, видны ли ошибки, сохраняется ли целостность данных.
Как проверить результат
Движения по регистрам и состояние документа идентичны
Разные движения, отсутствие проводок или отказ без сообщения
Ошибок нет либо они зафиксированы с понятным описанием
Операция завершилась молча, данных нет, записей в журнале тоже нет
Все поля заполнены так же, как при ручном вводе
Пустые склады, контрагенты, договоры — логика заполнения осталась в форме
Выбор между интерактивным и программным подходом зависит от задачи. Разовые операции с необходимостью контроля глазами — территория интерактивной работы. Массовые загрузки, обмены, регламентные операции — территория программного режима, но с обязательным логированием и предварительным тестированием на копии базы.
Как выбрать действие
Что важно запомнить
«Интерактивно» в 1С — это выполнение действия пользователем через интерфейс с диалогами, проверками и вопросами платформы. Программный режим выполняет те же операции кодом без диалогов, поэтому требует явной обработки ошибок, переноса логики из форм в модули объектов и тестирования на копии базы. Расхождение результатов двух режимов — признак логики, ошибочно завязанной на форму.
Частые вопросы
Что означает сообщение «интерактивная операция недоступна»?
Код пытается показать диалог или выполнить действие, требующее интерфейса, в контексте, где его нет: на сервере, в фоновом задании, в веб-клиенте с ограничениями. Нужно убрать модальный вызов из этого кода или перенести его в клиентскую процедуру с асинхронным методом.
Почему документ проводится из формы, но не проводится из обработки?
Чаще всего часть заполнения или проверок реализована в модуле формы, который при программной записи не выполняется. Также возможны незаполненные обязательные реквизиты. Сравните объект до записи в обоих сценариях и перенесите логику в модуль объекта.
Чем отличается интерактивная пометка удаления от программного удаления?
Пометка удаления через интерфейс лишь устанавливает признак, а физическое удаление происходит отдельной операцией с проверкой ссылок. Программный метод удаления убирает объект сразу и без вопросов, что может оставить битые ссылки в других документах.
Срабатывают ли обработчики ПередЗаписью при программной записи?
Обработчики модуля объекта — да, выполняются в обоих режимах. Обработчики модуля формы — нет, поскольку форма при программной записи не создаётся. Это ключевое различие при проектировании логики.
Как показать пользователю ошибку из серверного кода записи?
Используйте объект сообщения пользователю с возможной привязкой к реквизиту формы — сообщение появится в панели сообщений так же, как при интерактивной проверке. Для фоновых заданий, где пользователя нет, записывайте ошибку в журнал регистрации.
Можно ли запретить пользователям добавлять элементы справочника вручную?
Да, через настройку прав доступа (убрать право интерактивного добавления) или программно в расширении формы. Тогда новые элементы будут создаваться только через предусмотренный механизм, например обработку с контролем дублей.