Transcription
Всем здравствуйте! С вами Низамутдинов Лес, и я рад вас приветствовать на своем канале. Это пятый урок моего марафона по программированию в 1С. И в этом пятом уроке мы разберем основные особенности объектов прикладного программирования в 1С.
Хочу отметить, что про объекты у меня имеется отдельный плейлист, в котором даже 20 уроков, где многие моменты очень подробно разбираются. В этом уроке мы разберем только общие основы, чтобы вы представляли, что такое объекты и как с ним работать. А кому интересны более тонкие подробности и нюансы, то смотрим плейлист. Ссылка на плейлист есть в конце видео, вот внизу, и также сейчас она появится у вас сверху.
Вообще, что такое объект в языке программирования 1С? Объект – это такая атомарная единица, посредством которых осуществляется разработка прикладного решения. То есть, по сути, все программирование в 1С осуществляется посредством той или иной работы с разными объектами. Объекты создаются или получаются из базы данных. С этими объектами потом выполняются разного рода манипуляции.
Можно выделить три глобальных вида объекта: это объекты метаданных, или прикладные объекты. Это справочники, документы и регистры накопления и так далее. Эти объекты хранятся в базе данных и создаются визуально, то есть в конфигураторе. Мы с вами уже научились создавать объекты метаданных в самом первом видео. Если что, ссылка на этот урок есть у вас под видео.
Остальные два вида – это объекты, которые не хранятся в базе данных и которые или используются для каких-то алгоритмов, например, такой тип как массив, или применяются для функционирования прикладного решения, например, вывод табличного документа. Универсальные коллекции значений – это вспомогательные объекты, предназначенные для хранения каких-то однотипных значений. Общие объекты – это разного рода объекты, необходимые для более гибкого функционирования прикладного решения, например, табличные документы для вывода отчета на печать или сообщение пользователю для гибкого вывода сообщения пользователю.
Основное отличие объектов первого вида от остальных – это то, что тип прикладного объекта у нас задается на этапе конфигурирования, при создании этого объекта в дереве метаданных, что мы с вами делали в первом уроке. То есть, нельзя определить тип прикладного объекта средствами самого языка, в отличие от универсальных коллекций и общих объектов, типы которых можно определить при помощи языка разработки.
У объекта есть свойства, методы и события. Что это такое? Свойство – это определенные характеристики объекта, причем они могут быть как открытые, так и закрытые. Что это такое? Открытое свойство – это значит, это свойство мы с вами можем как-то изменить, то есть присвоить этому свойству какое-то определенное значение. Закрытое же свойство мы с вами изменить не можем, оно доступно для чтения, то есть мы сможем только прочитать это свойство.
Метод – это процедура или функция, которая осуществляет какие-то действия над этим объектом. То есть, метод или как-то изменяет этот объект, или получает какую-то информацию об этом объекте. Например, у объекта массив есть такой метод как "Количество". Этот метод возвращает количество элементов массива.
Событие – это методы, которые перехватывают какие-то действия над объектами. Например, мы можем перехватить запись какого-нибудь элемента справочника и обработать эту запись, то есть, например, проверить, можем ли мы записывать элемент с определенным набором свойств.
У объектов имеется экземпляр объектов. То есть, например, у нас есть какой-то объект справочник "Товары", и у этого объекта есть разные товары, то есть товар "Хлеб", товар "Молоко", товар "Кофе" – это все экземпляры одного объекта. То есть, объект у нас один – вот этот справочник "Товары", но у него может быть много экземпляров. То же самое, у нас может быть объект "Универсальная коллекция значений", "Массив", но у этого массива может быть много разных экземпляров. Причем, эти все экземпляры могут быть в одном модуле, это просто будут разные экземпляры.
И самое главное, экземпляр объекта – это тоже объект. Например, когда мы с вами создаем новый элемент справочника "Товары", ну, например, вот этот "Хлеб", то этот элемент тоже является объектом. И у этого объекта есть свойства – это реквизиты, табличные части, есть методы – то есть это какие-то определенные процедуры или функции, которые осуществляют те или иные действия вот конкретно над этим элементом, и также есть события – это тоже какие-то процедуры или функции, которые реагируют на те или иные действия вот конкретно с этим элементом справочника "Товары" или с каким-то документом.
Мы с вами в этом уроке научимся работать с объектами метаданных, или с прикладными объектами, как их ещё называют. Мы научимся их программно создавать, программно записывать, программно изменять. Мы будем работать с документами и со справочниками. Другими видами объектов, с универсальными коллекциями значений, с общими объектами мы будем знакомиться в следующих уроках. И поэтому, чтобы их не пропустить, вот эти следующие уроки, обязательно подпишитесь на мой канал, нажмите на колокольчик, и так же вступайте в мою группу ВКонтакте и подписывайтесь на мой канал в Телеграме. Я обязательно выкладываю анонсы этих всех уроков.
Итак, давайте приступим. Перейдем в конфигуратор и непосредственно начнем программировать. Мы с вами сейчас в конфигураторе нашей базы "Управление ремонтными работами", которую мы делали с самого начала нашего марафона. На ее примере мы изучим работу с объектами метаданных, или с прикладными объектами.
У объектов метаданных есть прототипы. То есть, все ветки дерева метаданных – это по сути прототипы этого объекта, ну, кроме ветки "Общее". Приход, кроме этой ветки, принадлежность объекта к тому или иному прототипу определяет свойства, методы и события объекта. Например, документы можно проводить, а справочник нельзя, или наоборот, справочники могут быть иерархическими, а документы нет. Причем, разработчик прикладного решения не может создать собственный прототип, он довольствуется только тем, что предоставляет платформа 1С. Причем, не у всех объектов метаданных экземпляры хранятся непосредственно в базе данных. Экземпляры имеют справочники, документы и регистры.
Функциональность объекта метаданных определяется свойствами этого объекта. Как нам посмотреть на свойства этого объекта? Посмотреть это можно двумя способами. Первый способ – используя палитру свойств. Мы выделяем нужный объект, нажимаем правую клавишу мышки, и здесь выполняем команду "Свойства", и справа у нас откроется форма, где вы увидите основные свойства этого объекта, и мы с вами эти свойства здесь можем изменять на свое усмотрение. Например, мы можем установить то, что этот справочник является иерархическим.
Также на свойства объекта можно посмотреть по-другому. Для этого необходимо просто открыть редактор этого объекта. Два раза кликаем по названию объекта в дереве метаданных, он открывается. Здесь те же самые свойства, только в таком сгруппированном виде, то есть мы с вами можем переходить по каталогам и устанавливать эти вот свойства. Причем, у разных объектов метаданных одного и того же прототипа могут быть по-разному настроены свойства. Например, у нас у справочника "Номенклатура" включена свойство "Иерархический справочник", а у справочника "Организация" это свойство выключено.
Свойства объектов метаданных можно устанавливать только в конфигураторе на этапе разработки. Мы с вами, например, в самом первом уроке установили свойство "Иерархический справочник" вот у этого справочника "Номенклатура", и это свойство, заметки, указывается в целом для объекта метаданных. То есть, это свойство "Иерархический справочник" указывается в целом для справочника "Номенклатура", она не указывается для конкретного экземпляра объекта. То есть, мы не можем сказать, что этот экземпляр объекта будет иерархический, а этот нет. То есть, у нас эти свойства задаются в целом для объекта метаданных.
Чем же тогда один экземпляр объекта, например, конкретный элемент справочника "Номенклатура", будет отличаться от другого экземпляра объекта, к примеру, от другого элемента справочника "Номенклатура"? А будет отличаться он теми значениями, которые будут храниться в реквизитах этого объекта. Перейдем на закладку "Данные", то есть здесь вот у нас есть уже реквизиты, которые мы с вами сделали, и также у нас есть еще стандартные реквизиты. То есть, если даже мы никакие реквизиты какого-то справочника не создали, все равно у этого справочника есть реквизиты – это вот эти стандартные реквизиты: "Ссылка", "Наименование" и так далее. То есть, вот они уже, вот эта информация, которую будет хотя бы вот в этих стандартных реквизитах, один экземпляр объекта будет отличаться от другого экземпляра объекта.
Причем, у нас кроме стандартных реквизитов, которые я сейчас вам показывал, собственных реквизитов вот этих вот, есть еще и общие реквизиты, которые тоже задаются на этапе разработки. Вот эти три вида реквизита: стандартные, собственные и общие – мы можем изменять у объекта. И то есть, по сути, свойства экземпляра объекта. Причем, у нас вот кроме этих трех видов реквизитов есть еще табличные части. То есть, вот у нас у "Физлица" с вами создана табличная часть "Рабочая квалификация". То есть, вот эта табличная часть тоже является по сути таким своеобразным свойством нашего экземпляра объекта.
Доступность некоторых стандартных реквизитов у нас определяется свойствами самого объекта метаданных. Например, у нас у справочника "Номенклатура" есть такой стандартный реквизит как "Родитель". Он у нас доступен, то есть видите, он нормальный такой стандартный реквизит. Почему он доступен? Потому что у нас иерархия у этого справочника включена. То есть, вот это свойство "Иерархический справочник" она включена. В то же время у справочника "Организация" это свойство выключено. Если мы сейчас посмотрим на стандартные реквизиты этого справочника "Организация", то здесь "Родителя" никакого нет, он недоступен, ни "Родители", ни "Группа".
Причем, экземпляры этих вот всех объектов, справочников, документов, мы с вами можем создавать как интерактивно, их может создавать пользователь. Также мы с вами можем и создавать программно. В этом уроке мы с вами научимся создавать программно экземпляры этих объектов и работать с этими экземплярами. Как обычно, я рекомендую все то, что сейчас я буду делать на экране, повторить у себя. То есть, все эти операции, которые сделаю, все эти создания реквизитов, все то же самое сделать на своем рабочем месте, чтобы у вас наиболее эффективно и максимально закрепилась полученная информация, а потом выполнить домашнее задание. Так вы более эффективно научитесь программировать, чем если просто просмотрите это видео.
Научимся работать с объектами метаданных, но не программного кода. Поэтому для этого создадим обработку для экспериментов. Обработку, не мудрствуя лукаво, назовем "Создание объектов". Эту обработку мы включим в подсистему "Инсей". Зададим форму для этой обработки. Здесь будет пустая форма, ничего на ней особо не будет. И теперь создадим две команды у этой формы. Одну команду назовем "Создание справочников", а другую команду назовем "Создание документов". Обе команды разместим на форме.
Давайте создадим обработчики у обоих команд. Причем, обработчики мы создадим и на сервере, и на клиенте. Потом я поясню, почему так сделано. Обработчики мы выберем вариант "Создать на клиенте" и "Процедуры на сервере". Почему я делаю контекстный вызов сервера? Потому что в будущем нам вполне возможно понадобится какая-то информация с формы, чтобы вот потом не заморачиваться с параметрами. И то же самое мы сделаем для команды "Создание документов". Также создадим на клиенте процедуру на сервере.
Давайте познакомимся с менеджером объекта. Посредством менеджера объекта осуществляется непосредственно работа с самим объектом. То есть, используя менеджер объекта, мы с вами можем создать конкретный экземпляр объекта или наоборот, получить конкретный экземпляр объекта, или даже больше, получить конкретную выборку объектов. Как нам обратиться к менеджеру объекта? Делается это при помощи свойства глобального контекста. То есть, мы пишем свойство глобального контекста, а потом, используя это свойство, мы уже вызываем менеджер конкретного объекта. Это может быть менеджер справочника или менеджер документа. И в случае справочника мы пишем свойство глобального контекста "Справочники". Причем, вот я сейчас остановлюсь и не дописал до конца, и нажимаю Ctrl+Пробел, и заметьте, у меня контекстная подсказка заполнила это за меня. Вот это слово "Справочники". Есть свойство глобального контекста. Давайте посмотрим на него в Syntax помощнике. Посмотреть мы можем достаточно быстро. Поставить на него курсор и нажать Ctrl+F1. Здесь есть два варианта выбора. Вот этот первый вариант нас не интересует, интересует вот этот второй вариант "Глобальный контекст.Свойства". Перейдем на него, и вот мы сможем тут про него прочитать. И давайте прочитаем про раздел "Доступность". Видите, раздел "Нас доступность: Сервер, Толстый клиент и так далее". То есть, под тонким клиентом мы с вами не сможем работать с этим свойством глобального контекста. А что я вам говорю на прошлом уроке? Я вам на прошлом уроке говорю, что если какой-то метод у нас работает только под толстым клиентом, то этот метод необходимо применять в серверном контексте, что мы сейчас с вами делали. То есть, я объясню, почему использовал в данном случае серверный вызов. Если я сейчас поставлю точку, то у меня выйдет список всех справочников, которые есть. Ну, давайте выберем конкретно один справочник – "Номенклатура". И вот это у нас теперь будет менеджер "Номенклатура".
И точно так же мы сейчас с вами получим менеджер документов. Вот в этой команде "Создание документов" на сервере. Также я уже сразу назову переменную, документ будет "Заказ". В этом случае также мы используем свойство глобального контекста "Документы". Вот заметьте, я сейчас до конца ничего не написал, то есть "Докум" написал и нажимаю Ctrl+Пробел. Я рекомендую, кстати, вам также это сделать. И сейчас, если мы нажмём точку, то выйдут все документы, которые у меня есть. Давайте выберем вот этот документ "Заказ". И давайте посмотрим вот на это свойство "Документы" глобального контекста свойства "Документы". Вот оно открылось. Также мы к этому свойству можем обращаться только на толстом клиенте. То есть, в этом случае мы тоже сделали правильно, что осуществили сервисный вызов.
Сейчас мы с вами научимся создавать экземпляры объектов. То есть, грубо говоря, мы с вами сейчас получили в целом объект, то есть вот эти вот менеджер "Номенклатура" и менеджер "Заказ". Конечно, вот я так грубо говорю, это в целом объект, но мы сейчас из этого в целом объекта создадим экземпляр объекта. Как же нам создать новый экземпляр объекта? Для того, чтобы создать новый экземпляр объекта, необходимо использовать метод менеджера этого объекта. Давайте посмотрим в Syntax помощнике на менеджера справочников. То есть, вот у нас здесь есть закладка "Прикладные объекты". Видите, у нас тут есть каталог "Справочник.Менеджер". Он нам интересен, потому что там перечислены свойства, методы для менеджеров в целом. И есть вот этот каталог "Справочники.Менеджер.Имя справочника". В этом каталоге перечислены свойства и методы непосредственно того менеджера справочника, который вот мы сейчас с вами сделали. Вот это вот. Давайте посмотрим на эти свойства. Свойств практически нету, то есть оно одно – это "Имя предопределенного элемента справочника". То есть, посредством менеджера справочника мы с вами можем обратиться, получить ссылку на какой-то предопределенный элемент справочника, но пока это делать не будем.
Давайте посмотрим на методы. И вот здесь есть несколько методов: это "Выбрать", "НайтиПоКоду", "ПолучитьФорму" и так далее. То есть, мы при помощи менеджера справочника можем сделать какую-то выборку из справочника. И также мы можем найти какой-то уже имеющийся элемент по коду, по наименованию, по реквизиту. И также у нас здесь есть два других вот этих метода: это "СоздатьЭлементы", "СоздатьГруппу". То есть, если у нас справочник иерархический, мы с вами можем создать какую-то папку, какой-то каталог. Если же нет, то мы просто можем создать элемент этого справочника.
Давайте мы с вами посмотрим вот на этот метод "СоздатьЭлемент". Этот метод является функцией, которая возвращает элемент справочника, объект. То есть, мы при помощи вот этой функции менеджера объекта создаем экземпляр объекта, и эта функция возвращает вот этот экземпляр объекта, который мы с вами уже там заполняем и так далее. Также заметьте доступность, то есть у нас "Сервер", "Толстый клиент". То есть, мы также не можем это создавать, но тонком памятен непонятно, достаточно дешевая операция. Ну, давайте создадим какой-нибудь элемент номенклатуры. То есть, мы пишем "МенеджерНоменклатура", ставим точку, и выпадающая подсказка предложит нам все методы, которые есть у менеджера справочника. То есть, вот эти, которые сейчас мы с вами смотрели в Syntax помощнике, они здесь все перечислены. Давайте найдем "СоздатьЭлемент". Все, создали.
Вы помните, что этот метод "СоздатьЭлемент" является функцией, которая возвращает справочник объект конкретного вида справочника. То есть, вот эта наша переменная "НоваяНоменклатура" теперь уже это экземпляр объекта справочника. Есть нюанс: этот экземпляр объекта существует, но не записан в базу. То есть, мы с вами можем как-то его заполнить, что-то делать, но он существует, скажем так, виртуально. Он существует у нас где-то в оперативной памяти нашей базы. Он непосредственно не хранится. То есть, после того, как мы с вами создали вот элемент при помощи этого метода, мы с вами просто его создали, он еще нигде его нет. Это имейте в виду.
Вот я сейчас я скопировал эту переменную "НоваяНоменклатура", ставлю точку, и у меня вот в этой моей подсказке вышел целый список вот этих вот реквизитов. Причем, сюда входят как реквизиты, которые собственные, как реквизиты общие, и также реквизиты стандартные. То есть, все реквизиты, которые у нас есть у нашего справочника, они здесь присутствуют, и мы можем их заполнять. Вот здесь мы все можем заполнить. Также здесь есть некоторые функции и некоторые методы, которые есть непосредственно уже у объекта. Эти методы типа "Вы" и они совершают определенные действия над объектом справочника. И где их посмотреть? Их посмотреть можно в том же Syntax помощнике. Давайте вот мы его откроем. Здесь у меня вот "Справочник.Менеджер", и заметьте, есть такой же каталог "Справочник.Объект". И здесь у этого справочника объекта есть вот эти все методы: "ПолучитьМакет", "ПолучитьФорму" и так далее. То есть, мы с вами можем что-то при помощи вот этого метода делать. Пока мы это делать не будем.
Давайте мы с вами установим наименование. Сейчас он будет такой небольшой элемент хардкодинга. Я непосредственно напишу наименование в коде, чтобы как бы вот просто показать, что это работает. Но мы это с вами все переделаем. Ну, все, в принципе, наименование можно остановиться. Этого достаточно. Там потом еще можем другие поля заполнить. Ну, пока так. Вот теперь нам необходимо вот этот объект записать в нашу базу данных. Как мы это будем делать? Будем мы это делать при помощи метода вот этого самого объекта, и метод этот называется "Записать". Вот этот метод. Заметьте, здесь есть подсказки. Мы просто выбираем и записываем его. Все, больше ничего делать не будем.
И так, все, мы с вами, в принципе, обработку сделали, все сохранили. Сейчас мы наименование вот этим хардкорным методом записываем непосредственно из кода. Чуть попозже мы этот момент исправим. Мы просто сейчас давайте посмотрим, как это все будет работать. Запустим наши 1С:Предприятие и попробуем создать элемент справочника "Номенклатура". То есть, вот мы выполняем команду "Создание справочников". Все, у нас что-то создалось. Выше какое-то сообщение, оно пустое. Это, скорее всего, сообщение вот этих наших прошлых с вами работ.
Итак, давайте посмотрим на сам справочник "Номенклатура". То есть, заметьте, у нас создался новый элемент – это вот этот объект "Лет". Мы с вами сможем с ним как угодно работать, открывать, во что-то с ним выполнять, записывать. Причем, заметьте, вот все реквизиты у нас полные: "Наименование", "Вид номенклатуры", "Артикул" и так далее. Они пустые, потому что мы в коде никакое значение им не присвоили. Но сейчас мы это с вами сделаем. Это закроем, и сам этот объект удалим, чтобы он нам не мешался. Так, хорошо, пока это закроем.
И давайте перейдем обратно в нашу обработку. И первым делом давайте исправим вот этот хардкот. Мы не будем непосредственно писать названия в коде, потому что это очень плохой стиль программирования, и мне сейчас очень стыдно. Давайте мы будем это название брать из формы. Перейдем на форму и создадим новый реквизит, который так и будет называться "Название". Какую же нам длину строки указать? В нашем случае, наверно, если мы с вами это название будем записывать в "Наименование" справочника "Номенклатура", то длина строки у нас должна быть такая же, как и длина строки реквизита "Наименование" справочника "Номенклатура". Какая же у нас длина строки у реквизита "Наименование" справочника "Номенклатура"? Давайте посмотрим на это. Для этого мы откроем список стандартных реквизитов справочника "Номенклатура". То есть, вот у нас справочник "Номенклатура", открываем стандартные реквизиты, вот "Наименование", и ничего здесь мы не увидим. Почему? Потому что у нас длина наименования задается в другом свойстве. Для этого мы откроем палитру свойств справочника "Номенклатура" и видим здесь, у нас есть свойство "Длина наименования". То есть, вот это является свойством конкретно нашего объекта справочника "Номенклатура", и сейчас мы эту длину укажем для нашего реквизита "Название". То есть, вот "Название" и длина будет 25.
Теперь давайте это название мы разместим непосредственно на форме. Все. И сейчас вот мы этому наименованию присвоим значение нашего реквизита. Заметим, мы сейчас с вами работаем в серверном контексте. То есть, у нас наша процедура "Создание справочников" на сервере выполняется под вот этой директивой "На сервере". Если кто забыл, то рекомендую пересмотреть мой прошлый урок. В том уроке я вам рассказывал, какие вызовы сервера бывают у формы, что есть контекстный, без контекстный вызов. В нашем случае мы имеем дело с контекстным вызовом, то есть контекст формы у нас доступен, и как следствие, доступны все реквизиты. Мы просто пишем название нашего реквизита, вот он, "Название", называется "Мэтт", и пишем.
Теперь нам необходимо заполнить другие реквизиты нашей номенклатуры. Какие они у нас есть? Это "Полное наименование". Я рекомендую "Полное наименование" пусть будет такое же, как и наименование. Также мы пишем вот этот наш новый "Номенклатура", "Полное наименование" тоже мы присвоим этому полному наименованию "Название". И у нас осталось еще три реквизита: это "Вид номенклатуры", "Артикул" и "Вид работы". С реквизитами "Вид номенклатуры" и "Вид работы" мы пока повременим, это у нас ссылки на перечисление. Чуть позже мы их коснемся. А вот этот "Артикул" мы создадим в виде реквизита формы и также присвоим значение этому реквизиту. То значение, которое у нас будет в форме. Давайте мы создадим новый реквизит, который назовем "Артикул". Также посмотрим на длину строки вот этого артикула. В этом случае мы уже сможем посмотреть непосредственно на свойства нашего реквизита, она у нас 10, и мы вот этому "Артикулу" тоже присвоим длину строки 10. И теперь в коде реквизиту объекта присвоим значение реквизита формы. Все, хорошо.
Давайте обновим и посмотрим, как это будет делать, как это будет работать. И все, вот у нас создался наш элемент – это вот "Молоко", "Полное наименование" заметьте, заполнилось, и "Артикул" тоже заполнился. Теперь попробуем создать какой-нибудь заказ. То есть, мы с вами уже получили менеджер заказа и, используя вот этот менеджер заказа, давайте создадим новый заказ. Для создания нового документа необходимо использовать метод менеджера документа "Заказы", которые так и называется "СоздатьДокумент". Этот метод. Давайте вот назовем переменную "НовыйЗаказ". И вот у этой переменной "НовыйЗаказ" у нас есть также свойства, методы и события, с которыми мы можем работать. Свойства – это реквизиты вот этого нашего документа, которым мы можем присвоить какие-то разные значения. Давайте мы посмотрим на реквизиты этого документа. То есть, вот найдем документ "Заказ", "Заказы", вернее, и у нас есть следующие реквизиты. У нас есть реквизиты "Заказчик", "Договор" и так далее. И также есть стандартные реквизиты – это "Номер", "Дата". Причем, обращаю ваше внимание, у стандартного реквизита "Дата" свойства "Проверка заполнения" стоит значение "Выдавать ошибку". Это значит, что если мы попытаемся записать какой-то документ без указания даты, то возникнет ошибка. Поэтому дату всегда надо указывать. То есть, все остальное можно не указывать и записать документ. Вот дату нужно указать.
Давайте мы это попробуем сделать. То есть, мы просто сейчас вот этому документу "НовыйЗаказ" присвоим новую дату. Это вот будет текущая дата. И все, давайте просто его запишем. Вы заказ для этого мы будем использовать метод объекта документа, который так и называется "Записать". У этого метода два необязательных параметра: "Режим записи" и "Режим проведения". Эти оба параметра являются необязательными, и с ними мы познакомимся чуть позже. Пока мы ничего указывать не будем, просто вот так вот сделаем. Еще все.
Давайте сохраним, обновим и посмотрим, у нас создан документ или нет. Сейчас я никакие названия, ни артикул, ничего не указываю, просто создаем документ. Все, документ создан. Давайте посмотрим на него, и вот документ сегодняшняя дата, и он у меня полностью пустой, то есть ничего в нем нету. Если же мы попробуем с вами записать документ без даты, давайте вот мы эту дату закомментируем, то у нас ничего не получится. Видите, возникла ошибка, что значение поля "Дата" не может быть что-то. То есть, это обязательно дата у нас должна быть. Причем, заметьте, номер документа мы не указали. Почему мы не указали номер? Сейчас разберемся.
Давайте откроем редактор документа и перейдём на закладку "Нумерация". И вот у нас тут стоит флажок "Автонумерация". Это значит, что номер у нас присваиваются автоматически. Поэтому, когда мы создаем документ, и если стоит такой флажок, а он по умолчанию всегда у нас стоит, то никакие номера не надо присваивать.
Давайте познакомимся с ссылкой. Сейчас мы с вами создали экземпляр объекта. То есть, вот эти переменные "НоваяНоменклатура" и "НовыйЗаказ" – это являются экземплярами наших объектов, конкретно справочника "Номенклатура" и документа "Заказ". Но кроме экземпляра объекта существует такое понятие как ссылка на объект. Ссылка – это это указатель на объект, у которого можно прочитать значения реквизитов объекта, но нельзя изменить сам объект. То есть, в нашем случае, когда мы имеем дело с экземпляром объекта, мы можем изменить сам объект, то есть мы можем изменить наименование, там, допустим, полное наименование и артикул прочее. А у ссылки мы ничего поменять не можем, мы
можем только прочитать вот эти значения и все. Работать ссылками очень удобно, потому что в процессе этой работы мы не можем волноваться, что мы случайно что-то изменим или случайно что-то перепишем. То есть, мы просто читаем эти значения и как с ними работать. Заметьте, в основном везде оперирует ссылками. То есть, когда мы создаем у какого-то объекта реквизит, то мы указываем у этого реквизита тип — ссылку именно вот на тот другой объект. Например, вот у нас документа "Заказ" есть реквизит "Заказчик". Если мы откроем свойства этого реквизита, то увидим, что тип этого реквизита — справочник ссылка. То же самое допустимо для другого реквизита "Договор". Тип у этого реквизита тоже справочник ссылка "Договор". И точно так же у экземпляров объектов можно получить ссылку.
Сейчас мы немножко доделаем нашу обработку. Мы создадим два реквизита. У первого реквизита будет ссылка на справочник "Номенклатура", а у второго реквизита будет ссылка на документ "Заказы". Здесь вот мы тип выбираем справочник ссылка "Номенклатура". Возьмем и создадим давайте еще один, назовем "Заказ", и тип у него будет документ ссылка "Заказы". Все, давайте их разместим на форме вот здесь вот, под вот этими названиями нашими. И теперь мы вот этим реквизитам присвоим ссылку на те объекты, которые мы с вами будем создавать.
Давайте перейдем обратно в модуль. Немного ранее, вот в этом коде мы с вами создали экземпляр объекта справочника "Номенклатура" и записали его в базу. Теперь давайте получим ссылку на вот этот экземпляр и эту ссылку присвоим вот этому нашему реквизиту формы. Реквизит у нас называется "Номенклатура", и теперь мы просто пишем название вот этого нашего экземпляра, ставим точку, и одно из свойств вот этого нашего экземпляра является свойство "Ссылка". То есть, "Ссылка" — это стандартный реквизит нашего объекта. Давайте, кстати, посмотрим так ли это. То есть, вот на справочник "Номенклатура" и посмотрим на стандартные реквизиты. И заметьте, у справочника "Номенклатура" есть стандартный реквизит "Ссылка". То есть, мы, в принципе, у любого нашего объекта можем получить стандартный реквизит "Ссылка", в котором будет ссылка на этот объект. И то же самое давайте мы сделаем с документом. То есть, сейчас мы реквизиту формы "Заказ" присвоим ссылку вот на этот документ, который мы только что сделали. Также у нас у документа есть стандартный реквизит "Ссылка". Ну, давайте тоже на него посмотрим. То есть, вот у нас документ "Заказ". Если мы посмотрим на стандартные реквизиты, то вот увидим стандартный реквизит "Ссылка". То есть, мы у любого экземпляра объекта можем получить ссылку на этот экземпляр объекта, используя стандартный реквизит.
Хорошо, давайте обновим и также мы с вами посмотрим, как это все будет работать. Так, ну давайте сначала создадим справочник, и у нас во-первых такой экземпляр справочника будет создан, а во-вторых, этот экземпляр у нас записался в соответствующий реквизит формы. То есть, он здесь у нас отобразится. Мы можем на него посмотреть. То есть, вот тот же у него артикул. И то же самое, давайте создадим документ. То есть, о документ у нас также создан, эта же у нас соответствующий реквизит был заполнен. Тоже мы здесь можем на него посмотреть. У нас пустое ничего, потому что здесь не заполнено. И поскольку мы с вами научились работать ссылками, давайте немножко усложним нашу обработку и у этого справочника "Номенклатура" давайте сделаем так, чтобы в программном коде заполнялся вид номенклатуры. Вид номенклатуры — это у нас перечисление, которого всего два значения: товар и услуга. Мы будем заполнять вот конкретно это значение "Товар". В этом случае вид номенклатуры — это точно такой же у нас реквизит справочника "Номенклатура", который так называется "Вид номенклатуры". Давайте посмотрим на его тип. Тип у него перечисление ссылка. Заметьте, перечисление ссылка — это та же ссылка, то есть это ссылка, но уже на перечисление. Как нам получить ссылку на конкретное перечисление? Делается это достаточно просто. Мы пишем свойство глобального контекста "Перечисления", ставим точку и выбираем конкретное наше перечисление. В нашем случае оно ставится автоматически "Виды номенклатуры", и здесь мы также ставим точку и выберем уже конкретное значение перечисления "Товар". И давайте опять посмотрим, как это все у нас будет работать. Так, мы создали справочник, и видите, у нас уже вид номенклатуры автоматически стал заполнен. То есть, это у нас уже товар. То есть, в том случае, когда нам необходимо получить ссылку на конкретное значение конкретного перечисления, мы используем вот такую схему. Мы сначала применяем свойство глобального контекста "Перечисления", потом у этого свойства мы выбираем конкретное перечисление, то есть нашим ключом это "Виды номенклатуры", а потом мы выбираем уже конкретное значение перечисления, то есть это у нас уже будет "Товар".
Продолжим изучать ссылки. И ссылок мы можем получать значения реквизитов этого объекта. Сейчас я вам покажу, как это делается. Давайте мы создадим обработчик при изменении нашего поля "Номенклатура". То есть, вот у нас на форме обработки есть поле "Номенклатура", вот оно. И мы сейчас создадим обработчик при изменении. И при изменении "Номенклатуры" сделаем так, чтобы у нас заполнялись название и артикул этой номенклатуры, которую мы с вами изменили или выбрали в этом поле. Конечно, с элементами формы мы будем разбираться чуть позже. Пока просто откроем палитру свойств этого элемента "Номенклатура" и создадим событие "При изменении". Вот это событие. Кликаем на кнопку "Открыть". Сейчас нам необходимо создать обработчик на клиенте и процедуру на сервере. Чуть позже я вам объясню, почему я так сделал. Нажимаем "ОК". Обработчик не сделали. Теперь мы давайте у реквизита "Номенклатура", то есть вот этого реквизита нашей формы "Номенклатура", получим реквизиты — это реквизит "Наименование" и реквизит "Артикул". То есть, вот эти два реквизита мы получим и значение этих реквизитов соответственно запишем вот в эти поля "Название" и "Артикул". То есть, когда мы с вами выберем номенклатуру вот в этом поле "Номенклатура", то название и артикул у нас заполнятся автоматически. Как это делается? Это делается достаточно просто. Мы пишем название нашего реквизита формы. Поскольку мы с вами сделали контекстный вызов сервера, то у нас название, вот это вот "Название" — это, соответственно, вот этот вот наш реквизит "Название". В прошлом уроке мы с вами этот момент проходили, вы должны уже знать. Так, "Название", и теперь мы возьмем реквизит "Номенклатура", то есть вот. И у этого реквизита "Номенклатура" получим реквизит "Наименование". Получить значение этого реквизита достаточно просто. Обязательно необходимо поставить после "Номенклатуры" точку, и у нас контекстная подсказка предложит выпадающий список, где будут все реквизиты вот этой нашей номенклатуры, а также некоторые методы, которые связаны со ссылкой справочника. Нас в данном случае интересует вот этот реквизит "Наименование". Выбираем его. Теперь то же самое сделаем с реквизитом формы "Артикул". Также мы пишем "Номенклатура", потом ставим точку и найдем здесь "Артикул". Вот он. Все хорошо. Давайте мы сохраним, обновим конфигурацию, посмотрим, как это у нас будет работать. Давайте выберем какую-то номенклатуру, и вот у меня заполнить название, артикул. Нет. Ну давайте мы здесь сделаем этот артикул. Ну пусть будет такой. И давайте еще раз выберем. То есть, сейчас у меня заполнился артикул. И, конечно же, у вас должен возникнуть вопрос: почему я использую серверный вызов? Почему я это не сделал на клиенте? Давайте попробуем ответить на этот вопрос. Для этого мы с вами поставим отладку. Вот здесь вот, в клиентской процедуре, я поставил отладку. И теперь давайте подключим нашу отладку, потому что я запустил не в режиме отладки, а просто в режиме 1С:Предприятие. Чтобы подключить отладку, нам необходимо вот выполнить эту команду в меню "Отладка", команда называется "Подключение". И здесь мы видим два предмета отладки: это тонкий клиент и сервер. Мы подключим оба. Так, вот можно в принципе было сделать проще, можно было просто запустить в режиме отладки. Теперь давайте еще раз выберем номенклатуру, и у нас сработала точка останова. И давайте мы посмотрим на эту номенклатуру в отладке. И видите, здесь нет никакого выпадающего списка. То есть, мы не можем получить у этой номенклатуры наименование или артикул. Если сейчас я сделаю вот так вот, то есть попробую в отладке посмотреть на наименование, видите, поле "Объект" и не обнаружено. То есть, если бы мы сами попробовали в клиентском контексте получить реквизиты из нашей ссылки, то у нас бы ничего не вышло, у нас бы возникла вот такая ошибка. Давайте посмотрим. Мы на справочник "Ссылка" в контекстной подсказке. И вот у этого нашего объекта "СправочникСсылка", давайте посмотрим на свойства. То есть, вот на это свойство "Имя реквизита", "Использование", "Только чтение". То есть, мы не можем поменять значение реквизита. Ну что и понятно. И смотрите, какая у нас доступна: "Сервер", "Толстый клиент" и так далее. То есть, тонком клиенте мы не можем работать с реквизитами "Ссылка", поэтому я здесь и сделал серверный вызов. Хорошо, давайте продолжим. То есть, если мы с вами работаем в клиентском контексте, и нам необходимо получить какие-то реквизиты из ссылки, и мы с вами находимся на тонком клиенте, а не на толстом, то нам необходимо сделать серверный вызов. Это имейте в виду, потому что часто у многих бывают вот такие вот ошибки, они с этим сталкиваются.
Давайте идем дальше. Продолжим терзать наши ссылки. Что мы можем сделать со ссылкой? И ссылок мы можем получать объекты и что-то потом с этим объектом делать. То есть, ссылку непосредственно мы менять не можем, но объект получить и ссылки мы можем. Давайте мы сделаем такую задачу: мы будем получать из ссылки на справочник "Номенклатура", то есть вот из этой ссылки "Номенклатура", объект, изменять у него артикул и после этого будем сохранять этот объект. Давайте мы это сделаем. То есть, мы выбираем номенклатуру и после этого мы можем изменить ее. Для изменения мы создадим новую команду, которую назовем "Изменить справочник". Также я сделаю действие на клиенте и на сервере, потому что с объектом мы можем с вами работать только в серверном контексте. Окей. Все. Теперь давайте мы получим объект из вот этой вот ссылки, из вот этого нашего реквизита "Номенклатура". То есть, вот этот реквизит "Номенклатура" — это у нас ссылка, и сейчас мы из этой номенклатуры получим объект. Как это делается? Ну, во-первых, сам этот объект, который мы с вами получим, он должен записаться в какую-то переменную. Мы давайте создадим эту переменную, которую так назовем "НоменклатураОбъект". Я сделал явные. И теперь мы этой переменной присвоим объект, который получен из ссылки. Для этого мы воспользуемся методом ссылки, который так и называется "ПолучитьОбъект". После этих действий вот эта "НоменклатураОбъект" — это будет у нас уже конкретный объект, конкретный объект, который мы с вами получим из вот этой нашей ссылки. С этим объектом мы можем делать что угодно. Ну, например, мы сможем изменить у него какой-то реквизит. То есть, я также ставлю точку и получаю список всех реквизитов нашего объекта "Артикул". Давайте артикул у него возьмем с формы. Все. И также мы этот объект записываем. Сейчас, если мы с вами выберем номенклатуру, потом изменим артикул, то номенклатура и нажмем вот эту команду "Изменить справочник", то у нас артикул номенклатуры поменяется. Давайте мы это сделаем. Давайте обновим, запустим 1С:Предприятие. Давайте выберем какую-то номенклатуру. Ну, уже "Перевозка" выбирать не буду, давайте вот "Малкова". By причем, заметьте, здесь уже какой-то артикул есть. Ну, давайте мы его переделаем, пусть такой будет. Так, и команду я, конечно же, забыл разместить на форме. Какой косяк! Давайте им эту команду разместим на форме. Да, все. Давайте сохраним, обновим и заново перезапустим. Так, давайте выберем какую-нибудь номенклатуру, то есть вот это "Молоко". И давайте мы у нее артикул поменяем. Ну, пусть такой будет. Так, "Изменить справочник". Справочник у нас изменился, никаких ошибок не возникло. Давайте откроем теперь карточку этой номенклатуры, и все, вы видите, у нас артикул поменялся. Причем мы можем менять не только какие-то примитивные типы, мы также можем и менять какие-то ссылочные типы. Например, у нас есть такой ссылочный тип, как "Вид номенклатуры" — это ссылка на перечисление "Вид номенклатуры". Давайте мы также создадим новый реквизит "Вид номенклатуры", который будет ссылкой на вот это перечисление, и будем этот реквизит вот записывать сюда данные из этого реквизита обработки. У нас будет записываться вот наша вот нашу номенклатуру. Хоть это закроем и создадим новый реквизит, который так и назовем "Вид номенклатуры". Так, тип у него будет ссылка на вот это перечисление "Виды номенклатуры". Все. И давайте мы его на форму сюда затащим. Все, "Вид номенклатуры". И также, когда мы с вами изменяем справочник, то мы будем изменять не только артикул, но и вид номенклатуры. То есть, вот этому реквизиту справочника "Вид номенклатуры" мы будем присваивать значение из одноименного реквизита от нашей формы, которые мы только что сделали. Все, сохраним, обновим и посмотрим, как это будет работать. Так, давайте вот выберем справочник "Молоко". Так, "Молоко" мы выбрали, но "Вид номенклатуры" у этого молока у нас здесь не заполнился. Давайте мы сделаем так, чтобы "Вид номенклатуры" тоже заполнялся, где мы с вами выбираем вот это "Молоко". "Номенклатура", при изменении. Так, вот здесь у нас "Название", "Артикул" заполнился. Теперь давайте тоже "Вид номенклатуры" заполняется. Пусть будут вот "Вид номенклатуры". Теперь у нас тоже заполняется. Обновим и заново сейчас перезапустим. Так, давайте опять выберем. Никакого вида номенклатуры у нас здесь, судя по всему, у этого элемента справочника нету. Ну, давайте мы устраним этот недостаток. Выберем "Товар" и выполним команду "Изменить справочник". Справочник у нас поменялся. Давайте откроем опять карточку этого молока, и мы видим, что у нас "Вид номенклатуры" абсолютно нормально заполнилась. То есть, мы можем заполнять не только реквизиты примитивных типов, но и также реквизиты какие-то ссылочных типов. Причем, заметьте, ссылка может быть пустая. Давайте мы обработку закроем и заново ее откроем. И в этот раз у нас здесь в поле "Номенклатура" ничего нету. Если мы попробуем изменить наш справочник, то возникнет какая-то не очень-то хорошая ситуация. Давайте мы эту ситуацию отработаем. Когда мы будем изменять наш справочник, мы проверим, какая ссылка вот в этом реквизите "Номенклатура". Если она пустая и ничего нету, то мы ничего делать и не будем. Давайте зайдем опять в конфигуратор, и мы вот у этого реквизита "Номенклатура", который является ссылкой на справочник "Номенклатура", можем проверить, какая эта ссылка пустая она или в ней что-то есть. Для проверки мы воспользуемся методом вот этой нашей ссылки. Так и называется "Пустая ссылка". Ну, вернее, он называется "Пустая". Пропустил ссылку — это немножко в другом месте. Вот этот метод "Пустая" является булевой функцией, и эта функция возвращает истинно тогда, когда у нас ссылка пустая, и возвращает ложь тогда, когда она у нас не пустая. Соответственно, когда он вернул истина, мы ничего делать не будем. Давайте просто выйдем из этой процедуры. Все. Ну, давайте еще сообщение выведем. Вот так вот. Давайте сохраним, обновим и посмотрим, как у нас это будет работать. В этот раз так, меня ничего сейчас не выбрано. Давайте выполним команду "Изменить справочник", и выше сообщение "Ссылка пустая". Ничего мы не предприняли. То есть, ничего не пытались поменять. Давайте выберем номенклатуру, но пусть это будет в этот "Творог". Так, давайте вид, пример, как установили, артикул поменяем. Все, выполняем команду "Изменить справочник", и у нас номенклатура должна теперь измениться. Давайте откроем карточку номенклатуры, вы видите, что у нас и вид заполнился, и артикул заполнился. Хорошо. То есть, при помощи вот этого метода "Пустая" мы можем проверить, это наша ссылка или нет. Также у менеджера справочника тоже есть метод "Пустая", который тоже возвращает пустую ссылку. То есть, мы можем сделать вот так вот. Это, конечно, более длинный код. Я вам просто покажу, что он возможен. Вот этот код я пока закомментирую, потому что я потом его оставлю. Но в принципе, мы можем и поступить вот так вот. Именно, да, мы не можем напрямую получить какой-то метод у объекта. Нам необходимо сравнить. Мы просто получаем менеджер справочника, то есть "Номенклатура", и у этого менеджера есть команда "Пустая ссылка", которая, кстати, спутал самом начале. То есть, мы можем сделать вот таким образом. Давайте сохраним, обновим. Я забыл закрыть. Обновим и запустим 1С:Предприятие. И видите, проверка у нас сработала. То есть, этот вариант, который я вам сейчас показал, он тоже рабочий. Ну, давайте мы его уберем. Я его вот так вот, как раз и закомментирую, а этот ставлю.
Сейчас я вам показал работу ссылкой на примере справочника. Но то же самое мы можем сделать и с документом. То есть, мы тоже у документа можем получить какую-то ссылку, можем ее как-то изменить на наше усмотрение, или можем что-то добавить. Давайте я покажу вам простой пример, как это делается. Для этого мы на форме создадим еще один реквизит, который назовем "Заказчик". Типа этого реквизита будет точно такой же, как тип реквизита "Заказчик" нашего документа "Заказы". Это справочник ссылка "Контрагенты". Давайте мы это сделаем. То есть, вот сейчас мы создадим этот реквизит на нашей форме. Тип у него будет справочник ссылка "Контрагенты". Ну и давайте заодно и "Договор" сделаем. Тоже создадим реквизит справочник ссылкой "Договор". Так, вот эти "Заказчик" и "Договор" разместим на форме. "Заказчик", "Договор". Здесь, конечно, все у меня так вот скопом размещено. Можно, конечно, сделать более красиво, можно сделать вкладочки. Закладочки, но потом работу с формами мы будем проходить, и это все на форме сделаем. Сейчас пока мы на это не будем отвлекаться. И у нас "Заказчик" связан с "Договором", поскольку у нас справочник "Договоры" подчинен справочнику "Контрагенты", мы сейчас эту подчиненность здесь реализуем. Для этого мы откроем палитру свойств вот этого нашего элемента "Договор". Здесь у нас есть такое свойство "Связи параметров выбора". Давайте откроем эту команду, изберем здесь вот этот параметр "Заказчик". Теперь у нас в форме выбора будут открываться только договоры вот этого заказчика, а не все договоры, которые у нас есть. И давайте создадим еще одну команду формы, которую назовем "Изменить документ". Также я создаю обработчик на сервере. Вы, наверно, уже поняли, почему. И первым делом мы проверим, является ли вот у нас вот этот наш реквизит "Заказ" пустой ссылкой. Если этот реквизит "Заказ" является пустой ссылкой, мы просто выйдем с вами из процедуры, чтобы дальше ничего не работала. У нас вот этот реквизит "Заказ" является ссылкой на документ "Заказы", и как у ссылки, у него тоже есть такой метод, который так и называется "Пустая". Вот этот метод, и этот метод возвращает истинно, если ссылка пустая. То есть, мы просто выходим из нашего вот этого метода. И здесь выведем какое-то сообщение. Все. Теперь давайте мы получим объект вот из этой нашей ссылки. Для этого мы сейчас создадим переменную "ЗаказОбъект", и в эту переменную мы будем записывать объекты ссылки. Для этого мы будем использовать метод ссылки, который так и называется "ПолучитьОбъект". В этот метод. И все. Теперь вот эта переменная "ЗаказОбъект" — это является объектом нашего документа, который мы выберем в поле ввода. С этим объектом мы можем делать что хотим. Давайте мы этому объекту присвоим значение реквизитов "Заказчик" и реквизиты "Договор". То есть, вот у нас здесь реквизит "Заказчик", мы также ставим "Заказчик", и реквизит "Договор". Все. Теперь давайте мы просто запишем его. Для этого мы используем метод объекта "Записать". Мы уже с этим сталкивались. Все. Это вами до тоже два параметра. Сейчас мы касаться не будем, мы коснемся потом. Просто пока запишем без указания каких-либо параметров. Все. Сохраним, обновим. Теперь и запустим 1С:Предприятие. И давайте посмотрим. Так, давайте вот выберем этот "Заказчик", "Договор". И давайте выберем какой-то заказ. Ну, вот последнее заказов, которые мы сделали. Давайте мы его укажем. И сейчас, заметьте, у нас здесь никакого заказчика, никакого договора нету. Так, и опять я забыл разместить команду на форме. Давайте мы перейдем и команду разместим "Изменить документ". Всю команду разместили, сохраним, обновим и запустим опять. Так, давайте выберем документ. То есть, вот документ "Заказ". У этого документа не "Заказчик", не "Договор" не указан. И теперь давайте мы с вами укажем вот этот "Заказчик" и вот "Договор". Выполняем команду "Изменить документ". У нас, заметьте, выше сообщение из модуля объекта. И это сообщение делали мы с вами в одном из уроков. Если вам, в принципе, не мешает, можете закомментировать. Я пока их оставлю. И у нас, когда мы с вами записывали документ, был активирован модуль объекта, поэтому это сообщение выше. Все хорошо. Теперь давайте опять посмотрим на заказ. И все, вы видите, у нас "Заказчик" выбран, и соответственно, "Договор" тоже выбран.
И, конечно же, вы должны знать, что у объектов имеются табличные части. То есть, вот у нас есть документ "Заказ", и у этого документа есть табличная часть "Услуги и материалы". То есть, в этой табличной части перечисляются какие-то услуги и материалы. Тут перечисляются какие-то материалы. Мы посредством работы как с экземпляром объекта, так и ссылкой можем обращаться к этой табличной части. Если мы обращаемся к табличной части посредством ссылки, там и эту табличную часть только можем читать. А если мы обратимся к этой табличной части посредством экземпляра объекта, то мы можем изменять эту табличную часть. Для демонстрации мы сделаем следующий пример: мы справочнику "Контрагенты", то есть вот этому справочнику "Контрагент" или "Фирм" или "Заказчик", добавим новую табличную часть, которую назовем "Предпочтительные услуги". А потом мы создадим обработку, в которой будем делать новый документ "Заказ", и табличная часть "Услуги" у этого документа будет заполняться данными из вот той нашей таблицы у контрагента. Давайте мы это сделаем. Вот "Контрагенты", и давайте у него табличная часть будет такой. Той табличной части будет единственный реквизит "Услуга", тип этого реквизита будет ссылка на номенклатуру. И также сделаем параметр выбора, чтобы мы могли выбирать только услуги. Для этого борзеть "Номенклатура", что новым "Услуга". Вот так вот. И давайте вот на форме элемента мы эту табличную часть разместим. Для этого мы создадим новую группу, это будет группа "Страница Услуги", и в эту группу мы перетащим вот эту табличную часть. Колонки мы добавим. Да, все. Так, давайте обновим и посмотрим вообще, у нас видел, что на форме эти фирмы у нас купать или вот услуги. Давайте добавим к конкурсу. Мы не можем добавлять материал, потому что мы установили ограничения по отбору. Давайте вот "Перевозку" добавим и "Укладка ламината". Теперь давайте создадим обработку, которую назовем "Создать заказ". Подсистему ее включим "Заказы". Так, давайте создадим форму обработки, и у этой формы создадим объект, который так и назовем "Заказчик". Тип у этого объекта будет ссылка на справочник "Контрагенты". И создадим команду, которую назовем "Создать заказ". Также мы создадим обработчик команды на сервере и на клиенте. Но только давайте сделаем без контекстного вызова, потому что нам, в принципе, контекст формы не обязательно. А "Заказчиком" мы передадим просто в качестве параметра. Здесь вот мы сейчас сделаем "Заказчик" параметр, этот параметр тут укажем, чтобы нам лишний раз не гонять данные туда-сюда. Сейчас мы сначала создадим документ "Заказ" для этого заказчика, потом получим табличную часть "Предпочитаемые услуги" у нашего заказчика, будем обходить эту табличную часть и при обходе этой табличной части будем создавать новые элементы для табличной части уже у документа "Заказ". Вот. Потом сделаем "Создаем заказ", используем метод "Создать документ" менеджера документа. Обязательно ставим текущую дату, вернее, дату. И нее мы запишем текущую дату. Непосредственно текущую дату в процедуре использовать не будем. Создадим еще один параметр. Так, вот. И здесь так сделаем. Теперь мы обратимся к реквизиту объекта "Контрагенты", вернее, "Заказчик", и как бы присвоим ему вот этого заказчика. Кстати, давайте сделаем проверку. Если "Заказчик" у нас пустой, то мы выйдем из этой процедуры. Контекстная подсказка у меня, заметьте, не сработала, потому что у нас "Заказчик" — это вот параметр. Это все документ мы с вами сделали. Теперь давайте обойдем табличную часть вот этого нашего заказчика. Для этого мы просто обратимся к табличной части справочника "Контрагенты". Есть табличная часть "Предпочитаемые услуги". Мы можем к этой табличной части обратиться просто как свойству вот этого нашего документа. Тоже, заметьте, контекстная подсказка сейчас не срабатывает, потому что у меня здесь и заказчик — это в качестве параметра был передан. Но если бы она срабатывала, то мы смогли бы выбрать вот эти предпочитаемые услуги. И все, в принципе, этого нам теперь достаточно, чтобы обойти эту табличную часть. Для обхода мы будем использовать цикл "Для каждого". По мы этот уже цикл затрагивали. На так или иначе расскажу еще раз. Сейчас после вот этого сочетания "Для каждого" мы указываем какую-то переменную, где в процессе итерации будет присваиваться строка табличной части. В этой переменной будет каждый раз вот эта строка табличной части, и мы можем с этой строкой работать. То есть, мы будем обходить все строки этой табличной части. То есть, вот это "Услуги заказчика" — это является табличная часть. Мы эту табличную часть циклом обходим, и вот эта переменная "Услуга" в каждой итерации цикла в ней будет строка табличной части. И мы можем обращаться к строке к этой табличной части в открытую. Фуги, конечно, "Услуга" и "Услуга" как-то коряво. Давайте просто "СтрокаОбчасти" будет. Вот так вот, чтобы не было "Услуга", "Услуга". И все. Теперь в каждой операции цикла мы будем создавать новую строку табличной части документа "Заказы". У нас у документа "Заказы", давайте посмотрим, две табличные части: это "Услуги" и "Материалы". Мы будем с вами создавать новую строку для табличной части "Услуги". Как это делается? Мы также пишем название нашего объекта "ЗаказОбъект", ставим точку, и здесь контекстная подсказка предложит нам вот эту табличную часть "Услуги". И это табличная часть, вот это вот, является тоже объектом, и как у объекта, у нее есть свойство. И одно из свойств — это "Добавить". То есть, вот это свойство "Добавить" создает новую строку табличной части и возвращает ссылку на эту строку. То есть, это у нас "Добавить" — эта функция, которая возвращает ссылку. То есть, вот эта "Новая строка заказа", то есть вот эта переменная — это является строка нашей табличной части "Услуги", которая была только что создана. И у этой новой строки заказа в этой переменной мы можем обратиться к реквизитам вот к этим. Вот мы можем каким реквизитам обратиться и что-то им присвоить. Мы в нашем случае присвоим "Услугу". Какая же это будет "Услуга"? Вот эта "Услуга" конкретно будет та услуга из табличной части нашего справочника, которое мы только что сделали. Вот это вот эту услугу будет. Все, мы, в принципе, заполнили. И давайте просто запишем наш документ. Также никаких параметров не указываем. Хорошо, давайте попробуем это сделать. Попробуем выполнить. Так, мы с вами вот у этих "Васильков" заполнили табличную часть. Идем "Заказы", "Сервис", "Создать заказ". Ну, давайте выберем эти "Васильки". А команду я забыл. Так, давайте мы разместим команду "Создать заказ". И также давайте мы разместим, создадим, вернее, новый реквизит, который назовем "Новый заказ". Типа этого реквизита будет ссылка на вот этот наш документ "Заказы". Сейчас "Создать заказ" команду в панель. И вот этот "Новый заказ" мы ему присвоим ссылку на наш этот объект. Так, присвоить мы напрямую не можем, потому что у меня здесь без контекстный вызов. Ну, давайте обратно сделал контекст nintendo. Но в заказ, и вот мы ссылку на заказ объекта получим. Ну, а параметры так с тем. Так, давайте обновим и посмотрим, как у нас это будет все работать. Козы, сервис, создать заказ. Вот это "Веселье". Дать заказ. Так, дико создан. Давайте зайдем, посмотрим. И мы видим, что даже табличная часть заполнилась. То есть, вот оно здесь заполнилось. Причем, заметьте, мы завод и табличной части можем также и другими реквизитами тоже оперировать. Например, мы можем количество 1 поставить, потом стать. И когда мы будем проходить регистры сведений, мы сделаем так, чтобы еще на судьба поставлялась цена, которая у нас будет кормиться в регистре. Вот косяки. Еще один заказ мы сделали, и вот у нас все заполнилось. И ругается на и заказчик. Ну, и самостоятельно договор сделать, что запомнилось.
На этом я закончу этот урок. Спасибо, что досидели со мной до конца. Что же делать дальше? Первое — сделать пример, и дурака, который я сейчас привел, под видео будет описание этого примера. Второе — сделать домашнее задание. Под видео тоже будет ссылка на домашнее задание. Также проверочная конфигурация, конечно же. Отпишитесь в комментариях о ваших успехах, той, что у вас получилось или что наоборот не получилось. И, конечно же, подписывайтесь на мой телеграм-канал и на группу ВКонтакте. И большая просьба вам поставить лайк к этому видео. И уже чем больше вы поставите лайков, тем лучше это видео будет выдаваться другим пользователям, и тем больше него просмотров. И спасибо вам за внимание. Эффективного и продуктивного вам обучения. Всего доброго, до встречи.