При разработке интерфейсов в 1С часто возникает необходимость сделать диалоговое окно более информативным. Стандартные кнопки «Да», «Нет» или «ОК» не всегда отражают суть предлагаемого действия. Например, вместо «Да» логичнее написать «Записать», а вместо «Нет» — «Продолжить без записи». Рассмотрим, как реализовать кастомизацию кнопок для различных версий платформы и типов форм.
В современных конфигурациях на платформе 1С:Предприятие 8.3 использование модальных окон ограничено или полностью запрещено. Поэтому для вывода вопроса мы используем асинхронный метод ПоказатьВопрос(). Разберем по шагам, как подменить стандартные заголовки кнопок.
Основная хитрость заключается в использовании объекта СписокЗначений. Вместо того чтобы передавать стандартный режим диалога (например, РежимДиалогаВопрос.ДаНет), мы подготавливаем список, где значением будет стандартный код возврата, а представлением — наш текст.
Проанализируем пример кода для управляемого приложения:
&НаКлиенте
Процедура ВыполнитьДействие(Команда)
// 1. Формируем список кнопок с произвольными именами
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, "Хочу!");
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, "Не хочу...");
СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, "Подумаю еще");
// 2. Настраиваем описание оповещения (куда вернется результат)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект);
// 3. Вызываем диалог
ТекстВопроса = "Вы готовы приступить к выполнению операции?";
ПоказатьВопрос(Оповещение, ТекстВопроса, СписокКнопок, 0, КодВозвратаДиалога.Да);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, ДополнительныеПараметры) Экспорт
// Результат будет содержать значение из СпискаКнопок (в нашем случае КодВозвратаДиалога)
Если Результат = КодВозвратаДиалога.Да Тогда
Сообщить("Пользователь полон энтузиазма!");
ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда
Сообщить("Пользователь отказался.");
КонецЕсли;
КонецПроцедуры
В данном примере мы связали системную константу КодВозвратаДиалога.Да с визуальным текстом "Хочу!". Это позволяет сохранить логику обработки ответа, изменив только внешнее представление.
Если вы работаете в режиме обычного приложения или в конфигурации, где разрешены модальные вызовы, можно использовать классическую функцию Вопрос(). Механизм со списком значений здесь работает аналогично. Выясним, как это выглядит на практике:
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, "Перенести изменения");
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, "Пропустить");
Ответ = Вопрос("Обнаружены изменения в данных. Как поступим?", СписокКнопок, 60);
Если Ответ = КодВозвратаДиалога.Да Тогда
// Логика переноса
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
// Логика пропуска
КонецЕсли;
Важный момент: если в СписокЗначений вы передаете не КодВозвратаДиалога, а просто произвольные числа или строки, то переменная Ответ примет именно это значение. Рассмотрим такой вариант:
СЗ = Новый СписокЗначений;
СЗ.Добавить("Вариант1", "Отправить почтой");
СЗ.Добавить("Вариант2", "Курьером");
СЗ.Добавить("Вариант3", "Самовывоз");
Ответ = Вопрос("Выберите способ доставки:", СЗ);
Если Ответ = "Вариант1" Тогда
// ...
КонецЕсли;
Это позволяет создавать меню с неограниченным количеством вариантов выбора прямо в окне вопроса.
При работе с кастомными кнопками следует учитывать несколько технических особенностей, чтобы избежать ошибок:
СписокЗначений.Добавить() позволяет указать картинку, платформа 1С (в частности, в функции ПоказатьВопрос) часто не поддерживает их отображение на кнопках диалога. Попытка добавить картинку может привести к ошибке "Несоответствие типов" или просто к игнорированию изображения.ПоказатьВопрос это 5-й параметр.Неопределено, которое может вернуться при закрытии окна крестиком.Вопрос() не существует. Программисты обычно решают эту задачу созданием отдельной маленькой формы (обработки), которая вызывается модально и имитирует диалог.Для удобства разработки в крупных проектах часто создают общую функцию в глобальном модуле. Рассмотрим пример такой "обертки", которая упрощает вызов диалогов с произвольными кнопками:
// Функция в общем модуле
Процедура глВопросСВыбором(ТекстВопроса, ИменаКнопокСтрокой, Оповещение) Экспорт
Кнопки = Новый СписокЗначений;
МассивИмен = СтрРазделить(ИменаКнопокСтрокой, ",");
Для Каждого Имя Из МассивИмен Цикл
Кнопки.Добавить(СокрЛП(Имя), СокрЛП(Имя));
КонецЦикла;
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
КонецПроцедуры
Такой подход позволяет вызывать сложные вопросы одной строкой кода, передавая список желаемых кнопок через запятую, что значительно ускоряет написание кода и делает его чище.
Подводя итог, можно сказать, что механизм СписокЗначений является мощным и гибким инструментом для кастомизации интерфейса в 1С 8.x, позволяя уйти от жестких рамок стандартных ответов и сделать программу более дружелюбной к пользователю.