Опубликовано: 26.03.2022

Работа с объектами типа «Документ»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

где

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

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

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

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

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

// Синтаксис 1:

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

// Синтаксис 2:

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

где

  • <Докум> — значение документа, позиция которого определяется, или сама позиция;
  • <ФлагСмещения> — необязательный параметр. Число: −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);
   КонецЕсли;
КонецПроцедуры

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