Проверка перед проведением

1. ogion 01.08.13 11:00 Сейчас в теме
Подскажите как правильно сделать: нужно чтобы при сохранении документа некоторые реквизиты не проверялись на заполненность, а при проведении сообщалось о пропущеном и проведение не осуществлялось.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tango 546 01.08.13 11:07 Сейчас в теме
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ПередЗаписью (BeforeWrite)
Синтаксис:

ПередЗаписью(<Отказ>, <РежимЗаписи>, <РежимПроведения>)
Параметры:

<Отказ>

Тип: Булево.
Признак отказа от записи документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись документа выполнена не будет.
Значение по умолчанию: Ложь
<РежимЗаписи>

Тип: РежимЗаписиДокумента.
В параметр передается текущий режим записи документа. Позволяет определить в теле процедуры режим записи. Изменение значения параметра позволяет изменить режим записи.
<РежимПроведения>

Тип: РежимПроведенияДокумента.
В данный параметр передается текущий режим проведения.
Изменение значения параметра позволяет изменить режим проведения.
Описание:

Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.
3. ogion 01.08.13 11:11 Сейчас в теме
Вот так сделал:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Контрагент.Пустая() = Истина Тогда
Предупреждение("Не Выбран контрагент!");
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;
Если МестоХранения.Пустая() = Истина Тогда
Предупреждение("Не Выбран склад!");
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;
Если ЭтотОбъект.ВыгружаемоеСырьё.Количество() = 0 Тогда
Предупреждение("Не заполнена табличная часть!");
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;

КонецПроцедуры
Но теперь появляется сообщение:
Ошибка записи! Не установлен отбор по регистратору...
4. ogion 01.08.13 11:17 Сейчас в теме
5. tango 546 01.08.13 11:18 Сейчас в теме
1. это должна быть подписка

2.
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
Отказ = Истина;
КонецЕсли;

3. ошибка у вас - попытка отменить проведение нового (не существующего в базе) объекта - по нему не может быть отбора
6. ogion 01.08.13 11:28 Сейчас в теме
Так он не проводит, но и не сохраняет. Надо чтобы сохранил но не провел.
7. tango 546 01.08.13 11:53 Сейчас в теме
(6) ogion, я не очень сильно вас огорчу, если вспомню, что обучение - самое неблагодарное из известных мне занятий?
8. ogion 01.08.13 13:57 Сейчас в теме
Ничего. Я вот преподаватель по образованию, работал в институте, оказалось терпения у меня уйма)
9. proxytm 01.08.13 14:17 Сейчас в теме
(8) ogion, попробуй так (Если для документа при конфигурировании свойство Проведение установлено в Разрешить, то вызывается только при проведении.):
ДокументОбъект.<Имя документа>.ОбработкаПроверкиЗаполнения (DocumentObject.<Имя документа>.FillCheckProcessing)
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ОбработкаПроверкиЗаполнения (FillCheckProcessing)
Синтаксис:

ОбработкаПроверкиЗаполнения(<Отказ>, <ПроверяемыеРеквизиты>) 
Параметры:

<Отказ>

Тип: Булево. 
Если в теле процедуры-обработчика установить данному параметру значение Истина, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения.
Значение по умолчанию: Ложь 
<ПроверяемыеРеквизиты>

Тип: Массив. 
Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам. 
Описание:

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

Пример:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

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

// Сообщим платформе, что мы сами обрабатываем проверку реквизита товар в табличной части Товары
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар"));

// Обходим строки и проверяем заполнение реквизита
Для Индекс = 0 по Товары.Количество()-1 Цикл
    СтрокаТовар = Товары.Получить(Индекс);
    Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара";
        Сообщение.Поле = "Товары[" + Индекс + "].Товар";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
КонецЦикла;
    
КонецПроцедуры
Показать
mf300; sommid; +2 Ответить
10. fly_men 01.08.13 15:18 Сейчас в теме
Процедура ОбработкаПроверкиЗаполнения Вызывается расширением формы

Вот попробуйте сделать так(пример):
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ПараметрыЗаписи.РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
Контрагент = ПроверяемыеРеквизиты.Найти("Контрагент");
Склад = ПроверяемыеРеквизиты.Найти("Склад");
Ответственный = ПроверяемыеРеквизиты.Найти("Ответственный");
ПроверяемыеРеквизиты.Удалить(Контрагент);
ПроверяемыеРеквизиты.Удалить(Склад);
ПроверяемыеРеквизиты.Удалить(Ответственный);
КонецЕсли;
КонецПроцедуры
11. ogion 01.08.13 16:32 Сейчас в теме
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если НЕ ЗначениеЗаполнено(МестоХранения) Тогда
Предупреждение("Не выбран склад! Документ не будет проведен.");
РежимЗаписи = РежимЗаписиДокумента.Запись;
Отказ = Истина;
КонецЕсли;
КонецЕсли;

Вот так работает как я и хотел. Благодарю.
12. tango 546 01.08.13 16:35 Сейчас в теме
(11) ogion, РежимЗаписи = РежимЗаписиДокумента.Запись;
лишняя
13. ogion 02.08.13 10:25 Сейчас в теме
(12) Без неё будет сохранять?
14. tango 546 02.08.13 10:33 Сейчас в теме
(13) ogion,
из жмеринки спрашивают: что такое Отказ?
15. Bukaska 147 02.08.13 10:48 Сейчас в теме
(14) tango, Параметр.С помощью которого можно отказаться от операции)))
17. Eremkin 30.11.16 09:33 Сейчас в теме
(11) "Предупреждение("Не выбран склад! Документ не будет проведен."); " в транзакции такими вещами лучше не пользоваться. Достаточно просто Сообщить().
16. tango 546 02.08.13 11:20 Сейчас в теме
и да, я бы не рекомендовал фокусничать типа
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

РежимЗаписи = РежимЗаписиДокумента.Запись;

КонецЕсли; 


а строчку
Предупреждение("Не выбран склад! Документ не будет проведен.");

делать только с проверкой #НаКлиенте
18. dilmurod81 08.03.18 11:25 Сейчас в теме
Если ПустаяСтрока(Объект.Ссылка) = Истина Тогда
		Сообщить("Новый документ");
	Иначе
		Сообщить("Старый документ");
	КонецЕсли;
19. Barny_Ross 23.05.20 13:24 Сейчас в теме
Здравствуйте! Помогите!

Я попробовал код, который размещен в этой ветке и еще десяток вариантов из интернета - у меня не срабатывает.

Я размещал коды На клиенте в ФормаДокумента http://prntscr.com/sm9ws8, в модуле Объекта http://prntscr.com/sm9x16 и ничего не происходит.

Задача у меня такая:
Если не установлена галочка в поле Директор, документ нельзя провести и нужно вывести сообщение. Я уверен, что это абсолютно типичная и очень легкая задача, но я испробовал все варианты кода и уже отчаялся.
1. Сначала я попробовал в свойствах объекта установить Выдавать ошибку. Попробовал варианты Истина и Ложь. Не работает.
2. Потом использовал тот код, который написан в этой ветке, где я пишу сообщение - не работает.
3. Потом написал вот этот код:
&НаКлиенте
Процедура ПередЗаписью (Отказ, РежимЗаписи)
	Если РежимЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись И Объект.Реквизит1 = Ложь Тогда
			
		
			Сообщить ("Получилось");
			Отказ = Истина;
	КонецЕсли;

КонецПроцедуры
Показать


Как реализовать эту задачу?
20. ElementaryTroll 14.07.20 15:00 Сейчас в теме
(19)
Зашел случайно, но хочу заметить, что при проведении РежимЗаписи = РежимЗаписиДокумента.Проведение а не РежимЗаписиДокумента.Запись
21. user891547 16.03.23 11:08 Сейчас в теме
В качестве заметок на полях...

Да, уважаемые коллеги, русский язык - вещь тонкая, и то, как формулируется вопрос, и то, как его представляет себе автор, - не всегда одно и то же.
Это замечательно, что ogion решил свою задачу, но вопрос-то был задан не об этом. Все сразу стали предлагать решение, как должна вести себя программа, если определенный реквизит, например, "Контрагент" не заполнен.
Но в вопросе-то русским по белому написано: "нужно чтобы при СОХРАНЕНИИ документа некоторые реквизиты НЕ ПРОВЕРЯЛИСЬ на заполненность".
Иными словами, нажал пользователь кнопку "Провести и закрыть", и при отсутствии заполнения поля контрагента документ не проводится, и выдается сообщение об отсутствии заполнения.
Нажал пользователь кнопку "Записать", и не имеет значения, заполнено поле "Контрагент" или нет, - документ просто записывается без проведения. И все.
А вопрос-то был задан интересный...
22. lmnlmn 69 16.03.23 11:14 Сейчас в теме
(21)
А вопрос-то был задан интересный...
Вопрос прекрасен и как-то раз пришлось заморочиться разными алгоритмами проверки заполнения для проведения и записи. Решил через ОбработкаПроверкиЗаполнения и костыль посредством переменных модуля объекта.
23. user891547 16.03.23 12:22 Сейчас в теме
(22) А можно подробнее о решении? Потому, как меня очень интересует именно исходный вопрос - при проведении проверка нужна, а при сохранении - нет...
25. lmnlmn 69 16.03.23 12:42 Сейчас в теме
(23) В общих чертах:
1. Проблема: в ОбработкаПроверкиЗаполнения никак не выяснить режим записи документа. Но никто не мешает нам его туда передать через переменную модуля объекта. Для этого в ПередЗаписью надо в эту переменнyю режим записи запомнить, а в ОбработкаПроверкиЗаполнения сравнить с интересующим режимом записи и сразу же "сбросить" дабы при вызове проверки из других мест костыль не поломался.
2. При запаси без проведения ОбработкаПроверкиЗаполнения не вызывается в некоторых сценариях, если ничего не путаю. В этом случае надо в ПередЗаписью "заставить" сделать проверку вызвав ПроверитьЗаполнение().
24. user891547 16.03.23 12:41 Сейчас в теме
(22) Иными словами - как отследить, какая кнопка нажата: "Провести и закрыть" или "Записать"?
26. lmnlmn 69 16.03.23 12:57 Сейчас в теме
(24) По режиму записи документа в модуле объекта. В форме не разбирался как отловить так как надо было и программную запись обрабатывать.
27. user891547 16.03.23 13:09 Сейчас в теме
(22) Спасибо!

Вообще, способ, описанный выше, работает...
А именно, в процедуре
ПередЗаписью(Отказ, ПарамерыЗаписи)
сравнить
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись
или
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение
, соответственно.

Просто я подумал, насколько это правильно, и нет ли в этом способе каких "подводных камней"?
28. user891547 16.03.23 13:17 Сейчас в теме
(25) Понятно. Большое спасибо!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот