1с 7 установить время документа
Диплом позволяет ошибаться значительно увереннее.
Закон диплома.
1С:Школа.
Выпуск 32.
"Время документов ".
Опытным пользователям можно доверить самим управлять временем проведения документа. Для этого в "Сервис" – "Параметры" на одной из закладок надо установить флаг "Запрашивать время проведения...". В этом случае при записи документа будет выдаваться запрос о времени, на которое надо записать документ. Вариантов может быть несколько:
в текущее время
и в произвольно указанное время.
в оперативном учете бывает еще время после ТА (точки актуальности)
Вообще по смыслу, я думаю, ясно назначение каждого пункта. Обычно пользователю надо объяснить "Все приходные документы – записывай на начало дня, а все расходные на конец". В этом случае расход всегда будет после прихода. Если флаг "Запрашивать время. " не стоит, то документы записываются в текущее время (если в модуле не наконфигурено что-нибудь. см.ниже)
Временем документа можно управлять программно. Для этого, есть два метода: ПолучитьВремя() и УстановитьВремя(). Методы подробно описаны даже в синтаксис помощнике. Если у Вас есть регулярная проблема с сортировкой документов внутри даты, то можно в общем журнале создать кнопки "Вверх" и "Вниз", которые бы меняли текущий документ с соседним в зависимости от нажатой кнопки. Примерный модуль процедуры, вызываемой по кнопке "Вверх":
Процедура Вверх()
Док=ТекущийДокумент; //получили текущий документ в журнале
Если док.Выбран()=0 тогда //бывает, что нет документов
возврат;
КонецЕсли;
Если док.Проведен()=1 Тогда //менять время можно тольку у распроведенного документа
Предупреждение("Распроведите документ");
возврат;
КонецЕсли;
//ищем ближайший документ сверху
д=создатьОбъект("Документ");
д.ОбратныйПОрядок(1);
д.ВЫбратьДокументы(,док);
//сначала получаем наш текущий документ
Если д.ПолучитьДокумент()=0 тогда //документа сверху может и не быть
возврат;
конецЕсли;
//теперь получаем тот документ, над которым надо подняться
Если д.ПолучитьДокумент()=0 тогда
возврат;
конецЕсли;
ч=0; м=0; с=0;
д.ПолучитьВремя(ч,м,с); //получаем время найденного документа
//и переводим его в секунды, чтобы отнять 1 секунду
Секунд=с+м*60+ч*3600;//перевели в секунды
НовоеВремя=секунд-1;
//а теперь обратно в часы, минуты и секунды
ч=Цел(новоевремя/3600);
м=цел((новоевремя-ч*3600)/60);
с=новоеВремя-ч*3600-м*60;
//менять время можно только у тех докуентов,
//что получены через СоздатьОбъект
д.найтиДокумент(док);
д.УстановитьВремя(ч,м,с);//устанавливаем время документа
д.записать();
конецПРоцедуры
Процедура имеет недостатки незаметные на первый взгляд. Она корректно двигает документ вверх, пока вверху не окажется документ их другой даты. Как только это случится – модуль сбойнет. Задание для самостоятельной работы: доработать процедуру таким образом, чтобы она корректно обрабатывала встречу с документом из другой даты. Еще одно задание: напишите процедуру для продвижения текущего документа "вниз" по журналу документов. И еще одно задание: сделайте одну универсальную процедуру, которая бы двигала документ вверх или вниз в зависимости от переданного в неё параметра.
Но, чтобы избежать проблем со временем документов, рекомендую несколько методов
АвтоВремяНачалоДня();
АвтоВремяКонецДня();
АвтоВремяТекущее();
Эти методы (естественно один из них) записываются в процедуру ВводНового() нужного Вам документа и запись документа автоматически происходит в соответствующее время. При этом надо помнить, что настройки в "Сервис"-"Параметры"- "Запрашивать время. " в данном случае игнорируются и пользователь не увидит диалога о выборе времени, как бы он не хотел этого. Но в журнале документов время всегда можно будет изменить.
На сайте 1С:Школа можно скачать архив рассылки с 1 по 30 выпуск в rar-архиве. Так же на сайте, открылся новый раздел "Библиотека". В нем вы найдете подборку книг и методического материала по 1С:Бухгалтерии, 1С:Торговле, 1С:Зарплате, бухгалтерскому учету и Конфигурированию. В разделе "Бухгалтерский учет" есть книга "Бухучет для технарей".
Любой пользователь программы должен быть способным установить время в 1С. Неверные дата и время, проставленные в документе, способны нарушить всю логику документооборота компании, что обязательно приведет к большим проблемам и при составлении отчетности, и при проверке.
Работа со временем в 1С
Дата и время являются важнейшими характеристиками любого вида документов в 1С: Предприятие. Именно на основании этих параметров выстаивается последовательность проведения всех операций. Учитывая взаимозависимость бизнес-процессов, некоторые документы нельзя создать без предварительной записи и проведения других. Вся логика документооборота предприятия основана на значении временных параметров отдельных документов. Они позволяют проследить порядок движения и баланс ресурсов в каждый конкретный временной период.
1С по умолчанию использует системное время, то есть данные машины, на которой она установлена. Это значит, что если при создании нового документа вы не указываете в специальном поле значение, то оно, как и дата, проставляется автоматически. В результате вы получаете документ с датой, соответствующей дате компьютера. Чаще всего за один день пользователь бухгалтерской программы создает много документов. В этом случае каждый последующий документ отправляется в конец списка документов, созданных в этот конкретный день. Обратите внимание, что для регламентных документов 1С проставляет значение 23:23:59, то есть переносит их на конец дня. Для 1С текущее время – это настройка по умолчанию.
Возможные проблемы
В такой ситуации наиболее очевидной проблемой является неправильное время на самом компьютере. Устранить ее можно, если настроить ПК на автоматическую синхронизацию с интернетом. Обратите внимание на настройку вашего часового пояса – должно совпадать не только время, но и город. Если вашего населенного пункта нет в настройках, то выбирайте часовой пояс, где указан любой ближайший к вам крупный город вашей страны. Это предупредит путаницу при автоматическом переходе на летнее или зимнее время – не все страны его осуществляют.
Есть еще один проблемный момент – поведенческий. Если пользователь занимается бухгалтерией постоянно, он привыкает к автоматической установке времени. То есть при создании нового документа пользователь начинает доверять системе и полностью игнорирует заполнение соответствующего поля. Это не может не приводить к ошибкам, ведь достаточно часто возникает необходимость создать новый документ "задним числом". Например, чтобы заменить в базе ошибочный документ или восстановить ненароком удаленный – ситуации могут быть разными.
Устанавливаем дату и время в 1С
Когда необходимо создать новый документ не с текущей датой, можно просто вручную заполнить соответствующее поле. Оно находится сразу под главным меню формы и справа от поля с номером. Ручные настройки помогут и при необходимости изменения даты в уже записанных и проведенных документах. Но если вам предстоит создать целую серию новых документов и все "задним числом", то удобнее будет настроить автоматическое проставление нужной даты. Для примера рассмотрим способы настройки в конфигурации Бухгалтерия 8:
В главном меню нажмите на «Сервис»;
Выберите пункт «Параметры»;
В открывшейся форме снимите галочку с опции по умолчанию «Использовать текущее время компьютера» и задайте нужную дату.
Откройте раздел «Администрирование»;
На «Панели действий» перейдите в «Персональные настройки»;
Поставьте переключатель на «Другую дату» и настройте время.
После окончания работы обязательно верните настройки к прежним значениям.
При возникновении ошибок или затруднений с настройками в новых или существующих документах, обращайтесь за помощью к нашим специалистам. Мы поможем навести порядок в настройках, и ваша документальная база будет безукоризненно логичной и полной.
Материал статьи будет посвящен вопросу установки даты и времени при создании и записи документов в 1С:Бухгалтерия 3. Тема будет актуальна и для других программных продуктов фирмы 1С, таких как, 1С:Зарплата и Управление Персоналом, 1С:Управление Нашей Фирмы, 1С:Управление Торговлей и др.
НАСТРОЙКА 1С. ЕСТЬ ЗАДАЧА? БЕСПЛАТНАЯ ОЦЕНКА! Смотреть подробнее →
Установка нужной даты и времени документов в 1С один из важных вопросов при работе пользователей в программе, так как при неверной дате могут возникать различные ошибки и проблемы, связанные с составлением отчетности и проверками.
Как правило при создании документа по умолчанию подставляется текущая дата компьютера и время 0:00:00. Далее после заполнения документа при записи (проведении) время также проставляется текущим. Данное правило устанавливается в настройках. В программе переходим в раздел “Главное” и далее выбираем пункт “Персональные настройки”. В открывшемся окне с настройками нас будет интересовать поле “Рабочая дата”. В нашем случае установлена та настройка, которая описана выше.
Если же, к примеру, нам необходимо занести большое количество документов задним числом, то имеет смысл временно установить переключатель на значение “Другая дата” и установить нужную дату. В том случае, если документов немного, можно изменить дату непосредственно в самом поле документа при его создании.
Далее рассмотрим еще одну настройку, которая позволяет записывать документы по времени в течение дня. Перейдем в раздел “Администрирование” и выберем пункт “Проведение документов“. Данная настройка называется “Время документа устанавливать автоматически”.
Если галочка не включена, тогда при записи документа текущей датой время будет определяться как системное время компьютера. Если пользователь изменил дату документа, то программа установит время на 12:00:00. При установленном флаге, документы разного типа записываются с определенным временем. Так документы реализации и поступления будут записываться раньше, чем документы оплаты. В пользовательском режиме изменить время записи типов документов при включенном механизме не представляется возможным.
Не так давно столкнулся с двумя ситуациями, которые для сотрудников фирм, обратившихся ко мне за помощью, были неприемлемы.
В одном случае из-за проведения документа, который был создан вечером предыдущего дня, а затем после смены даты проведен утром текущего дня, сбилась ТА на время, близкое к концу дня, а документы, проводимые в большом количестве в течение дня, уперлись в метку 23:59:59 и после нескольких десятков отказывались проводиться.
Еще один случай был связан с переходом на зимнее время, который не должен был быть. Но в этом случае достаточно было воспользоваться тем, что было изобретено ранее, сдвинув каждый документ на 3600 секунд на временной оси.
Суть моего метода заключается в восстановлении фактического времени создания, проведении (или перепроведении) документов из файла журнала регистрации, и он может быть единственно достоверным для решения ситуации, описанной в первом случае.
Как с этим работать.
Все документы за выбранный день (или интервал) выгружаются в таблицу значений. Затем считывается информация из журнала регистрации о фактическом времени записи и проведении этих документов. Идентификация идет по внутреннему ID документа, который присутствует в записях журнала.
Там, где обнаруживаются несоответствия по времени, проставляется крыж: этот объект подлежит модификации.
- Обработка использует функционал, позволяющий производить чтение «на лету», без необходимости создавать копию. Но если файл лога большой, то процесс его чтения может занять о-о-очень продолжительное время, что не есть гуд во время рабочего дня. Лучше средствами 1С:Монитор заархивируйте «дела давно минувших дней». Архивация происходит быстро.
- Для тех, кто работает с распределенной базой данных: актуальную информацию Вы можете получить только в месте создания документа. Та и запускайте обработку. Чужие (т.е. не принадлежащие текущей информационной базе) она игнорирует.
- Документы, созданные программно (обработками - автоматически) следов, к сожалению не оставляют.
Ну и после всего не забудьте в монопольном режиме установить ТА на последний проведенный документ!
Параметры закладки "Расчет" влияют на полноту вывода информации в журналах расчетов и па интерпретацию данных типа "дата", вводимых в программе.
Вывод.
Параметр "Вывод" может принимать значения "Все объекты", "Один объект", "Один документ" и "Авто". Установка первых трех значений не требует пояснения. В случае установки значения "Авто" журнал расчетов ведет себя по-разному в зависимости от того, каким образом открывается его окно.
При открытии окна журнала через меню "Операции" будет использоваться тот режим вывода, который был установлен при последнем открытии окна данного журнала расчетов.
При открытии окна журнала через один из пунктов меню пользовательского интерфейса будет использоваться режим вывода, заданный при настройке конфигурации задачи.
Глубина архива.
Параметр "Глубина архива" может принимать значения "Неделя", "Месяц", "Квартал", "Год" и "Авто".
В том случае, если задана конкретная глубина просмотра, в окне каждого журнала расчетов будут выводиться записи, имеющие отношение ко всем периодам расчета, лежащим в заданном интервале.
Например, если периодичность журнала расчетов – месяц, и при этом параметр "Глубина архива" задан как "квартал", в окне будут выводиться записи всех периодов расчета (т. е. месяцев), которые лежат в текущем квартале (в феврале – января и февраля; в апреле – только апреля и т. д.).
В случае, если периодичность журнала – неделя, и глубина просмотра задана как "месяц", будут выводиться записи по всем периодам расчета (всем неделям), которые хоть одним днем принадлежат текущему месяцу.
Очевидно, что задание глубины просмотра меньшей или совпадающей с периодичностью журнала расчетов, приведет к тому, что в окне будут выведены записи только текущего расчетного периода.
Значение "Авто" параметра "Глубина архива" приведет к тому, что будет действовать последняя установка, сделанная вручную через диалог установки глубины просмотра архива.
Оперативный учет
Параметры закладки "Оперативный учет" влияют на порядок записи и проведения документов, относящихся к оперативному учету.
Новые документы записывать с текущим временем.
Если опция "Новые документы записывать с текущим временем" включена, при записи нового документа в журнал документов не будет выводиться диалог для выбора времени записи документа, и документ будет записываться со временем, считанным из системных часов в момент записи.
Если данная опция выключена, то при записи документа необходимо будет указать время записи.
Новые документы проводить после ТА.
Новые документы записывать после ТА.
При записи нового документа в текущей дате ему может ставиться текущее время. Однако текущее время на разных компьютерах может различаться. Поэтому при работе в сетевой версии нескольких пользователей с одной информационной базой иногда возникают ситуации, когда проведенный кем-то документ установил точку актуальности позже, чем текущее время на других компьютерах. Данная установка позволяет новые документы записывать после точки актуальности, если текущее время меньше точки актуальности. Это позволяет обеспечить более "гладкую" последовательность ввода документов.
По умолчанию данная установка выключена.
При проведении после ТА заменять время на текущее.
Если введенный документ оказался до точки актуальности, то при его проведении обычно выбирается режим изменения времени документа, то есть проведения его в потоке. При этом документ переставляется после точки актуальности.
Если данная установка включена, то документам, которые переносятся за точку актуальности, при проведении устанавливается текущее время компьютера (если, конечно, оно больше точки актуальности). Однако, тогда чаще возникает ситуация, при которой введенный другим пользователем документ оказывается по времени до точки актуальности.
Если данную установку отключить, то при проведении документа с переносом его за точку актуальности он будет располагаться сразу после точки актуальности. Это позволяет обеспечить более "гладкую" последовательность ввода документов.
На нашем сайте профессионалы делятся своим опытом и разработками. Вы получаете доступ к уникальному и самому полному хранилищу материалов для 1С, состоящему из более 30 000 отчетов, обработок, видео и т.д.
Рейтинг: 10
Бывает так что сбивается ТА на время близкое к концу дня, а документов еще много вносить, и тогда 1С создаст несколько документов со временов 23:59:59 и больше нельзя будет занести документы в это число. Эта обработка изменяет время документов начиная с указанного документа на указанное количество часов назад, а бывают случаи что нужно сдвинуть документы на определенное количество часов вперед.
Специальные предложения
ТА не трогаем, двигаем только время самих документов. ТА потом руками, т.к. операция по смене ТА должна выполняться в монопольном режиме! Можно изменить обработку таким образом что если она запущена монопольно то тогда и ТА что бы ставила на последний обработанный документ.
Просмотры 11291
Загрузки 36
Рейтинг 1
Создание 16.09.12 14:48
Обновление 28.03.18 09:28
№ Публикации 152190
Кому Для всех
Конфигурация Конфигурации 1cv7
Операционная система Windows
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
См. также
StartManager 1.4 - Развитие альтернативного стартера Промо
Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.
Данная обработка 1С 7.7 помогает, когда кто-то установил точку актуальности на конец текущего дня (провел документ концом дня) и документы перестали проводиться. Теперь, чтобы нормализовать ситуацию, время документов нужно изменить и документы перепровести, затем перенести точку актуальности на последний проведенный документ.
Запускать обработку надо монопольно. При нажатии "Сформировать" все документы будут перенесены на начало дня (начиная с указанной в модуле даты с сохранением последовательности и интервалом 1 секунда).
Техническая реализация переноса времени на начало дня
Обработка написана в комплексной конфигурации 4.2 (7.70.424). Версия платформы 7.70.027.
Related Posts
20 Comments
наращивание времени как сделано? что суммируется? как сделан переход на минутах и часах?
примечание боковое: по 10 секунд в общем случае — «плохо».
надо смотреть в каком времени первый непереносимый документ и впихивать переносимые ДО этого документа. соответсвенно надо посчитать дельту наращивани времени.
(1) я открыл код, пересчет прямой: время=ЧЧ*60*60+ММ*60+СС и обратный к нему.
надо смотреть в каком времени первый непереносимый документ и впихивать переносимые ДО этого документа
это зачем? оно же изменит последовательность проведения документов?
Если база SQL, то я бы посоветовал использовать 1C++ и писать напрямую в необходимые таблицы. На практике это экономит достаточно много времени. В условиях когда работа предприятия встала, время работы — очень важный параметр. Изначально делали примерно так же как в этой обработке, только выбирали последний правильный документ (с верным временем) и перепроведение делали с интервалом в 1 секунду. После того как переписали на SQL длительность обработки с 15-20 минут уменьшилось до 5-10. Причем львиную долю. времени занимает установка ТА.
(3) вариант с 1C++ менее универсален так как для его реализации не достаточно функционала 1С. А код обработки можете написать сюда?
(2) для переноса документов «в начало дня» — все переносимые «в начало дня» документы в общем случае должны быть ДО первого неперносимого документа.
По наращиванию времени — я так и знал.
(смотри у меня публикацию пр финт ушами с временем документа).
Для переноса достаточно оперировать только СС, если секунды задашь больше 60 — платформа это правильно проглотит сама. это работает в пределах дня, дальше 23.59-59 или 00-00-00 не уйдет документ сколько бы большое значение СС ни было. Пользуйся!
Если через 1С++ чистить нудевые записи в итогах таблицы то перенос ТА идет быстро на границе месяцев.
(5) багофичи это зло ибо делает код черезжопным, в моей программе ошибок нет.
Я указал на то что перенос документа через документ ломает логику взаиморасчетов.
(7) багофичи — на вкус и цвет, согласен.
потому что перенос документов в начало дня — это перенос в начало дня.
здесь по факту перенос ВСЕХ (это ключевой момент) документов, лежащих после времени «Ч» до конца дня — в «правильную» последовательность документов ПОСЛЕ «Ч». Конечно, а таком контексте выполнения задачи, мое замечание неверно.
Однако, тут все равно вылезет ошибка другого рода (но похожая, так как связана с нарушением очередности документов), в общем случае:
Последнее правильное время=14 сек (Док0). Считаем что все проведение было сделано правильно, ГП не нарушена.
По идее, после обработки (сдвиг по 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 до последнего перенесенного документа. Или переписать алгоритм переноса.
В данном коде обертывать обработку единственного документа В МОНОПОЛЬНОМ Режиме — совершенно излишне. В приведенном коде при любой ошибке — выполнение стопорится (логику по крайне мере такую я наблюдаю).
(попутно, информационно: кстати, вместе с с предыдущим замечанием, это может в итоге привести к потере правильной последовательности документов проведения вообще, сильно не думал, надо продумать что будет при исправлении допустим ошибки непроведения и повторном запуске обработки).
Итого: транзакции если убрать и оставить только попытку — ничего в логике не поменяется.
(7) Не уверен, точно не помню, но что-то так:
Выполнение Док.Провести() вообще сомнительно в таком применении.
возможно проведение сломается с синтаксической ошибкой и вывалится в Исключение.
А вот если проведение просто НЕ ПРОВЕДЕТСЯ о вернет результат проведения — 0 (штатно как обычно установкой статусвозврата(0) — никакое исключение не произойдет. Поэтому надо типа внутри попытки
Если Результат =0 Тогда
//искуственно вызвать исключение или прерваться явно
(9) Сергей, спасибо за подробное объяснение принципа действия алгоритма. На самом деле алгоритм рабочий, переписывать его не надо. Но Ваша постановка задачи к которой Вы применили алгоритм не имеет смысла. Никто не переносит документы на секунду назад, 100 % случаев возникает необходимость перенести на несколько часов, поэтому описанная Вами ситуация практически не возможна.
На самом деле практические задачи для решения которых мной предназначен алгоритм в публикации такие:
1) алгоритм поможет изменить время документов на заранее выбранное, каждый следующий документ на следующую секунду, но не с 15й секунды на 14ю, ибо это не имеет смысла.
2) алгоритм поможет если надо перенести документы на начало дня, хоть на 00 часов — не ломая последовательности.
3) алгоритм поможет, когда кто-то установил точку актуальности на конец текущего дня (провел документ концом дня) и документы перестали проводиться. Теперь, чтобы нормализовать ситуацию, время документов нужно изменить и документы перепровести, затем перенести точку актуальности на последний проведенный документ. Решать эту задачу в разделенном режиме смысла нет, так как в разделенном режиме пользователи напрасно будут мучать базу — все равно документы не проводятся, да и точку актуальности на последний документ можно установить только в монопольном режиме.
(12) все пункты работают только если верить что » 100 % случаев возникает необходимость перенести на несколько часов, поэтому описанная Вами ситуация практически не возможна.»
— практически не очень вероятно, да. но вполне может случится казус.
ибо в приведенном примере — алгоритм породит некорректные данные.
а сработает ли такой пример в реальности — зависит исключительно от количества доков которые надо перенести, периода времени на котором эти доки находятся и зависимостей документов (и результатов их проведения) друг от друга.
в общем случае — алгоритм нерабочий. да, я тоже оцениваю вероятность трабла как маленькую.
Но я бы посоветовал, во избежание либо в конце кода перепровести все перенесенынные документы в хорологической последовательности или сначала все документы перенести в виде непроведенных, а потом перепровести. и это ВСЕ обернуть в транзакцию.
транзакция в коде — как у вас — излишняя.
И что главное — Док.Провести() — в случае непроведения НЕ ВЫЗОВЕТ ИСКЛЮЧЕНИЯ. что может в такой (или разновидностях такой логики обработки чуть более сложной) привести к ЯВНОЙ ОШИБКЕ в итогах переноса.
та позже, в вашем коде, в случае если Док.Провести() не проведется — скорее всего упадет на ЗафиксироватьТранзакцию(), ибо транзакция уже отатана назад неявно.
(13) Спасибо за подробное замечание!!
Согласен что Док.Провести() в данном контексте выглядит сомнительно и вызывает вопрос, ну ни разу не бывало проблем. Согласен красивее выглядит
но практически это пока не испробовано. Ну ни разу у меня не было проблем с этим, возможно причина в СтатусВозврата(0)+транзакции, надо провести тест…
(13) в общем Вы не правы, все у меня отлично работает, тест пройден успешно. Оно несколько лет используется. Не могло оно глючить.
1)В тестовой базе берем любой документ, в начале обработки проведения пишем:
Я для примера в документ Аккредитив добавил, установил признак проводить в оперативном учете. Реструктуризация прошла…
2)создаем и проводим с нулевой суммой
3)редактируем реквизит сумма = 1р
4) запускаем мою обработку
Смотрим результат, попробуйте повторить сами:
(15) все правильно, я об этом и сказал выше, что сломается на ЗафиксироватьТранзакцию.
неудачное проведение как таковое не вызывает исключения. поэтому ошибка проведеняи документа — не отлавливается. и то что это неудачное проведение стопорит систему — просто удачное стечение обстоятельств что напарывается на ЗафиксироватьТранзакцию в лишней обертке транзакции (я думаю что вы рассчитывали что неудачное првоедение вывалится в исключение),
это я к тому, что надо помнить что неудачное проведение не вызывает исключения.
и при пакетной обработке при использовании попытки для отлавливания проблем — запросто можно пройти «мимо» (особенно если обработка множества объектов не обернута в транзакцию, даже когда обернута в транзакцию то тоже можно пропустить или потребуются детальный просмотр лога чтобы понять почему в 500 обработанных объектах внезапно транзакция не зафиксировалась.).
В приведенном коде по-правильному д.б. типа
Если Док.Провести()=0 Тогда Прервать; КонецЕсли;
По большому счету — эти мои замечания про Провести() — относятся больше к общему подходу к программированию в части правильности написания кода.
В вашем коде за счет избыточности — в результате отлавливается, ну и ок.
Пусть код так и будет.
(16) У меня есть практический совет о «прервать» применительно к обработкам документов. Если требуется однозначно прекратить выполнение кода (вот как например требуется в данном случае) я всегда вместо «Прервать» пишу «ф = 1/0;», это красивее выглядит. Ато дальше после «Прервать» может что-нибудь нехорошее произойти.
п.с. У меня ведь тоже багофича получиласть, поэтому код статьи и обработку поправлю после удачного применения нового алгоритма на практике.
Транзакция у меня в коде нужна для того, чтобы в случае выявленной ошибки распроведение не произошло и документ, который не удалось перенести, остался нетронутым (проведенным).
(18) дело в том, что если документ был проведен но теперь не может быть перепроведен может возникнуть необходимость разобраться почему он не проводится и выполнить эти условия, чтобы не поломать учет. И тогда при повторном запуске обработка переноса документов продолжит свою работу в штатном режиме.
надо продумать что будет при исправлении допустим ошибки непроведения и повторном запуске обработки).
Итого: транзакции если убрать и оставить только попытку — ничего в логике не поменяется.
В случае возникновения ошибки на одной из итераций цикла, последний удачно проведенный документ останется на новом времени (часть документов уже перепроведена). Проблемный документ останется на старом неправильном времени неповрежденным, как будто мы не пытались его распровести — для этого транзакция написана в коде обработки. Последовательность документов остается правильной как и была, потому что документ основания не может быть позже по цепочки структуры подчиненности, чем переносимый документ. В противном случае если какими-то ухищрениями достигнута ситуация что документ не может быть перепроведем, мы опять же с помощью транзакции получаем целостный неповрежденный проблемный документ.
Если транзакцию убрать, произойдут необратимые изменения, которые потом надо будет исправлять, тратить на это время.
Читайте также: