- •Документы
- •6.1. Документы и журналы документов
- •6.2. Структура документа
- •6.3. Экранные формы документа
- •6.4. Макеты документа
- •6.5. Проведение документов
- •Оперативная отметка времени
- •6.6. Модуль документа
- •6.7. Приемы программирования
- •Обращение к менеджеру документа
- •Выборка документов
- •Создание и проведение документа
- •Поиск документа
- •Удаление документа
- •Открытие форм документа
- •Работа с табличным частями
- •Движения документа
- •6.8. Нумерация документов
- •Нумераторы
- •Префиксы номеров
- •6.9. Журналы документов
- •Графы журнала
- •6.10. Последовательности
Оперативная отметка времени
При оперативном проведении дата документа, как правило, изменяется на текущий момент, что является обычным поведением системы. Но разработчик может взять этот процесс под свой контроль. Он сам может получать очередную оперативную отметку времени и присваивать ее документу при проведении или при записи. Для этого предназначен метод глобального контекста ПолучитьОперативнуюОтметкуВремени. Его возвращаемое значение соответствует текущей дате (с учетом времени), но будет не меньше, чем последняя оперативная отметка времени, полученная каким-либо пользователем в этом сеансе работы с информационной базой. Таким образом, 1C:Предприятие 8 предоставляет механизм для получения неповторяющихся отметок времени.
Например:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Дата = ПолучитьОперативнуюОтметкуВремени();
…
КонецПроцедуры
6.6. Модуль документа
Следует отличать модуль документа и модули его форм . В модуле документа располагаются процедуры и функции, связанные с документом как объектом конфигурации, независимо от его экранных форм.
Например, там и только там располагаются обработчики следующих событий:
ОбработкаПроведения
Событие возникает в момент проведения документа. Обычно в нем содержится алгоритм формирования движений документа по регистрам. Событие имеет два параметра: Отказ и Режим. Если в обработчике события первому параметру присвоить значение Истина, тогда документ не будет проведен. Второй параметр позволяет узнать режим проведения документа: оперативный или неоперативный. Перед началом выполнения данной процедуры, если документ раньше сформировал движения, то они обычно очищаются системой автоматически.
ОбработкаУдаленияПроведения
Событие возникает в момент отмены проведения документа. При этом движения документа, как правило, очищаются автоматически.
ОбработкаЗаполнения
Это событие возникает при вводе документа на основании другого документа (или, например, элемента справочника), который передается в параметр Основание. В данной процедуре программист должен предусмотреть заполнение реквизитов документа.
ПередЗаписью
Это событие возникает перед выполнением записи объекта после начала транзакции, но до начала записи документа в базу данных.
ПередУдалением
Событие возникает перед удалением документа из базы, независимо от того, программно или интерактивно он удаляется.
ПриУстановкеНовогоНомера
Данное событие возникает в момент, когда выполняется установка нового номера документа.
ПриКопировании
Это событие возникает при создании документа копированием. В процедуре-обработчике можно произвести дополнительные действия, например, присвоить новую дату и новый номер, заполнить реквизит Автор и т.д.
Замечание. Все эти процедуры-обработчики событий вызываются при наступлении указанных событий независимо от того, как они были инициированы: программно или интерактивно. Даже если документ записывается методом Записать, то будут вызваны процедуры-обработчики ПередЗаписью и ПриЗаписи. Это следует учитывать при разработке конфигураций.
Кроме вышеперечисленных процедур, в модуле документа могут располагаться процедуры и функции, созданные разработчиком. Если их объявить с ключевым словом Экспорт, то они станут доступными вне документа, как обычные методы.
Часто таким образом производится печать документов, например, ниже приведена процедура печати расходной накладной:
Процедура Печать(ТабДок) Экспорт
//получение макета
Макет = Документы.РасходнаяНакладная.ПолучитьМакет("Печать");
//вывод шапки
Область = Макет.ПолучитьОбласть ("Шапка");
Область.Параметры.НомерДокумента = Номер;
Область.Параметры.От = Дата;
ТабДок. Вывести (Область);
//вывод табличной части Состав
Для Каждого СтрокаСостава Из Состав Цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Заполнить(СтрокаСостава);
ТабДок.Вывести(Область);
КонецЦикла;
//вывод подвала
Область = Макет.ПолучитьОбласть{"Подвал"),
Область,Параметры.ИтогоКоличество = Состав.Итог("Количество");
Область.Параметры,ИтогоСумма = Состав.Итог("Сумма");
ТабДок.Вывести(Область);
КонецПроцедуры
Теперь в любом программном модуле можно вызвать эту процедуру и передать ей в качестве параметра табличный документ, который затем можно показать на экране или отправить сразу на принтер.
Например, в форме документа по кнопке «Печать» вызывается следующая процедура:
Процедура ПечатьСПросмотром(Кнопка)
ТабДок = Новый ТабличныйДокумент;
Печать(ТабДок); //вызывается приведенная выше процедура
ТабДок.Показать();
КонецПроцедуры
Аналогично, можно организовать печать текущей расходной накладной из журнала документов, и снова будет вызвана наша процедура Печать из модуля документа, например:
Процедура ПечатьТекущегоДокумента()
Список = ЭлементыФормы.Список;
Если Список.ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекДокумент = Список.ТекущаяСтрока.ПолучитьОбъект();
ТабДок = Новый ТабличныйДокумент;
ТекДокумент.Печать(ТабДок);
ТабДок.Показать();
КонецПроцедуры
