helpf.pro
Регистрация

Создать движения документа, который нельзя проводить - как правильно?

IKSparrow
22.12.2010 18:14Прочитано: 1779
Есть закрытый период. В конфигурацию добавлен новый регистр, по которому надо создать движения по определённым документам. А документы перепроводить нельзя. Сделал в модуле документа функцию (с атрибутом "экспорт") которая порождает нужные мне движения.
Далее простую обработку - отбираем документы за определённый период, сортируем по дате, и получаем ссылку на объект документа и вызываем функцию создания движений по новому регистру.
Всё работает. Только вот незадача - в некоторые моменты, видимо, некорректно высчитываются остатки по новому регистру. Как следствие - неправильные движения порождаются. Хотя если зайти в документ и перепровести его - то всё в порядке.
Верно ли я подошёл к решению задачи или что-то упустил из вида?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
23.12.2010 09:09Ответ № 1
(0) IKSparrow, явно, что-то напутано с датами!
покажи код...
IKSparrow
23.12.2010 10:07Ответ № 2
Собственно запрос остатков, которые надо погасить по новому регистру:


Код 1C v 8.х
 	
ЗапросРДС.Текст =
"ВЫБРАТЬ
| РДСФОстатки.Организация КАК Организация,
| РДСФОстатки.Контрагент КАК Контрагент,
| РДСФОстатки.Договор КАК Договор,
| РДСФОстатки.Схема,
| РДСФОстатки.Очерёдность КАК Очерёдность,
| РДСФОстатки.Валюта,
| РДСФОстатки.СуммаОстаток КАК Сумма
|ИЗ
| РегистрНакопления.РДСФ.Остатки(
| &Дата2,
| Организация = &Организация
| И Контрагент В (&МКонтрагентов)
| И Договор В (&МДоговоров)
| И Валюта В (&МВалют)) КАК РДСФОстатки
|
|УПОРЯДОЧИТЬ ПО
| Организация,
| Контрагент,
| Договор,
| Очерёдность";
ЗапросРДС.УстановитьПараметр("Организация",Организация);
ЗапросРДС.УстановитьПараметр("МКонтрагентов",МКонтрагентов);
ЗапросРДС.УстановитьПараметр("МДоговоров",МДоговоров);
ЗапросРДС.УстановитьПараметр("МВалют",МВалют);
ЗапросРДС.УстановитьПараметр("Дата2",Ссылка.МоментВремени());


Этот код помещён в предопределённую функцию ОбработкаПроведения() и тупо скопипастен в функцию РаспределитьПлатежиПоСхемам() Экспорт

Формирование движений по новому регистру идёт таким образом:
Сначала отбираем выписки, по которым нам надо движения сделать:
Код 1C v 8.х
 
Функция ОтобратьВыпискиПоДоговорам(МДоговоры)
ЗапросВыписок = Новый Запрос;
ЗапросВыписок.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Выписка_РСБУ.Ссылка КАК Выписка
|ИЗ
| Документ.Выписка_РСБУ КАК Выписка_РСБУ
|ГДЕ
| Выписка_РСБУ.Платежи.Счет В ИЕРАРХИИ(&Счёт62)
| И Выписка_РСБУ.Платежи.Субконто2 В(&МДоговоры)
| И Выписка_РСБУ.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| Выписка_РСБУ.Дата";

ЗапросВыписок.УстановитьПараметр("Счёт62",СчетПоКоду("62"));
ЗапросВыписок.УстановитьПараметр("МДоговоры",МДоговоры);

ТЗВыписок = ЗапросВыписок.Выполнить().Выгрузить();
Если ТЗВыписок.Количество() = 0 Тогда
Возврат Ложь;
Иначе
Возврат ТЗВыписок;
КонецЕсли;
КонецФункции


А затем создаём движения по новому регистру:
Код 1C v 8.х
 
Функция СоздатьДвиженияПоВыпискам(ТЗВыписок)
НачатьТранзакцию();
Попытка

Для каждого СтрВыписка Из ТЗВыписок Цикл
ДокОб = СтрВыписка.Выписка.Ссылка.ПолучитьОбъект();
ДокОб.РаспределитьПлатежиПоСхемам();
Состояние("Обрабатывается выписка "+СтрВыписка.Выписка);
КонецЦикла;

Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
Возврат Ложь;
КонецПопытки;
ЗафиксироватьТранзакцию();
КонецФункции



Собственно вот так вот.
Дело в в том, что блок кода работающий в функции проведения получает истинные остатки. А тот же блок кода работающий в отдельной функции, часто ошибается. Когда именно ошибается - пока закономерность не уловил.
E_Migachev
23.12.2010 10:41Ответ № 3
Укажи дату получения остаков через Границу
Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.