Проведение документов в 1С

Замечание по работе в разных часовых поясах (ТекущаяДата и ТекущаяДатаСеанса)

https://its.1c.ru

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

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

При использовании методов платформы, возвращающих локальную дату серверного компьютера, следует приводить ее либо к универсальному времени, либо к времени пользовательского сеанса.

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

Как правило, вместо вызова функции ТекущаяДата на клиенте необходимо:

  • передавать с сервера на клиент время и дату, приведенную к часовому поясу пользовательского сеанса;
  • при работе с документами на клиенте, использовать дату документа.

[свернуть]

Момент времени 1С

Момент времени в 1С - это совокупность даты, времени и ссылки на объект базы данных.

Момент времени позволяет:

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

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

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

[свернуть]

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

Подробнее об обработке правых границ интервалов времени

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

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

Подробнее...

[свернуть]

Понятие момента времени реализовано во встроенном языке при помощи универсального объекта МоментВремени, который имеет:

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

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

Проведение документа в 1С

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

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

Примеры

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

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

Конструктор движений

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

[свернуть]

Идеология механизма проведения документов предполагает преимущественно последовательный ввод и проведение документов.

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

Примеры

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

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

[свернуть]

Режим оперативного проведения документов

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

Пример

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

[свернуть]

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

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

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

Отсюда...

Особенности оперативного проведения:

  1. Нельзя оперативно провести документы будущей датой.
  2. Используется  механизм оперативной отметки времени:
    • документам с текущей датой присваивается текущее время;
    • если два документа проводятся одновременно, каждый будет иметь свое время (система разнесет документы по разным секундам). 

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

Особенности оперативной отметки времени

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

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

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

В качестве оперативной отметки система, как правило, возвращает текущее время (текущую дату и текущее время). Однако если текущее время больше или равно последней выданной какому-либо пользователю отметке, то возвращается значение на секунду большее, чем значение последней выданной отметки. Таким образом обеспечивается получение при каждом обращении значения по возможности соответствующего текущему времени, но в обязательном порядке большего, чем предыдущее полученное значение.

Особенности выдачи оперативной отметки времени:

  1. Если последняя оперативная отметка меньше текущей даты сеанса, в качестве новой оперативной отметки принимается текущая дата сеанса.
  2. Если последняя оперативная отметка равна или больше текущей даты сеанса, в качестве новой оперативной отметки принимается значение на одну секунду большее, чем старая оперативная отметка времени.
  3. В файловом варианте в качестве исходного значения для получения оперативной отметки используется текущее время компьютера пользователя, который обратился за получением оперативной отметки. Полученное значение сверяется с последним выданным значением, хранимым в служебном файле в каталоге информационной базы, и если оно меньше или равно сохраненному значению, то сохраненное значение увеличивается на секунду и выдается в качестве оперативной отметки.
  4. В клиент-серверном варианте в качестве исходного значения для получения оперативной отметки используется системное время компьютера, на котором работает сервер 1С:Предприятия, а последнее выдаваемое значение сохраняется в памяти сервера.

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

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

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

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

Пример

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

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

В аналогичном случае в клиент-серверном варианте пользователю с неправильно установленной системой датой при попытке выполнить оперативное проведение сразу будет выдано сообщение об ошибке, так как день даты введенного им документа не будет соответствовать дню системной даты компьютера, на котором установлен сервер 1С:Предприятия.

[свернуть]

[свернуть]

Изменение даты документа при оперативном проведении влияет на время в пределах дня, но не изменяет день.

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

Механизм оперативного проведения поддерживается в расширениях форм документов (расширении формы документа и формы списка). Команды, предоставляемые расширениями форм, поддерживают определенную стратегию выбора режима проведения. Эта стратегия может регулироваться свойством ИспользоватьРежимПроведения расширения формы документа. В основном используется вариант "Авто", обеспечивающий автоматический выбор режима проведения на основе анализа даты документа и при необходимости запрос режима у пользователя.

Подробнее читай в статье "Запись и проведение документа в форме"

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

Оперативное проведение целесообразно запретить:

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

Режим неоперативного проведения

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

В режиме неоперативного проведения система никогда не контролирует остатки.

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

Неоперативно можно провести документ за любую дату, при этом дата и время документа не изменятся.

Так как неоперативное проведение является более ответственной операцией, то система предоставляет разработчику возможность отдельно регулировать права пользователей на такой вид проведения. Для этого используется право "Интерактивное проведение неоперативное". Следует заметить, что это право действует только при использовании стандартных команд, предоставляемых расширениями форм. Если вызов проведения выполняется средствами встроенного языка, то данное право следует проверять в модулях самостоятельно.
 
В обработчике ОбработкаПроведения() разработчик, получая текущий режим проведения в качестве значения параметра, должен самостоятельно реализовать изменение алгоритма проведения в зависимости от значения данного параметра. При этом если для оперативного проведения рекомендуется выполнять различные проверки, которые необходимы для определения правомерности совершаемой операции (например, проверку наличия товаров на складе, проверку задолженности покупателя и т.д.), то при неоперативном проведении такого рода проверки выполнять не рекомендуется. С одной стороны, расчет итогов на момент времени документа может занять продолжительное время, а с другой стороны такая проверка не имеет большого смысла.

Пример

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

[свернуть]

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

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

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

Ввод документов будущим временем

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

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

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

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

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

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

Удаление движений

Свойство документа «Удаление движений» может принимать одно из трех значений:

  1. «Удалять автоматически при отмене проведения»;
  2. «Удалять автоматически»;
  3. «Не удалять автоматически»

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

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

Чем меньше время действия блокировки, тем меньше возможность возникновения проблем при параллельной работе пользователей.

Удалять автоматически при отмене проведения

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

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

Так как при перепроведении документа движения не будут удаляться, то нет необходимости в блокировке в самом начале транзакции. СУБД установит блокировку уже при записи движений, т.е. позже, ближе к концу транзакции.

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

Удалять автоматически

Если используется значение «Удалять автоматически», платформа самостоятельно очищает движения по регистрам в следующих случаях:

  1. При перепроведении (при повторном проведении уже проведенного документа).
  2. При пометке документа на удаление.
  3. При отмене проведения документа.

Режим «Удалять автоматически» может вызывать проблемы при параллельной работе большого количества пользователей.

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

Не удалять автоматически

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

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

4 комментария к “Проведение документов в 1С”

  1. "Однако если текущее время больше или равно последней выданной какому-либо пользователю отметке, то возвращается значение на секунду большее, чем значение последней выданной отметки."

  2. следует изменить на "Однако если текущее время МЕНЬШЕ или равно последней выданной какому-либо пользователю отметке, то возвращается значение на секунду большее, чем значение последней выданной отметки."

Добавить комментарий для Аграфена Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.