1С Режим Конфигуратор

       

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


Новый документ в системе 1С можно ввести различными методами:

Интерактивно - этот способ можно реализовать по-разному.

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

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

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

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

РасчетныйСчет = ДокОсн.РасчетныйСчет;

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

Контрагент = ДокОсн.Контрагент;

Договор = ДокОсн.Договор;

ВариантРасчетаНалогов = ДокОсн.ВариантРасчетаНалогов;

ДокОсн.ВыбратьСтроки();

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

НоваяСтрока();

Товар = ДокОсн.Товар;

Количество = ДокОсн.Количество;



Цена = ДокОсн.Цена;




Сумма = ДокОсн.Сумма;

НДС = ДокОсн.НДС;

Всего = ДокОсн.Всего;

КонецЦикла;

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

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

Доступ к реквизитам счета осуществляется через переменную ДокОсн, которая является параметром процедуры. Как мы помним (см. описание предопределенных процедур модуля формы документа), в неё передается контекст документа-основания.

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

СФ = СоздатьОбъект("Документ.СчетФактура");

СФ.Новый();

СФ.ВариантОтправки = 1;

СФ.НомерДок = НомерДок; // Счет-фактура будет с тем же номером и датой, что и

СФ.ДатаДок = ДатаДок; // накладная. Но так можно и не делать, есть же автонумерация

СФ.Контрагент=Контрагент;

СФ.Грузополучатель=Контрагент;

ВыбратьСтроки();

Пока ПолучитьСтроку()=1 Цикл

СФ.НоваяСтрока();

// Реквизит "Товар" док-та СчетФактура имеет неопределенный тип

СФ.НазначитьТип("Товар", "Справочник.Номенклатура");

СФ.Товар=Товар;

Если ПустоеЗначение(Товар.СтранаПроисхождения) = 0 Тогда

// а это обращение к реквизитам справочника "Номенклатура"

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

Иначе

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

КонецЕсли;

СФ.Количество=Количество;

СФ.Цена=Цена;

СФ.Сумма=Сумма;

СФ.НДС=НДС;

СФ.Всего=Сумма+НДС;

// Здесь накладная становится основанием счета-фактуры через специальный реквизит

СФ.ДокументОснование = ТекущийДокумент();

КонецЦикла;

СФ.Записать();

СФ.Провести(0, "Программно");

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


Содержание раздела