1С-Предприятие 8.0. Практическое пособие разработчика

         

Документ


В версии 7.7 была предопределенная процедура ВводНового(). Что-то не могу найти ее в версии 8.0...

Теперь факт интерактивного ввода нового объекта (элемента справочника, документа и т.д.) не выделяется в отдельное событие.

В версии 8.0 для анализа аналогичного факта следует использовать событие объекта Форма – "При открытии". Для того чтобы в обработчике этого события проанализировать, выполняется ли ввод нового объекта, или открыт уже существующий, нужно вызвать метод прикладного объекта ЭтоНовый(). Метод вернет значение Истина, если вводится новый объект, и Ложь – в противном случае.

В качестве примера можно посмотреть процедуру "СвойстваПередНачаломДобавления" формы элемента справочника "ВариантыНоменклатуры" в разделе "Доработка справочника ВариантыНоменклатуры" на странице 269, или обработчик события "Перед записью" формы узла плана обмена "Филиалы" в разделе "Создание плана обмена Филиалы" на странице 403.

Более подробную информацию можно найти на диске ИТС в статье "Процедуры - обработчики событий".

Есть ли какой-нибудь аналог для метода ПриЗаписиПерепроводить() в версии 8.0?

Есть.

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

Более подробно о том, что такое расширения формы, можно прочитать в разделе "Данные и элементы управления" на странице 502. [627]

Как сохранить документ без проведения (в 7.7 можно было написать в кнопке #Записать Закрыть)?

В версии 8.0 следует использовать обработчик события нажатия кнопки. Назначение процедур модуля обработчиками события нажатия возможно как для новых кнопок, размещаемых в форме, так и для стандартных кнопок, расположенных в командной панели "ОсновныеДействияФормы".






В обработчике события нажатия следует вызвать метод объекта документ Записать(), с первым параметром, равным РежимЗаписиДокумента.Запись. После этого нужно закрыть форму:

Процедура ЗаписатьБезПроведенияИЗакрыть(Кнопка)

   Записать(РежимЗаписиДокумента.Запись);

   Закрыть();

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

Как перебрать строки табличной части документа?

Табличная часть документа (так же, как и любого другого объекта конфигурации, обладающего табличными частями) представляет собой коллекцию значений, элементами которой являются строки табличной части. Поэтому перебор строк табличной части (так же, как и любой другой коллекции значений) проще всего реализовать с помощью цикла Для Каждого ... Из ... Цикл ... КонецЦикла:

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

   ОчереднаяСтрока = ТекСтрокаМатериалы;

   ...

КонецЦикла;

При этом переменной цикла "ТекСтрокаМатериалы" будет являться не номер строки, а вся строка как объект. Для получения номера строки следует использовать свойство НомерСтроки или добавить переменную и увеличивать ее в теле цикла. [628]

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

Для СчетчикЦикла = 0 По Материалы.Количество() - 1 Цикл

   ОчереднаяСтрока = Материалы[СчетчикЦикла];

   ...

КонецЦикла;

В качестве примера можно посмотреть главу "Способы работы с коллекцией" на странице 550, или обработчик события "ОбработкаПроведения" в модуле документа "ПриходнаяНакладная" в разделе "Создание движений документа ПриходнаяНакладная" на странице 89.

Есть ли в версии 8.0 подчиненные документы?

Нет, специального понятия "Подчиненные документы" в версии 8.0 не существует.

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



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

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

Однако следует учитывать, что критерий отбора не позволяет выполнять динамический просмотр найденных данных. В список будут включаться все найденные объекты. Соответственно, нецелесообразно использовать этот механизм, если количество [629] найденных объектов по значениям критерия отбора будет достаточно велико.

Примеры работы с зависимыми объектами можно посмотреть в разделах "Ввод на основании" на странице 493 и "Объекты, введенные на основании" на странице 497.

Как добавить строку в табличную часть документа?

Табличная часть документа представляет собой коллекцию значений, элементами которой являются строки табличной части.

В версии 8.0 существуют общие принципы работы с коллекциями значений. Чтобы добавить элемент в коллекцию (в данном случае строку в табличную часть документа), нужно вызвать у коллекции метод Добавить(). Метод возвращает объект – добавленный элемент коллекции. В случае с табличной частью это будет строка табличной части:

СтрокаСостава = ДокументОбъект.Состав.Добавить();

СтрокаСостава.Количество = 10;

Не могу найти метод Провести() у документа...?

В версии 8.0 у документа нет метода Провести().

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

Таким образом, теперь документ может быть либо просто записан, либо записан с проведением, либо с отменой проведения. Режим записи документа задается параметром его метода Записать():



ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Как теперь обрабатывать во встроенном языке ввод на основании и копирование?

В версии 8.0 при вызове стандартной команды ввода на основании выполняется создание нового объекта и вызов в модуле этого объекта обработчика события "Обработка заполнения". [630]

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

Надо помнить, что событие "Обработка заполнения" возникает не только при вводе на основании. Это событие будет возникать и при вызове метода объекта Заполнить().

Таким образом, обработчик события "Обработка заполнения" является стандартным местом, в котором реализуется заполнение данных объекта из данных объекта основания без учета того, откуда и зачем вызывается это заполнение.

Поэтому обратите внимание на то, что в этом обработчике следует выполнять только заполнение данных, и не следует делать каких-либо дополнительных действий связанных с интерфейсом системы.

Аналогичным образом выполняется копирование. При копировании вызывается обработчик события объекта "При копировании", в котором можно дополнить стандартное заполнение данных выполняемое системой при копировании объекта. Этот обработчик вызывается, как при интерактивном копировании, так и при вызове метода Скопировать().

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

Примеры обработки ввода одних объектов на основании других можно посмотреть в разделах "Ввод на основании" на странице 493 и "Объекты, введенные на основании" на странице 497.



Как прочитать движения документа по определенному регистру?

Существует два способа, которыми можно это сделать.

Во-первых, можно "пойти от документа". Для этого следует воспользоваться свойством объекта ДокументОбъект.<имя> – Движения. Это свойство содержит коллекцию пустых наборов записей документа по каждому из регистров, которые указаны для [631] этого документа в конфигураторе. Чтобы получить движения документа по конкретному регистру, нужно обратиться к набору записей этого конкретного регистра (указав имя регистра в качестве свойства через точку), и затем прочитать этот набор записей:

ДокументОбъект = Документы.ПриходнаяНакладная.НайтиПоНомеру(1).ПолучитьОбъект();

Движения = ДокументОбъект.Движения.ОстаткиМатериалов;

Движения.Прочитать();

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

Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();

Движения.Отбор.Регистратор.Значение = Документы.ПриходнаяНакладная.НайтиПоНомеру(1);

Движения.Прочитать();

В 7.7 были общие реквизиты. В версии 8.0 их нет?

Да. Было принято решение в версии 8.0 отказаться от общих реквизитов документов. Вместе с этим в версии 8.0 нет и общего журнала документов.

Теперь, если у всех документов нужно иметь аналогичные реквизиты, например, "Автор" и "Редактор", эти реквизиты следует создать вручную у каждого документа.

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

Однако в этом случае следует иметь в виду, что при интенсивной работе пользователей в файловом варианте информационной базы, высока вероятность возникновения коллизий. Добиться ее уменьшения можно путем исключения из состава этого журнала документов, которые проводятся наиболее часто. [632]


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