Перепроведение Документов

5. Гость 18.12.11 23:18
Что касается твоей проблемы:
1. Снимать с проведения и проводить другой датой необходимо в одной транзакции, тогда никто не возьмет твои остатки. Есть небольшая хитрость. Использовать служебную обработку для смены даты проведенного документа
2. Поставь в метаданных Документа не удалять автоматически движения.
Тогда они будут очищаться, только при вызове метода ОчиститьДвижения()в модуле документа. Если не вызывать этот метод, то любое движение по регистру, будет добавляться в существующие. В твоем конкретном случае, можно сделать следующее: после проведения сохранить в документе копию табличной части , потом, когда надо будет проводить заново, то сравнить сохраненную табличную часть, с существующей, и проводить только разницу между этими таблицами. Табличную часть лучше всего сохранять в служебный документ, который по структуре копирует табличную часть выбранного документа. ВыгружаешьТабличнуюЧасть в служебный документ, сохраняешь где-нибудь в 2000 годе, и сохраняешь в новом служебном реквизите выбранного документа. При перепроведнии, табличная часть выбранного документа изменена, но у тебя есть копия в служебном документе. Сравнивай и допроводи.
[+] [−]
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. vasilykushnir 63 23.12.11 14:46 Сейчас в теме
(5) Как думаешь, за 5 с половиной лет я уже решил проблему? Вот нафига древние темы подымать?
+
7. vasilykushnir 63 25.05.06 11:43 Сейчас в теме
Ребята, вот какая стоит задача:
1. Есть два документа Перемещение товара с оперативного отдела на отдел экспедиции и Расходная Накладная (РН) для клиента, в которую входят товары из нескольких перемещений. Иногда создается ситуация, когда Перемещение имеет более позднюю дату, чем РН. Требуется изменить (не отменяя проведения) дату РН и перепровести новым числом. Омена проведения может не сработать, т.к. пока будет проходить коректировка и перепроведение остатки могут "украсть" другие документы (в среднем одновременно работают 29 пользователей и за всеми не уследишь).
2. В развитие этой же темы. Есть документ Перемещение, в который в течении дня добавляются строки. Сейчас документу отменяется проведение, добавляются товары и снова проводится. Сутуация с остатками аналогична первому пункту. Можно ли реализовать следующий алгоритм: добавление в проведенный документ новых строк (для раннее проведенных строк запрет любых изменений) и повторное проведение документа только по новым строкам (в строку можно после этого добавить признак проведения).
+
8. harleq 27 25.05.06 23:54 Сейчас в теме
1. Из приведенного описания ясно, что работают 29 пользователей в режиме реального времени, т.е. делают документы текущей датой.
Общеизвестно, что расчет итогов регистров не идет только при условии, если проводимый документ сам является точкой актуальности(ТА), остальные же документы при проведении производят расчет итогов (кстати, тем самым блокируют остальных, у других возникает та самое сообщение о транзакции). Если конечно не вызван метод в модуле формы документа:
ПроводитьПослеТА(<ФлагДляНеПров>,<ФлагДляПров>)
Цитата из помощи
"Установить режим проведения документа после ТА. Возвращает текущее значение режима перепроведения документа в зависимости от проведенности.
Параметры:
<ФлагДляНеПров> - режим проведения документа после ТА. Число: -1 (минус единица) - проводить документ всегда задним числом; 0 - при проведении запрашивать режим проведения документа; 1 - проводить документ в реальном потоке времени, т.е. при проведении время документа автоматически устанавливается на время после ТА.
<ФлагДляПров> - режим перепроведения документа после ТА. Числовое выражение: -1 (минус единица) - проводить документ всегда задним числом; 1 - проводить документ в потоке.
Замечание:
Метод доступен только в Модуле формы документа и работает с документом доступным в локальном контексте.
"
Из описания метода ясно, если поставить в обоих параметрах 1, то расчета итогов проводится не будет, т.к. при каждом проведении документ будет сдвигаться на самое последнее время в течении дня, что не всегда желательно, особенно при перепроведении документа. Представьте себе, что вы перепроводите перемещение, и оно вдруг скакнуло с утра на вечер. Тогда все документы реализации, которые были введены в течении дня будут списывать в минус. Нам необходимо, чтобы документ остался на своем месте, но учитывал остатки на конец дня, т.е. на ТА.
Так что в делаем допущение, что в обоих параметрах стоит -1.
Итак, документ при проведении (если новый или просто предварительно сняли с проведения) и перепроведении остается на своем старом месте.
Но остатки брать на ТА. Т.е. не делать расчета итогов, если ТА равна текущей дате. Тогда времени на расчет итогов не будет тратится и время проведение резко уменьшится.
Все это написал, и понял, что у тебя проблема немного другого плана. :) Ну не пропадать же тексту.

+
9. harleq 27 26.05.06 00:07 Сейчас в теме
Что касается твоей проблемы:
1. Снимать с проведения и проводить другой датой необходимо в одной транзакции, тогда никто не возьмет твои остатки. Есть небольшая хитрость. Использовать служебную обработку для смены даты проведенного документа
2. Поставь в метаданных Документа не удалять автоматически движения.
Тогда они будут очищаться, только при вызове метода ОчиститьДвижения()в модуле документа. Если не вызывать этот метод, то любое движение по регистру, будет добавляться в существующие. В твоем конкретном случае, можно сделать следующее: после проведения сохранить в документе копию табличной части , потом, когда надо будет проводить заново, то сравнить сохраненную табличную часть, с существующей, и проводить только разницу между этими таблицами. Табличную часть лучше всего сохранять в служебный документ, который по структуре копирует табличную часть выбранного документа. ВыгружаешьТабличнуюЧасть в служебный документ, сохраняешь где-нибудь в 2000 годе, и сохраняешь в новом служебном реквизите выбранного документа. При перепроведнии, табличная часть выбранного документа изменена, но у тебя есть копия в служебном документе. Сравнивай и допроводи.
+
10. harleq 27 26.05.06 00:09 Сейчас в теме
в дополнении пункту 1, добавлю следующий метод изменения даты проведенного документа прямо из формы проведенного документа.
Автор: Алексей Николаев (AlexNik) :
"Иногда возникает необходимость изменения даты проведенного документа в момент, когда открыта форма этого документа.

Пользователь хочет изменить дату документа, не открывая журнал и не закрывая форму документа.

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

Необходимо придумать что-то такое, чтобы пользователь смог изменить дату проведенного документа, просто нажав на кнопку в открытой форме этого же документа.

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

Вопрос: а можно ли как-нибудь обойти блокировку некоторых методов объекта "Документ" или "Справочник", возникающуюю автоматически при открытии формы объекта? Ответ: "да, можно". Хотя ответ и не очивиден, но он именно таков.

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

Задача

Пользователь открыл документ. Документ проведен. Пользователь меняет дату, жмет на кнопку (например, "Провести")… V7 не выдает сообщение "Изменена дата проведенного документа!", а молча отрабатывает действие пользователя.

Решение

Пытаемся переложить все программные манипуцляции с документом в обработку.

Последовательность программных действий следующая.

По кнопке в документе, например, по той же "ОК", открываем форму некоей обработки, в которую передаем необходимые параметры.

В обработке, в процедуре ПриОткрытии, инициализируем переданные параметры, закрываем форму документа.

В форме документа, в процедуре ПриЗакрытии, проверяем, что это "инициатива" служебной обработки, закрываем форму обработки.

В форме обработки, в процедуре ПриЗакрытии, делаем необходимые манипуляции с документом, затем открываем его форму обратно.

В результате наблюдаем эффект мелькания формы документа на экране. Если документ долго перепроводится, то открытое в этот момент окно формы обработки можно использовать для вывода сообщений, типа "wait please…".

Что при этом происходит

Oткрывается обработка, документ пока заблокирован

закрывается документ (из обработки при ее открытии), документ еще заблокирован

при закрытии документа вызываем закрытие обработки, документ пока заблокирован

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

Код
//В модуле формы документа 

Перем ПараПараметров;

...

Процедура ПриЗакрытии()
   Если ТипЗначенияСтр(ПараПараметров) = "ГрупповойКонтекст" Тогда 
// форма обработки открыта
      ПараПараметров.Форма.Закрыть();
// закрываем форму обработки
   КонецЕсли;
КонецПроцедуры // ПриЗакрытии 

Процедура Тест() // по кнопке
   ПараПараметров = СоздатьОбъект("СписокЗначений");
   ПараПараметров.Установить("КонтекстДокумента", Контекст);
   // передаем контекст документа
   ПараПараметров.Установить("НоваяДата",ДатаДок-1);
   // передаем дополнительные параметры, например, новую дату документа
   ОткрытьФорму("Обработка.ТестИзмененияДаты", ПараПараметров);
   // открываем форму обработки
КонецПроцедуры // Тест
...

// Модуль формы обработки.

Перем ТекДок, НоваяДата;
// вспомогательные переменные, можно хранить в списке значений 

// здесь форма документа уже закрыта, блокировки нет
// делаем необходимые манипуляции,
// после которых открываем форму документа
Процедура ПриЗакрытии()
   Док = СоздатьОбъект("Документ");
   Если Док.НайтиДокумент(ТекДок) = 1 Тогда
      Если Док.Проведен() = 1 Тогда
         Док.СделатьНепроведенным();
      КонецЕсли;
      Док.ДатаДок = НоваяДата;
      Док.Записать();
      Док.Провести();
      ОткрытьФорму(ТекДок);
   КонецЕсли;
КонецПроцедуры // ПриЗакрытии 

// при открытии формы обработки запоминаем переданные параметры,
// после чего закрываем форму документа (ставится "в очередь")
Процедура ПриОткрытии()
   Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
      КонтекстДокумента = Форма.Параметр.Получить("КонтекстДокумента");
      НоваяДата = Форма.Параметр.Получить("НоваяДата");
      ТекДок = КонтекстДокумента.ТекущийДокумент();
      КонтекстДокумента.Форма.Закрыть(0);
   Иначе
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры // ПриОткрытии"
Показать полностью
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот