Удаление движений не удалять автоматически

Документы в 1С 8.2 и 8.3 — объект метаданных, с помощью которого в 1С фиксируются хозяйственные операции предприятия.

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

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

Рассмотрим основные настройки и свойства документов.

Настройка и свойства документов в 1C 8.3 и 8.2

Рассмотрим самые интересные вкладки с точки зрения разработчика.

Данные

Одна из основные вкладок документа:

Здесь описывается структура хранения информации будущего документа, реквизиты аналогичны справочнику. Сильно отличаются стандартные реквизиты:

Получите 267 видеоуроков по 1С бесплатно:

Движения документа

Самая важная вкладка, на которой определяется состав регистров, по которым будет делать движения документ:

Рассмотрим подробно свойства документа на этой странице:

Проведение — разрешить или запретить. Определяет, будут ли движения по данному документу.

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

Удаление движений — определяет режим очистки движения документа: Удалять автоматически при отмене проведения — движения будут очищены только при нажатии кнопки «Отмена проведения», но не удаляет при перепроведении. Удалять автоматически — значит, что движения будут удаляться в любом случае, даже если документ 1С перепроводится. Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.

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

Ввод на основании

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

Прочее

На вкладке Прочее можно найти очень важное свойство документа 1С (Режим блокировки):

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

Также со вкладки Прочее можно перейти в модуль менеджера и модуль объекта.

Небольшое обзорное видео про документы в 1С для программистов:

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Когда происходит интерактивное или программное проведение документа, срабатывает выполнение процедуры ОбработкаПроведения() , которая находится в модуле объекта документа.

Данная процедура имеет два параметра: Отказ и РежимПроведения . Если выставить параметру Отказ значение Истина , то проведение не будет выполнено. Параметр РежимПроведения устанавливает режим проведения документа — «оперативное» или «неоперативное». Сами движения в регистры разработчик должен прописать в этой процедуре самостоятельно.

Читайте также:  Как найти неисправность в материнской плате

Рассмотрим подробно свойства документа на вкладке «Движения»

  • Проведение — «разрешить» или «запретить». Определяет, будет ли документ создавать движения.
  • Оперативное проведение — «разрешить» или «запретить». Если установлено «разрешить», то проведение документа будущей датой невозможно.
  • Удаление движений — определяет режим очистки движений документа:
  • Удалять автоматически при отмене проведения. При перепроведении документа движения перезаписываются, а при отмене проведения движения документа автоматически удаляются.
  • Удалять автоматически. При записи документа с проведением сначала будут удалены все старые движения документа. На момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа.
  • Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.

Процедура ОбработкаПроведения

Формирование новых наборов записей регистров включает в себя операции, состоящие:

  • из добавления новых записей к набору записей;
  • заполнения полей записей;
  • записи набора записей.

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

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

Следует учитывать, что при автоматической записи движений они будут записаны с замещением, то есть старые движения документа будут замещены новыми. Фактически, платформа неявно выполнит код:

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

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

Подробнее о формировании движений

С точки зрения платформы отдельного процесса «проведение» не существует. Есть запись документа с проведением, причем в рамках одной транзакции. Таким образом, в момент выполнения обработчика события ОбработкаПроведения документ уже записан.

Свойство «Удаление движений» документа как объекта конфигурации стандартно устанавливается платформой в значение «Удалять автоматически при отмене проведения». Это значит, что при перепроведении документа движения, подчиненные данному документу, перезаписываются, а при отмене проведения движения документа автоматически удаляются.

Если разработчик захочет реализовать нестандартный вариант проведения документа и установит свойство «Удаление движений» в значение «Удалять автоматически», то при записи документа с проведением сначала будут удалены все старые движения документа. То есть на момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа.

При записи с проведением система автоматически запишет выбранные и незаписанные наборы записей, находящиеся в свойстве «Движения». Отсюда следуют два важных вывода:

  • Во-первых, если наборы записей необходимо записывать с добавлением, то это нужно выполнять в явном виде, т. к. при автоматической записи движений они будут записаны с замещением.
  • Во-вторых, последовательность обращения к регистрам при автоматической записи движений будет одна и та же для разных документов. Это позволяет снизить вероятность взаимных блокировок при проведении документа в конкурентных режимах работы.
Читайте также:  Программа по принудительному удалению программ бесплатно

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

Пример перепроведения документов РеализацияТоваров в интервале с ДатаНачала по ДатаОкончания :

Здесь инициировалось проведение в неоперативном режиме. Значение по умолчанию параметра РежимПроведения метода объекта документа Записать() — именно РежимПроведенияДокумента.Неоперативный .

Оперативное и неоперативное проведение

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

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

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

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

С оперативным проведением документов связано понятие оперативной отметки времени и понятие момента времени.

Понятие момента времени

Для определения положения документа на оси времени используется реквизит документа «Дата». Дата содержит время с точностью до секунды. Это позволяет контролировать последовательность записи документов. Однако при большом объеме создаваемых документов вероятна ситуация, когда несколько документов будут иметь одинаковое значение даты (т. е. будут созданы в течение одной секунды). Как в этом случае определить последовательность созданных документов?

Для обработки подобных ситуаций было введено понятие момент времени. Момент времени представляет собой совокупность даты, времени и ссылки на объект базы данных. Он позволяет однозначно идентифицировать любой объект ссылочного типа базы данных на оси событий, но имеет смысл в основном только для документов. Кроме того, момент времени позволяет идентифицировать и необъектные данные, например, записи регистров, подчиненных регистратору.

Понятие момента времени реализовано во встроенном языке при помощи универсального объекта МоментВремени . Этот объект имеет свойства Дата и Ссылка , которые позволяют получить «составляющие» момента времени, и один метод — Сравнить() , при помощи которого возможно сравнение двух моментов времени между собой.

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

Читайте также:  Far cry кровавый дракон

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

Таким образом, если у объекта конфигурации Документ установлено свойство оперативного проведения, последовательность действий системы будет следующей:

  • при создании нового документа система будет устанавливать ему текущую дату сеанса и «нулевое» время;
  • при проведении такого документа (с датой, день которой соответствует дню текущей даты сеанса) система установит в качестве даты документа оперативную отметку времени;
  • если отменить проведение документа и затем провести его снова (не изменяя даты), система установит документу новую оперативную отметку времени;
  • если попытаться перепровести документ, то система также автоматически установит документу новую оперативную отметку времени и проведет его;
  • при попытке проведения (или перепроведения) оперативно проводимого документа с датой, день которой меньше дня текущей даты сеанса, документ будет проведен неоперативно;
  • если попытаться провести (или перепровести) оперативно проводимый документ с датой, день которой больше дня текущей даты сеанса, то система не даст выполнить такое действие.

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

А все на самом деле очень просто.

Если у документа установлен режим удаления движений «Удалять автоматически», то при перепроведении этого документа, еще до выполнения процедуры ОбработкаПроведения, движения будут удалены.

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

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

Допустим у нас есть некий документ, который делает движения по одному регистру.

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

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

Оранжевым цветом, закрашены этапы, на которых данные буду блокированы.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *