Уверен, что для многих эта задача не представляет никакой сложности. Очень даже возможно, что эта задача решается и другими способами.
Имеется: Документ с реквизитами НомерВх и ДатаВх, а также основная форма документа
Зачада: Перед записью необходимо задать вопрос пользователю и по результату ответа продолжить запись, либо не продолжать.
Решение:
В свойствах формы редактируем список команд: снимаем галки с команд "Провести и закрыть", "Записать", "Провести".
Для командной панели убираем признак "Автозаполнение". Добавляем на форму свои команды, а также добавляем группу с типовыми командами. Далее описываем код для созданных команд:
Далее описываем код команд и проверку на дубли
&НаКлиенте
Процедура КомандаЗаписать(Команда)
ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Запись, Ложь);
ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры
&НаКлиенте
Процедура КомандаПровести(Команда)
ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Проведение, Ложь);
ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры
&НаКлиенте
Процедура КомандаПровестиИЗакрыть(Команда)
ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Проведение, Истина);
ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры
Для каждой команды определяем ПараметрыЗаписи, а также добавляем признак "Закрыть", чтобы после того, как будет задан вопрос, можно было определить надо ли закрывать форму или оставить форму открытой.
&НаКлиенте
Процедура ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи)
//выполняем проверку и получаем результат проверки
ЕстьДубль = ПроверимНаНаличиеДублей(Объект.ДатаВх, Объект.НомерВх);
Если ЕстьДубль И Модифицированность Тогда
//Существует будь документа, просим подтвердить запись и проведение
ТекстВопроса = "Для данного документа есть дубликаты. Продолжить?'";
ДополнительныеПараметры = Новый Структура();
ДополнительныеПараметры.Вставить("ПараметрыЗаписи", ПараметрыЗаписи);
//Задаем вопрос
Оповещение = Новый ОписаниеОповещения("ВопросПередЗаписьюЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
Иначе
//Дублей нет, смело записываем документ
КонтролироватьДубли = Ложь;
Отказ = Записать(ПараметрыЗаписи);
Если НЕ Отказ ИЛИ НЕ Модифицированность Тогда
Если ПараметрыЗаписи.Закрыть Тогда
Закрыть();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи)
Собственно, процедура самой проверки
&НаСервереБезКонтекста
Функция ПроверимНаНаличиеДублей(ТекДатаВх, ТекНомерВх, Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Тестовый.Ссылка
|ИЗ
| Документ.Тестовый КАК Тестовый
|ГДЕ
| Тестовый.НомерВх = &НомерВх
| И Тестовый.ДатаВх = &ДатаВх
| И Тестовый.Ссылка <> &Ссылка";
Запрос.УстановитьПараметр("ДатаВх", ТекДатаВх);
Запрос.УстановитьПараметр("НомерВх", ТекНомерВх);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
//Если запрос содержит данные, значит существует дубль по дату и номеру Вх
Возврат НЕ Результат.Пустой();
КонецФункции // ПроверимНаНаличиеДублей()
Далее процедура обработки оповещения, в которой происходит запись и закрытие документа (если он должен закрыться)
&НаКлиенте
Процедура ВопросПередЗаписьюЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
КонтролироватьДубли = Ложь;
ПараметрыЗаписи = ДополнительныеПараметры.ПараметрыЗаписи;
Отказ = НЕ Записать(ПараметрыЗаписи);
КонтролироватьДубли = Истина;
Если Не Отказ Тогда
Если ПараметрыЗаписи.Закрыть Тогда
Закрыть();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Остается ещё один момент: документ может быть записан при закрытии на крестик, тогда будут отрабатывать только типовые механизмы записи документа. Для себя решил это следующим образом (возможно, не очень правильно):
Добавлен реквизит формыВ процедуре ПередЗаписью следующий код
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
//Заменены типовые кнопки, даный код нужен для того, чтобы по "Крестику" документ не записывался с дублями
Если КонтролироватьДубли Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Существуют дубли документа.";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
В процедуре ПриСозданииНаСервере устанавливаем флаг в положение ИСТИНА
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КонтролироватьДубли = Истина;
КонецПроцедуры
Вот и всё, типовые команды заменены на наши и можно задавать вопросы пользователю до записи документа. Надеюсь статья будет кому-то полезна. Самого на написание статьи подтолкнула ситуация, когда при нажатии на кнопку "Провести и закрыть" выводится вопрос, подтверждаю запись, но документ не закрывается, закрыть документ можно только по крестику.
С удовольствием почитаю критику.