В процессе разработки или доработки интерфейсов на платформе 1С:Предприятие 8.3, особенно в таких сложных формах, как АРМ (Автоматизированное рабочее место) кассира в конфигурации Розница 2.2, программисты часто сталкиваются с неочевидным поведением стандартных кнопок. Одной из самых обсуждаемых является кнопка ОК. Начинающие разработчики часто не могут найти явную процедуру, привязанную к этой кнопке, или сталкиваются с тем, что их проверки «пролетают» мимо, а сообщения об ошибках мгновенно исчезают вместе с закрытием формы. Разберем детально, как устроена эта механика и как правильно встроить свою логику в процесс записи.
Прежде всего, проанализируем, почему кнопка ОК не всегда имеет явный обработчик в модуле формы. В управляемых формах 1С реализован механизм стандартных команд. Если мы откроем свойства кнопки в конфигураторе, то в поле ИмяКоманды увидим значение ЗаписатьИЗакрыть (или просто ОК в зависимости от контекста). Это означает, что платформа берет на себя выполнение всей цепочки действий: от проверки заполнения реквизитов до физической записи в базу данных и последующего закрытия формы.
Важно понимать, что нажатие ОК — это не просто закрытие. Это последовательный вызов целого каскада событий. Если ваша форма создана на базе обработки (как АРМ кассира), поведение может быть переопределено разработчиками конфигурации, но базовый алгоритм остается неизменным. Рассмотрим, в каком порядке платформа выполняет действия при нажатии кнопки, эквивалентной команде Записать и закрыть.
Для того чтобы наша проверка сработала корректно и, в случае необходимости, прервала процесс, мы должны встроить код в нужное звено цепи. Проанализируем типичный порядок вызовов:
Отказ = Истина.Если вы вставили проверку в ПередЗаписью, но форма все равно закрылась, это означает, что вы либо не передали Отказ = Истина обратно в платформу, либо логика проверки не была достигнута из-за особенностей исполнения кода.
Часто программисты используют метод Сообщить() для отладки или информирования пользователя. Однако в случае с кнопкой ОК возникает «подлость», как выразился автор темы: форма закрывается так быстро, что окно сообщений очищается или просто исчезает вместе с контекстом формы. Чтобы убедиться, что код вообще выполняется, воспользуемся проверенным методом — вызовом блокирующего окна.
Рассмотрим пример кода для проверки в клиентском обработчике:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
// Простейшая проверка для отладки
// Если мы используем Предупреждение, выполнение кода приостановится
// и мы точно увидим, что событие сработало
ПоказатьПредупреждение(, "Проверка запущена!");
Если Объект.СуммаДокумента <= 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сумма чека не может быть нулевой!";
Сообщение.Поле = "Объект.СуммаДокумента";
Сообщение.Сообщить();
Отказ = Истина; // Это критически важно для остановки закрытия формы
КонецЕсли;
КонецПроцедуры
Обратите внимание на объект СообщениеПользователю. В отличие от обычного Сообщить(), этот объект умеет привязываться к конкретному полю формы. Если вы установите Отказ = Истина, форма не закроется, и сообщение будет наглядно отображено рядом с ошибочным полем.
АРМ Кассира в Рознице 2.2 — это не стандартная форма документа, а сложная обработка. Часто логика кнопок там зашита не в стандартные команды, а в обработчики клавиатуры или внешние события (например, при считывании штрихкода или нажатии горячих клавиш типа Enter или F12). Если вы не видите логики в модуле формы, выполним следующие шаги:
КнопкаПоУмолчанию. Если кнопка ОК назначена кнопкой по умолчанию, она будет срабатывать при нажатии Enter.ПередЗаписью для объекта, который создается в АРМ. Возможно, логика вынесена туда для универсальности.В современных версиях платформы 8.3 при работе в веб-клиенте или при установленном режиме использования модальности «Не использовать», прямое использование Предупреждение() запрещено. Выясним, как правильно организовать остановку записи в таких условиях. Нам потребуется использовать описание оповещения.
Рассмотрим структуру правильного прерывания записи с вопросом к пользователю:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если Не ПроверкаПройдена Тогда
Отказ = Истина; // Сначала отменяем стандартную запись
// Описываем, что делать после того, как пользователь прочитает сообщение
Оповещение = Новый ОписаниеОповещения("ПослеПроверкиЗавершение", ЭтотОбъект);
ПоказатьПредупреждение(Оповещение, "Обнаружены ошибки в данных!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеПроверкиЗавершение(ДополнительныеПараметры) Экспорт
// Здесь можно реализовать логику возврата к редактированию
КонецПроцедуры
Для того чтобы ваша проверка работала «железно» при нажатии кнопки ОК, следуйте этим правилам:
Отказ = Истина в событиях ПередЗаписью, если проверка не прошла.Сообщить() применяйте СообщениеПользователю, чтобы сообщение не «улетало» вместе с закрывающейся формой.Проанализировав эти аспекты, мы видим, что «подлость» платформы — это лишь строгое следование жизненному циклу формы, и понимание этого цикла делает разработку предсказуемой и качественной.