Пост

Об 1С для программистов, или Натягиваем сову на глобус

Попытаемся рассказать про 1С "обычным" программистам. С попытками натянуть их терминологию на нашу =)


О статье

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

Меня всегда удивляло, что IT-сообщество так мало знает о платформе. Чаще всего это шаблонные тезисы про “кодинг на русском”, “мало возможностей” и “постоянные баги”. Но часто на поверку оказывается, что человек вообще не имел опыта работы с 1С или опыт был во времена мамонтов.

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

Дисклеймер

  • Я не работаю в компании 1С и не имею к ней никакого отношения. Это не рекламная статья. Эта статья не про компанию, а про продукт. Платформу для разработки приложений.
  • В мире 1С свои термины. Свои подходы к разработке. И часто разработчикам классических ЯП сложно понять их. Поэтому, в статье я буду пытаться наложить термины известные по другим ЯП на парадигму 1С. Это нужно только для облегчения понимания.
  • Я не утверждаю, что 1С идеальна. Уж кто, а программисты 1С лучше всех знают про минусы и недостатки этой платформы. Но критики в сторону этого продукта и так много, поэтому здесь хочу сконцентрироваться на возможностях.
  • Обзорную статью нельзя сделать без обобщений и упрощений. Иначе она превратится в учебник или документацию. Поэтому упрощения будут и здесь. И опытный специалист может увидеть их и возразить: “на самом деле в X не совсем правильно, ведь бывает Y”. Сразу прошу прощения за то, что я где-то что-то не упомянул или недостаточно погрузил =)
  • Это моя первая (и тестовая) статья на данном ресурсе. Если вам будет интересна данная тема, то я продолжу демонстрировать платформу. И с хорошей и с плохой стороны.

Что это вообще?

1С:Предприятие — программный продукт компании «1С», предназначенный для автоматизации деятельности на предприятии.

Но это, конечно, и так понятно. А если подробнее?

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

  • 1С - Это программная оболочка над базой данных. По сути, приложение 1С невозможно без базы данных по той причине, что сам проект (конфигурация) хранится в той же БД, где и лежат данные . Но об этом подробнее поговорим далее.

  • Поддерживаемые СУБД: Microsoft SQL Server, PostgreSQL, IBM DB2, Oracle Database. И файловый формат. При этом сам программист 1С при написании кода в большинстве случаев об этом не думает.

  • Кроссплатформа. Одно и то же решение можно запустить на Windows, Mac, Linux. Можно запустить вообще без установки платформы - в браузере (причем и с телефона). И в большинстве случаев код будет один и тот же (за исключением некоторых нюансов). Так же есть возможность написания специального приложения под Android и iOS. Это может быть и приложение-клиент (когда пользователь работает с той же базой напрямую) или же отдельное приложение, которое синхронизируется с основной базой.

  • Интеграция с внешними базами, веб-сервисами и мессенджерами. Это и подключение к другой БД “напрямую” (когда пользователи работают с ней не покидая 1С), и публикация WebAPI для работы из сторонних приложений, и разработка ботов для телеграм.

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

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

  • Расширяемость. Большинство готовых продуктов на платформе поставляются с открытым исходным кодом. С возможностью в любой момент изменить и доработать под свои нужды. А с использованием внешних обработок и расширений изменение типового проекта может вообще не потребоваться. Вместо этого возможно новый функционал просто положить “поверх” типового “на лету”.

  • Большое комьюнити. 1Сников много. И много статей, видео, телеграмм каналов про эту тему. А также готового кода в виде отчетов, обработок, расширений и так далее.

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

Наше первое приложение

Создаем базу

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

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

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

Мы же создадим новую базу данных с пустой конфигурацией и сами разработаем своё приложение.

И вот мы видим список своих баз (у меня ещё есть группа).

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

Заходим в конфигуратор нашей новой программы на 1С. С самого начала нам нужно открыть окно конфигурации (далее оно будет открываться автоматически при входе).

Перед нами открылось окно панели конфигурации. Можно его сравнить с “Проектом” в VisualStudio.

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

Но на самом деле конфигураций в БД как минимум две =)

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

И в свойствах изменим имя конфигурации.

Теперь наш “корень дерева” изменил название и доступны две кнопки, которые отвечают за сохранение.

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

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

Обе эти конфигурации хранятся в БД. Но одна нужна для разработки и не выполняется в пользовательском режиме, а во второй же наоборот нельзя вести разработку и она исполняется в режиме Предприятия (для пользователя).

Нажмём поочередно на обе кнопки и запустим отладку F5.

Приложение уже обладает готовым интерфейсом с разными возможностями. Но пока этому интерфейсу не к чему применяться. И так, приступим к попыткам понять, что вообще такое - разработка на 1С. Мы уже знаем, что весь проект лежит внутри самой БД. Но из чего состоит этот проект?

Классы в 1С

В 1С нет классов 🤷‍♂️

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

Базовые классы

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

Классы я условно могу поделить на хранимые и не хранимые в БД. Например, справочник - хранимый класс. Он не имеет смысла в отрыве от сохранения в БД. Поэтому он сразу наделяется всем нужным функционалом по добавлению, удалению и так далее. В том числе и скрытым уникальным идентификатором (ключевым полем) и гиперссылкой. За помещение в БД данных отвечает сама платформа.

Создаем справочники

И так, создадим новый Справочник. Сразу назовем его Организации. Сейчас у нас открыт редактор Справочника (нашего нового класса). Редактор удобно группирует все свойства по тематикам.

Справочник

Всё. Мы уже можем обновиться и увидеть новый справочник. Нажимаем F5 и на всё соглашаемся.

Справочник

Теперь мы видим наш справочник в меню. Перейдём в него:

Справочник

Это сгенерированный платформой интерфейс

1С автоматически сгенерировала все нужные базовые возможности для этого справочника. Добавила ему поля “Наименование” и “Код”. Нарисовала формы: списка (скрин выше), объекта (скрин ниже). Добавила все нужные кнопки. У нас сразу же доступны:

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

Добавим же нашу организацию “Рога и Копыта”. При записи поле Код сгенерируется автоматически.

Справочник

Сейчас уже справочник работоспособен. И для простых таких классов больше ничего не нужно делать. Но чего не хватает нашей организации? Добавим для примера реквизит “ИНН”.

Реквизиты

Реквизиты - это публичные поля класса. Они автоматически доступны пользователю в интерфейсе. И они хранятся в БД вместе с объектом. Фактически, добавляя новое такое поле в свой класс, разработчик заставляет платформу в таблице SQL добавить новую колонку (или несколько для составных типов).

Перейдём в конфигуратор и добавим новый реквизит ИНН:

На палитре свойств есть много всего, что описывает поведение нашего реквизита. Но нам сейчас интересно главное - тип. Какие бывают типы в 1С ?

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

Вы можете заметить, что в 1С нет отдельных типов под разные виды чисел. int, uint, long и ulong - это всё в 1С объединено одним типом Число. Но в реквизите мы можем это число настраивать. Пусть наш ИНН будет неотрицательным, целым (точность = 0) и максимальной длинной 12. Обновим теперь приложение и посмотрим на результат (F5).

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

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

Теперь в навигации у нас появилась ссылка на справочник Товары.

Выглядит он так же как и Организации. За одним исключением. Нам доступна кнопка Создать группу.

Добавим группу “Техника”. Это “папочка”. И в каждую такую группу можно поместить какой-то товар или же другую группу. Они нужны для произвольной иерархии товаров. Добавим несколько любых. Они нам потом ещё понадобятся.

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

Документы

Документ - это факт отражения какой-то операции. Документ имеет порядковый номер и дату. И документ может делать движения по регистрам (о них позже).

Добавим документ “ПриходТовара”

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

Пока не будем записывать документы - нам нужно сначала наполнить его полями.

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

Табличная часть

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

Пусть в табличной части будут реквизиты Товар (ссылка на справочник Товары) и Цена, Количество, Сумма (неотрицательные числа длиной 10 и точностью 2).

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

Здесь есть добавленный реквизит Организация. И табличная часть с товарами. На уровне SQL это отдельная таблица в БД, которая связана с таблицей документов. Каждый документ может иметь свои строчки в табличной части. Пользователь автоматически получает это в виде редактируемой таблицы внутри объекта.

Выбор ссылок

Наполним документ. Сначала выберем Организацию. 1С так же автоматически строит интерфейс для выбора ссылок на другие объекты. Можно сделать это через форму:

А можно через ввод по коду или наименованию

Так же работает и выбор товара:

Выберем любой товар и введем его цену и количество:

Как видно на скрине, сумма при этом не заполнилась автоматически. Хотя вполне логично, что она должна сама изменяться при вводе Цены и Количества. И вот пришла пора к новой стадии разработки - написании кода!

Редактор формы

Для начала перейдём в конфигуратор и создадим форму документа:

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

Вот так выглядит редактор формы. На нём автоматически сгенерированы выбранные элементы.

Управляемые формы - это механизм платформы по генерации интерфейса. Разработчик 1С просто “накидывает” элементы на форму, а платформа их компонует и наполняет стандартным функционалом.

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

1С сразу предлагает один из вариантов. Просто выберем первый:

Открылся модуль формы, в котором создалась новая клиентская процедура.

Процедуры и функции

Функции в 1С выполняют некий код и возвращают некое значение. Процедуры же ничего не возвращают. При этом объявлять типы нет никакой возможности. Костыльным путём в новой IDE пытаются применить практику “раз ЯП не может, то будем парсить комментарии”. Но фактически на исполнение кода эти комментарии никак не влияют и нужны только для удобства разработки.

Здесь простая функция для демонстрации. Принимает на вход два параметра. Первый обязателен и без него вызвать функцию нельзя. Второй же можно пропустить и тогда будет использоваться значение “2”. Внутри функции идёт объявление переменной “Результат” с присвоением 0. А далее цикл for от нуля до значения первого параметра. И вызывающий функцию получит значение переменной Результат. МойРезультат = ИмяФункции(100);

1С обладает Клиент-Серверной архитектурой. Весь код пишется с учетом того, где именно он будет выполняться. И для этого используются директивы компиляции и предпрооцессора (&НаКлиенте, &НаСервере и так далее). Когда разработчик пишет свою процедуру, то он сразу описывает где она будет выполняться. Может на клиенте, может на сервере, а может и там и тут. Последний вариант имеет ограничения, ведь такой код должен одновременно подходить под оба первых варианта.

Модули

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

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

На самом деле, существуют и другие виды модулей, но мы затронули основные, которые нужны для понимания кода на 1С.

Пишем простой код

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

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

Теперь сумма заполняется автоматически. И мы написали свой первый простой код. Думаю, синтаксис здесь достаточно простой, чтобы понять без дополнительных объяснений. Теперь у нас есть два справочника и документ. Перейдём к Регистрам.

Регистры

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

Добавим регистр накопления “ОстаткиТоваров”. И сразу добавим ему Измерение Товар с типом ссылки на справочник Товары. И ресурс Количество с типом Число (длина 10, точность 2).

В таблицу регистра будут попадать все закупки и продажи товара. И мы сможем в любой момент получить Остатки по ресурсу Количество в разрезе изменения Товар.

Измерения - это ключевые поля хранения остатков. Например, Товар и Склад. Ресурсы - это числовые поля. Их платформа будет “считать”.

Осталось только указать какой документ будет добавлять записи в регистр. Большинство регистров нельзя редактировать вручную. Это таблицы, которые наполняют разные документы. Добавим в качестве “Регистратора” записей наш документ.

Теперь нам нужно прописать как именно будет наполняться таблица регистра. Для этого перейдём в документ и откроем Конструктор движений.

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

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

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

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

Теперь запустим пользовательский режим и создадим новый документ. Чтобы в регистр попали строчки документ нужно провести одноименной кнопкой.

Теперь в нашем регистре появилась первая запись:

Это запись “прихода” (с зеленым плюсиком). И уже в остатках товара есть 10 штук. Но давайте для начала сделаем возможность отразить продажу товара. Сделаем просто - скопируем в конфигураторе наш документ в новый и назовём его “РасходТовара”

Общие модули

И вот мы пришли к одному из главных минусов в 1С… Нельзя наследоваться от своих классов.

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

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

В общем модуле нет доступа к контексту формы. Поэтому, нам нужно передать в процедуру элемент с таблицей.

Теперь изменим код в формах обоих документов:

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

Теперь наша процедура принимает на вход объект класса документ и вид движения (приход или расход). Вот так выглядит вызов этой процедуры:

В метод мы передаем ЭтотОбъект (this) и вид движения. В документе прихода - это приход. В документе расхода - расход.

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

Однако, поля наследовать нельзя. Формы наследовать очень сложно и чаще всего это не делается. Полноценно наследоваться можно только от базовых классов, которые даёт платформа.

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

Теперь мы можем вносить приходы и расходы товаров. Но как вывести пользователю информацию об остатках? Сделаем для этого отчет.

Отчет

Отчет - это класс для вывода пользователям сводной информации.

Создадим отчет “ОстаткиТоваров” (названия классов должны быть уникальны только в рамках своего базового класса). И сразу нажмём “Открыть схему компоновки данных”

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

Язык запросов

Язык запросов 1С повторяет часть возможностей языка запросов SQL. Далее запрос интерпретируется платформой в SQL’ный. С одним принципиальным отличием. 1Сный язык только для выборки данных. Изменять данные в БД запросами нельзя. Изменение происходит только с использованием объектной модели.

Конструктор запросов позволяет интерактивно построить запрос. Слева доступные таблицы в БД. По центру выбранные таблицы. А справа выбранные поля. Ещё много закладок, но об этом когда-нибудь потом.

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

Вот так выглядит текст запроса:

К тексту мы ещё вернёмся, но сначала донастроим отчет. Выведем теперь все поля пользователю:

Работа с отчетом

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

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

Для наглядности я создал ещё несколько документов.

Но что, если пользователь хочет изменить настройки отчета? Например, вывести организацию из документа? Нажмём “Изменить вариант”:

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

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

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

Компоновка данных

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

Мы видим, что в запросе выбираются те поля, которые нужны. И не выбираются те, которые отключены. А так же выбираются поля “через точку”. Товар.Код, Организация.ИНН и так далее.

Дело в том, что хоть язык запросов 1С и сделан по образу и подобию SQL, но при этом позволяет ещё делать “обращения через точку”. Откроем запрос в конструкторе:

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

Оращение “через точку” используется повсеместно. Вот так выглядит возможность пользовательского отбора в отчете. Доступны все поля (включая подчиненные). Множество вариантов сравнения. Группировки отборов и так далее. Всё это платформа делает сама.

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

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

Итоги

Мы сделали простое приложение на 1С. Попутно рассмотрели подход в разработке и несколько самых популярных типов объектов. Написали пару простых процедур и запросов. Пообзывали 1Сные объекты “по-программистски”. И теперь примерно понимаем, что вообще из себя представляет 1С.

Это моя первая статья на данном ресурсе. Буду продолжать раскрывать тему разработки в 1С. Если это будет интересно =)

Авторский пост защищен лицензией CC BY 4.0 .