Работа с документами в системе 1С предприятие

Автор работы: Пользователь скрыл имя, 18 Мая 2013 в 20:55, контрольная работа

Краткое описание

Документы предназначены для хранения основной информации о всех событиях, происходящих на предприятии, и, разумеется, имеющих смысл с точки зрения экономики. При помощи документов отражаются и платежи с расчетного счета, и операции но кассе, и кадровые перемещения, и движения по складу, и прочие подобные события.

Прикрепленные файлы: 1 файл

информатика Готова.doc

— 265.00 Кб (Скачать документ)

2. Модуль формы запускается при каждом открытии формы документа. В его контексте доступны все реквизиты документа и реквизиты формы. Кроме предопределенных процедур модуля формы, там можно разместить вспомогательные процедуры и функции, вызываемые, например, экранными кнопками. Не путайте: предопределенные процедуры модуля документа нельзя размещать в модуле формы, и наоборот!

Предопределенная  процедура

Описание

ВводНового(ПризнакКопирования, ОбъектКопирования)

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

Процедура ВводНового(Копирование)

Если ИмяПользователя() <> "Бухгалтер" Тогда

Предупреждение("Вам  не позволено создавать этот документ!");

СтатусВозврата(0); Возврат; //Новый документ не будет  создан

КонецЕсли;

Если Копирование = 1 Тогда

Возврат;

КонецЕсли;

КонецПроцедуры

ВводНаОсновании(Основание)

Выполняется при  вводе нового документа на основании  другого. В переменную Основание  передается контекст документа-основания, т.е. теперь вы можете обратиться к его реквизитам через эту переменную:

СуммаДоплаты=Основание.СуммаСверху; //Свой реквизит принимает значение реквизита документа-основания.

Помните, что  после обработки этой процедуры система не сохранит информацию о том, что новый документ введен на основании другого. Для реализации такой возможности вы должны иметь во вновь создаваемом документе реквизит типа "Документ", куда можно записать ссылку на документ-основание. Лучше сделать её доступной пользователю, чтобы он потом имел возможность выбрать другой документ-основание.

ПриЗаписи()

Выполняется при  записи (перезаписи) документа. Имейте ввиду, что операторы этой процедуры  выполняются ДО фактической записи документа в базу. Это, так сказать, подготовительная работа.

ПриВводеСтроки()

Вызывается  при вводе пользователем новой  стоки многострочной части документа. Такой операцией, например, можно  отменить ввод новых строк, если в  документе нельзя вводить строки вручную (можно добавить какое-либо условие):

Процедура ПриВводеСтроки()  
.......СтатусВозврата(0); 
КонецПроцедуры

ПриНачалеРедактированияСтроки()

Обрабатывает  начало изменения существующей (!) строки (когда пользователь ручками вводит или изменяет значения реквизитов табличной  части). Исходя из примера, описанного выше для процедуры ПриВводеСтроки(), догадайтесь, как можно запретить редактирование стоки?

ПриРедактированииНовойСтроки()

Похожая на предыдущую, но с тем отличием, что вызывается только при редактировании ВНОВЬ  созданной строки.

ПриОкончанииРедактированияСтроки (ФлагНовойСтроки)

ФлагНовойСтроки - имя переменной, в которую будет  записана 1, если окончен ввод НОВОЙ  строки, соответственно - 0, если закончено  редактирование ИМЕВШЕЙСЯ. Процедура  вызывается, когда пользователь "дезактивирует" строку мышкой, нажатием Enter, или Esc (кроме случая, когда отказываются от редактирования новой строки).

ПриУдаленииСтроки()

Действие, которое  будет обработано данной процедурой, очевидно исходя из имени процедуры. Что еще добавить?

ПриИзмененииПорядкаСтрок (ФлагДействия)

ФлагДействия - имя переменной, которая станет "-1", если строка поднимается вверх, станет "1" при перемещении строки вниз, и станет "0", если изменяются номера строк, например, при сортировке. А  что при этом сделать - это уже ваша фантазия (моей не хватает :).


Не забывайте  о том, что имеются предопределенные процедуры, общие для любых форм системы 1С, такие как ПриОткрытии(), ПриЗакрытии() и т.д. Их подробное  описание здесь не приводится, дабы не перегружать главу о документах.

Печатные формы документа

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

У документа  может быть несколько шаблонов печатных форм. Средствами встроенного языка (метод ИсходнаяТаблица) задается тот  шаблон печатной формы, который будет  использоваться.

Шаблоны печатных форм (таблицы) могут быть общие. Это  дает возможность использовать один шаблон для печати нескольких видов  документов. Т.е. общая таблица является глобальной для конфигурации и может  быть использована в любом модуле. Примером из типовой конфигурации может являться шаблон печатной формы "Отчет о движении документа", который используется разными модулями конфигурации.

Маленькая хитрость: если вы создали свою печатную форму  для какого-либо документа, или "заточили" типовую, рекомендую сохранить её в отдельном файле печатной формы (*.mxl) тогда при переходе с релиза на релиз вам не будет нужды переделывать таблицы документа, достаточно будет в операторе ИсходнаяТаблица() процедуры печати вставить ссылку на внешний файл.

 

Создание и проведение документа

Новый документ в системе 1С можно ввести различными методами: 
Интерактивно - этот способ можно реализовать по-разному.

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

2. Разновидностью  этого варианта является создание  документа из открытой формы  журнала документов. Второй вариант  предполагает создание нового  документа путем копирования такого же. При копировании документу присваивается новый номер, а все реквизиты заполняются данными из скопированного документа. Вот почему, если в процедуре ВводНового() вы заполняете некоторые реквизиты при создании нового документа, то необходимо в начале этой процедуры задать проверку факта копирования, для того, чтобы не сбить значения реквизитов.

3. При третьем  варианте новый документ создается  на основании существующего документа  другого вида. В такой ситуации  вместо процедуры ВводНового() будет вызвана процедура ВводНаОсновании(). В ней нужно описать, какие реквизиты нового документа будут заполнены значениями из документа-основания. Естественно, что заполняемые реквизиты нового документа должны иметь тот же тип, что и соответствующие реквизиты-источники. Пример заполнения расходной накладной на основании счета:

Процедура ВводНаОсновании(ДокОсн)

РасчетныйСчет = ДокОсн.РасчетныйСчет; 
МестоХранения = глЗначениеПоУмолчанию("ОсновнойСклад"); 
Контрагент = ДокОсн.Контрагент; 
Договор = ДокОсн.Договор; 
ВариантРасчетаНалогов = ДокОсн.ВариантРасчетаНалогов;

ДокОсн.ВыбратьСтроки(); 
Пока ДокОсн.ПолучитьСтроку() = 1 Цикл

НоваяСтрока(); 
Товар = ДокОсн.Товар; 
Количество = ДокОсн.Количество; 
Цена = ДокОсн.Цена; 
Сумма = ДокОсн.Сумма; 
НДС = ДокОсн.НДС; 
Всего = ДокОсн.Всего;

КонецЦикла;

КонецПроцедуры

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

4. Программный  способ - для него в языке 1С предусмотрены специальные команды. Можно при записи расходной накладной сформировать документ СчетФактура:

СФ = СоздатьОбъект("Документ.СчетФактура"); 
СФ.Новый(); 
СФ.ВариантОтправки = 1; 
СФ.НомерДок = НомерДок; // Счет-фактура будет с тем же номером и датой, что и 
СФ.ДатаДок = ДатаДок; // накладная. Но так можно и не делать, есть же автонумерация 
СФ.Контрагент=Контрагент; 
СФ.Грузополучатель=Контрагент; 
 
ВыбратьСтроки(); 
Пока ПолучитьСтроку()=1 Цикл

СФ.НоваяСтрока(); 
// Реквизит "Товар" док-та СчетФактура имеет неопределенный тип 
СФ.НазначитьТип("Товар", "Справочник.Номенклатура");  
СФ.Товар=Товар; 
Если ПустоеЗначение(Товар.СтранаПроисхождения) = 0 Тогда

// а это обращение  к реквизитам справочника "Номенклатура" 
СФ.СтранаПроисхождения = Товар.СтранаПроисхождения;

Иначе

СФ.СтранаПроисхождения = "Россия";

КонецЕсли;

СФ.Количество=Количество; 
СФ.Цена=Цена; 
СФ.Сумма=Сумма; 
СФ.НДС=НДС; 
СФ.Всего=Сумма+НДС;  
 
// Здесь накладная становится основанием счета-фактуры через специальный реквизит 
СФ.ДокументОснование = ТекущийДокумент();

КонецЦикла; 
СФ.Записать(); 
СФ.Провести(0, "Программно");

Обратите внимание, что сначала создается документ как объект, а затем вводится новый  документ. Последующие действия похожи на действия при вводе на основании. Не забудьте, если вы создаете или изменяете документ программно, его необходимо записывать. И пожалуйста, не пытайтесь использовать метод Провести() в теле предопределенной процедуры ОбработкаПроведения() модуля документа!

Проведение документа

Оператор Провести() в приведенном выше примере выполнит проведение документа. При проведении будет вызвана предопределенная процедура ОбработкаПроведения(). Вторым реквизитом передается в обработку проведения значение ("Программно"), по которому процедура ОбработкаПроведения() узнает о программном выполнении проведения. Это может быть простая строка или число, её задача - только обозначить факт программного проведения.

Если вы работаете  с уже существующим документом, то метод Провести() перепроведет документ. А с помощью метода Проведен() можно узнать, проведен ли какой-либо документ:

Если Док.Проведен() > 0 Тогда

Сообщить( "Документ № " + Док.НомерДок + " проведен"); 
…………… // Какие-то действия, которые нужно сделать с проведенным документом

КонецЕсли;

О создании операций и проводок при проведении документов читай раздел Операции и проводки главы Бухгалтерия.

Транзакции

При создании множества  документов или для ускорения  работы можно заключить цикл в  транзакцию. При этом реальная запись документов произойдет только по команде  ЗафиксироватьТранзакцию(). На время транзакции блокируется для других пользователей запись и проведение документов.

СписаниеМатериалов = СоздатьОбъект("Документ.ТребованиеНакладаная"); 
НачатьТранзакцию();  
Для Ном = 1 По 100 Цикл

СписаниеМатериалов.Новый(); 
………………… 
// Заполнение реквизитов 
СписаниеМатериалов.Записать(); 
СписаниеМатериалов.Провести();

КонецЦикла;  
ЗафиксироватьТранзакцию();

Напомню, что  предопределенная процедура ОбработкаПроведения() самостоятельно открывает транзакцию для проведения, однако есть маленькая особенность документа, созданного функцией СоздатьОбъект(). Дело в том, что про программном проведении созданных документов не выполняется автоматическая предварительная запись, и для того, чтобы при любых сбоях и ошибках сохранялась согласованность данных документа и его движений (операций) следует объединять запись и проведение документа в одну транзакцию.

Установка периодического реквизита справочника  при проведении документа

Простым примером такого действия является установка  нового оклада сотруднику в справочнике Сотрудники при проведении, например, штатного расписания.

Процедура ОбработкаПроведения()

УстановитьРеквизитСправочника (Сотрудник, "Оклад", НовыйОклад, ДатаДок);

КонецПроцедуры

Здесь Сотрудник - значение реквизита документа типа "Справочник", через него в справочнике позиционируется нужный элемент, а "Оклад" - периодический реквизит соответствующего элемента. Этот оператор можно использовать только в предопределенной процедуре ОбработкаПроведения(). Теперь при просмотре истории периодического реквизита вы увидите кроме самого значения, ещё и дату установки (соответствует дате документа), и документ, который установил данное значение.

 

Номер документа и нумераторы

 
Номер документа

При интерактивном  или программном создании нового документа ему автоматически  присваивается новый уникальный номер. Его можно получить или  установить какой-нибудь другой с помощью  атрибута НомерДок:

Док = СоздатьОбъект("Документ.Счет")
Док.Новый();  
Сообщить("Документу был автоматически присвоен № " + Док.НомерДок); 
Док.НомерДок = "000013"; 
Сообщить("Установлен новый № " + "000013");

Префикс номера

Если вы используете  распределенную базу или желаете, чтобы  документы обозначали пользователя, который их создал, полезно пользоваться префиксами - одним или двумя символами, которые подставляются перед собственно номером документа, но при этом "входят" в номер. Не забывайте, что префикс должен быть строковым ("Сч-" или "01", или "1-"), а в свойствах документа должен быть установлен строковый тип номера.

Док = СоздатьОбъект("Документ.Счет")
ПрефДок = Лев(ИмяПользователя(),2); 
Док.ПрефиксНомера(ПрефДок + "-");  
Док.Новый();

Этот метод  изменяет префикс по умолчанию, или  возвращает текущее значение префикса, если использовать метод без параметра. А вот другая возможность:

Док = СоздатьОбъект("Документ.Счет")
ПрефДок = Лев(ИмяПользователя(),2); 
Док.Новый();  
Док.УстановитьНовыйНомер(ПрефДок + "-"); // такая нумерация работает очень корректно

В отличие от предыдущего этот метод устанавливает (а точнее переустанавливает введенный  по умолчанию при исполнении метода Новый()) новый номер с указанным  префиксом.

Что такое нумератор?

Нумератор представляет собой объект метаданных, описывающий  правила нумерации документов: тип и длина номера документа, его периодичность, необходимость контроля уникальности. Основное назначение нумератора - обеспечить возможность сквозной нумерации документов разного вида, для чего таким документам назначается одинаковый нумератор.

Информация о работе Работа с документами в системе 1С предприятие