Приемы программирования

С помощью встроенного языка 1С:Предприятия 8.0 можно выполнять различные операции над документами: создавать, изменять и удалять их, искать документ по номеру, перебирать их в цикле и т.д.

Работа с документами производится с помощью нескольких программных объектов (аналогичные объекты мы уже рассматривали для справочников):

ДокументыМенеджер

Обеспечивает доступ к менеджерам всех документов конфигурации. Свойства этого объекта совпадают по имени с именами документов и содержат объекты типа ДокументМенеджер.

ДокументМенеджер

Обеспечивает доступ к действиям над документами определенного вида как множеством объектов. Через методы этого объекта можно осуществлять поиск, получать выборку, создавать новый документ, обращаться к формам и макетам документа.

ДокументСсылка

Это специальный объект, однозначно идентифицирующий документ в базе данных и позволяющий обращаться к нему в режиме «только чтение». Значение данного типа хранится, например, в реквизитах других объектов, ссылающихся на документы данного вида. Через свойства и методы этого объекта можно прочитать реквизиты документа, обратиться к его табличным частям.

ДокументОбъект

Предоставляет доступ к документу с возможностью записи и проведения. Даный объект содержит методы, изменяющие документ в базе данных, например, метод Записать.

ДокументВыборка

Предоставляет возможность обхода (перебора) документов определенного вида. Объект этого типа возвращается методом Выбрать объекта ДокументМенеджер.

ДокументСписок

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

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

 

 

Замечание. На схеме показаны не все возможные взаимосвязи Например, метод Скопировать существует не только у объекта ДокументСсылка, но и у самого объекта ДокументОбъект.

Рассмотрим на примерах выполнение типичных операций с документами.

 

Обращение к менеджеру документа

Обращение к менеджеру документа производится следующим образом:

 

ДокСчет = Документы.Счет;
ДокСчет = Документы["Счет"];
 

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

Внимание! С помощью ключевого слова Новый нельзя создавать новые документы. Для этого предназначен метод СоздатьДокумент объекта ДокументМенеджер, который возвращает объект типа ДокументОбъект. <ИмяДокумента>.

Следующий фрагмент показывает пример создания нового документа.

 

ДокМенеджер = Документы.Счет;
НовыйДок = ДокМенеджер.СоздатьДокумент();
//при создании документа программным способом
//дата документа не заполняется системой,
//это должен сделать разработчик
НовыйДок.Дата = Дата;
НовыйДок.Записать();
 

Выборка документов

Перебор документов производится через объект ДокументВыборка, который возвращается при вызове метода Выбрать объекта ДокументМенеджер:

 

ДокВыборка = Документы.Счет.Выбрать();
Пока ДокВыборка.Следующий() Цикл
	Сообщить("К " + ДокВыборка.Номер + " от " + ДокВыборка.Дата);
	//перебор строк табличной части
	Для Каждого стр Из ДокВыборка.Состав Цикл
		Сообщить!" " + стр Номенклатура);
	КонецЦикла;
КонецЦикла;
 

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

В 1С:Предприятии 8.0 можно программно создать, записать и провести документ. Для создания нового документа применяется метод СоздатьДокумент, который возвращает объект для записи типа ДокументОбъект. Через другие объекты и механизмы нельзя создать, изменить или удалить документ.

Следующий пример демонстрирует создание документа, его запись без проведения и запись с неоперативным проведением:

 

НовыйДок = Документы.Счет.СоздатьДокумент();
НовыйДок.Дата = Дата;
НовыйДок.Записать(); //обычная запись документа
//запись документа с неоперативным проведением
НовыйДок.Записать(РежимЗаписиДокумента.Проведение,
РежимПроведенияДокумента.Неоперативный);
 

Внимание! Теперь у документа нет метода Провести, как это было в версии 7.7. Программное проведение документа выполняется с помощью метода Записать с параметрами РежимЗаписиДокумента и РежимПроведенияДокумента.

Ниже приведены возможные значения параметров метода Записать:

Параметр «РежимЗаписиДокумента»:

  • • Запись (по умолчанию),

  • • ОтменаПроведения,

  • • Проведение (в этом случае имеет смысл указывать второй параметр).

Параметр «РежимПроведенияДокумента»:

  • • Неоперативный (по умолчанию),

  • • Оперативный.

  •  

Поиск документа

Поиск документа по номеру производится методом НайтиПоНомеру. Этот метод возвращает ссылку на найденный документ или пустую ссылку, если документ не найден. Проверка на пустую ссылку производится методом Пустая():

 

ДокСсылка = Документы.Счет.НайтиПоНомеру("Сч1ОО1");
Если ДокСсылка.Пустая() Тогда
	Сообщить("Документ с данным номером не найден!");
КонецЕсли;
 

Если требуется отобрать множество документов с определенным значением реквизита, то можно применить метод Выбрать с указанием структуры отбора и затем обойти полученную выборку.

Не забудьте, что у реквизита, по которому производится отбор, должен быть установлен в Конфигураторе флажок «Индексировать» (для даты документа можно считать, что он уже установлен).

Для выборки документов из базы данных по комбинированному условию, например, по нескольким полям, рекомендуется применять запросы (см. главу «Запросы»).

 

Удаление документа

Удаление документа производится с помощью объекта  ДокументОбъект и только так. Другим способом удалить документ нельзя.

 

ДокСсылка = Документы.Счет.НайтиПоНомеру("Сч1001");
Если Не ДокСсылка.Пустая() Тогда
	ДокОбъект = ДокСсылка.ПодучитьОбъект();
 
	//1-й вариант пометки на удаление
	//если документ был проведен, то он остается проведенным (!)
	//движения документа по регистрам сохраняются (!)
	ДокОбъект.ПометкаУдаления = Истина;
	ДокОбъект.Записать();
 
	//2-й вариант пометки на удаление
	//если документ был проведен, то он делается непроведенным
	//движения документа по регистрам удаляются
	ДокОбъект.УстановитьПометкуУдаления(Истина);
 
	//непосредственное удаление объекта
	//если документ был проведен, то движения по регистрам удаляются
	ДокОбъект.Удалить();
КонецЕсли;
 

Внимание! При пометке на удаление методом УстановитьПометкуУдаления проведенный документ делается непроведенным и движения документа по регистрам удаляются (если не установлено свойство документа «Удалять движения автоматически»). А при присвоении свойству ПометкаУдаления значения Истина проведенный документ остается проведенным и движения документа по регистрам сохраняются.

При непосредственном удалении документа контроль за удалением движений документа возлагается на разработчика.

 

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

Часто требуется программно открыть какую-либо форму доку-

мента. Рассмотрим на примерах варианты открытия различных

форм документа:

 

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

Работа с табличным частями

Обращение к табличным частям документа производится по их именам. Для обхода строк табличной части рекомендуется применять конструкцию «Для Каждого...».

Например, ниже показан фрагмент модуля документа ПриходнаяНакладная:

 

// Для каждой строки сформируем движения
//по регистру остатков УчетНоменклатуры
Для Каждого СтрокаСостава Из Состав Цикл
	Движение = Движения.УчетНоменклатуры.ДобавитьПриход();
	Движение.Период = Дата;
	Движение.Номенклатура = С трсжаСостава.Номенклатура;
	Движение.Склад = Склад;
	Движение.Количество = СтрокаСостава.Количество;
КонецЦикла;
Движения.УчетНоменклатуры.Записать();
 

Замечание. В 1С:Предприятии 8.0 больше нет понятия «итог по колонке», т.е. система больше не поддерживает хранение итога по колонке табличной части при установке флажка, как это было в версии 7.7. Если требуется хранить и быстро получать итоговую сумму по колонке табличной части, то для этого нужно завести реквизит документа и заполнять его, например, в процедуре ПередЗаписью.

 

Движения документа

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

Рассмотрим типичную схему создания новых движений по регистру остатков и регистру бухгалтерии при проведении документа:

 

ВидыСубконто = ПланыВидовХарактеристик.ВидыСубконто;
//по каждой строке сформируем движения по регистру УчетНоменклатуры
Для Каждого СтрокаСостава Из Состав Цикл
	Движ = Движения.УчетНоменклатуры.ДобавитьПриход();
	движ.Период = Дата;
	Движ.Склад = Склад;
	Движ. Номенклатура = СтрокаСостава.Номенклатура;
	Движ.Количество = СтрокаСостава.Количество;
КонецЦикла;
// сформируем одну бухгалтерскую проводку на общую сумму
Движ = Движения.Основной.Добавить() ;
Движ.Период = Дата;
Движ.Ндс = ПланнСчетов.Основной.НДСпоПриобретеннемЦенностям;
Движ.СчетКт = ПланыСчетов.Основной.Поставщики;
Движ.СубконтоКт[ВидыСубконто.Контрагенты] - Контрагент ;
Движ.Сумма = Состав.Итог("НДС");
 
//записываем движения в базу данных
Движения.УчетНоменклатуры.Записать();
Движения.Основной.Записать();

  типографии выгодные цены