1с программирование очистить значение переменной
Объект Структура создается с помощью конструктора Новый.
Структура1 = Новый Структура;
Со структурами можно работать и в серверном и клиентском контексте, причем в клиентском контексте с ними можно работать как под толстым клиентом, так и под тонким клиентом.
В значения структуры можно записать переменные любого типа, но использование типов в этом случае очень сильно зависит от контекста и от вида клиента: мы не можем в клиентском контексте задать значение, тип которого работает только в серверном контексте (например, ДокументОбъект.<>).
Как создать новую структуру, Вы знаете, теперь выясним, как создаются новые элементы данного объекта. Делается это с помощь метода Вставить.
Вот его синтаксис:
Вставить(<Ключ>,<Значение>);
Параметр Ключ имеет тип значения Строка. Он может иметь любое название, какое захочет разработчик (но помним про ограничения в названиях переменных). Параметр Значение может иметь любой тип.
Обращаю Ваше внимание, что связка «Ключ и значение» уникальна, поэтому если Вы напишете для одной структуры два метода Вставить с одинаковыми ключами и разными значениями, то все равно в структуре будет одна связка «Ключ и значение», причем значение возьмется с последнего метода.
Не всегда обязательно использовать метод Вставить, чтобы добавить пару КлючИЗначение в структуру, иногда это можно сделать в конструкторе. Тогда конструктор будет иметь следующий вид:
Структура1 = Новый Структура(Ключ, Значение);
Переделаем предыдущий пример:
В случаях выше мы не стали думать над названиями ключей, Вы же в процессе работы можете давать ключам любые названия, какие захотите. Главное, чтобы тип ключа был Строка.
В структуру можно записывать не только примитивные типы, но также любые другие объекты «1С:Предприятия», вплоть до других структур. Причем значения типов разных ключей структуры могут быть разными.
Если мы посмотрим в отладке конфигуратора на нашу структуру, то увидим, что она представляет собой некоторый список, где напротив каждого ключа есть то значение, которое мы привязали к данному ключу с помощью метода Вставить. Этот ключ является свойством структуры как объекта, и мы можем обращаться к нему.
Изменить значение ключа структуры 1С
Если нам необходимо изменить значение какого-нибудь ключа, то мы, используя метод Вставить, указываем в качестве первого параметра ключ, значение которого хотим поменять, а в качестве второго параметра новое значение для данного ключа.
Или напрямую обращаемся к ключу
Обход коллекции структуры 1С
Обход структуры осуществляется с помощью оператора цикла Для каждого…Цикл.
Обойдем уже созданную структуру.
Безошибочное получение значения элемента
Если при обращении к ключу структуры Вы укажете название несуществующего в данной структуре ключа, то программа выдаст ошибку. Но есть метод объекта Структура, с помощью которого можно обратиться к значению ключа, не боясь вызвать ошибку в случае промаха.
Этот метод – Свойство.
Данный метод является функцией и возвращает Истину, если указанный ключ есть, и Ложь, если указанного ключа нет.
Рассмотрим синтаксис метода:
Свойство(<ИмяКлюча>,<ЗаписываемоеЗначение>);
В параметр «ЗаписываемоеЗначение» будет возвращено найденное значение. В том случае, если ключа нет в структуре, то данному параметру присвоится значение Неопределено. Обращаю Ваше внимание, что параметр «ЗаписываемоеЗначение» где-то должен быть определен.
В переменную А запишется значение, которое связанно с Ключ1.
Но если мы напишем так.
То ни какой ошибки не возникнет, и в переменной А присвоится значение Неопределено.
Статьи о других универсальных коллекциях значений в 1С
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 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С сам умеет себя считывать из базы данных и записывать. Объекты 1С бывают разных видов (справочники, документы и т.п.).
Хранится объект 1С как одна строка в таблице SQL (для шапки) и несколько строк в других таблицах SQL (для каждой табличной части, если таковые есть). Идентифицируется объект 1С по автоматически генерируемому идентификатору – GUID.
Аналог объекта 1С – это экземпляр класса в других языках программирования, со своим конструктором, деструктором, методами и свойствами.
Так как объекты 1С тесно связаны с данными, то конструирование объекта 1С возможно путем создания нового объекта или считывания из базы данных.
Создаем новый объект справочника:
//новый, метод зависит от вида объекта
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
Получение существующего объекта всегда производится из ссылки на него (см. далее). Любым образом получаем ссылку (поиск, выборка, запрос и т.п.), а у ссылки вызываем метод:
//получаем ссылку поиском
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("111");
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
При получении или создании объекта 1С, он создается один раз в памяти компьютера. При попытке его назначения одной или другой переменной, это будет один и тот же объект. Таким образом переменная не значит сам объект, а значит ссылку на него.
//переназначаем полученный/созданный объект другой переменной
Переменная = НоменклатураОбъект;
НоменклатураОбъект.ИНН = "22"; //изменяем поле объекта через одну переменную
Если Переменная.ИНН = "22" Тогда //при обращении через другую переменную мы имеем тот же объект, и у него тоже изменился ИНН
//здесь что-то делаем..
Каждый объект в базе данных имеет свою «версию». Это идентификатор, который позволяет определить последнее изменение объекта (но не его дату, просто факт – было изменение или нет). При получении объекта из базы данных, при считывании, объект запоминает свою версию. При попытке записи обратно, объект проверяет, что версия все еще та же (не изменилась другим пользователем) и при изменении – откажется записываться (то есть нужно заново считывать, изменять, записывать).
Каждый объект имеет идентификатор (GUID) и он позволяет однозначно найти объект в базе данных (т.е. он уникальный).
Объекты 1С, которые можно найти по идентификатору называют ссылочными типами данных, под ссылкой подразумевая этот уникальный идентификатор. У каждого справочника, документа и т.п. – есть обязательное поле Ссылка.
Все механизмы встроенного языка 1С, которые оперируют поиском – возвращают ссылку на найденный объект. Например:
//Поиск элемента справочника стандартным механизмом по коду
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("111");
//Поиск элемента справочника стандартным механизмом по наименованию
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию("111");
//Перебор всех элементов справочника (точнее ссылок на все элементы)
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
НоменклатураСсылка = Выборка.Ссылка;
КонецЦикла;
Если элемент справочника не найден – все эти методы возвращают «пустую» ссылку (то есть не указывающую ни на какой элемент). Проверить пустую ссылку можно следующим образом:
Если НоменклатураСсылка.Пустая() Тогда
//здесь что-то делаем..
Имея во встроенном языке ссылку на объект, Вы можете обратиться к любому полю объекта (т.е. реквизиту) на чтение. Чтобы изменить реквизит – Вам нужно из ссылки получить объект (см. выше). Например:
Важная особенность: когда у Вас есть ссылка – у Вас есть только идентификатор. Когда Вы обращаетесь через ссылку к полю, происходит считывание объекта в память компьютера. Вариант считывания зависит от того, к какому полю обратились. При обращении сначала к одному полю, а потом к другому – будет произведено два считывания.
- Краткое кеширование (обращение к типовым полям)
Считываются только типовые поля (код, наименование, номер, дата и т.п.) - Полное кеширование (обращение к нетиповым полям)
Считываются все поля.
Кеширование производится в память компьютера, точнее в ограниченное количество памяти компьютера. Память под кеширование организована в виде очереди и при переполнении затираются считанные ранее элементы.
В этой статье будет постепенно публиковаться набор кратких шпаргалок по использованию методов языка и спосбов разработки на платформе 1С:8.2 (часть из них применима и к 8.1, но об этом упоминаться не будет).
Основные формы можно подменять формами собственной разработки, созданными в кострукторе форм.
Вопрос о событиях форм.
Ответ Существует два вида событий форм:
Вопрос Как программно изменить структуру дерева распределенной информационной базы.
Ответ Механизм распределенных информационных баз содержит программное средство конфигурирования структуры узлов распределенной базы. Для этого существует метод УстановитьГлавныйУзел() объекта ПланыОбменаМенеджер. В параметре этого метода передается ссылка на узел плана обмена распределенной информационной базы, который устанавливается главным для текущей базы. Также в этом параметре может быть передано значение Неопределено, тогда у текущей базы будет отсутствовать главный узел, т.е. она станет корневым узлом.
Пример:
При этом будут удалены все записи регистрации изменений конфигурации Узла2, относящиеся к Узлу2, передача изменений конфигурации будет возможна теперь только от Узла2 к Узлу1. Записи регистрации изменения данных удалены не будут, т.к. передача данных будет по-прежнему возможна между этими узлами.
Создание распределенной информационной базы из баз с одинаковой конфигурацией:
Вопрос Можно ли из встроенного языка менять список выбора, который генеририруется платформой автоматически в автогенерируемых формах.
Ответ Да, можно. Для этого используется обработчик события Обработка получения данных выбора, модуль которого располагается в модуле менеджера объекта. Например, в модуле менеджера справочника, когда в поле ввода подбирается один из элементов этого справочника.
Вопрос Примеры программного кода обработки констант. Как изменить несколько констант подряд. Как вывести значения всех констант, существующих в конфигурации.
Ответ
При этом особенности внутренней реализации объекта КонстантыНабор таковы, что при записи набора констант будут вызваны для каждой константы, входящей в записываемый набор, обработчики событий: ОбработкаПроверкиЗаполнения(), ПередЗаписью() и ПриЗаписи() модуля менеджера значения константы (если они там определены).
===
Вопрос Примеры программного кода работы со справочниками (аналогично с планами видов характеристик, с планами счетов, с планами видов расчета и с планами обмена).
Ответ
Вопрос Примеры программного кода обработки документов.
Ответ
Вопрос Примеры программного кода работы с перечислениями.
Ответ
Вопрос Примеры программного кода работы с регистрами сведений.
Ответ
Пример модуля проведения по этой схеме:
Вопрос В табличной части документа есть реквизит сумма. Требуется вывести итог в шапку документа. Как это лучше сделать?
Ответ Подсчет итога по графе «Сумма» и заполнение реквизита шапки этим результатом лучше сделать в МодулеДокумента в процедуре-событии «Перед записью»:
Вопрос Как в запросе осуществить выборку остатков и оборотов регистра накопления за заданный период, включая последнюю секунду, когда период задан параметрами виртуальной таблицы.
Ответ Особенность виртуальной таблицы регистра накопления такова, что когда конец выборки задается значением вида 12.13.2011 23:59:59 (т.е. конец дня), то последняя секунда дня не попадает в выборку. А если указать 12.13.2011 23:59:59 + 1 (т.е. добавить секунду), то в выборку попадут данные следующего дня, что тоже не правильно. Чтобы этого не происходило, дату окончания нужно задавать, используя метод «Граница». Пример:
Вопрос На какие данные можно опираться при проведении документов и на какие нельзя? В частности, в каком случае можно опираться на валюту, указанную в реквизите справочника договоров контрагента при проведении документа.
Ответ При проведении документа нужно следить за тем, чтобы выполняемые им движения были стабильно воспроизводимыми. Нельзя допускать ситуации, когда документ при проведении определяет, например, валюту как рубль, затем пользователь изменяет в договоре с контрагентом валюту на другую, и при повторном проведении документа валюта определяется в движениях уже как другая.
Документ в своих движениях может опираться на:
- свои реквизиты;
- значения данных, сконфигурированные таким образом, что они не могут быть потом независимо от этого документа изменены на другие;
- данные регистров, записи которых подчинены регистраторам.
Допустим, в документе есть реквизит «Договор». Для выполнения движений, предположим, требуется узнать валюту договора, т.е. валюта – это реквизит договора с контрагентом. И пусть договор – это элемент справочника «Договоры», подчиненного справочнику «Контрагенты». В таком случае при проведении документа мы можем использовать валюту из договора только в том случае, если конфигурированием мы добились того, что пользователь после записи в базу данных нового договора уже не может поменять в нем валюту. Такой запрет на изменение лучше всего разместить в предопределенной процедуре-событии модуля объекта справочника договоров «ПередЗаписью» (тогда при любом из возможных вариантов модификации этого справочника будет осуществляться соответствующая проверка):
Из этой статьи вы узнаете, как в удалить в 1С объект при помощи программного кода, а также как поставить пометку на удаление.
В предыдущей статье, я рассказывал, как интерактивно удалить в 1С объект, и что для этого нужно настроить в правах конфигурации:
Программное удаление справочника в 1С
Для того чтобы программно удалить экземпляр справочника в 1С, необходимо воспользоваться методом Удалить объекта справочника. Для демонстрации разберу пример: разместим на форме обработки реквизит с ссылкой на справочник Контрагенты.
И при выполнении команды формы обработки, будем удалять этот экземпляр справочника.
В этом коде удаление экземпляра справочника я производил в серверном контексте. Сначала при помощи метода ПолучитьОбъект() из ссылки был получен экземпляр объекта справочника, а потом этот экземпляр удален при помощи метода Удалить(). В реквизит Контрагент управляемой формы я записал пустую ссылку, чтобы отображение ссылки удаленного объекта не вводило в заблуждение.
Замечу, что программное удаление произошло при таких правах на объект.
Право «Интерактивное удаление» снято, то есть мы не можем непосредственно удалять экземпляр этого объекта, но мы можем удалить его программно (благодаря установленному праву Удалить).
Замечу, что при программном удалении объекта контроль ссылочной целостности не происходит! Поэтом не следует злоупотреблять этой возможностью!
Программное удаление документа в 1С
Документ программным способом удаляется также, как и справочник: нужно воспользоваться методом Удалить() экземпляра объекта документа. Например, на форме этой обработки я размещу реквизит с ссылкой на документ.
А при выполнении команды документ будет удаляться.
Как и в случае справочника, программное удаление документа стало возможным благодаря установленному праву «Удалить».
Пометка на удаление программно в 1С
Для того, чтобы программно пометить на удаление объект необходимо воспользоваться методом объекта УстановитьПометкуУдаления.
Для документов он имеет следующий синтаксис: УстановитьПометкуУдаления(<ПометкаУдаления>), где параметр ПометкаУдаления имеет тип булево.
Переделаем предыдущий пример: на форме разместим две команды.
Одна команда будет устанавливать пометку на удаление у документа в реквизите, вторая снимать.
В этом коде, в процедуре УстановитьНаСервере() мы устанавливаем пометку на удаление, передав в метод УстановитьПометкуУдаления параметр Истина, а в процедуре СнятьНаСервере() снимаем пометку, передав Ложь.
Для объектов справочников метод УстановитьПометкуУдаления имеет следующий синтаксис:
Параметр ВключаяПодчиненные имеет тип Булево, и если установлено Истина, то будут помечены на удаление подчиненные элементы (если справочник иерархический), а также все объекты подчиненного справочника (если есть).
Продемонстрируем работу второго параметра: на форму поместим реквизит с типом булево, реквизит с типом ссылка на справочник Контрагенты , и сделаем две команды: установить и снять.
В обработчиках команд будем устанавливать и снимать пометку на удаление.
У справочника Контрагенты включим иерархию.
И также сделаем подчиненный справочник.
Если мы установим пометку для группы с флажком подчиненные.
То будет помечена группа и все входящие в неё объекты.
А без установленного флага Подчиненные будет помечена только группа.
Тоже самое с объектами из подчиненного справочника. При установленном флаге Подчиненные.
Будет помечен на удаление и сам элемент справочника, и объекты подчиненного ему справочника.
А иначе, будет помечен только сам элемент.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Читайте также: