Программирование 1С. Урок 2

Ссылка на эту мою статью в Дзене: https://dzen.ru/media/elvinto/programmirovanie-1s-urok-2-65151ce8a4ed063b0afa9d35

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

Давайте начнём. Нам нужен документ, который отражал поступление наших активов. Делать его будем сразу не таким простым как справочник, а чтобы всё было правильно.

Кликнем правой кнопкой по объекту метаданных “Документы”, создадим новый тип документа и дадим ему наименование “ПоступлениеТоваровУслуг”. Сразу здесь хочу сказать, что слово “Товары” здесь не совсем корректно, с точки зрения фирмы, товары – это имущество предназначенное для перепродажи. Для нас же товары – это имущество, которое мы купили, но перепродать не сможем, т.к. закон не предусматривает чтобы физическое лицо (обычный человек, не фирма и не индивидуальный предприниматель) что-то покупал и перепродавал. Но будем всё равно называть это товарами. Услуги тоже к нам будут поступать. Например, вызов сантехника – это на самом деле в деятельности организации поступление услуг, т.к. он окажет нам услуги по ремонту, а мы заплатим ему за это деньги. Отличие от товара в том, что при поступлении услуг не формируется материального остатка (если мы купили 5 кусков мыла, они лежат на полке и их можно всегда пересчитать, если мы 5 раз вызвали сантехника, то мы не можем материально это пересчитать, на полке ничего не лежит, а вода в кране либо идет, либо нет, хоть 10 раз его вызови)) ). Итак, вот он наш документ:

Перейдите теперь во вкладку “Нумерация” и тоже укажите, что номер будет числом (похожее мы делали и для справочников, только там был код и находился во вкладке “Данные”):

Вникать в смысл других полей пока рано. Нажмите “Закрыть” и обратите внимание на дерево метаданных. Раскройте знаком “+” наш новый тип документов “ПоступлениеТоваровУслуг”:

Каждый документ состоит из нескольких составных частей:

  • Реквизиты
  • Табличные части
  • Формы
  • Команды
  • Макеты

Прежде чем это объяснять, давайте обновим нашу конфигурацию, как это делали на прошлом уроке, и после этого запусти её, у нас появился новый тип объекта:

Кликните по нему и попробуйте создать новый:

Посмотрите, документ мы делаем чтобы вносить поступающие к нам товары и услуги, но извините, а куда их тут вносить? Тут только номер и дата, больше что-то вносить физически некуда. Конечно, это так. Для того чтобы вносить ещё другие данные, кроме номера и даты, нужны реквизиты и табличные части. Закроем рабочую среду и возвратимся к конфигуратору. Добавим две новых табличных части. Для это кликните правой кнопкой по соответствующему разделу:

Укажите имя табличной части как “Товары”, для этого тоже правой кнопкой вызываем её свойства:

После этого появится знакомое с прошлого урока окно, где меняем наименование объекта по всем правилам:

Сделайте тоже самое и с табличной частью “Услуги”. В результате должно получиться так:

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

Дайти имя этому реквизиту “Товар” в окне свойств:

Теперь нужно правильно задать тип этого реквизита, для этого напротив атрибута “Тип” справа кликните по многоточию. Откроется окно следующего вида:

Раскройте иерархию “СправочникСсылка” и поставьте флажок напротив “Бытовая техника”, далее нажмите “ОК”:

Теперь тип реквизита стал таким:

Давайте обновим конфигурацию и снова перезайдем в 1С, попробуем снова создать новый документ:

Теперь документ приобрел две вкладки с табличными частями и туда уже что-то можно вносить. Попробуем добавить в табличную часть “Товары” новую строку:

Значит так, что сейчас происходит…Вы кликнули по кнопке “Добавить”, программа поняла, что сейчас будет добавление строк в табличную часть. Увидела, что в табличной части первая после номера строки колонка является справочником (мы ведь именно это и указали, когда только что выбирали тип реквизита “Товар”). Что-то другое ввести в этот реквизит физически не получится, т.к. мы сделали жёсткую привязку типа и сказали, что сюда можно только выбирать что-то из конкретного справочника “Бытовая техника”. Вот программа сразу и выкинула нам окно, мол хотим мы создать прямо отсюда новый элемент справочника “Бытовая техника” или нужно “Показать все” элементы и выбрать из существующих. Пусть покажет все:

Ага! Я помню – на прошлом уроке вводил данные этого справочника, и теперь я выберу по очереди их всех, т.к. всё это я некогда покупал. Я не помню даты, когда это было, по этому буду вносить сегодняшней датой в одном документе. Если бы я всё же поднял все чеки и хотел бы внести строго когда это происходило, то мне потребовалось бы внести 4 отдельных документа на каждую покупку и просто указать в документе соответствующую дату.

Нажмите либо “Провести и закрыть”, либо “Записать”, либо “Провести”, все эти кнопки запишут документ. Здесь сразу нужно остановиться на терминологии. Слово “Провести” (от слова “провОдки”) идёт ещё с времён до появления 1С. Дело в том, что документ в фирме можно зарегистрировать в два этапа. Первый – это когда он создан, но не участвует в учете хозяйственной деятельности компании, в том смысле, что его сделали, например, на бумаге, но бухгалтер чувствует, что его ещё нужно проверить несколько раз, а потом уже ставить на нём печать и свою подпись. Приходит начальник спрашивает, где этот документ, бухгалтер показывает, мол вот он сделан, но ещё проверяю, не могу пока печать поставить и подписать, ответственность всё-таки. Так же и в программе 1С – документ можно создать, но не подписать (не провести по учету). По этому все эти кнопки записывают документ, но проводят по учету только кнопки “Провести” или “Провести и закрыть”. Нажмите провести и закрыть, должно получиться так:

У нас появился первый документ по хозяйственной деятельности, который учитывает приход бытовой техники. Но погоди-ка, автор! – скажите вы,- А где сумму-то вносить за сколько купили? Кликните дважды по этой строке документа и оно вновь откроется. Поглядим и убедимся, что сумму действительно вносить физически некуда, но кто-то возможно уже догадался,- правильно, нужно добавить ещё реквизит в табличную часть. Давайте это сделаем. Закройте рабочую среду и вновь вернёмся к конфигуратору. Добавить в табличную часть товары ещё реквизит, назовите его “Цена”:

Тип этого реквизита будет уже не какой-то там справочник, а число, ведь цена – это числовое значение. Измените тип (кликнув по тому же многоточию) на число, и сразу же укажите, сколько знаков будет после запятой (это учет копеек, по этому нужно выбрать 2 знака после запятой):

Если хотите, можно также поставить тут же флажок “Неотрицательное”, т.к. невозможно что-то купить в магазине, скажем, за минус двадцать рублей, это типа подходишь к продавцу, ну-ка отвесь мне свои просроченные яблоки, да приплати мне 20 рублей, что вообще что-то беру))). Тут сразу заинтересуется либо люди в синей форме, либо в белых халатах))). Ну ладно, норм, должно получиться так:

Снова перезайдем в рабочую среду 1С, откроем наш созданный документ и посмотрим что изменилось:

Ну вот, совсем другое дело. Появилась колонка с ценой, в которую можно вводить значение. Однако, если говорить не просто о документе домашнего бюджета, а предположить, что у нас тут целая фирма, то регистрация только цены – это только половина дела. Дело в том, что редко кто в фирме закупает товаров по одной штуке. По этому нужны ещё колонки с количеством и общей суммой. Ну вот мало ли мы захотим купить одинаковых чайников или утюгов для себя, для брата, для свата. Знаете ведь как те же новогодние подарки делаются, купят всем 20 кружек для кваса и рады, что подарки сделали)))…Вот и мы тоже сделаем всё правильно, добавим ещё две колонки с типом число – “количество” и “сумма”, предварительно закрыв рабочую среду и вновь возвратившись в конфигуратор. Я не буду наверно больше акцентировать внимание на том, что нужно закрыть рабочую среду, а возвратиться к конфигуратору, т.к. это должно быть уже понятно, что просто изменив что-то в конфигураторе и не закрыв рабочую среду, то в ней само ничего не появится. Нужно перезайти в 1С для того чтобы изменения вступили в силу (да, и не забудьте перед выходом сохранить документ, а то введенные суммы не сохранятся)… Количество бытовой техники не может быть дробным, мы не можем купить половину телевизора, по этому оставим его целым (с точность 0), а вот сумма будет аналогично цене – точность 2 знака. В результате получится как-то так:

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

Ты-ы-ы-кс, ну что-то тут всё равно не то. Вообще-то мы ожидали, что после введения цены или количества, сумма будет считаться сама. Нам что теперь вызывать калькулятор и считать самим??? Вот, если бы нельзя было бы это считать средствами 1С, то он был бы ещё хуже того же Экселя. Только нужно ему правильно объяснить когда что считать и по какой формуле. Настала теперь очередь учить программирование. Но не всё так просто. Дело в том, что сейчас 1С отображает наш документ автоматически. Правильно сказать, отображает форму нашего документа автоматически. Да, и справочники и документы и ещё много объектов метаданных подразумевают два вида отображения форм – автоматически и не автоматически (созданные программистом). Нам нужно как-то встроить сюда формулу расчета суммы, по этому автоматическая форма никак не знает что это будет за формула и в какой момент её считать, а считать её надо тоже не постоянно и не непрерывно, а только когда мы меняем цену или количество. По этому в конфигураторе кликнем правой (опять-таки) кнопкой мыши по разделу “Формы” и добавим новую:

В появившимся окне оставим всё без изменения, т.к. при создании первой формы документ, 1С понимает, что скорее всего мы хотим сделать – это создать “Форму документа”, а не списка или выбора (об этих позже):

После нажатие на “Готово” получаем форму:

Тут открылось нереально много всего, но знать всё это прямо сейчас совершенно не нужно. Найдите в левом дереве иерархии элемент отвечающий за колонку с ценой и кликните по ней одним щелчком по левой кнопке мыши. После этого в разделе свойств идём в самый низ и находим событие “При изменении”. Кликните в нём по увеличительному стеклу:

Появится окно отвечающее за это событие:

Пока тут ничего не меняйте, а просто нажмите “ОК”, после чего откроется модуль формы. Измените содержимое метода вот так:

Перезапустите 1С, в документе попробуйте изменить сумму (можно просто ввести её заново) и нажмите на “Enter”. В результате получится как-то так:

Да, программа сама рассчитала сумму по формуле Количество * Цена.

Давайте теперь разберем что мы собственно сделали, что так программа стала работать.

Началось всё с того, что мы выбрали свойства элемента формы “Цена”. Потом мы указали процедуру для выполнения события “ПриИзменении”, тем самым сказали программе, что теперь мы будем отслеживать, не изменил ли пользователь это поле с ценой, и если измение произошло, то вызвать программный метод, который будет что-то делать. А что он будет делать? Он сначала командой

Стр = Элементы.Товары.ТекущиеДанные;

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

Если вы раньше вообще ни на чём никогда не программировали и вообще не знаете что тут происходит, первый раз видите программу, то извините, вам нужно сейчас отвлечься от освоения 1С и перейти к моим статьям “Начало программирование вообще с нуля” для ознакомления специфики написания программ ТУТ.

Если вы раньше всё же программировали или вернулись к этому разделу почитав указанные выше статьи, то вам уже становится понятно, что Стр – это объект данных, в данном случае объект строки (класс строки), имеющий переменные Сумма, Цена и Количество, и мы просто обращаемся к этим переменным. Сами же объекты Элементы, Товары и ТекущиеДанные – это иерархия. Т.е. родительский класс Элементы. В этом классе есть переменная Товары (отражение нашей табличной части “Товары”), у этого элемента Товары есть переменная ТекущиеДанные, которая хранит в себе строку пользовательского интерфейса, где сейчас пользователь что-то делает. Соответственно, у класса Элементы есть и табличная часть “Услуги”, которая хотя сейчас и не содержит ни одного реквизита, но как переменная объекта всё же есть. Тут же в объекте Элементы, содержатся и все остальные реквизиты нашего документа отображаемые на форме. Тут главное запомнить, что корневой объект “Элементы”, а когда вы начнёте в нем что-то выбирать (после ввода точки), будет вот так:

Т.е. программа 1С подсказывает что вы хотите выбрать в этом объекте “Элементы”. Если вернуться из модуля снова к графическому представлению:

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

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

И код тоже добавить:

Теперь обратим внимание, что код для изменения количества и цены совершенно одинаковый и делает одно и тоже. В таких случаях код принято выделять в отдельный метод (а по правилам языка 1С – в отдельные процедуры и функции). Сделаем как надо:

Перезапустим 1С и проверим, что сумма пересчитывается и при изменении цены и при изменении количества:

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

Это будет тоже число с точность 2 знака:

Для того чтобы найти эту общую сумму, нужно при том же изменении и расчете суммы по строке, найти и общую сумму:

Теперь остался один штрих. Форма-то у нас уже не автоматическая, по этому вывод всех новых реквизитов на форму программист должен делать сам. По этому открываем снова графическое представление формы и просто перетаскиваем этот наш реквизит с общей суммой из правой части влевую на нужное место, например, после даты. Делается это по методу Drag&Drop (зажимаем на нём левую кнопку мыши, тянем, а потом в нужном месте отпускаем кнопку – “потянуть и бросить”):

Получается так:

Но погодите! Не перед датой, после даты! Кликаем по специальным кнопкам порядка чтобы расположить реквизит:

В результате получили так:

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

Она стала пересчитываться.

Задание по уроку:

1. Сделайте аналогичную табличную часть для услуг, но только без количества

2. Сделайте подобно документ поступления мелочевки.

3. Добавьте в документы реквизит с типом “Домочадцы”, чтобы документ хранил информацию о том, кто из них сделал эту покупку. Ведь документ 1С также как и обычный бумажный документ должен отражать какую-то сделку или элемент хозяйственной деятельности, и важно понимать кто её совершил.

Если всё получилось как нужно – молодцы! Если нет, давайте разберёмся что не так.

Урок 1 Урок 3

El Vinto, 2023 (Copyright)

Добавить комментарий