Изменить движения документа программно 1с
Запись и проведение документа в форме
Для понимания особенностей записи и проведения документа в форме следует, прежде всего, разделять особенности записи самого объекта ( ДокументОбъект ) и особенности работы расширения формы. Расширение формы документа действует, если основной реквизит формы имеет тип ДокументОбъект . Оно обеспечивает специфическую функциональность формы при редактировании и записи документа. Задача расширения заключается в реализации удобного для пользователя поведения формы. Но собственно запись и проведение документа выполняет, разумеется, объект, являющийся реквизитом формы. Расширение документа обрабатывает различные команды пользователя, выполняет предварительные проверки и другие сервисные действия, а затем вызывает запись объекта. Запись объекта выполняется так же, как и если бы она вызывалась средствами встроенного языка. То есть с точки зрения объекта запись в форме и запись средствами языка ничем не различаются. Таким образом, расширение обеспечивает некоторую сервисную функциональность, обращаясь в конечном итоге к функциональности объекта. Следует учитывать, что расширение формы действует, только если используются механизмы формы и не действует, если выполняется обращение непосредственно к объекту. Например, если вызвать метод Записать() у объекта ДокументОбъект , то никакие действия расширения формы не будут выполняться. Чтобы они выполнялись нужно вызывать метод ЗаписатьВФорме() .
Далее мы рассмотрим те сервисные действия, которые обеспечивает расширение формы документа. В данном разделе, мы опишем только те действия, которые специфичны именно для расширения формы документа и не будем касаться общих действий, которые поддерживаются расширениями всех объектов.
Установка даты документа
При открытии формы нового документа, если дата документа не установлена (равна значению типа Дата по умолчанию), то документу устанавливается рабочая дата. Следует заметить, что используется именно рабочая дата, а не текущая (если не установлено использование текущей даты в качестве рабочей). Это дает возможность пользователю настроить рабочую дату так, чтобы новые документы вводились определенной датой. При этом в качестве даты устанавливается начало дня (дата без времени), даже если в качестве рабочей даты выступает текущая дата. Но если свойство АвтоВремя имеет значение НеИспользовать , и рабочая дата равна текущей, то устанавливается текущая дата, вместе со временем. Таким образом, для варианта АвтоВремя = НеИспользовать при открытии берется рабочая дата (если она отличается от текущей) или текущая дата вместе со временем, а для остальных вариантов установка времени откладывается на момент записи документа.
При записи нового документа в форме если свойство АвтоВремя имеет значение отличное от НеИспользовать , и не используется оперативное проведение, и время документа пустое (0:00:00), то выполняется автоматическая установка времени на основании значения свойства АвтоВремя . Действие расширения формы в этом случае аналогично вызову метода УстановитьВремя() с вариантом выбранном в свойстве АвтоВремя и с использованием журналов документа.
Расширение формы так же предоставляет команды для установки времени документа в начало дня, конец дня, перед предыдущим и за последующим документом.
Установка режима записи
При нажатии кнопки " ОК ", если для документа в метаданных разрешено проведение, документ записывается в режиме проведения.
Кроме того, расширение формы предоставляет две отдельные команды для записи с проведением и записи с отменой проведения.
При любой записи документа в форме, если установлено свойство расширения формы ПриЗаписиПерепроводить и документ проведен, то выполняется запись в режиме проведения. Это позволяет исключить ситуацию, когда пользователь изменит документ, а движения документа не будут обновлены.
Установка режима оперативного проведения
При записи документа в форме, расширение формы выполняет установку режима проведения (оперативное или неоперативное проведение). Установка выполняется по следующему алгоритму.
Вначале если свойство ИспользоватьРежимПроведения имеет значение Авто выполняется первичный подбор режима проведения из вариантов Оперативный , Неоперативный и Запрашивать .
Если у пользователя нет права на неоперативное проведение – используется оперативное проведение.
Если документ не проведен – используется оперативное проведение.
Если дата документа равна текущей, а время меньше или равно текущему, то используется режим Запрашивать . Здесь и далее в этой статье сравнение даты имеется в виду без учета времени, а сравнение времени описывается отдельно.
Если дата документа меньше текущей, то используется неоперативное проведение.
Если дата документа равна текущей и время больше текущего – используется оперативное проведение.
Дальнейшие действия системы определяются уже исходя из трех вариантов ( Оперативный , Неоперативный и Запрашивать ) установленных непосредственно в свойстве ИспользоватьРежимПроведения или на основании описанного алгоритма для варианта Авто .
Если дата документа меньше текущей, используется оперативный режим и у пользователя есть права на неоперативное проведение, то пользователю предлагается использовать неоперативный режим. Если пользователь отказывается, то запись документа отменяется.
Если дата документа меньше текущей, используется оперативный режим и у пользователя нет права на неоперативное проведение, то запись документа отменяется.
Если дата документа меньше текущей и используется режим Запрашивать , то в зависимости от наличия прав на неоперативное проведение или выбирается неоперативный режим (без запроса пользователя), или запись документа отменяется.
Если дата документа больше текущей и используется оперативный режим, то запись документа отменяется. Штатное поведение расширения формы не разрешает проведение документа завтрашней датой, даже если у пользователя есть права на неоперативное проведение. Это объясняется тем, что после появления документов проведенных завтрашней датой текущие остатки регистров используемых проводимыми оперативно документами перестают соответствовать реальным остаткам и механизм оперативного проведения для всех пользователей перестает работать адекватно.
Далее если используется режим Запрашивать , то пользователю выдается диалог с выбором режима проведения.
Полученный таким образом режим проведения ( Оперативный или Неоперативный ) используется при выполнении записи документа.
Проверка прав
При открытии формы документа, если документ проведен, а у пользователя нет права "Интерактивное изменение проведенных", то расширение переводит форму в режим ТолькоПросмотр .
При записи документа в форме выполняется проверка прав на интерактивное проведение и интерактивную отмену проведения в соответствии с текущим режимом записи.
Считывание движений
При открытии формы документа, если есть табличные поля, связанные с движениями (наборами записей) объекта редактируемого в форме, то эти движения считываются из базы данных и соответственно отображаются в табличных полях.
есть документ на 1000 строк, мне нужно изменить движение по 50 строкам для 2х регистров, проблемма в том, что отбор по измерению не работает :) собствено кто знает как победить?
Рег = РегистрыНакопления.ТекущиеКомиссии.СоздатьНаборЗаписей();
Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
Рег.Отбор.Добавить("ДенежноеТребование");// тут ошибка
ТПР_Рег = Рег.Выгрузить(Новый Массив());
-------------------------
и все движения записывать не охота (там последовательность сдвинится) и по 1 строке - тоже не дело.
Надо было заменить тип и значение субконто по сложному алгоритму.
Делал так:
PS Не уверен, что последовательность не сдвинется.
(0) Как то странно ты это делаешь.
Почему не так:
т.е. у конкретного дока набор прочитать и поменять.
(3) Зачем получать весь объект целиком, если для доступа к его движениям достаточно только ссылки?
Вот это точно совершенно лишнее телодвижение при работе с базой и если документов очень много и они разные и возможно достаточно большие.
(5) Я к сути и придираюсь :)
Нафига тебе целый документ-объект, когда достаточно документ-ссылки?
Суть набора записей регистра совершенно не поменяется от того, каким образом ты его получил - через коллекцию Движения объекта или через установку отбора по регистратору на набор записей.
(0) "и все движения записывать не охота (там последовательность сдвинется)" - а с фига ли она сдвинется? :-)
Изменять ручками движения - опасно. Если у тебя документ потом перепроведут ненароком - все движения опять съёдут по новой.
Не совсем понятен смысл операции. и кстати.. а зачем делать такие монстроидные документы?
(3) я-же сказал, что не хочу записывать весь набор
(7) сдвинутся по тому, что есть движения регистра, так-же зарегятся изменения в планах обмена для всего набора целиком.
по поводу перепроведения - я знаю
(1) это то-же что и у меня, записывается весь набор.
мне нужно записать 5 строк из набора движений в 1000 строк и при этом не хочется дергать все тригеры которые висят на регистрах
(0) прочитать набор по регистратору, изменить (любым способом), записать набор. или не читать, а тупо по новой набор сделать.
Странно, а свойство объекта документа "Движения" чем не подходит?
Получил объект, получил движения, переделал как надо, записал.
да похер, сдвинь, потом границу последовательность обратно перетяни
(11) синтакс помощник говорит
Отбор (Filter)
Использование:
Только чтение. .
Это фантастика :-) Последовательность тесно связана с понятием Граница, а значит зависит ТОЛЬКО от двух компонент от даты документа (а она у тебя не меняется) и от гуида документа(он тоже у тебя остаётся тем же самым). Следовательно при этих условиях при перепроведении документа Граница НЕ МОЖЕТ измениться ни при каких обстоятельствах.
Насчёт правил обмена - аналогично. Неужели ты думаешь, что перепроведение документа это уже повод помещения в обмен всех его движений по регистрам "по новой"? Да ты что.. обмен бы тогда бы пух немеряно.
Короче - продолжаю настаивать, что ты сейчас решаешь не ту задачу (мнение безусловно лично-экспертное)
(18) >> а значит зависит ТОЛЬКО от двух компонент от даты документа (а она у тебя не меняется) и от гуида документа.
А перечень регистров в последовательности просто так указывается? Для красоты?
Если я правильно понимаю, то последовательность контролирует именно изменение регистров, а не проведение документа. Просто в обычной работе изменение регистра связано с проведением документов.
(19) "А перечень регистров в последовательности просто так указывается? Для красоты? "
Они указываются для процедуры "восстановление последовательности". Что бы данная процедура могла найти "концы" что нужно перепроводить.
но если даты у доков не меняются и гуиды те же. то перепроведение документа ничего не сбивает в последовательности
(21) а можно "ответы на вопросы" в качестве апа?
Почему считаете, что из-за перепроведения - меняется последовательность (если не меняется дата)
почему считаете, что в обмены идут не объектные данные, хотя более здраво передавать объекты, а движения по регистрам уже делать "на месте"?
Читайте также: