Как определить режим записи документа (запись или проведение) на клиенте в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в среде 1С:Предприятие 8.2 и 8.3 на управляемых формах программисты часто сталкиваются с необходимостью выполнить определенные действия на клиенте непосредственно перед тем, как документ будет записан или проведен. Одной из типовых задач является вывод интерактивного окна (диалога или предупреждения) в зависимости от того, нажал ли пользователь кнопку «Записать» или «Провести».

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

Использование обработчика события ПередЗаписью

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

Рассмотрим синтаксис этого метода:

Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

Ключевым моментом здесь является параметр ПараметрыЗаписи. Это структура, которую платформа автоматически заполняет данными о предстоящей операции. Именно в ней содержится свойство РежимЗаписи, которое нам необходимо.

Разбор программной реализации на клиенте

Разберем по шагам, как написать код для определения режима записи. Нам нужно проверить наличие свойства в структуре и сравнить его со значениями системного перечисления РежимЗаписиДокумента.

Рассмотрим пример кода, который можно разместить в модуле управляемой формы:


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	// По умолчанию режим записи может отсутствовать, если вызов идет программно
	// Поэтому сначала проверим наличие свойства
	Если ПараметрыЗаписи.Свойство("РежимЗаписи") Тогда
		
		ТекущийРежим = ПараметрыЗаписи.РежимЗаписи;
		
		Если ТекущийРежим = РежимЗаписиДокумента.Запись Тогда
			Предупреждение("Выполняется обычное сохранение документа без проведения.");
		ИначеЕсли ТекущийРежим = РежимЗаписиДокумента.Проведение Тогда
			Предупреждение("Внимание! Документ будет проведен и создаст движения в регистрах.");
		ИначеЕсли ТекущийРежим = РежимЗаписиДокумента.ОтменаПроведения Тогда
			Предупреждение("Выполняется отмена проведения документа.");
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

В данном примере мы используем метод Свойство(), чтобы избежать ошибок в случаях, когда запись инициирована из кода без передачи параметров. Это делает наше решение более отказоустойчивым.

Нюансы работы с интерактивными диалогами

Если ваша задача не просто вывести информационное сообщение, а спросить пользователя, стоит ли продолжать (например, через метод Вопрос), ситуация усложняется. В современных версиях платформы 1С (особенно в режиме «без модальных окон») выполнение кода не останавливается на строке вызова вопроса.

Проанализируем правильный алгоритм действий в такой ситуации:

  1. В обработчике ПередЗаписью мы устанавливаем Отказ = Истина, чтобы остановить текущую попытку записи.
  2. Запоминаем ПараметрыЗаписи во временную переменную (или переменную модуля формы).
  3. Вызываем асинхронный диалог.
  4. В функции обратного вызова (обработчике оповещения), если пользователь ответил «Да», мы вызываем метод ЭтаФорма.Записать(СохраненныеПараметры).

Такой подход позволяет сохранить логику работы стандартных кнопок, не нарушая событийную модель платформы.

Связь клиента и сервера через ДополнительныеСвойства

Иногда решение о том, нужно ли выводить предупреждение, может принять только сервер (например, проверив остатки на складе). Но вывести само окно сервер не может. В этом случае мы используем механизм двойного прохода.

Выясним причину популярности этого метода:

В серверном событии ПередЗаписьюНаСервере мы выполняем проверку. Если нужно что-то сообщить пользователю, мы помещаем информацию в ТекущийОбъект.ДополнительныеСвойства. Однако, после выполнения серверного кода запись либо завершится успешно, либо прервется с ошибкой. Чтобы вывести мягкое предупреждение, разработчики часто сначала вызывают свою серверную функцию-проверку до начала основной записи.

Рассмотрим пример логики:


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    
    // Если мы еще не выполняли проверку на сервере
    Если Не ПроверкаПройдена Тогда
        Отказ = Истина; // Прерываем штатную запись
        
        // Вызываем серверную функцию для анализа
        РезультатПроверки = ПроверитьДанныеНаСервере(ПараметрыЗаписи.РежимЗаписи);
        
        Если РезультатПроверки.ТребуетсяПодтверждение Тогда
            // Показываем вопрос пользователю
            // В случае успеха устанавливаем ПроверкаПройдена = Истина и вызываем Записать()
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Заключение

Подведем итоги. Для простого определения режима записи на клиенте достаточно обратиться к структуре ПараметрыЗаписи в событии ПередЗаписью. Это позволяет реализовать гибкую логику интерфейса, реагирующую на действия пользователя (проведение или простая запись).

Важно помнить:

Используя эти методы, мы обеспечиваем корректную работу приложения и создаем удобный, интуитивно понятный интерфейс для конечного пользователя.

← На главную