Запись документа без перепроведения документа
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
РеализацияТоваровУслугФормыКлиент.ПередЗаписью(
ЭтаФорма, Отказ, ПараметрыЗаписи);
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
РеализацияТоваровУслугФормы.ПослеЗаписиНаСервере(ЭтаФорма, Объект, ПараметрыЗаписи);
// СтандартныеПодсистемы.РаботаСКонтрагентами
ПроверкаКонтрагентов.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.РаботаСКонтрагентами
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
РеализацияТоваровУслугФормы.ПередЗаписьНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи);
// СтандартныеПодсистемы.РаботаСКонтрагентами
ПроверкаКонтрагентов.ПередЗаписьюНаСервереДокумент(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.РаботаСКонтрагентами
ПроверкаРеквизитовОрганизации.ПередЗаписьюНаСервере(
Объект.Организация,
Объект.БанковскийСчетОрганизации,
ИспользоватьНесколькоБанковскихСчетовОрганизации,
Отказ,
ПараметрыЗаписи,
Ложь);
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
РеализацияТоваровУслугФормы.ПриЗаписиНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
// СтандартныеПодсистемы.РаботаСКонтрагентами
ПроверкаКонтрагентов.ПриЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.РаботаСКонтрагентами
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
РеализацияТоваровУслугФормыКлиент.ПослеЗаписи(
ЭтаФорма, ПараметрыЗаписи);
Оповестить(«Запись_РеализацияТоваровУслуг», ПараметрыЗаписи, Объект.Ссылка);
Источник
Записать проведенный документ без перепроведения
В 7-ке все было просто. Проведен не проведен документ написал
Док.Записать() и все
А как быть в 8-ке. Нужно проведенному документу пару реквизитов поменять. Реквизиты типа Комментария
(10) совсем тупой или прикидываешься?
(12) А ты с 7кой голимой не сранивай .
Ты наверно записываешь проведенный документ . то есть проводки то остались, а реквизиты ты поменял
(13) Тема топика: Записать проведенный документ без перепроведения
Я записываю проведенный документ. Мне нужно изменить реквизиты проведенного документа.
Код я уже приводил. Это просто тест. Проверял, что регистры двигаются.
(15) милиард раз менял реквизиты в проведенном документе и записывал без перепроведения.
Мда.
Бывает порой вот кто-нить типа автора задаст простой вопрос, ему дадут простой ответ, а он нет, грит, не работает.
И все, немая пауза, типа кто durak-то? :))
Автору: просто сделай то, что написано в этой ветке. Работает. СТО процентов.
(26) По поводу Нафига.
В 7-ке есть реально два метода Записать и Провести
В 8-ке метод один
Потому как если давать РежимЗаписиДокумента.Проведение то явно подразумевается, что запись выполнится раньше.
Т.е. если давать РежимЗаписиДокумента.Запись для не проведенного документа, то это будет только запись. А если для проведенного, то у меня по крайней мере попадает в модуль проведения в отличии от (27)
Может это где настраивается. Но я пока не нашел
В 7-ке можно было написать ПриЗаписиПерепроводить(1) Но это касалось только интерактивной записи и поэтому программно легко можно было сделать содержимое документа одним, а регистры другими
В 8-ке мне пока это не удалось сделать.
Может это где настраивается. Но я пока не нашел
этот флажок ставится (или не ставится) в свойствах формы
Как называется флажок в терминах 8-ки?
Хотя в данном случае формы нет.
я не знаю, может рарусу и лень делать форму документа, но это совсем маловерятно.
(32) да. увидел. спасибо. Стоит ПриЗаписиПререпроводить
Но я так думаю, что это касается конкретной формы.
(33) Да. случай действительно тяжелый
У меня юзеры не могут по правам неоперативно проводить документы, но с другой стороны нужно обработкой дописать в общем не существенные реквизиты (комментарий например), а получается, что нельзя без проведения
(31) показывает, что в обработку проведения я вываливаюсь прямо из формы обработки
В общем не получается у меня записать ПРОВЕДЕННЫЙ документ без перепроведения
Автор верно заметил — снеговик отличается от клюшек. Но ещё не осознал всю глубину отличий. Незная как работает платформа — сложно «отделить» реакцию платформы от поведения конфы.
Теперь по теме:
Если автору не удается записать документ без перепроведения не иначе, как только используя «ОбменДанными.Загрузка = Истина» — то можно смело предположить, что «проблема» кроется в используемой конфигурации.
Пояснение:
Грубо говоря, «ОбменДанными.Загрузка = Истина;» предназначено, прежде всего, для конфигурации. Типовая конфа, как правило, анализирует это значение перед контролем интерактивных действий пользователя и не выполняет их во время обмена данными — считается, что данные уже были проверены в том узле, откуда они поступают.
Про ОбменДанными.Загрузка = Истина; и смысл этого я уже почитал немного
Всем спасибо за обсуждение! Особенно (36) ptiz!
Источник
перепроведение документа из модуля формы.
попробуй вот так:
Обход блокировок в открытых формах документов и справочников.
Алексей Николаев (AlexNik) июнь 2002
———————————————————————————
Иногда возникает необходимость изменения даты проведенного документа в момент, когда открыта форма этого документа.
Пользователь хочет изменить дату документа, не открывая журнал и не закрывая форму документа.
Проблема очевидна – пока открыта форма документа, он заблокирован, и программные действия (СделатьНеПроведенным, Записать и пр.) просто недопустимы.
Необходимо придумать что-то такое, чтобы пользователь смог изменить дату проведенного документа, просто нажав на кнопку в открытой форме этого же документа.
Та же самая ситуация возникает, когда мы хотим изменить родителя или владельца в открытой форме элемента справочника.
Вопрос: а можно ли как-нибудь обойти блокировку некоторых методов объекта «Документ» или «Справочник», возникающуюю автоматически при открытии формы объекта? Ответ: «да, можно». Хотя ответ и не очивиден, но он именно таков.
Механизм одинаков для всех случаев, для удобства рассмотрим пример решения задачи по изменению даты проведенного документа.
Пользователь открыл документ. Документ проведен. Пользователь меняет дату, жмет на кнопку (например, «Провести»)… V7 не выдает сообщение «Изменена дата проведенного документа!», а молча отрабатывает действие пользователя.
Пытаемся переложить все программные манипуцляции с документом в обработку.
Последовательность программных действий следующая.
По кнопке в документе, например, по той же «ОК», открываем форму некоей обработки, в которую передаем необходимые параметры.
В обработке, в процедуре ПриОткрытии, инициализируем переданные параметры, закрываем форму документа.
В форме документа, в процедуре ПриЗакрытии, проверяем, что это «инициатива» служебной обработки, закрываем форму обработки.
В форме обработки, в процедуре ПриЗакрытии, делаем необходимые манипуляции с документом, затем открываем его форму обратно.
В результате наблюдаем эффект мелькания формы документа на экране. Если документ долго перепроводится, то открытое в этот момент окно формы обработки можно использовать для вывода сообщений, типа «wait please…».
Источник
Изменение документа без перепроведения. Когда это нужно и как это сделать?
автор статьи: Фёдор Езеев
опубликовано: февраль 2003
Иногда возникает необходимость внести незначительные изменения в уже проведенный документ. «Незначительные» в данном контексте означает такие изменения, которые не влияют на движения регистров (и вообще на любые процедуры, выполняемые в процессе проведения документа). Самым простым примером может служить изменение поля «Комментарий».
Однако движку V7 абсолютно безразлично, влияют ли внесённые в документ изменения на состояние регистров, или нет. Если документ был изменен его надо перепровести. Ну а где проведение задним числом, там и восстановление границы последовательности, и прочие маленькие радости администраторов баз данных V7.
В статье описан технический прием, позволяющий обойти обозначенную проблему.
Для решения, очевидно, нужно использовать методы и Пробуем сделать по-простому: на элемент формы «Комментарий» вешаем функцию в которой написано следующее:
Процедура ПриВводеКомментария() |
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецПроцедуры
Так же нужно не забыть проверить состояние документа перед изменением нашего поля. Если документ уже был изменен очевидно, записывать его без перепроведения было бы некорректно. Это тоже просто:
Процедура ПриВводеКомментария() |
Если НужноПерепроводить=0 Тогда
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
К сожалению, «просто» не всегда означает «правильно». Такая схема не работает, поскольку при изменении любого реквизита движок V7 сразу же ставит флажок модифицированности. То есть в нашей процедуре метод Модифицированность() вернет единицу в любом случае.
Но и этого можно избежать, правда, принеся в жертву наглядность. Поле для редактирования реквизита заменяем на текстовое поле, которое изображает текущее состояние реквизита (в поле «формула» нужно занести идентификатор реквизита, в нашем случае «Комментарий»). И рядом добавляем кнопку, на которую вешаем нашу процедуру.
Но нам еще нужно будет организовать изменение реквизита. Окончательный результат:
Процедура ВыборКомментария() |
НовыйКомментарий=СокрЛП(Комментарий);
ВвестиСтроку(НовыйКомментарий,»Введите комментарий»,400,1);
Если СокрЛП(Комментарий)=СокрЛП(НовыйКомментарий) Тогда
Возврат;
КонецЕсли;
Комментарий=СокрЛП(НовыйКомментарий);
Если НужноПерепроводить=0 Тогда
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
Таким же образом можно разделаться с реквизитами любого типа: процедура будет такой же, только блок выбора значения для реквизита будет немного различаться (а если подойти творчески, то можно написать универсальную процедуру, которая сама определяет тип и выдаёт нужный диалог).
Кроме достоинства (оно действительно работает), у описанной техники есть и недостатки. Их два:
- Уже упоминавшаяся потеря привычной наглядности. Частично ее можно избежать, заменив текст на поле реквизита, недоступное для редактирования. Особенно хорошо это работает для флажков, чисел и агрегатных типов данных.
- Если таких «неважных» реквизитов в документе несколько, и пользователю требуется изменить их все, то на сервер «обрушится» несколько последовательных сохранений одного и того же документа.
Откройте доступ к закрытой части «Клерка» с подпиской «Премиум». Получите сотни вебинаров и онлайн-курсов, безлимитные консультации и другой закрытый контент для бухгалтеров.
Успейте подписаться со скидкой 20% до 15.10.2021. Подробнее про «Премиум» тут.
Источник
Изменение документа без перепроведения. Когда это нужно и как это сделать?
автор статьи: Фёдор Езеев
опубликовано: февраль 2003
Иногда возникает необходимость внести незначительные изменения в уже проведенный документ. «Незначительные» в данном контексте означает такие изменения, которые не влияют на движения регистров (и вообще на любые процедуры, выполняемые в процессе проведения документа). Самым простым примером может служить изменение поля «Комментарий».
Однако движку V7 абсолютно безразлично, влияют ли внесённые в документ изменения на состояние регистров, или нет. Если документ был изменен его надо перепровести. Ну а где проведение задним числом, там и восстановление границы последовательности, и прочие маленькие радости администраторов баз данных V7.
В статье описан технический прием, позволяющий обойти обозначенную проблему.
Для решения, очевидно, нужно использовать методы и Пробуем сделать по-простому: на элемент формы «Комментарий» вешаем функцию в которой написано следующее:
Процедура ПриВводеКомментария() |
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецПроцедуры
Так же нужно не забыть проверить состояние документа перед изменением нашего поля. Если документ уже был изменен очевидно, записывать его без перепроведения было бы некорректно. Это тоже просто:
Процедура ПриВводеКомментария() |
Если НужноПерепроводить=0 Тогда
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
К сожалению, «просто» не всегда означает «правильно». Такая схема не работает, поскольку при изменении любого реквизита движок V7 сразу же ставит флажок модифицированности. То есть в нашей процедуре метод Модифицированность() вернет единицу в любом случае.
Но и этого можно избежать, правда, принеся в жертву наглядность. Поле для редактирования реквизита заменяем на текстовое поле, которое изображает текущее состояние реквизита (в поле «формула» нужно занести идентификатор реквизита, в нашем случае «Комментарий»). И рядом добавляем кнопку, на которую вешаем нашу процедуру.
Но нам еще нужно будет организовать изменение реквизита. Окончательный результат:
Процедура ВыборКомментария() |
НовыйКомментарий=СокрЛП(Комментарий);
ВвестиСтроку(НовыйКомментарий,»Введите комментарий»,400,1);
Если СокрЛП(Комментарий)=СокрЛП(НовыйКомментарий) Тогда
Возврат;
КонецЕсли;
Комментарий=СокрЛП(НовыйКомментарий);
Если НужноПерепроводить=0 Тогда
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
Таким же образом можно разделаться с реквизитами любого типа: процедура будет такой же, только блок выбора значения для реквизита будет немного различаться (а если подойти творчески, то можно написать универсальную процедуру, которая сама определяет тип и выдаёт нужный диалог).
Кроме достоинства (оно действительно работает), у описанной техники есть и недостатки. Их два:
- Уже упоминавшаяся потеря привычной наглядности. Частично ее можно избежать, заменив текст на поле реквизита, недоступное для редактирования. Особенно хорошо это работает для флажков, чисел и агрегатных типов данных.
- Если таких «неважных» реквизитов в документе несколько, и пользователю требуется изменить их все, то на сервер «обрушится» несколько последовательных сохранений одного и того же документа.
Откройте доступ к закрытой части «Клерка» с подпиской «Премиум». Получите сотни вебинаров и онлайн-курсов, безлимитные консультации и другой закрытый контент для бухгалтеров.
Успейте подписаться со скидкой 20% до 15.10.2021. Подробнее про «Премиум» тут.
Источник