Как программно отличить "Записать" и "Записать и закрыть"?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Не так давно сталкивался с подобной задачей. В итоге только свои кнопки рисовать вместо стандартных с записью доп параметров.
Создаешь переменную вверху модуля формы, что нибудь типо
перем мЭтоЗаписьИЗакрытие;
При нажатии своей кнопки мЭтоЗаписьИЗакрытие = Истина или Ложь, ну и соответсвенно ПередЗаписью смотришь в значение это переменной, пишешь условия.
Создаешь переменную вверху модуля формы, что нибудь типо
перем мЭтоЗаписьИЗакрытие;
При нажатии своей кнопки мЭтоЗаписьИЗакрытие = Истина или Ложь, ну и соответсвенно ПередЗаписью смотришь в значение это переменной, пишешь условия.
В типовых конфигурациях УТ/КА/ЕРП видел следующий подход: переопределяются платформенные кнопки "Записать", "Провести", "Провести и закрыть". Прикрепляю скриншоты формы документа "Заказ клиента"
Прикрепленные файлы:
Приветствую. Работаю с асинхронным диалогом с пользователем в модуле формы документа. Диалог вызывается из процедуры ПередЗаписью и в зависимости от выбора ответа пользователя документ либо записывается (записывается и закрывается форма), либо записи не происходит и форма остается видимой. Так вот платформенная команда Записать и закрыть в этом случае работать перестает, причину понять не могу, происходит только запись документа. Выходит, что если я вмешиваюсь в стандартное поведение процедуры ПередЗаписью (отказ = Истина для работы с асинхронным диалогом), а потом повторно вызываю Запись() - происходит именно запись без закрытия. Поэтому есть вопрос - как определить, что пользователь нажал именно Записать и закрыть, а не просто Закрыть?
1. При создании формы на севере переопределил команду у уже имеющейся кнопки "Записать и закрыть":
2. В процедуре, которую описал в действии команды добавил:
3. В процедуре "ПередЗаписью":
4. Процедура "ПередЗаписьюПродолжение" (описана в оповещении к вопросу)
5. В процедуре "ПослеЗаписи"
// Создаю свою команду
ИмяКомандыЗаписатьИЗакрыть = "ЗаписатьИЗакрыть";
КомандаЗаписатьИЗакрыть = ЭтаФорма.Команды.Добавить(ИмяКомандыЗаписатьИЗакрыть);
// Описываю действие, которое будет вызываться при выполнении команды
КомандаЗаписатьИЗакрыть.Действие = "Подключаемый_" + ИмяКомандыЗаписатьИЗакрыть;
// Присваиваю команду уже имеющейся кнопке
КоманднаяПанель.ПодчиненныеЭлементы.ФормаЗаписатьИЗакрыть.ИмяКоманды = ИмяКомандыЗаписатьИЗакрыть;
// Устанавливаю заголовок кнопке, (по умолчанию присваивается имя команды без пробелов). Не буду здесь описывать, (у меня отдельной функцией делается вставка пробелов перед заглавными буквами).
Показать2. В процедуре, которую описал в действии команды добавил:
// Свойство в параметрах записи
ЭтаФорма.Записать(Новый Структура("ЗакрыватьПослеЗаписи"));
3. В процедуре "ПередЗаписью":
// Проверяю наличие свойства в структуре, его отсутствие указывает на то, что можно сделать асинхронный вызов
Если Не ПараметрыЗаписи.Свойство("ПродолжениеЗаписи") Тогда
// Пробрасываю параметр о том, что форма должна быть закрыта
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ЗакрыватьПослеЗаписи",ПараметрыЗаписи.Свойство("ЗакрыватьПослеЗаписи"));
// Отказываю в записи, хочу вызвать запись после ответа пользователя
Отказ = Истина;
//Описываю вопрос и оповещение к нему
ОписаниеОповещенияПередЗаписью = Новый ОписаниеОповещения("ПередЗаписьюПродолжение",ЭтаФорма,ДополнительныеПараметры);
ТекстВопроса = НСтр("ru = 'Какой-то вопрос?'");
ПоказатьВопрос(ОписаниеОповещенияПередЗаписью,ТекстВопроса,РежимДиалогаВопрос.ДаНет);
КонецЕсли;
Показать4. Процедура "ПередЗаписьюПродолжение" (описана в оповещении к вопросу)
// Ничего не делаю, если пользователь закрыл окно вопроса
Если Ответ = Неопределено Тогда
Возврат;
КонецЕсли;
// Тут пишем, что хотим делать
....
....
....
// Вызываем запись повторно, но уже с параметрами
ПараметрыЗаписи = Новый Структура;
// Наличие этого параметра позволит больше не задавать вопрос перед записью
ПараметрыЗаписи.Вставить("ПродолжениеЗаписи");
// Пробрасываем параметр о том что форма будет закрыта.
Если ДополнительныеПараметры.ЗакрыватьПослеЗаписи Тогда
ПараметрыЗаписи.Вставить("ЗакрыватьПослеЗаписи");
КонецЕсли;
ЭтаФорма.Записать(ПараметрыЗаписи);
Показать5. В процедуре "ПослеЗаписи"
Если ПараметрыЗаписи.Свойство("ЗакрыватьПослеЗаписи") Тогда
ЭтаФорма.Закрыть();
КонецЕсли;
Для моей задачи сделал так, в расширении. Спасибо kostaen.
&НаСервере
&Вместо("ПриСозданииНаСервере")
Процедура Расширение_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//свой код
////
ИмяКомандыЗаписатьИЗакрыть = "ЗаписатьИЗакрыть";
КомандаЗаписатьИЗакрыть = ЭтаФорма.Команды.Добавить(ИмяКомандыЗаписатьИЗакрыть);
КомандаЗаписатьИЗакрыть.Заголовок = НСтр("ru = 'Записать и закрыть'");
// Описываю действие, которое будет вызываться при выполнении команды
КомандаЗаписатьИЗакрыть.Действие = "Подключаемый_" + ИмяКомандыЗаписатьИЗакрыть;
// Присваиваю команду уже имеющейся кнопке
КоманднаяПанель.ПодчиненныеЭлементы.ФормаЗаписатьИЗакрыть.ИмяКоманды = ИмяКомандыЗаписатьИЗакрыть;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ЗаписатьИЗакрыть(Команда)
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("Закрыть", Истина);
ЭтаФорма.Записать(ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Функция Расширение_ПроверитьНаДубли(ЗадатьВопрос)
Если Не Объект.Ссылка.Пустая() Тогда
Возврат Ложь;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДоговорыКонтрагентов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &Владелец
| И ДоговорыКонтрагентов.Организация = &Организация
| И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора";
Запрос.УстановитьПараметр("Владелец", Объект.Владелец);
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("ВидДоговора", Объект.ВидДоговора);
УстановитьПривилегированныйРежим(Истина);
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Если Не РезультатЗапроса.Пустой() Тогда
ЗадатьВопрос = Истина;
КонецЕсли;
Возврат ЗадатьВопрос;
КонецФункции
&НаКлиенте
Процедура Расширение_ПослеЗакрытияВопроса(Результат, ПараметрыЗаписи) Экспорт
Если Результат = КодВозвратаДиалога.Нет Тогда
ПараметрыЗаписи.Вставить("ЗаписатьПослеВопроса", Истина);
Записать(ПараметрыЗаписи)
КонецЕсли;
КонецПроцедуры
&НаКлиенте
&Перед("ПередЗаписью")
Процедура Расширение_ПередЗаписью(Отказ, ПараметрыЗаписи)
Если Не Отказ Тогда
Если Не ПараметрыЗаписи.Свойство("ЗаписатьПослеВопроса") Тогда
ЗадатьВопрос = Ложь;
Расширение_ПроверитьНаДубли(ЗадатьВопрос);
Если ЗадатьВопрос Тогда
Отказ = Истина;
Оповещение = Новый ОписаниеОповещения("Расширение_ПослеЗакрытияВопроса", ЭтотОбъект, ПараметрыЗаписи);
ПоказатьВопрос(Оповещение, НСтр("ru = 'Подобный договор существует!
|ИСПОЛЬЗОВАТЬ ИМЕЮЩИЙСЯ ДОГОВОР?'"), РежимДиалогаВопрос.ДаНет, 0);
Возврат;
КонецЕсли;
КонецЕсли;
Если ПараметрыЗаписи.Свойство("Закрыть", Истина) Тогда
Закрыть();
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
(16) поправил немного код
&НаСервере
&Вместо("ПриСозданииНаСервере")
Процедура Расширение_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//свой код
////
ИмяКомандыЗаписатьИЗакрыть = "ЗаписатьИЗакрыть";
КомандаЗаписатьИЗакрыть = ЭтаФорма.Команды.Добавить(ИмяКомандыЗаписатьИЗакрыть);
КомандаЗаписатьИЗакрыть.Заголовок = НСтр("ru = 'Записать и закрыть'");
// Описываю действие, которое будет вызываться при выполнении команды
КомандаЗаписатьИЗакрыть.Действие = "Подключаемый_" + ИмяКомандыЗаписатьИЗакрыть;
// Присваиваю команду уже имеющейся кнопке
КоманднаяПанель.ПодчиненныеЭлементы.ФормаЗаписатьИЗакрыть.ИмяКоманды = ИмяКомандыЗаписатьИЗакрыть;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ЗаписатьИЗакрыть(Команда)
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("Закрыть", Истина);
ЭтаФорма.Записать(ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Функция Расширение_ПроверитьНаДубли(ЗадатьВопрос)
Если Не Объект.Ссылка.Пустая() Тогда
Возврат Ложь;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДоговорыКонтрагентов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &Владелец
| И ДоговорыКонтрагентов.Организация = &Организация
| И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора";
Запрос.УстановитьПараметр("Владелец", Объект.Владелец);
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("ВидДоговора", Объект.ВидДоговора);
УстановитьПривилегированныйРежим(Истина);
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Если Не РезультатЗапроса.Пустой() Тогда
ЗадатьВопрос = Истина;
КонецЕсли;
Возврат ЗадатьВопрос;
КонецФункции
&НаКлиенте
Процедура Расширение_ПослеЗакрытияВопроса(Результат, ПараметрыЗаписи) Экспорт
Если Результат = КодВозвратаДиалога.Нет Тогда
ПараметрыЗаписи.Вставить("ЗаписатьПослеВопроса", Истина);
Записать(ПараметрыЗаписи);
Если ПараметрыЗаписи.Свойство("Закрыть", Истина) Тогда
Закрыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
&Перед("ПередЗаписью")
Процедура Расширение_ПередЗаписью(Отказ, ПараметрыЗаписи)
Если Не Отказ Тогда
Если Не ПараметрыЗаписи.Свойство("ЗаписатьПослеВопроса") Тогда
ЗадатьВопрос = Ложь;
Расширение_ПроверитьНаДубли(ЗадатьВопрос);
Если ЗадатьВопрос Тогда
Отказ = Истина;
Оповещение = Новый ОписаниеОповещения("Расширение_ПослеЗакрытияВопроса", ЭтотОбъект, ПараметрыЗаписи);
ПоказатьВопрос(Оповещение, НСтр("ru = 'Подобный договор существует!
|ИСПОЛЬЗОВАТЬ ИМЕЮЩИЙСЯ ДОГОВОР?'"), РежимДиалогаВопрос.ДаНет, 0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот