Как в функции Вопрос поменять стандартные названия кнопок Да и Нет

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

При разработке интерфейсов в 1С часто возникает необходимость сделать диалоговое окно более информативным. Стандартные кнопки «Да», «Нет» или «ОК» не всегда отражают суть предлагаемого действия. Например, вместо «Да» логичнее написать «Записать», а вместо «Нет» — «Продолжить без записи». Рассмотрим, как реализовать кастомизацию кнопок для различных версий платформы и типов форм.

Реализация в управляемых формах (асинхронный метод)

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

Основная хитрость заключается в использовании объекта СписокЗначений. Вместо того чтобы передавать стандартный режим диалога (например, РежимДиалогаВопрос.ДаНет), мы подготавливаем список, где значением будет стандартный код возврата, а представлением — наш текст.

Проанализируем пример кода для управляемого приложения:


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

    // 2. Настраиваем описание оповещения (куда вернется результат)
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект);

    // 3. Вызываем диалог
    ТекстВопроса = "Вы готовы приступить к выполнению операции?";
    ПоказатьВопрос(Оповещение, ТекстВопроса, СписокКнопок, 0, КодВозвратаДиалога.Да);

КонецПроцедуры

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

КонецПроцедуры

В данном примере мы связали системную константу КодВозвратаДиалога.Да с визуальным текстом "Хочу!". Это позволяет сохранить логику обработки ответа, изменив только внешнее представление.

Использование в обычных формах и синхронных вызовах

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


СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, "Перенести изменения");
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, "Пропустить");

Ответ = Вопрос("Обнаружены изменения в данных. Как поступим?", СписокКнопок, 60);

Если Ответ = КодВозвратаДиалога.Да Тогда
    // Логика переноса
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
    // Логика пропуска
КонецЕсли;

Важный момент: если в СписокЗначений вы передаете не КодВозвратаДиалога, а просто произвольные числа или строки, то переменная Ответ примет именно это значение. Рассмотрим такой вариант:


СЗ = Новый СписокЗначений;
СЗ.Добавить("Вариант1", "Отправить почтой");
СЗ.Добавить("Вариант2", "Курьером");
СЗ.Добавить("Вариант3", "Самовывоз");

Ответ = Вопрос("Выберите способ доставки:", СЗ);

Если Ответ = "Вариант1" Тогда
    // ...
КонецЕсли;

Это позволяет создавать меню с неограниченным количеством вариантов выбора прямо в окне вопроса.

Ограничения и нюансы платформы

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

  1. Картинки в кнопках: Несмотря на то что метод СписокЗначений.Добавить() позволяет указать картинку, платформа 1С (в частности, в функции ПоказатьВопрос) часто не поддерживает их отображение на кнопках диалога. Попытка добавить картинку может привести к ошибке "Несоответствие типов" или просто к игнорированию изображения.
  2. Кнопка по умолчанию: Всегда указывайте, какая кнопка должна быть активна при нажатии клавиши Enter. В ПоказатьВопрос это 5-й параметр.
  3. Кнопка отмены: Если вы используете список значений, платформа может не сразу понять, какую кнопку считать эквивалентом Esc. Рекомендуется явно обрабатывать значение Неопределено, которое может вернуться при закрытии окна крестиком.
  4. Платформа 7.7: В старой версии «Семерка» штатной возможности менять текст кнопок в Вопрос() не существует. Программисты обычно решают эту задачу созданием отдельной маленькой формы (обработки), которая вызывается модально и имитирует диалог.

Создание универсальной функции-обертки

Для удобства разработки в крупных проектах часто создают общую функцию в глобальном модуле. Рассмотрим пример такой "обертки", которая упрощает вызов диалогов с произвольными кнопками:


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

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

Подводя итог, можно сказать, что механизм СписокЗначений является мощным и гибким инструментом для кастомизации интерфейса в 1С 8.x, позволяя уйти от жестких рамок стандартных ответов и сделать программу более дружелюбной к пользователю.

← На главную