В 1С есть встроенный язык программирования, который мы начали обсуждать в уроке про язык 1С.
Особенностью языка 1С является объектная модель работы с базой данных. Она основывается на объектах 1С. Таким образом справочник – это объект 1С и когда Вы его считываете из базы данных, Вы получаете данные сразу из нескольких таблиц, упакованные в структуру, описанную в конфигурации (реквизиты, табличные части и прочее), см. урок про объектную модель представления данных 1С.
Обращаться к объекту 1С можно напрямую или через ссылку. Обращение через ссылку может производится фоново, достаточно незаметно для программиста.
Например:
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование Из Справочник.Контрагенты");
//разово выполнили запрос на сервере и переслали результат на компьютер пользователя
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
//обратились к результату запроса, который находится в памяти компьютера пользователя
Наименование = Выборка.Наименование;
ИНН = Выборка.Ссылка.ИНН;
//ИНН мы в запросе не считывали, при обращении через ссылку к ИНН фоново генерируется полное считывание объекта справочника по ссылке в локальную память компьютера (бывает краткое, но ИНН не входит в кешируемые поля)
Как мы видим, при незнании этих особенностей – одно лишнее движение может значительно увеличить разовые обращения к базе данных и как следствие снизить производительности программы и загрузку сети.
Поговорим про особенности работы со значениями в 1С.
Значение 1С — переменные
1. Итак, переменная, это поле, не добавленное в конфигурации, а которое мы определяем прямо в модуле программы 1С (модули 1С).
Под константным значением понимается значение 1С, указанное в коде напрямую. Например:
Переменная1 = 22; //22 – это константа
Переменная2 = "Привет!"; //«Привет» - это константа
2. Переменные в 1С не типизированы. Это значит, что одной и той же переменной можно назначать любые значения. Например:
Переменная = 22;
Переменная = "Привет!"; //назначаем той же переменной новое значение 1С – строку, а не число
3. Во многих языках программирования обязательно «объявлять» переменную. Это значит нужно указать сначала, что есть такая переменная, а только потом ей пользоваться:
Перем Переменная1;
Переменная1 = 20;
В 1С это делать можно, но не обязательно. Будет работать и такой способ (обращение и создание сразу):
Переменная1 = 20;
4. Строгого контроля наличия переменной нет. Если мы забыли создать переменную, но уже обращаемся к ней, то ее значение 1С будет равно «Неопределено».
//здесь переменной еще нет
Если Чтото = 20 Тогда
//мы ее создаем только, если Чтото=20
Переменная1 = 100;
КонецЕсли;
//мы обращаемся в любом случае, даже если Чтото=1 и мы не входили в условие
Если Переменная1 = Неопределено Тогда
//здесь что-то выполняем
В описанном случае, если мы не попали в первое условие, то переменной как бы нет. На самом деле она есть и равна «Неопределено».
5. Видимость переменной обычная для других языков. Сначала глобальные, но в функции их можно переопределить (создать переменную внутри функции с таким же названием, тогда глобальная будет не видна).
Значение 1С — реквизиты объектов 1С
Реквизиты объектов 1С – это поля справочника или документа. Они добавляются и редактируются в конфигураторе в окне конфигурации. Мы уже обсуждали их в уроке про реквизиты 1С.
Реквизиты объектов 1С – типизированы. Это значит, что при добавлении поля Вы явно указываете его тип – строка или число или еще что-то. Значение 1С по умолчанию у такого реквизита будет аналогично выбранному типу (для числа – 0, для строки – пустая строка, для ссылочных типов — справочник, документ и т.п. – пустая ссылка).
Реквизиты могут иметь несколько вариантов типов. В этом случае Вы ставите галочку «Несколько типов» и указываете одновременно варианты. У этого поля по прежнему может быть только одно значение 1С, но вариантов значения теперь больше. По умолчанию у такого реквизита будет значение 1С «Неопределено».
При назначении значения реквизиту производится проверка на соответствие типа. Если тип не соответствует, 1С пытается преобразовать значение 1С (например, число 22 в строку «22»). Если преобразовать не получается, то устанавливается значение 1С по умолчанию.
Преобразование производится и при изменении типа реквизита. Например, Вы создали реквизит, пользователи с ним работали (заполняли в документах). И через пол года Вы решили изменить тип реквизита. Реквизит не будет очищен, будет произведена попытка преобразовать значения (по аналогичной схеме).
Значение 1С — объект 1С
Объект 1С – это набор реквизитов и табличных частей плюс методы (функции). Обычно объект 1С сам умеет себя считывать из базы данных и записывать. Объекты 1С бывают разных видов (справочники, документы и т.п.).
Хранится объект 1С как одна строка в таблице SQL (для шапки) и несколько строк в других таблицах SQL (для каждой табличной части, если таковые есть). Идентифицируется объект 1С по автоматически генерируемому идентификатору – GUID.
Аналог объекта 1С – это экземпляр класса в других языках программирования, со своим конструктором, деструктором, методами и свойствами.
Так как объекты 1С тесно связаны с данными, то конструирование объекта 1С возможно путем создания нового объекта или считывания из базы данных.
Создаем новый объект справочника:
//новый, метод зависит от вида объекта
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
Получение существующего объекта всегда производится из ссылки на него (см. далее). Любым образом получаем ссылку (поиск, выборка, запрос и т.п.), а у ссылки вызываем метод:
//получаем ссылку поиском
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("111");
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
При получении или создании объекта 1С, он создается один раз в памяти компьютера. При попытке его назначения одной или другой переменной, это будет один и тот же объект. Таким образом переменная не значит сам объект, а значит ссылку на него.
//переназначаем полученный/созданный объект другой переменной
Переменная = НоменклатураОбъект;
НоменклатураОбъект.ИНН = "22"; //изменяем поле объекта через одну переменную
Если Переменная.ИНН = "22" Тогда //при обращении через другую переменную мы имеем тот же объект, и у него тоже изменился ИНН
//здесь что-то делаем..
Каждый объект в базе данных имеет свою «версию». Это идентификатор, который позволяет определить последнее изменение объекта (но не его дату, просто факт – было изменение или нет). При получении объекта из базы данных, при считывании, объект запоминает свою версию. При попытке записи обратно, объект проверяет, что версия все еще та же (не изменилась другим пользователем) и при изменении – откажется записываться (то есть нужно заново считывать, изменять, записывать).
Значение 1С — ссылка 1С
Каждый объект имеет идентификатор (GUID) и он позволяет однозначно найти объект в базе данных (т.е. он уникальный).
Объекты 1С, которые можно найти по идентификатору называют ссылочными типами данных, под ссылкой подразумевая этот уникальный идентификатор. У каждого справочника, документа и т.п. – есть обязательное поле Ссылка.
Допустим у Вас есть в конфигурации справочник Номенклатура. В документ Накладная Вы добавляете поле с типом справочника. При заполнении документа пользователь выберет товар. В поле сохранится идентификатор товара (то есть — ссылка).
Все механизмы встроенного языка 1С, которые оперируют поиском – возвращают ссылку на найденный объект. Например:
//Поиск элемента справочника стандартным механизмом по коду
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("111");
//Поиск элемента справочника стандартным механизмом по наименованию
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию("111");
//Перебор всех элементов справочника (точнее ссылок на все элементы)
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
НоменклатураСсылка = Выборка.Ссылка;
КонецЦикла;
Если элемент справочника не найден – все эти методы возвращают «пустую» ссылку (то есть не указывающую ни на какой элемент). Проверить пустую ссылку можно следующим образом:
Если НоменклатураСсылка.Пустая() Тогда
//здесь что-то делаем..
Имея во встроенном языке ссылку на объект, Вы можете обратиться к любому полю объекта (т.е. реквизиту) на чтение. Чтобы изменить реквизит – Вам нужно из ссылки получить объект (см. выше). Например:
ИНН = НоменклатураСсылка.ИНН;
Важная особенность: когда у Вас есть ссылка – у Вас есть только идентификатор. Когда Вы обращаетесь через ссылку к полю, происходит считывание объекта в память компьютера. Вариант считывания зависит от того, к какому полю обратились. При обращении сначала к одному полю, а потом к другому – будет произведено два считывания.
- Краткое кеширование (обращение к типовым полям)
Считываются только типовые поля (код, наименование, номер, дата и т.п.) - Полное кеширование (обращение к нетиповым полям)
Считываются все поля.
Кеширование производится в память компьютера, точнее в ограниченное количество памяти компьютера. Память под кеширование организована в виде очереди и при переполнении затираются считанные ранее элементы.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.