1с 7 установить время документа
Собсно, вопрос - как можно изменить время документа из самого же документа? Есть вариант запуска какой-либо обработки, но не знаю как корректно её вызвать, чтобы не сработала блокировка документа..
Ну так а в чем проблема? Что не работает? Платформа? Приведите код обработки!
Проблема в чем - в процедуре закрытия вызываю обработку, которая должна найти документ по переданному в неё контексту, изменить время и перепровести, но документ в это время еще заблокирован. Вот и спрашиваю - как можно красиво обойти блокировку?
"Самое "красивое" написать в ВводНового():<br><br>АвтоВремяКонецДня();"
Этот вариан не пойдет - именно самому надо менять время документа. <br>
Включить обработку ожидания на 1 секунду и оз нее вызвать обработку для изменения времени документа.
Подскажи, пожалуйста, поподробнее.
"Вот у меня в документе кнопка "Изменить время документа" и процедура к ней:<br>Процедура ИзменитьВремя()<br> Конт=ТекущийДокумент();<br> ОткрытьФорму("Обработка.ИзменитьВремяДокумента",Конт);<br> Форма.Закрыть();<br>КонецПроцедуры<br><br>В обработке ИзменитьВремяДокумента на форме 4 поля ввода:<br>ВыбДокумент - типа Документ<br>ЧЧ - число, не отрицательное для часов<br>ММ - число, не отрицательное для минут<br>СС - число, не отрицательное для секунд<br>У ЧЧ формула Контроль(0), у ММ формула Контроль(1), у СС формула Контроль(1).<br>У кнопки Выполнить формула Выполнить()<br><br>Далее привожу текст модуля:<br>Процедура Выполнить()<br> Если ВыбДокумент.Выбран()=0 Тогда<br> Предупреждение("Не выбран документ!");<br> Возврат;<br> КонецЕсли;<br> Док=СоздатьОбъект("Документ."+ВыбДокумент.Вид());<br> Док.НайтиДокумент(ВыбДокумент);<br> БылПоведен=0;<br> Если Док.Проведен()=1 Тогда<br> Док.СделатьНеПроведенным();<br> БылПоведен=1;<br> КонецЕсли;<br> Док.УстановитьВремя(ЧЧ,ММ,СС);<br> Док.Записать();<br> Если БылПоведен=1 Тогда<br> Док.Провести();<br> КонецЕсли;<br>КонецПроцедуры<br><br>Процедура Контроль(Поле)<br>//Часы max - 23, min - 00<br>//Минуты max - 59, min - 00<br>//Cекунды max - 59, min - 00<br> Если Поле=0 Тогда //Часы<br> Если ЧЧ>=24 Тогда<br> ЧЧ=23;<br> КонецЕсли;<br> КонецЕсли;<br> Если Поле=1 Тогда //Минуты<br> Если ММ>=60 Тогда<br> ММ=59;<br> КонецЕсли;<br> КонецЕсли;<br> Если Поле=1 Тогда //Секунды<br> Если СС>=60 Тогда<br> СС=59;<br> КонецЕсли;<br> КонецЕсли;<br>КонецПроцедуры<br><br>Процедура ПриОткрытии()<br> Если ТипЗначения(Форма.Параметр)=12 Тогда //Тип значения 12 - Документ<br> ВыбДокумент=Форма.Параметр;<br> КонецЕсли;<br>КонецПроцедуры<br><br><br>Все работает, только, что проверил."
Появилась необходимость, чтобы в бп3.0 у всех банковских выписок(поступления на расч сч и списание с расч сч) было фикс время 9:00:00.
Выгрузка происходит через обработку, которая подгружает файлик от банка. В нее хочу вставить код смены времени, но чтоб его отладить сначала доп обработкой тестирую.
В обработке форма с одной кнопкой.
Вот код:
&НаКлиенте
Процедура Команда1(Команда)
ккк();
КонецПроцедуры
&НаСервере
Процедура ккк()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеНаРасчетныйСчет.Ссылка КАК Ссылка,
| ПоступлениеНаРасчетныйСчет.Дата КАК Дата,
| ПоступлениеНаРасчетныйСчет.Номер КАК Номер
|ИЗ
| Документ.ПоступлениеНаРасчетныйСчет КАК ПоступлениеНаРасчетныйСчет
|ГДЕ
//| ПоступлениеНаРасчетныйСчет.Дата >= ДОБАВИТЬКДАТЕ(&дата, ДЕНЬ, -2) //&дата //666
//| И //666
| НЕ ЧАС(ПоступлениеНаРасчетныйСчет.Дата) = 9
| И НЕ МИНУТА(ПоступлениеНаРасчетныйСчет.Дата) = 0
| И НЕ СЕКУНДА(ПоступлениеНаРасчетныйСчет.Дата) = 0";
//Запрос.УстановитьПараметр("дата", ТекущаяДата()); //-2*24*60*60); //666
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Выгрузка = РезультатЗапроса.Выгрузить();
ч=9; м=0; с=0;
Пока Выборка.Следующий() Цикл
кк= Выборка.ссылка.получитьобъект();
кк.УстановитьВремя(9,0,0);
//Час(кк.дата)= 9;
//Минута(кк.дата)= 0;
//Секунда(кк.дата)= 0;
кк. Записать(); //режимзаписидокумента.Запись
КонецЦикла;
КонецПроцедуры
1 проблема: если раскомментить //666 тогда в цикл отладка не проваливается, хотя в консоли запрос выдает
30 строк результата.
2 проблема: УстановитьВремя почему то ругается на силшком много параметров.
Слишком много фактических параметров
: кк.УстановитьВремя(9,0,0);
: ккк();
Я был хорошим недопрогером весь год, прошу деда мороза и вас, друзья, помочь мне установить время этим докам))
Запускать обработку надо монопольно. При нажатии "Сформировать" все документы будут перенесены на начало дня (начиная с указанной в модуле даты с сохранением последовательности и интервалом 1 секунда).
Техническая реализация переноса времени на начало дняОбработка написана в комплексной конфигурации 4.2 (7.70.424). Версия платформы 7.70.027.
Специальные предложения
наращивание времени как сделано? что суммируется? как сделан переход на минутах и часах?
примечание боковое: по 10 секунд в общем случае - "плохо".
надо смотреть в каком времени первый непереносимый документ и впихивать переносимые ДО этого документа. соответсвенно надо посчитать дельту наращивани времени.
надо смотреть в каком времени первый непереносимый документ и впихивать переносимые ДО этого документа
это зачем? оно же изменит последовательность проведения документов? (2) для переноса документов "в начало дня" - все переносимые "в начало дня" документы в общем случае должны быть ДО первого неперносимого документа.
.
По наращиванию времени - я так и знал.
(смотри у меня публикацию пр финт ушами с временем документа).
Для переноса достаточно оперировать только СС, если секунды задашь больше 60 - платформа это правильно проглотит сама. это работает в пределах дня, дальше 23.59-59 или 00-00-00 не уйдет документ сколько бы большое значение СС ни было. Пользуйся! (5) багофичи это зло ибо делает код черезжопным, в моей программе ошибок нет.
Я указал на то что перенос документа через документ ломает логику взаиморасчетов. Я указал на то что перенос документа через документ ломает логику взаиморасчетов.
Однако, тут все равно вылезет ошибка другого рода (но похожая, так как связана с нарушением очередности документов), в общем случае:
Последнее правильное время=14 сек (Док0). Считаем что все проведение было сделано правильно, ГП не нарушена.
Исходная цепочка:
Док1, 15 сек
Док2, 15 сек
Док3, 16 сек
Док4, 16 сек
По идее, после обработки (сдвиг по 1 сек на документ) получится так:
Док1, 15 сек (14+1), ОК
Док2, 16 сек (14+2) - конфликт с Док3, Док2 ляжет и проведется ПОСЛЕ ЕЩЕ НЕ ОБРАБОТАННОГО Док3 (другой результат проведения получится чем до переноса) и не факт что Док2 проведется вообще
Док3, 17 сек (14+3) - конфликт с Док4, Док3 ляжет и проведется ПОСЛЕ ЕЩЕ НЕ ОБРАБОТАННОГО Док4 (другой результат проведения получится чем до переноса) и вдобавок проведение док3 будет опираться на неверные результаты проведения Док2 и не факт что Док3 проведется вообще
Док4, 18 сек (14+4) - проведение док4 будет опираться на неверные результаты проведения Док2 и Док3 и не факт что Док4 проведется вообще.
В случае, если все доки перенеслись и провелись повторно "без проблем" - это не гарантирует получение тех же результатов проведения что в исходной цепочке, т.к. нарушена не просто ГП (изменение задним числом), но и исходный порядок проведения документов.
Для получения гарантированного правильного результата следует ОБЯЗАТЕЛЬНО восстановить ГП последовательность документов от Док0 до последнего перенесенного документа. Или переписать алгоритм переноса.
mister-x --> mister-xЗадача: для некоторых доков, которые вводятся задним числом, нужно при проведении установить конкретное время на эту дату.
Если документы проводятся оперативно - проблем нет.
Пробовал так:
не работает - устанавливается время на минуту больше после последнего док-та в этот день (стандартное поведение платформы). Можно ли изменить такое поведение платформы?
[додано пізніше]
або ні, може я туплю
alex040269 --> alex040269ЗиУП mister-x --> mister-x
вже вирішив сам
працює як для оперативного працює так і неоперативного проведення
Cthulhu --> Cthulhuвже взнав, задача вирішена
Vofka --> VofkaЗапускать обработку надо монопольно. При нажатии "Сформировать" все документы будут перенесены на начало дня (начиная с указанной в модуле даты с сохранением последовательности и интервалом 1 секунда).
Техническая реализация переноса времени на начало дня
Обработка написана в комплексной конфигурации 4.2 (7.70.424). Версия платформы 7.70.027.
Related Posts
20 Comments
наращивание времени как сделано? что суммируется? как сделан переход на минутах и часах?
надо смотреть в каком времени первый непереносимый документ и впихивать переносимые ДО этого документа. соответсвенно надо посчитать дельту наращивани времени.
(1) я открыл код, пересчет прямой: время=ЧЧ*60*60+ММ*60+СС и обратный к нему.
это зачем? оно же изменит последовательность проведения документов?
(3) вариант с 1C++ менее универсален так как для его реализации не достаточно функционала 1С. А код обработки можете написать сюда?
(смотри у меня публикацию пр финт ушами с временем документа).
Если через 1С++ чистить нудевые записи в итогах таблицы то перенос ТА идет быстро на границе месяцев.
(5) багофичи это зло ибо делает код черезжопным, в моей программе ошибок нет.
Я указал на то что перенос документа через документ ломает логику взаиморасчетов.
Я указал на то что перенос документа через документ ломает логику взаиморасчетов.Однако, тут все равно вылезет ошибка другого рода (но похожая, так как связана с нарушением очередности документов), в общем случае:
Последнее правильное время=14 сек (Док0). Считаем что все проведение было сделано правильно, ГП не нарушена.
По идее, после обработки (сдвиг по 1 сек на документ) получится так:
Док1, 15 сек (14+1), ОК
Для получения гарантированного правильного результата следует ОБЯЗАТЕЛЬНО восстановить ГП последовательность документов от Док0 до последнего перенесенного документа. Или переписать алгоритм переноса.
(попутно, информационно: кстати, вместе с с предыдущим замечанием, это может в итоге привести к потере правильной последовательности документов проведения вообще, сильно не думал, надо продумать что будет при исправлении допустим ошибки непроведения и повторном запуске обработки).
(7) Не уверен, точно не помню, но что-то так:
Выполнение Док.Провести() вообще сомнительно в таком применении.
возможно проведение сломается с синтаксической ошибкой и вывалится в Исключение.
Если Результат =0 Тогда
//искуственно вызвать исключение или прерваться явно
(9) Сергей, спасибо за подробное объяснение принципа действия алгоритма. На самом деле алгоритм рабочий, переписывать его не надо. Но Ваша постановка задачи к которой Вы применили алгоритм не имеет смысла. Никто не переносит документы на секунду назад, 100 % случаев возникает необходимость перенести на несколько часов, поэтому описанная Вами ситуация практически не возможна.
На самом деле практические задачи для решения которых мной предназначен алгоритм в публикации такие:
1) алгоритм поможет изменить время документов на заранее выбранное, каждый следующий документ на следующую секунду, но не с 15й секунды на 14ю, ибо это не имеет смысла.
Но я бы посоветовал, во избежание либо в конце кода перепровести все перенесенынные документы в хорологической последовательности или сначала все документы перенести в виде непроведенных, а потом перепровести. и это ВСЕ обернуть в транзакцию.
(13) Спасибо за подробное замечание!!
Согласен что Док.Провести() в данном контексте выглядит сомнительно и вызывает вопрос, ну ни разу не бывало проблем. Согласен красивее выглядит
(13) в общем Вы не правы, все у меня отлично работает, тест пройден успешно. Оно несколько лет используется. Не могло оно глючить.
1)В тестовой базе берем любой документ, в начале обработки проведения пишем:
2)создаем и проводим с нулевой суммой
3)редактируем реквизит сумма = 1р
4) запускаем мою обработку
Смотрим результат, попробуйте повторить сами:
(15) все правильно, я об этом и сказал выше, что сломается на ЗафиксироватьТранзакцию.
это я к тому, что надо помнить что неудачное проведение не вызывает исключения.
В приведенном коде по-правильному д.б. типа
Если Док.Провести()=0 Тогда Прервать; КонецЕсли;
Пусть код так и будет.
п.с. У меня ведь тоже багофича получиласть, поэтому код статьи и обработку поправлю после удачного применения нового алгоритма на практике.
Транзакция у меня в коде нужна для того, чтобы в случае выявленной ошибки распроведение не произошло и документ, который не удалось перенести, остался нетронутым (проведенным).
(18) дело в том, что если документ был проведен но теперь не может быть перепроведен может возникнуть необходимость разобраться почему он не проводится и выполнить эти условия, чтобы не поломать учет. И тогда при повторном запуске обработка переноса документов продолжит свою работу в штатном режиме.
надо продумать что будет при исправлении допустим ошибки непроведения и повторном запуске обработки).Если транзакцию убрать, произойдут необратимые изменения, которые потом надо будет исправлять, тратить на это время.
Читайте также: