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

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

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

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

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

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

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

Данные

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

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

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

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

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

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

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

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

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

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

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

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

  • Записать
  • Провести
  • Провести и закрыть
  • Отмена проведения
Рассмотрим последовательность выполнения событий при каждом действии.

Действие Записать

Для непроведенного документа последовательность выполнения событий при записи документа из формы будет следующей:
  1. Модуль объекта - перед записью (начинается транзакция, документ еще не записан);
  2. Модуль формы (&НаСервере) - при записи на сервере (фиксация транзакции);
Заметим, что для расширения формы документа платформа 1С по-умолчанию устанавливает значение Истина для свойства ПриЗаписиПерепроводить , поэтому, при записи проведенного документа из формы платформа 1С выполнит автоматически его перепроведение. В этом случае для проведенного документа последовательность выполнения событий при записи из формы будет следующей:
  1. Модуль формы (&НаКлиенте) - перед записью;
  2. Модуль формы (&НаСервере) - обработка проверки заполнения на сервере;
  3. Модуль объекта - обработка проверки заполнения;
  4. Модуль формы (&НаСервере) - перед записью на сервере;
  5. Модуль объекта - перед записью (начало транзакции, документ еще не записан);
  6. Модуль объекта - при записи (документ записан);
  7. Модуль объекта - обработка проведения (формирование набора записей движений документа);
  8. Модуль формы (&НаСервере) - при записи на сервере (записан набор записей движений документа, фиксация транзакции);
  9. Модуль формы (&НаСервере) - после записи на сервере;
  10. Модуль формы (&НаКлиенте) - после записи.
Если для свойства ПриЗаписиПерепроводить установить значение Ложь , тогда последовательность выполнения событий при записи проведенного документа из формы будет такой же как и для непроведенного документа.

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

Действие Провести

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

Действие Провести и закрыть

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

Действие Отмена проведения

Данное действие инициирует запись документ и запускает следующую последовательность событий:
  1. Модуль формы (&НаКлиенте) - перед записью;
  2. Модуль формы (&НаСервере) - перед записью на сервере;
  3. Модуль объекта - перед записью (начало транзакции);
  4. Модуль объекта - обработка удаления проведения (удаление движений);
  5. Модуль объекта - при записи (движения удалены, документ записан);
  6. Модуль формы (&НаСервере) - после записи на сервере (фиксация транзакции);
  7. Модуль формы (&НаКлиенте) - после записи.
Если действия выполняются не из формы (выполняются программно), отличия состоя в том, что не выполняются события формы!

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

Для того чтобы назначить документ ПоступлениеМатериалов регистратором для регистра, пройдем в окно свойств документа , перейдем на вкладку Движения и отметим регистр накопления ОстаткиМатериалов ( рис. 5.12). Сразу после этого станет активна кнопка Конструктор движений в нижней части формы . Документ можно назначить регистратором и из формы настройки свойств регистра.


Рис. 5.12.

Обратите внимание на настройки, которые можно задавать на вкладке Движения .

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

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


Рис. 5.13.

В окне конструктора мы можем выбрать регистр , по которому следует сформировать движение (в нашем случае - это единственный регистр ОстаткиМатериалов . Параметр Тип движения регистра может принимать одно из двух значений: Приход или Расход . В нашем случае здесь нужно оставить значение по умолчанию - то есть - Приход .

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

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

Автоматическое заполнение производится, во-первых, с учетом типов, во-вторых, с учетом названий. На рис. 5.14 вы можете видеть окно конструктора движений после выбора в поле Табличная часть табличной части Материалы и нажатия на кнопку Заполнить выражения .


Рис. 5.14.

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

Выделим поле ЦентрОтветственности . Ему соответствует реквизит документа ОтветственныйСотрудник . Для того, чтобы подставить реквизит в поле , достаточно сделать по нему двойной щелчок . На рис. 5.15 вы можете видеть результат заполнения поля ЦентрОтветственности .


Рис. 5.15.

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

ТекСтрокаМатериалы.Номенклатура ТекСтрокаМатериалы.Количество ТекСтрокаМатериалы.Сумма

Сейчас работа с конструктором движений завершена, нажмем на кнопку ОК . Будет сформирована процедура, которая сработает при проведении документа , рис. 5.16 .

Ниже приведен текст процедуры:

Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Для Каждого ТекСтрокаМатериалы Из Материалы Цикл // регистр ОстаткиМатериалов Приход Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура; Движение.ЦентрОтветственности = ОтветственныйСотрудник; Движение.Количество = ТекСтрокаМатериалы.Количество; Движение.Сумма = ТекСтрокаМатериалы.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры

Эта процедура расположена в модуле объекта - то есть - документа .

Основой процедуры является цикл:

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл КонецЦикла;

Этот цикл выполняется для каждой строки (на нее ссылается переменная ТекСтрокаМатериалы ) табличной части Материалы . То есть, в цикле последовательно перебираются все строки табличной части


Ключевые слова: ОбработкаПроведения,проведение,движения

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

Функция п_НаборДвиженийДокументаПолучить(Объект, ИмяРегистра) Если НЕ Объект.Движения[ИмяРегистра].Модифицированность() Тогда НЗ=Объект.Движения[ИмяРегистра]; НЗ.Отбор.Регистратор.Установить(П.Ссылка); НЗ.Прочитать(); КонецЕсли; Возврат Объект.Движения[ИмяРегистра]; КонецФункции

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

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

//Замена счета кредита 76.Н на 68.02 НаборДвижений=п_НаборДвиженийДокументаПолучить(Объект, "Хозрасчетный "); ТЗ=НаборДвижений.Выгрузить(); Модифицированность=ложь ; Для Каждого Стр из ТЗ Цикл Если Стр.СчетКт=ПланыСчетов.Хозрасчетный.РасчетыПоНДСотложенномуДляУплатыВБюджет Тогда //76.Н Стр.СчетКт=ПланыСчетов.Хозрасчетный.НДС; //68.02 Стр.ВидСубконтоКт1 =ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ВидыПлатежейВГосБюджет; Стр.СубконтоКт1 =Перечисления.ВидыПлатежейВГосБюджет.Налог; Стр.СубконтоКт2 =Неопределено; Стр.ВидСубконтоКт2 =Неопределено; Модифицированность=истина ; КонецЕсли; КонецЦикла; Если Модифицированность Тогда НаборДвижений.Загрузить(ТЗ); КонецЕсли; //Дублирование движений по регистру НДС Продажи (реализация дублируется как оплата) НаборДвижений=п_НаборДвиженийДокументаПолучить(О, "НДСПродажи "); ТЗ=НаборДвижений.Выгрузить(); Модифицированность=ложь ; МассивСтрок=Новый Массив(); Для Каждого Стр из ТЗ Цикл Если Стр.Событие=Перечисления.СобытияПоНДСПродажи.Реализация Тогда МассивСтрок.Добавить(Стр); Модифицированность=истина ; КонецЕсли; КонецЦикла; Для Каждого Стр из МассивСтрок Цикл НоваяСтр=ТЗ.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтр, Стр); Стр.Событие=Перечисления.СобытияПоНДСПродажи.Оплата; Стр.СчетФактура=П.Ссылка; КонецЦикла; Если Модифицированность Тогда НаборДвижений.Загрузить(ТЗ); КонецЕсли;

Важно!!! Существует более простой метод добавления записей.
Для этого можно использовать метод Записать(ложь) по набору записей. Он не очищает записи по регистратору, а добавляет записи к уже имеющимся записям по регистратору.



Просмотров