Как система 1с предприятие выполняет обращение к ссылочным данным

Обновлено: 07.07.2024

Теперь займемся кодом. Нам, в дополнение к клиентской процедуре команды СоздатьЭлементСправочника, понадобится серверная процедура или функция , которая и занимается созданием элемента. Обратиться к объекту СправочникМенеджер для конкретного справочника можно различными способами. Предположим, мы заранее знаем, с каким справочником нам нужно работать (например, это – справочник Номенклатура). Для того, чтобы вызвать метод этого справочника СоздатьЭлемент, нам понадобится такая конструкция:

В данном случае происходит следующее. Посредством объекта СправочникиМенеджер (Справочники) мы получаем доступ к объекту СправочникМенеджер для справочника Номенклатура и выполняем его метод СоздатьЭлемент. Этот метод возвращает нам объект типа СправочникОбъект ( доступ к нему возможен через переменную НовыйЭлемент).

В нашем случае имя справочника задает пользователь , оно нам заранее неизвестно. В том случае, если имя справочника для вышеописанной конструкции будет, перед обращением к менеджеру справочника, записано в некую переменную, мы можем использовать такую конструкцию (в нашем случае имя справочника хранится в текстовой переменной ИмяСправочника):

Оператор[…], который используется в данной конструкции, заменяет конструкцию с точкой и жестко заданным именем справочника.

После того, как мы получили переменную типа СправочникОбъект, мы можем настроить необходимые свойства конкретного элемента справочника (в нашем случае – наименование) и записать элемент. Вот, как выглядит результирующий код:

Обратите внимание на то, что мы в серверной процедуре обращаемся к реквизитам формы напрямую – они доступны и на сервере и на клиенте, так как функция , в которой они вызываются – это функция , объявленная с используемой по умолчанию директивой &НаСервере. Если бы мы в подобной ситуации попытались воспользоваться серверной внеконтекстной функцией ( директива &НаСервереБезКонтекста) – обращаться к контексту формы (к ее реквизитам), мы не смогли бы. Вместо того, чтобы пользоваться стандартными механизмами обмена данными с сервером (а при вызове серверной процедуры на сервер передаются данные от клиента о состоянии формы), нам пришлось бы организовывать передачу этих данных вручную через параметры методов. Серверная внеконтекстная функция позволила бы снизить объем данных, передаваемых с клиента на сервер и обратно. Но она, в то же время, способна выполнять те же действия с базой, что и функция , объявленная с ключевым словом &НаСервере.

Вот, каковы результаты работы этого кода, рис. 5.10.

Создание нового элемента справочника

Функция СоздатьЭлементСправочникаНаСервере создает новый элемент, заполняет его свойство Наименование, после чего записывает его и возвращает код нового элемента. Код формируется системой автоматически. Если заглянуть в справочник ЕдиницыИзмерения – там, действительно, будет создан новый элемент с заданным нами наименованием.

Продолжим наши примеры программной работы со справочниками. Нам нужно реализовать автоматическую пометку всех элементов (но не групп) справочника на удаление. Создадим новую команду ПометитьНаУдалениеВсеЭлементыСправочника. После создания процедуры , связанной с этой командой и серверной процедуры, выполняющей работу с базой. У нас получился такой код:

В процедуре ПометитьНаУдаление() мы сначала присваиваем 0 переменной СчетчикПомеченых – с ее помощью мы будем подсчитывать количество помеченных на удаление элементов справочника. В качестве имени справочника мы используем уже знакомый по прошлой процедуре реквизит ИмяСправочника. Конструкция Справочники[ИмяСправочника] позволяет нам обратиться к объекту типа СправочникМенеджер для заданного справочника. Этот объект имеет метод Выбрать(). Метод Выбрать() позволяет сформировать выборку элементов справочника по заданным условиям. Мы, в данном случае, условий не задаем, то есть в выборку попадают все элементы и группы справочника – метод возвращает значение типа СправочникВыборка. СправочникВыборка не содержит элементов справочника, объект этого типа можно считать способом доступа к элементам, способом их перебора. При обращении к выборке обход элементов осуществляется динамически, данные считываются из базы порциями, что позволяет эффективно использовать данный механизм даже для работы с большими справочниками, так как все элементы, входящие в выборку (соответствующие условиям выборки) в память не загружаются.

Команда Выборка.Следующий(), во-первых, возвращает значение Истина (в нашем случае это приводит к запуску следующей итерации цикла ), если в выборке выбран следующий элемент, во-вторых, получает следующий элемент выборки. Обращение к этому элементу осуществляется через ту же переменную Выборка типа СправочникВыборка. Для получения объекта элемента справочника мы пользуемся методом Выборка.ПолучитьОбъект() – он возвращает объект типа СправочникОбъект, с которым мы можем дальше работать. А именно, мы проверяем, не является ли найденный элемент группой, если не является – используем метод УстановитьПометкуУдаления объекта типа СправочникОбъект. Этот метод принимает один обязательный параметр , которые следует первым в списке параметров, а именно – для установки пометки удаления он должен быть установлен в значение Истина (как в нашем случае), для снятия – в значение Ложь.

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

Рассмотрим пример. В заданном справочнике нужно найти элемент с заданным наименованием (или сообщить, что элемента с таким наименованием в справочнике нет), изменить регистр символов в наименовании таким образом, чтобы все буквы были прописными, и сообщить пользователю его код с указанием старого и нового наименования.

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

Переработанная форма

Результат работы кода по поиску и редактированию элемента справочника


Рис. 5.12. Результат работы кода по поиску и редактированию элемента справочника

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

СправочникиМенеджер – доступен через свойство глобального контекста Справочники. Предназначен для управления справочниками, позволяет получить доступ к объекту СправочникМенеджер конкретного справочника.

СправочникМенеджер – нужен для управления справочником как объектом конфигурации. С его помощью можно создавать элементы и группы справочника, искать элементы в справочнике, помечать их на удаление, получать выборки элементов справочника.

СправочникВыборка – объект этого типа предназначен для работы с выборкой элементов справочника, полученной по заданным условиям. Для получения выборки используется метод Выбрать() объекта СправочникМенеджер

СправочникСсылка – основная область применения – использование в реквизитах других объектов для указания ссылки на определенный элемент справочника. Ссылка – это идентификатор элемента. Если имеется объект СправочникСсылка, а элемент справочника нужно редактировать или выполнять с ним другие подобные действия ( копирование элемента, например), от ссылки осуществляется переход к объекту типа СправочникОбъект.

СправочникОбъект – предназначен для манипуляций с отдельным элементом справочника, в частности, для чтения, изменения, добавления, удаления элементов.

Для работы с метаданными справочника можно использовать свойство глобального контекста Метаданные, или, например, метод Метаданные() объекта типа СправочникСсылка. Для работы с метаданными справочника применяется тип данных ОбъектМетаданных: Справочник.

Иногда возникает путаница с понятиями "данные, хранящиеся в справочнике" и " метаданные справочника". Данные справочника – это элементы справочника – например, в справочнике ЕдиницыИзмерения может храниться элемент с наименованием "Штука", и кодом "0001". Метаданные – это, как принято говорить, "данные о данных". То есть, например – это имя справочника, набор его реквизитов, список владельцев справочника и так далее. Метаданные , другими словами – это то, что мы редактируем, работая в Конфигураторе, а данные – это то, с чем мы взаимодействуем, работая со справочником в пользовательском режиме. При работе со справочником как с объектом метаданных, мы можем обращаться к свойствам этого объекта только для чтения – операции по модификации метаданных производятся в визуальном режиме с помощью Конфигуратора. При программной работе с данными справочника, мы имеем полный набор инструментов для управления этими данными.

Есть еще один тип данных , имеющий отношение к справочникам, о котором мы здесь не упоминали. Это – СправочникСписок – он используется для управления списком элементов справочника в табличных полях.

Обсудив программную работу со справочниками, перейдем к разговору об отчетах

При использовании для доступа к данным 1С:Предприятия 8.0 COM -соединения имеются следующие преимущества по сравнению с использованием Automation сервера:

  1. Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
  2. Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
  3. Меньший расход ресурсов операционной системы.

В общем и целом работа с 1С:Предприятием 8.0 через COM -соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:

  1. В случае Automation сервера запускается полноценное приложение 1С:Предпприятия 8.0, а в случае COM -соединения запускается относительно небольшой внутрипроцессный COM -сервер.
  2. При работе через COM -соединение недоступны функциональные возможности так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8.0;
  3. При работе COM -соединения не используется модуль приложения конфигурации 1С:Предприятия 8.0. Его роль при работе с COM -соединением играет модуль внешнего соединения.

1.1 Порядок установки COM-соединения

Для организации доступа к данным 1С:Предприятия 8.0 через COM -соединение, выполняется следующая последовательность действий:

Важно! В связи с отсутствием пользовательского интерфейса в COM-соеденении не все объекты, а также свойства и методы можно использовать в COM -соединении.

Объекты 1С:Предприятия, доступные извне через COM -соединение:

  1. Экспортируемые переменные и процедуры/функции модуля внешнего соединения
  2. Экспортируемые переменные и процедуры/функции общих модулей
  3. Включение и исключение модулей целиком с помощью установки свойств общих модулей
  4. Включение и исключение фрагментов общих модулей с помощью препроцессора
  5. Глобальный контекст 1С:Предприятия 8.0, за исключением объектов, жестко связанных с клиентским приложением (ТекстовыйДокумент, ТабличныйДокумент, . )

1.2 Модуль внешнего соединения

Как уже отмечалось обязанности модуля приложения при работе через COM -соединение, выполняет модуль внешнего соединения. Данный модуль может иметь процедуры-обработчики событий ПриНачалеРаботыСистемы() и ПриЗавершенииРаботыСистемы(), в которых могут быть размещены действия, выполняемые при инициализации и завершении соединения, соответственно.

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

1.3 Общие модули

Для общих модулей введены свойства "Клиент", "Сервер" и "ВнешнееСоединение". Они предназначены для определения в конфигурации использования модулей в клиент - серверном варианте и в режиме COM -соединения.

1.4 Объект "V8.COMConnector"

Строка соединения с ИБ представляет собой цепочку фрагментов вида Параметр=Значение. Фрагменты отделяются друг от друга символами ';'. Если значение содержит пробельные символы, то оно должно быть заключено в двойные кавычки (").

Usr - имя пользователя;
Pwd - пароль.

Для файлового варианта определен параметр:

File - каталог информационной базы.

Для клиент-серверного варианта определены параметры:

Srvr - имя сервера 1С:Предприятия;
Ref - имя информационной базы на сервере.

Метод Connect возвращает ссылку на созданный объект COM -соединения.

Метод Connect устанавливает COM -соединение с информационной базой 1С:Предприятия 8.0 и возвращает ссылку на объект COM -соединение.

// Создается объект-коннектор
V8 = Новый COMObject ("V8.COMConnector");
// создается объект COM -соединение
Соединение = V8.Connect ("File=""c:\InfoBases\Trade""; Usr =""Director"";")

Авторизация доступа через COM -соединение возможна как с помощью параметров строки соединения «Usr» и «Pwd», так и через пользователя Windows, в любом случае должно быть право на «Внешнее соединение».

1.5 Объект "COM-соединение"

COM -соединение с информационной базой 1С:Предприятия предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому COM -соединение в качестве своих методов может иметь: системные константы, значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.

Кроме того, COM -соединение имеет дополнительный метод NewObject, с помощью которого можно создавать значения определенных типов.

тз = Соединение. NewObject ("ТаблицаЗначений");

Метод String Позволяет получать строковые представления значений 1С:Предприятия.

1.6. Особенности работы с COM -соединением

В Automation и в COM -соединении TRUE и FALSE имеют соответственно значения: -1 (минус единица) и 0.

Имеется возможность организации пула COM-соединений. При этом на принимающей на сервере 1С:Предприятия ЗАРАНЕЕ создаются несколько объектов COM-соединения и на установку соединения требуется еще меньше времени, поскольку не нужно создавать новый объект.

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

Доступно использование COM -объектов при работе встроенного языка на сервере 1С:Предприятия.

Мы уже познакомились с таким понятием, как объект в 1С , следующим шагом будет логично познакомиться с таким понятием, как ссылка в 1С.

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

Мы помним, что в платформе 1С 8.3. существуют три вида объектов. Это объекты метаданных, общие объекты и универсальные коллекции значений.

Так вот, ссылка может быть только у объектов метаданных.

Замечу что, ссылка указывает не на сам объект, а на экземпляр объекта. Хотя, очень часто употребляют выражения «ссылка объекта», «ссылка на объект» и т.п.

Все ссылки объектов имеют тип СправочникСсылка.<НазваниеОбъекта>, ДокументСсылка.<НазваниеОбъекта> и т.д.

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

Например, в моей конфигурации есть справочник Контрагенты.

Справочник в конфигурации 1С

Ссылка на справочник у реквизита документа 1С

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

Ссылка на справочник у реквизита документа 1С

Если мы используем ссылку в качестве реквизита какого-то объекта, то при редактировании экземпляра, на который указывает ссылка, сам реквизит не изменится.

Поясню на примере. Я выше создал документ Оплата и реквизит Оплативший для этого документа с типом СправочникСсылка.Контрагенты.

Если я переименую элемент справочника Контрагенты.

Элемент справочника 1С

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

Документ 1С

Что это значит? Это не значит, что реквизит Оплативший элемента и сам элемент справочника Номенклатура поменялся автоматически. Нет, это значит, что данный реквизит хранит указатель на экземпляр объекта, который отображается посредством наименования. Поменяли наименование, поменялось только отображение, если бы поменяли какой-нибудь другой реквизит справочника Контрагенты, то пользователь бы ничего не заметил.

Получить ссылку 1С

Каким образом программно получить ссылку на экземпляр объекта, который уже есть в базе?

Сделать это можно несколькими способами: найти по коду, найти по наименованию, найти по реквизиту и найти по нескольким реквизитам через запрос. Я рассмотрю первые два метода.

Для демонстрации этих методов, на основной форме документа Оплата я создам команду «Установить контрагента», которую размещу в командной панели формы.

Команда основной формы 1С

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

Обработчики команды 1С

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

Функция НайтиПоКоду вернёт ссылку на экземпляр объекта справочник Контрагенты, которому соответствует код 000000002. Почему мы задали код в виде строки, а не в виде цифры, например? Чтобы понять это, нужно открыть непосредственно редактор справочника Контрагенты в конфигураторе, перейти на закладку «Данные» и посмотреть, какой тип кода у этого справочника.

Тип кода справочника 1С

Таким образом, данный код:

Рассмотрим синтаксис этой функции для менеджера справочника:

НайтиПоКоду(<Код>,<ПоискПоПолномуКоду>,<Родитель>,<Владелец>)

Код – непосредственно тот код, по которому мы ищем наш элемент;

Данное поле необязательно, по умолчанию – Ложь;

Родитель – для иерархических справочников можно указать группу, тогда поиск будет вестись внутри группы. Данное поле необязательно;

Владелец – для подчиненных справочников можно указать владельца, тогда поиск будет вестись только среди элементов, подчиненных данному владельцу. Данное поле необязательно.

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

Этот способ можно применить только для тех объектов, у которых имеется стандартный реквизит Наименование.

Например, у справочников этот реквизит имеется.

Стандартный реквизит Наименование справочника 1С

А у документов его нет.

Отсутствие стандартного реквизита Наименование документа 1С

В случае этой функции, поиск ведется по тому значению, которое в поле Наименование объекта

Синтаксис функции для менеджера справочника следующий:

НайтиПоНаименованию(<Наименование>,<ТочноеСоответствие>,<Родитель>,<Владелец>)

«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;

Данное поле необязательно, по умолчанию – Ложь.

Помните это, что по умолчанию поиск ведется не точно;

Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.

Пустая ссылка 1С

Выглядит он так:

ПустаяНоменклатура= Справочники.Номенклатура.ПустаяСсылка();

ПустаяОплата = Документы.Оплата.ПустаяСсылка();

Переменные ПустаяНоменклатура и ПустаяОплата содержат в себе пустые ссылки на каждый объект.

Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя собственная пустая ссылка.

Данный метод очень удобно использовать, когда нам необходимо знать, найден ли элемент справочника по коду (названию) или нет.

Метод Пустая() удобно использовать работая в клиентском контексте (в том числе на тонком клиенте), потому что менеджер объекта это «тяжелый» объекта и с ним можно работать только в серверном контексте. Т.е. установку контрагента можно сделать таким способом:

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

Пустая ссылка в 1С

Программировать в 1С за 11 шагов

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

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

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


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

можно оплатить вручную:

Читайте также: