Присвоить документ в реквизит

Управляемые формы, присвоение реквизиту документа ссылки на сам документ.

Я
   uncknow

19.06.12 — 16:34

Задача:

Создан документ, еще не записан. Необходимо заполнить реквизит документа  ссылкой на сам документ.

Какие есть простые способы решить эту задачу?:

1. Не записывая документ.

2. Записывая документ.

=)

   zak555

1 — 19.06.12 — 16:36

какой глубокий смысл в этом ?

   mikecool

2 — 19.06.12 — 16:36

хреновая задача, имхо

   Stim

3 — 19.06.12 — 16:36

«Необходимо заполнить реквизит документа  ссылкой на сам документ»

пятнично!

   mikecool

4 — 19.06.12 — 16:37

+2 ибо у него и так есть Ссылка

   DionisSergeevich

5 — 19.06.12 — 16:39

по ссылке получить объект и присвоить реквизиты самого документа и документа полученного по ссылке

   uncknow

6 — 19.06.12 — 16:43

Неужто такая простая задача всех в ступор завела? :))

Для обычного режима задача не стоит и выведенного яйца :)

   Fragster

7 — 19.06.12 — 16:44

(6) для необычного — всё так же

   DSSS

8 — 19.06.12 — 16:44

Присоединяюсь к (1)

   uncknow

9 — 19.06.12 — 16:45

(7) Документ.Реквизит = Объект.Ссылка   ?

   zak555

10 — 19.06.12 — 16:45

(9) нахрена ?

   uncknow

11 — 19.06.12 — 16:47

(1) Документ расчетов.

   Stim

12 — 19.06.12 — 16:48

(11) расскажи задачу полностью, мб отговорим тебя от такого поступка

   zak555

13 — 19.06.12 — 16:48

(11) ???

   Fragster

14 — 19.06.12 — 16:50

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

   uncknow

15 — 19.06.12 — 16:50

(12)(13) Да уже просто из принципа интересно.

(All) Сам Документ является документом расчетов.

   Smallrat

16 — 19.06.12 — 16:51

В модуле объекта

[/1C]

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

   Если ЭтотОбъект.ЭтоНовый() Тогда

       мСсылкаНового = ЭтотОбъект.ПолучитьСсылкуНового();

       Если НЕ ЗначениеЗаполнено(мСсылкаНового) Тогда

           мСсылкаНового = Документы[ЭтотОбъект.Метаданные().Имя].ПолучитьСсылку();

       КонецЕсли;

       Если НЕ ЗначениеЗаполнено(ЭтотОбъект.ПолучитьСсылкуНового()) Тогда

           ЭтотОбъект.УстановитьСсылкуНового(мСсылкаНового);

       КонецЕсли;    

   КонецЕсли;

   
   Если НЕ ЗначениеЗаполнено(Договор) Тогда

       Если ЭтоНовый() Тогда

           СсылкаНаДокумент = мСсылкаНового;

       Иначе

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

       КонецЕсли;

   КонецЕсли;

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

[1C]

зачем такое нужно — ну вот в (14) написано

   zak555

17 — 19.06.12 — 16:51

(14) так у вновь создаваемого док есть реквизит на докОсновании, где ссылка заранее определена

   fisher

18 — 19.06.12 — 16:51

(9) Ну и плюс УстановитьСсылкуНового().

Хитрость только в доступе к объекту из модуля формы на сервере.

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

   Smallrat

19 — 19.06.12 — 16:52

упс

Если НЕ ЗначениеЗаполнено(Договор) Тогда

заменить на

Если НЕ ЗначениеЗаполнено(СсылкаНаДокумент ) Тогда

   Fragster

20 — 19.06.12 — 16:52

(17) а у самого первого? так можно сделать сквозной реквизит, по которой и первый документ будет выбираться

   uncknow

21 — 19.06.12 — 16:52

(16) Это Управляемое приложение

   Fragster

22 — 19.06.12 — 16:53

(20)+ если вводить 3-й документ на основании второго — то реквизит с первым документом будет свой, а одкОснование — свой

   uncknow

23 — 19.06.12 — 16:53

(18) Это решение я знаю :)

   fisher

24 — 19.06.12 — 16:54

(18) + Или делать назначение ссылки и присвоение её реквизиту в ПриЧтенииНаСервере(), когда объект еще напрямую доступен.

(23) А в чем проблема тогда?

   uncknow

25 — 19.06.12 — 16:56

(24) Да как-то не кошерно, хочется попроще :))

   fisher

26 — 19.06.12 — 16:58

(25) А в чем ты видишь принципиальную разницу с обычными формами? Там кашерно было, а тут некашерно?

   uncknow

27 — 19.06.12 — 17:00

В обычных формах можно сразу получить ссылку на вновь созданный объект, это если мне память не изменяет =)

   fisher

28 — 19.06.12 — 17:01

(27) Без записи и УстановитьСсылкуНового()? Изменяет.

   uncknow

29 — 19.06.12 — 17:04

(28)  Возможно старый совсем стал :)

   zak555

30 — 19.06.12 — 17:04

(20) зачем первому реквизит ?

   mistеr

31 — 19.06.12 — 17:04

(0)

1. Пока документ не записан, ссылки на него нет (в курсе?)

2. Если документ записан, ссылка в реквизите Ссылка (в курсе?).

   mistеr

32 — 19.06.12 — 17:05

(25) Не кошерно у вас спроектировано.

   fisher

33 — 19.06.12 — 17:06

(31) Пока документ не записан, ему можно явно назначить ссылку с которой он будет записан (в курсе?)

   uncknow

34 — 19.06.12 — 17:06

(31) Если бы не знал, тему бы не открывал :))

   uncknow

35 — 19.06.12 — 17:08

(33) Интересно, в процедуре ПередЗаписьюНаСервере получится сделать?

   mistеr

36 — 19.06.12 — 17:10

(34) Тогда задачу поставьте внятно.

(33) В курсе, что это меняет? Если бы это устраивало ТС, «тему бы не открывал».

   mistеr

37 — 19.06.12 — 17:13

(34) Вопрос в лоб: зачем документу копия уже имеющегося реквизита?

   uncknow

38 — 19.06.12 — 17:13

(36) Да куда уж внятнее :)

   uncknow

39 — 19.06.12 — 17:14

(37) В реквизите документа должна быть ссылка на сам документ

   fisher

40 — 19.06.12 — 17:14

(35) Вообще-то, в любой момент получится.

   uncknow

41 — 19.06.12 — 17:14

(17) А можно поподробнее?

   uncknow

42 — 19.06.12 — 17:15

(40) В любой момент придется гонять форму в объект и обратно. А ПриЗаписиНаСервере уже есть объект.

   mistеr

43 — 19.06.12 — 17:16

(39) «Так начальник сказал»?

   fisher

44 — 19.06.12 — 17:18

(42) ПриЗаписиНаСервере отлично подходит под «любой момент». И это не единственное событие, где есть объект.

Но все-таки ты расскажи, зачем тебе дублировать функционал системного поля «Ссылка»? Или в чем отличие?

   uncknow

45 — 19.06.12 — 17:22

(44)  Да чтож вы все к постановке задачи цепляетесь :))

Торговля, регистр сведений взаиморасчеты, документ расчетов.  Убыл, позже буду. Может кто что подробнее расскажет, так как за Управляемый Интерфейс взялся недавно. С Уважением… :)

   fisher

46 — 19.06.12 — 17:35

(45) Я цепляюсь, потому что хочу вернуть взорванные мозги на место (вот не могу сообразить нафига это надо, хоть ты тресни). Что рассказывать подробнее — непонятно. Уже вроде все вдоль и поперек проехали несколько раз.

   Smallrat

47 — 19.06.12 — 18:37

(46) вот например договора, которые вводятся на основании друг-друга (доп. соглашения). У договоров есть реквизит ОсновнойДоговор — который обозначает начало цепочки. При запросах часть данных берется из основного договора — соответственно, чтобы не мучаться, у основного договора реквизит ОсновнойДоговор заполнен им самим. Также очень просто выбирать всю цепочку разом — все документы, у которых ОсновнойДоговор = основному договору документа.

   Infsams654

48 — 19.06.12 — 19:12

(47) — с этим-то все понятно (При запросах … данных берется из уже записанных объектов), непонятно для чего нужен реквизит — ссылка незаписанного документа.

   Smallrat

49 — 19.06.12 — 19:19

(48) сложно сказать ) я знаю что бывает затык как поставить при записи ссылку на сам, еще не записанный, документ — подумал что у ТС проблемы с этим и притащил решение в (16).

   mistеr

50 — 19.06.12 — 19:52

(47) Чтобы не мучаться?

ГДЕ ОсновнойДоговор = &ОсновнойДоговор ИЛИ Ссылка = &ОсновнойДоговор

Это мучение?

   Smallrat

51 — 19.06.12 — 20:31

(50) есть еще интерактивные отборы в формах списка и т.д.

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

   yukon

52 — 19.06.12 — 20:44

Управляемое/неуправляемое — да какая разница?

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

   СсылкаНового = Документы.Документ.ПолучитьСсылку(Новый УникальныйИдентификатор());

   УстановитьСсылкуНового(СсылкаНового);

   ДокументОснование = СсылкаНового;

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

   mistеr

53 — 19.06.12 — 21:26

(51) Логично, если *так* решил разработчик. От смысла «цепочки» зависит. В примере с договорами, *для меня* не логично, что основной договор является доп. соглашением к самому себе. :)

   chaplin-che

54 — 19.06.12 — 21:44

Да бред какой-то, если просто подумать логически «зачем нужна ссылка, которой в базе еще нет» она ни на что не влияет, нигде не учавствует. Если надо что-то доделать — доделываем в момент записи, когда ссылка уже есть.

   Defender aka LINN

55 — 19.06.12 — 21:59

(18) Для этого вообще-то ПередЗаписьюНаСервере есть

   experimentator76

56 — 19.06.12 — 22:29

(54) бывает что ссылка нужна УЖЕ, а сам объект в базу будет записан позже

вообще все записи надо делать один раз и в конце обработки

так надо…

   chaplin-che

57 — 21.06.12 — 20:01

(56) Не бывает такого, что объекту самому нужна ссылка о самом себе перед записью. Есть пример?

   EvgeniuXP

58 — 21.06.12 — 20:18

(0) копай ПолучитьУникальный UID, его же и записывай.

   EvgeniuXP

59 — 21.06.12 — 20:20

(57) но бывают случаи, когда нужно создать другой объект и ссылаясь на этот, который еще не записан.

UID вам в помощь.

   chaplin-che

60 — 21.06.12 — 20:33

(59) А если этот, основной будет не записан в итоге? Т.е. получается запись будет единовременной, согласны? А раз так, опять говорю, что ссылка не нужна логически, с этим не поспорить.

   Defender aka LINN

61 — 21.06.12 — 22:50

(57) Справочники «номенклатура» и «Контрагенты» в УТ

  

IamAlexy

62 — 21.06.12 — 23:01

(57) контрагенты в любой типовой..

реквизит «головной контрагент»

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

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

В моей учебной конфигурации имеется несколько справочников.

Справочники 1С

Реализуем, чтобы у справочников Товары, Контрагенты и Склады появился одинаковый реквизит Описание (тип строка (250)). Мы можем, добавить этот реквизит в каждый справочник отдельно, а можем, создать общий реквизит, и в его составе указать, что он применим только к этим справочникам.

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

Ветка Общие реквизиты

После этого новый реквизит будет создан, и справа откроется палитра свойств этого реквизита, где мы поменяли название, синоним, тип реквизита оставили Строка, а длину этой строки установили 250.

Свойства общего реквизита

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

Свойство состав общего реквизита

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

 Свойство автоиспользование общего реквизита

У нашего реквизита в данном свойстве установлено значение Не использовать, значит у всех объектов,
для которых в колонке Использование
установлено значение Автоматически,
данный реквизит не будет использоваться. 
И нам нужно вручную указать, у каких объектов этот реквизит применяется.
Мы планировали это делать для трех справочников: Товары, Контрагенты и Склады.

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

Включаем использование общего реквизита

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

Используемые объекты

Можно на этой форме добавить объект в используемые по другому. У колонки Использование соответствующего объекта вызвать меню строки, в котором выбрать нужное значение (в нашем случае Использовать).

Включаем использование общего реквизита

Включим оставшийся объект.

Описание общих реквизитов

Замечу, что такая настройка справедлива, когда мы в свойство  Автоиспользование общего реквизита установили значение Не использовать.

Рекомендую всегда устанавливать данное значение в это свойство!

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

Использование общего реквизита

Применение общих реквизитов

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

Справочник Склады

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

Общий реквизит на форме справочника

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

Список реквизитов при создании формы

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

Общий реквизит на управляемой форме

Перетащим этот реквизит на форму.

Общий реквизит на управляемой форме

И он появится на управляемой форме как обычный реквизит.

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

НовыйСклад = Справочники.Склады.СоздатьЭлемент();
НовыйСклад.Наименование = "Склада № 2";
НовыйСклад.Описание = "Для хранения запчастей";
НовыйСклад.Записать();

После выполнения этого кода общий реквизит Описание будет заполнен.  

Общий реквизит на управляемой форме

Точно также, мы можем обратиться к этому реквизиту в запросе напрямую, как к простому реквизиту объекта.

Общий реквизит в конструкторе запроса

Остальные статьи по теме конфигурирования:

Документы в 1С 8.3

Справочники в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Журнал документов в 1С 8.3

Табличные части объектов 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

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

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Общие сведения

Документ — одно из основных понятий системы «1С:Предприятие». При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также её просмотр и, если необходимо, корректировка.

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

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

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

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

Многострочная (табличная) часть документа представляет собой список однотипных строк, и реквизиты табличной части принадлежат строкам документа. Поэтому каждая строка содержит свои собственные значения этих реквизитов.

Рассмотрим основные моменты работы с объектами типа "Документ":

  • Контекст работы с документами
  • Позиция документа
  • Атрибуты документов
  • Методы документов
  • Методы контекста модуля формы документа
  • Методы контекста модуля документа
  • Предопределённые процедуры модуля формы документа
  • Предопределённые процедуры модуля документа
  • Предопределённые процедуры глобального модуля

Контекст работы с документами

В синтаксисе языка доступ к атрибутам и вызов методов документов зависит от контекста выполнения программного модуля. Если конкретный документ входит (согласно локального контекста) в набор непосредственно доступных модулю значений агрегатных типов данных, то доступ к атрибуту, вызов метода для этого документа – просто имя этого атрибута, метода с указанием необходимых параметров.

Например, в форме редактирования документа «Накладная» мы имеем непосредственный доступ к текущему документу, а значит, чтобы изменить некоторые его реквизиты, можем записать следующие операторы присваивания:

НомерДок = "0000000023";
МестоХранения = Константа.ОсновнойСклад;

Если значение документа получено и из других источников, например, как значение реквизита текущего документа, обращение к атрибутам и методам связанного документа представляет собой сложное выражение, где имена реквизитов перечисляются через точку. Например, если у текущего документа «СчетФактура» есть реквизит ДокументОснование, получить номер накладной, на основании которой был создан счет-фактура, можно следующим образом:

Если ДокументОснование.Выбран() = 1 Тогда
   НомерНакл = ДокументОснование.НомерДок;
КонецЕсли;

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

При создании переменной со ссылкой на объект типа "Документ" в качестве параметра функции СоздатьОбъект() передаётся полное имя вида документа, состоящее из идентификатора вида документа, записанного через точку после ключевого слова «Документ» (англоязычный синоним — «Document»).

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

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

Спр = СоздатьОбъект("Справочник.Договоры");
Спр.ИспользоватьВладельца(Владелец);
Док = СоздатьОбъект("Документ");
Док.ВыбратьПоЗначению(,,"Контрагент",Владелец);
Пока Док.ПолучитьДокумент() = 1 Цикл
   
   Если Док.Вид() = "Счет" Тогда
      . . .
   КонецЕсли;
КонецЦикла;

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

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

Позиция документа

Все документы в системе «1С:Предприятие» располагаются на временной оси. Основными характеристиками расположения документа на временной оси являются дата и время документа. Дата документа доступна через атрибут ДатаДок, а работа со временем документа может осуществляться при помощи методов УстановитьВремя(), ПолучитьВремя(), а также предопределённой процедуры ПриИзмененииВремениДокумента().

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

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

Системные функции для работы с позицией документа

Кроме методов объекта "Документ", о которых речь пойдёт позже, для работы с позицией документа в системе «1С:Предприятие» предусмотрены две системных функции: РазобратьПозициюДокумента() и СформироватьПозициюДокумента().

Разложить позицию документа на составляющие и получить её строковое представление позволяет системная функция РазобратьПозициюДокумента() (англоязычный синоним — SplitDocPosition). Возвращаемым значением функции будет строка вида "12.07.98 12:57:14 ПрихНакл 24".

Синтаксис функции:

РазобратьПозициюДокумента(<Позиция>, <Дата>, <Ч>, <М>, <С>, <Док>)

где

  • <Позиция> — значение позиции документа, которое необходимо разложить;
  • <Дата> — необязательный параметр. Имя переменной, куда система вернёт значение даты позиции документа;
  • <Ч> — необязательный параметр. Имя переменной, куда система вернёт числовое значение часа позиции документа;
  • <М> — необязательный параметр. Имя переменной, куда система вернёт числовое значение минуты позиции документа;
  • <С> — необязательный параметр. Имя переменной, куда система вернёт числовое значение секунды позиции документа;
  • <Док> — необязательный параметр. Имя переменной, куда система вернёт значение документа, находящегося в данной позиции.

Пример использования функции:

Позиция = РазобратьПозициюДокумента(ВыбДокумент.ПолучитьПозицию());

Сформировать позицию документа согласно переданным параметрам позволяет системная функция СформироватьПозициюДокумента() (англоязычный синоним — MakeDocPosition). Возвращаемым значением функции является строковое значение — сформированная позиция документа.

У функции предусмотрено два синтаксиса:


СформироватьПозициюДокумента(<Докум>, <ФлагСмещения>)



СформироватьПозициюДокумента(<Дата>, <Час>, <Мин>, <Сек>, <КонецСекунды>)

где

  • <Докум> — значение документа, позиция которого определяется, или сама позиция;
  • <ФлагСмещения> — необязательный параметр. Число: −1 (минус единица) — предыдущая позиция; 1 —следующая позиция; 0 — текущая позиция (значение по умолчанию). Использование данного параметра позволяет получить предыдущую или последующую позицию от уже имеющейся позиции;
  • <Дата> — значение типа "Дата", на которую формируется позиция документа;
  • <Час> – значение типа "Число", которое определяет час, на который формируется позиция документа;
  • <Мин> — значение типа "Число", которое определяет минуту, на которую формируется позиция документа;
  • <Сек> — значение типа "Число", которое определяет секунду, на которую формируется позиция документа;
  • <КонецСекунды> — необязательный параметр. Число: 1 — позиция будет браться от следующей секунды; 0 — позиция от указанной секунды (значение по умолчанию).

Пример использования функции:

Если Выбран() = 1 Тогда
   ЭтотДокумент = СформироватьПозициюДокумента(ТекущийДокумент(), -1);
Иначе
   ЭтотДокумент = ДатаДок;
КонецЕсли;

Атрибуты документов

Получить или задать значение номера выбранного документа позволяет атрибут НомерДок (англоязычный синоним — DocNum).

Пример использования:

Основание = Вид() + " № " + СокрП(НомерДок) + " от " + ДатаДок;

Получить или задать значение даты выбранного документа позволяет атрибут ДатаДок (англоязычный синоним — DocDate).

Пример использования:

Процедура ВводНового()
   ДатаДок = РабочаяДата();
КонецПроцедуры

Задать или получить значение реквизита текущего документа позволяет атрибут <ИмяРеквизита>. В тексте программного модуля в качестве имени реквизита используется идентификатор конкретного реквизита.

Реквизиты документа

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

Пример использования атрибутов:

Процедура ВводНового(Копирование)
   Если Копирование = 1 Тогда
      Возврат;
   КонецЕсли;
   Валюта = глЗначениеПоУмолчанию("ОсновнаяВалюта");
   ТипОстатка = 1;
   Получено1 = "из кассы";
КонецПроцедуры

Получить или задать числовое значение номера текущей строки многострочной части выбранного документа позволяет атрибут НомерСтроки (англоязычный синоним — LineNum). Данный атрибут имеет смысл только при выбранной строке. Присвоение строке нового номера передвигает строку в многострочной части документа.

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Обращаться к атрибутам и методам операции документа позволяет атрибут Операция (англоязычный синоним — Operation). Данный атрибут может использоваться только в том случае, если установлена компонента «Бухгалтерский учет» и только для тех видов документов, для которых в конфигурации установлен признак «Бухгалтерский учет».

Пример использования:

Процедура ПриЗаписи()
   Операция.Содержание = "Износ за " + Формат(ДатаДок, "Д ММММГГТГ");
КонецПроцедуры

Методы документов

Общие методы

Получить название (идентификатор) вида документа позволяет метод Вид() (англоязычный синоним — Kind()). Параметры у метода отсутствуют. Возвращаемым значением будет строка — идентификатор вида документа.

Пример использования:

Если (Док.Вид()="ДоплатаПроцентом") ИЛИ (Док.Вид()="ДоплатаСуммой") Тогда
   Сотр = Док.Сотрудник;
Иначе
   Предупреждение("Это не доплата!");
КонецЕсли;

Получить представление вида документа, как оно задано в Конфигураторе, позволяет метод ПредставлениеВида() (англоязычный синоним — KindPresent()). Параметры у метода отсутствуют. Возвращаемым значением метода является строковое значение, содержащее пользовательское представление вида документа (синоним документа или, если он не указан, то идентификатор).

Пример использования:

Состояние(ВыбДокум.ПредставлениеВида());

Методы для создания, проведения и удаления документов

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

Пример использования:

Док = СоздатьОбъект("Документ.ДанныеПереданныеВПФР");
Док.Новый();
Док.ДатаДок = РабочаяДата();
Док.ОтчетныйПериод = ОтчетныйПериод;

Выполнить запись в базу данных текущего нового или изменённого документа позволяет метод Записать() (англоязычный синоним — Write()). Параметры у метода отсутствуют.

Примечание: Если метод Записать() применяется в Модуле формы документа непосредственно к документу локального контекста, то отрабатываются те же действия, как и при интерактивном нажатии пользователем кнопки с формулой "#Записать".

Пример использования метода:

Док = СоздатьОбъект("Документ.Заказ");
Док.АвтоВремяТекущее();
Док.Новый();
Док.УстановитьНовыйНомер("Прг-");
Док.Клиент = Константа.ОсновнойКлиент;
Док.Количество = 5;
Док.Записать();
Док.Провести(1, "Программно");

Удалить или пометить на удаление текущий документ позволяет метод Удалить() (англоязычный синоним — Delete()). Метод может использоваться только для объектов, созданных с помощью функции СоздатьОбъект(). Его разрешено применять только для тех документов, которые либо не проведены, либо лежат за точкой ТА, то есть предполагается, что ТА предварительно интерактивно сдвинули назад.

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

Синтаксис:

Удалить(<Режим>)

где <Режим> — числовое выражение. Возможные значения: 1 — непосредственное удаление; 0 — пометка на удаление. Параметр является необязательным. Значение по умолчанию — 1.

Пример использования:

Док = СоздатьОбъект("Документ.Приказы");
Если Док.Выбрать("Найди документ") > 0 Тогда
   
   Док.Удалить(1);
КонецЕсли;

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

Пример использования:

Процедура Восстановление(Объект)
   Док = СоздатьОбъект("Документ");
   Если Объект.Выбран() > 0 Тогда
      Док.НайтиДокумент(Объект);
      Если Док.Выбран() > 0 Тогда
         Если Док.ПометкаУдаления() = 1 Тогда
            
            Док.СнятьПометкуУдаления();
         КонецЕсли;
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Запустить процедуру проведения документа позволяет метод Провести() (англоязычный синоним — MakeActions()). Возвращаемым значением метода является число 1, если проведение документа завершено успешно, или 0, если проведение документа не выполнено. Возвращаемое значение метода можно использовать, например, в качестве условия принятия решения при завершении обработки транзакции.

Синтаксис метода:

Провести(<Режим>, <3нач>)

где

  • <Режим> — числовое выражение. Возможные значения: 0 — проводить документ без сдвига ТА; 1 — проводить непроведённый документ реальным временем (со сдвигом ТА); 2 — перепроводить проведённый документ реальным временем (со сдвигом ТА); 3 — проводить любой (непроведённый, проведённый) документ реальным временем (со сдвигом ТА). Параметр является необязательным. Значение по умолчанию — 0;
  • <3нач> — выражение произвольного типа. Значение данного параметра будет передано системой в качестве параметра при запуске предопределённой процедуры ОбработкаПроведения(). Использовать данное значение можно, например, для того, чтобы в процедуре ОбработкаПроведения() правильно отработать режим проведения, так как это программный, а не интерактивный и не групповой способ проведения. Параметр является необязательным. По умолчанию передаётся пустое значение.

Примечание: Параметр <Режим> устанавливает режим проведения документа после ТА. Этот параметр относится к случаю проведения документа в пределах даты, в которой находится ТА. Дело в том, что при записи документа, документ кроме даты получает ещё и время документа. В многопользовательском режиме часто возникает ситуация, когда в момент проведения документа, он уже оказывается не последним в потоке проводимых документов (провели документ с другого рабочего места), в этом случае система «1С:Предприятие» даёт на выбор два варианта проведения:

  • провести документ тем временем, каким он был записан, то есть фактически задним временем (до ТА);
  • изменить время документа в рамках текущей даты, чтобы документ стал самым последним и проводился в потоке, то есть в ТА.

Пример использования:

Док = СоздатьОбъект("Документ.Заказ");
Док.АвтоВремяТекущее();
Док.Новый();
Док.УстановитьНовыйНомер("Прг-");
Док.Клиент = Константа.ОсновнойКлиент;
Док.Количество = 5;
Док.Записать();
Док.Провести(1, "Программно");

Примечание: Метод Провести() нельзя использовать в теле предопределённой процедуры модуля документа ОбработкаПроведения()!

Если метод применяется в Модуле формы документа непосредственно к документу локального контекста, то он отрабатывает те же действия, как интерактивное нажатие пользователем кнопки с формулой "#Провести". В этом случае, если параметр <Режим> опущен, то документ проводится в режиме, соответствующем установкам системы (меню «Сервис -> Параметры»).

Параметры системы

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

Пример использования:

Док = СоздатьОбъект("Документ.Заказ");
Док.НайтиДокумент(Объект);
Док.СделатьНеПроведенным();

Методы для поиска и выбора конкретного документа

Выполнить поиск документа по значению, заданному в параметре, позволяет метод НайтиДокумент() (англоязычный синоним — FindDocument()). Данный метод используется для позиционирования объекта, созданного при помощи функции СоздатьОбъект(), на конкретный документ. Возвращаемым значением метода является число 1, если действие выполнено (документ найден), или
0, если действие не выполнено.

Синтаксис метода:

НайтиДокумент(<Документ>)

где <Документ> — выражение, содержащее значение типа "Документ".

Пример использования:

Процедура УдалитьДокумент(Объект)
   Док = СоздатьОбъект("Документ.ПрихНакл");
   
   Док.НайтиДокумент(Объект);
   Если Док.Выбран() > 0 Тогда
      
      Док.Удалить();
   Иначе
      Предупреждение("Неверно задан документ!");
   КонецЕсли;
КонецПроцедуры

Выполнить поиск документа по номеру, указанному в параметре, позволяет метод НайтиПоНомеру() (англоязычный синоним — FindByNum()). Данный метод используется для позиционирования объекта, созданного при помощи функции СоздатьОбъект(), на конкретный документ. Возвращаемым значением метода является число 1, если действие выполнено (документ найден), или
0, если действие не выполнено.

Синтаксис метода:

НайтиПоНомеру(<Номер>, <Дата>, <ИдентВида>)

где

  • <Номер> — строковое выражение, содержащее значение номера искомого документа;
  • <Дата> — выражение типа "Дата", определяющее диапазона, в котором нужно искать документ с данным номером. Поиск зависит от выбранного в Конфигураторе способа уникальности номеров (по месяцу, году и др.);
  • <ИдентВида> — строковое выражение, содержащее идентификатор вида документа или идентификатор нумератора. Параметр является необязательным и используется только для объекта "Документ" общего вида.

Пример использования:

Если ВвестиЧисло(Ном, "Введите номер приказа", 5, 0) = 1 Тогда
   Док = СоздатьОбъект("Документ.ПриказыУвольнения");
   
   Док.НайтиПоНомеру(Строка(Ном), Дата(0));
   Если Док.Выбран() = 1 Тогда
      Документ = Док.ТекущийДокумент();
       . . .
   КонецЕсли;
КонецЕсли;

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

Синтаксис метода:

Выбрать(<Подсказка>, <ФормаЖурнала>, <КомуПодч>)

где

  • <Подсказка> — текст заголовка окна диалога ввода. Может использоваться в качестве подсказки конечному пользователю;
  • <ФормаЖурнала> — строковое выражение, содержащее идентификатор той формы журнала документов, которая должна использоваться для выбора. Если это значение пустое, то используется форма журнала по умолчанию. Указывать имя журнала можно в следующем виде:
    • "Журнал.ХХХХ", где ХХХХ — имя вида соответствующего объекта;
    • "Журнал.Подчиненные";
    • "ЖурналОпераций";
    • "ЖурналОпераций.YYYY", где YYYY — имя формы журнала операций, как оно задано в Конфигураторе;
  • <КомуПодч> — необязательный параметр. Используется при открытии выбора по журналу подчинённых документов, то есть когда 2-ой параметр имеет значение "Журнал.Подчиненные". В данном случае в этом параметре передаётся документ-владелец, по которому следует построить журнал подчинённых документов.

Пример использования метода:

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

Если Док.Выбрать("Найди документ") > 0 Тогда
   
   Док.Удалить();
КонецЕсли;

Вид вызываемого диалогового окна:

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

Проверить факт выбора (позиционирования) объекта типа "Документ" позволяет метод Выбран() (англоязычный синоним — Selected()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если документ выбран, или 0, если документ не выбран.

Пример использования:

Док = СоздатьОбъект("Документ.ПрихНакл");

Док.НайтиПоНомеру("1", 0);
Если Док.Выбран() = 1 Тогда
   
   Док.ВыбратьСтроки();
   Пока Док.ПолучитьСтроку() = 1 Цикл
      Док.УдалитьСтроку();
   КонецЦикла;
КонецЕсли;

Методы для циклической обработки документов

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

Синтаксис метода:

ВыбратьДокументы(<НачалоВыборки>, <КонецВыборки>)

где

  • <НачалоВыборки> — выражение типа "Дата", документ или позиция документа, с которого устанавливается начало выборки документов. Параметр является необязательным. Если параметр опущен, то выборка начинается с самого первого существующего в системе документа;
  • <КонецВыборки> — выражение типа "Дата", документ или позиция документа, на котором устанавливается конец выборки документов. Параметр является необязательным. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом.

Пример использования:

Если Режим = "Подробный" Тогда
   Док = СоздатьОбъект("Документ");
   
   Док.ВыбратьДокументы(ДатаНачало, ДатаКонец);
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      ТекДок = Док.ТекущийДокумент();
      . . .
   КонецЦикла;
КонецЕсли;

Открыть выборку всех документов, подчинённых заданному документу, в указанном интервале позволяет метод ВыбратьПодчиненныеДокументы() (англоязычный синоним — SelectChildDocs()). Возвращаемым значением метода является число 1, если действие выполнено и в выборке есть хотя бы один документ, или 0, если действие не выполнено или в выборке нет ни одного документа. Непосредственно сама выборка осуществляется при помощи метода ПолучитьДокумент() в порядке возрастания даты и времени записи документов (если не используется метод ОбратныйПорядок()).

Синтаксис метода:

ВыбратьПодчиненныеДокументы(<НачалоВыборки>, <КонецВыборки>, <ДокВлад>)

где

  • <НачалоВыборки> — выражение типа "Дата", документ или позиция документа, с которого устанавливается начало выборки документов. Параметр является необязательным. Если параметр опущен, то выборка начинается с самого первого существующего в системе документа;
  • <КонецВыборки> — выражение типа "Дата", документ или позиция документа, на котором устанавливается конец выборки документов. Параметр является необязательным. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом;
  • <ДокВлад> — выражение типа "Документ", содержащее значение документа-владельца, подчинённые которому будут включаться в выборку.

Пример использования:

ДокТест = СоздатьОбъект("Документ");

ДокТест.ВыбратьПодчиненныеДокументы('01.01.80', '31.12.99', ПоСчету);

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

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

Синтаксис метода:

ВыбратьПоЗначению(<НачалоВыборки>, <КонецВыборки>, <ИмяОтбора>, <3нач>)

где

  • <НачалоВыборки> — выражение типа "Дата", документ или позиция документа, с которого устанавливается начало выборки документов. Параметр является необязательным. Если параметр опущен, то выборка начинается с самого первого существующего в системе документа;
  • <КонецВыборки> — выражение типа "Дата", документ или позиция документа, на котором устанавливается конец выборки документов. Параметр является необязательным. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом;
  • <ИмяОтбора> — строковое выражение, которое содержит либо название общего реквизита документов, либо название графы отбора журналов, как они заданы в Конфигураторе;
  • <3нач> — значение отбора, по которому строится выборка документов.

Пример использования:

Если Режим = "Подробный" Тогда
   Док = СоздатьОбъект("Документ");
   
   Док.ВыбратьПоЗначению(ДатаНачало, ДатаКонец, "Автор", "Сидоров");
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      ТекДок = Док.ТекущийДокумент();
       . . .
   КонецЦикла;
КонецЕсли;

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

Синтаксис метода:

ВыбратьПоНомеру(<Номер>, <Дата>, <ИдентВида>)

где

  • <Номер> — строковое выражение, содержащее значение номера искомых документов;
  • <Дата> — выражение типа "Дата", определяющее диапазона, в котором нужно искать документ с данным номером. Поиск зависит от выбранного в Конфигураторе способа уникальности номеров (по месяцу, году и др.);
  • <ИдентВида> — строковое выражение, содержащее идентификатор вида документа или идентификатор нумератора. Параметр является необязательным и используется только для объектов "Документ" общего вида.

Пример использования:

Если Режим = "Подробный" Тогда
   
   Док.ВыбратьПоНомеру("Ав-0005", '01.01.98', "АктПереоценки");
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      ТекДок = Док.ТекущийДокумент();
       . . .
   КонецЦикла;
КонецЕсли;

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

Синтаксис метода:

ВыбратьПоПоследовательности(<НачПериода>, <КонПериода>, <Послед>)

где

  • <НачПериода> — выражение типа "Дата", документ или позиция документа, с которого устанавливается начало выборки документов. Параметр является необязательным. Если данный параметр опущен, то выборка начинается с самого первого существующего в системе документа;
  • <КонПериода> — выражение типа "Дата", документ или позиция документа, на котором устанавливается конец выборки документов. Параметр является необязательным. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом;
  • <Послед> — строковое выражение, содержащее идентификатор используемой последовательности.

Пример использования:

Если Режим = "Подробный" Тогда
   
   Док.ВыбратьПоПоследовательности(НачД, ПолучитьДокументТА(), "Упр");
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      ТекДок = Док.ТекущийДокумент();
       . . .
   КонецЦикла;
КонецЕсли;

Выбрать следующий документ в последовательности выборки, открытой при помощи метода ВыбратьДокументы() или ему подобных, позволяет метод ПолучитьДокумент() (англоязычный синоним — GetDocument()). Возвращаемым значением метода является числовое значение: 1 — если следующий документ выбран успешно; 0 — если документ не найден (достигнут конец выборки). Параметры у метода отсутствуют.

Пример использования:

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

Док.ВыбратьДокументы(ДатаНачала, ДатаОкончания);

Пока Док.ПолучитьДокумент() > 0 Цикл
   
   ТекДок = Док.ТекущийДокумент();
    . . .
КонецЦикла;

Получить значение позиционированного текущего документа (в целом, как объекта) позволяет метод ТекущийДокумент() (англоязычный синоним — CurrentDocument()). Данный метод применяется, например, если нужно документ передать как параметр в вызове какого-либо метода или присвоить какому-либо реквизиту. Параметры у метода отсутствуют.

Пример использования:

Если Режим = "Подробный" Тогда
   Док = СоздатьОбъект("Документ");
   
   Док.ВыбратьДокументы(ДатаНачало, ДатаКонец);
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      ТекДок = Док.ТекущийДокумент();
      . . .
   КонецЦикла;
КонецЕсли;

Методы управления выбором документов

Установить выбираемые виды для объекта-документа неопределённого вида позволяет метод ВидыДляВыбора() (англоязычный синоним — KindsForChoice()). Данный метод обычно используется до начала позиционирования документа, например, при помощи метода Выбрать(). Возвращаемым значением метода является строковое значение, содержащее текущий (на момент до исполнения метода) список видов выбираемых документов, разделённых запятыми.

Данный метод может использоваться только для объектов типа "Документ" неопределённого вида — либо созданных функцией СоздатьОбъект(), либо определённых в Конфигураторе как реквизиты диалога или другого объекта. Если метод ВидыДляВыбора() применён к реквизиту диалога типа "Документ" неопределённого вида, то интерактивный выбор будет производиться только среди установленных видов документов.

Синтаксис метода:

ВидыДляВыбора(<СписокВидов>)

где <СписокВидов> — строковое выражение содержащее список видов выбираемых документов, разделённых запятыми. Параметр является необязательным.

Пример использования:

Процедура УстДокОснование()
   
   Док = СоздатьОбъект("Документ");
   Док.ВидыДляВыбора("РасходнаяНакл, Счет");
   
   Если Док.Выбрать("Выберите документ-основание", "") > 0 Тогда
      НаОсновании = Док.ТекущийЭлемент();
   КонецЕсли;
КонецПроцедуры

Установить порядок выборки документов позволяет метод ОбратныйПорядок() (англоязычный синоним — BackwardOrder()). Метод может использоваться только для объектов, созданных при помощи функции СоздатьОбъект(). Возвращаемым значением метода является текущее значение порядка выборки документов (на момент до его исполнения): 1 — обратный порядок выборки; 0 — выборка документов в порядке возрастания даты и времени записи документов.

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

Синтаксис:

ОбратныйПорядок(<Режим>)

где <Режим> — числовое выражение. Возможные значения: 1 — выбирать документы в обратном порядке даты и времени; 0 — выбирать документы в порядке возрастания даты и времени. Параметр является необязательным. Значение по умолчанию — 1.

Пример использования:

Если Режим = "Подробный" Тогда
   Док = СоздатьОбъект("Документ");
   
   Док.ОбратныйПорядок(1);
   
   Док.ВыбратьДокументы(ДатаНачало, ДатаКонец);
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      ТекДок = Док.ТекущийДокумент();
      . . .
   КонецЦикла;
КонецЕсли;

Установить фильтр выборки документов позволяет метод УстановитьФильтр() (англоязычный синоним — SetFilter()). Метод может использоваться только для объектов, созданных функцией СоздатьОбъект(), и обычно вызывается до вызова метода ВыбратьДокументы() и ему подобных.

Синтаксис метода:

УстановитьФильтр(<Проведенные>, <НеПроведенные>,
                 <НеИмеющиеПризнаковУчета>,
                 <Опер>, <Расч>, <Бухг>)

где

  • <Проведенные> — числовое выражение. Возможные значения: 0 — не включать в выборку проведённые документы; 1 — включать;
  • <НеПроведенные> — числовое выражение. Возможные значения: 0 — не включать в выборку непроведённые документы; 1 — включать;
  • <НеИмеющиеПризнаковУчета> — числовое выражение. Возможные значения: 0 — не включать в выборку документы, не имеющие признаков учёта; 1 — включать;
  • <Опер> — числовое выражение. Возможные значения: 0 — не включать в выборку оперативные документы; 1 — данный флаг не влияет на выборку; 2 — включать;
  • <Расч> — числовое выражение. Возможные значения: 0 – не включать в выборку расчётные документы; 1 — данный флаг не влияет на выборку; 2 — включать;
  • <Бухг> — числовое выражение. Возможные значения: 0 — не включать в выборку бухгалтерские документы; 1 — данный флаг не влияет на выборку; 2 — включать.

Пример использования:

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

Док.УстановитьФильтр(1, 0, 0, 1, 0, 0);

Док.ВыбратьДокументы(ДатаНачало, ДатаКонец);

Пока Док.ПолучитьДокумент() > 0 Цикл
   ТекДок = Док.ТекущийДокумент();
    . . .
КонецЦикла;

Производить выбор документов, принадлежащих конкретному журналу, либо обеспечить доступ к значениям граф журнала позволяет метод ИспользоватьЖурнал() (англоязычный синоним — UseJournal()).

Синтаксис метода:

ИспользоватьЖурнал(<Журнал>, <ФлагОгрПросм>)

где

  • <Журнал> — идентификатор журнала, который предполагается использовать для отбора документов и доступа к графам;
  • <ФлагОгрПросм> — необязательный параметр. Число: 1 — если выборка ограничивается документами, входящими в указанный журнал; 0 — если метод используется только для использования граф методом Графа(). Значение по умолчанию — 1.

Пример использования:

Док = СоздатьОбъект("Документ");
Док.ИспользоватьЖурнал("Общий", 0);
Док.ВыбратьДокументы(Дата1, Дата2);
Пока Док.ПолучитьДокумент() = 1 Цикл
    . . .
КонецЦикла;

Методы для получения информации о документе

Проверить факт проведения документа позволяет метод Проведен() (англоязычный синоним — IsTransacted()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если документ проведён, или 0, если документ не проведён.

Пример использования:

Процедура ПолучитьПроведенные()
   Док = СоздатьОбъект("Документ");
   
   Док.ВыбратьДокументы(ДатаНачала, ДатаКонца);
   
   Пока Док.ПолучитьДокумент() > 0 Цикл
      Если Док.Проведен() > 0 Тогда
         Сообщить(Строка(Док.Вид()) + " № " + Док.НомерДок + 
                  " от " + Док.ДатаДок);
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Получить или установить признак существования операции у документа позволяет метод СуществуетОперация() (англоязычный синоним — OperExist()). Возвращаемым значением метода является число 1, если у документа существует операция, или 0, если у документа не существует операции.

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

Синтаксис метода:

СуществуетОперация(<Признак>)

где <Признак> — числовое выражение. Возможные значения: 1 — установить признак существования операции, 0 — не устанавливать признак существования операции.

Пример использования:

Процедура ПриЗаписи()
   
   Если Склад = Константа.ОснСклад Тогда
      СуществуетОперация(1);
   Иначе
      СуществуетОперация(0);
   КонецЕсли;
КонецПроцедуры

Проверить наличие пометки удаления у документа позволяет метод ПометкаУдаления() (англоязычный синоним — DeleteMark()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если на документе стоит пометка удаления, или 0, если пометка удаления отсутствует.

Пример использования:

Процедура ПометитьНаУдаление(Объект)
   Док = СоздатьОбъект("Документ");
   Если Объект.Выбран() > 0 Тогда
      Док.НайтиДокумент(Объект);
      Если Док.Выбран() > 0 Тогда
         Если Вопрос("Удалять?", 1) = 1 Тогда
            Если Док.ПометкаУдаления() = 1 Тогда
               Предупреждение("Объект уже помечен на удаление!");
            Иначе
               
               Док.Удалить(0);
            КонецЕсли;
         КонецЕсли;
      Иначе
         Предупреждение("Не выбран объект!");
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Получить значение указанной графы журнала для текущего документа позволяет метод Графа() (англоязычный синоним — Column()). Данный метод работает только в том случае, если ранее был применён метод ИспользоватьЖурнал().

Синтаксис метода:

Графа(<Графа>)

где <Графа> — идентификатор графы журнала, заданного методом ИспользоватьЖурнал().

Пример использования:

Док = СоздатьОбъект("Документ.ПрихНакл");
Док.ИспользоватьЖурнал("Приходные", 0);
Док.НайтиДокумент(ВыбДок);
Цена = Док.Графа("Цена");

Получить признак установленного режима блокировки или установить/снять данный режим позволяет метод Блокировка() (англоязычный синоним — Locking()). Возвращаемым значением метода при отсутствующем параметре является текущее значение блокировки — число 1, если документ заблокирован, или 0, если документ свободен (на момент до выполнения метода). Возвращаемым значением метода при указанном параметре является результат выполнения метода блокировки — число 1, если документ успешно заблокирован, или 0, если заблокировать документ не получилось.

Синтаксис метода:

Блокировка(<ВклВыкл>)

где <ВклВыкл> — необязательный параметр. Число: 1 — включить блокировку; 0 — выключить блокировку.

Пример записи данного метода:

Блокировка(0);

Определить, принадлежит ли документ указанной последовательности, позволяет метод ПринадлежитПоследовательности() (англоязычный синоним — BelongToSequence()). Возвращаемым значением метода является число 1, если документ принадлежит указанной последовательности, или 0, если документ не принадлежит данной последовательности.

Синтаксис метода:

ПринадлежитПоследовательности(<Послед>, <НовоеЗначение>)

где

  • <Послед> — строковое выражение, определяющее последовательность;
  • <НовоеЗначение> — необязательный параметр. Число: 1 — документ принудительно устанавливается как принадлежащий указанной последовательности; 0 — документ принудительно устанавливается как не принадлежащий данной последовательности. Использование этого параметра разрешено только при проведении документа (в Модуле документа).

Пример использования:

Если Док.ПринадлежитПоследовательности("УпрУчет") = 1 Тогда
   Если Последовательность.УпрУчет.Сравнить(Док) = 1 Тогда
      Последовательность.УпрУчет.Установить(Док);
   КонецЕсли;
КонецЕсли;

Методы для работы с позицией и временем документа

Получить позицию документа, представляющую собой 32-х символьное строковое значение, позволяет метод ПолучитьПозицию() (англоязычный синоним — GetPosition()) возвращает. Параметры у метода отсутствуют.

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

Пример записи метода:

ПозицияДокумента = ВыбДокумент.ПолучитьПозицию();

Сверить дату и время документа с датой и временем точки актуальности (ТА) итогов позволяет метод СравнитьТА() (англоязычный синоним — CompareWithAP()). Другими словами, данный метод позволяет определить положение на оси времени момента записи документа по отношению к текущему положению ТА. Параметры у метода отсутствуют. Возвращаемым значением метода является числовое значение:

  • 1 — если дата и время документа больше даты и времени точки актуальности итогов;
  • 0 — если дата и время документа равно дате и времени точки актуальности итогов;
  • −1 (минус единица) — если дата и время документа меньше даты и времени точки актуальности итогов;
  • −2 (минус два) — в случае, если новый документ, который сравнивается с ТА, ещё не записан, то есть он ещё не имеет никакой позиции на оси времени.

Пример использования метода:

Процедура ОбработкаПроведения()
   Если СравнитьТА() > 0 Тогда
      
      ПроводкаДокументаБудущимЧислом();
   ИначеЕсли СравнитьТА() < 0 Тогда
      
      ПроводкаДокументаЗаднимЧислом();
   Иначе
      
      ПроводкаДокумента();
   КонецЕсли;
КонецПроцедуры

Получить время документа позволяет метод ПолучитьВремя() (англоязычный синоним — GetTime()). Метод может использоваться только для объектов, созданных при помощи функции СоздатьОбъект(). Возвращаемым значением метода является значение времени записи документа в формате "ЧЧ.ММ.СС". Кроме того, через параметры метода можно получить раздельно строковые значения часа, минут и секунд времени записи документа.

Синтаксис метода:

ПолучитьВремя(<Час>, <Минуты>, <Секунды>)

где

  • <Час> — идентификатор переменной, в которую метод возвращает строковое значение часа записи документа;
  • <Минуты> — идентификатор переменной, в которую метод возвращает строковое значение минут записи документа;
  • <Секунды> — идентификатор переменной, в которую метод возвращает строковое значение секунд записи документа.

Пример использования:

Функция ВремяДокумента(Док)
   Перем Ч;
   Перем М;
   Перем С;

   Если Док.Выбран() > 0 Тогда
      Док.ПолучитьВремя(Ч, М, С);
      Возврат "Документ записан в "+ Ч + " час " + М + " мин. " + С +" с";
   Иначе
      Возврат "Документ не выбран!";
   КонецЕсли;
Конецфункции

Установить время записи документа в соответствии с заданными параметрами позволяет метод УстановитьВремя() (англоязычный синоним — SetTime()).

Синтаксис метода:

УстановитьВремя(<Час>, <Минуты>, <Секунды>)

где <Час>, <Минуты>, <Секунды> — числовые выражения, определяющие время записи документа.

Пример использования метода:

Процедура УстановитьВремяДокументаЧислом(Док, Сек)
   Перем Ч, М, С;
   Ч = Цел(Сек/3600);
   Сек = Сек - Ч * 3600;
   М = Цел(Сек/60);
   С = Сек - М * 60;
   Док.УстановитьВремя(Ч, М, С);
КонецПроцедуры

Примечание: Если в модуле формы документа используются методы установки признака автоформирования времени или собственно установки времени, то при записи документа диалог запроса времени не вызывается и игнорируются пользовательские установки в параметрах системы.

Установить режим, при котором новому документу автоматически записывается время на начало дня, позволяет метод АвтоВремяНачалоДня() (англоязычный синоним — AutoTimeBegOfDay()). Параметры у метода отсутствуют.

Пример использования:

Док = СоздатьОбъект("Документ.Заказ");
Док.АвтоВремяНачалоДня();
Док.Новый();
Док.УстановитьНовыйНомер("Прг-");
Док.Клиент = Константа.ОсновнойКлиент;
Док.Количество = 5;
Док.Записать();
Док.Провести(1, "Программно");

Примечание: Если в модуле формы документа используются методы установки признака автоформирования времени или собственно установки времени, то при записи документа диалог запроса времени не вызывается и игнорируются пользовательские установки в параметрах системы.

Установить режим, при котором новому документу автоматически записывается время на конец дня, позволяет метод АвтоВремяКонецДня() (англоязычный синоним — AutoTimeEndOfDay()). Параметры у метода отсутствуют.

Пример использования:

Процедура УстВремяДок(Док, Режим)
   Если Режим = "Начало" Тогда
      Док.АвтоВремяНачалоДня();
   ИначеЕсли Режим = "Конец" Тогда
      Док.АвтоВремяКонецДня();
   ИначеЕсли Режим = "Текущее" Тогда
      Док.АвтоВремяТекущее();
   Иначе
      Док.АвтоВремяОтключить();
   КонецЕсли;
КонецПроцедуры

Примечание: Если в модуле формы документа используются методы установки признака автоформирования времени или собственно установки времени, то при записи документа диалог запроса времени не вызывается и игнорируются пользовательские установки в параметрах системы.

Установить режим, при котором новому документу автоматически записывается текущее время, позволяет метод АвтоВремяТекущее() (англоязычный синоним — AutoTimeCurrent()). Параметры у метода отсутствуют.

Пример использования:

Процедура УстВремяДок(Док, Режим)
   Если Режим = "Начало" Тогда
      Док.АвтоВремяНачалоДня();
   ИначеЕсли Режим = "Конец" Тогда
      Док.АвтоВремяКонецДня();
   ИначеЕсли Режим = "Текущее" Тогда
      Док.АвтоВремяТекущее();
   Иначе
      Док.АвтоВремяОтключить();
   КонецЕсли;
КонецПроцедуры

Примечание: Если в модуле формы документа используются методы установки признака автоформирования времени или собственно установки времени, то при записи документа диалог запроса времени не вызывается и игнорируются пользовательские установки в параметрах системы.

Установить режим, при котором в случае совпадения даты документа с датой ТА новому документу записывается время после ТА, позволяет метод АвтоВремяПослеТА() (англоязычный синоним — AutoTimeAfterAP()). Метод работает только при установленной компоненте «Оперативный учет». Параметры у метода отсутствуют.

Пример использования:

Процедура УстВремяДок(Док, Режим)
   Если Режим = "Начало" Тогда
      Док.АвтоВремяНачалоДня();
   ИначеЕсли Режим = "Конец" Тогда
      Док.АвтоВремяКонецДня();
   ИначеЕсли Режим = "Текущее" Тогда
      Док.АвтоВремяТекущее();
   ИначеЕсли Режим = "ПослеТА" Тогда
      Док.АвтоВремяПослеТА();
   Иначе
      Док.АвтоВремяОтключить();
   КонецЕсли;
КонецПроцедуры

Примечание: Если в модуле формы документа используются методы установки признака автоформирования времени или собственно установки времени, то при записи документа диалог запроса времени не вызывается и игнорируются пользовательские установки в параметрах системы.

Отключить режим автоматической установки времени нового документа позволяет метод АвтоВремяОтключить() (англоязычный синоним — AutoTimeOff()). Параметры у метода отсутствуют. После отключения режима автоматической установки времени новые документы будут записываться временем, устанавливаемым методом УстановитьВремя().

Пример использования:

Процедура УстВремяДок(Док, Режим)
   Если Режим = "Начало" Тогда
      Док.АвтоВремяНачалоДня();
   ИначеЕсли Режим = "Конец" Тогда
      Док.АвтоВремяКонецДня();
   ИначеЕсли Режим = "Текущее" Тогда
      Док.АвтоВремяТекущее();
   Иначе
      Док.АвтоВремяОтключить();
   КонецЕсли;
КонецПроцедуры

Примечание: Если в модуле формы документа используются методы установки признака автоформирования времени или собственно установки времени, то при записи документа диалог запроса времени не вызывается и игнорируются пользовательские установки в параметрах системы.

Методы для работы с реквизитами документов

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

Синтаксис:

ПрефиксНомера(<Префикс>)

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

Пример записи метода:

ПрефиксНомера("Сч-");

Установить для документа новый номер с заданным префиксом позволяет метод УстановитьНовыйНомер() (англоязычный синоним — SetNewNum()). Данный метод производит корректное переприсвоение номера документа (с автоинкрементацией и резервированием номера на время ввода).

Синтаксис метода:

УстановитьНовыйНомер(<Префикс>)

где <Префикс> — строковое выражение — префикс номера документа.

Пример записи метода:

УстановитьНовыйНомер("01-");

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

Синтаксис метода:

НазначитьТип(<ИмяРеквизита>, <ИмяТипа>, <Длина>, <Точность>)

где

  • <ИмяРеквизита> — строковое выражение, содержащее имя реквизита, как оно задано в Конфигураторе;
  • <ИмяТипа> — строковое выражение — название типа данных (или вида субконто), который назначается реквизиту документа, например, "Строка", "Число", "Дата", "Справочник.Товары", "Документ.РасходнаяНакладная" и т.п.;
  • <Длина> — числовое выражение — длина поля представления данных. Параметр является необязательным. Имеет смысл только при задании числового или строкового типа;
  • <Точность> — числовое выражение — число знаков числа после десятичной точки. Параметр является необязательным. Имеет смысл только при задании числового типа.

Пример записи метода:

Накладная.НазначитьТип("ТМЦ", "Справочник.Товары");

Получить значение реквизита по его идентификатору позволяет метод ПолучитьАтрибут() (англоязычный синоним — GetAttrib()).

Синтаксис метода:

ПолучитьАтрибут(<ИмяРеквизита>)

где <ИмяРеквизита> — строковое выражение, содержащее имя реквизита, как оно задано в Конфигураторе.

Пример использования:

ЦенаДок = Док.ПолучитьАтрибут("Цена");

Установить значение реквизита по его идентификатору позволяет метод УстановитьАтрибут() (англоязычный синоним — SetAttrib()).

Синтаксис метода:

УстановитьАтрибут(<ИмяРеквизита>, <3начение>)

где

  • <ИмяРеквизита> — строковое выражение, содержащее имя реквизита, как оно задано в Конфигураторе;
  • <3начение> — выражение, содержащее устанавливаемое значение реквизита.

Пример записи метода:

Док.УстановитьАтрибут("Цена", ЦенаТов);

Методы для работы с многострочной частью документа

Добавить новую строку с очередным порядковым номером в многострочную часть документа позволяет метод НоваяСтрока() (англоязычный синоним — NewLine()). Параметры у метода отсутствуют.

Пример использования:

Процедура ОбработкаПодбора(ВыбрМатериал)
   Кол = 1;
   Если ВвестиЧисло(Кол, "Введите количество", 14, 3) = 0 Тогда
      Возврат;
   ИначеЕсли Кол = 0 Тогда
      Возврат;
   КонецЕсли;

   
   НоваяСтрока();
   Материал = ВыбрМатериал;
   КоличествоНадлежитОтпустить = Кол;
   АктивизироватьСтроку();
   Пересчет("Материал");
КонецПроцедуры

Удалить текущую строку из многострочной части документа позволяет метод УдалитьСтроку() (англоязычный синоним — DeleteLine()). Параметры у метода отсутствуют.

Пример использования:

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

Удалить все строки из многострочной части документа позволяет метод УдалитьСтроки() (англоязычный синоним — DeleteLines()). Параметры у метода отсутствуют.

Пример записи метода:

УдалитьСтроки();

Отсортировать многострочную часть документа по реквизитам позволяет метод СортироватьСтроки() (англоязычный синоним — SortLines()).

Синтаксис метода:

СортироватьСтроки(<Колонки>)

где <Колонки> — перечисленные через запятую реквизиты многострочной части документа, по которым следует сортировать. Знаки «+», «-», предшествующие названию реквизита указывают направление сортировки по реквизиту. Знак «*» указывает, что сортировать следует по внутреннему значению реквизита.

Пример использования:

Док = СоздатьОбъект("Документ.Приказы");
Если Док.Выбрать("Найди документ") > 0 Тогда
   Док.СортироватьСтроки("+Сумма, -НДС");
   Док.Записать();
КонецЕсли;

Узнать количество строк в многострочной части документа позволяет метод КоличествоСтрок() (англоязычный синоним — LinesCnt()). Параметры у метода отсутствуют. Возвращаемым значением метода является числовое значение.

Пример использования:

Для Ном=1 По Док.КоличествоСтрок() Цикл
   Док.ПолучитьСтрокуПоНомеру(Ном);
   Если Док.Сумма = 0 Тогда
      Сообщить("У сотрудника " + СокрЛП(Док.ФИО) +
               "не указана сумма аванса!");
   КонецЕсли;
КонецЦикла;

Получить строку по номеру и сделать её текущей позволяет метод ПолучитьСтрокуПоНомеру() (англоязычный синоним — GetLineByNum()). Возвращаемым значением метода является число 1, если действие выполнено, или 0, если действие не выполнено.

Синтаксис:

ПолучитьСтрокуПоНомеру(<Номер>)

где <Номер> — выражение, содержащее номер искомой строки (это тот номер, который содержится в атрибуте НомерСтроки. Надо заметить, что значение данного атрибута может отличаться от порядкового номера строки в табличной части — могут иметь место пропуски, например, при принудительном назначении номера строке через атрибут НомерСтроки).

Пример использования:

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

Открыть выборку строк многострочной части документа позволяет метод ВыбратьСтроки() (англоязычный синоним — SelectLines()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если действие выполнено и в выборке есть хотя бы одна строка, или 0, если действие не выполнено или в выборке нет ни одной строки. Непосредственно сама выборка осуществляется при помощи метода ПолучитьСтроку() в порядке возрастания номеров строк.

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Выбрать следующую строку документа в последовательности выборки, открытой перед этим при помощи метода ВыбратьСтроки(), позволяет метод ПолучитьСтроку() (англоязычный синоним — GetLine()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если следующая строка табличной части документа выбрана успешно, или 0, если следующая строка документа не найдена (достигнут конец выборки).

Пример использования метода приведён выше.

Получить сумму значений по всем строкам табличной части документа для указанного реквизита позволяет метод Итог() (англоязычный синоним — Total()). Возвращаемым значением метода является числовое значение — итог по колонке.

Синтаксис:

Итог(<ИмяРеквизита>)

где <ИмяРеквизита> — строковое выражение, содержащее имя реквизита табличной части документа.

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

Дополнительные свойства реквизита

Пример использования метода:

Процедура ВычСреднего()
   
   Сумма = Итог("Сумма");
   Штук = Итог("Штук");
   Если Штук <> 0 Тогда
      Средн = Сумма/Штук;
   Иначе
      Средн = 0;
   КонецЕсли;
КонецПроцедуры

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

Синтаксис метода:

ВыгрузитьТабличнуюЧасть(<3нач>, <Реквизиты>)

где

  • <3нач> — идентификатор переменной, содержащей ссылку на объект типа "ТаблицаЗначений" или "СписокЗначений", куда нужно выгрузить данные из многострочной части документа. Если переданное значение пустое, то система сама создаст объект типа "ТаблицаЗначений". Колонки совмещаются по идентификаторам. Для номера строки документа в таблице значений создаётся отдельная колонка с идентификатором «НомерСтрокиДокумента»;
  • <Реквизиты> — список реквизитов многострочной части документа (через запятую), значения которых следует выгружать. Для выгрузки номера строки надо указать реквизит НомерСтроки. Параметр является необязательным. По умолчанию выгружаются все имеющиеся колонки.

Пример использования:

ВыбДокум.ВыгрузитьТабличнуюЧасть(ТаблЗнач, "Товар, Сумма, НДС, Цена");

Загрузить многострочную часть документа из таблицы значений позволяет метод ЗагрузитьТабличнуюЧасть() (англоязычный синоним — LoadTable()).

Синтаксис метода:

ЗагрузитьТабличнуюЧасть(<ТаблЗнач>)

где <ТаблЗнач> — таблица значений, откуда загружается многострочная часть документа. Колонки совмещаются по идентификаторам.

Пример использования:

ВыбДокум.ЗагрузитьТабличнуюЧасть(ТаблЗнач);

Методы контекста Модуля формы документа

Внимание! Описанные в данном разделе методы доступны только в контексте Модуля формы документа.

Установить режим обязательного перепроведения при записи ранее проведённого документа позволяет метод ПриЗаписиПерепроводить() (англоязычный синоним — ReMakeActionsWhenWrite()). Интерактивный отказ от проведения документа или ошибка модуля при этом приведёт к отмене записи отредактированного документа.

Синтаксис метода:

ПриЗаписиПерепроводить(<Режим>)

где <Режим> — числовое выражение. Значение 1 устанавливает флаг обязательного перепроведения при записи уже проведённого документа, а 0 снимает флаг обязательного перепроведения при записи уже проведённого документа.

Пример использования:

Процедура ПриОткрытии()
   ПриЗаписиПерепроводить(1);
КонецПроцедуры

Установить режим проведения документа после ТА позволяет метод ПроводитьПослеТА() (англоязычный синоним — PostingAfterTA()). Возвращаемым значением метода является текущее значение режим перепроведения документа в зависимости от проведённости.

Этот метод относится к случаю проведения документа в пределах даты, в которой находится ТА. Дело в том, что при записи документа, документ кроме даты получает еще и время документа. В многопользовательском режиме часто возникает ситуация, когда в момент проведения документа, он уже оказывается не последним в потоке проводимых документов (провели документ с другого рабочего места), в этом случае система «1С:Предприятие» даёт на выбор три варианта проведения:

  • провести документ тем временем, каким он был записан, то есть фактически задним временем (до ТА);
  • изменить время документа (в рамках текущей даты), чтобы документ стал самым последним и проводился в потоке, то есть после ТА;
  • запросить у пользователя, в каком режиме провести документ.

Синтаксис метода:

ПроводитьПослеТА(<ФлагДляНеПровДокумента>, <ФлагДляПровДокумента>)

где

  • <ФлагДляНеПровДокумента> — флаг режима проведения документа после ТА. Числовое выражение: −1 (минус единица) — проводить документ всегда задним числом; 0 — при проведении запрашивать режим проведения документа; 1 — проводить документ в реальном потоке времени, то есть при проведении время документа автоматически устанавливается на время после ТА;
  • <ФлагДляПровДокумента> — флаг режима перепроведения документа после ТА. Числовое выражение: −1 (минус единица) — проводить документ всегда задним числом; 1 — проводить документ в потоке.

Пример использования:

Процедура ПриОткрытии()
   ПроводитьПослеТА(1, 1);
КонецПроцедуры

Выполнить визуальную активизацию строки документа в форме позволяет метод АктивизироватьСтроку() (англоязычный синоним — ActivateLine()). Данный метод в основном предназначен для активизации строки после завершения работы предопределённой процедуры ОбработкаПодбора().

Синтаксис метода:

АктивизироватьСтроку(<НомСтроки>)

где <НомСтроки> — номер строки, которую следует активизировать. Параметр является необязательным. Если параметр опущен, то активизируется текущая строка многострочной части документа.

Пример использования:

Процедура ОбработкаПодбора(ВыбрМатериал)
   Кол = 1;
   Если ВвестиЧисло(Кол, "Введите количество", 14, 3) = 0 Тогда
      Возврат;
   ИначеЕсли Кол = 0 Тогда
      Возврат;
   КонецЕсли;

   
   НоваяСтрока();
   Материал = ВыбрМатериал;
   КоличествоНадлежитОтпустить = Кол;
   
   АктивизироватьСтроку();
   Пересчет("Материал");
КонецПроцедуры

Запретить или разрешить изменение порядка строк в форме позволяет метод ИзменениеПорядкаСтрок() (англоязычный синоним — ChangeLinesOrder()). Возвращаемым значением метода является числовое значение
режима изменения порядка строк до исполнения метода.

Синтаксис метода:

ИзменениеПорядкаСтрок(<Режим>)

где <Режим> — число: 1 — разрешить изменение порядка строк в документе; 0 — запретить. Параметр является необязательным. Если параметр не задан, то режим не меняется.

Пример записи метода:

ИзменениеПорядкаСтрок(0);

Получить признак изменения реквизитов формы позволяет метод Модифицированность() (англоязычный синоним — Modify()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если реквизиты текущей формы документа были изменены, или 0, если реквизиты текущей формы документа не изменялись.

Примечание: В режиме исполнения этот признак отображается символом «*» («звёздочка») в заголовке окна формы.

Пример использования:

Изменен = Модифицированность();

Методы контекста Модуля документа

Внимание! Описанные в данном разделе методы доступны только в контексте Модуля документа.

Определить, выполняется ли проведение документа в реальном времени или задним числом (когда нельзя обращаться к текущим остаткам регистров), позволяет метод ИтогиАктуальны() (англоязычный синоним — AreTotalsActual()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если итоги актуальны, или 0, если нет. Метод доступен только в контексте Модуля документа в предопределённой процедуре ОбработкаПроведения().

Пример использования:

Процедура ОбработкаПроведения()
   
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Если ИтогиАктуальны() > 0 Тогда
         
         Регистр.ОстаткиТоваров.Склад = Склад;
         Регистр.ОстаткиТоваров.Товар = Товар;
         Регистр.ОстаткиТоваров.ОстаткиПолучить();
         Регистр.ОстаткиТоваров.БазоваяСтоимость =
                 Регистр.ОстаткиТоваров.БазоваяСтоимость * Количество *
                 Коэффициент/Регистр.ОстаткиТоваров.ОстатокТовара;
         Регистр.ОстаткиТоваров.ВалютнаяСтоимость =
                 Регистр.ОстаткиТоваров.ВалютнаяСтоимость * Количество *
                 Коэффициент/Регистр.ОстаткиТоваров.ОстатокТовара;
         Регистр.ОстаткиТоваров.ОстатокТовара = Количество * Коэффициент;
         Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
      Иначе
         
         Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
         Рег.ВременныйРасчет();
         РассчитатьРегистрыНа(ТекущийДокумент());
         Рег.Товар = Товар;
         Рег.Склад = Склад;
         Рег.ОстаткиПолучить();
         Регистр.ОстаткиТоваров.БазоваяСтоимость =
                 Рег.БазоваяСтоимость * Количество *
                 Коэффициент/Рег.ОстатокТовара;
         Регистр.ОстаткиТоваров.ВалютнаяСтоимость =
                 Рег.ВалютнаяСтоимость * Количество *
                 Коэффициент/Рег.ОстатокТовара;
         Регистр.ОстаткиТоваров.ОстатокТовара = Количество * Коэффициент;
         Регистр.ОстаткиТоваров.Склад = Склад;
         Регистр.ОстаткиТоваров.Товар = Товар;
         Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Определить, выполняется ли проведение документа группой (при помощи режима «Управление итогами») или по одному (интерактивно), позволяет метод ГрупповаяОбработка() (англоязычный синоним — IsGroupPrосеssing()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если это групповая обработка, или 0, если это проведение документа по одному. Метод доступен только в контексте Модуля документа в предопределённой процедуре ОбработкаПроведения().

Пример использования:

Процедура ОбработкаПроведения()
   Если ГрупповаяОбработка() > 0 Тогда
      ПроводкаДокументаГруппой();
   Иначе
      ПроводкаДокументаОдиночного();
   КонецЕсли;
КонецПроцедуры

Отменить весь процесс (транзакцию) проведения документа позволяет метод НеПроводитьДокумент() (англоязычный синоним — DoNotTransactDoc()). Параметры у метода отсутствуют. Метод доступен только в контексте Модуля документа в предопределённой процедуре ОбработкаПроведения().

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

Пример использования:

Процедура ОбработкаПроведения()
   Если Число(Клиент.Выбран()) > 0 Тогда
      ДвиженияРегистраРеализации();
   Иначе
      Сообщить("Не выбран клиент по реализации!!!
               | Документ не проводится!!!");
      НеПроводитьДокумент();
      Возврат;
   КонецЕсли;
КонецПроцедуры

Записать новое значение периодического реквизита справочника с привязкой к документу позволяет метод УстановитьРеквизитСправочника() (англоязычный синоним — SetRefField()). Данный метод доступен только в контексте Модуля документа в предопределённой процедуре ОбработкаПроведения().

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

Синтаксис метода:

УстановитьРеквизитСправочника(<Элемент>, <Реквизит>, <3начение>,
                              <Дата>, <Тип>, <Длина>, <Точность>)

где

  • <Элемент> — выражение, задающее элемент справочника, в котором требуется записать новое значение периодического реквизита;
  • <Реквизит> — строковое выражение, содержащее идентификатор периодического реквизита справочника;
  • <3начение> — новое значение периодического реквизита;
  • <Дата> — выражение типа "Дата", содержащее дату, на которую требуется установить новое значение периодического реквизита. Параметр имеет смысл только для не оперативных документов и позволяет установить значение на дату отличную от даты документа, но с пустым временем;
  • <Тип> — строковое выражение — название типа данных или вид субконто. Параметр является необязательным и используется только при установке значения периодического реквизита, имеющего неопределённый тип;
  • <Длина> — длина числового или строкового значения. Параметр является необязательным и используется только при установке значения периодического реквизита, имеющего неопределённый тип;
  • <Точность> — число знаков после десятичной точки для числового значения. Параметр является необязательным и используется только при установке значения периодического реквизита, имеющего неопределённый тип.

Пример использования:


Процедура ОбработкаПроведения()
    . . .
   УстановитьРеквизитСправочника(Сотрудник, "Оклад", Оклад, ДатаДок);
   ТекстСообщения = "Документ проведен." ;
   глСообщениеПроведения(ТекстСообщения, ТекущийДокумент(), 0);

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

Удалить существующие движения документа позволяет метод ОчиститьДвижения() (англоязычный синоним — ClearActions()). Метод доступен только в контексте Модуле формы документа при отключенном в конфигурации флаге «Автоматическое удаление движений». Действие данного метода относится только к текущему документу, который доступен в локальном контексте Модуля формы документа.

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

Использование данного метода позволяет:

  • допроводить документ, то есть доделывать движения в добавок к уже существующим;
  • делать движения, анализируя ранее сделанные и уже существующие;
  • выполнять отмену проведения документа, анализируя существующие движения;
  • не очищать существующие движения при перепроведении, если это не нужно.

Синтаксис метода:

ОчиститьДвижения(<ВидыДвижений>)

где <ВидыДвижений> — строковое выражение, в котором через точку с запятой («;») перечислены виды движений. Параметр является необязательным. Если данный параметр не задан, то производится полная очистка всех движений. При задании же списка движений в качестве видов движений можно задавать следующие строковые значения:

  • "Регистр.ХХХХ" — движение конкретного регистра, где ХХХХ — конкретный вид регистра;
  • "Операция" — бухгалтерская операция;
  • "Справочник" — все изменения периодических реквизитов справочников;
  • "ЖурналРасчетов" — все изменения в журналах расчётов.

Пример использования:

Процедура ОбработкаПроведения()
   ОчиститьДвижения("Операция; Справочник; ЖурналРасчетов");
   ДвиженияРегистровНакладных(Контекст);
КонецПроцедуры



Процедура ОбработкаУдаленияПроведения()
   ОчиститьДвижения();
КонецПроцедуры

Увязать движения регистров, записи значений периодических реквизитов справочников и записи бухгалтерских проводок с номерами конкретных строк документа позволяет метод ПривязыватьСтроку() (англоязычный синоним — LinkLine()). Метод доступен только в контексте Модуля документа в предопределённой процедуре ОбработкаПроведения().

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

Синтаксис метода:

ПривязыватьСтроку(<НомерСтроки>)

где <НомерСтроки> — выражение, содержащее номер строки документа.

Пример использования:

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

   ВыбратьСтроки();
   Пока ПолучитьСтроку() = 1 Цикл
      ПривязыватьСтроку(НомерСтроки);
      Операция.НоваяПроводка();
      Операция.СодержаниеПроводки = "" + ВидНачисления;
      Операция.НомерЖурнала = "НУ";
      Операция.Сумма = Сумма;
       . . .
   КонецЦикла;
   Операция.Записать();
	
КонецПроцедуры

Предопределённые процедуры Модуля формы документа

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

Описанные в данном разделе системные предопределённые процедуры должны располагаться только в Модулях формы документов. В основном данные процедуры предназначены для расширения возможности программного управления правами доступа к системе.

При интерактивном создании нового документа пользователем системой «1С:Предприятие» производится вызов процедуры ВводНового() (англоязычный синоним — InputNew()). Процедура может использоваться, например, для установки начальных значений реквизитов нового документа. Если же в данной предопределённой процедуре установить статус возврата в 0, ввода нового документа и открытие его формы не будет выполнено.

Синтаксис процедуры:

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

где

  • <ПризнКопирования> — идентификатор переменной, куда будет помещено число 1, если объект введён копированием, или 0, если это просто новый объект. Данный признак может быть использован для анализа необходимости инициализации реквизитов нового объекта. Параметр является необязательным;
  • <ОбъектКопирования> — идентификатор переменной, куда будет помещена ссылка на объект, который был скопирован. Параметр является необязательным.

Пример использования:

Процедура ВводНового(Копирование)
   Предупреждение("Данный документ автоматически создается системой
   |при импорте проводок из конфигурации Торговля+Склад. 
   |Вручную его вводить запрещено." );
   СтатусВозврата(0);
   Возврат;
КонецПроцедуры   

Примечание: Начальное значение статуса возврата любой предопределённой процедуры равно 1. Оно устанавливается системой при вызове процедуры.

При интерактивном создании нового документа с помощью команды «Ввести на основании», системой «1С:Предприятие» производится вызов предопределённой процедуры ВводНаОсновании() (англоязычный синоним – InputCausedBy()). Процедура может использоваться, например, для установки начальных значений реквизитов нового документа. Если же в данной предопределённой процедуре установить статус возврата в 0, ввода нового документа и открытие его формы не будет выполнено.

Синтаксис процедуры:

Процедура ВводНаОсновании(<ДокументОснование>)
     . . .
КонецПроцедуры

где <ДокументОснование> — идентификатор переменной, куда будет помещено значение документа, на основании которого вводится новый документ.

Пример использования:

Процедура ВводНаОсновании(ДокОсн)
   Если ДокОсн.Вид() = "РасходнаяНакладная" Тогда
      РасчетныйСчет = ДокОсн.РасчетныйСчет;
      Контрагент = ДокОсн.Контрагент;
      Договор = ДокОсн.Договор;
      Если ПустоеЗначение(ДокОсн.Грузополучатель) = 0 Тогда
         Плательщик = ДокОсн.Грузополучатель;
      КонецЕсли;
      ВариантРасчетаНалогов = ДокОсн.ВариантРасчетаНалогов;
      ТипЦен = ДокОсн.ТипЦен;
      ДокОсн.ВыбратьСтроки();
      Пока ДокОсн.ПолучитьСтроку() = 1 Цикл
         НоваяСтрока();
         Товар = ДокОсн.Товар;
         Количество = ДокОсн.Количество;
         Цена = ДокОсн.Цена;
         Сумма = ДокОсн.Сумма;
         НДС = ДокОсн.НДС;
         Всего = ДокОсн.Всего;
      КонецЦикла;
   КонецЕсли; 
   Комментарий = "Введен на основании: "+ГлПредставлениеДокумента(ДокОсн);
КонецПроцедуры   

При интерактивной записи документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриЗаписи() (англоязычный синоним — OnWrite()). Параметры у процедуры отсутствуют. Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя изменять реквизиты документа), запись документа не будет выполнена.

Пример использования:

Процедура ПриЗаписи()
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Предупреждение("У вас нет права изменять документ!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

В момент начала интерактивного редактирования существующей строки многострочной части документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриНачалеРедактированияСтроки() (англоязычный синоним — OnStartEditLine()). Параметры у процедуры отсутствуют. Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя изменять документ), то запись не будет изменена.

Пример использования:

Процедура ПриНачалеРедактированияСтроки()
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Предупреждение("У вас нет права изменять документ!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

При интерактивном вводе новой строки многострочной части документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриВводеСтроки() (англоязычный синоним — OnNewLine()). Параметры у процедуры отсутствуют. Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя изменять документ), то новая строка не будет инициирована.

Пример использования:

Процедура ПриВводеСтроки()
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Предупреждение("У вас нет права добавлять строки!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

В момент начала интерактивного редактирования новой строки многострочной части документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриРедактированииНовойСтроки() (англоязычный синоним — OnEditNewLine()). Параметры у процедуры отсутствуют. Данная процедура может использоваться, например, для установки начальных значений реквизитов строки табличной части документа. Установка же статуса возврата в данной процедуре не имеет смысла, так как отказаться от ввода новой строки в этот момент уже невозможно.

Пример использования:

Процедура ПриРедактированииНовойСтроки()
   Количество = 10;
   Коэффициент = 1;
   Скидка = 0;
КонецПроцедуры

В момент окончания интерактивного редактирования строки многострочной части документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриОкончанииРедактированияСтроки() (англоязычный синоним — OnFinishLineEdit()). Данная процедура может располагаться в Модулях формы документов и использоваться, например, для проверки значений реквизитов строки табличной части.

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

Синтаксис процедуры:

Процедура ПриОкончанииРедактированияСтроки(<НовСтр>)
    . . .
КонецПроцедуры

где <НовСтр> — имя переменной, куда будет передан флаг ввода новой строки. Возможные значения: 1 — произошло окончание ввода новой строки; 0 — произошло окончание редактирования существующей строки. Параметр является необязательным.

Пример использования:

Процедура ПриОкончанииРедактированияСтроки()
   Если Количество = 0 Тогда
      Количество = 1;
   КонецЕсли;
КонецПроцедуры

При интерактивном удалении строки многострочной части документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриУдаленииСтроки() (англоязычный синоним — OnDeleteLine()). Параметры у процедуры отсутствуют. Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя изменять документ), удаление строки документа не будет выполнено.

Пример использования:

Процедура ПриУдаленииСтроки()
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Предупреждение("У вас нет права удалять строки!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

При интерактивном изменении порядка строк многострочной части документа (при перемещении строк вверх-вниз, перенумерации, сортировке) системой «1С:Предприятие» производится вызов предопределённой процедуры ПриИзмененииПорядкаСтрок() (англоязычный синоним — OnChangeLinesOrder()). Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя изменять документ), изменении порядка строк документа не будет выполнено.

Синтаксис процедуры:

Процедура ПриИзмененииПорядкаСтрок(<Действие>)
    . . .
КонецПроцедуры

где <Действие> — имя переменной, куда будет передан признак действия. Возможные значения: −1 (минус один) — перемещение строки вверх; 1 — перемещение строки вниз; 0 — перенумерация строк. Параметр является необязательным.

Пример использования:

Процедура ПриИзмененииПорядкаСтрок()
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Предупреждение("У вас нет права изменять документ!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

Предопределённые процедуры Модуля документа

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

При выполнении проведения документа в любом режиме системой «1С:Предприятие» производится вызов предопределённой процедуры ОбработкаПроведения() (англоязычный синоним — Posting()), в которой собственно и заключается весь алгоритм проведения документа. Если в процедуре установить статус возврата в 0 (например, если данному пользователю нельзя проводить документ), то проведение документа не будет выполнено и будет отменена системная транзакция.

Примечание: В предопределённой процедуре ОбработкаПроведения() система «1С:Предприятие» сама выполняет все действия через транзакцию, поэтому никаких специальных действий по обработке транзакций в этой процедуре предпринимать не нужно.

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

Синтаксис процедуры:

Процедура ОбработкаПроведения(<3нач>)
    . . .
КонецПроцедуры

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

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

При отмене проведения документа или при удалении проведённых документов в любом режиме системой «1С:Предприятие» производится вызов предопределённой процедуры ОбработкаУдаленияПроведения() (англоязычный синоним — UnPostingProcess()). Параметры у процедуры отсутствуют. Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя отменять проведение документа) то отмена проведения документа не будет выполнена и будет отменена системная транзакция.

Примечание: В предопределённой процедуре ОбработкаУдаленияПроведения() система «1С:Предприятие» сама выполняет все действия через транзакцию, поэтому никаких специальных действий по обработке транзакций в этой процедуре предпринимать не нужно.

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

Пример использования:

Процедура ОбработкаУдаленияПроведения()
   
   СпрСотр.НайтиЭлемент(Сотрудник);
   
   Если СпрСотр.Выбран() = 1 Тогда
      
      СпрСотр.НайтиЭлемент(СтРасч);
      ВозвратРасч = 0;
      Если СпрСотр.Выбран() = 1 Тогда
         
         ВозвратРасч = 1;
      КонецЕсли;
      СпрСотр.НайтиЭлемент(Сотрудник);
      Если ВозвратРасч = 1 Тогда
         СпрСотр.Родитель = СтРасч;
      КонецЕсли;
      СпрСотр.Записать();
   КонецЕсли;
КонецПроцедуры

В процессе смены расчётного периода журнала расчётов «вперёд» , если в журнале расчётов содержатся записи, порожденные документом, системой «1С:Предприятие» производится вызов предопределённой процедуры АрхивироватьДокумент() (англоязычный синоним — ArchiveDocument()). Параметры у процедуры отсутствуют.

Пример использования:

Процедура АрхивироватьДокумент()
   
   ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   Если Окончание > ЖР.КонецТекущегоПериода() Тогда
      Зарегистрировать(ТекущийДокумент());
   КонецЕсли;
КонецПроцедуры

Предопределенные процедуры глобального модуля

При интерактивном удалении документа и в случае отмены пометки на удаление системой «1С:Предприятие» производится вызов предопределённой процедуры ПриУдаленииДокумента() (англоязычный синоним — OnDeleteDoc()). Условия вызова процедцры можно узнать с помощью метода ПометкаУдаления() объекта "Документ". Если в данной предопределённой процедуре установить статус возврата в 0 (например, если не истёк срок хранения документа), то удаление документа не будет выполнено.

Синтаксис процедуры:

Процедура ПриУдаленииДокумента(<УдалДокум>, <Режим>)
    . . .
КонецПроцедуры

где

  • <УдалДокум> — ссылка на удаляемый документ;
  • <Режим> — выражение, значение которого соответствует флагу режима удаления (1 — непосредственное удаление, 0 — пометка на удаление).

Пример использования:

Процедура ПриУдаленииДокумента(Док, Реж)
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Если (Док.Вид() = "РасходнаяНакладная") И (Реж = 1) Тогда
         Предупреждение("У вас нет права удалять накладную!", 2);
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

При интерактивной попытке изменить время документа системой «1С:Предприятие» производится вызов предопределённой процедуры ПриИзмененииВремениДокумента() (англоязычный синоним — OnChangeTimeDoc()). Если в данной предопределённой процедуре установить статус возврата в 0 (например, если время данного документа нельзя менять), изменение времени документа не будет выполнено.

Синтаксис:

Процедура ПриИзмененииВремениДокумента(<Док>)
    . . .
КонецПроцедуры

где <Док> — ссылка на обрабатываемый документ.

Пример использования:

Процедура ПриИзмененииВремениДокумента(Док)
   Если НазваниеНабораПрав() = "Продавец" Тогда
      Предупреждение("У вас нет права менять время документа!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

При интерактивной попытке выполнить операцию «Сделать непроведённым» системой «1С:Предприятие» производится вызов предопределённой процедуры ПриОтменеПроведенияДокумента() (англоязычный синоним — OnUnPosting()). Если в данной предопределённой процедуре установить статус возврата в 0 (например, если дата документа меньше некоторой константы), то отмена проведения документа не будет выполнена.

Синтаксис:

Процедура ПриОтменеПроведенияДокумента(<Док>)
    . . .
КонецПроцедуры

где <Док> — ссылка на обрабатываемый документ.

Пример использования:

Процедура ПриОтменеПроведенияДокумента(Док)
   Если Док.ДатаДок <= Константа.ДатаЗащитыДокументов Тогда
      Предупреждение("Нельзя снимать с проведения архив!", 2);
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

Другие статьи по схожей тематике

  • Работа с формами
  • Работы с табличными формами
  • Работа с журналами документов
  • Работа с последовательностями документов
  • Работа с операциями и проводками
  • Работа со справочниками в 1С
  • Работа с журналом операций

1.    Создание на форме дополнительных реквизитов в 1С 8.3 и их функции

Механизм дополнительных реквизитов в 1С 8.3 позволяет пользователю самостоятельно добавлять реквизиты к объектам, не меняя при этом конфигурации. После добавления и настройки реквизит отобразится на форме, пользователь сможет заполнить его и значения будут сохраняться в базе.

Вывести реквизиты на форму можно динамически, при ее открытии. Если смотреть отладчиком, то видно, что после процедур ПриСозданииНаСервере и ПриОткрытии дополнительных реквизитов в 1С 8.3 еще нет. Появятся они, когда активизируется закладка «Дополнительно». При создании на форме, реквизитам присваиваются длинные, страшные, ни о чем не говорящие имена. Например:

Имена значений дополнительных реквизитов на форме

Из-за этого возникают сложности с программным обращением к дополнительным реквизитам в 1С 8.3.

Дополнительные реквизиты на форме создаются типовой процедурой УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме:


Создание дополнительных реквизитов на форме

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

Форма с созданными на ней дополнительными реквизитами в 1С 8.3  

2.     Установка значения дополнительного реквизита в 1С 8.3 с помощью обращения к нему по имени

Чтобы иметь возможность программного обращения к созданным дополнительным реквизитам, нужно знать их имена на форме. Помочь разработчику узнать имена дополнительных реквизитов может специальный реквизит Свойства_ОписаниеДополнительныхРеквизитов. Его автоматически создает система, когда используется механизм дополнительных реквизитов. Тип этого служебного реквизита ДанныеФормыКоллекция. Он содержит список всех дополнительных реквизитов объекта и все сведения о них. Теперь, мы сможем найти нужный дополнительный реквизит в 1С 8.3 по имени, или по соответствующему ему свойству плана видов характеристик. Итак, обращаясь по имени к доп.реквизиту можно присвоить ему нужное значение, либо, наоборот, получить его значение и, например, как-то проверить.

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

Раздел Для разработчиков в нижней части формы характеристики

Вот вариант процедуры, которая получает поле доп. реквизита по его имени:

Параметры функции: форма и имя дополнительного реквизита

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

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

Код, вызывающий процедуру и устанавливающий значение дополнительному реквизиту в 1С 8.3

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

Специалист компании «Кодерлайн»

Екатерина Редько

Частая задача — сделать так, чтобы форма нового объекта открывалась не «пустая», а уже заполненная некоторыми начальными данными. Для самых простых случаев можно использовать свойство ЗначениеЗаполнения, которое есть у реквизитов объектов конфигурации. В более сложных случаях можно использовать свойство ЗаполнятьИзДанныхЗаполнения. Если ни тот, ни другой способы не подходят, на встроенном языке можно описать собственный алгоритм начального заполнения данных нового объекта.

Свойство ЗначениеЗаполнения

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

У реквизитов объектов конфигурации существует свойство ЗначениеЗаполнения. Реквизит Склад имеет тип ссылки на справочник Склады, а в справочнике Склады существует предопределенный элемент ГлавныйСклад. Тогда прямо в конфигураторе можно указать, что в новых документах реквизит Склад будет сразу же заполнен ссылкой на ГлавныйСклад:

Cвойство ЗаполнятьИзДанныхЗаполнения

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

Теперь будет происходить следующее. В режиме 1С:Предприятие пользователь отобрал список накладных по некоторому поставщику и некоторому складу. При вводе новой накладной с помощью команды «Создать» списка, поля Поставщик и Склад будут заполнены именно теми значениями, по которым отобран список накладных:

Собственный алгоритм заполнения реквизитов

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

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

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

Если же не менять стандартное значение этого параметра, то после выхода из этого обработчика платформа попытается самостоятельно заполнить реквизиты объекта, подлежащие заполнению. Незаполненными она будет считать те реквизиты, которые имеют стандартное значение своего типа. Например, для типа Число это значение 0, для типа Строка — пустая строка, а для типа Ссылка — пустая ссылка.

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

  • Реквизит заполнен — сразу будет вызван обработчик события ПриСозданииНаСервере.
  • Реквизит не заполнен — платформа попытается заполнить его из ДанныеЗаполнения. После этого снова проверит, заполнен реквизит или нет:
    • Реквизит заполнен — сразу будет вызван обработчик события ПриСозданииНаСервере.
    • Реквизит не заполнен — платформа попытается заполнить его из ЗначениеЗаполнения. После этого будет вызван обработчик события ПриСозданииНаСервере.

Поиск:
1С:Предприятие • Документ • Заполнять из данных заполнения • Значение заполнения • Обработка заполнения

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей нашего сайта:

  • Монгольские компании в москве
  • Мондиал бизнес консорциум ооо
  • Монетка реквизиты организации
  • Монополия на большую компанию
  • Монопольные компании в россии

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии