Как перехватить нажатие кнопки ОК и корректно выполнить проверку при записи в 1С:Розница

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

В процессе разработки или доработки интерфейсов на платформе 1С:Предприятие 8.3, особенно в таких сложных формах, как АРМ (Автоматизированное рабочее место) кассира в конфигурации Розница 2.2, программисты часто сталкиваются с неочевидным поведением стандартных кнопок. Одной из самых обсуждаемых является кнопка ОК. Начинающие разработчики часто не могут найти явную процедуру, привязанную к этой кнопке, или сталкиваются с тем, что их проверки «пролетают» мимо, а сообщения об ошибках мгновенно исчезают вместе с закрытием формы. Разберем детально, как устроена эта механика и как правильно встроить свою логику в процесс записи.

Разбираемся в механике стандартных команд

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

Важно понимать, что нажатие ОК — это не просто закрытие. Это последовательный вызов целого каскада событий. Если ваша форма создана на базе обработки (как АРМ кассира), поведение может быть переопределено разработчиками конфигурации, но базовый алгоритм остается неизменным. Рассмотрим, в каком порядке платформа выполняет действия при нажатии кнопки, эквивалентной команде Записать и закрыть.

Последовательность событий при записи и закрытии

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

  1. ПередЗаписью (на клиенте) — это «первая линия обороны». Здесь мы можем проверить корректность введенных пользователем данных. Если данные неверны, мы устанавливаем параметр Отказ = Истина.
  2. ПередЗаписьюНаСервере — событие происходит уже на стороне сервера внутри транзакции записи. Здесь выполняются проверки, требующие обращения к базе данных.
  3. ПриЗаписиНаСервере — фактическая фиксация данных.
  4. ПослеЗаписиНаСервере — данные записаны, транзакция завершена.
  5. ПослеЗаписи (на клиенте) — оповещение пользователя об успехе.
  6. ПередЗакрытием и ПриЗакрытии — финальные аккорды жизни формы.

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

Проблема исчезающих сообщений и способы ее решения

Часто программисты используют метод Сообщить() для отладки или информирования пользователя. Однако в случае с кнопкой ОК возникает «подлость», как выразился автор темы: форма закрывается так быстро, что окно сообщений очищается или просто исчезает вместе с контекстом формы. Чтобы убедиться, что код вообще выполняется, воспользуемся проверенным методом — вызовом блокирующего окна.

Рассмотрим пример кода для проверки в клиентском обработчике:


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

Обратите внимание на объект СообщениеПользователю. В отличие от обычного Сообщить(), этот объект умеет привязываться к конкретному полю формы. Если вы установите Отказ = Истина, форма не закроется, и сообщение будет наглядно отображено рядом с ошибочным полем.

Как найти «скрытый» код в АРМ Кассира

АРМ Кассира в Рознице 2.2 — это не стандартная форма документа, а сложная обработка. Часто логика кнопок там зашита не в стандартные команды, а в обработчики клавиатуры или внешние события (например, при считывании штрихкода или нажатии горячих клавиш типа Enter или F12). Если вы не видите логики в модуле формы, выполним следующие шаги:

  1. Замер производительности: Это самый эффективный способ. Включите замер в конфигураторе (Отладка — Замер производительности), нажмите кнопку ОК в режиме предприятия, а затем остановите замер. Вы увидите полный список процедур, которые были пройдены платформой. Это позволит обнаружить скрытые вызовы в общих модулях или модуле менеджера.
  2. Поиск по горячим клавишам: Проверьте свойства формы, в частности свойство КнопкаПоУмолчанию. Если кнопка ОК назначена кнопкой по умолчанию, она будет срабатывать при нажатии Enter.
  3. Подписки на события: Проанализируйте дерево конфигурации на предмет подписок на событие ПередЗаписью для объекта, который создается в АРМ. Возможно, логика вынесена туда для универсальности.

Использование асинхронных вызовов

В современных версиях платформы 8.3 при работе в веб-клиенте или при установленном режиме использования модальности «Не использовать», прямое использование Предупреждение() запрещено. Выясним, как правильно организовать остановку записи в таких условиях. Нам потребуется использовать описание оповещения.

Рассмотрим структуру правильного прерывания записи с вопросом к пользователю:


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

&НаКлиенте
Процедура ПослеПроверкиЗавершение(ДополнительныеПараметры) Экспорт
    // Здесь можно реализовать логику возврата к редактированию
КонецПроцедуры

Подводим итоги

Для того чтобы ваша проверка работала «железно» при нажатии кнопки ОК, следуйте этим правилам:

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

← На главную