1С Без Воды. Документы
Сегодня рассмотрим такой объект метаданных как документ. Как я уже писал в предыдущем посте документ служит для отражения факта хозяйственной деятельности, какого-либо события в организации - продажи товаров, инвентаризации на складе, выдачи зарплаты и прочее. А еще документ можно записать, а можно провести. Про эти операции чуть подробнее будет когда мы будем изучать регистры, пока можно воспринимать это как то что запись это черновик документа а проведение это уже официальный документ с печатью и подписью. Для нашей конфигурации нужны 2 документа для учета доходов и расходов. Рассмотрим создание одного документа, второй будет аналогичен. В дереве объектов метаданных добавим новый документ. Если мы раскроем ветку документов увидим внутри 2 раздела - нумераторы и последовательности, до этих товарищей мы возможно дойдем в более подробных статьях на данном этапе не обращаем на них внимания, выделяем раздел - Документы и добавляем (клавиша Insert) новый документ. Будем отражать приход к нам денег и назовем документ так же - ПриходДенег.
Включим его в подсистему учет доходов.
Теперь подумаем какую информацию нам нужно вводить в этом документе. Ну естественно в первую очередь сумму, сколько всего денег к нам пришло. Добавим реквизит СуммаДокумента. Но для разнообразия мы добавим его не в окне мастера создания документа, его мы можем смело закрыть (наш документ никуда не исчезнет), а добавим мы реквизит в дереве объектов, раскроем плюсик нашего нового документа, выделим раздел реквизиты и добавим новый реквизит. Как я уже ранее писал реквизит это отдельное поле нашего документа, в нашем случае поле с суммой документа. Когда мы добавим реквизит то курсор переключится на Имя реквизита в палитре свойств, назовем наш реквизит.
В палитре свойств самое частое свойство которое нас будет интерисовать это Тип, здесь мы указываем какой тип данных будет содержаться в реквизите, нам нужно число, выберем его.
Помимо типа мы можем настроить непосредственно свойства этого типа, для числа это Длина и Точность. Длина это сколько всего может быть символов в числе, точность это количество знаков после запятой. Так как мы работаем с деньгами то установим точность 2 (про копейки думаю никому рассказывать не надо), а длину можем оставить 10 по умолчанию.
Теперь вы можете спросить а нафига мы в прошлый раз создавали справочники счета и статьи доходов и расходов? Мы же не будем чисто ради указания одной суммы разрабатывать наше приложение и документ для этого, нам нужно видеть конкретно откуда пришли денежки. В документе же мы должны иметь возможность указать несколько разных счетов и статей дохода, для этого существует табличная часть. То что находится в реквизитах можете представить как шапка документа, а табличная часть это таблица с произвольным количеством строк, вспомните например квитанции за ЖКХ там так же есть какие-то общие данные и есть таблицы. Давайте добавим табличную часть и назовем ее допустим - Деньги (ну или нафантазируйте свое название).
В таблице как вы помните есть строки и колонки, по строкам вопросов нет а вот чтобы добавить свои колонки существуют реквизиты табличной части. Давайте прикинем какие колонки нужны в нашей таблице. Мы хотим знать откуда пришли деньги и на какой счет. Поэтому состав колонок для нашей таблицы будет примерно такой - Счет, СтатьяДоходов, Сумма. Выделим нашу таблицу Деньги и добавим через правую кнопку мыши (Insert тут добавит только новую таблицу а не колонку) Реквизит табличной части.
Первый реквизит у нас будет Счет.
И вот тут важное замечание - нам нужно указать какой будет тип у данного реквизита и тип его будет наш справочник счета который мы создавали ранее. Выберем наш тип нажав на кнопку с 3мя точками в поле тип.
В 1С очень важно понимать какой тип у объекта с которым вы работаете. Так же в 1с есть такое понятие - типообразующие объекты. Это объекты при создании которых в нашем приложении появляется новый тип. Так вот справочники относятся к типообразующим объектам (документы тоже и другие объекты которые мы будем создавать в данном курсе). Грубо говоря типообразующим объект можно считать если его можно указать в качестве значения реквизита в другом объекте (на данном этапе пока такое понимание). СправочникСсылка же значит что мы указываем ссылку на какой-то выбранный в поле документа счет. Есть еще СправочникОбъект и ДокументОбъект но об этом мы поговорим позже, когда затронем такую тему как модели доступа к данным а конкретно объектную модель доступа. Сейчас можете запомнить что Ссылка позволяет только прочитать значения справочника или документа (или других объектов) а Объект позволяет эти значения изменять.
Давайте аналогичным образом добавим реквизит - СтатьяДоходов. Указав тип СправочникСсылка.СтатьиДоходов. Кстати после того как вы добавили хотя бы 1 реквизит табличной части выделив его вы уже далее можете добавлять новые просто нажатием клавиши Insert.
Ну и последний реквизит в табличной части который нам нужен это Сумма. Тип Число - длина 10 точность 2.
Итак у нас есть реквизит документа - СуммаДокумента и табличная часть с колонками (реквизитами табличной части) Счет, СтатьяДоходов и Сумма. Давайте применим изменения, можно нажать сначала F7 и согласиться с изменениями.
А можно нажать F5 что так же вызовет процедуру применения изменений конфигурации и после подтверждения откроет 1с в режиме предприятия. Давайте попробуем создать наш документ. Выберем раздел учет доходов и наш документ Приход денег.
Нажмем команду Создать, откроется форма создания нового документа.
Здесь мы видим поля Номер, Дата, Сумма документа и нашу табличную часть. Поля номер и дата мы не добавляли и как вы могли догадаться если помните прошлую статью это стандартные реквизиты документа. Они есть всегда. При наших текущих настройках дата у нового документа будет всегда подставляться текущая, номер будет автоматически генерироваться по возрастанию. Давайте добавим строку табличной части.
У нас еще нет ни одного счета и статьи доходов. Мы можем их создать открыв соответствующие справочники. А можем прямо на ходу при заполнении документа. Для этого пишем в поле счета название счета, ну например Карта. И нажимаем кнопку с плюсиком у всплывающего окна.
Открывается форма создания нового элемента справочника, в ней жмем Записать и закрыть (либо Ctrl+Enter, на будущее это сочетание всегда будет вызывать команду которая выполняется при нажатии желтой кнопки, желтая кнопка это основная команда). Код здесь заполнится автоматически по аналогии с полем Номер в документе.
Похожим образом давайте в поле Статья доходов добавим статью, например Зарплата.
Ну и последняя колонка указываем нужную сумму. Да я здесь ошибся, название колонки должно быть не Число а сумма.
Мы видим уже знакомую нам по конфигуратору звездочку в заголовке документа. Из чего мы можем понять что наш документ еще не записан (то есть еще нет даже черновика и документ не существует еще в нашей базе).
Ну и у нас еще есть поле Сумма документа которое нам тоже нужно заполнить
Вы спросите а нафига нам эту сумму заполнять в 2х местах? Но у нас ведь есть табличная часть где мы можем добавить еще одну строку и например указать счет Наличные, статью доходов указать например продажа. И тогда в поле сумма документа нам нужно будет указывать итог по колонке Сумма.
Ну и в поле сумма документа нам так же надо будет указать сумму полей всех строк табличной части. Удобно да? Нет. Почему бы нам не сделать так чтобы это поле заполнялось автоматически. Но для начала давайте запишем документ. Сейчас мы можем нажать и кнопку Провести и закрыть и записать, разницы для нас пока не будет. После записи или проведения документа мы увидим что у документа появился номер и записалась дата когда он начал создаваться.
Итак мы хотим чтобы поле СуммаДокумента автоматически рассчитывалось. Мы можем рассмотреть 2 варианта решения этой задачи. 1й это заполнение поля при нажатии кнопки записать или провести, 2й это при изменении поля Сумма в табличной части.
Рассмотрим 1й вариант. Но перед этим затронем такой термин как события. Мы ранее рассматривали процедуры и функции, так вот можете рассматривать события на данном этапе обучения как процедуры которые вызываются при совершении определенных действий пользователя - нажатия кнопок - записать, провести, так же при открытии документа, при его создании и прочих действий мышкой проще говоря. Для 1го варианта у нас есть такое событие как ПередЗаписью. Вообще при записи и проведении документа происходит много разных событий, но мы чтобы не запутаться пока остановимся на одном.
Еще один момент на котором надо остановиться это модуль. Код пишется в модулях что представляет из себя грубо говоря текстовый документ прикрепленный к какому либо свойству объектам. Про модули и их структуру мы поговорим чуть позже -какие они бывают а сейчас нам нужно знать что нам нужен модуль объекта нашего документа. Открыть этот модуль можно кликнув правой кнопкой мыши по нашему новому документу и выбрав Модуль объекта.
Откроется текстовый редактор где мы можем писать код. Код в таком модуле пишется только внутри каких-либо функций и исполняется он только при наступлении определенных событий. Нам нужно событие перед записью. Добавить шаблон для этого события можно выбрав его из определенного поля в верхнем меню.
После этого у нас появится код процедуры с определенным набором параметров и комментарием вместо которого мы можем написать свой код. Все что нам нужно это присвоить реквизиту СуммаДокумента итоговое значение по колонке Сумма из табличной части Деньги. Чтобы обратиться к реквизиту документа мы просто пишем его название - СуммаДокумента. А чтобы посчитать итоги табличной части есть специальный метод Итог(), в параметр которого передается имя колонки в виде строки по которой нужно посчитать итог.
Вот и весь код. Нажмем F5, так как у нас уже запущен режим предприятия то надо будет согласиться с запросом о перезапуске. А так как у нас изменилась конфигурация то так же согласиться с запросом об обновлении.
Откроем наш ранее созданный документ и попробуем например либо изменить сумму в строке либо добавить новую и записать документ. Мы увидим что значение в поле Сумма документа уже пересчитается само.
Но пользователи 1С бывает очень нетерпеливыми и если они не сразу видят результат своих действий (в нашем случае пересчет суммы документа) то паникуют. Поэтому рассмотрим вариант пересчета непосредственно сразу после изменения суммы в колонке табличной части. Для этой задачи нам уже необходимо создать форму документа. У формы есть уже свой модуль в котором мы будем писать код для пересчета суммы документа. Вернемся в конфигуратор выберем в дереве объектов раздел Форма и добавим новую. Увидим мастер создания новой формы, подробнее про тип формы и другие ее свойства мы разберем в более поздних статьях. Сейчас же нам достаточно текущих настроек по умолчанию поэтому жмем Готово
Открывается окно редактора нашей формы. Здесь так же все основано на событиях и наиболее популярные события это нажатия на различные команды и изменение полей. Для того чтобы нам добавить событие для колонки сумма мы можем кликнуть правой кнопкой мыши на поле сумма либо в верхней вкладке - Элементы, либо в нижней - Форма. Далее выберем пункт События - ПриИзменении.
Всплывет окно где нас спросят какие процедуры нам нужны, проще говоря - на клиенте создаст одну процедуру на клиенте, на клиенте и на сервере 2 процедуры, а фраза без контекста мы это так же разберем далее но пока воспринимайте это как то что на сервер не будут передаваться все данные формы которые показываются на клиенте. Оставим значение по умолчанию, жмем ОК.
Попадаем уже в модуль формы. У редактора формы есть 2 вида, это редактор непосредственно самой формы и редактор модуля формы. Переключение происходит при нажатии вкладок снизу.
Видим процедуру с надписью &НаКлиенте. Эта штука называется директива компиляции, пишется перед процедурой или функцией и начинается со знака амперсанда &. В нашем случае эта директива (можно перевести как приказ) говорит компилятору (программа которая преобразует наш код в команды понятные процессору компьютера) что эта процедура должна выполнять только на клиенте. Ну и собственно здесь нам надо по аналогии с кодом в модуле объекта присвоить сумме документа итог по колонке сумма. Здесь немного хитрее, напрямую написать СуммаДокумента мы уже не можем. Напрямую мы можем обращаться к реквизитам формы только. Если мы перейдем на вкладку Форма то в разделе реквизитов мы увидим только Объект.
Более подробно про реквизиты формы что это такое и почему это не реквизиты документа я расскажу в других постах, пока представьте себе что на форме связанной с документом есть реквизит Объект который представляет из себя полную копию данных документа, которую мы заполняем и потом при записи уже эти данные переносятся в сам документ. А то что мы видим на форме - поля номер, дата, сумма документа и табличную часть это все элементы формы. Элементы формы показывают значения реквизитов формы которые представляют из себя уже копию связанного с формой документа. Итак Объект это копия открытого документа и если мы раскроем плюсик увидим уже внутри объекта нужный нам реквизит СуммаДокумента. Поэтому чтобы в модуле форму его заполнить нам нужно писать Объект.СуммаДокумента. А чтобы посчитать итог табличной части - Объект.Деньги.Итог("Сумма");
Применяем изменения и запускаем наш сеанс. Теперь если мы в табличной части изменим поле сумма после нажатия Enter в поле Сумма документа будет автоматический пересчет.
Итак, мы слегка познакомились с документом, с формой документа а так же затронули события в модуле объекта и в модуле формы документа. Кому статьи мало можете попробовать аналогичным образом создать документ для учета расходов. Большое всем спасибо за отклик на статьи. Далее мы коснемся регистров накопления где все таки будет немножко воды, нам нужно понять нафига нам эти регистры если у нас есть документы. Всем спасибо.
















































































































































