Внезапное исчезновение движений документа

02.04.21

Разработка - Механизмы типовых конфигураций

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

Вводная: конфигурация УПП 1.3.153.1 с доработками.

Имеется типовой документ «Требование накладная" с типовыми же настройками УПП:

  • Удаление движений: Не удалять автоматически.
  • Запись движений при проведении: Записывать модифицированные.

 

 

Визуальное описание проблемы:

При первичном проведении документа движения по нетиповому (добавленному) регистру накопления выполняются успешно и корректно. При повторном проведении документа движения исчезают «загадочным образом». При последующем перепроведении документа движения опять появляются и т.д. То есть, то нет…

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

Анализ проблемы:

Анализ механизма проведения по добавленному регистру накопления показал, что разработчик данного механизма по уже неизвестным причинам решил выполнять движения НЕ обращаясь к коллекции движений документа, что было бы правильно, а выполняя запись движений посредством набора записей регистра накопления:

 

 

Однако же точно известно, что до недавнего времени перепроведение документа НЕ приводило к стиранию движений по этому регистру накопления.

Дальнейший анализ показал, что в модуль объекта документа в процедуру «ПередЗаписью()» недавно был добавлен код:

 

 

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

Несмотря на то, что очевидно неправильное выполнение движений, написанное одним из разработчиков, очень хотелось разобраться с тем, почему одна, казалось бы, безобидная строчка кода, привела к таким «катастрофическим» последствиям, как затирание движений. Поиск информации в интернете не дал каких-либо ответов на поставленный вопрос, поэтому и было принято решение оформить небольшую статью – может кому поможет не совершать подобных ошибок.

 

В Обработчике «ОбработкаПроведения()» имеется типовой вызов процедуры «ОбщегоНазначения.УдалитьДвиженияРегистратора(), который очищает все движения регистратора:

 

 

Процедура «ОчисткаКоллекцийДвиженийДокумента()» общего модуля «ОбщегоНазначения» очищает те коллекции движения, в которых количество больше 0:

 

 

При проведении непроведенного документа очистка движений не происходит, т.к. набор записей нашего регистра накопления пуст.

Как результат мы видим, что вернувшись в обработку проведения модифицированность набора записей нашего регистра накопления осталась в значении «Ложь». Это значит, что движения выполнены НЕ будут типовым образом. Но мы уже выяснили, что разработчик внесет изменения в данные регистра накопления позже, используя метод «СоздатьНаборЗаписей()».

Теперь же перепроведем документ.

Перед выходом из процедуры «ПередЗаписью()» модифицированность набора записей стоит «Ложь»:

 

 

Теперь в процедуре ОчисткаКоллекцийДвиженийДокумента()» наш набор записей содержит количество больше 0 и очищается:

 

 

Абсолютно логично, что теперь модифицированность нашего набора записей взведена в положение «Истина»:

 

 

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

 

 

Результат теперь очевиден – мы запишем пустые движения, т.к. согласно настройкам должны записывать модифицированные наборы. А наши «ручные» усилия пропадут, т.к. будут стерты пустым набором записей…

После анализа всё становится логично и понятно, кроме одного момента – почему, если убрать конструкцию «Набор.Прочитать()» в процедуре «ПередЗаписью()», то проблема «исчезновения движений» отсутствует??

Ответ оказался следующим:

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

 

 

Абсолютно все. Получается, что в отсутствие принудительного чтения мы как будто бы «первый раз проводим» наш девственно чистый документ. Действия по очистке движений в процедуре «Обработка проведения» в данном случае не выполняются, т.к. наборы не прочитаны (они пустые) и модифицированность не взводится. Движения заполнятся и модифицированность взведется дальше в логике ОбработкиПроведения.

 

Выводы:

  1. Движения в подчиненные регистраторам регистры нужно выполнять через движения объекта документа, а не «вручную».
  2. Мистики не бывает – на все есть причина – главное ее найти.

 

P.S.

Возможно, для большинства написанное покажется «детским садом», поэтому заранее прошу их реагировать поспокойнее. При написании данной статьи хотелось в первую очередь для себя уложить в голове причину «загадочного поведения» документа. Надеюсь, что кому-то это будет полезно.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист 1С 8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

1 стартмани

20.03.2026    2542    InFlach    0    

5

Механизмы типовых конфигураций Программист Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)

Интервальные регистры в 1С:ЗУП 3.1 заменяют тяжелые срезы последних, ускоряя отчеты по кадровым данным через интервалы ДатаНачала–ДатаОкончания. Разбираем отличия, примеры кода, плюсы и способы синхронизации.

12.03.2026    4243    AlexeyPROSTO_1C    4    

20

Механизмы типовых конфигураций Программист Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)

Как в ЗУП работает механизм расстановки времени в регистрах сведений с помощью подписки на события?Рассматривается логика сдвигов для разных типов документов (прием, увольнение, отпуск) и дается инструкция по подключению нового регистра к этому механизму.

03.03.2026    2446    YA_1100893639    1    

8

Механизмы типовых конфигураций Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

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

11.08.2025    9971    user1988284    0    

25
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. timeforlive 17 19.01.22 22:23 Сейчас в теме
После прочтения в начале статьи: "УПП 1.3.153.1 с доработками", не захотел разбираться в чужой магии.
Своей хватает.
EvgeniyOlxovskiy; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация