1с проведение документа не формирует движения
Во встроенном языке программирования платформы «1С:Предприятие» встречаются методы, похожие по написанию и использованию, но имеющие отличия в работе.
Вопрос
В тексте ОбработкаПроведения документа «Расходная накладная» записано:
// 1. подготовка регистра бухгалтерии
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// 2. установка блокировки данных регистра бухгалтерии
Блокировка = Новый БлокировкаДанных;
т.е. после инструкции «Движения.Управленческий.Записать();» следует инструкция наложения блокировки.
А в разделе «Общие, универсальные механизмы, которые используются для решения задач всех разделов» в главе, посвященной «старой» методике контроля остатков, после инструкций «Записывать = Истина; Записать();» рекомендовано восстанавливать для свойства «Записывать» набора движений значение «Истина».
// 1. Подготовка наборов записей регистра
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Записать();
// 2. Восстановление для свойства набора движений Записывать значения Истина
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Если на экзамене опустить повторную инструкцию «Записывать = Истина», это не будет считаться ошибкой?
Или существует какая то особенность в использовании метода «Записать()» у движений документов?
Ответ
Да, существует особенность. Все зависит от того, каким образом производится запись пустого набора. Обратите внимание, что в задаче бухгалтерского учета запись пустого набора осуществляется методом Движения.<ИмяРегистра>.Записать(). Это метод набора записей регистра. После его выполнения маркер записи движений не сбрасывается, поэтому его не нужно восстанавливать.
В задаче из общего раздела используется Движения.Записать(). Это метод коллекции движений документа. Он выполняет запись движений по регистрам, у которых установлен маркер записи «Записывать» в значении «Истина», после чего устанавливает его в значение «Ложь». Поэтому, требуется повторная установка признака записи. Если этого не сделать, то при проведении сформированные движения не будут записаны. Это будет ошибкой, и не только на экзамене!
Чтобы проверить это, можно закомментировать восстановление маркера записи, провести документ и посмотреть его движения.
Запись и проведение документа в форме
Для понимания особенностей записи и проведения документа в форме следует, прежде всего, разделять особенности записи самого объекта ( ДокументОбъект ) и особенности работы расширения формы. Расширение формы документа действует, если основной реквизит формы имеет тип ДокументОбъект . Оно обеспечивает специфическую функциональность формы при редактировании и записи документа. Задача расширения заключается в реализации удобного для пользователя поведения формы. Но собственно запись и проведение документа выполняет, разумеется, объект, являющийся реквизитом формы. Расширение документа обрабатывает различные команды пользователя, выполняет предварительные проверки и другие сервисные действия, а затем вызывает запись объекта. Запись объекта выполняется так же, как и если бы она вызывалась средствами встроенного языка. То есть с точки зрения объекта запись в форме и запись средствами языка ничем не различаются. Таким образом, расширение обеспечивает некоторую сервисную функциональность, обращаясь в конечном итоге к функциональности объекта. Следует учитывать, что расширение формы действует, только если используются механизмы формы и не действует, если выполняется обращение непосредственно к объекту. Например, если вызвать метод Записать() у объекта ДокументОбъект , то никакие действия расширения формы не будут выполняться. Чтобы они выполнялись нужно вызывать метод ЗаписатьВФорме() .
Далее мы рассмотрим те сервисные действия, которые обеспечивает расширение формы документа. В данном разделе, мы опишем только те действия, которые специфичны именно для расширения формы документа и не будем касаться общих действий, которые поддерживаются расширениями всех объектов.
Установка даты документа
При открытии формы нового документа, если дата документа не установлена (равна значению типа Дата по умолчанию), то документу устанавливается рабочая дата. Следует заметить, что используется именно рабочая дата, а не текущая (если не установлено использование текущей даты в качестве рабочей). Это дает возможность пользователю настроить рабочую дату так, чтобы новые документы вводились определенной датой. При этом в качестве даты устанавливается начало дня (дата без времени), даже если в качестве рабочей даты выступает текущая дата. Но если свойство АвтоВремя имеет значение НеИспользовать , и рабочая дата равна текущей, то устанавливается текущая дата, вместе со временем. Таким образом, для варианта АвтоВремя = НеИспользовать при открытии берется рабочая дата (если она отличается от текущей) или текущая дата вместе со временем, а для остальных вариантов установка времени откладывается на момент записи документа.
При записи нового документа в форме если свойство АвтоВремя имеет значение отличное от НеИспользовать , и не используется оперативное проведение, и время документа пустое (0:00:00), то выполняется автоматическая установка времени на основании значения свойства АвтоВремя . Действие расширения формы в этом случае аналогично вызову метода УстановитьВремя() с вариантом выбранном в свойстве АвтоВремя и с использованием журналов документа.
Расширение формы так же предоставляет команды для установки времени документа в начало дня, конец дня, перед предыдущим и за последующим документом.
Установка режима записи
При нажатии кнопки " ОК ", если для документа в метаданных разрешено проведение, документ записывается в режиме проведения.
Кроме того, расширение формы предоставляет две отдельные команды для записи с проведением и записи с отменой проведения.
При любой записи документа в форме, если установлено свойство расширения формы ПриЗаписиПерепроводить и документ проведен, то выполняется запись в режиме проведения. Это позволяет исключить ситуацию, когда пользователь изменит документ, а движения документа не будут обновлены.
Установка режима оперативного проведения
При записи документа в форме, расширение формы выполняет установку режима проведения (оперативное или неоперативное проведение). Установка выполняется по следующему алгоритму.
Вначале если свойство ИспользоватьРежимПроведения имеет значение Авто выполняется первичный подбор режима проведения из вариантов Оперативный , Неоперативный и Запрашивать .
Если у пользователя нет права на неоперативное проведение – используется оперативное проведение.
Если документ не проведен – используется оперативное проведение.
Если дата документа равна текущей, а время меньше или равно текущему, то используется режим Запрашивать . Здесь и далее в этой статье сравнение даты имеется в виду без учета времени, а сравнение времени описывается отдельно.
Если дата документа меньше текущей, то используется неоперативное проведение.
Если дата документа равна текущей и время больше текущего – используется оперативное проведение.
Дальнейшие действия системы определяются уже исходя из трех вариантов ( Оперативный , Неоперативный и Запрашивать ) установленных непосредственно в свойстве ИспользоватьРежимПроведения или на основании описанного алгоритма для варианта Авто .
Если дата документа меньше текущей, используется оперативный режим и у пользователя есть права на неоперативное проведение, то пользователю предлагается использовать неоперативный режим. Если пользователь отказывается, то запись документа отменяется.
Если дата документа меньше текущей, используется оперативный режим и у пользователя нет права на неоперативное проведение, то запись документа отменяется.
Если дата документа меньше текущей и используется режим Запрашивать , то в зависимости от наличия прав на неоперативное проведение или выбирается неоперативный режим (без запроса пользователя), или запись документа отменяется.
Если дата документа больше текущей и используется оперативный режим, то запись документа отменяется. Штатное поведение расширения формы не разрешает проведение документа завтрашней датой, даже если у пользователя есть права на неоперативное проведение. Это объясняется тем, что после появления документов проведенных завтрашней датой текущие остатки регистров используемых проводимыми оперативно документами перестают соответствовать реальным остаткам и механизм оперативного проведения для всех пользователей перестает работать адекватно.
Далее если используется режим Запрашивать , то пользователю выдается диалог с выбором режима проведения.
Полученный таким образом режим проведения ( Оперативный или Неоперативный ) используется при выполнении записи документа.
Проверка прав
При открытии формы документа, если документ проведен, а у пользователя нет права "Интерактивное изменение проведенных", то расширение переводит форму в режим ТолькоПросмотр .
При записи документа в форме выполняется проверка прав на интерактивное проведение и интерактивную отмену проведения в соответствии с текущим режимом записи.
Считывание движений
При открытии формы документа, если есть табличные поля, связанные с движениями (наборами записей) объекта редактируемого в форме, то эти движения считываются из базы данных и соответственно отображаются в табличных полях.
Требования к проведению документов
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. Документы предназначены для ввода первичной информации, связанной с регистрацией событий, воздействующих на учитываемые в системе показатели. Например, при автоматизации финансово-хозяйственной деятельности предприятия – это учет различных хозяйственных операций; в системах управления производственными процессами – регистрация производственных операций и т. д.
Логически, непроведенный документ отличается от проведенного тем, что непроведенный документ является «черновиком», не отраженным в учете. Такие документы могут быть сохранены в системе, даже если они не полностью или вообще не заполнены; к ним не применяются никакие проверки и ограничения бизнес-логики (проверки заполнения, дат запрета изменения и т.п.). Данные таких документов не отражаются в учете (не выводятся в отчетах и т. п.)
В то же время, проведенный документ – это «чистовик», формирование и обработка которого завершены и по поводу которого принято решение, что данный документ должен участвовать в учете.
В таких случаях, проведение документа соответствует моменту первичного отражения события в учете, а статусы проведенного документа уточняют, как именно событие отражено в учете.
Если документ проведен, то при переводе документа между статусами пользователям может быть предложено дозаполнить определенные данные документа, к этим данным могут быть применены определенные проверки и ограничения бизнес-логики, специфичные для каждого этапа. До момента проведения, перевод «черновика» документа по статусам не контролируется системой.
Примеры поведения документов с многоэтапным отражением в учете:
- для проведенного документа Заказ клиента :
- при переводе в статус Не согласован система контролирует только основные параметры заказа;
- при переводе в статус К обеспечению – обязательно для заполнения поле Дата отгрузки , так как логисту необходима информация, к какой дате нужно привезти заказ;
2.3. Исключение из этого правила («большинство документов должны проводиться») составляют
- документы, которые не предназначены для отражения событий в учете. С помощью таких документов только регистрируют различные события с привязкой ко времени: например, входящую корреспонденцию, звонки, встречи и т.п.
- отдельные документы, технология проведения которых сильно отличается от технологических возможностей платформы, но которые должны выглядеть для пользователя так, как будто они проводятся. Например, это документы Операция (бухгалтерский и налоговый учет) – для ввода операций вручную, Регламентная операция – для выполнения операции закрытия месяца с возможностью ручной корректировки движений и т.п.
Такие документы не проводятся.
2.4. В случае если пользователь должен выполнять регистрацию события в системе и отражение его в учете за одно действие, необходимо записывать новый документ в режиме проведения.
При этом недопустимо решать эту задачу другими способами, в частности, с помощью отключения проведения у документа.
3. При отражении события в учете может возникнуть необходимость сформировать «вторичные» данные, со сложными привязками к моментам времени, периодам и к другим объектам системы. В этом случае следует помещать такие данные в регистры. Формирование движений по регистрам следует выполнять при проведении: автоматически или вручную.
При автоматическом формировании движений, пользователь вводит информацию о событии в данные документа, а при проведении на основе введенной в документ информации генерируются движения в различные регистры. Например, для бухгалтерских операций происходит формирование проводок.
При ручном формировании движений, пользователь вводит данные непосредственно в регистры. Такие документы обычно называются ручными операциями. Они могут использоваться для введения начальных остатков, или для ввода хозяйственных операций, которые не были предусмотрены разработчиком конфигурации.
4. В отдельных случаях, формирование движений может выполняться отдельным документом. Это востребовано в случае схожей обработки разных видов документов, групповой обработки или реализации сложных бизнес-процессов, требующих явного разделения функций исполнителей. Тогда разные стадии отражения событий в учете реализуются не переходом по статусам у одного документа, а разными документами, которые вводятся на основании друг друга. В этой цепочке только определенные документы при проведении формируют движения.
Например, рассмотрим ситуацию, когда платежное поручение формируется в финансовом отделе, и при этом бухгалтер при проведении не должен изменять первичный документ. В этом случае, документ Платежное поручение не делает движений, а движения по платежному поручению формируются отдельным документом Списание с расчетного счета , который специально предназначен для автоматизированного формирования движений.
5. Непроведенные и помеченные на удаление документы не должны иметь активных движений.
6. Даже если документ не формирует движений, он должен проводиться, чтобы логически отличаться от «черновика».
7.1.1. В случае, если в документе не менялись данные, влияющие на проведение (например, изменили только значение реквизита Комментарий ) проведение проведенного ранее документа, не должно приводить к изменению его движений.
Исключением из этого правила могут быть случаи, когда движения по регистру полностью или частично формируют внешние по отношению к документу алгоритмы (см. п.4).
7.1.2. При разработке алгоритмов формирования движений нужно стремиться избегать решений, когда результат формирования движений зависит от состояния учетных регистров, например, от остатков, т.к. в этом случае результат проведения будет зависеть от последовательности ввода документов.
Исключением из этого правила могут быть отдельные, обоснованные случаи, когда сама суть алгоритма заключается в анализе последовательности, как, например, в алгоритмах реализующих партионный учет.7.2. Для реализации поведения, описанного в п. 7.1, документы при формировании движений должны по максимуму опираться на данные, которые хранятся в этом документе. Данные, которые в документе не сохраняются, должны быть защищены от изменения. Это достигается реализацией следующего комплекса мер.
7.2.1. Если поддерживается изменение пользователем внешних, по отношению к документу, данных (например, реквизитов НСИ), влияющих на формирование движений, то значения этих реквизитов должны быть сохранены в документах.
В противном случае изменение этих данных должно быть заблокировано. В конфигурациях на основе Библиотеки стандартных подсистем для этого рекомендуется использовать возможности механизма Запрет редактирования реквизитов .
Исключения из этого правила описаны в п. 7.1.2.
7.2.2. Нужно стремиться, чтобы настройки программы (например, значения функциональных опций) оказывали наименьшее влияние на формирование движений. Тогда пользователь сможет свободно менять эти настройки.
Некоторые приемы для достижения такого поведения
- указание даты начала действия настройки (периода действия) и учет этой даты в алгоритмах формирования движений;
- заполнение отключенных по настройкам обязательных полей значениями по умолчанию: тогда пользователь сможет свободно включить настройку, ограничения будут связаны только с отключением такой настройки;
- формирование движений без учета настройки и дополнительные меры в объектах, которые отображают информацию из учетных регистров. Например, значение измерения регистра накопления всегда пишется одинаково, но отчеты по этому регистру измерение скрывают, если оно отключено.
7.2.3 Если все меры по исключению зависимости формирования движений от настроек программы исчерпаны, то необходимо предусмотреть одну из мер:
- автоматическая обработка данных, которая запускается в фоне после изменения пользователем настройки. О запуске такой обработки пользователя нужно предупреждать перед редактированием настройки;
- обработка данных, которая запускается пользователем вручную. Перед редактированием настройки пользователя нужно уведомлять о необходимости запуска обработки. Так же необходимо в интерфейсах, которые могут оперировать данными, подлежащими обработке (например, в отчетах) предупреждать пользователя, о необходимости запуска обработки;
- если предусмотреть обработку данных не представляется возможным, то при редактировании настройки необходимо предупреждать пользователя о том, что это делать не рекомендуется после начала ведения учета.
При этом допустимо поведение, когда реакция программы на включение и отключение настройки будет разной. Например, включение настройки проходит без предупреждения, а отключать ее не рекомендуется.
7.3. При изменении логики формирования движений для обеспечения выполнения условий п.7.1 необходимо предусмотреть обработчики обновления информационной базы либо поддерживать для существующих на момент обновления документов старые алгоритмы формирования движений.
8 . Для большинства событий отражение в учете может быть обратимым. В таком случае, для этого следует использовать механизм отмены проведения документов.
Читайте также: