1с 8 программное создание и проведение документа. Павел чистов. Хранение документов в информационной базе

Поводом для написания данной статьи послужила дискуссия на форуме Общий модуль: клиент и сервер о необходимости разработчика доработать типовую УТ 11.1 так, чтоб в момент проведения документа "Заказ клиента" выводилось диалоговое окно с вопросами для обновления информации на форме для изменения логики проведения документа. При попытке разобраться в необходимости такой меры на первое место встал методологический вопрос: почему нельзя провести подобное в клиент-серверном выполнении? А на самом деле нужно было задать вопрос: зачем нужно подобное уточнение в момент проведения документа. Конечно данная вещь запрещена средствами платформы 1С 8.3 и более ранних версий 8.2 где есть поддержка клиент-серверного режима работы. С сервера нельзя вызвать клиентскую процедуру.
В данной статье я решил использовать опыт разработки практически с "нуля" одной нетиповой торговой конфигурации, где ставилась задача обеспечить максимальную производительность при записи, проведении и отмены проведения документов.
При разработке собственных мелких конфигураций или при необходимости оптимизации таких громоздких как УТ 11.1, которая даже на мощных компьютерах при полностью включенном функционале начинает подтормаживать на любых действиях, не только при записи и проведении "массовых" документов: заказов клиентов, реализации товаров и услуг и прочих. Особенно это неприятно при выполнении регламентных операций по восстановлению последовательностей. Конечно, по данной теме есть множество статей, суть которых заключается (особенно это касается клиент-серверных вариантов) в переносе вычислительной нагрузки даже не на сервер приложений, а на SQL сервер, путем не только получения на нем данных из базы 1С, но и проведения там путем запросов математических вычислений с передачей готового результата (при необходимости) за один раз на сервер приложений для записи движений документа "одним пакетом". Ну или, в случае отказа от проведения, передачи некоторой информации на компьютер клиента для обновления информации в форме документа.
Конечно, это все очень важно и нужно, но есть еще одно узкое "бутылочное горло" это подход к самой методологии проведения документов. При сложных случаях во всей цепочке проведения необходимо знать: кто же в данный момент проводит документ человек или компьютер? Поясню на конкретном примере. Допустим есть маленькая конфигурация с несколькими документами и регистрами сведений и накопления. Из нашего примера это даже не маленький аналог УТ 11.1, а скорее очень упрощенная Розница. А вот функционал этой маленькой "розницы" не примитивное пробивание чеков и подготовка отчетов о розничных продажах, а более мощный. В крупных, территориально распределенных организациях бывают так называемые "номенклатурные войны" среди менеджеров: кто раньше всех успел оформить заказ клиента тот заработал больше. Имея номенклатуру в несколько сотен тысяч единиц в реале массово продается несколько десятков. Наподобие советского дефицита "товары повышенного спроса", которые к тому же нужно особым образом резервировать и по сложной логистической структуре доставлять до адресата - конечного покупателя. А есть товар, которого везде буквально завались и он никому не нужен:) А если для подобной системы требуется еще и получение сложной специализированной отчетности, то создание подобной системы учета "с нуля" оправданы.
Так как же добиться быстрого проведения документов? Нужны ли всегда все проверки при использовании файлового или клиент-серверного режима?
Предметная область конфигурации была следующей. Как уже упоминалось выше часть товара "повышенного спроса" приходится в реальном времени резервировать и анализировать свободные остатки. Остановимся на одном документе "Заказ покупателя". В подобной торговой конфигурации он имеет сложный алгоритм резервирования, заполнения и отображения предварительных результатов. Данные для такого документа не один раз приходится получать перед окончательным использованием из различных источников. Там присутствует первоначальная обработка в табличной части некоторой информации с пересылкой на сервер приложений, далее запрос данных на сервере базы данных SQL, дальнейший первоначальный расчет уже в другом запросе, затем возврат результата на сервер приложений, выгрузка в таблицы значений и далее опять обработка кодом в циклах (не все можно получить одним запросом).
А если подобная база должна работать в файловом режиме на 2-3 маломощных компьютерах? Как ускорить восстановление посделовательности и обмен данными?
Исходя из того, что при программной обработке и проведении документов нужно минимум проверок, а в большинстве случаев они должны вообще отсутствовать (как при обмене данными) мы выбрали два режима функционирования:
1. Документ проводился от руки человека (тут срабатывали интерактивные обработчики формы документа при котором максимум проверок по всевозможным вариантам);
2. Программное проведение (восстановление последовательности, обмен данными, внешнее подключение к базе, при котором программно можно все).
В первом случае, события управляемой формы ПередЗаписью(<Отказ>, <ПараметрыЗаписи>) и ПриЗаписи (Отказ) срабатывают только интерактивно (иначе кнопку провести "нажала рука пользователя"). И поскольку при "ручном" нажатии на кнопку можно не только провести (записать без проведения, можно отменить проведение, пометить на удаление), тут срабатывает куча системных обработчиков событий формы, объекта документа (еще не забудем про подписки на события, куда собственно и встраиваем функционал). В таком режиме на клиентской стороне можно использовать возможность задания вопросов пользователю до начала транзакции записи, обращаясь периодически на сервер для забора данных с целью "кто не успел, тот опоздал" проводить анализ данных и, главное что-то записывать в регистры. Дальше возвращаемся на клиент и снова можем задать вопрос, обновить форму и.т.д.
Самое главное, чтоб документ на сервере в момент проведения в процедуре ОбработкаПроведения() , "знал" кто его проводит человек или компьютер (конечно это сильно упрощенно, до этого момента вся серверная часть должна быть подготовлена обработчиками формы либо программными обработчиками второго режима. Обратимся к описанию обработчиков формы (использованы материалы статей :
Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)
Выполняется на клиенте!
Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию, предупредить о чём-либо, дать возможность отказаться и т.п.
Второй параметр этого обработчика «ПараметрыЗаписи» имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои.
Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно использовать. Например, при записи регистра сведений, надо сделать запись в другой регистр сведений старое значение ресурса. Можно передать старое значение в эти самые параметры и уже в ПриЗаписиНаСервере сделать запись в другой регистр.
Создадим тестовый пример. В тестовой конфигурации 8.3 будет один документ "заказ покупателя"

И посмотрим на обработчики объекта документа (в модуле документа). Далее создадим управляемую форму и посмотрим на список ее обработчиков

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

Проведение документов в 1С – это главное условие корректного учета всех денежных средств, товаров и услуг. Существует несколько способов провести документ в 1С. Это сделать можно при открытии списка документов. На рисунке показано, как в Расходных кассовых ордерах провести нужный документ или отменить проведение. Первая колонка показывает, проведен ли документ. Если на «пиктограмме» присутствует зеленая галочка, значит документ проведен. Для примера, у нас в списке один документ не проведен. Выбрав нужный расходный кассовый ордер правой кнопкой мыши, можно выбрать в меню «Провести» или «Отменить проведение».Как провести и распровести документ 1с

Провести документ в 1С Предприятие 8.2 можно и другими методами. Зайдя в нужный документ, вверху окна мы увидим кнопки с зеленой и красной стрелочкой. Первая отвечает за проведение, а вторая – за ее отмену. Также, провести и закрыть документ можно через кнопку «ОК».

Существует способ группового проведения документов в 1С. Для этого нужно воспользоваться групповой обработкой справочников и документов (Сервис – Универсальные обработки – Групповая обработка справочников и документов).

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

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

Теперь вы знаете, как провести документ в 1С Предприятие 8.2. Рекомендуем вам почитать статьи о регистрах накопления и регистрах сведений.

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


Жизнедеятельность любого предприятия не представляется возможным без регистрации различного рода событий, возникающих очень часто. Называются эти события - хозяйственные операции . Регистрацией хозяйственной операции в 1С служит документ.

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

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

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

Рассмотрим ключевое свойство "Дата" . В версии 7.7 оно называлось "ДатаДок" , в версии же 8 оно стало называться просто "Дата" . Это очень важное свойство документа. Почему это так? Рассмотрим ситуацию с торговой организацией, в которой осуществляется регистрация факта поступления товара и его продажи. Так вот продать товар, дата поступления которого больше даты продажи, не представляется возможным, потому как нельзя продать товар который еще не поступил.

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

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

Очень часто такой идентификации документа на временной оси оказывается недостаточно.

Представим ситуацию, когда на склад поступает 100 единиц товара 1-го числа месяца. Далее 2-го числа этого же месяца в 23:59:59 происходит его продажа, в количестве 80 единиц. Документ проводится без проблем, потому как товара хватает. Допустим, что также 2-го числа в 23:59:59 этот же товар еще кто-то тоже продает в количестве 50 единиц. Этот документ также проведется без проблем, потому как на время 23:59:59 этот товар есть. Хотя фактически у нас, по итогу проведения второго документа образуется отрицательный остаток в 30 единиц товара.

Чтобы таких ситуаций не возникало к дате и времени прибавляется еще и позиция документа, а именно его ссылка. Эта идентификация документа по дате и времени + ссылка называется момент времени . И при проведении второго документа система выдаст сообщение о нехватке 30 единиц товара и не позволит провести документ.

Как же получить момент времени? А получается он методом "МоментВремени" , принадлежащий классу "ДокументОбъект" . При этом возвращается тип данных "МоментВремени" .

Этот тип данных необходимо передавать в запросы, получающие остаток товара, в качестве параметра.

Пример получения момента времени:

&НаКлиенте Процедура ПолучитьМоментВремени(Команда) ПолучитьМоментВремениНаСервере(Объект. Ссылка) ; КонецПроцедуры &НаСервере Процедура ПолучитьМоментВремениНаСервере(Ссылка) Если Ссылка. Пустая() Тогда Сообщить("Документ не записан!" ) ; Возврат ; КонецЕсли ; ДокументОбъект = Ссылка. ПолучитьОбъект() ; МоментВремени = ДокументОбъект. МоментВремени() ; Сообщить(МоментВремени) ; КонецПроцедуры // ПолучитьМоментВремениНаСервере()

Установка времени документа

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


При оперативном проведении есть следующий нюанс. Если его дата равна текущей, время будет принимать значение текущего времени. Если бы документ проводился неоперативно, то только в момент его ввода присваивалась текущая отметка времени, а дальше она оставалась бы неизменной. Если же документ вводится не текущим числом, то первоначально присваивается нулевая отметка времени, а при записи присваивается самая последняя отметка за этот день. То есть система ищет последний введенный документ за этот день смотрит его время, увеличивает его на секунду и присваивает его нашему документу. Если создать документ на дату, в которой не вводился ни один документ данного вида (например поступление товаров), но были введены документы другого вида (например списание товаров), то система возьмет самую последнюю дату документа другого вида, прибавит к ней секунду и присвоит нашему документу. Если же создать документ с датой, в которой не вводился ни один документ, ни одного вида, то платформа присвоит ему время 12:00:00.

И еще ситуация. Представим себе, что у нас в базе есть документ с отметкой времени 23:59:59 и если прибавить еще одну секунду это уже будут следующие сутки. Поэтому система оставляет такое же время, то есть 23:59:59. Описанная выше система установки времени документа является лишь значением устанавливаемым по умолчанию. Но есть возможность переопределить такое поведение. Откроем в конфигураторе форму документа и обратимся к ее свойствам. В свойствах мы увидим поле "АвтоВремя" . Если мы в этом свойстве ничего не меняем, то формирование времени документа происходит так как это было описано выше. Но можно указать время: текущее или в начало дня, всегда первым, всегда последним и не использовать.

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

Возможность проведения

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

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

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

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

Документ может находится в трех состояниях:

  • Не помечен на удаление и не проведен;
  • Не помечен на удаление и проведен;
  • Помечен на удаление и не проведен.

Как уже отмечалось ранее, разработчик может самостоятельно добавлять необходимые реквизиты, а также табличные части. Каждая табличная часть имеет один стандартный реквизит - "НомерСтроки" .


Хранение документов в информационной базе

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

Нумерация документов

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

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

Префикс устанавливается в модуле объекта документа, в процедуре "ПриУстановкеНовогоНомера" .

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс) КонецПроцедуры

Также на вкладке "Нумерация" мы можем задать периодичность документа.

Возможные значения:
  • Непериодический;
  • В пределах года;
  • В пределах квартала;
  • В пределах месяца;
  • В пределах дня.
Обычно выбирают значение "в пределах года" , это означает, что в новом году нумерация документов начнется сначала.

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

Его необходимо указывать в поле "Нумератор" .

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

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

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

// Вставить содержимое обработчика. КонецПроцедуры

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

То, в какие регистры документ будет делать движения задается на вкладке "Движения" .

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

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

Права доступа на документы

В системе 1С существуют различные виды доступа. Это анализ интерактивных действий и анализ программных действий.

Что такое интерактивные действия? Это действия совершаемые непосредственно пользователем: нажатие кнопок, галок и т. д. Программные же действия совершаются каким-либо алгоритмом, о их совершении пользователь может и не догадываться.

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

Раздел "Роли" отображает все роли заведенные в информационной базе, для которых в разделе "Права" мы как раз и устанавливаем права доступа.

Возможные виды прав доступа:
  • чтение (программно), просмотр (интерактивно);
  • добавление (программно), интерактивное добавление (интерактивно);
  • изменение (программно), редактирование (интерактивно);
  • удаление (программно), интерактивное удаление (интерактивно);
  • проведение (программно), интерактивное проведение (интерактивно);
  • отмена проведения (программно), интерактивная отмена проведения (интерактивно);

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

Табличная часть документа

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