Порядок записи движений регистров при проведении документа
Разработка - Практика программирования
Алгоритм проведения документа с учетом подписок на события
Настройки документа:
Если посмотреть свойства документа через палитру свойств, то можно увидеть два важных свойства: "Удаление движений" и "Запись движений при проведении", причем второе НЕ вынесено на закладку "Движения" окна редактирования документа.
1. Удаление движений.
Если свойство "Удаление движений" уставновлено в "Удалять автоматически", то ПЕРЕД началом проведения программа очищает все движения по регистрам. Фактически это означает запись пустого набора записей регистра с видом записи - замещение. А значит, программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров.
Если для какого-либо регистра определена подписка на событие "При записи", то выполняется код из связанной процедуры.
2. Процедура "ОбработкаПроведения" модуля документа.
Обратим внимание: в начале обработки проведения у всех движений флаг модифицированности Ложь (значение возвращает метод Движения.Регистр.Модифицированность()).
При работе с набором записей регистра (например, Движения.Регистр.Очистить(), Движения.Регистр.Добавить() и т.д.) флаг модифицированности становится Истина.
После записи движения в базу Движения.Регистр.Записать() модифицированность снова ложь.
Если в модуле процедуры подписки происходит запись набора регистра в явном виде (.Записать()), то программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров и процедуры из подписки на событие "При записи" регистра.
3. Подписки на событие "При проведении" документа
Важно понимать: если в обработке проведения документа или в подписках на событие, вызванных ранее, не происходила запись движений регистров в явном виде (Движения.Регистр.Записать()), то движения документа еще НЕ записаны в базу. Поэтому их нельзя получить с помощью запроса, но можно получить из коллекции движений источника.
Процедура ПриПроведенииДокумента(Источник, Отказ, РежимПроведения) Экспорт
Регистр = Источник.Движения.Бухучет;
.....
КонецПроцедуры
Очередность подписок на одно и то же событие явным образом не определяется 1С, но на практике подписки вызываются в порядке следования в ветке "Подписки на события" окна редактирования конфигурации.
Если регистры записываются с помощь метода Записать(), то выполняются все связанные процедуры.
4. Запись движений.
Вспомним про свойство "Запись движений при проведении" из настроек документа.
Если оно равно "Записывать модифицированные", то в базу будут записаны все движения документа, у которых флаг "Модифицированность" Истина.
Если оно равно "Записывать выбранные", то в базу будут записаны движения регистров, для которых мы явным образом указали необходимость записи.
Движения.Регистр.Записывать = Истина;
Запись движений в базу происходит с режимом замещения Истина. Это означает, что будут записаны записи из текущего набора записей регистра коллекции Движения и очищены предыдущие записи.
И в конце рассмотрим несколько примеров:
Пусть свойство документа "Запись движений при проведении" равно "Записывать модифицированные", а "Удаление движений" - "Не удалять автоматически".
Пример 1.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
НовЗапись = Движения.Регистр.Добавить();
....
Движения.Регистр.Записать(Ложь); //***
КонецПроцедуры
При такой процедуре проведения документ при каждом перепроведении будет добавлять запись в регистр, записи будут множиться. Т.к. строка //*** добавляет записи в регистр, признак Модифицированности снимается.
Правильнее будет написать строку //*** как
Движения.Регистр.Записать()
или вообще ее опустить, и тогда программа сама запишет модифицированные движения.
Пример 2.
В 1С 8 движения документа могут формироваться не только в обработке проведения, но и извне, например, из некоторой служебной обработки (так реализовано допроведение документов, восстановление авансов и т.д.).
Приход = Документы.ПриходнаяНакладная.Выбрать();
Проводки = РегистрыБухгалтерии.Регистр.СоздатьНаборЗаписей();
Пока Приход.Следующий() Цикл
ДокСсылка = Приход.Ссылка;
Проводки.Отбор.Регистратор.Установить(ДокСсылка);
НоваяПроводка = Проводки.Добавить();
НоваяПроводка.Период = ДокСсылка.Дата;
НоваяПроводка.Организация = ДокСсылка.Организация;
НоваяПроводка.СчетДт = ПланыСчетов.ПланСчетов.Товары;
НоваяПроводка.СчетКт = ПланыСчетов.ПланСчетов.Поставщики;
НоваяПроводка.Сумма = ДокСсылка.Всего;
Проводки.Записать(Ложь);
КонецЦикла;
В этом случае при перепроведении документа, если происходит изменение движений регистра бухгалтерии (флаг Модифицированности Истина), записи будут замещены записями, сформированными документом.
Пример 3.
Перед началом проведения документа все реквизиты документа записываются в базу данных (т.е. программист может их получить с помощью запроса). Во внутренней памяти создается Объект документа, и у этого объекта есть коллекция движений, которая будет записана после окончания процедуры проведения (см. этап 4).
Если в процессе проведения документа движения по регистрам формируются не с помощью коллекции Движения, принадлежащей внутреннему объекту, а другими способами (вручную в форме набора записей или как в примере 2 и т.д.), то на этапе 4 эти записи будут замещены!!! Чтобы избежать замещения в типовых базах, для документа "ОперацияБух" свойство документа "Проведение" устанавливается в "Запретить".
Если документ должен проводиться по другим регистрам и нельзя запретить проведение, тогда нужно внимательно настраивать свойства документа:
- выбрать вариант записи движений "Записывать выбранные" и убедиться, что Движения.Регистр.Записывать = Ложь
- выбрать вариант записи движений "Записывать модифицированные" и контролировать признак Модифицированности для набора записей этого регистра.
Пример 4.
Нужно понимать, что объект, полученный по ссылке (назовем его "ОбъектДок"), и внутренний объект ("ЭтотОбъект"), созданный в памяти в момент проведения, это два разных экземляра объектов.
ОбъектДок = ДокСсылка.ПолучитьОбъект();
ДвиженияДок = ОбъектДок.Движения;
НовДвижение = ДвиженияДок.Регистр.Добавить();
....
ДвиженияДок.Регистр.Записать();
Соответственно и коллекции движений у них будут разные. У "ОбъектаДок" коллекция движений будет включать только записанный в базу набор записей регистра, а у "ЭтогоОбъекта" - как записанные, так и добавленные и незаписанные записи. По окончании проведения (этап 4) в базу будут записаны наборы записей "ЭтогоОбъекта", причем с признаком Замещать = Истина.
Если записи в набор записей добавляются по способу, описанному выше, то они могут быть замещены на этапе 4.
Специальные предложения
См. также
Полезные процедуры и функции для программиста 140
07.10.2019 8949 HostHost 23
Таблица значений. Нюансы 191
01.10.2019 8461 Yashazz 35
[Шпаргалка] Программное создание элементов формы 283
06.09.2019 9737 rpgshnik 41
Агрегатные функции СКД, о которых мало кто знает 342
05.09.2019 13015 ids79 44
Отслеживание выполнения фонового задания 141
17.08.2019 10428 ids79 16
Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 253
08.08.2019 14080 ids79 30
СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 131
26.07.2019 12669 ids79 6
Обработчики событий при записи объектов. Зачем и что за чем? 202
25.07.2019 12801 4 AlbinaAAA 23
Управление качеством кода 136
22.07.2019 8233 Stepa86 29
СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 146
17.07.2019 11175 ids79 27
Регистры сведений. За кулисами 129
09.07.2019 8716 YPermitin 12
"Меньше копипаста!", или как Вася универсальную процедуру писал 183
04.07.2019 7880 SeiOkami 49
Создание отчетов с помощью СКД - основные понятия и элементы 208
25.06.2019 20978 ids79 17
Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179
11.06.2019 12710 dmurk 134
Регистры накопления. Структура хранения в базе данных 176
16.05.2019 18956 YPermitin 27
Выполнение внешней обработки в фоновом задании 149
11.05.2019 11240 Eret1k 23
Выгрузка документа по условию 5
25.04.2019 6014 m-rv 2
Как прикрутить ГУИД к регистру сведений 23
16.04.2019 8641 m-rv 16
О расширениях замолвите слово... 193
07.04.2019 17837 ellavs 122
Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202
28.03.2019 13915 ellavs 83
Трюки с внешними источниками данных 166
14.03.2019 14212 YPermitin 52
Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 166
03.02.2019 17312 ids79 9
Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария 222
09.01.2019 27568 Vladimir Litvinenko 69
EnterpriseData – часть 2. Процесс выгрузки данных 127
26.12.2018 13765 ids79 27
Новый подход к обмену данными EnterpriseData 207
14.12.2018 23133 ids79 72
Программное заполнение пользовательских параметров и отборов СКД 136
13.11.2018 22140 Unk92 19
Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 127
10.11.2018 22245 ids79 40
Вспомогательные инструкции в коде 1С 105
15.10.2018 21511 tormozit 100
Произвольный код в фоновом режиме 165
03.09.2018 15717 nikita0832 42
Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 147
23.08.2018 22869 Rain88 42
Тестер: частые вопросы 156
25.07.2018 20949 grumagargler 24
Повышаем эффективность разработки правил обмена 124
25.06.2018 20203 olegtymko 47
Введение в механизм представлений в ЗУП ред. 3 156
04.06.2018 25593 xrrg 82
Как сделать запрос на изменение данных 75
01.06.2018 22123 m-rv 21
Строим графы средствами 1С (без GraphViz) 43
23.05.2018 17909 slozhenikin_com 19
Распределение расходов пропорционально продажам 9
13.05.2018 12019 Rustig 9
Просмотр временных таблиц запроса в отладчике без изменения кода 129
24.04.2018 26489 [email protected] 19
[ВсеПросто] "Оперативный" информатор из 1С за 5 мин. 198
22.02.2018 21417 DarkAn 25
Минимализмы 3 355
19.02.2018 37093 ildarovich 44
Этюды по программированию. Взаимодействие с Microsoft Word 109
11.12.2017 26531 milkers 23
Метод формирования движений в типовых регистрах нетиповыми регистраторами 31
05.12.2017 21966 itriot11 34
1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 737
19.11.2017 142788 MaxS 251
Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131
01.11.2017 23695 slava_1c 49
Программные перечисления, ч.2: приемы кэширования при разработке 67
30.10.2017 22015 unichkin 18
Разбираемся с настройками компоновки данных 161
29.10.2017 25096 json 9
Работа с Excel 298
23.10.2017 27093 arakelyan 39
Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 144
18.09.2017 48863 bugtester 43
Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере 127
10.09.2017 35149 tormozit 72