Программирование 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. Добавьте группировку верхнего уровня отчета по домочадцам.

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

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

В этом уроке продолжим изучение 1С. На прошлом занятии мы начали пробовать делать свои первые отчеты на базе СКД, но глубоко не вникали в эту тему. На этом уроке будем более расширенно погружаться в эту тему.

Настало время более подробно познакомиться с языком запросов 1С. В основе этого языка, как я уже говорил, находится язык SQL. Однако, в 1С он используется с одной стороны не полностью, а с другой, ввиду специфики самого 1С, в него добавлены те конструкции, которых нет в базовом SQL. В 1С язык используется для получения данных из базы. Обратиться можно практически ко всему, что хранит в себе рабочая среда конфигурации 1С. Т.е. мы создаём справочники, документы, регистры, и всё это можно получить через язык запросов. Сам же этот язык используется не только для СКД, но и в других областях программирования 1С, например, при проведении документов, при написании различных обработок, выгрузки данных в другие системы и т.п. Для примера возьмем нашу конфигурации. Помните, на одном из прошлых уроков мы делали документ поступления и документы списания. Давайте рассмотрим типичную для любого бизнеса ситуацию, опять-таки на примере чайников. Мы купили 5 чайников одной и той же модели по 1000 руб чтобы подарить их на Новый год нашим гостям. Потом узнали, что гостей будет не 5 человек, а 8. Кого-то обидеть было бы нехорошо, по этому решили докупить ещё 3 таких же чайника. Приходим в магазин, а они уже не по 1000, а по 1500 руб за штуку. Делать нечего, купили ещё три штуки. Потом, оказалось, что гостей пришло не 8, как мы ожидали, а 6 человек. Т.е. у нас останется 2 чайника лишних и мы решили их продать по объявлению. Вопрос на засыпку – какая себестоимость каждого из 2 оставшихся чайников? За какую цену нам их продавать чтобы не остаться “в минусе”? Ведь мы дарили 6 чайников и конечно же не маркировали их за сколько они нам обошлись. А покупали по разным ценам – по 1000 и 1500. Как узнать теперь сколько стоит каждый чайник из этих двух? Тут одним из подходов в такой ситуации является метод средневзвешенной цены по формуле:

СредневзвешеннаяЦена = (Количество1 * Цена1 + Количество2 * Цена + …) / (Количество1 + Количество2 + …)

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

СредневзвешеннаяЦена = (5 * 1000 + 3 * 1500) / (5 + 3) = 1187.50 руб.

Это как раз и есть та самая себестоимость каждого чайника после покупки всех восьми. Продавая ниже 1187.5 мы будем “в минусе” (будет для нас затратно).

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

СредневзвешеннаяЦена = СуммаИзНашегоРегистра / КоличествоИзНашегоРегистра

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

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

На самом деле учет средневзвешенной цены не единственный. Есть ещё учет, когда сначала списываются более ранее приобретенные товары или есть учёт, когда сначала списываются более поздние приобретенные товары. Эти способы называются соответственно FIFO и LIFO. Какой способ выбрать зависит от той или иной политики определенной организации и решается управляющим комитетом компании. Но для нашей конфигурации я волевым решением принял способ по средневзвешенной цене.

Но как же нам тут посчитать эту цену с точки зрения 1С? Делаем это так:

И чуть далее самое главное так:

Теперь сначала добавим ещё один документ покупки чайников (где мы покупаем 3 штуки по 1500). Далее изменим документ реализации чайников, указав там, что продали мы не 2 штуки, а 6 штук. Проведем его и проверим содержимое регистра, что с чайниками теперь всё ок:

Да, всё как и хотели – купили 5 по 1000, ещё докупили 3 по 1500 и продали 6 по 7125. Ещё раз заметьте, что продали мы не на сумму 7125 руб., т.к. продали мы на самом деле на сумму 1200 (это цена продажи) * 6 = 7200 руб., а продали мы по себестоимости 7125 руб. 7125 – это себестоимость проданных товаров, т.е. за сколько они нам обошлись при покупке (разумеется по средневзвешенной цене).

Внимание! Здесь документ, где мы докупаем ещё 3 чайника, должен стоять по времени после первого документа покупки и перед документом продажи.

Давайте разбираться что тут происходит.

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

Запрос = Новый Запрос;

Запрос.УстановитьПараметр(“ДатаО”, Новый Граница(Новый МоментВремени(ЭтотОбъект.Дата, ЭтотОбъект.Ссылка), ВидГраницы.Исключая));

Запрос.УстановитьПараметр(“Товар”, СтрТ.Товар);

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

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

Сам запрос тоже стоит разобрать:

|ВЫБРАТЬ
| КоличествоОстаток,
| СуммаОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаО)
|ГДЕ
| БытоваяТехника = &Товар

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

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

ВЫБРАТЬ ПоляКоторыеНужноВыбрать ИЗ ОткудаВыбратьЭтиПоля

К тексту запроса можно добавить условие, как это сделано у меня:

ГДЕ БытоваяТехника = &Товар

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

Таблица откуда брать тоже похожа, только вот таблица немного другая и параметры для неё другие. Помните, в СКД мы брали таблицу ОстаткиИОбороты, а тут только Остатки. Соответственно, у остатков без оборотов нет периода, а есть только одна дата, на которую брать эти самые остатки.

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

Идём далее.

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

Выборка.Следующий() – Делает попытку спозиционироваться в итератора на строке результата. Если это удалось (ещё перебрали все строки результата или вообще есть хотя бы одна строка результата), то возвращается ИСТИНА. Тут этими условиями мы сообщаем, что если такое позиционирование не удалось, то значит таких товаров на складах, которые мы хотим реализовать, нет вообще на остатках.

Второе условие проверяет, мол это очень хорошо, что остатки всё-таки есть, но хорошо бы их число было бы больше или равно тому, что мы хотим реализовать. Если это не так, то это тоже ошибка – нельзя списать то, чего у нас нет.

В завершении мы просто меняем сумму списания с учетом результата запроса, т.е. получаем себестоимость и умножаем её на количество реализованного товара:

Запись.Сумма = Выборка.СуммаОстаток / Выборка.КоличествоОстаток * СтрТ.Количество; // ТЕПЕРЬ ПРАВИЛЬНО

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

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

2. В рабочей среде создайте документы и внесите необходимый товар касаемый мелочевки.

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

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

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

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

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

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

И если дать ему имя, то будет как-то так:

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

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

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

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

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

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

В примере выше, функция МояПерваяФункция() возвращает сумму значений, находящихся в двух переменных. В результате выполнения переменная ЗначениеМоейПервойФункции будет равно числу 9.

Когда говорят о функции или процедуре принято после её наименования писать две круглые скобки без параметров – открывающую и закрывающую. Это позволяет сразу понять, что речь идет не по какой-то переменной МояПерваяФункция, а именно о функции МояПерваяФукнция(). К сожалению этим способом нельзя отличить функцию от процедуры, по этому об этом говорят явно.

Процедуры и функции начинаются с ключевого слова “Процедура” или “Функция”, далее следует её наименование и список параметров, которые заключены в круглые скобки. Заканчивается определение процедур и функции соответствующими ключевыми словами “КонецПроцедуры” и “КонецФункции”. Начало процедуры или функции ещё принято называть её определением (в различных языках программирования, не только в 1С).

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

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

Т.е. я нигде не определял функции Макс(), но программа знает что нужно делать при её вызове – посчитать максимальное значение среди параметров.

А могут быть и пользовательскими, пардон, созданными программистами (но это всё равно в терминологии – пользовательские). МояПерваяФункция() и МояПерваяПроцедура() – это типичный пример пользовательской функции и процедуры.

Внутри пользовательских процедур и функций, или как и называют без слова “пользовательские”, а просто – процедур и функций, располагаются выражения.

Выражение – часть программного кода, несущего вполне самостоятельное действие и является близким аналогом математического выражения. Выражения разделяются между собой знаком “;” (точка с запятой). Например, в моей первой процедуре два выражения. Выражения в процедурах и функциях выполняются от начала и до конца, если не встречают на своём пути условий ограничивающих их выполнение. Такое выполнение иногда называют “сверху вниз” и оно принято во всех языках программирования. Выражения состоят из логически, математически или конкатенально организованных действий из функций, процедур, переменных и констант. Выражение оформляется следующим образом:

Если выражение предполагает наличие результата – указывается переменная, куда будет помещен результат, затем знак “=” (знак равенства) , а после него формула.

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

Переменная – аналог математической переменной. Предназначена для хранения какого-либо значения. Значением могут выступать число, строка, дата, объект и т.п. Каждая переменная содержит в себе тип того значения, которое хранит. Например:

МояПеременная1 = 4; // Хранит число, следовательно у неё тип “Число”

МояПеременная2 = “Моя какая-то строка”; // Хранит строку, следовательно у тип “Строка”

МояПеременная3 = Истина; // Хранит значение только Истина или Ложь, следовательно у неё тип “Булево”

Задание значения переменной строго определенным значением, как в этих примерах, называется инициализацией переменной.

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

Булево – принимает только одно из двух значений ИСТИНА или ЛОЖЬ. Со значением булево доступны логическое умножение, сложение, а также отрицание (моя статья “Программирование вообще с нуля“), например:

КакойтоРезультат = НЕ ЭтоЗабалансовыйСчет И ЭтоСчетТоваров

Мы уже делали операции с булево:

Число – принимает числовое значение пригодное для выполнения математических операций, например:

ЧислоТочекНаЭкране = 1920 * РазмерМонитораПоИгрек + РазмерМонитораПоИкс

Мы уже делали операции с числами:

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

Мы уже делали конкатенацию:

Строковые переменные можно переносить по строкам, извините за тавтологию, но вы наверно уже обратили внимание как я это делал; правильно, нужно просто вначале строки поставить знак “|” (вертикальная черта):

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

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

Результат = 95 + ” кг”; // НЕПРАВИЛЬНО! Будет ошибка

Результат = “”+95+” кг”; // ПРАВИЛЬНО! Ошибки не будет, т.к. “” – это тоже строка и она конкатенируется к числу

Результат = Строка(95)+ ” кг”; // ПРАВИЛЬНО! Ошибки не будет, т.к. выполнена встроенная в платформу функция Строка() преобразующая параметр к строке.

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

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

С переменными всех типов можно производить следующие действия в выражениях:

  • Присвоение значения (инициализация)
  • Сравнение (меньше, больше, равно, неравно и т.д.)

Вообще, работа с переменными сводится в два этапа – сначала она объявляется, затем используется. Использовать необъявленную переменную нельзя.

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

Мы уже использовали условия в документе реализации:

Структура условий выглядит так:

Если ТутКакоетоУсловие Тогда

// Тут что-то выполняется

ИначеЕсли ТутДругоеКакоетоУсловие Тогда

// Тут что-то другое выполняется

ИначеЕсли ТутЕщёДругоеКакоетоУсловие Тогда

// Тут что-то ещё другое выполняется

………………… и так ещё сколько угодно раз ………..

Иначе

// Тут выполняется в том случае, если никакое из условий выше так и не выполнилось

КонецЕсли;

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

Если вы на прошлых уроках следовали рекомендации и прочитали мою статьи “Программирование вообще с нуля“, то уже знакомы, что в любом языке программирования есть циклы. Видов циклов в 1С три, два из них (тип 2 и тип 3) мы уже использовали.

Тип 1:

Для Н = 1 ПО 25 Цикл

// Что-то тут делать 25 раз. При каждой итерации переменная Н будет увеличиваться на 1.

КонецЦикла;

Тип 2:

Для СтрТ ИЗ НекаяТаблицаЗначенийИлиМассивИлиДругойИтератор Цикл

// Что-то тут делать пока удаётся получить в переменную СтрТ значение очередной строки из переменной НекаяТаблицаЗначений , хранящей объект ТаблицаЗначений.

КонецЦикла;

Тип 3:

Пока Выборка.Следующий() Цикл

// Тут что-то делать пока результат итерации равен ИСТИНА

КонецЦикла;

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

// Тут какой-то текст не на языке программирования, а по-русски

Так в 1С объявляются комментарии. Как можно понять, всё что после // и до конца строки, может быть любой текст. Платформа 1С его просто будет игнорировать. Комментарии нужны чтобы потом ускорить понимание того, что вы написали в той или иной части кода, ведь сам код может быть очень сложен. Но если описать простым языком что он делает и когда используется, то через полгода возвратившись к нему, проблем с пониманием и вспоминанием скорее всего не возникнет.

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

1. Самостоятельно найдите в поисковых системах функции работы с числом и строками, такими как Число(), Строка(), Сред(), Лев(), Прав(), ВРег(), НРег(), СтрНайти().

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

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

Т.е. убрать из названия фирму производителя и сделать это отдельным реквизитом:

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

Начало программирования вообще с нуля. Часть 3. Бинарные данные.

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

Рис.1

Рис.1

Теперь немного изменим представление этого же файла:

Рис.2

Рис.2

А теперь ещё поменяем представление на другое:

Рис.3

Рис.3

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

Самая левая часть – это колонка с адресом, далее идут две средние колонки двоичных данных по 8 байт (всего в строке 16 байт), а справа их представление. Как можно заметить, какое бы представление не было, бинарные данные одни и те же. И это не удивительно, ведь они и есть истинная исходная информация. То, как мы хотим её видеть, в виде чисел шестнадцатиричной системы, или текстом в разных видах, вопрос другой, на самом деле данные одни и те же.

Теперь вопрос касаемый представления. Давайте посмотрим на все это немного подробнее. Заметьте, везде пробел представлен числом 20h, цифра 2 в годе 2023, представлена числом 32h. Ещё один момент, на который нужно обратить внимание – это то, что в представлении на рис.1 и рис.2 весь английский текст и цифры выглядят одинаково, а весь русский текст по разному. Дело в том, что тут есть одно правило. Все символы латинского алфавита, цифры, знаки препинания, пробел и ещё некоторый набор символов являются представлением байта со значением меньшим 128, т.е. байты 00-7Fh, и за каждым значением всегда закреплен определенный символ. Диапазон 80-FFh – это пользовательские символы представляемые определенной кодировкой (но есть небольшое исключение). Казалось бы, зачем было так делать?

Когда-то давным давно, когда каждый день вызывал перерождение компьютерной идеологии, большая часть информации вносилась на английском языке. Однако, в процессе интеграции компьютеров по всему миру, его стали использовать для отображения текстов на русском, немецком, французском, японском и т.д. языках. Сначала, до появления WIndows, за то, в какой национальной среде какие 2(!) языка использовать (английский и ещё какой) отвечали настройки операционной системы. Затем, когда стали вдруг появляться тексты сразу на нескольких языках (на одном рабочем месте), стали использовать отдельные символы. Ну, например, 00-7Fh – это всегда английские, 80-FFh – это как бы русские, но есть ещё несколько символов из испанского, такие, например, как ò (ударная о) или è (ударная е), также туда были добавлены некоторые буквы норвежского языка, например, å, и т.п. В общем, с горем по полам, как-то писались тексты. Проблемно стало, когда в языки стали включать иероглифы, которых, как мы понимаем, несколько больше, чем все алфавиты романской группы и кириллицы. Нужно было что-то менять. Стали придумываться разные кодировки, но беда была в том, что либо туда что-то не попадало, как кодировка ASCII или ANSI, либо туда попадало всё, но текст стал занимать место на дисках в несколько раз больше. В то время дисковые накопители обладали размером в сотни тысяч раз меньшим, по этому такое расточительное хранение текста считалось недопустимым. Со временем диски стали лавинно увеличиваться в размерах, а программисты искали методы для более эффективного хранения текстовой информации. На стыке одного и другого и произошли радикальные изменения. Но история об этом хранится, и теперь от старых кодировок быстро не отделаться, т.к. много текста хранится в них. Также есть старые операционные системы или микрокомпьютеры, где не нужно хранить текст, например, на китайском, а достаточно хранить на английском. Например, моя посудомоечная машина Ariston может вообще показывать только цифры и буквы P и E, зачем управляющей ей операционной системе хранить текст в современной кодировке? Кстати и стиралка тоже лексиконом не блещет)). Наиболее же перспективной кодировкой на 2023 год является кодировка UTF-8, она позволяет хранить текст одновременно на всех алфавитах (в т.ч. и иероглифы), даже например такие как Ѭ, Ѧ. Это всё потому, что под каждый символ национального языка, выделяется памяти больше одного байта. Также на правильное представление влияет не только в какой кодировке хранится текст, но и какая кодовая таблица используется. Т.е. кодировка из текстовой строки получает набор кодов символов, вторая таблица коды символов ассоциирует с определенным знаком/символом/буквой/иероглифом. Кодовая таблица сейчас используется unicode.

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

В прошлой части мы начали говорить о бинарных данных. Давайте немного углубимся в этот вопрос. Если рассуждать по честному, то вся информация в компьютере - это бинарные данные.-4

В кодировке UTF-8 это будут уже такие бинарные данные:

В прошлой части мы начали говорить о бинарных данных. Давайте немного углубимся в этот вопрос. Если рассуждать по честному, то вся информация в компьютере - это бинарные данные.-5

Как видите строка UTF-8 занимает куда больше места, хотя это тот же самый текст “Привет мир”. Однако, попробуем закодировать ещё и надпись “Hello world”, в ASCII это будет:

В прошлой части мы начали говорить о бинарных данных. Давайте немного углубимся в этот вопрос. Если рассуждать по честному, то вся информация в компьютере - это бинарные данные.-6

а в UTF-8:

В прошлой части мы начали говорить о бинарных данных. Давайте немного углубимся в этот вопрос. Если рассуждать по честному, то вся информация в компьютере - это бинарные данные.-7

Видно, что последовательность бинарных данных для текста “Hello world” одинаковая 48 65 6C 6C 6F 20 77 6F 72 6C 64. Каждому байту соответствует символ, что не скажешь о русских буквах. Получается, что если текст содержит только латинские символы, знаки препинания, цифры (это все символы с кодом меньшим 80h), то количество байт, требуемых для хранения такого текста равно количеству символов. Если текст содержит символы на национальных языках, то количество байт для хранения требуется больше.

С хранением строк должно быть немного понятно, а что с хранением в компьютере чисел. Дело в том, что как мы уже знаем, в одном байте можно хранить только целые числа от нуля до 255, а в двух байтах (по законам математики) от нуля до 256*256-1 = 65536, в 4-х байтах от нуля до 256*256*256*256-1=4294967296 и т.д.

Но мы знаем, что числа бывают отрицательными, как быть с этим? Здесь мы должны сначала определиться сколько мы будем выделять байт под число. После этого нам придётся пожертвовать одним (старшим) битом числа для определения знака. Если этот бит будет равен нулю, то это будет положительное число, а если 1, то отрицательное. Т.е. например, если нам нужно выделить переменную, которая будет хранить целое положительное число гарантированно не превышающее 255, то нам достаточно одного байта. Если же при этом число может быть отрицательным, то тогда уже без 1 старшего бита, т.е. только число не более 127 и не менее минус 127. Это может, например, использоваться тогда, когда вам нужно хранить проценты от 0 до 100% или от -100% до +100%, да мало ли ещё для чего может быть использован такой небольшой интервал. Однако, что с бинарными данными числа? Рассмотрим, например, бинарный байт E5h. Какое число в нём хранится, минус 27 (-27) или плюс 229 (+229)? Ведь с точки зрения бинарных данных и то и это будет E5h. Здесь тоже, как и со строкой, необходимо знать заранее, что это за бинарные данные. Если байт хранит целое положительное число, то тогда это 229, а если целое знаковое число, то уже -27. Это всё потому, что у E5h ( равен 1110 0101b ) старший бит единица и для знаковых чисел этот бит интерпретируется как признак минуса, а для беззнаковых чисел он просто ещё один старший бит числа.

Однако, я уже сказал, что целые числа могут храниться не только в байтах, но и в словах (это термин обозначающий 2 байта подряд – WORD), двойных словах (4 байта – DWORD) и т.д. Давайте посмотрим на это же число 229, если хранится в 2-х байтах. Бинарные данные тогда для него будут такими:

00 E5

Но оно и понятно – вот они два байта, старший байт нули, т.к. для этого числа и одного байта хватает, а младший байт всё тот же E5h. Однако, при хранении этого числа в двух байтах, старший бит (15-й по счёту) никогда не будет единицей – старший же байт целиком ноль. По этому становится не важным, перед нами 2 байтовое число знаковое или беззнаковое, оно всегда будет представлено как +229. Чтобы оно стало вдруг минус 27, бинарные данные должны быть такими:

FF E5

Но опять-таки это правило будет работать только для чисел не превышающих 2^15 (2 байта это 16 бит, но без знакового бита – 15). Как только число будет больше, уже опять нужно заранее знать знаковое там целое число или беззнаковое.

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

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

byte a; // выделяется 1 байт, хранит целое число беззнаковое число

short int b; // выделяется 2 байта, хранит знаковое число

unsigned int c; // выделяется 2 байта, хранит беззнаковое число

int d; // выделяется 4 байта, хранит знаковое число

unsigned int e; // выделяется 4 байта, хранит знаковое число

long f; // выделяется 8 байт, хранит знаковое число

unsigned long g; // выделяется 8 байт, хранит беззнаковое число

long long h; // выделяется 16 байт,…

float i; // выделяется 4 байта, хранит вещественное число

double j; // выделяется 8 байт, хранит вещественное число

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

Иногда для старых процессоров или процессоров для микроустройств, концепция немного изменена, особенно если процессор 32-битный или 16-битный. Там под int выделяться может только 2 байта, а под long – 4. Но обычно такая нестыковка проблем не вызывает, т.к. любой современный компилятор при необходимости может сообщить сколько же он будет выделять памяти под ту или иную переменную.

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

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

65 65 65 65

Что это? Это строка из 4-х символов “eeee”, это беззнаковое число int равное 1701143909, а может это программист тут хранит картинку 2 на 2 точки и 65h – это оттенок серого каждой точки? А может это часть сэмпла какого-то музыкального произведения, а может это исполняемый код процессора? Если заранее это не известно, для обычного читателя этих байт – это просто бинарные данные.

Начало программирования вообще с нуля. Часть 4. Логика.

...Люба повернулась к нему и произнесла

– Сергей, так ты сказал мне неправду?

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

Однако в компьютерах такое вряд ли могло быть, ведь там есть только два состояния – истина или ложь, и в теории никогда не бывает неправды, сейчас я это объясню.

Ранее мы уже рассмотрели этот вариант, что бит со значением 0 (ноль) – это ложь, а бит со значением 1 – это истина.

Кстати, чтобы не путать букву “О” и цифру “0” (ноль), ноль когда-то давно выглядел вот так Ø (перечеркнутый ноль) и это действительно было удобно, ведь это два разных символа, и иногда шрифт такой, что не сложно их спутать. Особенно, когда речь идёт о так называемых Captcha – кодах из букв и цифр, которые нужно пользователю ввести, чтобы “подтвердить”, что он человек. Мне кажется, этот символ незаслуженно пропал из обихода. Сейчас он используется крайне редко.

Итак, истина или ложь. Например, я хочу изложить состояние погоды вчера и сегодня и говорю,- вчера шёл дождь, а сегодня дождь не идёт. Значит получается, что вчера наличие дождя – это истина, а сегодня наличие дождя – это ложь. Вроде тут всё должно быть понятно, мы одним битом можем описать был дождь или его не было, но это только если…я не соврал. Тогда возникает третье состояние – неопределенности, т.е. дождь-то на самом деле был, но я сказал, что его не было, а как моему собеседнику считать, всё-таки был дождь или нет? У людей такое происходит сплошь и рядом, а вот в вычислительных системах крайне редко. Человек подвержен воле, а компьютер – электромагнитным всплескам, и то и другое влияет на результат, но если в компьютерах это предусмотрели и сделали контроль ошибок и автоматическое их исправление, то у людей, скорее всего такого контроля нет. По этому, хоть вопрос и сложный, мы будем исходить из теории того, что в компьютерах есть только два состояния и никогда не бывает никакого другого.

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

ЖеланиеИдтиГулять = НЕ Дождь ИЛИ Тепло

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

  • “НЕ” – знак отрицания, отрицание переменной стоящей после него, т.е. если переменная была равна 0, то становится 1, и наоборот. Иногда называется инверсией аргумента, а операция – инвертированием.
  • “ИЛИ” – называется логическое сложение. Результат истина, если хотя бы одна из переменных стоящих слева или справа от него равна истине

Так, а можно ли записать это желание идти гулять как-то по другому? Конечно можно, ведь я мог сказать и по другому – Я пойду на улицу гулять, только если не будет дождя или будет не холодно”. Согласитесь, общий смысл совершенно такой же. Как такая фраза будет записано логической формулой?

ЖеланиеИдтиГулять = НЕ Дождь ИЛИ НЕ Холодно

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

НежеланиеИдтиГулять = Дождь И Холодно

Однако, мы не знаем, что такой за результат “Нежелание”, у нас должно быть желание, поэтому перефразируем – Я пойду гулять, только если не будет одновременно идти дождь и на улице холодно, т.е. фактически так:

ЖеланиеИдтиГулять = НЕ (Дождь И Холодно)

Мы просто переставили НЕ из левой части в правую, так можно делать даже и в математике:

-A = B

=>

A = -B

Не будем отвлекаться, в этой нашей формуле мы использовали новый оператор “И”:

  • “И” – называется логическое умножение. Результат истина только если оба аргумента (слева и справа) будут истина, в ином случае значение будет ложь.

Из этих трех логических операторов И, ИЛИ, НЕ состоит вся компьютерная логика. В зарубежной литературе они называются аналогично – AND, OR, NOT.

В различных языках программирования эти действия используются постоянно, на них построены все результаты сравнения и условия. Например, в языке Си эти операторы записываются специальными знаками &, |, !, например:

C = A & B;

D = A | B;

E = !A;

, а в языке 1С – прямо по-русски:

ПрибалятьКСуммеНашихОстатков = НЕ СчетЗабалансовый И ЭтоУчетТоваров;

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

Результат = НЕ (Параметр2 И Параметр3 ИЛИ НЕ Параметр4) И Параметр5

Первым делом будет выполнена инверсия находящаяся внутри скобок:

НЕ Параметр4

Затем будет выполнено логическое умножение:

Параметр2 И Параметр3

После этого будет выполнено ИЛИ между ними. Затем будет инверсия находящегося этого промежуточного результата в скобках:

НЕ (…)

И лишь после этого инвертированный промежуточный результат будет логически умножен на Параметр5 и получен итоговый Результат.

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

ЖеланиеИдтиГулять = (НЕ Дождь ИЛИ НЕ Холодно) ИЛИ НЕ (НЕ ДеньПослеЗарплаты ИЛИ НЕ ЭтоПятница)

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

Метод1: НЕ НЕ Параметр1 = Параметр1

Метод2: Параметр1 И Параметр2 = НЕ (НЕ Параметр1 ИЛИ НЕ Параметр2)

Метод3: Параметр1 ИЛИ Параметр2 = НЕ (НЕ Параметр1 И НЕ Параметр2)

Тогда можем преобразовать левую часть сначала по методу 2, а следом по методу 1:

(НЕ Дождь ИЛИ НЕ Холодно) = НЕ (Дождь И Холодно), т.е. левая часть говорит, что результат истина, если нет одновременно дождя и на улице холодно, т.е. если хотя бы нет дождя или хотя бы не холодно, то результат этой части истина.

Теперь вторая часть тоже по тем же методам:

НЕ (НЕ ДеньПослеЗарплаты ИЛИ НЕ ЭтоПятница) = (ДеньПослеЗарплаты И ЭтоПятница)

В результате получается:

ЖеланиеИдтиГулять = НЕ (Дождь И Холодно) ИЛИ (ДеньПослеЗарплаты И ЭтоПятница)

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

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

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

Функция ПолучитьЛевыйСимволИзСтроки(НекаяСтрока)

Возврат Лев(НекаяСтрока, 1);

КонецФункции

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

А вот такой код никогда не получится выполнить на клиенте:

Функция ПолучитьЛевыйСимволИзСтроки(НекаяСтрока)

Запрос = Новый Запрос;

// Как-то обрабатываем сам запрос или его результат

КонецФункции

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

Но это всё хорошо и красиво звучит в теории, а что с практикой, вы резонно можете сказать,- Автор, дай пример, где это использовать в нашей конфигурации, которую мы уже 7-й урок делаем!- Да пожалуйста!- ответил я.- Помните как мы считали сумму по строке в формах документов поступления товаров и реализации товаров? А делали мы это так:

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

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

То будет вот так (всё нормально работает):

Так вот, отвлеклись, а теперь возвращаемся далее к коду. Мы видим, что эта процедура встречается в трёх видах документов – поступление мелочёвки, поступление товаров и услуг и реализации товаров и услуг. Эта процедура одинаковая для всех этих видов документа, так спрашивается, зачем нам её создавать аж три раза, если можно сделать одну в каком-нибудь общем модуле. Давайте так и сделаем. Кликните там, где я показывал это уже ранее и создайте новый общий модуль и при помощи ПКМ вызовите его свойства. Дайте ему имя “ОбщиеПроцедурыИФункцииКлиент” и укажите область видимости “Клиент”:

Флажка “Сервер” наоборот быть не должно, т.к. в нашей этой процедуре есть чисто клиентский объект формы, который так и называется “Объект” и гнать его на сервер не нужно (на сервере мы не будем как-то использовать форму объекта, да и не получится это сделать). Если вы всё же попытаетесь передать серверу то, что должно существовать как объект только на клиенте, то получите что-то вроде этого:

Т.е. в ошибке значится, что невозможно воспроизвести объект клиентской формы на сервере ввиду отсутствия такой возможности; но оно и понятно – кому на сервере форму показывать, соседним лампочкам в дата-центре? ))

Скопируем нашу процедуру из документа и вставим её в этом модуле:

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

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

Так, дорабатываем дальше. Дело в том, что в общем модуле платформа совершенно не понимает такие объекты как Элементы и Объект. Это свойства формы, а процедура в модуле абстрагирована от какого-либо объекта кроме самой конфигурации. По этому ссылку на объект формы нужно передать как параметр и кое-что поменять:

Как видите, я фактически только добавил параметр (в круглых скобках) и в трёх местах сделал родительский объект. Т.е. сказал платформе,- “Элементы” и “Объект” – это не самостоятельные свойства непойми чего, а это свойства объекта ОбъектФормы, переданного в качестве параметра.

Сам модуль формы тоже изменим до вот такого вида (эта процедура в этом модуле формы больше нам не нужна, теперь есть общая):

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

Теперь запустите 1С. НО(!!!!) не как обычно, а вот так:

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

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

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

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

Поставьте в конце каждой процедуры точку останова, запустите рабочую среду в режиме отладки на нажмите кнопку “Провести и закрыть”. Нажимая F5, посмотрите внимательно по каким точкам и в какой последовательности будет выполняться функционал – сначала вызывается процедура ПередЗаписью, затем ПослеЗаписи и только лишь после этого ОбработкаПроведения:

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

Теперь немного коснёмся пользовательского интерфейса, т.е. того с чем пользователь взаимодействует. Опять возвращаемся к нашей сумме по строке в документах. Всё с ней вроде неплохо, кроме одного – сумма сейчас доступна для редактирования; взял, случайно кликнул туда уже после того как она посчитана и получится вот так:

Ну вот как такое может быть?- 3 на 1500 равно двум…Это не дело, хорошо бы сделать так, чтобы поле это было заблокировано от ввода данных. Сначала для этого нужно в графическом представлении формы вызвать свойство этого реквизита, запрятано это вот туда:

А реквизита за блокировку аж два:

Отключение доступности блокирует реквизит полностью и от копирования и изменения, а свойство “ТолькоПросмотр” блокирует реквизит только от изменения. В нашем случае более правильным будет указать, что реквизит только для просмотра:

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

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

1. Доработайте остальные формы документов для вычисления суммы при помощи нашей общей процедуры. Убедитесь при помощи отладчика, что это действительно так.

2. Добавьте в справочник “БытоваяТехника” ещё один реквизит и назовите его “СоставноеНаименование”. Сделайте так, чтобы при записи справочника этот реквизит заполнялся автоматически составными словами из наименования и в скобках бренд. Вот так:

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

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

El Vinto, 2023

Начало программирования вообще с нуля. Часть 5. Клиент и сервер.

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

Получается, что клиенты и сервер выглядят так:

Когда речь заходит об облаке, это выглядит так:

Так вот, к чему это я…С точки зрения программирования, программист должен понимать где его функционал должен работать на сервере, а где на клиенте. Например, нужно вывести сообщение пользователю, что товара нет в онлайн-магазине. Где должен выполняться этот код, на клиенте или сервере? Оказывается, что для того чтобы это действительно работало, программист должен написать для выполнения на сервере определенный код, который вычислит, что товара больше нет, передать при очередном запросе клиента, что количество некого товара равно нулю. Затем должен написать на клиенте чтобы он с определенной периодичностью опрашивал сервер на предмет изменения количества того или иного товара, принимать количество, и если оно равно нулю, то выдавать на клиенте это сообщение. Т.е. программисту нужно написать одну программу на сервере для ответной реакции по запросу клиента, и другую программу работающую на каждом клиенте, которая опрашивает сервер, выводит сообщения, принимает вводимые данные будь то клики по экрану или адрес получателя, или ваш телефон для связи. Аналогично работают и различные социальные сети. Ваш планшет с определенной периодичностью опрашивает сервер на предмет того, нет ли для вас нового сообщения, в этот момент может заодно передаёт ваше сообщение для кого-то, опрашивает не появилась ли на различных каналах ещё одна новость, не загрузил ли кто новый видос на сервер. К счастью, если вы только начинающий программист, и работаете по этой специальности недавно, то вам не придётся делать программу и для клиента и для сервера, обычно новичков ставят только на клиент и дают документацию о том как нужно обращаться к серверу (так называемые API обмена). Подытоживая сказанное, программист должен чётко и хорошо понимать, что выполняется на сервере, а что на клиенте, в связи с этим и доступные методы, классы и т.п. могут работать в зависимости от того где выполняются, а достаточно часто и могут быть вообще уникальны, только для выполнения на сервере или только для выполнения на клиенте. Например, на клиенте онлайн-магазина нельзя обратиться напрямую к базе данных сервера, а на сервере нельзя вывести сообщение для пользователя.

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

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

Должен тут же сказать, чтобы не вводить вас в заблуждение, что клиент-серверная организация хотя и является доминирующей в мире информационных технологий, но не является единственной. Погружаться в другие на этом этапе знакомства с ИТ нет, но для эрудиции скажу, – есть ещё так называемые системы “Точка-точка” или “Пир-ту-пир”, или “peer-to-peer”, или они же “p2p”, или они же “Пиринговые сети”. Это систему у которых нет серверов вообще. Они взаимодействуют исключительно на прямом обращении одного клиента к другому, хотя было равно сказать и обращении одного сервера к другому. Типичным примером таких систем являются торрент-клиенты. В схеме это выглядит так:

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

Клиент-серверная организация накладывает определенные правила, особенно если речь идет о взаимодействии вроде как в вашем браузере, когда вы открываете очередную страницу какого-то сайта. Дело в том, что все устройства пользователей разные, разные производители, разные комплектующие, или вообще настолько разные как iOs, Android и MS Windows, а браузер, как я только что сказал, отправляет клиенту код, который должен на нём выполняться. Определить точно не всегда удаётся ввиду того, что часто клиент скрывает достоверную и подробную информацию о своей системе ввиду информационной безопасности, а выполнить код на нём всё равно нужно. По этой причине часть выполнения была возложена на операционные системы, способные воспринимать одни и те же скрипты так, чтобы клиентский компьютер их понял, этот процесс известен ещё со времён языка Бейсик и называется трансляцией. Т.е. сервер отправляет каждому клиенту чаще всего один и тот же скрипт работающий по одинаковому алгоритму, а клиент его уже сам дополнительно анализирует и преобразует в тот код, который поддерживает его устройство. Такой подход называется мультиплатформенным, т.е. один код для разных платформ, по этому к счастью, программисту чаще всего не надо задумываться о том, какое же устройство будет конечным на клиенте, и сосредоточиться только на том функционале, который ему необходимо реализовать; конечное устройство само должно позаботиться о том чтобы правильно воспринять тот или иной скрипт.

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

Здесь в терминологии есть путаница, сетью называют как физическую сеть (в виде проводов), логическую сеть, ту самую, которую мы называем интернетом, когда каждый компьютер имеет свой адрес, также называемый IP-адрес (айпи-адрес), и обращение идет по нему, и сетью ещё могут называть бесконечное количество виртуальных сетей, т.е. одних логических сетей внутри других логических сетей, например VPN-сети, пиринговые сети и т.п.

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

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

Для клиента:

  • Java Android (только для устройств на базе Android)
  • Swift (только для систем на базе iOS)
  • Javascript (только для браузеров, но для любых устройств)
  • Kotlin (для Android)

Для сервера:

  • PHP
  • Java servlet
  • Perl
  • Asp

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

Перечисленные языки для клиента так или иначе накладывают ограничения на то, на каком клиенте они будут выполнятся, например, на языке Java Android нельзя написать для устройств на iOS (нет таких компиляторов) и наоборот. Для Javascript нельзя скомпилировать ни для Android, ни для iOS, ни на Windows, но если на этих системах есть браузер, поддерживающий Javascript (а такие браузеры наверно сейчас все), то тогда можно этот код выполнять через этот браузер и на том и на этом устройстве, с той или иной операционной системой.

Подобных ограничений для серверов не бывает, т.к. сервер изначально настраивается на работу с тем или иным кодом (php, java servlet и т.д.) и программный код пишется под определенный транслятор или компилятор, который, как понимаете, изначально всегда известен. Т.е. программист на php сразу будет настраивать или выбирать свой сервер с установленным транслятором php, а например, программист на Java Servlet установит на сервере программу Tomcat. Сами эти языки способы делать практически одно и тоже в примерно равных требованиях к ресурсам, по этому, скорее, это дело вкуса и возможностей, на чём делать сервер.

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

  • Сам язык Си
  • PHP
  • Java
  • Javascript

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

El Vinto, 2023