Не случайно везде слова «программа», «программировать» мы используем в кавычках. Собственно программирование (в привычном его понимании – написание кода программы) занимает в 1С:Предприятии значительное, но далеко не главное место.
Поскольку 1С:Предприятие, как мы говорили в начале, специализированная система, она «прячет» от разработчика многие скучные, рутинные действия. Так все программы 1С:Предприятия по большому счету имеют одинаковую логику и технологию построения. Любая программа собирается из готовых «кубиков». Набор «кубиков» ограничен, платформа изначально знает, для чего предназначены те или иные «кубики», знает, как они между собой взаимодействуют.
Таким образом, разработчику достаточно просто добавить в информационную базу нужные «кубики» – и все это сразу же будет работать, платформа самостоятельно обеспечит правильное функционирование добавленных «кубиков».
Конечно, такое функционирование сильно ограничено. В реальной жизни все бывает намного интереснее и разнообразнее. Для этого существует встроенный язык, язык запросов, с помощью которых можно задавать особенное поведение этих «кубиков», можно описывать особенные алгоритмы взаимодействия этих кубиков между собой, можно создавать собственные алгоритмы обработки данных и т. д.
Как мы говорили в начале, сейчас мы делаем «Hello, World!» в исполнении 1С. Поэтому встроенный язык, а тем более язык запросов мы использовать практически не будем. Это отдельная сложная тема.
Сейчас наша задача – собрать из кубиков простую программу. То есть показать «костяк» разработки. Прикручивать «бантики», улучшать, дорабатывать – можно будет потом, если у вас будет желание и возможности. Но важно, что даже в таком «скелетном» виде наша программа будет вполне функциональна и работоспособна, причем, минимальными усилиями.
Примечание. Чтобы убедиться в этом, можете попробовать создать аналогичную по функциональности программу с помощью какой-нибудь универсальной среды разработки, и сравнить затраченные усилия и необходимые знания.
Итак, вернемся к «кубикам». Поскольку назначение программ системы 1С:Предприятие четко определено, используются не абстрактные, а вполне конкретные «кубики», соответствующие сущностям, присутствующим в реальной жизни автоматизируемого предприятия или частного лица. Например, справочник или документ.
В 1С:Предприятии эти «кубики» называются объектами конфигурации. Все объекты конфигурации собираются в дерево. Таким образом, взглянув на дерево объектов конфигурации, всегда можно понять, из каких объектов она состоит. Можно быстро найти нужный объект, узнать его свойства и т. д.
Сейчас у нас открыт конфигуратор (на рис. 1-9 мы нажали на кнопку Конфигуратор). Чтобы увидеть дерево объектов конфигурации, нужно нажать на кнопку Открыть конфигурацию.
Рис. 2-1. Открыть конфигурацию
Сейчас это дерево «пустое», оно содержит только ветки верхнего уровня, которые есть в любой информационной базе 1С:Предприятия.
Рис. 2-2. Дерево объектов конфигурации
Все, чем мы будем сейчас, в основном, заниматься, – это добавлять нужные нам объекты конфигурации. По пути мы покажем, где и как можно потом прикрутить «бантики», но сильно углубляться в это не будем.
Итак, какие объекты конфигурации добавлять? Это зависит от той задачи автоматизации, которая перед нами стоит. Сформулируем.
В нашем мастер-классе мы создадим простейшую систему CRM (от англ. Customer Relationship Management – управление взаимоотношениями с клиентами), которая, с одной стороны, позволит хранить информацию обо всех наших друзьях и знакомых – т. е. вести базу контактов. С другой стороны, будет учитывать различного рода события – как прошедшие, так и будущие. При этом мы сможем фиксировать наши финансовые потоки – поступление и расход денег, связанные как с нашими друзьями, так и с событиями, происходящими в нашей жизни. При этом работа в самой программе должна быть простой и легкой.
Вот собственно и вся задача, ничего сложного.
Первое, с чего мы начнем – это подсистемы. Они служат для того, чтобы группировать объекты конфигурации по их функциональной принадлежности. Используя подсистемы, в дальнейшем легко можно будет формировать, например, интерфейсы нашей программы – то есть то, как программа будет представлять свою функциональность пользователю.
Сначала мы добавим несколько подсистем, а затем, добавляя другие объекты конфигурации, будем привязывать их к существующим подсистемам.
Взглянув на общую идею нашей системы CRM, можно выделить три четко разделенные функциональные области:
Поэтому первым делом мы добавим три подсистемы: Контакты, События и Финансы.
Добавление любых объектов конфигурации выполняется одинаковым образом. Нужно выделить ту ветку дерева конфигурации, в которой располагаются нужные объекты, и из контекстного меню выполнить команду Добавить (Ins).
Подсистемы располагаются в ветке Общие – Подсистемы. Добавим подсистему.
Рис. 3-1. Добавление подсистемы
Справа откроется отдельное окно (окно редактирования объекта конфигурации) с параметрами создаваемой подсистемы – зададим имя подсистемы – Контакты. Синоним система 1С:Предприятие добавит сама, после того, как мы нажмем клавиши Ввод или Tab в поле Имя. Больше пока в открытом окне ничего менять не будем, поэтому нажмем кнопку Закрыть.
Рис. 3-2. Подсистема Контакты
Аналогичным образом создадим остальные две подсистемы: События и Финансы. В итоге у нас получится такое дерево:
Рис. 3-3. Готовые подсистемы
«Служебные кубики» мы добавили, теперь будем добавлять «кубики» содержательные.
Давайте осмысленно назовем нашу конфигурацию (которая сейчас зовется безлико – «Конфигурация») и заодно познакомимся с еще одним способом редактирования свойств объектов – палитрой свойств. Для этого достаточно дважды щелкнуть мышью по самой верхней строке дерева объектов, либо нажать там же правую кнопку и выбрать в меню Свойства (Alt+Enter).
Далее, аналогично подсистемам, наберем в поле Имя название нашей конфигурации – «МастерКласс8» и слегка отредактируем сформированный автоматически синоним – «Мастер-класс 8».
Рис. 3-4. Параметры конфигурации
Можете проверить самостоятельно – для практически любого объекта конфигурации быстрый доступ к его свойствам всегда можно получить через палитру свойств. Мы сами в нашем мастер-классе в дальнейшем будем пользоваться ею не один десяток раз.
По условию поставленной задачи система хранит в себе списки знакомых нам людей и событий, происходящих в нашей жизни. При этом, кроме хранения собственно информации о своих знакомых, хотелось бы иметь под рукой список их контактных данных и как-то разделять (например: друг, знакомый, член семьи и т. п.). События тоже бывают разные, и нужно иметь какой-то способ разделять их по статусам.
Примечание. Более подробно об объектах метаданных вида Справочник можно узнать по этой ссылке:
Таким образом, у нас «прорисовываются» три справочника, связанных с нашими знакомыми: Друзья, где будут храниться все записи о наших знакомых, ВидыКонтактов, где мы будем хранить список различных вариантов контактных данных (например: «телефон», «адрес», «e-mail» и т. п.), и СтатусыДрузей – список назначаемых нашим знакомым статусов (например, «семья», «друг», «знакомый» и т. п.).
Еще два справочника подходят для хранения данных о событиях: События, где, собственно, будут регистрироваться произошедшие и планируемые события и СтатусыСобытий, где мы сможем вести разнообразные статусы, к которым будут относиться те или иные события (например, «учеба», «спорт», «отдых» и т. п.).
Справочники находятся в ветке дерева, которая так и называется – Справочники. Добавим новый справочник.
Рис. 4-1. Добавление справочника
При добавлении справочника открылось уже знакомое нам по подсистемам окно – окно редактирования объекта конфигурации. Справочник – довольно сложный объект конфигурации, поэтому для того, чтобы легче и быстрее задать его свойства, система использует этот диалог.
Хотя все те же свойства справочника можно задать и в палитре свойств справа, удобнее пользоваться этим диалогом. Последовательно переходя по закладкам этого диалога, можно заполнить все нужные свойства и ничего не пропустить.
Рис. 4-2. Окно редактирования справочника
Начнем с имени – ВидыКонтактов. Больше здесь ничего заполнять не нужно – перейдем на закладку Подсистемы.
Рис. 4-3. Заполним имя и перейдем на закладку Подсистемы
Здесь мы укажем, что справочник будет относиться к подсистеме Контакты.
Рис. 4-4. Укажем подсистему
В принципе, для хранения видов контактов мы сделали все, что нужно.
Запустим систему в пользовательском режиме (1С:Предприятие) и посмотрим, как выглядит справочник ВидыКонтактов.
Чтобы из режима конфигуратор запустить систему в пользовательском режиме (1С:Предприятие), нужно нажать кнопку Начать отладку (F5).
Рис. 4-5. Начать отладку
Система предложит обновить конфигурацию базы данных – согласимся.
Рис. 4-6. Обновление конфигурации базы данных
После этого система проанализирует изменения, которые мы сделали в объектах конфигурации, и сообщит, что добавлен новый объект – справочник ВидыКонтактов.
Рис. 4-7. Реорганизация информации
Снова согласимся и скажем, что эти изменения надо принять. Такой контроль может выглядеть странным в нашем случае, но для больших информационных баз, содержащих десятки и сотни объектов конфигурации, он совсем не лишний.
После небольшого ожидания система запустится в режиме 1С:Предприятие. Мы увидим пустое основное окно нашей программы, на которой уже платформой «1С:Предприятие 8» будет создано четыре раздела: один из которых – Рабочий стол (Главное), а три остальных по названиям соответствуют заведенным нами ранее подсистемам – Контакты, События и Финансы.
Рис. 4-8. Первый запуск конфигурации
Интересующий нас справочник расположен в подсистеме Контакты. Поэтому нажимаем на кнопку Контакты, видим единственный элемент на экране – надпись-ссылку Виды Контактов слева сверху.
Нажав на эту ссылку, увидим список видов контактов, который в данный момент пуст.
Для сокращения ручной работы в специальном файле у нас уже подготовлены демонстрационные данные для заполнения этого справочника. В пользовательском режиме мы запустим специальную обработку, которая позволит заполнить этими данными справочник Виды Контактов, чтобы нам не вводить эти данные вручную.
Чтобы выбрать файл с обработкой, нажмем кнопку Главного меню, которая всегда нам доступна в левом верхнем углу окна программы.
Рис. 4-9. Главное меню
В главном меню выберем Файл4Открыть… (Ctrl+O)
Рис. 4-10. Открытие файла
Файл обработки называется «ЗагрузкаДанныхXML83.epf». Найдем его на диске и нажмем кнопку Открыть.
Рис. 4-11. Файл обработки
Откроется обработка, которая позволит загрузить данные из файлов формата XML.
Рис. 4-12. Загрузка данных XML
В открывшейся обработке найдем на диске и выберем файл «01-ВидыКонтактов.xml».
Рис. 4-13. Выбор файла для загрузки
Выбрав файл, нажмем на кнопку Импорт, после чего, через некоторое время, получим уведомление о том, что данные загружены.
Рис. 4-14. Загрузка данных
Закрываем окно обработки и возвращаемся к нашему справочнику Виды контактов. Если список уже открыт – можно нажать F5 для обновления.
Рис. 4-15. Записи справочника Виды контактов
Видим, что данные загрузились успешно. Хорошо.
Заметьте, форму списка справочника (то есть форму, в которой отображаются все элементы этого справочника) мы не создавали. Система сгенерировала ее автоматически, основываясь на том, как мы описали этот справочник в дереве объектов метаданных. При этом доступны все команды работы со списком справочника: добавление новых элементов, удаление, поиск и пр.
Отлично. Закрываем окно программы и возвращаемся в Конфигуратор. Там мы создадим оставшиеся справочники, по ходу создания рассматривая отличия одного от другого.
Полностью аналогично справочнику ВидыКонтактов создаем справочник СтатусыДрузей. Единственное, что его отличает – длина поля Наименование, которое мы увеличим до 150 на закладке Данные.
Рис. 4-16. Справочник Статусы друзей
Снова запустим систему в режиме 1С:Предприятие, воспользуемся обработкой и загрузим подготовленные данные в справочник Статусы друзей из файла «02-СтатусыДрузей.xml».
В результате справочник Статусы друзей будет выглядеть следующим образом.
Рис. 4-17. Записи справочника Статусы друзей
Теперь создадим основной справочник, который будет хранить всех наших знакомых – Друзья. Аналогично предыдущим справочникам заполним у него имя («Друзья»), привяжем к подсистеме Контакты, перейдем на закладку Данные и установим длину Наименования равной 150 (в нем мы будем хранить ФИО людей).
До этого момента ничего нового мы не сделали – получили еще один справочник, способный учитывать список наших друзей и знакомых, сохраняя их имена в реквизите Наименование. Согласитесь, мало пользы было бы от просто хранения списка имен. Поэтому сейчас мы воспользуемся возможностью платформы «1С:Предприятие 8» и дополним этот справочник необходимыми нам реквизитами, в которых будем хранить дополнительную информацию о наших друзьях.
Для хранения дополнительной информации имеется возможность указать произвольное количество реквизитов в справочнике. В нашем случае мы начнем с реквизитов Пол, Статус и Комментарий.
В реквизите Пол будем хранить пол знакомого.
В реквизите Статус – один из статусов ранее созданного справочника СтатусыДрузей.
В Комментарии – любую произвольную информацию о нашем знакомом, которую захочется сохранить.
Добавляем новый реквизит Пол кнопкой Добавить (Ins) на закладке Данные нашего справочника Друзья.
Рис. 4-18. Новый реквизит Пол
Добавление нового реквизита породило вызов уже знакомой нам палитры свойств. В ней мы указываем Имя реквизита, синоним традиционно заполняется автоматически. Все хорошо.
Остается одно но – как именно мы будем хранить данные о поле того или иного знакомого? Как видно по палитре свойств, по умолчанию для нового реквизита предлагается строковый тип. В принципе, можно оставить все как есть и потом, при заполнении справочника, каждый раз вписывать руками пол вновь добавляемых друзей. Но, во-первых, при большом количестве записей, ручное заполнение однообразной информации может порядком надоесть. А, во-вторых, вероятен риск ошибки (опечатки) и нечеткость написания (вариантов указания пола в строке – масса), что затруднит автоматический анализ этих данных в будущем, если таковой понадобится.
Первое, что может прийти в голову – завести еще один справочник, где сразу указать оба пола и в будущем использовать эти элементы. Логично, но создание объекта справочник для всего двух записей довольно избыточная операция. Как же быть? Выход есть – воспользуемся таким объектом нашей конфигурации, как Перечисление.
Перечисления – это объекты, которые задаются разработчиком на этапе создания конфигурации и хранящие в себе ограниченный и заранее известный набор однотипной информации. Пол как раз идеально подходит для того, чтобы поместить его не в справочник, а в перечисление.
Для того чтобы создать новое перечисление, оставим пока наш справочник Друзья как есть, перейдем в дерево конфигурации и найдем там раздел Перечисления и воспользуемся уже знакомым нам методом добавления нового объекта конфигурации.
Рис. 4-19. Добавление перечисления
В открывшемся окне нового перечисления заполняем имя – Пол. Относим новое перечисление к подсистеме Контакты. После чего переходим на закладку Данные.
Рис. 4-20. Перечисление Пол
На закладке Данные добавляем два значения этого перечисления кнопкой Добавить (Ins): «Мужской» и «Женский».
Рис. 4-21. Значения перечисления Пол
После того, как значения добавлены, закрываем окно перечисления кнопкой Закрыть. И попадаем в отрытое ранее окно справочника Друзья. Теперь для реквизита Пол можно изменить тип со «Строка» на тип только что созданного нами перечисления «Пол». Для этого устанавливаем курсор на реквизит Пол, а в палитре свойств нажимаем кнопку выбора в строке типа (если вдруг палитру свойств вы случайно закрыли, ее всегда можно открыть, нажав правой кнопкой мыши на нужном объекте конфигурации или реквизите и выбрав «Свойства», а можно просто кликнуть дважды по нужному реквизиту).
Рис. 4-22. Изменение типа реквизита Пол
В открывшемся окне выбора типа находим наше перечисление Пол, выбираем его и заканчиваем выбор кнопкой OK.
Рис. 4-23. Выбор перечисления Пол в качестве типа реквизита
Корректность выбора нужного типа можно всегда проконтролировать в палитре свойств.
Рис. 4-24. Контроль типа реквизита
Убедившись, что все сделано верно, возвращаемся в окно справочника Друзья и продолжаем добавлять новые реквизиты. На очереди реквизит Статус. По аналогии с Полом, добавляем новый реквизит и выбираем для него тип «СтатусыДрузей», расположенный в Справочниках.
Рис. 4-25. Создание реквизита Статус
Остался реквизит Комментарий, в который мы решили записывать все мысли и заметки, касающиеся нашего знакомого. Добавляем этот реквизит. Тут нас устраивает вариант типа по умолчанию – Строка. Не устраивает только длина этой строки, в которую никакая заметка не поместится. А чтобы не гадать, хватит нам длины строки или нет, установим для Комментария строку неограниченной длины.
Рис. 4-26. Комментарий неограниченной длины
Помня условия нашей задачи, мы, по идее, должны еще создать набор реквизитов, которые должны хранить в себе контактные данные наших знакомых. Логично предположить, что раз уж мы завели ранее справочник ВидыКонтактов, то надо добавить реквизит Контакт этого типа (который будет хранить выбранный вид) и еще как минимум один реквизит, хранящий в себе значение вида контакта (пусть он так и будет называться – Значение). То есть для того, чтобы сохранить адрес знакомого, надо будет выбрать вид контакта «Адрес», а в реквизит значения записать собственно сам адрес.
Тут надо учесть один момент. Если мы создадим пару «контактных» реквизитов там же, где делали это только что, то в один момент времени для одного знакомого сможем сохранить только один контакт – ведь все реквизиты, которые мы добавляли до этого времени, относятся к одному элементу (записи) справочника.
Можно, конечно, добавить столько пар «контактных» реквизитов Контакт-Значение, сколько нам нужно на текущий момент времени. Но тогда сломается элегантность хранения контактов – ведь у каждого друга будет свой набор данных. Кроме этого, в случае, если в будущем вдруг появится новый вид контакта, придется в конфигураторе вновь добавлять очередную пару реквизитов Контакт-Значение и так каждый раз, когда будет появляться что-то новое.
Благо, ничего подобного из того, что описано выше, делать не нужно. Понятно, что у каждого человека может быть свой набор контактной информации и платформа «1С:Предприятие 8» позволяет элегантно решить эту задачу путем формирования табличных частей для каждого элемента (записи) справочника.
В нашем случае в справочнике Друзья создаем табличную часть Контакты. Воспользуемся кнопкой Добавить табличную часть, после чего назовем новую табличную часть «Контакты».
Рис. 4-27. Добавляем табличную часть Контакты
Вернувшись в окно справочника Друзья и установив курсор на только что созданную табличную часть Контакты, добавим в нее новый реквизит кнопкой Добавить реквизит. Назовем только что созданный реквизит Контакт и выберем для него тип «ВидыКонтактов», расположенный в Справочниках.
Рис. 4-28. Новый реквизит Контакт в табличной части Контакты
Аналогичным образом добавим реквизит Значение строкового типа (длина строки – 1024).
Рис. 4-29. Реквизит Значение в табличной части Контакты
На этом создание справочника Друзья можно считать законченным. Посмотрим, что у нас получилось с точки зрения пользователя. Запускаем пользовательский режим – кнопка Начать отладку (F5).
Снова соглашаемся на предложение обновления конфигурации и принимаем изменения в структуре информации конфигурации.
Переходим в уже знакомый нам раздел Контакты и смотрим, что у нас с Друзьями.
Рис. 4-30. Друзья
На данный момент этот справочник пуст. Открываем обработку «ЗагрузкаДанныхXML83.epf» и загружаем с ее помощью файл «03-Друзья.xml».
После чего обновляем список – F5.
Рис. 4-31. Справочник Друзья
В списке появились загруженные люди. Проверим, что содержится в каждой записи о человеке – достаточно дважды кликнуть по любой из записей.
Рис. 4-32. Элемент справочника Друзья
Хорошо видно, что основные реквизиты, относящиеся к человеку, вынесены в верхнюю часть окна. А контактные данные, расположенные в табличной части, удобно размещены внизу.
Обратите внимание на тот факт, что кроме форм отображения списков элементов, содержащихся в справочниках, система автоматически построила для нас и форму элемента (записи) справочника.
Закрываем пользовательский интерфейс и возвращаемся в конфигуратор – пора создать оставшиеся два справочника: СтатусыСобытий и События.
Справочник СтатусыСобытий создадим по аналогии с СтатусыДрузей – длину наименования тоже сделаем 150. Отличие будет лишь в том, что этот справочник мы отнесем к подсистеме События.
Рис. 4-33. Статусы событий относим к подсистеме События
В пользовательском режиме загружаем данные этого справочника из файла «04-СтатусыСобытий.xml».
Рис. 4-34. Справочник Статусы событий
Нам осталось создать последний справочник нашего примера – События.
Его тоже отнесем к подсистеме События. Длину наименования на закладке Данные сделаем 150. После чего там же сформируем набор дополнительных реквизитов этого справочника:
В табличные части добавим новую табличную часть Участники, в которую добавим единственный реквизит табличной части – Друг типа СправочникСсылка.Друзья.
В результате этих действий данные справочника будут иметь следующий вид:
Рис. 4-35. Данные справочника События
Запускаем отладку (F5), соглашаемся со всеми изменениями. В пользовательском режиме загружаем данные для этого справочника из файла «05-События.xml». Проверяем результат в разделе События.
Рис. 4-36. Справочник События
Проверим, как выглядит элемент справочника События.
Рис. 4-37. Элемент справочника События
Все, что мы хотели получить для учета событий, происходящих в нашей жизни, мы получили.
Отлично, справочник Друзья может содержать записи обо всех наших родственниках, знакомых и друзьях (включая разнообразные контактные данные этих людей). Справочник События – информацию о произошедших и планируемых событиях (включая возможность указания друзей, участвующих в том или ином событии). При этом три «вспомогательных» справочника (Виды контактов, Статусы друзей и Статусы событий) помогают гибко настраивать учет различных данных, связанных с «основными» справочниками.
Идем дальше.
Теперь перейдем к добавлению «кубика», который на первый взгляд может показаться не совсем очевидным. Добавим регистр накопления Финансовые операции.
Сразу возникает вопрос: что такое регистр? Непонятно! Зачем он вообще нужен?
Попробуем объяснить просто. По условиям задачи наша система должна не просто хранить список наших знакомых и учитывать разнообразные события, происходящие в нашей жизни. Она должна уметь вести базовый финансовый учет – как минимум регистрировать денежные потоки и предоставлять минимальную отчетность, что же с нашими финансами происходит.
Примечание. Более подробно об объектах метаданных вида Регистр накопления можно узнать по этой ссылке:
Регистрация различных событий, связанных с поступлением и затратой денег, будет производиться такими объектами конфигурации, как Документы. Чуть позже мы добавим парочку документов в нашу конфигурацию.
Кроме, собственно, регистрации фактов поступления и расходования денежных средств, мы наверняка захотим получать какие-то отчеты, наглядно отображающие происходящее с нашими финансами. Такие отчеты вполне можно было бы построить по тем данным, которые содержатся во вводимых пользователем документах поступления и расходования денег. Но представьте, что через месяц (или год), например, вы решите дополнить свой финансовый учет новыми документами или функционально расширить уже существующие.
Внести изменения в конфигурацию, как вы уже поняли, задача несложная. Как в этом случае быть с отчетами? Окажется, что наши отчеты, которые мы создавали раньше, будут работать неправильно. Потому что они учитывают только часть поступлений и расходов, ту часть, которая оформляется старыми документами. Значит, нам придется переделывать и все отчеты. А их в реальной конфигурации может быть несколько десятков…
Чтобы избежать этой работы и большого количества ошибок, которые могут возникнуть в результате такой переделки отчетов, в системе 1С:Предприятие применяется следующий подход.
Для хранения данных о движениях каких-либо сущностей (например, финансов) используются специальные объекты конфигурации – регистры. Документы, которые отражают события финансовой деятельности, заносят свои данные в эти регистры. А отчеты строятся по данным этих регистров.
В результате мы получаем независимую структуру. С одной стороны, однажды создав регистры нужной нам структуры, мы можем сразу же создать нужные отчеты, которые будут красиво и понятно показывать пользователям данные, содержащиеся в этих регистрах. С другой стороны, при появлении новых видов документов в системе нам нужно будет всего лишь правильно написать алгоритм, по которому их данные помещаются в эти регистры. При этом все созданные нами отчеты не потребуют переделки и будут показывать правильные данные.
Рис. 5-1. Схема Документы-Регистры-Отчеты
Итак, для нашей задачи достаточно создать один регистр накопления – Финансовые операции. В нем мы будем хранить данные о том, как часто к нам поступают деньги и как часто мы их расходуем.
Регистры накопления находятся в ветке дерева объектов конфигурации, которая так и называется: Регистры накопления.
Добавим новый регистр накопления.
Рис. 5-2. Создание регистра накопления
Назовем регистр ФинансовыеОперации и отнесем его к подсистеме Финансы. После чего можно перейти к закладке Данные.
Рис. 5-3. Регистр накопления ФинансовыеОперации
Здесь нам предстоит добавить измерения, ресурсы и реквизиты регистра.
Рис. 5-4. Данные регистр накопления
Ресурсы – это те данные, которые мы хотим получать из регистра. В нашем случае мы хотели бы знать сумму наших средств. Значит, нам нужен всего один числовой ресурс – Сумма.
Измерения – это то, в каких разрезах мы хотели бы получать данные из регистра. Вряд ли нам будет интересно каждый раз наблюдать только лишь остаток денег «вообще». Например, для анализа наших финансовых потоков, нас может заинтересовать, какие события или знакомые «приносят» нам больше всего денег или наоборот – «потребляют» J Поэтому, понадобится два измерения – Событие и Друг.
Реквизиты – это дополнительная информация, сопровождающая каждую запись в регистре. В нашем случае, мы не будем использовать реквизиты, но ничто не мешает вам добавить их в регистр в будущем и помещать в них любую вспомогательную информацию.
Итак, добавим перечисленные измерения и ресурс. Для добавления будем пользоваться контекстным меню, которое вызывается на соответствующих ветках данных регистра.
Добавим измерение.
Рис. 5-5. Добавление измерения
В палитре свойств укажем, что называться оно будет Событие, и выберем тип – СправочникСсылка.События.
Рис. 5-6. Свойства измерения Событие
Добавим второе измерение – Друг. Тип – СправочникСсылка.Друзья.
Рис. 5-7. Свойства измерения Друг
Теперь добавим ресурс – Сумма. Тип и длину оставим такими, какие предложены по умолчанию – нас это устраивает. Скорректируем только точность – с 0 на 2.
Рис. 5-8. Свойства ресурса Сумма
В результате регистр накопления ФинансовыеОперации будет выглядеть следующим образом.
Рис. 5-9. Регистр ФинансовыеОперации
Теперь перейдем к добавлению документов, регистрирующих поступление и расход денежных средств. Начнем с документа ПоступлениеДенег.
Примечание. Более подробно об объектах метаданных вида Документ можно узнать по этой ссылке:
Документы находятся в ветке дерева объектов конфигурации, которая так и называется: Документы.
Добавим новый документ.
Рис. 6-1. Добавление нового документа
Назовем его ПоступлениеДенег, привяжем к подсистеме Финансы и перейдем на закладку Данные.
Рис. 6-2. Создание документа ПоступлениеДенег
У каждого документа стандартно есть два реквизита – номер и дата создания. Однако, кроме них, всегда хочется иметь еще какую-то информацию, характеризующую конкретный документ. Например, в нашем случае хотелось бы понимать, от кого или в результате какого события к нам поступили денежные средства. Чтобы не создавать по документу на каждый факт поступления денег, позволим регистрировать одним документом несколько однотипных событий. К примеру, удобно за один день зафиксировать все поступления в одном документе – чтобы потом упростить поиск и анализ этой информации.
Как вы уже догадались, поможет нам в этом табличная часть. Создаем табличную часть Поступления.
Рис. 6-3. Создание табличной части Поступления
Для того чтобы иметь возможность отслеживать потоки по событиям и знакомым, заведем два реквизита только что созданной табличной части – Событие и Друг. Для фиксации, собственно, самой суммы операции – реквизит Сумма:
В результате этих действий данные документа будут иметь следующий вид:
Рис. 6-4. Заполнение табличной части реквизитами
Рис. 6-5. Реквизит Событие
Рис. 6-6. Реквизит Друг
Рис. 6-7. Реквизит Сумма
Заключительный этап работы с документом – перейдем на закладку Движения.
Как мы уже объясняли ранее, документы записывают какие-то данные в регистры, а отчеты показывают данные из регистров в том виде, который удобен для пользователя.
Движения документа – это как раз те записи, которые документ делает в регистрах. В нашем случае – в регистре Финансовые операции.
Поэтому раскроем ветку Регистры накопления, отметим флажком, что наш документ Поступление денег будет делать движения по регистру ПоступлениеДенег.
Нажмем кнопку Конструктор движений, чтобы система помогла нам сформировать алгоритм записи данных в этот регистр.
Рис. 6-8. Конструирование движений документа по регистру
Откроется конструктор движений документа. Здесь мы оставим тип движений как есть («Приход», т. к. наш документ будет регистрировать поступление денег), выберем табличную часть – Поступления и нажмем кнопку Заполнить выражения.
В таблице, расположенной в нижней части окна, мы увидим, что система автоматически установила соответствие между реквизитами регистра накопления и реквизитами документа. Так, в измерение регистра Событие будут записаны данные реквизита Событие документа, в измерение Друг – данные реквизита Друг табличной части документа, а в ресурс Сумма – данные реквизита Сумма табличной части документа.
После заполнения и проверки таблицы соответствий можно нажать кнопку OK.
Рис. 6-9. Конструктор движений
Система сформирует процедуру записи данных документа в регистр и покажет ее на экране.
Рис. 6-10. Процедура записи данных документа в регистр
Как можно заметить, процедура довольно проста. В цикле обходится табличная часть документа и для каждой строки, содержащейся в этой табличной части, в регистр добавляется новая запись, содержащая данные этой строки документа.
Мы могли бы написать этот алгоритм сами, но для облегчения работы мы воспользовались конструктором движений. Конструктор сформировал этот код автоматически, о чем говорят комментарии в начале и в конце процедуры.
Теперь запустим систему в режиме 1С:Предприятие и с помощью специальной обработки загрузим демонстрационные данные в документ Поступление денег из файла «06-ПоступлениеДенег.xml».
Перейдем на закладку Финансы и откроем список документов Поступление денег.
Рис. 6-11. Документы Поступление денег
Откроем первый документ. Пока мы просто загрузили данные в документ и эти данные никак не отразились в нашем учете. Для того чтобы добавленные нами данные повлияли на состояние учета, нужно документ записать и провести. В момент проведения как раз и будут добавлены записи в регистр накопления Финансовые операции.
Чтобы записать и провести документ, нажмем кнопку Провести и закрыть.
Рис. 6-12. Проведение документа Поступление денег
Успешная запись и проведение документа будут отражены системным сообщением платформы «1С:Предприятие 8» (в правом нижнем углу экрана).
Рис. 6-13. Успешная запись документа Поступление денег
Сам же факт успешного проведения документа в системе отражается в виде отдельного значка в списке документов.
Рис. 6-14. Проведенный документ
Проверить факт проведения, т. е. помещения нужной информации в записи регистра Финансовые операции можно следующим способом: зайти в Главное меню⇒ Все функции…⇒ раскрыть узел Регистры накопления⇒ Финансовые операции
Рис. 6-15. Все функции
Откроется форма записей регистра накопления Финансовые операции. На данный момент времени в регистре содержится лишь одна запись – проведенного первого документа (кликнув по этой записи, можно всегда открыть документ, ее породивший).
Обратите внимание на значок «+», который символизирует добавление информации к значениям ресурсов.
Рис. 6-16. Записи регистра накопления
Переключившись на основное окно программы, проведем второй документ. После успешного проведения вернемся обратно в форму списка регистра Финансовые операции. Видно, что там появилась вторая запись, соответствующая второму документу (при необходимости, форму можно обновить – F5).
Рис. 6-17. Записи регистра накопления
С поступлением денег мы закончили. Но надо фиксировать еще и расходы. Возвращаемся в конфигуратор. По логике вещей, нужно создать документ РасходДенег. Можно быстро создать его вручную по образу и подобию уже существующего документа ПоступлениеДенег – ведь по своему составу они будут практически идентичны. А можно воспользоваться сервисом платформы «1С:Предприятие 8» – созданием новых объектов конфигурации на основании уже существующих путем их копирования.
Для этого нужно установить курсор на существующий документ ПоступлениеДенег в списке объектов метаданных и нажать кнопку Добавить копированием (F9) над деревом метаданных или Скопировать (F9) в свойствах документа.
Рис. 6-18. Добавление копированием
После нажатия на эту кнопку появится новый документ ПоступлениеДенег1 – точная копия ПоступлениеДенег.
Рис. 6-19. Копия документа Поступление денег
Нам останется только переименовать этот документ и немного подправить его свойства. Этим и займемся.
Прежде всего откроем окно редактирования его свойств и изменим имя документа – РасходДенег. Помня про подсистемы, привяжем новый документ к подсистеме Финансы.
Рис. 6-20. Документ Расход денег
На закладке Данные изменим при помощи палитры свойств название табличной части – Затраты. Остальные реквизиты не трогаем – они нас полностью устраивают.
Рис. 6-21. Переименование табличной части
Переходим на закладку Движения. Здесь нам нужно будет исправить движения документа. Сейчас они скопированы из документа ПоступлениеДенег. Тот документ учитывал поступления денег. Здесь же нам нужно учитывать расходы.
Запустим конструктор движений. Система предупредит нас, что существующая процедура проведения будет замещена. Согласимся.
Рис. 6-22. Конструктор движений
Тут все выполняем по аналогии с предыдущим документом. Меняем только тип движения документа на Расход и для заполнения выбираем табличную часть Затраты.
Снова заполняем движения и получаем готовый модуль проведения при нажатии на кнопку OK.
Рис. 6-23. Конструктор движений
Рис. 6-24. Модуль проведения документа Расход денег
Можно заметить, что отличие от документа ПоступлениеДенег – по сути всего в одной строке, которая задает вид движений. В нашем случае в регистр будут добавляться движения расхода.
Запускаем пользовательский режим и загружаем обработкой данные по расходам денег из файла «07-РасходДенег.xml». Переходим на закладку Финансы и открываем список документов Расход денег.
Рис. 6-25. Список документов Расход денег
Проведем эти три документа и проконтролируем, что записи о фактах затрат денежных средств отразились в регистре накопления Финансовые операции.
Рис. 6-26. Записи регистра накопления
Нетрудно догадаться, что «расходные» записи отражаются в списке регистра значком «–». Кроме этого, видно, что несколько строк одного документа попадают в регистр в виде отдельных записей – обратите внимание на реквизит Номер строки.
На этом учетную (регистрирующую) часть нашей программы можно считать завершенной. Мы уже сейчас можем заполнять список своих друзей и знакомых, регистрировать поступление денег и их траты.
Но «просто считать» мало – хотелось бы получать из системы информацию в удобной для восприятия виде. Для этого предусмотрен механизм отчетов.
Следующим шагом в разработке нашей конфигурации будет создание отчетов, в удобном виде отображающих информацию о нашей деятельности. Отчеты мы создадим тоже «без программирования», используя исключительно средства визуального конструирования.
Отчеты находятся в ветке дерева объектов конфигурации, которая так и называется – Отчеты.
Добавим новый отчет.
Рис. 7-1. Создание нового отчета
Назовем отчет Затраты и откроем схему компоновки этого отчета.
Рис. 7-2. Отчет Затраты
Так как это новый отчет и он, естественно, еще не содержит никакой схемы компоновки, система откроет конструктор макета этого отчета, где предложит создать макет, содержащий схему компоновки. Согласимся и нажмем на кнопку Готово.
Рис. 7-3. Конструктор макета
После этого система откроет конструктор схемы компоновки данных. Пока схема компоновки пустая.
Рис. 7-4. Пустая схема компоновки данных
Нам предстоит описать набор данных, из которого отчет будет получать данные, описать структуру отчета.
Добавим набор данных – запрос. То есть данные для этого отчета мы будем получать запросом из базы данных 1С:Предприятия.
Рис. 7-5. Создание нового запроса
Можно ввести текст запроса вручную, а можно использовать конструктор запроса. Мы выберем второй способ и нажмем на кнопку Конструктор запроса…
Рис. 7-6. Вызов конструктора запроса
В открывшемся окне конструктора запроса слева перечислены таблицы, из которых мы можем получать данные.
Раскроем ветку РегистрыНакопления и двойным щелчком мыши выберем из нее таблицу ФинансовыеОперации.ОстаткиИОбороты.
Рис. 7-7. Выбор таблицы ФинансовыеОперации.ОстаткиИОбороты
В среднем списке выберем эту таблицу и нажмем на кнопку Добавить все поля. Все поля этой таблицы будут выбраны в качестве полей запроса.
Рис. 7-8. Выбор данных для запроса
На этом создание нашего запроса завершено – нажмем кнопку ОК.
Система создаст текст запроса и автоматически заполнит поля системы компоновки данных.
Рис. 7-9. Поля схемы компоновки
Перейдем на закладку Ресурсы. Здесь двойным щелчком выберем следующие поля:
Рис. 7-10. Ресурсы схемы компоновки
Перейдем на закладку Настройки. Здесь для того, чтобы создать структуру нашего отчета, мы тоже воспользуемся конструктором. Для этого нажмем на кнопку Конструктор настроек…
Рис. 7-11. Вызов конструктора настроек
Конструктор настроек позволяет быстро создать несколько простых вариантов настройки отчета.
Для наших целей хорошо подойдет список, поэтому ничего не меняем и просто нажимаем кнопку Далее >.
Рис. 7-12. Выберем отчет в виде списка
На следующем шаге выберем поля, которые будут отображаться в нашем отчете. Двойным щелчком в списке Доступные поля выберем следующие поля:
Нажмем Далее >.
Рис. 7-13. Выберем поля для отображения в отчете
Теперь нам нужно выбрать поля, по которым данные в отчете будут сгруппированы. Нам интересно, чтобы можно было видеть движения по каждому знакомому в отдельности и еще – по каждому событию, связанному с этим знакомым. Поэтому двойным щелчком из доступных полей выбираем оба – Друг и Событие.
После чего можно нажать OK, т. к. конструирование вида отчета мы закончили.
Рис. 7-14. Поля группировки в отчете
Система покажет структуру отчета.
Рис. 7-15. Готовая структура отчета
Практически закончили. Дадим возможность пользователю отчета произвольно задавать период выборки данных – это будет полезно, когда в регистре накопится много записей за довольно ощутимый период. Сделать это просто – ниже структуры отчета нам доступны два параметра: Начало периода и Конец периода.
Рис. 7-16. Параметры отчета
Достаточно выделить мышью каждый из параметров и выбрать вариант Свойства элемента пользовательских настроек.
Рис. 7-17. Свойства элемента пользовательских настроек
В открывшемся окне достаточно включить флажок Включать в пользовательские настройки и нажать OK.
Рис. 7-18. Включать в пользовательские настройки
Выполнив эту операцию для обоих параметров (Начало периода и Конец периода), продолжаем настройку нашего отчета. Для этого мы закрываем окно настройки схемы компоновки данных и возвращаемся в окно параметров отчета Затраты.
Переключаемся на закладку Подсистемы и привязываем наш отчет к подсистеме Финансы.
Рис. 7-19. Подсистема Финансы
Запустим систему в режиме 1С:Предприятие и посмотрим, как выглядит наш отчет. Искать наш отчет следует на закладке Финансы – обратите внимание, как система самостоятельно поместила его в отдельное подменю на экране.
Рис. 7-20. Открытие отчета Затраты
Открыв окно отчета, сформируем его, нажав на кнопку Сформировать.
Рис. 7-21. Отчет Затраты
Убедившись, что отчет работает и показывает нам динамику поступления и расходования денежных средств в разрезах тех измерений, которые мы задали в свое время в регистре, возвращаемся в конфигуратор. Создадим еще один простенький отчет, способный быстро отобразить нам текущий остаток доступных денежных средств. Называем его СколькоДенег и относим сразу к подсистеме Финансы. Аналогично отчету Затраты создаем схему компоновки данных (на закладке Основные). В качестве источника данных снова выбираем Запрос.
Рис. 7-22. Запрос для отчета СколькоДенег
В открывшемся окне снова воспользуемся Конструктором запросов. Но для этого отчета выберем другую таблицу – ФинансовыеОперацииОстатки.
Рис. 7-23. Источник данных для отчета СколькоДенег
В средней части раскрываем узел и выбираем только одно поле – СуммаОстаток.
Рис. 7-24. Поле СуммаОстаток
Закрываем конструктор запросов кнопкой OK. После чего попадаем в окно схемы компоновки данных, закладка Наборы данных. Тут нас все устраивает. Переходим на закладку Ресурсы, где единственный наш ресурс СуммаОстаток, и выбираем.
Рис. 7-25. Ресурс СуммаОстаток
Переходим на закладку Настройки. Вновь воспользуемся Конструктором настроек.
Снова нас устроит предлагаемый по умолчанию тип Список.
Рис. 7-26. Конструктор настроек
На следующей закладке из Параметров данных выберем стандартное поле Период (чтобы иметь возможность видеть дату, на которую будет строиться отчет) и поле СуммаОстаток.
Рис. 7-27. Поля отчета
Выбрав поля, можно сразу нажать OK, т. к. большего нам от этого отчета не потребуется. Далее для параметра Период, как и в отчете Затраты, включаем его в пользовательские настройки.
Рис. 7-28. Включаем в пользовательские настройки
Значение параметра Период устанавливаем в Начало этого дня, чтобы отчет всегда автоматически был готов показать информацию на текущий день.
Рис. 7-29. Начало этого дня для Периода
В итоге настройки нашего отчета будут выглядеть вот так.
Рис. 7-30. Настройки отчета СколькоДенег
Запускаем пользовательский режим и проверяем работу этого отчета.
Рис. 7-31. Отчет Сколько денег
Информация, сообщаемая отчетом, крайне проста, но полезна – вы всегда сможете посмотреть, сколько финансов доступно на текущий момент времени.
Рис. 7-32. Результат отчета Сколько денег
Отлично! Сделаем еще один отчет, и на этом пример разработки нашей системы CRM можно будет считать оконченным. Возвращаемся в конфигуратор, создаем новый отчет, называем его ГрафикПоДням, относим к подсистеме Финансы и создаем схему компоновки данных. В схеме источником данных вновь выбираем Запрос и запускаем Конструктор запросов.
В качестве источника данных выбираем таблицу ФинансовыеОперацииОстаткиИОбороты. До этого момента процесс ничем не отличается от того, что мы делали в отчете Затраты.
А теперь мы провернем вот такой трюк. Учитывая то, что наш отчет называется ГрафикПоДням, вы верно предположили, что в отчете мы будем получать не цифровые данные, а графические. Подготовим данные из регистра в нужном для отчета виде. Для этого отметим таблицу ФинансовыеОперацииОстаткиИОбороты в среднем окне конструктора запросов и нажмем кнопку Параметры виртуальной таблицы.
Рис. 7-33. Настройка параметров виртуальной таблицы
В открывшемся окне в поле Периодичность выбираем День и закрываем это окно кнопкой OK.
Рис. 7-34. Параметры виртуальной таблицы
После этого выбираем два поля из нашей таблицы: Период и СуммаКонечныйОстаток.
Рис. 7-35. Поля Период и СуммаКонечныйОстаток
Закрываем конструктор запросов кнопкой OK. Переходим на закладку Ресурсы и выбираем там поле СуммаКонечныйОстаток.
Рис. 7-36. Ресурсы для отчета
Переходим на закладку Настройки и вызываем конструктор настроек. В этот раз выбираем вариант Диаграмма. После чего нажимаем Далее>.
Рис. 7-37. Диаграмма
Выбираем поля Период и СуммаКонечныйОстаток и жмем Далее>.
Рис. 7-38. Поля диаграммы
В следующем окне настройки диаграммы помещаем поле Период в раздел Точки. Жмем Далее>.
Рис. 7-39. Точки диаграммы
В поля упорядочивания тоже добавляем наш Период. Жмем Далее>.
Рис. 7-40. Поля упорядочивания диаграммы
Тип диаграммы – График. На этом настройка внешнего вида нашей диаграммы закончена и можно нажать OK.
Рис. 7-41. Тип диаграммы
Как и в предыдущих отчетах, для параметров Начало периода и Конец периода активизируем включение в пользовательские настройки.
Рис. 7-42. Включение в пользовательские настройки
Проверяем, что получилось, в пользовательском режиме. Запускаем и формируем отчет График по дням.
Рис. 7-43. График по дням
Наглядно видно, как вели себя наши финансовые показатели в зависимости от поступления или расходования денежных средств.