Не случайно везде слова «программа», «программировать» мы используем в кавычках. Собственно программирование (в привычном его понимании – написание кода программы) занимает в 1С:Предприятии значительное, но далеко не главное место.
Поскольку 1С:Предприятие, как мы говорили в начале, специализированная система, она «прячет» от разработчика многие скучные, рутинные действия. Так все программы 1С:Предприятия по большому счету имеют одинаковую логику и технологию построения. Любая программа собирается из готовых «кубиков». Набор «кубиков» ограничен, платформа изначально знает, для чего предназначены те или иные «кубики», знает, как они между собой взаимодействуют.
Таким образом, разработчику достаточно просто добавить в информационную базу нужные «кубики» – и все это сразу же будет работать, платформа самостоятельно обеспечит правильное функционирование добавленных «кубиков».
Конечно, такое функционирование сильно ограничено. В реальной жизни все бывает намного интереснее и разнообразнее. Для этого существует встроенный язык, язык запросов, с помощью которых можно задавать особенное поведение этих «кубиков», можно описывать особенные алгоритмы взаимодействия этих кубиков между собой, можно создавать собственные алгоритмы обработки данных и т. д.
Как мы говорили в начале, сейчас мы делаем «Hello, World!» в исполнении 1С. Поэтому встроенный язык, а тем более язык запросов мы использовать практически не будем. Это отдельная сложная тема.
Сейчас наша задача – собрать из кубиков простую программу. То есть показать «костяк» разработки. Прикручивать «бантики», улучшать, дорабатывать – можно будет потом, если у вас будет желание и возможности. Но важно, что даже в таком «скелетном» виде наша программа будет вполне функциональна и работоспособна, причем, минимальными усилиями.
Примечание. Чтобы убедиться в этом, можете попробовать создать аналогичную по функциональности программу с помощью какой-нибудь универсальной среды разработки, и сравнить затраченные усилия и необходимые знания.
Итак, вернемся к «кубикам». Поскольку назначение программ системы 1С:Предприятие четко определено, используются не абстрактные, а вполне конкретные «кубики», соответствующие сущностям, присутствующим в реальной жизни автоматизируемого предприятия или частного лица. Например, справочник или документ.
В 1С:Предприятии эти «кубики» называются объектами конфигурации. Все объекты конфигурации собираются в дерево. Таким образом, взглянув на дерево объектов конфигурации, всегда можно понять, из каких объектов она состоит. Можно быстро найти нужный объект, узнать его свойства и т. д.
Сейчас у нас открыт конфигуратор (на рис. 1-10 мы нажали на кнопку Конфигуратор). Чтобы увидеть дерево объектов конфигурации, нужно нажать на кнопку Открыть конфигурацию.
Рис. 2-1. Открыть конфигурацию
Сейчас это дерево «пустое», оно содержит только ветки верхнего уровня объектов метаданных, которые есть в любой информационной базе 1С:Предприятия.
Рис. 2-2. Дерево объектов конфигурации
Все, чем мы будем сейчас, в основном, заниматься, – это добавлять нужные нам объекты конфигурации. По пути мы покажем, где и как можно потом прикрутить «бантики», повысить удобство работы пользователя, но сильно углубляться в это не будем.
Итак, какие объекты конфигурации добавлять? Это зависит от той задачи автоматизации, которая перед нами стоит. Сформулируем.
В нашем мастер-классе мы создадим простейшую учетную систему, которая позволит, с одной стороны, учитывать наши доходы и расходы в разрезах Кошельков и Статей (учет по статьям будем использовать и для затрат, и для поступлений) по Суммам операций. С другой стороны – позволит оперативно контролировать текущие остатки денег в используемых Кошельках и анализировать наши финансовые обороты по Статьям.
Проектировать и создавать наше приложение будем сразу с учетом его будущего использования на мобильных устройствах – чтобы учет денежных средств всегда был под рукой.
При этом работа в самой программе должна быть простой и легкой.
Вот собственно и вся задача, ничего сложного.
Для начала зададим начальные параметры нашего приложения (конфигурации).
Выбираем свойства конфигурации – отмечаем самый верхний уровень дерева конфигурации и из меню по правой кнопке мыши выбираем Свойства. А можно просто нажать Alt+Enter.
Рис. 2-3. Свойства конфигурации
В отрывшейся палитре свойств пишем Имя – МоиДеньги. После нажатия Tab или Enter на клавиатуре, синоним заполнится автоматически.
Рис. 2-4. Имя конфигурации
Кроме этого, сразу укажем платформе 1С:Предприятия, что разработка будет вестись для мобильной платформы. Свойство Назначения использования устанавливаем в Мобильное устройство.
Рис. 2-5. Мобильное устройство
После включения данной опции конфигуратор 1С:Предприятия автоматически настроится для разработки приложения под мобильную платформу. Например, часть объектов конфигурации в дереве станет недоступной. Нас этом вполне устраивает.
По условию поставленной задачи система хранит в себе списки используемых нами кошельков, а так же статей поступлений и затрат. При этом хотелось бы иметь возможность оперативно изменять состав этих списков, подстраиваясь под реалии текущего дня – удалять неиспользуемые, добавлять новые и так далее.
Примечание. Более подробно об объектах метаданных вида Справочник можно узнать по этой ссылке:
Кошелек – как видно из названия, это место хранения определенной суммы. Нашему виртуальному кошельку можно найти прямой аналог в реальности. Например, кошелек с наличными или безналичный счет, связанный с используемой банковской картой.
Статья – элемент классификации (отбора, группировки) движения денежных средств: поступления или траты. Например, отдельной статьей можно считать поступление денег при получении ежемесячной стипендии. Статью можно так и назвать – «Стипендия». И привязывать к ней все поступления аналогичного вида.
Или виды затрат, которые можно сгруппировать по проезду (например, «Метро») или питанию («Завтрак», «Обед», …).
Таким образом, у нас «прорисовываются» два справочника, связанных с реализацией нашей учетной задачи:
Добавление любых объектов конфигурации выполняется одинаковым образом. Нужно выделить ту ветку дерева конфигурации, в которой располагаются нужные объекты, и из контекстного меню выполнить команду Добавить (Ins).
Справочники находятся в ветке дерева, которая так и называется – Справочники. Добавим новый справочник.
Рис. 3-1. Добавление справочника
При добавлении справочника открылось окно редактирования объекта конфигурации. Справочник – довольно сложный объект конфигурации, поэтому для того, чтобы легче и быстрее задать его свойства, система использует этот диалог.
Хотя все те же свойства справочника можно задать и в палитре свойств справа, удобнее пользоваться этим диалогом. Последовательно переходя по закладкам этого диалога, можно заполнить все нужные свойства и ничего не пропустить.
Рис. 3-2. Окно редактирования справочника
Начнем с имени – Кошельки. Синоним система 1С:Предприятие добавит сама, после того, как мы нажмем клавишу Enter или Tab в поле Имя. Больше здесь ничего заполнять не нужно – перейдем на закладку Данные.
Рис. 3-3. Окно редактирования справочника
Увеличиваем длину поля Наименование до 150.
Рис. 3-4. Длина наименования
В принципе, этого вполне достаточно для хранения видов наших кошельков. Можно закрыть окно редактирования свойств справочника кнопкой Закрыть.
Теперь создадим справочник, который будет хранить список статей поступлений и затрат денежных средств.
Аналогично предыдущему справочнику заполним у него имя – Статьи.
Рис. 3-5. Добавление второго справочника
Рис. 3-6. Имя второго справочника
Но перед тем, как перейти на закладку Данные, выполним одну дополнительную относительно справочника Кошельки настройку.
Дело в том, что мы условились хранить в одном справочнике и статьи поступлений, и статьи затрат – ибо идея «деления по статьям» едина для обоих случаев и логично размещать их в одном месте. Но чтобы не мешать все в одну кучу, позволим пользователю группировать используемые статьи по видам. Благо, у платформы 1С:Предприятие для этого есть подходящий удобный механизм – Иерархия в справочнике. При помощи этого механизма можно легко сгруппировать статьи по видам применения, а так же оставить место «универсальным» статьям – таким, которые можно одновременно использовать и при поступлении денег, и при их затратах (например, переводы между кошельками или учет долгов).
Перейдем на закладку Иерархия и включим флажок Иерархический справочник. Ограничим уровни иерархии до двух.
Рис. 3-7. Иерархический справочник
Аналогично предыдущему справочнику, устанавливаем на закладке Данные длину Наименования равной 150.
Рис. 3-8. Длина наименования
А теперь воспользуемся еще одной возможностью платформы и поможем пользователю, который будет начинать работу в нашем «приложении» с пустой базы. Заведем несколько значений только что созданного справочника, чтобы пользователю было проще ориентироваться при заполнении оного своими данными. Для этого воспользуемся механизмом платформы 1С:Предприятия – Предопределенные данные.
Перейдем на закладку Прочее и нажмем кнопку Предопределенные.
Рис. 3-9. Предопределенные данные
В отрывшемся окне нажмем кнопку Добавить группу (Ctrl+F9).
Рис. 3-10. Добавить группу
И добавляем группу для статей поступлений денежных средств. Пишем Имя – Поступления. После нажатия клавиши Enter или Tab система автоматически заполнит поле Наименование. После этого можно нажать OK.
Рис. 3-11. Группа Поступления
Аналогично добавляем группу для статей затрат – Затраты.
Рис. 3-12. Группа Затраты
В заключение, добавим один предопределенный элемент, который пригодится нам впоследствии – Перевод. С помощью него мы реализуем механизм перевода денег между кошельками.
Нажмем кнопку Добавить (Ins).
Рис. 3-13. Добавить элемент справочника
Заполняем поле Имя – Перевод. Проверяем, чтобы элемент располагался в корне нашего справочника – на одном уровне с созданными чуть ранее группами (поле Родитель должно отображать «Элементы»)
Рис. 3-14. Элемент справочника Перевод
На этом создание справочника Статьи можно считать законченным.
Перед тем как перейти к следующему этапу разработки стоит сохранить наши наработки. Нажмем кнопку Обновить конфигурацию базы данных (F7).
Рис. 3-15. Обновить конфигурацию базы данных
Система отобразит изменения, внесенные в конфигурацию (только что созданные нами справочники) – принимаем изменения.
Рис. 3-16. Реорганизация информации
Отлично, справочник Кошельки может содержать записи обо всех наших местах хранения денег. Справочник Статьи – информацию о статьях поступления денег и их затратах, удобно сгруппированных по смыслу.
Идем дальше.
Теперь перейдем к добавлению «кубиков», которые на первый взгляд могут показаться не совсем очевидным. Добавим два регистра накопления Кошельки и Затраты.
Сразу возникает вопрос: что такое регистр? Непонятно! Зачем он вообще нужен?
Попробуем объяснить просто. По условиям задачи наша система должна не просто хранить списки кошельков и статей поступлений/затрат денег. Она должна уметь вести базовый финансовый учет – как минимум регистрировать денежные потоки и предоставлять минимальную отчетность, что же с нашими финансами происходит.
Примечание. Более подробно об объектах метаданных вида Регистр накопления можно узнать по этой ссылке:
Регистрация различных событий, связанных с поступлением и тратой денег, будет производиться такими объектами конфигурации, как Документы. Чуть позже мы добавим парочку документов в нашу конфигурацию.
Кроме регистрации фактов поступления и расходования денежных средств, мы наверняка захотим получать какие-то показатели, наглядно отображающие происходящее с нашими финансами. Как минимум мы ожидаем увидеть актуальные остатки по кошелькам и обороты денег по используемым статьям.
Такие данные вполне можно было бы получить из тех данных, которые содержатся во вводимых документах поступления и расходования денег. Но представьте, что через месяц (или год), например, вы решите дополнить свой финансовый учет новыми документами или функционально расширить уже существующие. Или документов станет настолько много, что перебор их для получения необходимых значений начнет занимать ощутимое время.
Внести изменения в конфигурацию, как вы уже поняли, задача несложная. Алгоритмы расчета нужных показателей тоже, в принципе, переписать несложно. Но количество таких задач со временем будет расти как снежный ком. И все придется учитывать, за всем следить, переделывать одно и то же по нескольку раз, увеличивая риск возникновения ошибок…
Чтобы избежать этой рутинной и довольно неэффективной работы в системе 1С:Предприятие применяется следующий подход.
Для хранения данных о движениях каких-либо сущностей (например, финансов) используются специальные объекты конфигурации – регистры. Документы, которые отражают события финансовой деятельности, заносят свои данные в эти регистры. А нужные нам показатели рассчитываются по данным этих регистров.
В результате мы получаем независимую структуру. С одной стороны, однажды создав регистры нужной нам структуры, мы можем сразу же получать оттуда нужные данные. С другой стороны, при появлении новых видов документов в системе нам нужно будет всего лишь правильно написать алгоритм, по которому их данные помещаются в эти регистры. При этом вся созданная нами аналитика на основании этих регистров останется актуальной и мы по-прежнему будем получать правильные данные.
Рис. 4-1. Схема Документы-Регистры-Отчеты
Итак, для нашей задачи достаточно создать два регистра накопления – Кошельки и Затраты.
Смысл регистра Кошельки состоит в быстром получении остатков по используемым кошелькам. Т.е. можно будет быстро узнать, сколько в каком кошельке доступно денег в настоящий момент времени.
Регистр Затраты позволит анализировать обороты по используемым статьям движений денежных средств. Иными словами этот регистр покажет объемы затрат по той или иной статье – например, это пригодится при выявлении наиболее затратных для нас видов деятельности.
Регистры накопления находятся в ветке дерева объектов конфигурации, которая так и называется: Регистры накопления. Добавим новый регистр накопления.
Рис. 4-2. Создание регистра накопления
Назовем регистр Кошельки. Вид регистра - устанавливаем Остатки. После чего можно перейти к закладке Данные.
Рис. 4-3. Регистр накопления Кошельки
Здесь нам предстоит добавить измерения, ресурсы и реквизиты регистра.
Рис. 4-4. Данные регистра накопления
Ресурсы – это те данные, которые мы хотим получать из регистра. В нашем случае мы хотели бы знать сумму наших средств по кошелькам. Значит, нам нужен всего один числовой ресурс – Сумма.
Измерения – это то, в каких разрезах мы хотели бы получать данные из регистра. Вряд ли нам будет интересно каждый раз наблюдать только лишь остаток денег «вообще». Поэтому, понадобится измерение – Кошелек.
Реквизиты – это дополнительная информация, сопровождающая каждую запись в регистре. В нашем случае в реквизит мы будем помещать информацию о статье, сопровождающей запись в регистр. Соответственно заводим единственный реквизит – Статья.
Итак, добавим перечисленные измерение, ресурс и реквизит. Для добавления будем пользоваться контекстным меню, которое вызывается на соответствующих ветках данных регистра на закладке Данные.
Добавим измерение.
Рис. 4-5. Добавление измерения
В палитре свойств укажем, что называться оно будет Кошелек, и выберем тип – СправочникСсылка.Кошельки.
Рис. 4-6. Свойства измерения Кошелек
Теперь добавим ресурс – Сумма. Тип (число) и длину оставим такими, какие предложены по умолчанию – нас это устраивает. Скорректируем только Точность – с 0 на 2.
Рис. 4-7. Свойства ресурса Сумма
В заключение добавляем реквизит – Статья. В палитре свойств выберем тип – СправочникСсылка.Статьи.
Рис. 4-8. Свойства реквизита Статья
В результате регистр накопления Кошельки будет выглядеть следующим образом.
Рис. 4-9. Регистр Кошельки
Аналогичным образом добавим в конфигурацию еще один регистр накопления – Затраты. В отличие от регистра Кошельки, у которого вид был выбран как Остатки, вид нового регистра устанавливаем в Обороты.
Рис. 4-10. Регистр накопления Затраты
Так как этот регистр предназначен для анализа оборотов по статьям, в измерение у нас пойдет Статья. Ресурс останется идентичным ресурсу регистра Кошельки – Сумма. А в реквизит поместим данные по кошельку, который связан с фиксируемой записью в регистре. Переходим на закладку Данные и заводим необходимое.
Добавим измерение. В палитре свойств укажем, что называться оно будет Статья, и выберем тип – СправочникСсылка.Статьи.
Рис. 4-11. Свойства измерения Статья
Теперь добавим ресурс – Сумма. Тип и длину оставим такими, какие предложены по умолчанию. Точность – 2.
Рис. 4-12. Свойства ресурса Сумма
Осталось добавить реквизит – Кошелек. В палитре свойств выберем тип – СправочникСсылка.Кошельки.
Рис. 4-13. Свойства реквизита Кошелек
В результате регистр накопления Статьи будет выглядеть следующим образом.
Рис. 4-14. Регистр Статьи
Теперь перейдем к добавлению документов, регистрирующих поступление и расход денежных средств. Начнем с документа Доход.
Примечание. Более подробно об объектах метаданных вида Документ можно узнать по этой ссылке:
Документы находятся в ветке дерева объектов конфигурации, которая так и называется: Документы. Добавим новый документ.
Рис. 5-1. Добавление нового документа
Назовем его Доход и перейдем на закладку Данные.
Рис. 5-2. Создание документа Доход
У каждого документа стандартно есть два реквизита – номер и дата создания. Однако, кроме них, всегда хочется иметь еще какую-то информацию, характеризующую конкретный документ. Например, в нашем случае хотелось бы понимать, в результате какого события к нам поступили денежные средства – на какой кошелек и к какой статье это событие можно отнести.
Для того чтобы впоследствии иметь возможность отслеживать поступления по кошелькам и статьям, заведем два соответствующих реквизита – Кошелек и Статья. Для фиксации самой суммы операции – реквизит Сумма. Для пометок пользователя добавим еще реквизит Комментарий:
В результате этих действий данные документа будут иметь следующий вид:
Рис. 5-3. Заполнение документа реквизитами
Рис. 5-4. Реквизит Кошелек
Рис. 5-5. Реквизит Статья
Рис. 5-6. Реквизит Сумма
Рис. 5-7. Реквизит Комментарий
Заключительный, но самый важный этап работы с документом – перейдем на закладку Движения.
Как мы уже объясняли ранее, документы записывают какие-то данные в регистры, а уже из регистров мы получаем данные в том виде, который удобен для последующего анализа. Можно просто сохранить документ в системе, но на данных в регистрах это никак не отразится. Для того, чтобы документ «отметился» в регистре – нужно сформировать движения этого документа по нужному регистру.
Движения документа – это как раз те записи, которые документ делает в регистрах. В нашем случае – документ Доход должен «отметиться» в регистре Кошельки.
Поэтому раскроем ветку Регистры накопления и отметим флажком регистр Кошельки, после чего нажмем кнопку Конструктор движений, чтобы система помогла нам сформировать алгоритм записи данных в этот регистр.
Рис. 5-8. Конструирование движений документа по регистру
Откроется конструктор движений документа. Здесь мы оставим тип движений как есть («Приход», т.к. наш документ будет регистрировать поступление денег) и нажмем кнопку Заполнить выражения.
В таблице, расположенной в нижней части окна конструктора, мы увидим, что система автоматически установила соответствие между реквизитами регистра накопления и реквизитами документа. Так, в измерение регистра Кошелек будут записаны данные реквизита Кошелек документа, в ресурс Сумма – данные реквизита Сумма документа, а в реквизит регистра Статья – Статья из документа.
После заполнения и проверки таблицы соответствий можно нажать кнопку OK.
Рис. 5-9. Конструктор движений
Система сформирует процедуру записи данных документа в регистр и покажет ее на экране.
Рис. 5-10. Процедура записи данных документа в регистр
Как можно заметить, процедура довольно проста. В регистр добавляется новая запись, куда из документа попадают данные из соответствующих реквизитов.
Мы могли бы написать этот алгоритм сами, но для облегчения работы мы воспользовались конструктором движений. Конструктор сформировал этот код автоматически, о чем говорят комментарии в начале и в конце процедуры.
С учетом поступления денег мы закончили. Но надо фиксировать еще и расходы. По логике вещей, нужно создать документ Расход. Можно быстро создать его вручную по образу и подобию уже существующего документа Доход – ведь по своему составу они будут практически идентичны. А можно воспользоваться сервисом платформы 1С:Предприятия – созданием новых объектов конфигурации на основании уже существующих путем их копирования.
Для этого нужно установить курсор на существующий документ Доход в списке объектов метаданных и нажать кнопку Добавить копированием (F9).
Рис. 5-11. Добавление копированием
После нажатия на эту кнопку появится новый документ Доход1 – точная копия Доход.
Рис. 5-12. Копия документа Доход
Нам останется только переименовать этот документ и несколько подправить его свойства. Этим и займемся.
Прежде всего откроем окно редактирования его свойств и изменим имя документа – Расход. После чего переходим на закладку Данные.
Рис. 5-13. Документ Расход
На закладке Данные изменим при помощи палитры свойств название реквизита Статья, переименовав его в Цель.
Рис. 5-14. Переименование реквизита Статья в Цель
Здесь требуется небольшое пояснение. Дело в том, что документом Расход мы предоставляем пользователю два сервиса – два вида операции:
То есть один документ сможет регистрировать либо перевод денег между кошельками, либо какую-либо трату с привязкой к статье расходов.
Для определения впоследствии какой из видов операции необходим пользователю, реквизиту Цель устанавливаем составной тип – СправочникСсылка.Кошельки и СправочникСсылка.Статьи.
Рис. 5-15. Изменения типа реквизита Цель
Если целью будет выбран кошелек – это перевод. Потому что и источник (реквизит Кошелек), и приемник (реквизит Цель) – кошельки. Если в цели будет указана статья, то это регистрация финансовой затраты.
Остальные реквизиты не трогаем – они нас полностью устраивают.
Переходим на закладку Движения. Здесь нам нужно будет переделать движения документа. Сейчас они скопированы из документа Доход. Тот документ учитывал поступления денег. Здесь же нам нужно учитывать переводы и расходы.
Включаем флажки для обоих регистров – Кошельки и Затраты. После чего запустим конструктор движений. Система предупредит нас, что существующая процедура проведения будет замещена. Согласимся.
Рис. 5-16. Конструктор движений
Для регистра Кошельки (он должен автоматически подставиться в список регистров левой верхней части окна конструктора) все выполняем по аналогии с предыдущим документом. Меняем только тип движения документа на Расход и жмем кнопку Заполнить выражения.
Рис. 5-17. Конструктор движений
Обратите внимание, поле регистра Статья в нижней части окна конструктора осталось незаполненным. Дело в том, что конструктор «угадывает» соответствие по именам реквизитов. А в нашем документе Расход реквизита Статья нет. Поможем конструктору – установим курсор на сточку с полем Статья, после чего дважды кликнем мышкой по реквизиту Цель в правой верхней части окна конструктора (в области Реквизиты документа).
Рис. 5-18. Заполнение поля Статья
Это еще не все. Если документу Доход было достаточно формировать записи только в регистре Кошельки, то документу Расход нужно фиксировать так же расходы в регистре Затраты. Поэтому, не закрывая окно конструктора движений, добавляем в список регистров (слева сверху) еще и регистр Затраты.
Рис. 5-19. Добавление регистра Затраты
Убеждаемся, что курсор встал на регистр Затраты и снова нажимаем кнопку Заполнить выражения.
Рис. 5-20. Заполнить движения по Затратам
Видим, что как и в предыдущем случае автоматически не заполнилось поле регистра Статья. Аналогично описанному выше заполняем поле Статья реквизитом документа Цель.
Рис. 5-21. Цель в Статью
Теперь все готово для формирования движений по регистрам – нажимаем на кнопку OK.
Рис. 5-22. Автоматически сформированный конструктором модуль проведения документа Расход
Можно заметить, что в части движений по регистру Кошельки отличие от документа Доход минимальны – по сути всего в одной строке, которая задает вид движений. В нашем случае в регистр будут добавляться движения расхода. Кроме этого, в модуль проведения добавился программный код создания записи в регистре Затраты. В этом тоже нет ничего сложного.
Единственное, что следует пояснить – данный набор движений реализует только один вид деятельности документа Расход – фиксацию затраты денег. А как обсуждалось выше, нужно чтобы документ Расход реализовывал еще и перевод денег из кошелька в кошелек.
Здесь (впервые за наш мастер-класс) придется немного модифицировать программу проведения документа вручную.
Определить вид операции документа Расход несложно – достаточно проанализировать тип выбранного в реквизите Цель значения. Для этого в модуль проведения документа нужно добавить классическое условие «Если - Тогда – Иначе».
Если тип значения в реквизите Цель - СправочникСсылка.Статьи, то это затрата и блок записи в регистры у нас уже есть (сформирован конструктором – см. рис. 5-22).
Если тип значения в реквизите Цель - СправочникСсылка.Кошельки, формируем записи о переводе в регистре Кошельки. Одна запись должна списать (вычесть) указанную сумму из кошелька реквизита Кошелек, другая запись должна добавить эту же сумму в кошелек реквизита Цель. Регистр Затраты в данном случае «трогать» не нужно.
Кстати, здесь пригодится предопределенный элемент справочника Статьи – Перевод. Именно его будем записывать в реквизит Статья регистра Кошельки при формировании перевода.
После реализации всех правок, модуль проведения документа Расход должен выглядеть подобным образом:
Процедура ОбработкаПроведения(Отказ, Режим)
//Если цель затраты - кошелек, то это перевод и мы делаем два проведения ТОЛЬКО по регистру кошельков и ни одного по затратам
Если ТипЗнч(Цель) = Тип("СправочникСсылка.Кошельки") Тогда
//1. Списываем с кошелька-источника
Движения.Кошельки.Записывать = Истина;
Движение = Движения.Кошельки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Кошелек = Кошелек;
Движение.Статья = Справочники.Статьи.Перевод;//ПРЕДОПРЕДЕЛЕННЫЙ!
Движение.Сумма = Сумма;
//2. Добавляем в кошелек-получатель
Движения.Кошельки.Записывать = Истина;
Движение = Движения.Кошельки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Кошелек = Цель;
Движение.Статья = Справочники.Статьи.Перевод;//ПРЕДОПРЕДЕЛЕННЫЙ!
Движение.Сумма = Сумма;
//Если же это просто затрата - делаем проводку и по затратам, и по кошелькам!
//(оставляем то, что было сформировано конструктором)
Иначе
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр Кошельки Расход
Движения.Кошельки.Записывать = Истина;
Движение = Движения.Кошельки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Кошелек = Кошелек;
Движение.Сумма = Сумма;
Движение.Статья = Цель;
// регистр Затраты
Движения.Затраты.Записывать = Истина;
Движение = Движения.Затраты.Добавить();
Движение.Период = Дата;
Движение.Статья = Цель;
Движение.Сумма = Сумма;
Движение.Кошелек = Кошелек;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецЕсли;
КонецПроцедуры />
Рис. 5-23. Доработанный текст модуля проведения документа Расход
Текст модуля можно увидеть в файле «Документ Расход - модуль.txt» на диске, приложенном к книге.
Перед тем как перейти к следующему этапу разработки сохраним наши наработки. Нажмем кнопку Обновить конфигурацию базы данных (F7).
Рис. 5-24. Обновить конфигурацию базы данных
Система традиционно отобразит изменения, внесенные в конфигурацию (только что созданные нами регистры и документы) – принимаем.
Рис. 5-25. Обновление конфигурации базы данных
Теперь в системе есть справочники, в которых пользователь будет хранить свои кошельки и статьи движений денежных средств. Есть регистры, из которых можно будет оперативно получать необходимую информацию, и присутствуют документы фиксации доходов и расходов.
По сути, каркас прикладного решения готов. Функционально он уже реализует поставленные перед ним учетные задачи практически полностью. Посмотрим, удобно ли будет пользователю использовать наше решение.
Запускаем пользовательский режим. Чтобы из режима конфигуратор запустить систему в пользовательском режиме (1С:Предприятие), нужно нажать кнопку Начать отладку (F5).
Рис. 5-26. Начать отладку
Итак, мы создали каркас учетной системы. Задачи по регистрации финансовых операций она уже вполне способна выполнять. На данный момент назвать работу в программе простой можно, но удобной – вряд ли :=)
Посмотрим на основное окно программы.
Рис. 6-1. Рабочий стол
Рабочий стол – пуст. Для того, чтобы завести новые документы или записи в справочники приходится «интуитивно» догадываться куда нажимать и что делать – благо, есть список доступных вариантов слева. Конечно же, пользователю будет в таком окружении некомфортно. Попробуем облагородить это рабочее пространство.
Для начала создадим рабочее пространство пользователя, с которого он будет начинать свою работу в приложении – форму рабочего стола. Обратите внимание, до этого момента платформа 1С:Предприятия генерировала все экранные формы «на лету» – учитывая состав и особенности справочников, документов и регистров, которые мы создали на предыдущем этапе.
Согласно условию поставленной задачи, пользователь должен смочь быстро зафиксировать доход или расход денежных средств, а так же иметь возможность оперативно контролировать остатки в своих кошельках и видеть обороты по статьям затрат.
Логично предположить, что именно этот функционал должен всегда быть «под рукой» – т.е. располагаться на рабочем столе нашего приложения.
Возвращаемся в конфигуратор, открываем ветку в дереве метаданных Общие, активируем раздел Общие формы и добавляем туда новую форму.
Рис. 6-2. Добавляем новую общую форму
Тип формы – Произвольный. Имя – РабочийСтол. Синоним – Мои деньги. После этого нажмем кнопку Готово.
Рис. 6-3. Параметры общей формы
Откроется конструктор формы, в котором мы продолжим ее настройку.
Рис. 6-4. Общая форма Мои деньги
По условию задачи нужно демонстрировать остатки в кошельках и обороты по статьям затрат. Для этого на форму добавим две таблицы, которые будут содержать необходимые показатели.
Сначала – таблица остатков в кошельках. Добавляем новый реквизит формы – Остатки. Кнопка Добавить реквизит (Ins) в правом верхнем разделе конструктора формы.
Рис. 6-5. Новый реквизит формы
В палитре свойств для нового реквизита пишем имя – Остатки. Выбираем тип – ТаблицаЗначений.
Рис. 6-6. Реквизит формы Остатки
После этого для реквизита Остатки добавляем две колонки – кнопкой Добавить колонку реквизита.
Рис. 6-7. Новая колонка реквизита
Первой колонке назначаем имя – Кошелек. В палитре свойств выбираем для нее тип – СправочникСсылка.Кошельки.
Рис. 6-8. Колонка реквизита Кошелек
Вторая колонка – Сумма. Тип – Число. Длина – 10. Точность – 2.
Рис. 6-9. Колонка реквизита Сумма
Теперь следует только что созданный реквизит (таблицу Остатки) расположить на форме. Для этого берем ее левой кнопкой мыши и перетаскиваем на форму. Можно перетащить в левую верхнюю область конструктора формы – например, на надпись Форма. А можно непосредственно на область предварительного просмотра компоновки элементов формы – в нижней части конструктора.
Рис. 6-10. Размещение реквизита Остатки на форме
На вопрос, следует ли добавить колонки таблицы Остатки, отвечаем положительно.
Рис. 6-11. Таблица Остатки на форме
Корректность результата размещения таблицы на форме можно проконтролировать в области предварительного просмотра в нижней части конструктора форм – см. рис. 6-12.
Рис. 6-12. Предварительный просмотр
Теперь можно добавить вторую таблицу, которая будет отображать пользователю обороты по используемым им статьям расходов.
Полностью аналогично предыдущим действиям добавим новый реквизит и называем его Затраты. Выбираем тип – ТаблицаЗначений.
Рис. 6-13. Новый реквизит формы
Рис. 6-14. Реквизит формы Затраты
Далее добавим в эту таблицу две колонки – Статья и Сумма. Для колонки Статья указываем тип СправочникСсылка.Статьи. Колонку Сумма вообще можно скопировать через буфер обмена (Ctrl+C, Ctrl+V) из реквизита Остатки. А можно завести снова вручную: тип – Число. Длина – 10. Точность – 2.
Рис. 6-15. Колонка реквизита Статья
Рис. 6-16. Колонка реквизита Сумма
Теперь поместим созданный табличный реквизит Затраты на форму. Перетащим его мышкой на форму, ответим положительно на вопрос следует ли добавить колонки таблицы Затраты и проконтролируем, чтобы он разместился ниже таблицы Остатки – это можно сделать соответствующими клавишами на панели над полями формы, или попросту передвигая таблицу в окне предварительного просмотра.
Рис. 6-17. Таблица Затраты на форме
Рис. 6-18. Клавиши перемещения элементов формы
В итоге форма рабочего стола будет содержать две таблицы – Остатки и Затраты, одна над другой.
Рис. 6-19. Форма рабочего стола
Теперь, чтобы созданная форма рабочего стола стала доступна пользователю, платформе 1С:Предприятие нужно сообщить об этом. Переходим в свойства конфигурации и в палитре свойств нажимаем мышью на опцию Рабочая область начальной страницы.
Рис. 6-20. Рабочая область начальной страницы
Выберем шаблон рабочего стола – Одна колонка.
Рис. 6-21. Шаблон рабочего стола
Добавляем нашу общую форму РабочийСтол, которую мы подготовили чуть ранее.
Нажимаем кнопку Добавить (Ins) и выбираем форму РабочийСтол из секции Общие, раскрывая Общие формы, после чего нажимаем OK.
Рис. 6-22. Добавление общей формы на рабочий стол
Запускаем пользовательский режим, соглашаемся с предложением об обновлении конфигурации и смотрим, что получилось.
Рис. 6-23. Рабочий стол пользовательского режима
Рабочий стол стал более полезен – уже можно контролировать свои остатки в кошельках и финансовые потоки, иметь быстрый доступ к справочникам и документам для регистрации финансовой деятельности пользователя.
Примечание. Обратите внимание, что рабочий стол довольно «беден» по своему содержимому. И на обычном компьютере с хорошим монитором на этапе разработки и отладки, это вполне естественно бросается в глаза. Тем не менее, следует помнить, что мы создаем кроссплатформенное приложение с ориентацией в первую очередь на работу на мобильных устройствах. И по большому счету мы, как разработчик, не знаем – на планшете оно будет запускаться или на коммуникаторе с небольшим экраном. Поэтому при создании нашего приложения в данном мастер-классе мы исходим из «худших» условий – небольшого экрана мобильного пользователя. И такой рабочий стол будет удобен для использования даже там.
Попробуем зарегистрировать несколько операций. Заодно проверим удобство работы с нашим приложением.
Слева есть список из четырех пунктов:
Рис. 6-24. Список доступных действий
Логично начать с регистрации поступления денежных средств. Кликаем мышью по пункту рабочего стола Доход и в открывшемся пустом списке нажимаем кнопку Создать (Ins).
Рис. 6-25. Создание нового документа Доход
Сделаем попытку зарегистрировать, например, стипендию в размере 10 000 рублей, поступившей к нам на счет банковской карты. В открывшемся окне нового документа заполняем поле Сумма и переходим к полю Кошелек.
Рис. 6-26. Заполнили сумму, перешли к кошельку
Так как в справочниках пока нет никакой пользовательской информации, ее нужно туда завести. И платформа 1С:Предприятие предоставляет удобный сервис для этого. Вариантов заведения нового элемента справочника несколько:
Можно кликнуть мышью по пункту рабочего стола Кошельки и в открывшемся списке завести новый элемент кнопкой Создать (Ins) – см. рис. 6-27. А затем выбрать его в документе.
Можно в форме нашего документа нажать на кнопку выбора элемента справочника в поле Кошелек и выбрать опцию Создать – см. рис. 6-28.
Можно, находясь в поле Кошелек, нажать «быструю клавишу» F8 – см. рис. 6-29.
А можно сразу начать набирать нужное нам наименование элемента справочника – то, которое мы хотим использовать в документе, – и если платформа не найдет такого в справочнике, она предложит его создать (см. рис. 6-30).
Рис. 6-27. Создание нового элемента справочника Кошельки в отдельном списке
Рис. 6-28. Создание нового элемента справочника Кошельки в при попытке выбора в поле документа
Рис. 6-29. Создание нового элемента справочника Кошельки «быстрой клавишей» F8 в поле документа
Рис. 6-30. Создание нового элемента справочника Кошельки в момент ввода в поле документа
Воспользуемся последним вариантом заведения нового элемента справочника – ведь по большому счету пользователь может не знать, есть такой элемент или нет. А платформа «угадает» (подберет) совпадающий с введенными символами элемент, если таковой уже присутствует. А если нет – предложит его создать (см. рис. 6-30).
Итак, набираем в поле Кошелек наименование кошелька – Безналичные.
Рис. 6-31. Создание нового элемента справочника Кошельки
Платформа 1С:Предприятие, не обнаружив в справочнике соответствующего элемента, предложит его создать – соглашаемся.
Рис. 6-32. Новый элемент справочника Кошельки
Видим, что наименование создаваемого элемента заполнилось автоматически нужным нам значением. Нажимаем кнопку Записать и закрыть и убеждаемся, что только что созданный элемент справочника Безналичные подставился в поле Кошелек нашего документа.
Рис. 6-33. Кошелек Безналичные в поле документа
Переходим в поле Статья документа. Здесь поведение платформы при попытке выбора элемента справочника будет мало отличаться от поля Кошелек.
Рис. 6-34. Статья из справочника
Создаем любым удобным способом элемент справочника Стипендия и контролируем, чтобы он находился в группе Поступления. Выбрать нужную группу (справочник иерархический) можно в поле Родитель формы создания элемента.
Рис. 6-35. Новый элемент справочника Статьи
Исправить параметры элемента справочника всегда можно, открыв его в отдельном окне, нажав на кнопку «лупа» в поле документа. А можно просто найти его в списке соответствующего справочника и открыть двойным кликом мыши.
Рис. 6-36. Просмотр элемента справочника
Наш первый документ практически заполнен. По желанию можно что-либо написать в поле Комментарий. Сохранить созданный документ в системе с регистрацией записей в регистрах нужно кнопкой Провести и закрыть.
Рис. 6-37. Сохранение и проведение документа
После того как форма документа закроется, можно самостоятельно проверить списки справочников и документов и удостовериться, что все введенные данные на местах.
Давайте отметим в нашей системе еще одно финансовое событие – снятие наличных с банковской карты. Фактически, с точки зрения нашего приложения, это перевод из «безналичного» кошелька в «наличный» (в реальный кошелек, карман и т.п.).
С точки зрения реализованной в приложении логики за перевод у нас отвечает документ Расход. Создадим такой документ. Сумма пускай будет равна 3 000 рублям. Перевод осуществим с кошелька Безналичные (уже присутствует в справочнике Кошельки) в кошелек Наличные (пока еще отсутствует в справочнике Кошельки).
Переходим в список Расход, нажимаем кнопку создания документа.
Рис. 6-38. Создание нового документа Расход
В открывшемся окне нового документа заполняем поле Сумма и переходим к полю Кошелек.
Рис. 6-39. Заполнили сумму, перешли к кошельку
В поле Кошелек выбираем уже существующий элемент Безналичные. Можно просто начать набирать нужное слово, можно воспользоваться кнопкой быстрого выбора.
Рис. 6-40. Выбор кошелька
В поле Цель при попытке выбора нам будет предложено выбрать тип значения – Кошелек или Статья. Так как мы фиксируем перевод – выбираем Кошелек.
Рис. 6-41. Выбор типа цели
В открывшемся списке кошельков добавляем новый элемент – Наличные. И после сохранения, выбираем его.
Рис. 6-42. Кошелек цели
По желанию заполняем поле Комментарий и сохраняем созданный документ в системе с регистрацией записей в регистрах – кнопка Провести и закрыть.
Рис. 6-43. Сохранение и проведение документа
Проверяем, что в списках появилось все, что было добавлено только что – документ Расход и новый элемент справочника Кошельки. Теперь можно вернуться на рабочий стол и проверить – появились ли какие-нибудь данные в табличках, призванных оперативно отражать финансовые показатели.
Рис. 6-44. Рабочий стол после ввода документов
Таблички пусты. Возможно, регистры не заполнились должным образом при проведении документов в нашем приложении? Проверяем. На данный момент «добраться» до записей регистров не очень просто – платформа 1С:Предприятия по умолчанию скрывает эти списки, ибо простому пользователю от них мало прока. Тем не менее на этапе отладки информация оттуда нам вполне пригодится.
Открываем системное меню и выбираем пункт Все функции…
Рис. 6-45. Все функции…
Раскрываем в дереве метаданных ветку Регистры накопления и выбираем регистр Кошельки. Регистр Затраты нас пока не интересует – в нем пока нет никаких записей, ибо реальных трат мы пока не регистрировали.
Рис. 6-46. Регистр Кошельки
Рис. 6-47. Список записей регистра Кошельки
Убеждаемся, что документы отработали корректно. Первый документ (Доход) создал одну запись в регистре, отмечая факт поступления 10 000 рублей на безналичный кошелек. Второй документ (Расход), фиксируя факт перевода, создал две записи – списание 3 000 рублей с «безналичного» кошелька и приходование этой же суммы на «наличный». При этом использовалась предопределенная статья Перевод, как было изначально спроектировано и реализовано при создании этого документа в нашем приложении.
В чем же дело? Почему таблицы на рабочем столе пусты? Все дело в том, что таблички рабочего стола «ничего не знают» о фактах записи в регистры и никаким образом не получают данные оттуда. Для того чтобы таблицы на рабочем столе заполнялись, нужно прописать логику их заполнения на встроенном языке – иными словам написать немного программного кода.