Как убрать модифицированность объекта 1с
Задача: В "1С:Управление торговлей 11" (релиз 11.06.7). В форме документа счет-фактура выданный аванс заполнить табличную часть Авансы на основании документа поступление безналичных денежных средств.
1) Перед заполнением табличной части документа получить от пользователя подтверждение на это действие;
2) Обработку создания документа сделать внешней и подключаемой к форме документа счет-фактура на аванс выданный;
3) После заполнения табличной части не записывать документ, а разрешить пользователю продолжить редактирование изменной табличной части или самостоятельно записать документ.
Пункты 1 и 2 не представляют особой сложности, но пункт 3 заставил меня задуматься и написать, по-моему мнению, топорный, но исправно действующий код.
Понятно, что от нас требуется создать внешнюю обработку вида "ЗаполнениеОбъекта" и подключить её в информационную базу.
Приведу код в модуле обработки:
Так как нам придется работать с формами объектов, мы просто вынуждены использовать метод ВызовКлиентскогоМетода для вызова команды внешней обработки.
Напомню, при использовании ВызовСерверногоМетода с формами объектов работать не получится.
Подробнее о типовых принципах создания внешних подключаемых обработок и печатных форм вы можете почитать здесь.
Так как мы использовали ВызовКлиентскогоМетода, то обязательную процедуру, для внешней подключаемой обработки заполнения объектов, ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт, необходимо выполнять &НаКлиенте в модуле формы обработки, а значит создадим любую форму обработки, пользователь её всеравно не увидит, и поместим внутрь модуля формы следующий код:
Ниже приведу код, который у вас может быть совершенно другим и делать какие-либо другие манипуляции с объектом формы:
Как можно заметить, представленное решение заполнения объекта из внешней подключаемой обработки с отображением изменений до записи объекта не является изящным, но другого способа мне найти не удалось. В Интернетах на эту тему тоже очень мало информации.
Поэтому если есть другое решение поставленной задачи, то обязательно сообщите о нем.
Заполнение табличной части документа счет-фактура на авансСпециальные предложения
(1) Не разбираешься, не лезь. И описывать различия не требуется, кто в теме, в курсе.
Разница такая, что в этой статье описана методика заполнения объекта (аналог из УПП 1.2 или УТ 10.3 - заполнение табличных частей), а в другой - описание создания связанных объектов или ввода на основании.
Статья полезная, сам думал, как бы это сделать пооптимальней. Намудили Намудрили разработчики с БСП.
а во втором ЗаполнениеОбъекта
в принципе задача то одна, а вот решения разные. Обратил внимание на ВыполнитьКоманду В данном контексте читать как "Результат один"
Понимаю, что основной задаче для автора является ее реализация.
полностью согласен. БСП еще допиливать и допиливать
(0) Автор, все еще жду ответа и исправления в описании!
(3) 1. Будь вежливее.
2. Цель моего предложения в (1) - автор ДОЛЖЕН расписать отличие одной обработки от другой, чтобы пользователь сайта, который не разбирается в этом (а ведь статья именно для таких пользователей! ), мог понять отличие и назначение каждой статьи.
Если ТЕБЕ эта моя цель непонятна/недоступна, это твои проблемы!
Уважаю тебя за твои работы, но здесь ты неправ.
ЗЫ На будущее - Не лезь и не обсуждай работу Модераторов.
Ляль Дикий; echo77; 1c.pro.fun; Lyolik; copperfox; pipetkabeatboo; www2000; altimait; + 8 – 3 ОтветитьРазница публикаций очевидна из их названия.
Поясню:
1) Создание связанных объектов
2) Заполнение объекта
Задачи поставлены разные.
1) Создать документ счет-фактура выданный аванс на основании документа поступление безналичных денежных средств
2) В форме документа счет-фактура выданный аванс заполнить табличную часть Авансы
Частично одинаков код модуля обработок, он приведен на тот случай, если человек не делал до этого внешних обработок на управляемом приложении и читает публикацию по этой теме впервые.
Я мог конечно написать только суть и даже не публиковать обработку, но тогда по собственному опыту скажу, что были бы только вопросы и плевки в мою сторону, особенно у новичков.
TaTaPuH-Magic; taasha25; baracuda; KarV; svartemov; drcrasher; Denizzz; Поручик; + 8 – Ответить (10) Успокойся, здесь люди всё таки адекватные, статью не удалят.Это две разные публикации о разных задачах. Заявляю, как человек постоянно с прошлого года работающий с УТ 11 и вообще с БСП.
- это вполне может быть, здесь полно таких, вот я, к примеру. Поэтому Вам предложили только более понятно описать, о чем материал в статье, чтобы нам, "чайникам", было понятно. Удалять статьи никто не собирался. Подскажите можно ли как то делать отладку внешней подключаемой обработки?
И как какая тут последовательность надо вначале создать документ "счет-фактура выданный аванс" потом выбрать у него в основание "поступление безналичных денежных средств" а потом нажать заполнение? Хм, а если после выполнения обработки при любой попытке изменить реквизит или просто сохранить пишет «Ошибка блокировки объекта. Объект уже заблокирован <наименование сеанса>» ? Разобрался.
Опа, нет ещё.
Короче, нифига не выходит с заполнением формы без сохранения данных в объекте: форма заполняется - но больше с ней ничего не сделать: «Ошибка блокировки объекта. Объект уже заблокирован». Пришлось в серверной процедуре записывать объект с помощью ДанныеФормыВЗначение. Пытался прикрутить к УТ 11.0.6.7 заполнение графы «Основание» в ПКО описанием документа-основания ПКО. как обойти «Ошибка блокировки объекта. Объект уже заблокирован», подскажите оч надо Кстати, а зачем обработка заполнения ТЧ счета-фактуры на аванс?
На мой взгляд правильней заполнять с/ф в обработке формирования с/ф на аванс.
Кстати, а зачем обработка заполнения ТЧ счета-фактуры на аванс?
На мой взгляд правильней заполнять с/ф в обработке формирования с/ф на аванс.
Это лишь пример реализации интерактивного заполнения ТЧ. Можно было бы заполнять другую ТЧ, но суть решения не изменилась бы.
Хм, а если после выполнения обработки при любой попытке изменить реквизит или просто сохранить пишет «Ошибка блокировки объекта. Объект уже заблокирован <наименование сеанса>» ?
Верно подмечено. Разбираюсь в этой проблемой в данный момент.
?Не хочу троллить, но автор сам пользовался этой обработкой? Сталкнулся с проблемой когда созданная внешняя обработка по загрузке прайса из XLS в док заказ клиента - выдавал в документе что он заблокирован, и в результате после заполнения таблич части документа нельзя было его не записать не сохранить - это безусловно баг УТ 11 и пофиксят непонятно в каких релизах потом - но проблема осталась!
Короче, нифига не выходит с заполнением формы без сохранения данных в объекте: форма заполняется - но больше с ней ничего не сделать: «Ошибка блокировки объекта. Объект уже заблокирован». Пришлось в серверной процедуре записывать объект с помощью ДанныеФормыВЗначение. Пытался прикрутить к УТ 11.0.6.7 заполнение графы «Основание» в ПКО описанием документа-основания ПКО.
Вопрос блокировок конечно очень обширный, поэтому я хотел бы для себя разобраться для начала в каком то одном частном вопросе. А именно как работает свойство БлокироватьДляИзменения у набора записей в 8.2 в управляемом режиме (SQL). Если для предыдущих версий платформы все достаточно понятно, так например:
Для 8.1 (Автоматический режим) ответы будут следующие:
1) Когда читаются данные, которые необходимо изменять в текущей транзакции необходимо в запросе указывать "ДЛЯИЗМЕНЕНИЯ"
2) Блокировка накладывается в момент выполнения запроса, диапазон блокируемых данных определяется условиями в запросе.
3) Блокируется запись, а так же чтение другими транзакциями, запросы которых используют директиву "ДЛЯИЗМЕНЕНИЯ"
Для 8.1 (Управляемый режим)
1) Когда читаются данные которые необходимо изменять в текущей транзакции нужно установить исключительную блокировку, когда необходимо просто обеспечить неизменность прочитанных данных - разделяемую.
2) Блокировка устанавливается явно, методом Заблокировать() блокируемые записи так же явно указываем в коде.
3) Разделяемая - запрещает запись, Исключительная - Чтение и запись
Для 8.2 (Управляемый режим) в принципе верно тоже что и для 8.1 (Управляемый),
но это если использовать старую методику - сначала контроль остатков, потом проведение.
Как действовать при новой методике, непонятно. ответ судя по всему кроется в понимании принципов работы этой самой "БлокироватьДляИзменения"
я так думаю нужно переделать в обработке каркас а именно это
Форма = ОткрытьФорму("Документ.СчетФактураВыданныйАванс.Форма.ФормаДокумента",КлючПоиска. Окно);
//Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную
//В объекте содержатся все реквизиты (элементы) формы
НовыйОбъект = Форма.Объект;
Признак модифицированности у формы
Для сигнализации пользователю о том, что данные, отображаемые формой, были изменены, у формы существует признак модифицированности. При взведении данного признака в заголовке формы отображается символ *. Данный символ сигнализирует пользователю, что данные были изменены, и их необходимо сохранить.
Признак модификации формы взводится системой в следующих случаях:
- Изменение объекта, являющимся значением основного реквизита формы. Это изменение может быть произведено интерактивно с помощью элемента управления связанным с реквизитом объекта или программно.
- При изменении данных или отработке события элемента управления, у которого взведен флаг "изменяет данные".
Признак модифицированности формы сбрасывается системой при наступлении одного из следующих событий:
- Измененный объект, являющийся значением основного реквизита формы, был успешно записан.
- При открытии формы после события ПередОткрытием() формы, но перед событием ПриОткрытии() .
Флаг модифицированности сбрасывается после события ПередОткрытием() формы, но перед событием ПриОткрытии() , так как при открытии формы нового объекта или уже записанного пользователь ожидает, что состояние данных не являются измененными. Если для нового объекта нужно дополнительная его инициализация перед редактированием в форме, то ее можно произвести в обработчике события формы ПередОткрытием() . В этом случае признак модифицированности не будет взведен у формы, как того и ожидает пользователь. Если же нужно внести исправления в объект при открытии формы, которые должны отразиться на признаке модифицированности, то это следует произвести в обработчике события формы ПриОткрытии() .
Кроме автоматического взведения и сброса флага модифицированности системой, разработчик может управлять признаком модифицированности формы посредством свойства формы Модифицированность. Данная модель, с одной стороны, не требует от разработчика дополнительных усилий для поддержки стандартной функциональности редактирования объекта с помощью формы, с другой стороны, предоставляет полный контроль над признаком модифицированности формы.
Такая ситуация: при проведении документа создается новый элемент справочника , и заполняется этим новым элементом реквизит документа. При этом документ получает признак модифицированности и начинает выдавать диалоги типа Документ изменен Сохранить ? и типа Как провести Оперативно или Неоперативно ? Хотелось бы избавиться от лишних вопросов к пользователю. Вот думаю все дело в модифиуцирванности документа после золнения реквизита документа в обработке проведения. Подстажите как сделать так что б 1С ка считала что документ не изменялся ?
>>>> при проведении документа создается новый элемент справочника За такое лучше отрубать руки. Делай в ПриЗаписи.
Нет надо что бы при проведении что б лишних элементов в справочнике не плодить т.к. проводиться 2 документа из 20. Да и за что тут руки отрывать не пойму
сделать никак, ищи другие способы,считаю грубой ошибкой когда после одной записи нужна еще одна, лучше обоснуй что хочешь сделать, а варианты реализации тебе подскажут.
реквизиты документа заполняются по результатам проведения документа, в чем грубая ошибка?
Задача такая нужно что б при проведении документа в справочнике появлялся элемент который хранит в себе значенния из документа и по этому элементу тут же формируются движения по регистру и заносятся данные в КритерииОтбора . Но при проведении лишних диалогов вопроса не должно выдаваться. Как это можно реализовать по другому ?
почему никак? В правильно: просто ставишь команду Записать без параметров. Будет повтор процедур ПередЗаписью и ПриЗаписи но это можно проконтролировать.
Просто если удалить документ у меня есть еще процедурка ОбработкаУдаления документа которая проверяет есть ли по этому элементу еще какие нить документв если нет то удаляет его непосредственно Удобно было прям по реквизиту документа делать запрос к КритериюОтбора и проверять есть по нему еще документы кроме текушего или нет. Есть выход - щас только в голову пришел :-) - создавать элемент справоччника но не пихать его в реквизит а просто двигать его по регистру , но не знай попадет ли тогда этот документ в КритерийОтбора
Не попал в КритерийОтбора даже если в документе есть движение по этому элементу
Короче остался только вариант с записью в обработке проведения Вроде прокатывает но что то это мне этот вариант не очень нравиться
+1 у меня тоже таких документов несколько, где изменяется модифицированность.. решение В модуле объекта объявляешь переменную а когда тебе надо снять модифицированность пишешь: Если Модифицированность Тогда и во все процедуры: ПриЗаписи,ПередЗаписью и т.п. вставляешь условие: Если Не СнятьМодифицированность Тогда . в итоге получаешь повторную запись документа(что плохо), но зато не будут делаться никакие повторные вычисления и движения. ps. лучше избегать таких ситуаций.
Читайте также: