Проверить режим записи документа 1с

Обновлено: 04.07.2024

(14) еще раз пишу для непонятливых:
Во внешней обработке:
В модуле объекта ДОКУМЕНТА:

(11) при обмене устанавливается автоматом, но никто не мешает вставить установку флага в программу перед записью.

если писали не криворучки, то в подписке первым делом должно стоять отключение по этому флагу всех действий.

(11) и что? По сути это такое же доп. Свойство, но в отличие от от них, на него уже есть реакция в объектах типовых
(16) Получается без вмешательства в конфу не получится. эх а так хотелось
Сдается мне, что там даже при обмене данными формы вылетают
Получится, если типовая и выставить обменданными.загрузка в истину в модуле обработки перед вызовом метода записать() объекта
(21) а что там за форма. ты процедуру покажи. Может форму эту мона обойти
(24) я довольно часто применяю этот способ для обхода типового кода.
+ (29) все этот метод используют постоянно потому что он всем известен и работает

(27) фига се, проверил сейчас, действительно истина.

Откуда у меня взялся стереотип, что программно это свойство не установить?

(33) Фига себе, пятница, почти полночь и ты полез в конфигуратор 1с проверить какую то фигню!
(33) мы не знаем. Объективных предпосылок для того чтобы так думать нет. Более того, например типовая обработка выгрузказагрузкаданныххмл82.епф, которая используется всеми для адресного восстановления объектов и записей регистров из бэкапов, дает выставить это свойство специально, чтобы не выполнялись проверки при записи при загрузке восстанавливаемого объекта
перед
Объект.Записать(РежимЗаписиДокумента.Проведение)
(36) а может вы лукавите и раньше (в другой платформе или релизе) ОбменДанными.Загрузка был доступен только для чтения?
(40) Нет. Более того, мне кажется что это свойство выставлялось всегда исключительно только программнр
(41) не, в при обмене через планы обмена, система его устанавливает в ИСТИНА

(38) в обработчике перед записью, перед открытием вашей формы, должен быть код анализа, как в (16)

(41) нет, в случае обмена с использованием плана обмена оно выставляется движком

(39) тема себя исчерпала, у вас есть все предпосылки чтобы решить проблему.
(47) а если распределенная база, то свойство ОбменДанными тоже доступно не только для чтения?
(47) что может значить эта ошибка:
Действие не может выполняться в режиме загрузки данных
?
(49) у тебя в БД есть план обмена с галкой "распределенная информационная база"?
(51) обработка, случайно, не запускает обмен по этому плану обмена?
(50) те планы обменами, которые для этого документа отмечены без установленного значения Распределенная ИБ.
(52) Короче тут, такая история я не программист 1с, я в поддержке сижу знаю чуть больше других юзеров. и вот наши программисты внесли в конфу некторые изменения, после которых документ перестал создаваться через эту обработку из-за того, что они вызывают модально некоторую форму. я просто хочу 1с-ку изучить вот и решил попытаться обработку изменить, не трогая конфу.
(54) покажи код, которым ты изменяешь документ в обработке

(49) > Действие не может выполняться в режиме загрузки данных

Говорит о том, что что-то написано такое, что не поддерживается Когда свойство ОбменДанными.Загрузка установлено в значение Истина

+(57) Скорее всего это в конфигурации написано.

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

Таких увольнять сразу надо, если они с серьезными вещами работают.

(56) процедуру ПередЗаписью не смогу показать она очень огромная и тем более конфа далека от типовой.
документ я создаю следующим образом:
(58) ну, ни мне судить как и что. мне бы научиться, что бы жену и дочь что бы прокормить

Если есть, то оно до открытия формы расположено?

(59) если при выполнении этого кода появляется модальное окно - то гнать этих недоделанных прогов студентов до самого заднего задищенво.

короче пишешь докладную и ссылку на эту ветку.

(59) зачем ты приводишь код в котором нет ошибки? Тебя ведь просили привести код при или перед записи, потому что именно там написано то .авно, которое портит тебе жизнь
(64) прошу прощения, но я не могу этот код скопипастить сюда.
(64) думаю, что у него следующее:
при установленном свойстве ОбменДанными=Истина не может открыться модальное окно той копрокодерской формы и вываливается ошибка "Действие не может выполняться в режиме загрузки данных "
(48) что?
А ты можешь привести пример хоть одного свойства которое вдруг перестает быть доступным для чтения в зависимости от такой эфемерной сущности как план обмена, его наличия и наличия хотя бы одного узла в таких планах обмена, и хотя бы приблизительную причину почему такое могли сделать разработчики?

(68) мне все покоя мысль не дает, откуда я взял, что это свойство только для чтения :)

(66) ты так говоришь, как будто это мы вынудили тебя создать топик на форуме в котором ты у нас спрашиваешь как решить твою проблему.

Нет, это не мы. По прежнему у тебя уже есть все предпосылки чтобы ее решить, ничего нового написано не будет, только перелив из пустого в не более полное

(66) ты на вопрос ответь, что я тебе задавал.
В той процедуре, где форма открывается, есть строка

УПП 1.3.99.1
Здравствуйте, подскажите. В событии при записи прописываю код, который производит определенные манипуляции, но он должен это делать ТОЛЬКО ПРИ ПРОВЕДЕНИИ, если документ просто записывают, код отрабатывать не должен.
Подскажите, как это сделать? Ссылка доступна как при проведении, так и при записи, само событие вызывается как при проведении так и при записи. Даже не знаю, куда копать.

Так делай свои дела в обработке проведения, в чём проблема?

но ПриЗаписи если, пиши сразу в ОбработкеПроведения
ну или ПередЗаписью сохрани РежимЗаписи в доп.свойства и анализируй.

(3) А ДополнительныеСвойства сделать отдельным реквизитом к документу что ли?

(2) "пиши сразу в ОбработкеПроведения" // С какого-то момента изменять объект в обработке проведения уже нельзя - изменения не запишутся в БД

(1) Нужно в форме при записи т.к. код вносит изменения в документ, если он новый и проводится впервые.

(6) В ПРиЗаписи вносить изменения в документ - за такое я бы обрывал руки и странички в трудовой книжке.

Уже нашла способ, всем спасибо. Забыла вообще посмотреть событие "Перед записью" там все есть. Видимо не выспалась.

(9) В форме - проводить только по кнопке Ок, куда вписать свой код .Записать(РежимЗаписиДокумента.Проведение)
(11) протягивай руки. А то ноги протянешь ))

Схожая проблема: как узнать какую кнопку нажал пользователь: ОК или Записать?

(14) В модуле ПриЗаписи есть параметр РежимЗаписи и РежимПроведения. Используй их)))

(15) и если у документа стоит проводить при записи, то что ты там увидешь ?

(5) >> С какого-то момента изменять объект в обработке проведения уже нельзя

Интересно с какого? После завершения процедуры ПриЗаписи уже нельзя менять объект.

(18) Объект при записи (проведении) не меняю, но пока, чтобы форма не закрылась, ставлю Отказ = Истина; Этот Отказ не отменяет проведение документа? Как еще можно отменить закрытие формы, если нажата ОК?

(19) Если нажата кнопка Провести и закрыть, находясь в Обработке проведения нельзя отменить закрытие формы, только отменить проведение документа.

Хотя может можно в модуле формы в клиентском методе ПослеЗаписи, но не уверен.

(18) В УФ это никогда не работало, а в ОФ это всегда работало, но до относительно недавнего момента (какой-то платформы издания 8.3)

Тема просто кладезь.
Сколько полезных советов для говнокодеров.

Проверка изменения данных при записи объектов

В некоторых случаях при записи объектов возникает необходимость проверки, какие данные объекта были изменены и какие были значения до изменения.

Допустим, при записи документа, может возникнуть потребность проверить, не изменилась ли дата документа, и если дата изменилась, то откорректировать движения документа, которые не обновляются при его проведении (например, вводятся вручную).

На первый взгляд видится возможность запомнить старое состояние реквизита в переменной модуля объекта, анализировать его при записи документа, и соответственно при записи запоминать новое значение для анализа в процессе следующей записи. Однако этот метод является неправильным. Дело в том, что запись объекта происходит в транзакции. Соответственно, тот факт, что данные записаны, еще не означает, что они действительно будут изменены в базе данных. Разработчик прикладного решения не имеет возможности обработать успешное или неуспешное завершение транзакции. Соответственно нет возможности и обеспечить хранение в модуле значения реквизита адекватно соответствующего тому значению, которое хранится в базе данных.

Правильным способом реализации такой проверки является считывание значений тех реквизитов, изменения которых нужно анализировать, непосредственно из базы данных.

Например, считывание может быть выполнено обращением через ссылку:

Однако следует учитывать, что при обращении к ссылке считывается весь объект целиком. То, что он ранее считывался и находится в кеше, здесь не поможет, так как при работе транзакции используется отдельный кеш. Соответственно, затраты на получение одного или двух реквизитов могут оказаться неоправданно большими. Поэтому можно рекомендовать для считывания отдельных реквизитов использовать запросы. Например:

В этом случае из базы данных будет считан ровно один реквизит, который требуется анализировать.

Заметим, что таким способом можно, например, определить, что объект помечается на удаление. Для этого достаточно проверить, изменение поля ПометкаУдаления .

Однако если нам нужно обработать изменение реквизита после записи документа, например, в обработчике ПриЗаписи , то, разумеется, считывание данных из базы данных не подходит, так как информация в базе данных уже изменена. В этом случае нужно само считывание выполнять в обработчике ПередЗаписью и запоминать считанные значения в переменных модуля. А уже анализ выполнять в обработчике ПриЗаписи .

Запись и проведение документа в форме

Для понимания особенностей записи и проведения документа в форме следует, прежде всего, разделять особенности записи самого объекта ( ДокументОбъект ) и особенности работы расширения формы. Расширение формы документа действует, если основной реквизит формы имеет тип ДокументОбъект . Оно обеспечивает специфическую функциональность формы при редактировании и записи документа. Задача расширения заключается в реализации удобного для пользователя поведения формы. Но собственно запись и проведение документа выполняет, разумеется, объект, являющийся реквизитом формы. Расширение документа обрабатывает различные команды пользователя, выполняет предварительные проверки и другие сервисные действия, а затем вызывает запись объекта. Запись объекта выполняется так же, как и если бы она вызывалась средствами встроенного языка. То есть с точки зрения объекта запись в форме и запись средствами языка ничем не различаются. Таким образом, расширение обеспечивает некоторую сервисную функциональность, обращаясь в конечном итоге к функциональности объекта. Следует учитывать, что расширение формы действует, только если используются механизмы формы и не действует, если выполняется обращение непосредственно к объекту. Например, если вызвать метод Записать() у объекта ДокументОбъект , то никакие действия расширения формы не будут выполняться. Чтобы они выполнялись нужно вызывать метод ЗаписатьВФорме() .

Далее мы рассмотрим те сервисные действия, которые обеспечивает расширение формы документа. В данном разделе, мы опишем только те действия, которые специфичны именно для расширения формы документа и не будем касаться общих действий, которые поддерживаются расширениями всех объектов.

Установка даты документа

При открытии формы нового документа, если дата документа не установлена (равна значению типа Дата по умолчанию), то документу устанавливается рабочая дата. Следует заметить, что используется именно рабочая дата, а не текущая (если не установлено использование текущей даты в качестве рабочей). Это дает возможность пользователю настроить рабочую дату так, чтобы новые документы вводились определенной датой. При этом в качестве даты устанавливается начало дня (дата без времени), даже если в качестве рабочей даты выступает текущая дата. Но если свойство АвтоВремя имеет значение НеИспользовать , и рабочая дата равна текущей, то устанавливается текущая дата, вместе со временем. Таким образом, для варианта АвтоВремя = НеИспользовать при открытии берется рабочая дата (если она отличается от текущей) или текущая дата вместе со временем, а для остальных вариантов установка времени откладывается на момент записи документа.

При записи нового документа в форме если свойство АвтоВремя имеет значение отличное от НеИспользовать , и не используется оперативное проведение, и время документа пустое (0:00:00), то выполняется автоматическая установка времени на основании значения свойства АвтоВремя . Действие расширения формы в этом случае аналогично вызову метода УстановитьВремя() с вариантом выбранном в свойстве АвтоВремя и с использованием журналов документа.

Расширение формы так же предоставляет команды для установки времени документа в начало дня, конец дня, перед предыдущим и за последующим документом.

Установка режима записи

При нажатии кнопки " ОК ", если для документа в метаданных разрешено проведение, документ записывается в режиме проведения.

Кроме того, расширение формы предоставляет две отдельные команды для записи с проведением и записи с отменой проведения.

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

Установка режима оперативного проведения

При записи документа в форме, расширение формы выполняет установку режима проведения (оперативное или неоперативное проведение). Установка выполняется по следующему алгоритму.

Вначале если свойство ИспользоватьРежимПроведения имеет значение Авто выполняется первичный подбор режима проведения из вариантов Оперативный , Неоперативный и Запрашивать .

Если у пользователя нет права на неоперативное проведение – используется оперативное проведение.

Если документ не проведен – используется оперативное проведение.

Если дата документа равна текущей, а время меньше или равно текущему, то используется режим Запрашивать . Здесь и далее в этой статье сравнение даты имеется в виду без учета времени, а сравнение времени описывается отдельно.

Если дата документа меньше текущей, то используется неоперативное проведение.

Если дата документа равна текущей и время больше текущего – используется оперативное проведение.

Дальнейшие действия системы определяются уже исходя из трех вариантов ( Оперативный , Неоперативный и Запрашивать ) установленных непосредственно в свойстве ИспользоватьРежимПроведения или на основании описанного алгоритма для варианта Авто .

Если дата документа меньше текущей, используется оперативный режим и у пользователя есть права на неоперативное проведение, то пользователю предлагается использовать неоперативный режим. Если пользователь отказывается, то запись документа отменяется.

Если дата документа меньше текущей, используется оперативный режим и у пользователя нет права на неоперативное проведение, то запись документа отменяется.

Если дата документа меньше текущей и используется режим Запрашивать , то в зависимости от наличия прав на неоперативное проведение или выбирается неоперативный режим (без запроса пользователя), или запись документа отменяется.

Если дата документа больше текущей и используется оперативный режим, то запись документа отменяется. Штатное поведение расширения формы не разрешает проведение документа завтрашней датой, даже если у пользователя есть права на неоперативное проведение. Это объясняется тем, что после появления документов проведенных завтрашней датой текущие остатки регистров используемых проводимыми оперативно документами перестают соответствовать реальным остаткам и механизм оперативного проведения для всех пользователей перестает работать адекватно.

Далее если используется режим Запрашивать , то пользователю выдается диалог с выбором режима проведения.

Полученный таким образом режим проведения ( Оперативный или Неоперативный ) используется при выполнении записи документа.

Проверка прав

При открытии формы документа, если документ проведен, а у пользователя нет права "Интерактивное изменение проведенных", то расширение переводит форму в режим ТолькоПросмотр .

При записи документа в форме выполняется проверка прав на интерактивное проведение и интерактивную отмену проведения в соответствии с текущим режимом записи.

Считывание движений

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

Читайте также: