Удивительная вещь - время, могущественное,
а когда в него вмешиваются – опасное …
Альбус Дамблдор.
Описание практической проблемы:
Как известно, в 1С:Предприятии-77 изменить время (и дату) проведенного документа просто так нельзя. Для этого сначала надо отменить его проведение. Это может создавать определенные сложности для администратора, особенно в больших, многопользовательских базах.
Например, пусть есть документ «Фактура», резервирующая товар, и документ «Отгрузка», непосредственно его списывающая. Эти документы связаны в структуре подчиненности (рис.1 и рис.3). Пусть по каким-то причинам документ «Отгрузка» оказался по времени раньше своей фактуры. Из-за этого отгрузка не проводится и администратору требуется исправить ситуацию. Допустим, служба безопасности строго следит за временем отгрузки в 1С и его изменять не желательно. Тогда, чтобы исправить ситуацию, надо «подвинуть» по времени фактуру.
Если это делать штатными средствами, то будет довольно долго и муторно:
- Надо отменить поведение документа (из контекстного меню с подтверждением в модальном окне);
- Изменить время документа ( из контекстного меню в другом модальном окне);
- После чего зайти в документ, провести его и проследить, что бы при проведении платформа не изменила время документа
(выбрать «провести задним числом»).
Существенным недостатком этой цепочки действий является то, что документ, резервирующий товар, продолжительное время будет не проведен, а также то, что документ может вообще не провестись после изменения даты и времени по какой-то причине. Кроме этого в течение времени, пока проведение фактуры отменено, есть вероятность того, что другие пользователи могут зарезервировать своими фактурами этот товар, создав дополнительные проблемы администратору.
Особенности работы:
Предлагаемая обработка решает эти проблемы. Она полностью имитирует действия системной обработки (их диалоги очень похожи - рис.1). Кроме того она позволяет сразу сменить и дату документа. За счет программного выполнения существенно сокращается время выполнения всей процедуры по сравнению с интерактивными действиями, описанными выше. Обработка перед изменением времени или даты проведенного документа отменяет его проведение. Все эти действия осуществляются в одной транзакции. При неудаче на любом из этапов все изменения откатываются.
Замечания относительно нового времени документа "Авто-время начало дня", "Авто-время конец дня" и "Авто-время после ТА":
В этих случаях время документа вычисляется следующим образом:
Открывается транзакция.Создается объект документа того же вида и с той же датой, что редактируемый документ (или новой датой, если она была выбрана). Объекту документа устанавливается нужный режим автоматической установки времени при записи нового документа. После чего документ записывается. Считанное после записи время нового документа и используется как искомое. Затем транзакция откатывается для отмены записи в базу.
Возможны проблемы при вычислении "авто-времени" для документов с отключенной автонумерацией и включенным контролем уникальности:
В этом случае обработка записывает "виртуальный" документ следующим образом: в цикле делается определенное число попыток записи (100 для строкового номера, 1000 для числового). Номер документа устанавливается равным номеру попытки (строковые номера - с префиксом "00-"). Если за устовленное число раз записать документ не удается - выводится сообщение и возвращается "пустое время" " . . ".
Для строковых номеров последнее возможно, если в базе используется префикс номеров "00" и первые 100 номеров с этим префиксом заняты. Ситуация достаточно экзотическая, но возможная.
Для документом с числовым типом номера ... ну надеюсь никто не додумается отключать автонумерацию и оставлять контроль уникальности!
Требования:
Особенно ни каких. Желательно наличие загруженной ВК FormEx.dll.
Но без нее все будет работать. Только надпись с текущим системным временем будет обновляться не таймеру, а при изменениях в элементах формы диалога. Так же при вводе неправильного значения в поле ввода строки времени, программа не будет возвращать фокус назад для ее исправления.
ВК FormEx.dll можно скачать с сайта разработчиков http://www.dorex.pro/ или взять из архива файла поставки в папке ..\FormEx1CPP\.
Использование:
Основное назначение - решение проблем при проведении документов из-за нарушения логики их хронологического следования.
Обработка может быть использована самостоятельно - как внешняя или как встроенная. При этом придется выбирать изменяемый документ в поле ввода из списка журнала документов (рис.2).
Но лучше ее использовать через механизм обработки расшифровки ячейки табличного документа. В обработчике этого события можно сформировать меню действий со значением расшифровки ячейки табличного документа. И если пользователь выбрал из меню соответствующий пункт, открывать обработку, передавая ей ссылку на документ через параметр формы.
Кроме изменения времени туда можно включить и другие действия со значением объекта (рис.3):
- открыть на просмотр-редактирование, открыть в списке (журнале);
- пометить на удаление, снять пометку на удаление, удалить непосредственно;
- провести, отменить проведение документа, сформировать отчет о движениях документа (регистры,проводки, история справочников);
- открыть объект для редактирования в обработке 'Редактор Реквизитов' (автор Цылёв Владислав vet7777@mail.ru);
Тогда все просто и удобно будет делаться из любого отчета (например, «ДеревоДокумента») при двойном клике по ячейке с документом.
Пример кода, реализующий выбор из меню, как показано на рис.3, можно взять из архива файла поставки в файле ПримерКода.txt(пример предполагает наличие загруженной ВК FormEx.dll).
Предлагаемая обработка удобна для "точечного", оперативного вмешательства.
Если же требуется сразу изменить дату-время сразу у многих документов,
то будет больше удобна похожая разработка: //infostart.ru/public/20462/ (автор Андрей aka AKV77) .
Благодарности:
Выражаю большую и искренюю благодарность всем разработчикам ВК 1с++ и FormEx. Желаю им творческих успехов на новом поле деятельности под платформой 8.х !