1с только просмотр не срабатывает
Здравствуйте. Делаю в подписке на события проверку перед записью документа, получаю Отказ = Истина. После выхода из процедуры должна быть прекращена запись документа с ошибкой, но док. все равно записывается. Причем если записывать уже созданный документ, то все отрабатывает нормально. Кто сталкивался с такой проблемой? 1С:Предприятие 8.3 (8.3.5.1098)
Вообще-то НЕ определён. Нигде не декларируется их последовательность. Если есть конфиденциальная информация - поделись
Я говорю не про "ПриУстановкеНовогоНомера срабатывает ПОСЛЕ ПриЗаписи" я говорю в разрезе одного события. Если у вас много подписок на событие "ПередЗаписью" на один документ, то они будут выполняться в порядке их следования.
ну и в чем вопрос? отладчиком фигачь пока не дойдешь до места, где Отказ = Ложь. А лучше сразу просмотреть те подписки, которые ваши г.нокодеры наваяли.
Почитай целиком. Порядок выполнения подписок на события - не определён. Об этом явно написано много где, и обычно об этом говорят на курсах. Если ты в частном случае получил результат, который принял за истину - это твои персональные проблемы.
Порядок выполнения подписок на событие в рамках одного события объекта не определен. Об этом и на партнерских форумах неоднократно писали сами разработчики платформы и не на партнерских форумах кучу раз.
В общем есть подписки, в которых отказ переходит из одной в другую. Затем доходит до УстановитьПрефиксИнформационнойБазыИОрганизации(Источник, СтандартнаяОбработка, Префикс) - здесь видимо теряется значение "Отказ", далее ЗаписатьВерсиюОбъекта(Источник, Отказ) - здесь отказ уже ложь!
>> Делаю в подписке на события проверку перед записью документа, получаю Отказ = Истина. Уверен, что получаешь? В отладке доходил до этой строчки кода? >> Причем если записывать уже созданный документ, то все отрабатывает нормально. Может ты проверяешь реквизиты не в объекте, а в базе данных? Тогда всё сходится - при записи существующего документа в базе данных проверяемые реквизиты есть, а при записи нового документа в базе данных еще ничего нет и ты до строки Отказ=Истина не доходишь.
У меня все мои обработчики подписок начинаются с кода Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда Возврат;
Я полагаю, это связано с префиксацией. Уже записанные объект проходит проверку, т.к. не вызывается обработчик "ПриУстановкеНовогоНомера"
Верно ли что если среди последовательности выпроняющихся подписок на события, имеющих в составе параметр отказ выполняется событие, не имеющее этого параметра, то значение параметра слетает?
Решил протестить. Создал документ, сделал 2 подписки на события "ПередЗаписью" и одну "ПриУстановкеНовогоНомера". В первом обработчике поставил Отказ = Истина. Значение Отказ передается в вторую подписку. Как бы все нормально. Но после того как отработало событие ПриУстановкеНовогоНомера, значение Отказ "слетает", док проводится.
Проверил на другой базе - там после отработки обработчика "ПередЗаписью" и подписок "ПерезЗаписью" сразу выдается ошибка проведения. У меня почему то ошибка не выдается, а продолжают отрабатывать следующие события.
Там нет текста. Просто в первой подписке ПередЗаписью установил отказ = Истина. После отработки всех подписок ПередЗаписью запись должна быть прервана. но у меня она не прерывается. В ложь нигде не может устанавиваться, т.к. я создал новый документ и поставил на него 3 подписки.
не после всех, а на вторую подписку уже не должно входить. Посмотрите, может "отказ" по английски. Или Истина в кавычках. И почему маленькими буквами? Лучше возьмите и копипастом перенесите откуда нибудь.
" не после всех, а на вторую подписку уже не должно входить" - нет, на вторую подписку должно переходить, проверьте сами (в рамках одного события) Регистр не влияет. Все написано верно. В базе наверно косяк, делаю тестирование и исправление, может поможет
Таких проблем вообще никогда небыло, никогда не заморачивался. Ставил перед записью отказ = истина и все всегда отрабатывало. А тут вот заметил что перестало работать, причем именно в моей базе. Тестил в новой пустой базе - все ок.
но причина должна быть. Или есть еще подписки ПередЗаписью, про которые вы не знаете, или еще что-то.
О них невозможно не знать, я тестил на новом доке, сам создал подписки, ничего типового не использовал. Проверил поиском ссылок на объект(на всякий случай). Есть документ и 3 подписки. Все.
судя по моей практике однотипыне подписки выполняются в порядке расположения их в конфигураторе. не знаю может и неопределен, но работает все время во всех конфигурациях в порядке следования их в конфигураторе
там в подписке может вообще написано быть "ДокументСсылка". То есть на все документы распространяется. Причем тут ваш поиск?
Видел забавный глюк, как после такого обновления пропадал код в обработках, которые никто не трогал. Конфигуратор показывает, что текста модуля нет. Чистим кэш - текст появляется, как у Амаяка Акопяна.
Про ДокументОбъект не подумал, но врядли причина в этом. Т.к. есть 2 базы - рабочая клиент-серверная и локальная для разработки. В рабочей все норм работает, в "для разработки" глючит.
Как правильно настроить доступ только на просмотр конкретным пользователям, причем у каждого из них может быть доступ к разным совершенно объектам и что делать? может для каждого свою роль Только_На_Просмотр_Иванова, Только_На_Просмотр_Петрова и т.д. - да нет, конечно, это ж бред, не красиво - значит, не правильно! я вам расскажу про одну фичу как это сделать красиво, быстро и удобно! а главное без изменения конфигурации и ролей
Очень часто встречаю одну и ту же просьбу - сделайте права "Только на просмотр" и что только народ не придумывает - самое распространенное создают новую роль, или начинают что-то изобретать в общих модулях и т.д. В общем, насмотрелся, и решил, что раз тема актуальная, а нашего брата по поддержке 1С как селедки и надо делиться своими маленькими фишками. Ну, так вот, все на самом деле как нельзя проще простого:
1. Заходим в справочник "Группы пользователей" создаем группу с именем "Только просмотр" - имя можно придумать свое.
2. У каждого нашего пользователя кому надо "Только просмотр" настраиваем роли по уровню доступа к данным – собственно, что можно смотреть, а что нет. Это тут как у вас жизнь сложилась типовые роли или доработанные не важно.
3. Назначаем группе "Только на просмотр" наших горячо люб пользователей.
4. Заходим в БД в дату запрета редактирования данных и ставим на эту группу дату эдак год 2579 месяц и день по выбору
Готово теперь ваши клиенты будут видеть все, что им положено, а вот редактировать не смогут вот и все! Пользуйтесь! Просто, но не очевидно. Кстати я таким способом еще и аудитов в базе настраиваю.
Как правильно было замечено в коментариях, для справочников доступ останется. Но всетаки частично (не все справочники) можно решить данную проблему, используя механизм доступа к объектам назначив на нашу группу "Только просмотр", доступ на просмотр как показано на скриншоте (пример УПП) по тому или иному справочнику.
Эта статья написана с целью по возможности сократить излишнии доработки и использовать типовые механизмы.
Запускаем два сеанса.
про документы.
1. Открываем в одном сеансе форму, в коде которой отрабатывает Форма.ТолькоПросмотр(1);
Если во втором сеансе открыть форму аналогично - то фиг вам, "объект заблокирован"
2. Если во втором сеансе открыть лупой "просмотр документа" с панели инструментов - то норм, откроется.
.
получается что
в 1 - объект жестко связан с формой, объект блокируется, а форма сама по себе имеет флаг 1/0
в 2 - форма документа "оторвана" от объекта, объект не блокируется.
.
вот.
и еще есть режим ОткрытьФорму(Док,параметр,РежимОткрытия=1) - интересно в этом случае форма откроется по 1 или 2?
.
и как располагая контекстом формы открытой только на просмотр узнать - она открыта с блокировкой объекта или нет?
Стучаться в метод Блокировка().
Вопрос порожден написанием ВПФ, которая модифицирует реквизиты документа, в т.ч. лежащие на форме. ВПФ должна корректно работать в разных режимах, и когда в ВПФ передан ГрупповойКонтекст (и форма доступна и только на просмотр) и когда в ВПФ передан документ. В любом случае -на до изменить реквизиты документа. Если форма открыта - то в результате - показать измененную форму.
Открыта форма, только на просмотр. Как узнать в этом же сеансе - форма открыта с блокировкой или без?
.
вроде вот так работает:
Забодался, не получается.
.
Есть родительская форма документа открытая, только на просмотр
Как сделать так, чтобы открыть из ВПФ другую модальную обработку диалоговую, которая изменяет реквизиты исходного документа и показать форму родительского документа в режиме просмотра с уже измененными реквизитами
Формекс есть, 1С++ есть, можно переоткрывать обработки прочее. Должно по возможности все "прозрачно", без лишних морганий.
.
.
И еще вопрос - как программно открыть форму документа (и соотв.справочника тоже, один механизм наверное) - в таком же режиме, как открывается на просмотр с панели инструментов на просмотр "лупой".
(6) Как я понимаю, ты либо открыл на просмотр (лупой), либо на изменение - и тогда нет разницы есть ТолькоПросмотр() или нет.
Наверное, перехватывать при открытии формы, закрывать ее и после закрытия открывать ВПФ
(8) "ты либо открыл на просмотр (лупой), либо на изменение" - нет, есть еще третий вариант ОткрытьФорму(,,1) или в открытой форме Форма.ТолькоПросмотр(1) - и еть большая разница как открыто на просмотр - лупой или программно.
(8) "как программно открыть форму документа (и соотв.справочника тоже, один механизм наверное) - в таком же режиме, как открывается на просмотр с панели инструментов на просмотр "лупой".." - этот вопрос к проблеме с формадокумента+ВПФ не относится, это отдельный вопрос
а если нужно узнать заблокирован ли объект этой формой или какой-то другой, то да: "Стучаться в метод Блокировка()"
на счет побочного эффекта от Форма.ТолькоПросмотр(0) вот
(20) Вообще не понимаю зубоскальства к Чу.
За себя скажу: за 25 лет в семерке - дофига осталось черных зон, с которыми не разбирался в виду ненужности. Ещё больше серых зон, которые просто обходил стороной, где можно было обойтись: быстро сделал, все довольны. Плюс приобретённые серые зоны - 15 лет назад разобрался, а потом ни разу не пригодилось, вот и стёрлось.
"по лупе" - то же самое что ОткрытьФорму с 1 в параметре ТолькоПросмотр.
"показать измененный" - тупо ОткрытьФорму с 1 в параметре ТолькоПросмотр (если эта форма была открыта ранее - она переоткроется т.е. обновится в соответствии с данными и активизируется)
В результате с божей помощью. АнедейАндреича итд, по сущетсу разобрался. Все ожидаемо и логично.
Но есть один затык..
исходные условия теста.
- документ записан.
- открытая форма документа.
тест
1. ОткрытьФорму(,,0) + Форма.ТолькоПросмотр(1) - Объект заблокирован, только просмотр, ВПФ из контекста формы, изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - все ок, форма только на просмотр и реквизиты изменены. Все как хотелось.
2. ОткрытьФорму(,,0) - Объект заблокирован, форма доступна редактирование, ВПФ из контекста формы, изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - все ок, форма только на доступна на изменение, реквизиты изменены. все как хотелось.
2. ОткрытьФорму(,,1)+Форма.ТолькоПросмотр(1) - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
4. ОткрытьФорму(,,1) - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
5. Лупа "на просмотр" - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
6. Лупа "на просмотр"+Форма.ТолькоПросмотр(1) - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
итого: при изменении реквизитов контекста формы
- обновление реквизитов на форме (и в объекте) ПРОИСХОДИТ когда объект заблокирован, в пп.1,2 - то что надо
- обновление реквизитов на форме (и в объекте) НЕ происходит когда объект свободен, в пп.2-6 - это не устраивает.
Хочется, значит, в пп.2-6 - в ВПФ проверяем свободен ли объект- документ текущего контекста формы (это сумеем), и если объект-документ свободен -
тогда реквизиты объекта меняем не через контекст формы, а через объект (это тоже сумеем). ОК.
. Но после изменения объекта - хочется актуализировать отображение формы, открытой ранее на просмотр, для отображения изменившихся реквизитов.
И тут вот затык - сделать как из ВПФ переоткрыть форму в режиме просмотра?
И что важно - без правки типовой конфы?!
Всем спасибо, кто участвует.
Ёпрсту - по ссылкам знамо вестимо, но у себя не юзаю. Первое - потрому что блокирвоки на документах я уже не помню когда были, в оперативной работе это вообще несущественно. у мняе девки доки открывают на ввод редко, а если и открывают - то непересекающиеся друг с другом по сферам ответсвенности. И быстрый поиск - хотел впилить, даже пробовал, но тоже парктически неактуально ввиду отствуифя значительной ручной работы с ассортиментом
(22) ну, Добропом я по жизни, это на мисте Злопом. А добропом еще на ИС в районе 2008 г. была публикация учета черных бонусов в ppt,в финише слайдов добропом был.. ;-)
(31) что мешает в ПриОткрытии() влепить
Только, на сколько я помню, если в пофигураторе режим редактирования установить только на просмотр (всегда , без лупы) то ты её на редактирование ужо никак не откроешь
(34) ээээ, не втыкаю.
я хочу из DGA - закрыть форму материнского (для ВПФ) контекста (форма документ ана просмотр) и из ВПФ же открыть эту материнскую форму чтобы увидет сделанные изменения.. - как?
(35) не, он тогда по энтеру будет на просмотр открываться, а через шифт+энтер - на редактирование. я так кстати и делаю у ларечников часто. сразу уходить несколько проблем с задним числом.
Да и в 7.7..обычное дело было, для изменения реквизитов дока, открывать тупо форму обработки, которая эммулирует форму самого дока и потом через ссылку дока правит его реквизиты.
Если ты хочешь делать это через контекст открытой формы, то ничто не мешает хранить хоть все значения атрибутов формы где-то еще при открытии впф, потом измененные значения пихай куда угодно, старый контекст закрой, открой новую форму с нужным режимом и перекопируй все атрибуты туда.
(41) "старый контекст закрой, открой новую форму" - ТУТ МНЕ НУЖЕН ТОТ ЖЕ САМЫЙ ОБЪЕКТ-ДОКУМЕНТ-" с нужным режимом " - ну и как это сделать при вызове DGA из "старого контекста". где-то туплю, не получается - потому как форма старого контекста закроется (ДокумКонтекст.Форма.Закрыть()) только тогда, когда ВПФ завершит работу процедуры ПриОткрытии(), а переносить код в после открытия чтобф моргало ченить ненужное на экране - не хочется
(31): ". Но после изменения объекта - хочется актуализировать отображение формы, открытой ранее на просмотр, для отображения изменившихся реквизитов. " -- так уже ж отвечено! см.(28), 2-й абзац.
в сухом остатке:
(46)+: именно так - ничего не надо закрывать, тупо такое же ОткрытьФорму - обновление ранее открытой формы без блыманий и с обновлением.
(0) Бегло прочитал, но так и не понял суть проблемы (может потому что прочитал бегло ;) ).
У меня в ВПФ fr54_ПечатьЧека.ert (у тебя она есть) делается примерно так:
Если передан Контекст, то автоматически обновятся данные на форме документа без всяких "переоткрытий" и "блымканий".
Но в типовой ТИС есть косяк для документа Реализация при передаче данных в ВПФ - вместо Контекст передается ТекущийДокумент() и поэтому возникает блокировка при попытке записать данные через ВПФ в текущий документ.
Решается так (у меня описано в ИзмененияДляКонфигурацииTIS987_54FZ.txt):
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в версии 8.3.21
В версии 8.3.21 мы сделали ряд доработок, призванных сделать взаимодействие системы с пользователем более удобным для пользователя.
Помощь пользователю при ошибке при входе в систему
Если ошибка произошла при входе в систему, пользователю можно будет показать дополнительную информацию, которая сможет помочь ему решить возникшую проблему:
Ссылка на ресурс с информацией (например, на сайт, где описаны способы решения возникшей проблемы)
Ошибки, возникающие при входе в систему – одни из самых непростых в обработке. Такие ошибки, в частности, могут возникать из-за недоступности сервера 1С, и, значит, в этот момент с сервера нельзя получить данные о том, какую информацию показать пользователю. Поэтому описанную выше информацию можно записать для каждой базы в файл списка баз *.v8i – при неудачном входе в систему информация будет считана из этого файла (при доступности файла) и показана пользователю.
Есть варианты работы, когда файлы *.v8i недоступны – работа в облаке, удалённая работа и т.п. Поэтому эту информацию также можно настроить через стандартную обработку «Управление настройками отображения ошибок» (параметры «Текст помощи» и «Навигационная ссылка помощи») и сохранить в инфобазе. Если с клиента уже был ранее осуществлен успешный вход в систему – эти параметры считываются с сервера и кэшируется на клиенте.
Если клиент успешно связался с сервером и считал актуальные значения параметров «Текст помощи» и «Навигационная ссылка помощи», но далее при работе системы возникли проблемы при соединении с сервером – в диалоге попытки повторного подключения будут использованы последние считанные значения параметров.
Обратите внимание! Информация, записанная в файле *.v8i, и настройки параметров «Текст помощи» и «Навигационная ссылка помощи» - независимы друг от друга. В случае, если доступен файл *.v8i, но недоступен сервер 1С и на клиенте нет закэшированных значений параметров «Текст помощи» и «Навигационная ссылка помощи» – пользователю будет показана информация из файла *.v8i, в противном случае – информация из параметров «Текст помощи» и «Навигационная ссылка помощи».
Настройки подключения к базе
В файл списка баз (*.v8i) в свойства базы добавляется параметры:
StartupErrorHelpText (строка) – текст, отображаемый в диалоге ошибки до начала сеанса или диалоге попытки повторного подключения
StartupErrorHelpURL (строка) – ссылка на ресурс с информацией
Тонкий клиент
Проверьте сетевое соединение
Проверьте, что параметры подключения указаны верно
Если проблема возникла уже после начала работы с системой - на форме повтора попытки соединения с сервером отображаемый текст будет таким же, как и на таблице вверху, а полный текст можно посмотреть, нажав на ссылку «Показать подробности…».
Веб-клиент
При невозможности связаться с веб-сервером в браузере будет отображена страница с информацией об ошибке подключения, текстом, заданный в настройках, и текстом, полученным из запроса на адрес сервиса информации (т.е. фактически с той же информацией, что и в тонком клиенте):
Это будет работать при соблюдении нескольких условий:
На веб-сервер уже был осуществлен удачный вход из браузера (для кэширования на клиенте страницы, показывающей информацию об ошибке)
Браузер должен поддерживать технологию service-workers
Про сервер обработки ошибок при запуске
Выше мы упомянули параметр «Адрес сервиса обработки ошибок при запуске».
Если этот параметр задан, то при ошибках запуска по этому адресу клиент 1С сделает запрос дополнительной информации. А по этому адресу можно настроить веб-сервер, который будет отдавать более подробную информацию о текущей ситуации - информировать пользователей при возникновении неожиданных аварийных ситуаций и / или недоступности сервера и т.п. Например, можно отобразить пользователю текст “Мы уже работаем над проблемой. Работа сервера возобновится после 14:00”.
Для поддержки это сценария можно реализовывать совсем простой вариант: просто положить JSON-файл в папку и настроить веб-сервер (Apache, nginx, IIS) на отдачу этого файла. При возникновении проблем на сервере можно вписать в этот файл необходимый текст (userMessage) и настроить время, до которого этот текст будет отображаться на форме (в нашем примере – до 14:00).
Можно реализовывать и более сложные сценарии – например, отправлять информацию об ошибках при входе в систему на внутренний сервис техподдержки организации.
Отчет об ошибке
При формировании отчета об аварийном завершении добавляется возможность показа окна “О программе”.
Добрый вечер. УПП, пл. 8.2.16.368.упр.формы. Такая проблема: Есть табличная часть документа. В ней блокированы некоторые ячейки(Элементы.МояТЧ.ПодчиненныеЭлементы.МояТЧДата.Толькопросмотр = Истина) . При использовании данной блокировки не срабатывает функция табличной части ПриНачалеРедактирования.Я хочу при копировании строки поменять реквизит скопируемой строки табличной части. В чем прикол.
перед началом добавления не даст возможность изменить реквизит будущей добавленной строки, так как срабатывает перед добавлением
к примеру, пишу в &НаКлиенте Процедура МояТЧПередНачаломДобавления(Элемент,Отказ,Копирование,Родитель,Отказ) КонецПроцедуры Результат изменит текущее заполнение, так как будущей строки ещё НЕТ
а ПриНачалеРедактирования должен сразу отработать после добавления. ПриНачалеРедактирования(Элемент,НоваяСтрока, Копирование) <НоваяСтрока>Тип: Булево. Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована. Тип: Булево. Определяет режим копирования. Если установлено Истина, то происходит копирование строки.НоваяСтрока>
Даже если я непишу Элементы.МояТч.ТекущиеДанные.МойРеквизит ничего не поменятеся, так как строки ещё нет
а процедура ПриНачалеРедактирования привязана к какому-нибудь событию? Или просто так в воздухе висит?
Синтаксис: ПриНачалеРедактирования(<НоваяСтрока>, ) Параметры: <НоваяСтрока>Тип: Булево. Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована. Тип: Булево. Если данный параметр имеет значение Истина, то выполняется копирование строки. Описание: Возникает при начале редактирования старой или добавленной строки табличного поля. В процедуре - обработчике события нельзя отказаться от редактирования, но могут быть выполнены действия, необходимые при вводе новой строки, например, установка начальных значений. Примечание: Возникает, если редактирование производится непосредственно в табличном поле. Перед данным событием возникает событие ПередНачаломИзменения. См. также: ТабличноеПоле, событие ПередНачаломИзмененияНоваяСтрока>
ввобще-то я пример к функции привел ПередНачаломДобавления в . ПриНачалеРедактирования я и использую. Но возникает проблема описаная в
в суть в том, что когда заблокирована любая ячейка табличного поля (только просмотр = истина), то не заходит при копировании в процедуру ПриНачалеРедактирования
Читайте также: