Проверка/исправление реквизитов справочника ПередЗаписью() #796517


#0 by Mikhail Volkov
Нужно проверять реквизиты: Артикул, Наименование, НаименованиеПолное, Описание на наличие , задавать вопрос на исправление, или отказ от записи. Для обычных форм нет проблем: последовательно проверяй реквизиты, спрашивай, исправляй, если пользователь согласен - все в одной процедуре  ПередЗаписью. На УФ сложнее: проверил 1-й реквизит, если нашел ошибку, то ПоказатьВопрос, и уходишь в процедуру ПередЗаписьюПредложитьИсправитьРеквизитВопросЗавершение. При этом проверка следующих реквизитов в ПередЗаписью не выполняется, их проверку нужно еще прописать в ПередЗаписьюПредложитьИсправитьРеквизитВопросЗавершение. Там и там проверяем 2-й реквизит, появляется ПередЗаписьюПредложитьИсправить2йРеквизитВопросЗавершение. 3-й реквизит проверяем уже в 3-х местах? Может как-то проще можно?
#1 by Flip
Наверное через попытку исключение, код проверки вызывается в каждой начатой попытке.
#2 by Flip
как в запросах, Выбор когда ..Тогда..Иначе.. и понеслась душа в рай)))
#3 by Cyberhawk
Зачем на каждый чих задавать вопрос? Показывай форму со списком, пользователь отмечает флажками то, что будет исправлять, либо отказывается
#4 by Mikhail Volkov
Да, возможно в реквизитов Наименование, НаименованиеПолное, Описание одна и та же размноженная ошибка, спрашивать можно один раз. Но все равно после одного исправления нужно повторно вызвать ПередЗаписью через ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме, чтобы она завершилась без отказа, и запись продолжилась. А если проверок много, то целые каскады процедур ПередЗаписьюПредложитьИсправитьРеквизитВопросЗавершение писать?
#5 by Cyberhawk
Ты походу не понял, раз хочешь "после одного исправления нужно повторно вызвать". Сделай работу по всем испрвлениям сразу в одном диалоге
#6 by Mikhail Volkov
Идея понятна - обойтись одним диалогом-вопросом. Но форму этого диалога-вопроса придется строить. Идея хороша лишь для обработок, где список ошибок большой. Не мой случай, ну в одном-двух реквизитах ошибутся, можно обойтись одним, двумя простыми вопросами. И проверка у меня упрощенная, только 1-ю неверную комбинацию Рус/Лат находит, после ее исправления нужно повторно проверку делать. С ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме погорячился, для документов нужна, для справочников все проще. Пример взял из УТ11 БанковскиеСчетаОрганизаций.
#7 by Mikhail Volkov
В этом примере используют Модифицированность формы справочника. Если согласился на исправление реквизита, или оказался, то Модифицированность устанавливают в Ложь, и при повторной записи этот реквизит не проверяется. В документе ЗаказКлиента (приходилось добавлять свои проверки) для этого НеВыполнятьПроверкуПередЗаписью. Решил добавить аналогичные для каждого проверяемого реквизита. Вроде все получилось, не пришлось писать каскады процедур ПроверкаНаименованиеЗавершение(Результат, ДополнительныеПараметры). Но есть неприятность - форма закрывается когда жмешь "Записать", а не "Записать и закрыть"!? Не понятно что в ДополнительныеПараметры? В документе ЗаказКлиента в них:     ДополнительныеПараметры.Вставить("ПараметрыЗаписи", ПараметрыЗаписи); Можно определить проводится документ, или просто записывается. А для справочника можно определить что нажато "Записать" или "Записать и закрыть"?
#8 by Лефмихалыч
Эти все проблемы - следствие костылявой архитектуры. Не надо было вообще на старте так делать, чтобы пользователю на каждую его ошибку выдавался отдельный вопрос. Теперь у тебя других вариантов нет кроме как рекурсивно выполнять эти проверки из ПередЗаписьюПредложитьИсправитьРеквизитВопросЗавершение
#9 by Mikhail Volkov
Да, мне сразу не понравилось такое решение, когда попросили вставить пару поверок в ЗаказКлиента. Их приходилось прописывать не только в ПередЗаписью, но и в ПередЗаписьюРазныеПрерыдущиеПроверкиВопросЗавершение, т.е. строить целые каскады процедур проверки. Когда нужно проверять уже 4 реквизита, стал искать другое решение. Есть такое? С добавлением НеВыполнятьПроверкуПередЗаписью для каждого проверяемого реквизита неплохо получилось, избежал каскадов процедур проверки. С закрытием формы осталось решить.
#10 by Mikhail Volkov
Оказывается уже было такая тема - типовыми методами не решается. Если только свои кнопки делать... Печально.
#11 by Лефмихалыч
перестань эти извращения. Проверяй в обработке проверки заполнения и там же задавай свои вопросы
#12 by Лефмихалыч
хотя все равно рекурсивно придется спрашивать. но это потому, что идея "спрашивать пользователя несколько раз " изначально - фуфло убогое.
#13 by FIXXXL
можешь складировать ошибки в структуру, отказ=истина перед записью и показать один вопрос со всем скопом накопленных ошибок
#14 by FIXXXL
даже так: Отказ = ЗначениеЗаполнено(СтруктураОшибок);  :)
#15 by Mikhail Volkov
Спрашивал тебя в . Есть что предложить, хотя бы на уровне идеи? Тоже самое, что предлагал, не подошло по причине в .
#16 by dezss
А если использовать: ОбщегоНазваченияКлиентСервер.СообщитьПользователю с привязкой к полю + взведенный флаг. Если флаг взведен, то запрашивать подтверждение "Есть ошибки, все равно сохранить?", да/нет/исправить.
#17 by dezss
+ никаких доп форм не надо. Привязка к полям есть, текст ошибки произвольный.
#18 by Вафель
создать свою кнопку записи. Записывать только тогда, когда все проверки пройдены. То бишь не пользоваться системным событием "ПередЗаписью"
#19 by dezss
+ имеется ввиду, что ПередЗаписью проверяешь на все ошибки, выводишь ошибки привязанные к соответствующим реквизитам и если ошибки были, то диалог да/нет/продолжить_редактирование.
#20 by Вафель
так вопрос то тоже асинхроннный
#21 by dezss
да, но никаких своих обработок событий писать не надо, все ошибки привязаны к нужным реквизитам и показываются одновременно, а не по-очереди. Так что сабж по-сути решается.
#22 by Вафель
а исправлять ка ты будешь? А если нужно 2 ошибки исправить, а 2 руками?
#23 by dezss
ну если нужно частично автоматическое исправление, то никак (из вопроса не сразу это понял). Тогда только свою команду записи документа.
#24 by Лефмихалыч
в обработчике проверки заполнения на клиенте проверять, есть ли косяки в данных. Если есть хоть один косяк, то: 1. открывать форму отдельного мастера, с помощью которого пользователь все починит без этих дурацких вопросов. 2. отказ = истина; Таким образом, ты из проверки заполнения на форме выйдешь только, если нет ни одного косяка.
#25 by Mikhail Volkov
Спрашивать одним вопросом, уже не надо предлагать. Частично это использовал, когда ошибка одна и та же в нескольких реквизитах. Только так, больше нет вариантов узнать что нажато "Записать" или "Записать и закрыть"? Вроде дельное предложение, но поздно, не хочу переделывать. В следующий раз подумаю над этим.
#26 by Mikhail Volkov
Тут клиент еще высказал пожелание: у номенклатуры есть Присоединенные файлы (Номенклатура), которые имеют реквизит Описание. В большинстве случаев оно не заполнено. Клиент хочет чтобы это проверялось при записи, и заполнялось. Для ФайлКартинки можно указывать "Основной вид", для Файл описания для сайта - "Описание" без всяких вопросов. Для остальных - нужно обращаться к пользователю. Их я выбираю запросом, делаю цикл. И если бы не УФ, прямо в цикле обращался к пользователю ВвестиСтроку, и что он вводил (предлагал бы начальное значение типа "Вид дополнительный 1"...), записывал в справочник Присоединенные файлы (Номенклатура). А с УФ как? Допустим где-то на сервере создам список файлов с пустым описанием, верну его в форму номенклатуры. Далее буду их доставать по одному, и в процедуре &НаКлиенте буду делать ПоказатьВводСтроки, и в процедуре ПослеВводаСтроки буду писать результат ввода в описание файла. Только которому, сам Присоединенный файл можно через параметры передать? Это все ПоказатьВводСтроки, ПослеВводаСтроки можно не в форме делать, а где нибудь в общем модуле &НаКлиенте?
#27 by dezss
так ты хоть тз с клиентом согласовал? а то так будешь пилить всякие хотелки до второго пришествия.... По идее вообще все можно выносить в ОМ, но надо быть аккуратней с галкой ВызовСервера.
#28 by Mikhail Volkov
Меня смутило ЭтотОбъект в: А какой ЭтотОбъект в ОМ!?
#29 by Mikhail Volkov
+ Все конечно хорошо, но не разом же запрашивать описание для всех!? Как сделать, чтобы пока пользователь для 1-го не ввел описание, для следующего не запрашивала? &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) : : КонецПроцедуры &НаКлиенте                     НСтр("ru='Обнаружено дублирующее присоединенного описание у файла: %1
#30 by Cyberhawk
"А какой ЭтотОбъект в ОМ!?" // Отладчик в помощь
#31 by Mikhail Volkov
ОМ вообще не катит. Переделал фрагмент ПередЗаписью и в ПослеВводаОписания снова вставил Записать: В общем построил диалог по принципу вопрос-ответ. Еще надо-бы вместо ПоказатьВводСтроки что-то с картинкой, чтобы пользователь видел что описывает. Есть что-то типовое, или свою форму диалога лепить?
#32 by МимохожийОднако
Делай кнопку Записать недоступной, если проверку не проходит )) При закрытии закрывай молча. Эффективно
#33 by Mikhail Volkov
Кнопку ФормаЗаписать не пришлось менять. Вместо стандартной команды Записать сделал свою КомандаЗаписать: Свой реквизит НеЗакрыватьФорму добавил в форму, вставил его каждую проверку, например: &НаКлиенте         Если Открыта И Не НеЗакрыватьФорму И НеВыполнятьПроверкуАртикул И НеВыполнятьПроверкуНаименование И НеВыполнятьПроверкуНаименованиеПолное И НеВыполнятьПроверкуОписание Тогда Закрыть;    КонецЕсли; Вот только некрасиво получилось, что приходится перечислять все реквизиты "НеВыполнятьПроверку..." кроме (в данной проверке) НеВыполнятьПроверкуОписаниеИзHTMLФайла. Думаю заменить функцией НеВыполнятьПроверкуКроме(ИмяРеквизита). Как ее лучше сделать?
#34 by Злопчинский
Клиент обычно в тз не может ничего внятного сформулировать кроме того что сейчас у него перед мысленным взором стоит. А стоит у него перед мысленным взором обычно вполне конкретная фигня причём сама по себе без связи с другими хренями. Вот и думай что клиенту надо - когда он сказал про две педали - то ли велосипед, то ли автор с газом и тормозом
#35 by Злопчинский
я не спец, но имхо все равно фигня Где-то должен быть перечень легко настраиваемый, модифицируемый атрибутов грекам хитов которые подлежат проверке. Дальше по этому перечню смотрим все хорошо или плохо. Если плохо суем зверю сообщение с перечислением плохого и не лаем закрыть форму пока все не исправит.То бишь я поддерживаю Лефмихалыча и МимохожегоОднако
#36 by Mikhail Volkov
А в какой момент начать эту проверку если не ПередЗаписью? Хотел делать КаждыйРеквизитПриИзменении. Но эта проверка не обязательна, например, на наличии "неправильной" комбинации Рус/Лат в текстовом реквизите, возможно так и должно быть. Текстовый реквизит может заполняться копированием текста в буфер обмена из документации поставщика, и вставляться в каждый текстовый реквизит. Если скопированное содержит "неправильную" комбинацию Рус/Лат, то 4 раза будет задаваться один и тот же вопрос для каждого текстового реквизита.
#37 by Лефмихалыч
в обработке проверки заполнения!
#38 by Лефмихалыч
за последовательную проверку и последовательно отображение вопросов в приличном обществе канделябром по щам выдают...
#39 by dezss
чувак, не мучайся уже. Сделай мастер заполнения, чтоб кнопки далее и куртизанки. И на каждом шаге если что-то не так, спрашивай, а оно точно не так или так и должно быть.
#40 by Mikhail Volkov
А обработка проверки заполнения когда запускается? Да давно все прекрасно работает. Единственное нарекание от клиента, что по кнопке "Записать" форма закрывалась. Кнопку ФормаЗаписать не пришлось менять. Вместо стандартной команды Записать сделал свою КомандаЗаписать .
#41 by dezss
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>) ПроверитьЗаполнение (CheckFilling) Синтаксис: ПроверитьЗаполнение Возвращаемое значение: Тип: Булево. Истина - ошибок не обнаружено, Ложь - в противном случае. Описание: Проверяет заполнение реквизитов. Для реквизитов, у которых при конфигурировании свойство "Проверка заполнения" установлено в значение "Показывать ошибку" и реквизит не заполнен, будет сформировано сообщение об ошибке. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Примечание: Выполнение метода приводит к возникновению события ОбработкаПроверкиЗаполнения.
#42 by Лефмихалыч
у документа - перед началом транзакции проведения. У справочника - перед началом транзакции записи.
#43 by dezss
и при вызове функции ПроверитьЗаполнение
#44 by Mikhail Volkov
Т.е. ПередЗаписью
#45 by dezss
да ну открой же ты сп СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>) ОбработкаПроверкиЗаполнения (FillCheckProcessing) Синтаксис: ОбработкаПроверкиЗаполнения(<Отказ>, <ПроверяемыеРеквизиты>) Параметры: <Отказ> Тип: Булево. Если в теле процедуры-обработчика установить данному параметру значение Истина, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения. Значение по умолчанию: Ложь. <ПроверяемыеРеквизиты> Тип: Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам. Описание: Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение. Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
#46 by Mikhail Volkov
Достал уже, не нужно мне это убогое типовое решение . Давно все прекрасно работает, ответил в . Оставался вопрос по кнопкам, успешно решено. Тема закрыта.
#47 by Mikhail Volkov
+ > Кнопку ФормаЗаписать не пришлось менять. Вместо стандартной команды Записать сделал свою КомандаЗаписать Дык, теперь на форме две кнопки "Записать" (с дискетой). Пользователи жмут на 1-ю, старую, и форма закрывается!? Как ее убрать?
#48 by МимохожийОднако
Убери автозаполнение командной панели и добавь нужные кнопки
#49 by Лефмихалыч
раньше, чем ПередЗаписью. До начала транзакции
#50 by Mikhail Volkov
Нет галки "Автозаполнение" на командной панели!?
#51 by Mikhail Volkov
Набор кнопок на панели определяется набором команд. А команда Записать - стандартная. Ее ни как не убрать. Или можно как-то отключить, чтобы ее кнопка стала не видимой?
#52 by Mikhail Volkov
Стандартную "Записать" 1С гвоздями прибила, никак не убрать?
#53 by Mikhail Volkov
"Автозаполнение" галки нет, а кнопки есть. Где-то программно прописано, где?
#54 by Mikhail Volkov
Докопался, в свойствах формы Состав команд "Открыть", и снял галку с "Записать".
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С