Запись движений при проведении появилась в релизе. Порядок записи движений регистров при проведении документа. Действие Провести и закрыть
Документы в 1С 8.2 и 8.3 — объект метаданных, с помощью которого в 1С фиксируются хозяйственные операции предприятия.
Каждый созданный документ в конфигурации создать для отражения своего типа операции, например: поступление товаров, списание товаров и т.д.
Документы могут проводиться, а могут просто записываться. Документ, у которого разрешено проведение, как правило, при проведении создает записи в , тем самым внося изменения в учет организации. Документы, у которых запрещено проведение, обычно используются как печатные формы, например: , и т.д.
Рассмотрим основные настройки и свойства документов.
Настройка и свойства документов в 1C 8.3 и 8.2
Рассмотрим самые интересные вкладки с точки зрения разработчика.
Данные
Одна из основные вкладок документа:
Здесь описывается структура хранения информации будущего документа, реквизиты аналогичны . Сильно отличаются стандартные реквизиты:
Получите 267 видеоуроков по 1С бесплатно:
Движения документа
Самая важная вкладка, на которой определяется состав регистров, по которым будет делать движения документ:
Рассмотрим подробно свойства документа на этой странице:
Проведение — разрешить или запретить. Определяет, будут ли движения по данному документу.
Оперативное проведение — разрешить или запретить. Если установлено разрешить, то проведение документа будущей датой невозможно.
Удаление движений — определяет режим очистки движения документа: Удалять автоматически при отмене проведения — движения будут очищены только при нажатии кнопки «Отмена проведения», но не удаляет при перепроведении. Удалять автоматически — значит, что движения будут удаляться в любом случае, даже если документ 1С перепроводится. Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.
Также для построения простых движений документа существует специальный конструктор движений, позволяющий упростить разработку:
Документ может быть введен на основании плана обмена, справочника, бизнес-процесса, задачи или другого документа. Для удобства можно воспользоваться специальным конструктором ввода на основании, который автоматически сгенерирует модуль обработчика заполнения:
Алгоритм проведения документа с учетом подписок на события
Настройки документа :
Если посмотреть свойства документа через палитру свойств, то можно увидеть два важных свойства: "Удаление движений" и "Запись движений при проведении", причем второе НЕ вынесено на закладку "Движения" окна редактирования документа.
1. Удаление движений.
Если свойство "Удаление движений" уставновлено в "Удалять автоматически", то ПЕРЕД началом проведения программа очищает все движения по регистрам. Фактически это означает запись пустого набора записей регистра с видом записи - замещение. А значит, программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров.
Если для какого-либо регистра определена подписка на событие "При записи", то выполняется код из связанной процедуры.
2. Процедура "ОбработкаПроведения" модуля документа.
Обратим внимание: в начале обработки проведения у всех движений флаг модифицированности Ложь (значение возвращает метод Движения.Регистр.Модифицированность() ).
При работе с набором записей регистра (например, Движения.Регистр.Очистить() , Движения.Регистр.Добавить() и т.д.) флаг модифицированности становится Истина.
После записи движения в базу Движения.Регистр.Записать() модифицированность снова ложь.
Если в модуле процедуры подписки происходит запись набора регистра в явном виде (.Записать() ), то программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров и процедуры из подписки на событие "При записи" регистра.
3. Подписки на событие "При проведении" документа
Важно понимать : если в обработке проведения документа или в подписках на событие, вызванных ранее, не происходила запись движений регистров в явном виде (Движения.Регистр.Записать()), то движения документа еще НЕ записаны в базу. Поэтому их нельзя получить с помощью запроса, но можно получить из коллекции движений источника.
Процедура ПриПроведенииДокумента(Источник, Отказ, РежимПроведения) Экспорт Регистр = Источник.Движения.Бухучет; ..... КонецПроцедуры
Очередность подписок на одно и то же событие явным образом не определяется 1С, но на практике подписки вызываются в порядке следования в ветке "Подписки на события" окна редактирования конфигурации.
Если регистры записываются с помощь метода Записать() , то выполняются все связанные процедуры.
4. Запись движений.
Вспомним про свойство "Запись движений при проведении" из настроек документа.
Если оно равно "Записывать модифицированные", то в базу будут записаны все движения документа, у которых флаг "Модифицированность" Истина.
Если оно равно "Записывать выбранные", то в базу будут записаны движения регистров, для которых мы явным образом указали необходимость записи.
Движения.Регистр.Записывать = Истина;
Запись движений в базу происходит с режимом замещения Истина . Это означает, что будут записаны записи из текущего набора записей регистра коллекции Движения и очищены предыдущие записи.
И в конце рассмотрим несколько примеров:
Пусть свойство документа "Запись движений при проведении" равно "Записывать модифицированные", а "Удаление движений" - "Не удалять автоматически".
Пример 1.
Процедура ОбработкаПроведения(Отказ, РежимПроведения) НовЗапись = Движения.Регистр.Добавить(); .... Движения.Регистр.Записать(Ложь); //*** КонецПроцедуры
При такой процедуре проведения документ при каждом перепроведении будет добавлять запись в регистр, записи будут множиться. Т.к. строка //*** добавляет записи в регистр, признак Модифицированности снимается.
Правильнее будет написать строку //*** как
Движения.Регистр.Записать()
или вообще ее опустить, и тогда программа сама запишет модифицированные движения.
Пример 2.
В 1С 8 движения документа могут формироваться не только в обработке проведения, но и извне, например, из некоторой служебной обработки (так реализовано допроведение документов, восстановление авансов и т.д.).
Приход = Документы.ПриходнаяНакладная.Выбрать(); Проводки = РегистрыБухгалтерии.Регистр.СоздатьНаборЗаписей(); Пока Приход.Следующий() Цикл ДокСсылка = Приход.Ссылка; Проводки.Отбор.Регистратор.Установить(ДокСсылка); НоваяПроводка = Проводки.Добавить(); НоваяПроводка.Период = ДокСсылка.Дата; НоваяПроводка.Организация = ДокСсылка.Организация; НоваяПроводка.СчетДт = ПланыСчетов.ПланСчетов.Товары; НоваяПроводка.СчетКт = ПланыСчетов.ПланСчетов.Поставщики; НоваяПроводка.Сумма = ДокСсылка.Всего; Проводки.Записать(Ложь); КонецЦикла;
В этом случае при перепроведении документа, если происходит изменение движений регистра бухгалтерии (флаг Модифицированности Истина), записи будут замещены записями, сформированными документом.
Пример 3.
Перед началом проведения документа все реквизиты документа записываются в базу данных (т.е. программист может их получить с помощью запроса). Во внутренней памяти создается Объект документа, и у этого объекта есть коллекция движений, которая будет записана после окончания процедуры проведения (см. этап 4).
Если в процессе проведения документа движения по регистрам формируются не с помощью коллекции Движения, принадлежащей внутреннему объекту , а другими способами (вручную в форме набора записей или как в примере 2 и т.д.), то на этапе 4 эти записи будут замещены!!! Чтобы избежать замещения в типовых базах, для документа "ОперацияБух" свойство документа "Проведение" устанавливается в "Запретить".
Если документ должен проводиться по другим регистрам и нельзя запретить проведение, тогда нужно внимательно настраивать свойства документа:
Выбрать вариант записи движений "Записывать выбранные" и убедиться, что Движения.Регистр.Записывать = Ложь
Выбрать вариант записи движений "Записывать модифицированные" и контролировать признак Модифицированности для набора записей этого регистра.
Пример 4 .
Нужно понимать, что объект, полученный по ссылке (назовем его "ОбъектДок"), и внутренний объект ("ЭтотОбъект"), созданный в памяти в момент проведения, это два разных экземляра объектов.
Соответственно и коллекции движений у них будут разные. У "ОбъектаДок" коллекция движений будет включать только записанный в базу набор записей регистра, а у "ЭтогоОбъекта" - как записанные, так и добавленные и незаписанные записи. По окончании проведения (этап 4) в базу будут записаны наборы записей "ЭтогоОбъекта", причем с признаком Замещать = Истина.
Если записи в набор записей добавляются по способу, описанному выше, то они могут быть замещены на этапе 4.
У объекта Документ
имеется свой набор событий, с помощью которых разработчик может вмешаться в процесс записи документа в базу данных используя обработчики этих событий. В зависимости от вида действия, которое выполнит пользователь, события документа вызываются в определенной последовательности.
Существуют следующие основные виды действий для документа:
- Записать
- Провести
- Провести и закрыть
- Отмена проведения
Действие Записать
Для непроведенного документа последовательность выполнения событий при записи документа из формы будет следующей:- Модуль объекта - перед записью (начинается транзакция, документ еще не записан);
- Модуль формы (&НаСервере) - при записи на сервере (фиксация транзакции);
- Модуль формы (&НаКлиенте) - перед записью;
- Модуль формы (&НаСервере) - обработка проверки заполнения на сервере;
- Модуль объекта - обработка проверки заполнения;
- Модуль формы (&НаСервере) - перед записью на сервере;
- Модуль объекта - перед записью (начало транзакции, документ еще не записан);
- Модуль объекта - при записи (документ записан);
- Модуль объекта - обработка проведения (формирование набора записей движений документа);
- Модуль формы (&НаСервере) - при записи на сервере (записан набор записей движений документа, фиксация транзакции);
- Модуль формы (&НаСервере) - после записи на сервере;
- Модуль формы (&НаКлиенте) - после записи.
Последовательность выполнения событий при записи документа из формы, у которого запрещено проведение (свойство Проведение
установлено в значение Запретить
) будет следующей:
В отличии от документа, у которого разрешено проведения, в этом случае отсутствует событие ОбработкаПроведения
. Но, при записи проведенного документа с перепроведением и при записи документа, у которого запрещено проведение, кроме самой записи, в контексте формы и в контексте объекта вызывается также событие ОбработкаПроверкиЗаполнения
. Это событие вызывается расширением формы для проверки заполнения реквизитов при записи или при проведении документа в форме.
Действие Провести
При выполнении данного действия, то есть запись нового документа с проведением из формы, последовательность выполнения событий будет такая же как и у действия запись проведенного документа (см. рисунок 2).Действие Провести и закрыть
Последовательность выполнения событий аналогична действию провести (см. рисунок 2).Действие Отмена проведения
Данное действие инициирует запись документ и запускает следующую последовательность событий:- Модуль формы (&НаКлиенте) - перед записью;
- Модуль формы (&НаСервере) - перед записью на сервере;
- Модуль объекта - перед записью (начало транзакции);
- Модуль объекта - обработка удаления проведения (удаление движений);
- Модуль объекта - при записи (движения удалены, документ записан);
- Модуль формы (&НаСервере) - после записи на сервере (фиксация транзакции);
- Модуль формы (&НаКлиенте) - после записи.