Переопределение кнопки "Провести и закрыть"

17.08.18

Задачи пользователя - Адаптация типовых решений

Бывает, что возникает задача, когда перед записью или проведением документа необходимо задать пользователю вопрос для дальнейше записи. Процедура "ПередЗаписью" не всегда может подойти и возникает необходимо переопределить действие кнопки "Провести и закрыть". Ниже расскажу простой способ, как это можно сделать.

Уверен, что для многих эта задача не представляет никакой сложности. Очень даже возможно, что эта задача решается и другими способами.

Имеется: Документ с реквизитами НомерВх и ДатаВх, а также основная форма документа

Зачада: Перед записью необходимо задать вопрос пользователю и по результату ответа продолжить запись, либо не продолжать.

Решение:

В свойствах формы редактируем список команд: снимаем галки с команд "Провести и закрыть", "Записать", "Провести".

Для командной панели убираем признак "Автозаполнение". Добавляем на форму свои команды, а также добавляем группу с типовыми командами. Далее описываем код для созданных команд:

Далее описываем код команд и проверку на дубли


&НаКлиенте
Процедура КомандаЗаписать(Команда)
	ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Запись, Ложь);
	ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура КомандаПровести(Команда)
	ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Проведение, Ложь);
	ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура КомандаПровестиИЗакрыть(Команда)
	ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Проведение, Истина);
	ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры

Для каждой команды определяем ПараметрыЗаписи, а также добавляем признак "Закрыть", чтобы после того, как будет задан вопрос, можно было определить надо ли закрывать форму или оставить форму открытой.


&НаКлиенте
Процедура ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи)

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

КонецПроцедуры // ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи)

Собственно, процедура самой проверки

&НаСервереБезКонтекста
Функция ПроверимНаНаличиеДублей(ТекДатаВх, ТекНомерВх, Ссылка)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Тестовый.Ссылка
		|ИЗ
		|	Документ.Тестовый КАК Тестовый
		|ГДЕ
		|	Тестовый.НомерВх = &НомерВх
		|	И Тестовый.ДатаВх = &ДатаВх
		|	И Тестовый.Ссылка <> &Ссылка";
	Запрос.УстановитьПараметр("ДатаВх", ТекДатаВх);
	Запрос.УстановитьПараметр("НомерВх", ТекНомерВх);
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Результат = Запрос.Выполнить();
	//Если запрос содержит данные, значит существует дубль по дату и номеру Вх
	Возврат НЕ Результат.Пустой();
КонецФункции // ПроверимНаНаличиеДублей()

Далее процедура обработки оповещения, в которой происходит запись и закрытие документа (если он должен закрыться)

&НаКлиенте
Процедура ВопросПередЗаписьюЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда
		КонтролироватьДубли = Ложь;
		ПараметрыЗаписи = ДополнительныеПараметры.ПараметрыЗаписи;
		Отказ = НЕ Записать(ПараметрыЗаписи);
		КонтролироватьДубли = Истина;
		Если Не Отказ Тогда
			Если ПараметрыЗаписи.Закрыть Тогда
				Закрыть();
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

Остается ещё один момент: документ может быть записан при закрытии на крестик, тогда будут отрабатывать только типовые механизмы записи документа. Для себя решил это следующим образом (возможно, не очень правильно):

Добавлен реквизит формыВ процедуре ПередЗаписью следующий код

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

В процедуре ПриСозданииНаСервере устанавливаем флаг в положение ИСТИНА

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	КонтролироватьДубли = Истина;
КонецПроцедуры

Вот и всё, типовые команды заменены на наши и можно задавать вопросы пользователю до записи документа. Надеюсь статья будет кому-то полезна. Самого на написание статьи подтолкнула ситуация, когда при нажатии на кнопку "Провести и закрыть" выводится вопрос, подтверждаю запись, но документ не закрывается, закрыть документ можно только по крестику.

С удовольствием почитаю критику.

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4448    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    2952    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1281    dimanich70    6    

13

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

27.10.2023    1991    13    avmartynov    10    

43

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3
Отзывы
11. klinval 337 20.08.18 14:33 Сейчас в теме
Решал похожую задачу: Как использовать ПоказатьВопрос в обработчике формы ПередЗаписью. Я там ПередЗаписью задавал вопрос с предварительным отказом.

В типовых все кнопки не заменишь. Там же и при нажатии на "Показать проводки" само автоматически записывается и при нажатии на "Печать" тоже автоматически:). ПередЗаписью эти случаи тоже не покрывает.
Anchoret; 7OH; +2 Ответить
2. Fox-trot 156 17.08.18 15:31 Сейчас в теме
тогда уж еще и Модифицированность проверять. как-то так
Если Модифицированность И КонтролироватьДубли Тогда
Anchoret; +1 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. A_Max 19 17.08.18 15:25 Сейчас в теме
Осталось сделать программное создание групп/кнопок/команд, вынести в отдельный модуль и апгрейдить конфигурации без изменения форм.
user591389_aska_rabota; alest; +2 Ответить
2. Fox-trot 156 17.08.18 15:31 Сейчас в теме
тогда уж еще и Модифицированность проверять. как-то так
Если Модифицированность И КонтролироватьДубли Тогда
Anchoret; +1 Ответить
3. Anchoret 60 17.08.18 16:41 Сейчас в теме
(2) Спасибо.
Если не осуществлять проверку на Модифицированность, тогда форма, в которой не было изменений, не закроется при нажатии на "Провести и закрыть"
4. ser6702 165 17.08.18 16:47 Сейчас в теме
5. herfis 498 17.08.18 17:07 Сейчас в теме
Не совсем понял, какая проблема решается. Если в форме отчета мне еще приходилось переопределять стандартные кнопки ибо там событий некомплект, то в форме документа с этим нет никаких проблем.
В перед записью задаешь вопрос и отказываешься от записи.
А в обработке ответа на вопрос уже принимаешь решение что делать на самом деле - записывать или нет.
7OH; A_Max; +2 Ответить
6. Fox-trot 156 17.08.18 17:11 Сейчас в теме
видимо с модальностью проблемы
Anchoret; +1 Ответить
7. sapervodichka 6697 17.08.18 23:15 Сейчас в теме
В 1С сейчас используются ПараметрыЗаписи там есть свойство ЕстьВопросыПередЗаписью. По нему сделайте поиск по конфигурации, посмотрите как вопрос работает перед записью.
Aleskey_K; Anchoret; +2 Ответить
10. Anchoret 60 20.08.18 09:59 Сейчас в теме
(7)
ЕстьВопросыПередЗаписью

Попытался найти данное свойство в бухгалтерии КОРП 3.0 (3.0.64.28) - пусто.
А вот в 1С:ERP Управление строительной организацией 2.2 (2.2.4.227) свойство имеется
8. mcgoblin 3 18.08.18 17:10 Сейчас в теме
В 1С сейчас используются расширения, там можно нагородить кучу своего кода для любой формы, если это надо)
9. Anchoret 60 19.08.18 02:35 Сейчас в теме
(8) То, что в расширении нагорожено будет, всё равно поддерживать придется =)
11. klinval 337 20.08.18 14:33 Сейчас в теме
Решал похожую задачу: Как использовать ПоказатьВопрос в обработчике формы ПередЗаписью. Я там ПередЗаписью задавал вопрос с предварительным отказом.

В типовых все кнопки не заменишь. Там же и при нажатии на "Показать проводки" само автоматически записывается и при нажатии на "Печать" тоже автоматически:). ПередЗаписью эти случаи тоже не покрывает.
Anchoret; 7OH; +2 Ответить
12. nytlenc 22.08.18 04:36 Сейчас в теме
О боже.... Скоро статьи 2 + 2 * 2 = 6 будут вызывать бурный восторг, а также собирать невиданные аудитории....
13. NoRazum 29 22.08.18 09:03 Сейчас в теме
Чем стандартный механизм в УТ и далее выше не подходит?
Там давно уже похоже
14. Stim213 415 22.08.18 10:05 Сейчас в теме
Очень странное решение.
Почему нельзя обойтись клиентской подпиской на событие ?
Зачем нужно переделывать всю форму?
zeegin; akela2014; +2 2 Ответить
16. Anchoret 60 22.08.18 12:26 Сейчас в теме
(14) Про подписку подробнее, пожалуйста.
Я как-то не сталкивался с подписками на событие, которые бы работали на клиенте, а не на сервере
15. akela2014 6 22.08.18 12:24 Сейчас в теме
вот вот подписки вполне достаточно
17. user1194102 21.11.19 09:42 Сейчас в теме
Спасибо за статью, Ваши материалы и курсы полезны и познавательны, в данной статье Вы хорошо показали Контроль дублей, но совсем не затронули Модифицированность, а она у Вас в коде присутствует.
Если ЕстьДубль И Модифицированность Тогда

Может быть у Вас есть отдельная статья именно о Модифицированности? Этот метод не очень понятно описан в технической документации 1С. А метод очень интересен, если правильно понимать как он работает)
Оставьте свое сообщение