Подскажите как правильно сделать: нужно чтобы при сохранении документа некоторые реквизиты не проверялись на заполненность, а при проведении сообщалось о пропущеном и проведение не осуществлялось.
Тип: Булево.
Признак отказа от записи документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись документа выполнена не будет.
Значение по умолчанию: Ложь
<РежимЗаписи>
Тип: РежимЗаписиДокумента.
В параметр передается текущий режим записи документа. Позволяет определить в теле процедуры режим записи. Изменение значения параметра позволяет изменить режим записи.
<РежимПроведения>
Тип: РежимПроведенияДокумента.
В данный параметр передается текущий режим проведения.
Изменение значения параметра позволяет изменить режим проведения.
Описание:
Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.
Вот так сделал:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Контрагент.Пустая() = Истина Тогда
Предупреждение("Не Выбран контрагент!");
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;
Если МестоХранения.Пустая() = Истина Тогда
Предупреждение("Не Выбран склад!");
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;
Если ЭтотОбъект.ВыгружаемоеСырьё.Количество() = 0 Тогда
Предупреждение("Не заполнена табличная часть!");
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;
КонецПроцедуры
Но теперь появляется сообщение:
Ошибка записи! Не установлен отбор по регистратору...
(8) ogion, попробуй так (Если для документа при конфигурировании свойство Проведение установлено в Разрешить, то вызывается только при проведении.):
ДокументОбъект.<Имя документа>.ОбработкаПроверкиЗаполнения (DocumentObject.<Имя документа>.FillCheckProcessing)
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ОбработкаПроверкиЗаполнения (FillCheckProcessing)
Синтаксис:
ОбработкаПроверкиЗаполнения(<Отказ>, <ПроверяемыеРеквизиты>)
Параметры:
<Отказ>
Тип: Булево.
Если в теле процедуры-обработчика установить данному параметру значение Истина, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения.
Значение по умолчанию: Ложь
<ПроверяемыеРеквизиты>
Тип: Массив.
Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Описание:
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме, а также при выполнении метода ПроверитьЗаполнение.
Если для документа при конфигурировании свойство Проведение установлено в Разрешить, то вызывается только при проведении.
Если документ не проводится (установлено Запретить), то вызывается при записи.
Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Пример:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проверим заполненность реквизита "Покупатель"
Покупатель = ПроверяемыеРеквизиты.Найти("Покупатель");
Если Не ЗначениеЗаполнено(Покупатель) Тогда
// Если он не заполнен, сообщим об этом пользователю
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!";
Сообщение.Поле = "Покупатель";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
// Сообщим платформе, что мы сами обработали проверку заполнения реквизита "Покупатель"
ПроверяемыеРеквизиты.Удалить(Покупатель);
// Так как информация не консистентна, то продолжать работу дальше смысла нет
Отказ = Истина;
КонецЕсли;
// Сообщим платформе, что мы сами обрабатываем проверку реквизита товар в табличной части Товары
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар"));
// Обходим строки и проверяем заполнение реквизита
Для Индекс = 0 по Товары.Количество()-1 Цикл
СтрокаТовар = Товары.Получить(Индекс);
Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара";
Сообщение.Поле = "Товары[" + Индекс + "].Товар";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если НЕ ЗначениеЗаполнено(МестоХранения) Тогда
Предупреждение("Не выбран склад! Документ не будет проведен.");
РежимЗаписи = РежимЗаписиДокумента.Запись;
Отказ = Истина;
КонецЕсли;
КонецЕсли;
(11) "Предупреждение("Не выбран склад! Документ не будет проведен."); " в транзакции такими вещами лучше не пользоваться. Достаточно просто Сообщить().
Задача у меня такая:
Если не установлена галочка в поле Директор, документ нельзя провести и нужно вывести сообщение. Я уверен, что это абсолютно типичная и очень легкая задача, но я испробовал все варианты кода и уже отчаялся. 1. Сначала я попробовал в свойствах объекта установить Выдавать ошибку. Попробовал варианты Истина и Ложь. Не работает.
2. Потом использовал тот код, который написан в этой ветке, где я пишу сообщение - не работает.
3. Потом написал вот этот код:
&НаКлиенте
Процедура ПередЗаписью (Отказ, РежимЗаписи)
Если РежимЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись И Объект.Реквизит1 = Ложь Тогда
Сообщить ("Получилось");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Да, уважаемые коллеги, русский язык - вещь тонкая, и то, как формулируется вопрос, и то, как его представляет себе автор, - не всегда одно и то же.
Это замечательно, что ogion решил свою задачу, но вопрос-то был задан не об этом. Все сразу стали предлагать решение, как должна вести себя программа, если определенный реквизит, например, "Контрагент" не заполнен.
Но в вопросе-то русским по белому написано: "нужно чтобы при СОХРАНЕНИИ документа некоторые реквизиты НЕ ПРОВЕРЯЛИСЬ на заполненность".
Иными словами, нажал пользователь кнопку "Провести и закрыть", и при отсутствии заполнения поля контрагента документ не проводится, и выдается сообщение об отсутствии заполнения.
Нажал пользователь кнопку "Записать", и не имеет значения, заполнено поле "Контрагент" или нет, - документ просто записывается без проведения. И все.
А вопрос-то был задан интересный...
Вопрос прекрасен и как-то раз пришлось заморочиться разными алгоритмами проверки заполнения для проведения и записи. Решил через ОбработкаПроверкиЗаполнения и костыль посредством переменных модуля объекта.
(23) В общих чертах:
1. Проблема: в ОбработкаПроверкиЗаполнения никак не выяснить режим записи документа. Но никто не мешает нам его туда передать через переменную модуля объекта. Для этого в ПередЗаписью надо в эту переменнyю режим записи запомнить, а в ОбработкаПроверкиЗаполнения сравнить с интересующим режимом записи и сразу же "сбросить" дабы при вызове проверки из других мест костыль не поломался.
2. При запаси без проведения ОбработкаПроверкиЗаполнения не вызывается в некоторых сценариях, если ничего не путаю. В этом случае надо в ПередЗаписью "заставить" сделать проверку вызвав ПроверитьЗаполнение().