Диплом позволяет ошибаться значительно увереннее.
Закон диплома
.

1С:Школа.
Выпуск 32.
"Время документов ".

Сегодня поговорим о времени. В нашем случае это не относится к философии, а имеет непосредственное отношение к документам в 1С:Предприятии. Все вводимые документы, располагаются в журналах и упорядочены по датам. А внутри одной даты - по времени записи документа. По другому принципу отсортировать документы в журналах нельзя. Время документа, кроме упорядочивания, имеет еще одну важную роль. В системе возможно выполнение запросов "на документ". Это означает, что, например, можно получить остатки по какому-нибудь счету на документ. Это очень удобно и позволяет вести учет в реальном режиме времени: например, отписывать документы по складу и "вживую" наблюдать динамику изменения остатков. И именно в этот момент могут возникать проблемы со временем. Как это происходит? Рассмотрим простейший пример: поступление и продажу товара. По логике ясно, что сначала товар должен поступить, а потом уже должен быть продан. Обычно так и делается. Но по различным причинам (часто по вине пользователей) документ "Поступление" записывается на 18 часов, а расходные накладные записываются с 12 часов 45 минут до 21 часа (все в рамках одного дня). В результате, те расходные накладные, которые выписаны с 12-45 до 18 часов - не видят оприходованный товар. Хорошо если система предупредит об этом и выдаст сообщение о недостатке товара и некорректном расчете себестоимости товара. Но этого может и не случиться. Как это исправить?

Время документа можно исправить. Для этого надо сделать его не проведенным: щелкаете по документу в журнале правой клавишей мышки и выбираете "Сделать не проведенным". И изменить время документа: снова щелкаете правой клавишей мышки и говорите "Изменить время документа...". После этого в открывшемся окне вы может указать любое понравившееся время. Естественно его нужно указать правильно. Правильность означает, что документ должен быть записан до того, как другие документы будут пользоваться результатами его проведения (товар должен поступить до того, как продан; деньги в кассу должны поступить до того, как будут выданы из кассы).

Опытным пользователям можно доверить самим управлять временем проведения документа. Для этого в "Сервис" - "Параметры" на одной из закладок надо установить флаг "Запрашивать время проведения...". В этом случае при записи документа будет выдаваться запрос о времени, на которое надо записать документ. Вариантов может быть несколько:

Вообще по смыслу, я думаю, ясно назначение каждого пункта. Обычно пользователю надо объяснить "Все приходные документы - записывай на начало дня, а все расходные на конец". В этом случае расход всегда будет после прихода. Если флаг "Запрашивать время..." не стоит, то документы записываются в текущее время (если в модуле не наконфигурено что-нибудь. см.ниже)

Временем документа можно управлять программно. Для этого, есть два метода: ПолучитьВремя() и УстановитьВремя(). Методы подробно описаны даже в синтаксис помощнике. Если у Вас есть регулярная проблема с сортировкой документов внутри даты, то можно в общем журнале создать кнопки "Вверх" и "Вниз", которые бы меняли текущий документ с соседним в зависимости от нажатой кнопки. Примерный модуль процедуры, вызываемой по кнопке "Вверх":
Процедура Вверх()
    Док=ТекущийДокумент; //получили текущий документ в журнале
    Если док.Выбран()=0 тогда //бывает, что нет документов
        возврат;
    КонецЕсли;
    Если док.Проведен()=1 Тогда //менять время можно тольку у распроведенного документа
        Предупреждение("Распроведите документ");
    возврат;
    КонецЕсли;
    //ищем ближайший документ сверху
    д=создатьОбъект("Документ");
    д.ОбратныйПОрядок(1);
    д.ВЫбратьДокументы(,док);
    //сначала получаем наш текущий документ
    Если д.ПолучитьДокумент()=0 тогда //документа сверху может и не быть
        возврат;
    конецЕсли;
    //теперь получаем тот документ, над которым надо подняться
    Если д.ПолучитьДокумент()=0 тогда
        возврат;
    конецЕсли;
    ч=0; м=0; с=0;
    д.ПолучитьВремя(ч,м,с); //получаем время найденного документа
    //и переводим его в секунды, чтобы отнять 1 секунду
    Секунд=с+м*60+ч*3600;//перевели в секунды
    НовоеВремя=секунд-1;
    //а теперь обратно в часы, минуты и секунды
    ч=Цел(новоевремя/3600);
    м=цел((новоевремя-ч*3600)/60);
    с=новоеВремя-ч*3600-м*60;
    //менять время можно только у тех докуентов,
    //что получены через СоздатьОбъект
    д.найтиДокумент(док);
    д.УстановитьВремя(ч,м,с);//устанавливаем время документа
    д.записать();
конецПРоцедуры

    Процедура имеет недостатки незаметные на первый взгляд. Она корректно двигает документ вверх, пока вверху не окажется документ их другой даты. Как только это случится - модуль сбойнет. Задание для самостоятельной работы: доработать процедуру таким образом, чтобы она корректно обрабатывала встречу с документом из другой даты. Еще одно задание: напишите процедуру для продвижения текущего документа "вниз" по журналу документов. И еще одно задание: сделайте одну универсальную процедуру, которая бы двигала документ вверх или вниз в зависимости от переданного в неё параметра.
Но, чтобы избежать проблем со временем документов, рекомендую несколько методов
АвтоВремяНачалоДня();
АвтоВремяКонецДня();
АвтоВремяТекущее();
Эти методы (естественно один из них) записываются в процедуру ВводНового() нужного Вам документа и запись документа автоматически происходит в соответствующее время. При этом надо помнить, что настройки в "Сервис"-"Параметры"- "Запрашивать время..." в данном случае игнорируются и пользователь не увидит диалога о выборе времени, как бы он не хотел этого. Но в журнале документов время всегда можно будет изменить.

На сегодня все.


На сайте 1С:Школа можно скачать  архив рассылки с 1 по 30 выпуск в rar-архиве. Так же на сайте, открылся новый раздел "Библиотека". В нем вы найдете подборку книг и методического материала по 1С:Бухгалтерии, 1С:Торговле, 1С:Зарплате, бухгалтерскому учету и Конфигурированию. В разделе "Бухгалтерский учет" есть книга "Бухучет для технарей".


Алексей Колосов

Hosted by uCoz