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

7.Редактор формы
Для начала перейдём в конфигуратор и создадим форму документа:
Формы — это интерфейс для пользователя. Ранее 1С генерировала их автоматически, теперь создадим свою и доработаем. На первом этапе выведем её в стандартном виде, как предлагает платформа.
Вот так выглядит редактор формы. На нём автоматически сгенерированы выбранные элементы.
Управляемые формы автоматически генерируют интерфейс. Разработчик добавляет элементы, а платформа наделяет их стандартным функционалом.
Задача: пересчитывать сумму при изменении цены или количества. Для этого создаём обработчик события ПриИзменении для элемента "Цена".
1С сразу предлагает один из вариантов. Просто выберем первый:
Открылся модуль формы, в котором создалась новая клиентская процедура.
8.Процедуры и функции
В 1С функции выполняют код и возвращают значение, процедуры – нет. Объявлять типы нельзя, но в новой IDE их пытаются определять через комментарии (это влияет только на удобство разработки).
Пример функции: принимает два параметра (первый обязателен, второй по умолчанию "2"), выполняет цикл for и возвращает результат.
МойРезультат = ИмяФункции(100);
1С использует Клиент-Серверную архитектуру, и код пишется с указанием места выполнения с помощью директив (&НаКлиенте, &НаСервере и др.).
Разработчик сразу определяет, где будет выполняться процедура:
  • На клиенте
  • На сервере
  • На обоих (с ограничениями, так как код должен быть совместим для обеих сред)
9.Модули в 1С
Весь код хранится в модулях. В отличие от классического программирования, где поля описываются кодом, в 1С многие вещи создаются через интерфейс. Однако сам код всегда находится в одном из модулей.
  • Модуль объекта – привязан к конкретному экземпляру (например, товар в справочнике). Содержит события объекта, например, ПередЗаписью(), где можно изменить данные перед сохранением в БД.
  • Модуль менеджера – аналог статических методов класса, не имеет доступа к конкретному объекту.
  • Модуль формы – отвечает за логику интерфейса, здесь активно используется клиент-серверный подход. Важно правильно разделять методы, так как серверные вызываются с передачей данных, что может быть ресурсоёмким.
  • Общие модули – аналог статических классов. Например:1C,КопироватьРедактировать
СтроковыеМетоды.КоличествоСлов(МояПеременная);
  • Используются для хранения вспомогательных функций и процедур.
Есть и другие модули, но эти – основные для понимания кода на 1С.
Мы вызываем общую процедуру, которая берет текущие данные строки в элементе "Товары" и заполняет Сумму. Теперь пересчёт происходит автоматически.
Это наш первый код, синтаксис понятен без лишних пояснений. У нас уже есть два справочника и документ.
Теперь разберём
Регистры в 1С похожи на таблицы SQL, храня данные в строках и предоставляя интерфейс для работы с ними.
Сейчас используем РегистрНакопления, который хранит данные и позволяет быстро получать остатки.
Создаём регистр "ОстаткиТоваров":
  • Измерение: Товар (ссылка на справочник Товары)
  • Ресурс: Количество (число, длина 10, точность 2)
В таблицу регистра будут записываться закупки и продажи, позволяя в любой момент получить остатки товаров.
  • Измерения – ключевые поля (например, Товар, Склад).
  • Ресурсы – числовые поля, которые платформа автоматически подсчитывает.
  • Теперь указываем, какой документ будет записывать данные в регистр, так как большинство регистров редактируются только через документы. Добавляем наш документ в качестве Регистратора.
В таблицу регистра будут записываться закупки и продажи, позволяя в любой момент получить остатки товаров.
  • Измерения – ключевые поля (например, Товар, Склад).
  • Ресурсы – числовые поля, которые платформа автоматически подсчитывает.
  • Теперь указываем, какой документ будет записывать данные в регистр, так как большинство регистров редактируются только через документы. Добавляем наш документ в качестве Регистратора.
Здесь мы можем выбрать какое поле из документа должно попадать в какое поле регистра:
После нажатия "Ок" мы попадаем в модуль объекта, где уже создана процедура проведения документа по регистру.
В реальной разработке 1С конструктор движений почти не используется, так как логика обычно сложнее, чем просто копирование строк из ТЧ в регистр. Но для ознакомления он подойдёт.
Так как мы работаем в модуле объекта, у нас есть доступ к данным текущего документа. Мы можем заполнить Движения на основе Табличной части "Товары".
Теперь запускаем пользовательский режим, создаём новый документ и проводим его, чтобы строки попали в регистр.
Теперь в нашем регистре появилась первая запись:
Теперь у нас есть запись прихода (с зелёным плюсом), и в остатках товара уже 10 штук.
Теперь добавим продажу. Для этого копируем документ в конфигураторе и называем его "РасходТовара".

10.Общие модули
И вот мы пришли к одному из главных минусов в 1С... Нельзя наследоваться от своих классов.
Разработка двух идентичных документов требует дублирования изменений. Например, если нужно добавить реквизит "Валюта", его придётся прописывать вручную в обоих документах.
Чтобы упростить код, вынесем процедуру заполнения суммы в общий модуль "ОбщиеКлиентскиеМетоды" с флажком "Клиент". Это позволит использовать её сразу в обоих документах, вызывая единым способом.
Весь код в таком модуле будет выполняться на клиенте и со стороны сервера его вызвать нельзя. Перенесем в этот модуль нашу процедуру из формы. И немного изменим.
В общем модуле нет доступа к контексту формы. Поэтому, нам нужно передать в процедуру элемент с таблицей.
Теперь изменим код в формах обоих документов:
Вот таким образом и происходит выделение одинакового кода в общие модули. Повторим такое же действие с процедурой проведения. Сделаем ещё один общий модуль "ПроведениеДокументов" с галочкой Сервер и вынесем туда нашу процедуру, чуть изменив.
Теперь наша процедура принимает на вход объект класса документ и вид движения (приход или расход). Вот так выглядит вызов этой процедуры:
Мы передаём в метод ЭтотОбъект (this) и вид движения (приход или расход).
Таким образом, мы уменьшили дублирование кода, несмотря на отсутствие полноценного наследования.
Для кода есть подписки на события, позволяющие выполнять общий код для нескольких объектов.
Однако:
  • Поля наследовать нельзя.
  • Формы наследовать сложно, поэтому это редко используется.
  • Настоящее наследование доступно только для базовых классов платформы.
Теперь обновляемся, создаём документ расхода с тем же товаром, но другим количеством. Регистр остатков отразит изменения.
Теперь мы можем вносить приходы и расходы товаров. Но как вывести пользователю информацию об остатках? Сделаем для этого отчет.

11.Отчет

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

Схема компоновки данных (СКД) – ключевой механизм 1С для создания гибких отчётов.
Она позволяет быстро разрабатывать отчёты, которые пользователь может донастроить сам.
Шаги:
  1. Создаём новый набор данных – Запрос.
  2. Открываем конструктор запроса для настройки источника данных.
Язык запросов 1С похож на SQL, но с одним принципиальным отличием – он предназначен только для выборки данных.
Изменять данные в БД через запросы нельзя, это делается только через объектную модель.
Конструктор запросов помогает интерактивно создавать запросы:
  • Слева – доступные таблицы БД.
  • По центру – выбранные таблицы.
  • Справа – выбранные поля.
Есть и другие вкладки, но разберём их позже.
Вы заметили, что регистр накопления у нас один, а таблиц целых четыре? Дело в том, что 1С достраивает своего рода вьюшки, которые доступны разработчику 1С. Нам нужна та, которая покажет остатки. Т.е. сводную информацию в разрезе товара. Сохраним такой запрос
Вот так выглядит текст запроса:
К тексту мы ещё вернёмся, но сначала донастроим отчет. Выведем теперь все поля пользователю:
12.Работа с отчетом
Созданный отчет автоматически наполнился всем нужным пользователю функционалом. Настройки и их сохранение и загрузка, поиск по результату и вывод в файл или на принтер. Нам больше ничего делать не нужно и достаточно просто сформировать отчет.
Вот такой простой результат. Он показывает в разрезе товара сколько осталось. Сделаем ещё один отчет "ВсеДвиженияТоваров". И в качестве запроса укажем просто вывод всего из таблицы регистра:
Для наглядности я создал ещё несколько документов.

Но что, если пользователь хочет изменить настройки отчета? Например, вывести организацию из документа? Нажмём "Изменить вариант":
Это интерфейс настройки отчёта, в котором пользователь может:
  • Изменять выводимые поля и структуру.
  • Настраивать отборы, сортировку, оформление.
  • Добавлять свои вычисляемые поля (через язык выражений 1С).
На скрине отключены ненужные поля, а также:
  • Вынесен Код из Товар.
  • Организация из Регистратора (документа).
  • ИНН организации.
В 1С обращение через точку используется повсеместно, в том числе в режиме пользователя.
Теперь формируем отчёт – и вот так пользователь быстро подстроил данные под себя.
Это интерфейс настройки отчёта, в котором пользователь может:
  • Изменять выводимые поля и структуру.
  • Настраивать отборы, сортировку, оформление.
  • Добавлять свои вычисляемые поля (через язык выражений 1С).
На скрине отключены ненужные поля, а также:
  • Вынесен Код из Товар.
  • Организация из Регистратора (документа).
  • ИНН организации.
В 1С обращение через точку используется повсеместно, в том числе в режиме пользователя.
Теперь формируем отчёт – и вот так пользователь быстро подстроил данные под себя.
13.Компоновка данных
Мы писали один запрос (с выборкой из таблицы регистра), но пользователь смог вывести ещё и данные из документов, товаров и организаций.
Почему так происходит?
Система компоновки данных (СКД) автоматически дорабатывает текст запроса, учитывая настройки пользователя.
То есть 1С сама добавляет необходимые соединения таблиц, чтобы получить всю нужную информацию.
В итоге наш изначальный запрос трансформировался в более сложный SQL-запрос, включающий дополнительные таблицы.
Мы видим, что в запросе выбираются те поля, которые нужны. И не выбираются те, которые отключены. А так же выбираются поля "через точку". Товар.Код, Организация.ИНН и так далее.
Дело в том, что хоть язык запросов 1С и сделан по образу и подобию SQL, но при этом позволяет ещё делать "обращения через точку". Откроем запрос в конструкторе:
В конструкторе отчёта наглядно видно, как поле Товар (ссылка на справочник) можно развернуть и получить его данные.
Так работает любой запрос с ссылочными типами – на уровне SQL это превращается в соединение таблиц.
Обращение "через точку" используется повсеместно, включая:
  • Отборы в отчётах – доступны все поля, включая подчинённые.
  • Разные варианты сравнения.
  • Группировка условий отбора.
Всё это автоматически реализует сама платформа 1С.
Вот такой запрос получается:
Пользователь не должен ломать ваш сложный и оптимизированный запрос.
Для этого в языке запросов 1С есть специальные конструкции, которые ограничивают возможные изменения.
Пример: можно явно задать состав разрешённых полей для отбора:
  • Товар.* – разрешает отбор по реквизитам товара.
  • Регистратор.Реквизит – запрещён (можно только указывать конкретные документы).
Так 1С гибко управляет настройками, не давая пользователю сломать запрос.
14.Итоги
Мы сделали простое приложение на 1С. Попутно рассмотрели подход в разработке и несколько самых популярных типов объектов. Написали пару простых процедур и запросов. Пообзывали 1Сные объекты "по-программистски". И теперь примерно понимаем, что вообще из себя представляет 1С.

15.Практические задания по блокам
  1. Установите учебную версию платформы «1С:Предприятие 8.3».
  2. Установите учебную конфигурацию «1С:Бухгалтерия 8» и создайте новую информационную базу на основе шаблона «1С:Бухгалтерия 8. Учебная версия».