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

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

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

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

Ссылка | Дата | Номер | Поставщик | Склад |
---|---|---|---|---|
8eae102c-86d5-11eb-80a3-e0d55e4e2669 | 20.03.2021 20:00:04 | 000000001 | Алхимов | Основной |
8eae102d-86d5-11eb-80a3-e0d55e4e2669 | 20.03.2021 20:00:25 | 000000002 | ИП Иванов | Основной |
Табличная часть документа
Один документ может содержать в себе некоторый список однотипных данных. Например, в приходной накладной может быть 10 разных товаров. Для хранения таких данных предназначены табличные части.
Табличная часть описывается на закладке Данные. Указывается имя табличной части и реквизиты табличной части:

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

Ссылка | НомерСтроки | Товар | Количество |
---|---|---|---|
8eae102c-86d5-11eb-80a3-e0d55e4e2669 | 1 | Смартфон | 2 |
8eae102c-86d5-11eb-80a3-e0d55e4e2669 | 2 | Клавиатура | 4 |
Формы документа
На закладке Формы для документа можно создать свои формы документа, списка или выбора:

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

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

Для примера сформируем движения по регистру ОстаткиТоваров. Регистр имеет следующую структуру:

Тип изменения «Товар» — СправочникСсылка.Товары. Тип ресурса «Количество» — число, 15, 3. Аналогичные реквизиты есть у табличной части документа.
В модуле объекта документа нужно добавить процедуру ОбработкаПроведения и заполнить ее следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Процедура ОбработкаПроведения(Отказ, РежимПроведения) //устанавливаем признак записи регистра ОстаткиТоваров Движения.ОстаткиТоваров.Записывать = Истина; //перебираем табличную часть Для Каждого СтрТабл Из СписокТоваров Цикл //для добавления новой записи в регистр //используем коллекцию Движения НоваяЗапись = Движения.ОстаткиТоваров.Добавить(); НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход; НоваяЗапись.Период = Дата; НоваяЗапись.Товар = СтрТабл.Товар; НоваяЗапись.Количество = СтрТабл.Количество; КонецЦикла; КонецПроцедуры |
Через коллекцию Движения можно обратиться к регистру. Сначала у него устанавливается признак Записывать = Истина, чтобы после выхода из обработки проведения движения были записаны в регистр. Затем в цикле перебирается табличная часть и для каждой строки добавляется новая запись в регистр ОстаткиТоваров.
В свойствах документа есть свойство Запись движений при проведении. Чтобы открыть свойства нужно в дереве метаданных в контекстном меню документа выбрать пункт «Свойства».

Если данное свойство равно Записывать выбранные, то после обработки проведения будут записаны только те наборы записей, у которых был установлен признак Записывать = Истина. Если Записывать модифицированные, то признак Записывать = Истина можно не устанавливать вручную. Любые измененные в обработке проведения наборы записей будут записаны. Платформа автоматически установит им признак Записывать = Истина при их изменении.
После записи документа свойство Записывать будет возвращено в исходное состояние, причем даже если запись документа не была завершена.
Если в обработке проведения установить параметр Отказ = Истина, то проведение не будет выполнено, движения не будут записаны в регистр и при проведении будет выдано исключение: «Не удалось провести «Приход товара 000000002 от 20.03.2021 20:00:25″!».
Отмена проведения документов
При записи документа в режиме отмены проведения выполняется удаление движений по регистрам. До непосредственного удаления движений вызывается обработчик ОбработкаУдаленияПроведения в модуле объекта документа. В данном обработчике можно прописать свой алгоритм действий при отмене приведения документа.
На закладке Движения можно настроить будут ли автоматически удалять движения при отмене проведения или нет. За это отвечает свойство УдалениеДвижений:

Свойство УдалениеДвижений может принимать три значения:
- Удалять автоматически при отмене проведения — движения документа будут автоматически удаляться только при отмене проведения документа. При перепроведении документа движения не удаляются, а перезаписываются.
- Удалять автоматически — движения документа будут автоматически удаляться как при отмене проведения, так и при перепроведении документа.
- Не удалять автоматически — движения документа не будут удаляться автоматически.
При создании нового документа в конфигураторе автоматически устанавливается Удалять автоматически при отмене проведения.
Если выбрано значение Не удалять автоматически, то в обработчике ОбработкаУдаленияПроведения нужно очистить движения программно:
1 2 3 4 5 6 7 8 |
Процедура ОбработкаУдаленияПроведения(Отказ) //очищаем набор записей Движения.ОстаткиТоваров.Очистить(); //устанавливаем признак записи Движения.ОстаткиТоваров.Записывать = Истина; //записываем все движения документа Движения.Записать(); КонецПроцедуры |
Здесь также есть параметр Отказ. Если установить Отказ = Истина, то отмена проведения документа не будет выполнена с исключением «Не удалось сделать непроведенным «Приход товара 000000001 от 20.03.2021 20:00:04″!».
Оперативное проведение
Оперативное проведение — это проведение документа текущим временем. Настраивается на закладке Движения:

Если разрешено оперативное проведение, то:
- Если дата документа равна текущей дате, то при проведении будет автоматически установлено текущее время.
- Если дата документа меньше текущей, то время не изменяется, документ проведется неоперативно.
- Если установить дату документа больше текущей, то документ не проведется с ошибкой «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!».
Если запрещено оперативное проведение, то документ всегда проводится неоперативно. Это значит, что в системе отражается уже свершившийся факт, поэтому документ можно провести любой датой. Даже если дата будет равно текущей дате время не будет изменено на текущее.
Режим проведения (оперативный или неоперативный) передается в обработку проведения вторым параметром:
1 2 3 4 |
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Сообщить(РежимПроведения); //может быть Оперативный или Неоперативный КонецПроцедуры |
В свойствах формы документа есть еще три настройки:

Автовремя — устанавливается при создании нового документа:
- Не использовать — время равно текущему времени сеанса.
- Последним — при создании время равно 00:00:00, при записи время установится на 1 секунду больше, чем время последнего документа за этот день.
- Первым — при создании время равно 00:00:00, при записи время установится на 1 секунду меньше, чем время самого первого документа за этот день.
- Текущее или последним — при создании время равно 00:00:00. При записи, если дата равна текущей дате, то время установится как текущее время. Если дата не равна текущей, то время установится на 1 секунду больше, чем время последнего документа за этот день.
- Текущее или первым — при создании время равно 00:00:00. При записи, если дата равна текущей дате, то время установится как текущее время. Если дата не равна текущей, то время установится на 1 секунду меньше, чем время самого первого документа за этот день.
Если для документа разрешено оперативное проведение, то при проведении время все равно будет установлено равным текущему.
Использовать режим проведения:
- Автоматически — режим проведения определяется от даты документа и в зависимости от свойства Оперативное проведение.
- Оперативный — всегда оперативно, если это возможно.
- Неоперативный — всегда неоперативно, если это возможно.
ПриЗаписиПерепроводить — если данный флаг установлен, то если записать уже проведенный документ кнопкой «Записать», то он перепроведется. Если флаг снят, то он только запишется, обработчик ОбработкаПроведения не будет вызван.
Оперативная отметка времени
Оперативная отметка времени — это дата, которая формируется при проведении документа в оперативном режиме. Как правило она равна текущему времени, но если последняя выданная оперативная отметка времени равна текущего времени, то новая отметка увеличивается на одну секунду.
Например, если создать новый документ и провести его, то будет получена оперативная отметка времени, которая равна текущему времени и данное время будет установлено документу. Если перепровести документ через пять секунд, то будет получена новая оперативная отметка времени, снова равная текущего времени. В итоге время документа увеличится на пять секунд. Но если в течении одной секунды пять раз подряд перепровести документ, то оперативная отметка времени будет получена пять раз. Причем в течении одной секунды. В итоге в первый раз будет получено текущее время. Во второй раз текущее время + 1 секунда (так как новая оперативная отметка времени должна быть больше на 1 секунду последней выданной оперативной отметки). В третий — текущее время + 2 секунды и т.д. То есть итоговое время документа будет на несколько секунд больше текущего. Документ как бы «попал в будущее».
Формула расчета оперативной отметки времени:
1 2 3 4 5 |
Если ТекущаяДатаСеанса() > ПоследняяВыданнаяОперативнаяОтметкаВремени Тогда ОперативнаяОтметкаВремени = ТекущаяДатаСеанса(); Иначе ОперативнаяОтметкаВремени = ПоследняяВыданнаяОперативнаяОтметкаВремени + 1 Секунда; КонецЕсли; |
В базе может храниться несколько оперативных отметок времени. Их количество равно количеству разных часовых поясов, используемых в информационной базе. В клиент-серверной базе оперативная отметка хранится в памяти сервера, в файловой базе — в специальной таблице. Хранится до тех пор, пока в базе есть хотя бы один пользователь с таким часовым поясом.
Оперативную отметку можно получить программно:
1 2 |
ОперативнаяОтметкаВремени = ПолучитьОперативнуюОтметкуВремени(); //ОперативнаяОтметкаВремени = 21.03.2021 12:50:07 |
Момент времени
У каждого документа есть реквизит Дата. Дата нужна для составления хронологической последовательности документов. Но может быть такое, что в одну секунду будет создано несколько документов. Тогда не получится только по дате составить хронологическую цепочку. Для этого используется Момент времени.
Момент времени включается в себя дату + ссылку на базу данных. Именно по ссылке выполняется сортировка документов внутри одной секунды. Момент времени нельзя изменить или вычислить заранее.
Момент времени может быть создан программно на основании даты и ссылки на документ:
1 2 3 4 5 6 7 |
ТекДата = ТекущаяДатаСеанса(); //оба документа с одной датой и временем Приход1 = Документы.ПриходТовара.НайтиПоНомеру("000000001", ТекДата); Приход2 = Документы.ПриходТовара.НайтиПоНомеру("000000002", ТекДата); МоментВремени1 = Новый МоментВремени(ТекДата, Приход1); МоментВремени2 = Новый МоментВремени(ТекДата, Приход2); |
Два момента времени можно сравнить между собой:
1 2 3 4 5 6 7 8 |
РезультатСравнения = МоментВремени1.Сравнить(МоментВремени2); //-1 Если РезультатСравнения = 0 Тогда Сообщить("Равны"); ИначеЕсли РезультатСравнения = 1 Тогда Сообщить("Больше"); ИначеЕсли РезультатСравнения = -1 Тогда Сообщить("Меньше"); КонецЕсли; |
Для сравнения нужно вызвать метод Сравнить, а параметром передать момент времени с которым нужно сравнить. Если они равны, то результат будет равен нулю. Если текущий момент времени больше, то результат равен 1. Если меньше, то -1.
Находясь в модуле объекта документа можно получить его момент времени методом МоментВремени:
1 2 |
//в модуле объекта документа МоментВремениДока = МоментВремени(); |