Основная страницаРабота с документами


 

Особенности проведения документов

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

В процессе проведения оперативного документа не следует с помощью объекта "Запрос" получать данные по движениям регистра уже записанным в процессе данного проведения. В случае, если в процессе проведения выполняется смещение ТА, движения проводимого документа не попадут в запрос, так как ТА  устанавливается на новую позицию по окончании проведения документа. Рекомендуется использовать метод "ВыбратьДвиженияДокумента" объекта "Регистр".

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

  Особенности записи и проведения документов средствами встроенного языка

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

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

Управление удалением движений документа

При проведении уже проведенного ранее документа, перед вызовом предопределенной процедуры "ОбработкаПроведения" системой автоматически выполняется удаление всех записанных в процессе предыдущего проведения движений документа (бухгалтерских проводок, записей журнала расчетов, движений регистров, записей изменения периодических реквизитов справочников). Так же удаление движений выполняется и в случае отмены проведения перед вызовом предопределенной процедуры "ОбработкаУдаленияПроведения". В 1С:Предприятии 7.7 появилась возможность отключения автоматического удаления движений. Отключение выполняется в свойствах вида документа в метаданных. При отключении автоматического удаления движений появляется возможность дописывать  движения в процессе проведения к уже имеющимся, частично удалять движения при перепроведении (например, по отдельным регистрам) и анализировать существующие движения документа в процессе выполнения проведения и отмены проведения. Заметим, что при отмене проведения реально движения будут удалены в любом случае, но при отключенном автоматическом удалении они будут удалены не до, а после выполнения предопределенной процедуры "ОбработкаУдаленияПроведения".

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

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

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

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

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

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

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

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

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

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

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

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

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

последовательности в монопольном режиме, перед проведением документа выполняется анализ того, какие именно остатки используются в процессе проведения. Анализ используемых остатков выполняется на основании состава движений влияющих на последовательности, определенных в метаданных. Предполагается, что регистры и счета, остатки  по которым используются при проведении документа, включены в описание последовательностей. Если проводимый документ использует остатки по регистрам, то перед проведением точка актуальности будет установлена на данный документ. При этом в модуле документа в процессе проведения метод "ИтогиАктуальны()" будет возвращать значение "1". Это позволит документу получать актуальные данные непосредственно из итогов, без выполнения временного расчета. Если документ при проведении использует остатки  по счетам, то на него будет выполнен временный расчет специального объекта "БухгалтерскиеИтоги", для которого установлен признак актуальности. В монопольном режиме все временные расчеты и запросы по бухгалтерским итогам используют данные из актуальных временных расчетов существующих объектов "БухгалтерскиеИтоги", что позволяет сильно увеличить скорость их выполнения. Таким образом, и при использовании итогов оперативного учета и при использовании бухгалтерских итогов ускорение процесса восстановления последовательности достигается за счет того, что для получения итогов на моменты проводимых документов перебор движений регистров и проводок осуществляется только один раз, а не многократно при проведении каждого документа.

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

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

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

момент документа.

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

Подчиненные документы и ввод документов "на основании"

Одной из типичных ошибок при освоении 1С:Предприятия является неверное понимание механизмов "ввод документа на основании" и "подчиненный документ". Эти два механизма между собой никак не связаны.

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

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

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

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

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

Передача значений в модуль проведения документа

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

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

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

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

Установка времени документа при записи новых документов

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

Вариант "Текущее время" может использоваться только, если дата документа совпадает с системной датой компьютера. Он устанавливает  в качестве времени документа системное время компьютера.

Вариант "После ТА" позволяет поместить документ после точки актуальности, если она расположена в дате документа.

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

Вариант "В конец дня" записывает документ со временем "12:00" если это первый документ за данную дату, а если документы в этой дате уже есть, то время нового документа устанавливается на 10 секунд позже самого позднего документа.

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

С помощью набора методов "АвтоВремя…" можно управлять режимом присвоения времени при записи нового документа.

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

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

Изменение документа в процессе проведения

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

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

Особенности написания модуля документа

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

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

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

Использование позиции документа

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

Позиция документа представляется строковым значением специального формата. Она может быть получена методом документа "ПолучитьПозицию". Разумеется, позиция имеет смысл только для записанного документа. Фактически в позиции документа отражаются в строковом виде дата, время и внутренний идентификатор. Эти характеристики располагаются в строке таким образом, чтобы сравнение строк позволяло определить, какая позиция больше, а какая меньше. Однако следует учитывать, что позиция документа, полученная в качестве строки, отображает некоторую точку на оси хронологии документа, а самого документа в этой точке может не быть. Например, если воспользоваться функцией "ПолучитьПозициюТА()", то можно получить позицию точки актуальности, хотя сам документ установивший точку актуальности может быть к этому моменту удален. Таким образом, позицию документа можно использовать только для сравнения и указания границ выборки документов.

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






Рекомендации по конфигурированию и администрированию