Программирование 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. В справочник БытоваяТехника добавьте реквизит “Бренд”, указывающий фирму производителя со ссылкой на новый справочник “ПроизводителиТехники” и заполните этот реквизит для уже внесенных данных:

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

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

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

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

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

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

Давайте добавим две новых подсистемы вот так и дадим им имена “Справочники” и “Документы”:

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

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

, а документы – в свою:

Перезапустим 1С и посмотрим что получается:

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

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

Нажмите “ОК” и посмотрите как получилось:

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

Пользуясь кнопками вверх-вниз расположите в нужном порядке:

Теперь выглядит ещё лучше:

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

Откройте форму документа ПоступлениеТоваровУслуг и перейдите на вкладку “Командный интерфейс”:

Откройте иерархию “Перейти” и посмотрите что там как раз наш регистр:

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

Открыв документ видим что-то новое:

И это не что иное, что мы собственно и хотели – записи регистра, созданные именно этим документом:

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

1. Сделайте раздел командного интерфейса для отчетов и расположите там наш отчет “Товары на складах”

2. Добавьте командный интерфейс с регистром ТоварыНаСкладах для документа РеализацияТоваров.

3. Создайте два новый справочника ЕдиницыИзмерения и ПродуктыПитания. У продуктов питания добавьте реквизит ЕдиницаИзмерения:

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

Сделайте вид документа “ПоступленияПродуктовПитания” и внесите несколько документов в учет, что-то вроде такого:

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

El Vinto, 2023

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

Продолжим изучение 1С. Делаем мы это на живом примере, разрабатывая нашу собственную конфигурацию домашнего бюджета. Если вы по честному делаете мои домашние задания, то у вас уже должен быть создан справочники единиц измерения и продуктов питания, и одно привязано к другому, а также документы учета продуктов питания. Кстати, вы наверно обратили внимание, что учет количества продуктов питания идет с точностью до 3 знака, а размер числового параметра 15 (ведь некоторые продукты весовые с точностью до грамма).

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

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

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

Способ 1.

Раскрыть номенклатуру прямо в полях и вытянуть направо:

Способ 2.

Объявить получение нового поля в запросе:

А после этого это поле появится в настройках:

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

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

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

А если по второму способу:

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

Перенести поля туда методом Drag&Drop:

и указать тип группы как “В отдельной колонке”:

Получаем аналогичный результат:

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

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

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

И укажем вот такое поле:

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

Посмотрим что получилось, а получилось весьма даже не плохо, кроме дат – вместо года и месяца в иерархи полная дата:

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

Т.е. текст формата:

ДФ=yyyy

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

ДФ=MMMM

Как понимаете, “y” (буква игрек, уай) – это от слова year (год), а “M” – это month (месяц). После этого получается так:

Ну, и теперь осталось отчет, что называется, полирнуть. Ну, в смысле отполировать.

Укажите расчет ресурсов следующим способом:

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

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

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

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

И добавим в него несколько значений:

Вот этипх:

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

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

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

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

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

2. Создайте новое перечисление “ТипПоступленияТоваров” со значениями “Покупка”, “Аренда” и сделайте реквизит в документе ПоступленияТоваровУслуг.

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

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

El Vinto, 2023