1С 8 3 12

Этот вопрос задает себе каждый пользователь, который слышит эти слова.

Немного прописных истин:

Что такое вообще проведение документа? Это как подпись документа в реальной жизни. Документу придали силу. До подписи (проведения) — это просто бумажка, после — событие!

Оперативное проведение — это проведение документа текущим временем.

Неоперативное — это проведение документа ранее текущего времени. Даже в тот же день, тот же час, пусть на секунду раньше текущего времени — это уже неоперативно. Классический вариант — перепроведение документов прошедшей датой.

Позже текущего времени, или как говорят, «будущей датой», в 8-ке документ провести нельзя в принципе.

Опыт, накопленный годами:

Фирма 1C по пятнадцатилетнему опыту развития и поддержки 7-ки решила, что в 8-ке контроль остатков (товаров, взаиморасчетов и т.д.) будет проводиться только при оперативном проведении. В случает отсутствия остатков, документ не будет проведен. Внимание! А при неоперативном проведении документ будет проведен всегда! Последнее предложение надо перечитать несколько раз.

Как же так, спросите вы? А если товара нет, какие движения сформирует документ?! Такие, какие сможет.

Чтобы это понять (и принять), у меня ушло два месяца. А еще спустя полгода, я понял всю силу такого подхода. Это действительно хорошее решение!

Смысл в том, что контроль имеет смысл только при оперативной работе. А если задним числом что-то съехало — это результат работы задним числом. Кто ломал, тот пусть и делает.

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

В заключение хочется отметить, что такая методика работы не связана с самой платформой 1С 8. В 8-ке можно было бы сохранить методику, заложенную в 7-ке. И в 7-ке можно было бы реализовать рассмотренную здесь методику. Поменялся именно подход к работе с базой.
Получается, что в 7-ке, где в одном отчете о продажах за день может быть 1000 позиций и не проводится только из-за одной, не проводится весь документ.
А в 8-ке, где в одном отчете о продажах за день может быть 1000 позиций, и ругается только по одной, ошибка только по этой позиции.

Что делать, если мы все-таки работаем задним числом?

Подробнее о записи и проведении документов.

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

Назначение регистров

Регистры — это таблицы для накопления оперативных данных и получения сводной информации.

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

Документы => Регистры => Отчеты

Измерения и ресурсы

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

Измерения регистра — это то, в каких разрезах требуется хранение информации.
Ресурсы регистра — это количественные или суммовые данные, которые хранятся в регистре.

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

Регистр: Остатки товаров
Измерения: Товар, Склад
Ресурсы: Кол-во, Стоимость

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

  • остаток конкретного товара на конкретном складе
  • остаток конкретного товара на всех складах
  • стоимость всех товаров на конкретном складе

Движения в регистрах

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

Товар Склад Кол-во Стоимость
приход Товар4 Склад1 15 200
расход Товар4 Склад1 10 100
приход Товар4 Склад1 5 50

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

Виды регистров

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

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

Регистры остатков

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

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

Регистры оборотов

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

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

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

Основы программирования

Регистры, используемые в примерах:
Оборотный регистр Доходы
Измерения: Клиент, Товар
Ресурсы: Доход
Реквизиты: нет
Периодичность: День
Регистр остатков Товары
Измерения: Товар, Склад
Ресурсы: Количество, Стоимость
Реквизиты: нет
Хранит доходы от продаж за день в разрезе клиентов и товаров. Хранит остатки товаров на каждом складе в количественном и суммовом выражении.

Запись движений в регистр остатков
(только при проведении документа)р.Доходы.ДвижениеПриход(Покупатель,КупленныйТовар,СуммаПокупки)

Методы ДвижениеПриходВыполнить и ДвижениеРасходВыполнить
Пример:

Запись движений в оборотный регистр
(только при проведении документа)

1. Метод Движение
Пример: Регистр.Товары.Движение (ПоступившийТовар, ТекСклад, КолвоПоНакладной, СуммаПоНакладной)
2. Метод ДвижениеВыполнить
Пример:
Регистр.Товары.Товар = ПоступившийТовар;
Регистр.Товары.Склад = ТекСклад;
Регистр.Товары.Количество = КолвоПоНакладной;
Регистр.Товары.Стоимость = СуммаПоНакладной;
Регистр.Товары.ДвижениеВыполнить();
Примечание: Если сумма или количество в движении будет отрицательным, то это движение будет расходом, иначе приходом.

Обращение к итогам регистра

Обращение к итогам оборотного регистра

3. Метод СводныйИтог
Могут быть указаны не все измерения. Фиксируются только указанные измерения.
Пример:
//получить сводные итоги за день
ДоходПоКлиенту = РегДоходы.СводныйИтог(ТекКлиент,,»Доход»);
ДоходПоТовару = РегДоходы.СводныйИтог(,ТекТовар,»Доход»);
4. Метод СводныеИтоги
Могут быть указаны не все измерения. Фиксируются только указанные измерения.
Пример:
//получить сводные итоги за день по клиенту
РегДоходы.СводныеИтоги(ТекКлиент,); //указано только одно измерение
ДоходПоКлиенту = РегДоходы.Доход;
//получить сводные итоги за день по товару
РегДоходы.СводныеИтоги(,ТекТовар); //указано только одно измерение
ДоходПоТовару = РегДоходы.Доход;

Обращение к итогам регистра остатков

РегТовары = СоздатьОбъект(«Регистр.Товары»);

//получить стоимость данного товара на данном складе
Стоимость = РегТовары.Остаток (ТекТовар, ТекСклад, «Стоимость»);

//получить стоимость всех товаров на данном складе
СтоимостьПоСкладу = РегТовары.СводныйОстаток (,ТекСклад,»Стоимость»);
4. Метод СводныеОстатки
Пример:
//получить сводные остатки по товару
РегТовары.СводныеОстатки(ТекТовар,); //указано только одно измерение
КолвоТовара = РегТовары.Количество;
СтоимостьТовара = РегТовары.Стоимость;
//получить стоимость всех товаров на данном складе
РегТовары.СводныеИтоги(,ТекСклад); //указано только одно измерение
СтоимостьПоСкладу = РегТовары.Стоимость;

Обращение к движениям регистра

РегТовары = СоздатьОбъект(«Регистр.Товары»);

Фильтрация движений и итогов

РегТовары = СоздатьОбъект(«Регистр.Товары»);

1. Метод УстановитьФильтр
Пример:
//выбрать все движения по данному складу за период
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл

КонецЦикла;
//выбрать все товары на данном складе
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьИтоги();
Пока РегТовары.ПолучитьИтог()=1 Цикл

КонецЦикла;
2. Метод УстановитьЗначениеФильтра
Пример:
//выбрать все движения по данному складу за период
РегТовары.УстановитьЗначениеФильтра(«Склад», ТекСклад);
//далее идет выборка движений или итогов

3. Метод ВыбратьДвиженияДокумента
4. Метод ВыбратьДвиженияСОстатками
Применяется только для регистра остатков.

Временный расчет регистров

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

//установка флага временного расчета для регистров
РегТовары.ВременныйРасчет(1);
РегДоходы.ВременныйРасчет(1);

1. Метод РассчитатьРегистрыНа
Рассчитать все регистры с установленным флагом временного расчета на начало события.
(на начало даты или на момент до проведения документа)
2. Метод РассчитатьРегистрыПо
Рассчитать все регистры с установленным флагом временного расчета на конец события.
(на конец даты или на момент после проведения документа)

Запрос к регистру
В запросах к регистрам применяются функции НачОст, КонОст, Приход, Расход. В запросах к оборотным регистрам обязательно указывается Период.

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

Теги: 1С:Предприятие • Движения • Документ • МоментВремени • ОбработкаПроведения

Когда происходит интерактивное или программное проведение документа, срабатывает выполнение процедуры ОбработкаПроведения(), которая находится в модуле объекта документа.

Процедура ОбработкаПроведения(Отказ, РежимПроведения) // Вставить содержимое обработчика КонецПроцедуры

Данная процедура имеет два параметра: Отказ и РежимПроведения. Если выставить параметру Отказ значение Истина, то проведение не будет выполнено. Параметр РежимПроведения устанавливает режим проведения документа — «оперативное» или «неоперативное». Сами движения в регистры разработчик должен прописать в этой процедуре самостоятельно.

Рассмотрим подробно свойства документа на вкладке «Движения»

  • Проведение — «разрешить» или «запретить». Определяет, будет ли документ создавать движения.
  • Оперативное проведение — «разрешить» или «запретить». Если установлено «разрешить», то проведение документа будущей датой невозможно.
  • Удаление движений — определяет режим очистки движений документа:
    • Удалять автоматически при отмене проведения. При перепроведении документа движения перезаписываются, а при отмене проведения движения документа автоматически удаляются.
    • Удалять автоматически. При записи документа с проведением сначала будут удалены все старые движения документа. На момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа.
    • Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.

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

Формирование новых наборов записей регистров включает в себя операции, состоящие:

  • из добавления новых записей к набору записей;
  • заполнения полей записей;
  • записи набора записей.

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

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

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

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

// По умолчанию параметр Замещать имеет значение Истина Движения.ТоварыНаСкладах.Записать();

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

// Добавлять новые движения к старым Движения.ТоварыНаСкладах.Записать(Ложь);

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

Подробнее о формировании движений

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

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

Если разработчик захочет реализовать нестандартный вариант проведения документа и установит свойство «Удаление движений» в значение «Удалять автоматически», то при записи документа с проведением сначала будут удалены все старые движения документа. То есть на момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа.

При записи с проведением система автоматически запишет выбранные и незаписанные наборы записей, находящиеся в свойстве «Движения». Отсюда следуют два важных вывода:

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

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

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

Пример перепроведения документов РеализацияТоваров в интервале с ДатаНачала по ДатаОкончания:

// Получить ссылки на проведенные документы в требуемом интервале Запрос = Новый Запрос(); Запрос.Текст = «ВЫБРАТЬ | РеализацияТоваров.Ссылка |ИЗ | Документ.РеализацияТоваров КАК РеализацияТоваров |ГДЕ | РеализацияТоваров.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания | И РеализацияТоваров.Проведен»; Запрос.УстановитьПараметр(«ДатаНачала», ДатаНачала); Запрос.УстановитьПараметр(«ДатаОкончания», ДатаОкончания); Результат = Запрос.Выполнить(); // Перебрать ссылки полученных документов Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // Перепровести каждый документ неоперативно Документ = Выборка.Ссылка.ПолучитьОбъект(); Документ.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла;

Здесь инициировалось проведение в неоперативном режиме. Значение по умолчанию параметра РежимПроведения метода объекта документа Записать() — именно РежимПроведенияДокумента.Неоперативный.

Оперативное и неоперативное проведение

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

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

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

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

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

Понятие момента времени

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

Для обработки подобных ситуаций было введено понятие момент времени. Момент времени представляет собой совокупность даты, времени и ссылки на объект базы данных. Он позволяет однозначно идентифицировать любой объект ссылочного типа базы данных на оси событий, но имеет смысл в основном только для документов. Кроме того, момент времени позволяет идентифицировать и необъектные данные, например, записи регистров, подчиненных регистратору.

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

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

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

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

  • при создании нового документа система будет устанавливать ему текущую дату сеанса и «нулевое» время;
  • при проведении такого документа (с датой, день которой соответствует дню текущей даты сеанса) система установит в качестве даты документа оперативную отметку времени;
  • если отменить проведение документа и затем провести его снова (не изменяя даты), система установит документу новую оперативную отметку времени;
  • если попытаться перепровести документ, то система также автоматически установит документу новую оперативную отметку времени и проведет его;
  • при попытке проведения (или перепроведения) оперативно проводимого документа с датой, день которой меньше дня текущей даты сеанса, документ будет проведен неоперативно;
  • если попытаться провести (или перепровести) оперативно проводимый документ с датой, день которой больше дня текущей даты сеанса, то система не даст выполнить такое действие.

Поиск: 1С:Предприятие • Движения • Документ • Момент времени • Обработка проведения

Печать (Ctrl+P)

Механизм проведения документов

Информация, отражающая хозяйственную деятельность предприятия, хранится в регистрах. Документы могут изменять состояние регистров. Этот процесс называется проведением. Данный механизм является рекомендуемым механизмом изменения состояния регистров. Проведение может выполняться в оперативном или неоперативном режиме (свойство Оперативное проведение).
ПРИМЕЧАНИЕ. Как правило, механизм оперативного проведения используется для решения задач оперативного учета.

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

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

Расширение формы и проведение

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

Одной из задач оперативного проведения документов является размещение документов в хронологическом порядке на шкале времени. Такое размещение необходимо, в частности, для того, чтобы корректно списывались остатки по регистрам остатков (см. здесь) оперативного учета. Для размещения документов используются такие понятия, как момент времени и оперативная отметка времени. Рассмотрим эти понятия более
подробно.
Для определения положения документа на оси времени используется реквизит документа Дата, который содержит время с точностью до секунды. Это позволяет контролировать последовательность записи документов. Однако при большом объеме создаваемых документов вероятна ситуация, когда несколько документов будут иметь одинаковое значение даты (т. е. будут созданы в течение одной секунды). Как в этом случае определить последовательность созданных документов?

Момент времени

Для обработки подобных ситуаций существует понятие момент времени. Момент времени представляет собой совокупность даты, времени и ссылки на объект базы данных. Он позволяет однозначно идентифицировать любой объект ссылочного типа базы данных на оси событий, но имеет смысл в основном только для документов. Кроме того, момент времени позволяет идентифицировать и необъектные данные, например, записи регистров, подчиненных регистратору.
Понятие момента времени реализовано во встроенном языке при помощи универсального объекта МоментВремени.
Для нескольких документов, имеющих одинаковую дату и время, последовательность их на оси событий определяется системой исходя из ссылок на эти документы. Она может не совпадать с последовательностью создания документов, и она недоступна для изменения пользователем, то есть нельзя каким-либо образом повлиять на последовательность документов внутри одной секунды или «вычислить», что один документ создан раньше, а другой – позже.

Оперативная отметка времени

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

Поясное время

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

Получение оперативной отметки времени

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

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

Если подписок на одно событие несколько, то, судя по опыту, сначала вызывается вышестоящая в древе конфигурации подписка. Хотя и сама фирма 1С сообщает, что эта очередность не определена.

Использование подписок на событие в 1С

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

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

Настройка подписки на событие

Настроить подписку очень просто:

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

Другие статьи по 1С:

  • Администрирование (обновление 1С, резервные копии и т.д);
  • Программирование 1С
  • Обучение 1С

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):