Java Android. Урок 7 (“Списки”)

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

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

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

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

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

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-2

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

public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
ArrayList<RecycleElement> recycleElements;

private Context context;
private LayoutInflater inflater;

class ViewHolder extends RecyclerView.ViewHolder {
private TextView bulls;
private TextView number;
private TextView cows;

public ViewHolder(View itemView) {
super(itemView);

bulls = (TextView) itemView.findViewById(R.id.textViewBulls);
number = (TextView) itemView.findViewById(R.id.textViewBCNumber);
cows = (TextView) itemView.findViewById(R.id.textViewCows);
}
}

RecyclerViewAdapter(Context context, ArrayList<RecycleElement> recycleElements) {
this.context = context;
this.inflater = LayoutInflater.from(context);
this.recycleElements = recycleElements;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = inflater.inflate(R.layout.recycleelement_bc, parent, false);

return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
RecycleElement recycleElement = recycleElements.get(position);

String bulls = “”;
String cows = “”;

if (recycleElement.bulls == 1) {
bulls = “1 бык”;
else if (recycleElement.bulls > 1) {
bulls = “”+recycleElement.bulls+” быка”;
}

if (recycleElement.cows == 1) {
cows = “1 корова”;
else if (recycleElement.cows > 1) {
cows = “”+recycleElement.cows+” коровы”;
}

holder.bulls.setText(bulls);
holder.number.setText(recycleElement.number);
holder.cows.setText(cows);
}

@Override
public int getItemCount() {
return recycleElements.size();
}
}

В этом коде, возможно, вам покажется всё сложным, по этому пока особо не вникайте в некоторые конструкции языка, чуть позже всё это разберем. Сейчас остановимся на некоторых моментах. Это класс RecyclerViewAdapter, который мы создаём, наследуется от стандартного RecyclerView с той целью, чтобы могли взять некоторые части управления на себя, а именно – формирование каждого элемента списка из макета (аналогично active_main.xml для формирования пользовательского интерфейса). За формирование отображение отвечает специальный функционал inflater. В качестве одного из параметров ему передаётся ресурс с xml, который и хранит в себе набор элементов пользовательского интерфейса для каждого элемента списка. В данном случае это ресурс R.layout.recycleelement_bc. Добавьте его к проекту следующим образом. Кликните правой кнопкой мыши по папке res и выберите следующий пункт контекстного меню:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-3

Дайте ему имя recycleelement_bc в поле “Layout File Name”. После этого будет создан новый файл проекта и он появится в уже знакомой вкладке; перейдем в ней сразу в подвкладку Code:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-4

Замените находящейся в ней XML на следующий:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-5

Заметьте, что у элементов появились незнакомые атрибуты:

  • gravity – указывает к какому краю TextView будет прислоняться находящийся внутри текст. “end|center_vertical” указывает что одновременно по концу текста (в данном случае по правому краю) по горизонтали и по центру по вертикали.
  • layout_margin – указывает, что между краями TextView и самим текстом должен быть отступ со всех 4-х сторон равный 4 условные единицы (это чтобы текст одного TextView визуально не примыкал вплотную к тексту другого TextView или иного элемента.

Тут есть ещё одна особенность. Раньше значения параметра gravity были не start и end (начало и конец), а назывались left и right (лево и право). Но потом почему-то называние было изменено. Найти где-то конкретное описание этому изменению мне не удалось, но полагаю связано это с тем, что письменность в некоторых иностранных языках идет не слева-направо, а справа-налево, как например, в арабском. Я думаю, новые значения параметров сделаны как раз для адаптации к этому, что бы в зависимости от языка не приходилось менять left-right местами вручную. Как понимаете, на форумах можно найти по прежнему старые варианты значений.

Теперь вновь возвратимся к классу RecyclerViewAdapter. Заметьте ещё одну интересную конструкцию:

ArrayList<RecycleElement> recycleElements;

В Java Android есть массивы, вы их уже видели, но есть и ещё один похожий объект – ArrayList. Особой разницы между ними нет, кроме того, что массив заранее имеет определенный размер, а ArrayList динамически может менять размер. Т.е. если бы в данном случае мы захотели использовать массив, он выглядел бы как-то так:

RecycleElement recycleElements[ТутКакоетоЧислоЭлементов];

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

Массив:

  • Высокая производительность
  • Большой расход памяти

ArrayList:

  • Низкая производительность
  • Низкий расход памяти

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

Далее, метод onBindViewHolder в этом нашем классе списка – это имплементация (реализация) базового класса, которую, как мы помним, нужно делать всегда. Этот метод как раз отвечает за вывод на экран каждого элемента списка буквально перед самим его выводом. По этому мы можем кое что поменять и заполнить элементы списка так, как нам нужно. В качестве одно из параметров этого метода выступает целочисленный параметр position, в котором система сообщает какой именно сейчас выводится элемент списка. И вот как раз мы в этот момент берём данные этого элемента из нашего ArrayList, немного модифицируем и выводим в нужные элементы элемента списка (извините за тавтологию).

Взять элемент по текущей позиции:

RecycleElement recycleElement = recycleElements.get(position);

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

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-6

Запихнуть нужный текст в нужный элемент:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-7

Теперь давайте разберемся, откуда программа знает что такое вот это:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-8

Это мы объявили и проинициализировали в нашем классе чуть ранее:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-9

В параметр itemView системой будет передан как раз тот набор элементов, которые мы описали в файле recycleelement_bc.xml. По этому мы должны уже знакомой функцией findViewById() искать не в activity_main или где-то ещё, а именно в нашем recycleelement_bc.xml, ведь его мы тоже передали нашему списку, если помните, вот тут:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-10

Теперь осталось только правильно объявиться и все переменные и список будет готов. Объявите три переменные классе MainActivity:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-11

Да, всё правильно, если вы заметили recycleElements мы уже объявляли, но внутри нашего класса списка и без инициализации, здесь инициализацию (new ArrayList() ) важна, без неё не заработает.

Далее в метод onCreate() добавьте код:

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-12

recyclerView – будет хранить в себе элемент пользовательского интерфейса – список; вспомните файл activity_main.xml. Создайте для него менеджер LinearLayoutManager как показано, это тоже необходимо, иначе список не будет обновляться.

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

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-13

Первый был Context (к которому компилятор автоматически привёл наш this, а второй – список ArrayList).

Далее выполняем:

recyclerView.setAdapter(recyclerViewAdapter);

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

Следующая команда

recyclerViewAdapter.notifyDataSetChanged();

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

Теперь измените немного код обработки кнопки ввода числа в методе onClick():

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-14

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

Напоминаю, что на наших уроках мы разрабатывает приложение - логическую игру "Быки и коровы". На прошлом уроке мы остановились перед тем, как начать знакомиться с таким функционалом, как списки.-15

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

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

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

3. Самостоятельно разберитесь с тем, как правильно получить размер списка ArrayList, как его очистить. Сделайте так, что если игрок совершил 12 попыток и не смог угадать число, то он проиграл, а на экран будет выведена соответствующая надпись при помощи Toast, и игра начнётся заново.

4. Вопрос “на засыпку”. Почему для правил русского языка я сделал только варианты “1 бык”, а если больше единицы, то окончание “-а” в слове “быка”, ну типа 2 быка, 3 быка, почему я не сделал ещё, ведь правильно говорить “5 быкОВ”, “6 быкОВ”, почему нет такого варианта? Также и с коровами.

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

Урок 6 Урок 8

El Vinto, 2023 (Copyright)

Java Android. Урок 8 (“Новый Активити”)

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

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

Дайте название RulesActivity.

Теперь перейдите в манифест (это мы уже делали) и добавьте портретный режим тоже и для этого нового Активити:

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-2

В дереве проекта выберите ресурс с описанием пользовательского интерфейса этого Активити и откройте уже известную подвкладку “Code”:

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-3

Видим, что пока здесь только корневой контейнер. Теперь сюда нужно добавить TextView с описанием нашей игры. Однако, не всё так просто. Как понимаете, объем описания зависит только от ваших возможностей и возможно вы захотите описать всё в мельчайших деталях, а заодно и включить туда какую-то контактную информацию о себе, мол куда обращаться, если что не понятно или нашлись какие-то ошибки в процессе игры. Этот текст может оказать таким, что будет намного превышать размеры экрана. В этом случае пользователь увидит только текст, который вместился у него на устройстве. Это плохо. По этому, когда возникает подобная ситуация и что-то на экране гарантированно может не уместиться, используют такой контейнер как ScrollView. Если помните, до этого мы использовали только контейнер ConstraintLayout. Вернёмся в подвкладку “Design”. Найдите ScrollView в дереве элементов и добавьте его в описание представления:

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-4

Вернитесь в подвкладку “Code”. Код теперь может выглядеть так:

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-5

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

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-6

Теперь внутрь можно уже что-то поместить:

<ScrollView
android:layout_width=”match_parent”
android:layout_height=”0dp”
android:orientation=”vertical”
app:layout_constraintEnd_toEndOf=”parent”
app:layout_constraintStart_toStartOf=”parent”
app:layout_constraintTop_toBottomOf=”@+id/textViewTitle”>

<TextView
android:id=”@+id/textView”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_margin=”5dp”
android:textSize=”16sp”
android:text=”Компьютер загадывает число из 4 разных цифр. Цель игры – делая попытки, узнать это число. Совершить попытку можно только если заполнены все четыре разряда (после этого появится справа внизу соответствующая кнопка). После каждой попытки компьютер будет сообщать сколько в указанном вами числе быков и коров. Корова – это когда в вашем варианте есть цифра, которая присутвтвует в загаданном, но не соответствуют разряду (позиции), бык – это когда в вашем варианте есть цифра и она также находится в правильном разряде. Получается, что игрок выигрывает когда в его варианте оказывает четыре быка. Например, компьютер загадал вариант 1234, а вы предлагаете вариант 4235. В этом случае будет два быка – цифры 2 и 3, т.к. они есть в загадонном и расположены в таких же разрядах, и одна корова – цифра 4, т.к. она тоже есть, но находится не на своём месте; цифра 5 в вашем варианте отсутствует в загаданном, по этому это и не бык и не корова.”
app:layout_constraintEnd_toEndOf=”parent”
app:layout_constraintStart_toStartOf=”parent”
app:layout_constraintTop_toTopOf=”parent” />
</ScrollView>

Теперь нужно только добавить в обработчик нажатия соответствующей кнопки нужный код, и всё готово для отображения вашей подсказки:

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-7

Перезапустите приложение и кликните по кнопке со знаком вопроса (кнопке отвечающей за вывод подсказки):

Продолжим разрабатывать наше приложение-игру "Быки и коровы". Нам осталось сделать совсем немного. Сама игра уже сделана, работает, но не хватает только нескольких улучшений. Начнем с простого.-8

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

1. Сделайте заготовку для нового Активити, который будет запускаться при старте программы. Назовите его PreActivity. Добавьте на него текст с названием игры, картинкой игры и какой-нибудь информацией о вас как о разработчике. Добавьте на него кнопку “Продолжить”, по нажатию которой будет осуществлён переход в саму игру (в Активити MainActivity).

2. Самостоятельно погуглите назначение диалоговых окон в Андроид, чтобы иметь преставление как они выглядят и для чего нужны (более подробно будем рассматривать на следующем уроке).

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

Урок 7 Урок 9

El Vinto, 2023 (Copyright)

Java Android. Урок 9 (“Диалог”)

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

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

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

Добавим внутрь нашего класса MainActivity следующий код:

DialogData dialogData;
public static class DialogData {
public AlertDialog.Builder alertDialogBuilder null;
public AlertDialog alertDialog null;
public TextView textViewButtonNewGame;
public Context context;
public static DialogData CreateDialog(Context context) {
DialogData dialogDataYesNo = new DialogData();

dialogDataYesNo.context = context;

View promptsViewYesNo = LayoutInflater.from(context).inflate(R.layout.dialog_endgamenull);

dialogDataYesNo.alertDialogBuilder new AlertDialog.Builder(context);
dialogDataYesNo.alertDialogBuilder.setView(promptsViewYesNo);

dialogDataYesNo.textViewButtonNewGame = promptsViewYesNo.findViewById(R.id.buttonNewGame);

dialogDataYesNo.textViewButtonNewGame.setOnClickListener((View.OnClickListener) context);

dialogDataYesNo.alertDialogBuilder
.setCancelable(false).setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
((MainActivity) context).dialogButtonNewGame();
}
});

dialogDataYesNo.alertDialog = dialogDataYesNo.alertDialogBuilder.create();

return dialogDataYesNo;
}
}

В результате получится, что один класс (DialogData) расположен внутри другого класса (MainActivity). Также объявим сразу же переменную класса MainActivity, которая будет хранить экземпляр класса DialogData:

DialogData dialogData;

Теперь нужно добавить новый layout (мы это уже делали), дайте ему аналогичное имя dialog_endgame:

Продолжаем разработку нашего первого приложения на Андроид. На этом уроке займемся таким необходимым функционалом, как отображение диалоговых окон.-2

Содержание его будет крайне простое, нужно просто разместить заголовок со словом “УГАДАЛ!” и кнопку для начало новой игры:

Продолжаем разработку нашего первого приложения на Андроид. На этом уроке займемся таким необходимым функционалом, как отображение диалоговых окон.-3

В метод onCreate не забудьте добавить создание экземпляра диалогового окна и его инициализацию, кстати, заметьте, если вы захотите менять текст элементов, то делать это нужно будет примерно так, т.к. экземпляр элемента объявлен не в основном классе MainActivity, а в классе DialogData:

В данном случае я просто меняю текст кнопки, хотя мог это сделать и в описании xml. Но из кода текст при необходимости можно менять динамически.

В данном случае я просто меняю текст кнопки, хотя мог это сделать и в описании xml. Но из кода текст при необходимости можно менять динамически.

Теперь нужно разместить код отображения диалогового окна, если игрок угадал число (Toast который там был, уже не нужен):

Продолжаем разработку нашего первого приложения на Андроид. На этом уроке займемся таким необходимым функционалом, как отображение диалоговых окон.-5

И теперь остался последний штрих – обработать нажатие на кнопку “Ещё играть”. Добавьте этот метод куда-нибудь внутрь класса MainActivity, я разместил его сразу за классом DialogData, хотя можно было и более аккуратно – после всех методов:

Продолжаем разработку нашего первого приложения на Андроид. На этом уроке займемся таким необходимым функционалом, как отображение диалоговых окон.-6

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

dialogData.alertDialog.cancel();

Тут надо отметить, что диалоговое окно может вообще открываться в двух режимах – закрываемое и незакрываемое. Этот режим мы выбрали тут:

Продолжаем разработку нашего первого приложения на Андроид. На этом уроке займемся таким необходимым функционалом, как отображение диалоговых окон.-7

Обычно, если пользователь ткнет пальцем по экрану мимо окна, то оно закроется, это получается, когда setCancelable(true), в ином случае, хоть пользовать затыкается по экрану, окно так и будет оставаться открытым, закрыть его можно будет только программным путём через код, либо принудительно завершить приложение. Нам нужно как раз сделать именно так, потому что если пользователь закроет без вызова метода dialogButtonNewGame то не будет ничего что начало бы новую игру. Пользователю останется только созерцать на результат предыдущей. Это нехорошо, вряд ли это не начнёт бесить даже самого выдержанного))). По этому нужно стремиться делать так, чтобы пользователю всё нравилось.

Ещё один момент касаемый обработки вызова нажатия кнопки диалогового окна. Начинает он отсюда:

Продолжаем разработку нашего первого приложения на Андроид. На этом уроке займемся таким необходимым функционалом, как отображение диалоговых окон.-8

Помните, как мы добавляли обработчик нажатия кнопок через имплементацию? Там мы указывали ключевое слово this и компилятор кидал вызов метода onClick в наш класс. Здесь мы делаем по другому. Переменной класса нет, по этому такой класс называется анонимным, а имплементация нужна в любом случае. Деть её некуда кроме как запихнуть прямо туда. Однако, управление нам нужно передать в основной класс каким-то образом, чтобы мы могли генерировать новый код игры, очистить список и т.п. По этому, если бы мы заранее не позаботились об этом при создании класса и не передали ему переменную context с указанием this на наш класс MainActivity, то сделать это было бы невозможным. Таким же образом, класс DialogData содержит context и “знает” куда передать. Тип можно было бы использовать и не Context, а объявить, например, MainActivity context, тогда бы приводить к типу ((MainActivity) context) не пришлось бы. Однако, это дело вкуса, и я стараюсь делать более универсальный метод и использовать Context там, где это возможно.

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

1. Разберитесь самостоятельно как программным путем (не по кнопке возврат) завершить работу Активити. Добавьте в диалоговое окно ещё одну кнопку “Выйти из игры”

2. Сделайте так чтобы при первом окончании игры надпись первой кнопки была “Ещё играть!”, а при следующих текст был бы “Может сыграем ещё?!”.

3. Попробуйте сделать так чтобы кнопка “Выйти из игры” случайным образом выводила один из вариантов текста: “Выйти из игры”, “Покинуть игру”, “Хватит, больше не хочу играть”, “Сыграю ещё потом”

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

Урок 8 Урок 10

El Vinto, 2023 (Copyright)

Java Android. Урок 10 (“Создание apk”)

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно. Для этого необходимо открыть основное меню Android Studio:

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

Сначала нужно выбрать тип пакета, пока это будет apk чтобы мы могли этот файл без проблем переместить в смартфон и так выполнить его установку:

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно.-2

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

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

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно.-3

Далее будет как-то так:

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно.-4

Укажите, что это релиз вашего приложения (готовый для публикации продукт) и нажмите Create:

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно.-5

После того как ваш ПК пошуршит диском, справа внизу будет выдано что-то вроде этого:

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно.-6

Теперь осталось только скопировать этот файл на ваш смартфон. Сам файл находится где-то вот тут (в папке вашего проекта):

Теперь, когда приложение готово и протестировано, пора его отправить в ваш мобильный телефон или планшет и проверить окончательно.-7

Т.е. внутри вашей пользовательской папки находится папка с проектами, затем внутри папки этого определенного проекта, а там ещё пройти пару папок и вот он app-release.apk.

Закинуть в смартфон можно несколькими способами, я это могу делать либо через Телеграмм – с компа отправляю файл в Избранное, а на телефоне из Изранного сохраняю в телефоне и кликаю этому файлу. Второй вариант – просто подключить кабель к ПК и закинуть непосредственно в телефон как на флешку.

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

Далее наслаждайтесь запуском и работой вашего первого приложения на Android!

Анализ публикации и монетизации на Дзене

На днях меня Дзен просит пройти небольшой опрос о том, оправдались ли мои ожидания после вступления с силу новый правил монетизации, которые были введены 1 августа 2023 года. Об этом событии Дзен сообщал заранее, и если помните, я взялся его проверить, правда ли так оно всё хорошо на самом деле. У меня был к тому времени уже опубликовано определенное количество статей, которые пользовались достаточно большой популярностью, но ввиду того, что Дзен предлагает пользователям “свежие” статьи с намного более высокой релевантностью, то читателей этих статей постепенно становилось всё меньше, т.к. мне с трудом верится, что активных интересующихся людей было всего 1000 человек на весь земной шар, они все всё сразу прочитали, и других больше не нашлось. Я решил проверить, что будет если я опубликую список этих же историй со ссылкой на них, дабы привлечь ещё читателей. По идее здесь можно было бы ожидать снова небольшой всплеск, а потом снова спад.

Никакого всплеска в результате не оказалось, а сам список прочитало за 2 месяца только 13 человек. Кстати, если вы просматривали этот список (не сами статьи, а именно этот список статей) за последние два месяца, поставьте пожалуйста здесь в комментах и в этой статье на Дзене (ссылка) +, интересно посмотреть статистику с ещё другой стороны. Тоже самое происходит и с другими статьями, все интересные темы (которые ещё полгода назад люди постоянно читали), стали резко неинтересными. Если вы блогер на Дзене, напишите как у вас обстоят дела с этим, заметили ли вы подобное у себя на канале. Я не хочу сказать, что тема моего канала невероятно какая популярная, а контент привлекателен и интересен, я просто следую логике и статистике, и если были в какой-то теме небольшие просмотры материала с какой-то периодичностью, то вряд ли резко они могли куда деться. Причём речь идет не о просмотре подписчиками, а вообще.

Я взял для анализа период с 1 декабря 2022 года по 28 февраля 2023 года:

Однако Дзен теперь отдельно от Яндекса и от его метрики, а метрика у меня была подключена почти с самого начала:

Можно сказать, что данные и тех и других примерно похожи и по форме и по количеству, одного порядка.

Топ моих страниц по данным Яндекс-метрики за этот период:

Это всё(!) страницы связанные с историями из моей личной жизни о программировании (кроме адреса самой страницы в Дзене и заметки о том сложно ли учиться на программиста). Подчеркиваю, что популярность некоторых статей очень высока (по меркам моего канала):

После включения нового метода монетизации, видать, включили и новые алгоритмы таргетирования. Напоминаю, новый метод Дзена – это берётся некоторая сумма денег, Дзен пишет, что это общий фонд полученный с рекламы и выделенный на оплату блогинга, делится между всеми авторами Дзена в пропорции соответствующей времени просмотра контента у каждого блогера. Соответственно, ту долю каждый блогер себе и забирает. Например, есть фонд 100 рублей, есть 10 блогеров, у одного блогера 910 минут просмотра, у 9 других – по 10 минут просмотров. Первый получает 91 руб дохода, а остальные – каждый по рублю. Таким образом теперь на Дзене так, на чьём канале большая пользователей “зависло” подольше, того и бапки. Дзен не будет определять, что у тебя на канале! Популярные фильмы, мульти-пультики, научные статьи, новости, короткие видео, различные челленджи, все делятся по времени наравне. И вот тут-то я и обратил внимание, что таргетирует, например, мне Дзен, когда я просматриваю его титульную страницу; напоминаю, мне, человеку с высшим образованием, интересущимся ардуинками, станками с числовым программным управлением, реактивными двигателями, делающему огромную кучу запросов по программированию на Java, 1C, C++ и т.п., вот что:

Значит, что тут есть:

  • Баба показывает профиль задницы – 45 тыс.просмотров
  • Баба снимает под платьем трусы и показывает это – почти 1 млн.просмотров
  • Баба в мини юбке показывает фигуру – почти 1 млн.просмотров
  • Молодая пигалица учит когда пользоваться гондонами – 280 тыс.просмотров
  • Быба пляшет аля калинка-малинка – 100 тыс. просмотров
  • Баба ходит туда сюда – 1.2 млн. просмотров
  • Баба показывает жопу – 70 тыс.просмотров

И вот я думаю, канал у меня технический, основные зрители – мужчины. А когда им смотреть мои уроки по программированию, читать статьи о программировании, да и вообще заходить на мой канал))))…У них просто на это не остаётся времени))))

Но речь о монетизации,- теперь можно сопоставить, например, с моими уроками по программированию на Java Android:

А что, неплохо – где-то около 40 просмотров, а Дзен пишет, что люди на них зависли в общей сложности на 2 часа (120 минут), и кстати, погодите, я заработал на этих 10 уроках по программированию примерно 80 копеек, хотя и потратил на составление этих уроков около 30 часов (1800 минут) своего личного времени! Интересно, а сколько заработала баба снимающая трусы в 1 минутном ролике? Общее времени просмотров этого ролика (грубо прикинув):

ОбщееВремя = 1 млн * 1 минута = 1 000 000 минут

Заработок = 1 000 000 минут / 120 минут * 0.8 руб. = 6666 руб.

Если она потратит также как и я для своих статей – 1800 минут на ролики по снятию трусов, то заработает на этом:

ЗаСнятиеТрусовЗа30часовРаботы = 6666 * 1800 = 12 млн.руб

Конечно, знатоки могут мне давать тут различные советы, но скажу сразу – трусы я снимать на камеру не буду ни за какие деньги (да там и смотреть особо не на что) ))), а вот к Дзену у меня самого много вопросов, какую политику он пропагандирует и скоро ли станет русским аналогом Тик-Тока со всей его “красотой”? )))

Так вот, когда меня Дзен стал опрашивать, оправдались ли мои ожидания от введенной 1 августа монетизации, я много чего ему интересного написал, вряд ли он вообще будет теперь таргетировать мой канал)))).

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

Ссылка на мою статью на Дзене: https://dzen.ru/media/elvinto/programmirovanie-1s-urok-1-650fc821e500226085ecaecc

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

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

  • Денежные средства на счетах и в наличности
  • Товары собственные, взятые на хранение, взятые под реализацию, их движение между складами, их хранение, закупка и реализация, операции регламентированные законом (учет молочной продукции, алкогольной продукции, кассовые операции в розничной торговле и т.п.)
  • Материалы и сырьё
  • Учет сотрудников организации, их заработная плата
  • Учет по налогам, их правильным начислениям и оплатам
  • Организационные документы, хранение приказов, распоряжений, контроль их выполнения
  • Отчетность в различных разрезах данных

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

Среда работы 1С состоит из двух основных частей:

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

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

Для программистов и системных администраторов основные первоначальными данными для программирования и обслуживания, которыми нужно владеть, это:

  • Версия платформы 1С
  • Версия каждой отдельной конфигурации 1С

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

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

Короткое введение в 1С закончено, пока этого должно быть достаточно.

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

  • Скачать бесплатно учебную Платформу тут: https://online.1c.ru/catalog/free/28765768/
  • Поговорить со знакомым программистом 1С чтобы он обеспечил удалённый доступ к средствам 1С.
  • Купить у какой-нибудь закрывающейся или неработающей фирмы продукт 1С вместе к лицензионными ключами.
  • Купить наиболее простую рабочую конфигурацию типа “Управление небольшой фирмой”.

Итак, после короткой вводной части, преступим к освоению программирования в среде 1С. Как я только что уже сказал – есть платформа и есть множество конфигураций. В освоении программирования 1С была бы большая трудность, если бы нам пришлось сейчас осваивать программирование в какой-нибудь существующей конфигурации. Однако, в среде 1С есть возможность создавать свои собственные конфигурации, вот именно это мы и будем делать. Но как я говорил ранее, 1С в основном предназначен для ведения деятельности какой-либо фирмы, но фирмы скорее всего, никакой у нас нет. Ничего в этом нет страшного, мы будем делать конфигурацию по учету нашего домашнего бюджета. Чем не фирма?- Есть денежные средства (поступления – зарплата, расходы – покупки, оплата инета, мобильной связи), есть материалы (еда, моющие средства, канцелярия), есть сырьё (полуфабрикаты, сырые продукты), есть активы (телевизор, холодильник и т.п.), есть сотрудники (наши домочадцы и мы сами), есть оказание услуг и работа (домашняя работа, уборка, готовка, стирка). Чем не фирма??? Вот и начнём адаптировать нашу домашнюю жизнь под работу организации, а заодно учить 1С и ещё сопряженные с этим технологии.

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

Сделайте выбор создания новой базы:

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

Далее даём название “Мой домашний бюджет” и выбор типа создания “На данном компьютере” (если конечно выбор типа вообще есть):

Путь можно оставить по-умолчанию или дать свой:

Тут оставить как есть и нажать “Готово”:

Теперь пора выбрать конфигурацию:

Конфигуратор откроется и теперь нужно открыть нашу конфигурацию. Делается это через главное меню:

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

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

  • Денежные средства, если конечно ваши домашние согласятся сообщать вам сколько у кого в кармане наличности и куда он потратил. По этому будем учёт вести с себя, и на собственном примере показывать как это эффективно делать
  • Учет продуктов питания
  • Учет мелких покупок типа канцелярии или зубной пасты, обновили новые тапки, приобрели вешалку для костюма…
  • Учет активов, которые делают жизнь комфортнее или лучше, а может просто участвуют в нашем досуге – телевизор, холодильник, пылесос и т.п.
  • Учет покупки услуг – вызвали электрика, сантехника и т.д.
  • Учет кредитов – взяли кредит, отдаём кредит, дали кому-то взаймы…
  • Готовимся встречать Новый год, планируем затраты, составляем меню, будут гости, подарки, выделяем денежные средства на представительские расходы)))
  • Учитываем доходы – заработная плата, халтурка…
  • Делаем отчет помесячно, поквартально сколько мы заработали, сколько тратили, сможем ли отдавать ежемесячный взнос по кредиту, если возьмём его в банке с определенным процентом, сколько денег не хватает, сколько можно потратить ещё до конца года и пр.

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

Итак, справочные данные, это например, холодильник с указанием его модели и фирмы, телевизор – аналогично, также и пылесос, стиралка, посудомойка, кофемашина…Стиральный порошок, мыло, зубная паста – это тоже справочная информация, но как понимаете другого типа, чем холодильник и телевизор. Стиральный порошок и паста – это расходные материалы, которые быстро используются и следить за маркой и производителем не так важно с точки зрения учета, а вот телевизор и холодильник – это более дорогостоящие вещи, совершающие определенную работу по устройству комфорта. Разделение здесь, конечно, весьма условное, например, к чему отнести новый купленный пульт для телевизора – он стоит относительно недорого, но влияет на комфорт. По этому здесь нужно просто принять волевое решение и проявить своё творчество, сказать, что такие расходы мы будем просто списывать, ну потратились мы просто, как на зубную пасту или на мыло, потратились и забыли, но в программу всё-таки внесём что это было. Есть ещё другой тип справочной информации – это например, мы сами и наши домочадцы – родители, брат, сестра, бабушка, деда и т.д. Вообще, в фирме человеческие ресурсы – это сотрудники, но бабульку с её пенсией и вкладом в домашний бюджет если вы назовёте сотрудницей, то скорее всего получите скалкой на орехи, и возмущенные бурчания))). Так, с этой справочной информацией вроде определились, так вот в 1С это, что характерно, таким типом объекта и называется – Справочники:

Кликните правой кнопкой мыши по этому типу и выберите “Добавить”:

Появится окно нового справочника:

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

Имена объектов принято давать в особом формате, где каждое отдельное слово начинается с большой буквы, например, ЭтоНекоеИмяОбъектаГдеВсеОтдельныеСловаСБольшойБуквы

Далее перейдите на вкладку “Данные” и укажите следующие поля:

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

Справа появится новое окно, которое по содержимому отражает ту форму, которую сейчас заполняли:

Однако, если кликнуть дважды левой кнопкой мыши по справочнику “Бытовая техника”, то снова откроется знакомое окно:

Сделано это для удобства работы программиста, когда в одних случаях удобнее свойства видеть справа, а в других – отдельной формой.

Обновите конфигурацию специальной кнопкой:

Теперь произведите запуск рабочей среды прямо из конфигуратора, а на все вопросы ответим “Да” и “Принять”:

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

Откроем его и увидим, что он пуст; но это и понятно, ведь никаких данных мы в него ещё не вносили. По этому кликните кнопку “Создать” и внесите первоначальные данные, а после этого нажмите кнопку”Записать и закрыть”:

Заметьте, что если мы не меняем код (а менять его нам и не надо), когда вносим данные и оставляем его в значении ноль, то программа сама назначает его по порядку:

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

1. Внесите некоторые первоначальные данные по справочнику “Бытовая техника”

2. Создайте справочники для хранения мелких покупок, таких как стиральный порошок, зубная паста, канцелярия и всякая хозяйственная мелочовка

3. Создайте справочник для хранения ваших домочадцев и продуктов питания

4. Заполните все созданные справочники соответствующими первоначальными данными.

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

Урок 2

El Vinto, 2023 (Copyright)

Ссылка на мою статью на Дзене: https://dzen.ru/media/elvinto/programmirovanie-1s-urok-1-650fc821e500226085ecaecc

Программирование 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)

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

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

Продолжаем изучение программирования 1С. После многих лет программирования и изучения различных программных языков, я пришёл к устойчивому мнению, что изучать эту науку нужно не также как, скажем, математику или физику. Здесь нельзя изучать как русский язык – постепенно от простого алфавита до написания слов и потом предложений. По моему мнению, программирование – это 50% практики и 50% теории, и они должны идти одновременно не опережая друг друга. В программировании тысячи или даже миллионы нюансов, и запомнить их сразу, а потом начать применять – это просто нереально. Здесь, я считаю, нужно не продвижение теории закреплять практикой, а наоборот – для осуществления практических задач “подтягивать” теорию. По этому старайтесь для решения задач не перегружать мозг теорией, которая не поможет вам в решении конкретной задачи, и наоборот – если нужно решить задачу, погрузитесь в теорию её решения достаточно глубоко, чтобы иметь полное представление её осуществления и понимания механизмов её работы. Если копируете код, взятый из интернета, то вы должны понимать всё, что он делает и зачем нужен его тот или иной фрагмент. Это будет хорошим ходом выполнения поставленных задач.

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

Если подойти ближе к нашей конфигурации, то у нас сейчас уже есть документы учета наших покупок. Как быть, если мы захотим в какой-нибудь времени узнать, сколько у нас дома чего есть на остатках, на какую сумму мы в этом году, квартале сделали покупок и т.д.? Можно конечно перебрать автоматически все документы, “заглянуть” в каждый и на основании этого сделать отчёт, но как я уже только что сказал, этот способ неэффективен и учиться плохому мы не будем. По этому начнём с создания реестра, сделаем правильное его заполнение, а потом я покажу инструменты работы с остатками, которые есть исключительно у этого реестра, но нет у документов. Кстати, по правилам 1С он называется “Регистр”. Причём в 1С есть 4 типа различных регистров:

  • Регистры сведений
  • Регистры накопления
  • Регистры бухгалтерии
  • Регистры расчета

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

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

Перейдите во вкладку “Регистраторы” и укажите наш документ (наш документ будет регистрировать записи в этом реестре):

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

Дайте имя “БытоваяТехника” и укажите тип “СправочникСсылка.БытоваяТехника”. Точно также мы делали на прошлом уроке в табличной части документа:

Добавьте два ресурса “Количество” и “Сумма”, типы у них будут тоже аналогичные тому, что у нас в документе:

Кстати, заметьте, есть такое негласное правило, если точность указывается больше нуля, то принято (чтобы не было переполнения в суммах) размер указывать не 10, а 15. На практике, конечно, вряд ли вы будете считать что-то триллионами рублей, но надо стараться делать более универсально, это дело хорошей привычки.

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

Теперь нужно что-то сделать для того, чтобы при проведении документа данные попадали в этот регистр. Вернёмся в метаданных к документу “ПоступлениеТоваровУслуг” и кликнем дереве метаданных по нему правой кнопкой. Выберите пункт контекстного меню “Модуль объекта”:

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

Если говорить более подробно абстрагируясь от 1С, то все формы – это просто массив переменных класса Документ, но у самого класса Документ могут быть свой собственный набор методов.

Иными словами, модуль объекта – это набор процедур и функций общих для каждого экземпляра объекта Документ.ПоступленияТоваровУслуг. Сейчас на примере всё это поймём более подробно.

Добавьте стандартный метод “ОбработкаПроведения”, кликнув по кнопке “Процедуры и функции”:

Появится новая процедура. Добавьте в неё следующий код:

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

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

Вот этот пункт:

Так, далее…Переходим в эти функции, сейчас нам нужно дважды кликнуть по вот этому:

И после этого видим интересную таблицу:

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

Сначала я автоматически создал процедуру “ОбработкаПроведения”. Эта процедура вызывается средствами 1С в тот момент, когда пользователь нажимает кнопку “Провести” или “Провести и закрыть”.

Далее получаем набор записей регистра ТоварыНаСкладах:

НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();

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

НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);

Далее в цикле обращаемся к каждой строке нашего документа (делам обращение к табличной части через Объект) и создаём новую запись:

Запись = НаборЗаписей.Добавить();

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

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

Заметьте, что в реквизитах и отборах указывается не Объекты документов, а их ссылки – Объект.Ссылка. Для строки с бытовой техникой мы не указываем, что там ссылка, т.к. она там уже и есть.

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

Запись.Период = ЭтотОбъект.Дата;

Заметьте, ЭтотОбъект – это как раз объект нашего конкретного документа. Когда мы будем проводить какой-нибудь другой документ, то ЭтотОбъект будет объектом уже другого документа и брать уже другое значение реквизитов. Т.е. код один, но данные документа разные.

ВидДвижения – это параметр, определяющий в какую строну будет движение ресурсов, в том смысле – от нашей фирмы или к нашей фирме. В данном случае мы вибираем “Приход”, т.к. товары эти поступают к нам, мы их приобретаем, а не продаём:

Запись.ВидДвижения = ВидДвиженияНакопления.Приход;

Вид движения Расход делает противоположное представление – учитывает движение как исходящее от нас.

Всего два варианта выбора Приход и Расход

В движениях по регистру есть одна очень большая особенность, которую нужно понять прямо сейчас – Расход – это НЕ(!) тоже самое, что приход со знаком минус! Приход и расход – это самостоятельные разрезы учета. Говоря иначе:

  • Положительное число ресурса в приходе увеличивает остаток этого ресурса по приходу
  • Отрицательное число ресурса в приходе уменьшает остаток этого ресурса по приходу
  • Положительное число ресурса в расходе увеличивает остаток этого ресурса по расходу
  • Отрицательное число ресурса в расходе уменьшает остаток этого ресурса по расходу
  • Физический остаток равен приход минус расход

Что это значит на примере.

Мы купили 5 чайников и поставили их +5 в приход

2 чайника продали и поставили +2 в расход

Сколько чайников осталось? Правильно, осталось 3 чайника (приход минус расход) – это физический остаток. Если мы сделаем отчет по такому регистру, то покупки чайников будут определяться только разделом “Приход” и программа не будет считать ту часть таблицы, которая отвечает за расход. Продажи наоборот – это раздел “Расход” и для расчета продаж будет использоваться только эта часть регистра.

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

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

1. Сделайте регистр и проведение документов по мелочевке

2. Добавьте в обработки проведения и в регистры измерение, которое бы отражало реквизит документов “Домочадцы”, т.е. регистрировало ещё и того, кто ответственный за этот документ

3. Сделайте новый тип документа “ПродажиТоваров” с табличной частью содержащей бытовую технику. Сделайте при проведении этого документа расход по регистру ТоварыНаСкладах.

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

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

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

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

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

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

и ещё расход:

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

Идём в дереве метаданных, что характерно, в отчёты, добавляем новый:

Даём ему имя “ОстаткиНаСкладах”, такое имя тоже принято давать в данном типе отчетов, после этого кликнем по увеличительному стеклу напротив основной схемы компоновки данных, после чего нажмите “Готово”:

Появится окно, где много вкладок:

Кликните правой кнопкой мыши (ПКМ) по наборам данных и выберите пункт связанный с запросом:

Окно станет таким:

Тут видим – сверху какая-то таблица, снизу какое-то поле с текстом. Всё просто, – нет текста – нет таблицы…))…Сделаем, что просит 1С. т.е. сделаем самый простой запрос, а после этого просто кликните по этой пустой таблице сверху. Произойдет само собой вот такое:

Давайте разбираться что к чему. Внизу мы написали запрос на каком-то языке вроде похожем на 1С, но и не совсем похожем. Да, верно, в 1С есть совершенно отдельный ещё один язык, называется он язык запросов. Этот язык появился ещё до появления 1С и назывался он тогда SQL. Компания 1С взяла за основу этот язык SQL, русифицировала его, доработала под специфику платформы 1С и получился язык запросов 1С. Так для чего же нужен этот язык? Всё просто. Некогда компания 1С поняла, что для оптимизации и ускорения работы с большими объёмами данных, крайне выгодно использовать уже передовые мировые решения работы с этими базами данных. Зачем изобретать велосипед на квадратных колёсах, если ты хочешь быстро ехать? И это было правильным решением, в том смысле, что 1С не стала изобретать велосипед, а усовершенствовала его под свою тучную неповоротливую фигуру и произошло чудо! Действительно, обширные возможности 1С в сочетании с передовым мировым опытом хранения данных, дали свой результат, осталось только адаптироваться к нему. И компания 1С ничего не нашла лучше, как придумать язык запросов, сделать так, чтобы он начал понимать слова вроде “РегистрНакопления”, “ТоварыНаСкладах” и т.п., и потом просто сделать из этого непонятного для SQL лексикона, понятный, и потом просто подкинуть такой запрос в базу данных тип PostgreSQL или MS SQL. По этому часто, встречая вакансии программиста 1С, можно увидеть требование “Хорошее знание языка запросов”. Если программист этот язык не знает, но хорошо знает SQL, то проблем с освоение не будет почти совсем. Однако, что делать если нет опыта даже в SQL, тогда сейчас всё написанное примем на веру, а подробно начнём рассматривать на следующем уроке. Сейчас важно запустить отчет и познакомиться просто с самим принципом его формирования. Как я ранее говорил, мы к сложному будем не идти постепенно, скромно поглядывая со стороны, а будем пробираться к нему изнутри, как в Троянском коне)).

Перейдите во вкладку “Настройки” и добавьте новую группировку:

Теперь просто нажмите “ОК”:

Должно получиться так:

Поставьте два флажка начала и окончания периода:

Теперь на том и другой кликните ПКМ:

Установите флажок “Включать в пользовательские настройки”:

Теперь перейдите во вкладку “Выбранные поля” и перетащите слева вправо следующие:

Теперь перезапустите 1С. Теперь появилось меню касаемое отчетов. Кликните по отчету “Остатки на складах”:

Выберите данные периода таким, чтобы в него попадали наши созданные ранее документы и сформируйте отчет:

Укажите теперь определенную группировку по регистратору:

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

Теперь перетащите “Детальные записи” внутрь “Регистратор”:

Вернёмся в конфигуратор и немного изменим группировку. Для этого кликните снова по “Отчет” и добавьте ещё группировку. Получится так::

Измените поле остатка на оборот:

Теперь перезайдите в 1С и сформируйте отчет заново:

Видим, что теперь выглядит многоуровневым – сначала идут документы, а затем внутри – товары. В данном случае Регистратор – это группировка верхнего уровня, а группировка “Детальные записи” – это группировка нижнего уровня.

Теперь давайте разберёмся что собственно произошло.

Мы сделали запрос, который, забегая вперед состоит сейчас из двух частей:

ВЫБРАТЬ ТутСписокПолейИлиЕщёЧегото ИЗ ТутТаблицаОткудаВыбирать

ТутСписокПолейИлиЕщёЧегото – Здесь мы указали как звёздочка, которая является служебным символов и говорит от том, что нужно взять все существующие в таблице поля.

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

В результате программа поняла что от неё хотят и заполнена таблицу полей (по этому их появилось так много, ведь ещё есть служебные поля и поля созданные с привлечением дополнительной служебной таблицы “ОстаткиИОбороты”.

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

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

Таким образом мы получили наверно самый простой отчет на СКД.

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

1. Добавьте в отчет, аналогично сказанному, поле количества для получения по нему остатка

2. Добавьте ещё 2-3 документ с другими данными по домочадцам (покупки и продажи бытовой техники другими домочадцами).

3. Добавьте группировку верхнего уровня отчета по домочадцам.

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