1С:Предприятие 8.x. Часть 3: Типы данных



В прошлом году я написал две статьи, в которых начал знакомить тебя с разработкой под платформу «1С: Предприятие 8.х». К сожалению, на тех двух статьях все и закончилось. Сначала не было времени, потом пропало желание. Прошел год, и мне снова захотелось продолжить начатое дело. Надеюсь, в этот раз мне удастся написать больше хороших статей. Что ж, приступим!

О чем пойдет речь

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

Типы данных в мире 1С: Предприятие 8.x

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

- Число. Под числами в 1С подразумеваются как целые, так и значения с плавающей запятой. Максимальная разрядность значения типа «число» может быть 32 знака, включая десятичную точку. Стоит также учитывать, что ограничение в 32 знака действует на числа, которые будут записываться в базу данных. Если вы объявили переменную и присвоили в нее значение больше 32 знаков, то все будет ok. Для числовых значений, которые хранятся в памяти, данное ограничение не действует. После объявления переменой типа «Число» ее значением будет 0.

- Строка. Строка она и в Африке строка. Как в любом другом языке программирования, в 1С реализованы все необходимые функции для манипулирования строками. Значения данного типа представлены в юникоде (Unicode). Длина переменных типа строка – не ограничена.

- Дата. Опять же, типичный для многих языков тип «Дата». Помимо самой даты значения данного типа содержат и время. Под временем подразумевается часы, минуты и секунды. Сразу после инициализации переменной типа «Дата» ей будет присвоено значение (дата) «01 января 0001 года 00 часов 00 минут 00 секунд». Запомни это, т.к. это в будущем оно обязательно пригодится.

- Булево. Как и следует ожидать, переменные данного типа могут принимать лишь два значения: Истина, Ложь.

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

- Null. Общий смысл у Null почти такой же, как и у «неопределено». Значения данного типа применяются для обозначения отсутствующего значения в базе данных. Чаще всего, получить значения данного типа ты можешь при использовании языка запросов. Например, ты написал запрос, в котором используешь объединение таблиц. Звезды сложились не очень удачно, и в одной из таблиц отсутствует значение, удовлетворяющее твоему условию. В таком случае, на месте отсутствующего значения будет значение типа Null.

Со значением типа Null возможно столкнуться не только при работе с запросами. Например, значение типа Null принимают реквизиты, которые не используются объектом. Честно говоря, на практике с этим сталкиваешься крайне редко. Из примеров могу только вспомнить, вариант, описанный в одной из статей с диска «ИТС». Представим, что у нас есть иерархический справочник с реквизитом «количество». При создании данного реквизита, ему установили свойство «Использование» в значение «Для элемента». Если попробовать обратится к данному реквизиту для элемента справочника типа «группа», то его значением как раз будет Null.

- Тип. Данный тип применяется для определения имеющихся типов. Немного запутано звучит? Ok, попробую объяснить на примере. Представь, что перед тобой встала задача сравнить типы двух переменных. В коде это будет выглядеть примерно так:

Переменная1 = 123; //Поскольку мы присвоили число, значит тип переменной будет «число».
Переменная2 = «строка»; //Здесь мы присвоили строку, значит тип переменной будет строка.

Теперь тебе нужно на 100% убедиться, что переменная1 является числовой. Вот тут нам и пригодится тип «Тип» (забавно звучит), а также парочка вспомогательных функций. Пока не будет лезть в подробности. Просто взгляни и попробуй понять нижеприведенный пример:

Если (ТипЗнч(Переменная1) = Тип(«Число»)) Тогда
	Сообщить(«Переменная1 является числовой!»);
Иначе
	Сообщить(«Переменная1 НЕ является числовой :(»);
КонецЕсли;

В этом небольшом кусочке кода, я сначала получаю тип переменной при помощи функции «ТипЗнч()». Данная функция в качестве параметра принимает значение, тип которого требуется получить. В нашем случае это «Переменная1». Затем мне требуется получить значение типа «Тип», характеризующее тип «Число». Для этого во встроенном языке предусмотрена функция «Тип()». Она принимает всего лишь один аргумент – строковое представление имени типа. Раз нам требуется сравнить с типом «Число», то параметром для функции будет «Число». После завершения сравнения выводим сообщение.

Коллекции значений

Помимо примитивных типов, в платформе 1С: Предприятие 8.х, реализованы так называемые типы-коллекции. В переменных таких типов ты можешь хранить целые коллекции (наборы) значений. Наиболее часто используемые:

1. СписокЗначений. Представляет собой таблицу, состоящую из четырех колонок:
a. Значение.
b. Представление.
c. Пометка
d. Картинка.

Разумеется, для каждого элемента тебе доступны все эти 4 поля. В первом ты можешь хранить непосредственно значение; во втором текстовое представление значения; в третьем значение тип Булево; и в четвертом – картинку, характеризующую данный элемент. Никто от тебя не требует заполнения всех четырех полей. Можешь заполнять лишь поле значение. Все будет прекрасно работать, правда, для таких ситуаций проще всего применять другу коллекцию – массив.

2. Массив. Как и в любом другом языке программирования, в 1С реализована поддержка массивов. Ты можешь использовать как одномерные, так и многомерные массивы. Массивы в 1С могут быть фиксированной длины, а также динамические. В последнем варианте указание размера массива не требуется.

3. ТаблицаЗначений. Один из самых часто применяемых типов-коллекций. Таблица значений очень похожа на массив и список значений. Здесь ты также можешь хранить коллекцию значений, но в отличие от массивов или списков значений, тебе доступны, следующие вкусняшки:

a. Колонки. Ты без проблем можешь создать сколько угодно колонок и использовать их в своих целях. Каждая колонка может быть как определенного типа, так и произвольного.
b. Итоги. Для числовых колонок имеется возможность подсчета итогов.
c. Сортировка значений.
d. Поиск строк.
e. Группировка по значению (Свертывание). Допустим, у тебя есть куча строк, в которых содержится номенклатура (товар, услуга) и сумма. Номенклатура периодически повторяется. Тут тебе приспичило посчитать общую сумму по какому-то одному товару/услуге. Для решения подобных задач лучше всего использовать свертывание. Все решение сведется к вызову одного лишь метода.

Прикладные типы

Помимо примитивных типов существуют еще так называемые «прикладные». Главное их отличие от примитивных типов в том, что они зависят от конфигурации, т.е. изначально сама платформа о них ничего не знает. Звучит немного запутанно, попробую объяснить на примере.

Представим, что нам потребовалось создать справочник (назовем его номенклатура) для хранения номенклатуры нашей организации. После того как ты добавишь в дерево конфигурации новый элемент типа справочник, тебе сразу станут доступными несколько новых типов:

- СправочникСсылка.Номенклатура
- СправочникОбъект.Номенклатура
- СправочникВыборка.Номенклатура
- СправочникМенеджер.Номенклатура
- СправочникСписок.Номенклатура

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

- ДокументСсылка.ПриходнаяНакладная
- ДокументОбъект.ПриходнаяНакладная

- и т.д.

Сразу хочу обратить твое внимание на похожесть прикладных типов. Возьмем, к примеру, тип «СправочникВыборка.<ИмяСправочника>». Этот тип представляет собой результат выборки элементов из справочника по заданным условиям. У объектов такого типа в обязательном порядке имеются:

- метод Следующий(), позволяющий перейти на очередной элемент выборки;
- свойства, посредством которым идет обращение к реквизитам справочника (имена свойств = именам реквизитов).

Так вот, если ты научился работать с объектами типа «СправочникВыборка.<ИмяСправочника>», то считай, что ты сразу познал мастерство работы с объектами типа: «ДокументВыборка.<ИмяДокумента>». У объектов такого типа тоже имеется метод «Следующий()» и точно также ты можешь получить доступ к реквизитам документа посредством одноименных свойств. Точно такое же правило (похожести) актуально и для других типов объектов. Когда мы начнем рассматривать практические примеры - ты в этом убедишься.

Думаю, смысл прикладных типов понятен, а раз так, то рассмотрим некоторые из них чуть подробней. Начнем, пожалуй, с типа «ссылка». Хотя лучше было начинать не с этого типа, но как показывает практика, именно со значениями типа «ссылка» встречаешься раньше, чем с другими.

Тип «Ссылка»

Тип «Ссылка» - один из тех типов с которыми тебе придется частенько работать при разработке/доработке решений на базе платформы 1С:Предприятие. Данный тип создается для всех объектов конфигурации, которые хранят данные объектного типа. Примерами таких объектов являются: справочники, документы и т.д.

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

Под идентификатором подразумевается guid (уникальный 128-битный идентификатор). Если говорить еще точнее, то каждая ссылка выглядит примерно так: ad6f4d4b-ad79-11df-a55d-cc98d6e732d7.

У тебя может возникнуть логичный вопрос: «А можно ли создать элемент справочника и присвоить ему определенный guid?». Да, это действительно можно сделать. В следующих уроках мы рассмотрим этот процесс на практике.

Тип «Объект»

Подобно типу «Ссылка» тип «Объект» создается лишь для тех объектов конфигурации, которые хранят в себе данные объектного типа (справочники, документы и т.д.). Изменяя данные типа «Объект» ты вносишь изменения непосредственно в БД. Если сравнивать тип «Объект» с типом «Ссылка», то главное их отличие будет в том, что посредством первого можно модифицировать данные, а с помощью второго выполнять лишь чтение. Объект любого элемента можно получить по ссылке.

Практика

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

Как практиковаться

Для воспроизведения рассмотренных примеров лучше всего создать новую обработку и весь код писать в ней. Это делается следующим образом:

1. Запусти 1С:Предприятие в режим конфигуратор (для этого предварительно придется создать чистую базу).
2. В главном меню конфигуратора зайди в «Файл» -> «Новый».
3. В появившемся окне (см. рисунок 1) выбери «Внешняя обработка» и нажми на кнопку «Ok”.


Рисунок 1. Окна выбора вида документа

4. Выполнив эти три простых шага, ты создашь новую обработку (см. рисунок 2). Заполни поле «Имя». Напиши сюда все что хочешь, но помни, что в имени не допускаются пробелы и оно должно начинаться на букву или цифру. Свою обработку я назвал «ОбработкаДляТестов».


Рисунок 2. Новая обработка

5. Теперь нас отделяет всего лишь один шаг до написания первых строчек кода. Давай создадим в нашей обработке новую форму и бросим на нее один компонент-кнопку. Создать новую форму можно как минимум двумя способами:
a. Нажми на кнопку «Действия». В появившемся контекстном меню выбери пункт «Добавить» -> «Форму».
b. В табличной части окна настроек обработки кликни правой кнопкой мыши по пункту «Формы» и в появившемся диалоге нажми «Добавить».
6. В окне создания новой формы (см. рисунок 3) тебе предложат установить следующие опции:

- Тип формы. Доступно два варианта: «форма обработки» и «произвольная форма». Поскольку мы собираемся делать именно форму обработки, то соответственно выбираем первый вариант. Обрати внимание на флажок «Назначить форму основной». После его установки наша форма будет сразу же отображаться при открытии обработки.

- Имя. Имя для твоей формы. В своем примере я все оставил по умолчанию.

- Командная панель формы сверху. Стоит ли создавать вверху формы панель инструментов. Я оставил как есть.

- Командная панель формы снизу. Настройка аналогична предыдущей. Только на этот раз речь идет о нижней панели инструментов. Флажок оставляем.

Прошвырнувшись по всем настройкам, сразу нажимаем кнопку «Готово». Результатом нажатия, станет создание новой формы с двумя панелями инструментов (верхней и нижней), а также двумя кнопками с именами: «Выполнить» и «Отмена».


Рисунок 3. Добавляем новую форму


Рисунок 4. Конструктор новой формы


Рисунок 5. Созданная форма

Ну, вот и все. Осталось лишь бросить на форму компонент «Кнопка» или просто создать обработчик события «ПриНажатии» для уже созданной кнопки «Выполнить». Воспользуемся вторым вариантом. Щелкни два раза левой клавишей мыши по кнопке «Выполнить». Справа должна появиться панель со свойствами и событиями выбранного элемента управления.


Рисунок 6. Свойства кнопки

Данная панель представляет собой аналог объектного инспектора в Delphi. В нем ты также можешь редактировать любые свойства объекта, а также определять реакцию на различные события.

Для нашего примера, нам необходимо лишь определить действие, которое будет происходить при нажатии на кнопку. Ищи на панели свойств и событий пункт «Действие» и кликай по рядом расположенной кнопке с изображением лупы.

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

Объявление переменных

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

Все переменные можно условно разделить на три вида:

- Локальные. Эти переменные доступны лишь в пределах одной функции/процедуры и после ее выполнения будут благополучно уничтожены.

- Глобальные. Такие переменные объявляются в самом начале модуля и доступны в любой из процедур данного модуля.

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

Тренируемся

1. Объявление локальных переменных

Начнем с самого простого – объявление локальных переменных. Перейди в код сгенерированной процедуры и доведи его до следующего вида:

Процедура КнопкаВыполнитьНажатие(Кнопка)
	ЧисловаяПеременная = 0;
	СтроковаяПеременная = "";
	ПеременнаяТипаДата = Дата("00010101");
	ПеременнаяБулево = Истина;
КонецПроцедуры

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

2. Объявление глобальных переменных

Теперь попробуем объявить глобальную переменную. Для этого поднимись в самое начало нашего модуля формы и напиши в нем ключевое слово «Перем» (разумеется, без кавычек), а после него имя нашей переменной. В качестве имени я выбрал «ГлобальнаяПеременная». Обязательно после имени переменной поставь точку с запятой. Проделав эту операцию, твой код должен стать примерно таким:

Перем ГлобальнаяПеременная;
 
Процедура КнопкаВыполнитьНажатие(Кнопка)
	ЧисловаяПеременная = 0;
	СтроковаяПеременная = "";
	ПеременнаяТипаДата = Дата("00010101");
	ПеременнаяБулево = Истина;
КонецПроцедуры

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

ГлобальнаяПеременная = «Это строковая глобальная переменная»;
Сообщить(ГлобальнаяПеременная);

Первая строка не должна вызвать затруднений. Во второй же, я вызываю встроенную метод «Сообщить()». С ее помощью можно выводить любые сообщения в окно «Служебные сообщения» (Режим 1С:Предприятие). Каждому выводимому сообщению можно присвоить определенную иконку. Тем самым, пользователь сможет различать тип сообщения: операция выполнена успешно, возникла ошибка и т.д.

Чтобы добавить к выводимому сообщению иконку тебе необходимо передать процедуре второй параметр типа «СтатусСообщения». Он может принимать одно из следующих значений:

БезСтатуса – никакая иконка добавляться к сообщению не будет.

Важное – перед твоим сообщением будет два восклицательных знака.

Внимание – в качестве иконки будет один восклицательный знак.

Информация – при этом типе выводится иконка в виде английской буквы i.

Обычное - значение по умолчанию. Если ты вызываешь процедуру «Сообщить()» и не указываешь второй параметр, то на самом деле считается, что ты указал СтатусСообщения.Обычное.

ОченьВажное – тоже, что и «Важное», только вместо двух выводится три восклицательных знака.

Рассмотрим пример использования метода Сообщить() со вторым параметром:

Сообщить(«Какой-то текст», СтатусСообщения.Информация);
Сообщить(«Какой-то важный текст», СтатусСообщения.Важное);
Сообщить(«Какой-то очень важный текст», СтатусСообщения.ОченьВажное);


Рисунок 7. Демонстрация метода Сообщить();

Первое испытание нашей обработки

Мы уже написали код, результат выполнения которого можно увидеть на экране (помнишь вывод в окно служебных сообщений содержимого переменной ГлобальнаяПеременная?) и теперь самое время сделать это.

Как ты уже знаешь, в режиме «Конфигуратор» мы разрабатываем программное решение, а работаем с ним непосредственно из режима «Предприятие». Значит, чтобы испробовать код, мы должны запустить 1С в режиме «Предприятие», а затем открыть нашу обработку и клацнуть на одну единственную кнопку – «Выполнить». Что ж, так и поступим.

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

После запуска 1С в режиме «Предприятие», заходи в меню «Файл» и выбирай в нем пункт «Открыть». В появившемся диалоговом окне открой свою сохраненную обработку (файл с расширением epf). Если не запутаешься в этой простейшей операции, то увидишь форму обработки.


Рисунок 8. Наша обработка в режиме «Предприятие»

Нажимай на кнопку «Выполнить». Если ошибок в коде допущено не было, то ты увидишь примерно такую картинку:


Рисунок 9. Результат работы обработки

Продолжаем знакомиться

С локальными и глобальными переменными мы познакомились, теперь настал черед экспортных. В принципе, сложного ничего нет. Вся разница заключается в использовании ключевого слова «Экспорт», которое влияет на видимость переменной.
Не будем многословить, а просто объявим экспортную переменную в модуле объекта нашей обработки. Перейти в модуль обработки можно из окна настроек. Помнишь, мы в нем задавали имя нашей обработке и создавали форму? Если подзабыл, то взгляни на рисунок №2 и освежи свою память.

Так вот, в этом окне нужно нажать на кнопку «Действия» и в появившемся контекстном меню выбрать «Открыть модуль объекта». Откроется еще одно окно редактора кода. Это и есть модуль объекта. Пока не будем вдаваться в нюансы модулей (об этом поговорим в отдельной статье), а просто объявим в этом месте переменную:

Перем ЭтоСуперПеременная Экспорт;

Сохраняй изменения и закрывай окно редактора кода с модулем объекта. Возвращайся в модуль своей формы и в обработчике события «ПриНажатии» кнопки «Выполнить» напиши: «Это» (без кавычек) и нажми ctrl+space (пробел). Перед тобой должно появится окно дополнения кода:


Рисунок 10. Окно дополнения кода

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

Экспортные переменные ты можешь объявлять и в модуле формы, а затем обращаться к ним скажем из другой формы или вовсе другой обработки. Когда мы будем делать свою конфигурацию, я покажу, как это делается на практике.

Операции со значениями разных типов

Итак, начнем с типа «Число». Здесь все стандартно. Ты можешь производить со значениями типа «Число» любые математические операции:

- сложение (+)
- вычитание (-)
- умножение (*)
- деление (/)
- остаток от деления (%)

Ну и само собой ты можешь применять к значениям типа «Число» различные знаки сравнения:

< - меньше
> - больше
<> - неравно
>= - больше либо равно
<= - меньше либо равно

Рассмотрим несколько примеров:

a = 1; // a = 1
b = 2; // b = 2
c = a + b; // с = 3
c = c -1; //с = 2
a = c * c; // a = 4
c = a / 2; // c = 2

z = a < c; // z = ложь, т.к. 4 > 2
x = c <= a; //x = истина, т.к. 2, меньше, чем 4

и т.д.

Ok, с операциями над числовыми значениями разобрались, теперь возьмемся за строки. Со строковыми значениями ты также можешь производить ряд операций. Например:

- сложение (конкатенация). Прибавление одной строки к другой;
- логические операции. При работе со строками ты можешь использовать различные знаки сравнения. Результатом такого кода будет значение типа «Булево» (Истина или Ложь);

Как обычно, проверим все на примерах:

//Конкатенация строка
ПерваяСтрока = ”Этот мир”;
ВтораяСтрока = “придуман не нами”; 
ТретьяСтрока = ПерваяСтрока + ” ” + ВтораяСтрока; //ТретьяСтрока = “Это мир придуман не нами”
 
//Логически операции
ПерваяСтрока = ”VR-Online”;
ВтораяСтрока = ”is cool”;
 
Результат = ПерваяСтрока  < ВтораяСтрока; //Результат = Ложь, т.к. ПерваяСтрока длиннее второй.
 
Результат = ВтораяСтрока <= ПерваяСтрока; //Результат = Истина, т.к. ВтораяСтрока короче ПерваяСтрока

В принципе, про строки мне сказать больше нечего. Хотя нет, стоп! Я совсем забыл рассказать о том, что в 1С:Предприятие все строки хранятся в UNICODE. Имей это ввиду.

Преобразование значений

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

Переменная1 = 25;
Сообщить(Строка(Переменная1));

В первой строке я объявляю числовую переменную, а во второй, вывожу ее значение, предварительно указав, что значение должно преобразоваться к строке. Это действие я выполняю при помощи функции «строка()».

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

//Пример 1
Переменная1 = 25;
Сообщить(Переменная1); //Значение переменной автоматически преобразуется к типу «строка».
 
//Пример 2
Переменная1 = 243;
 
Если Переменная1 Тогда     //Условие сработает, т.к. после преобразования значения 
//к типу «Булево» мы получим «Истина»
 Сообщить(«Истина»);
КонецЕсли;
 
 
//Пример 3
Переменная1 = 0
 
Если Переменная1 Тогда   //А вот здесь условие не сработает, т.к. после преобразования 
				//получим «Ложь»
 Сообщить(«Истина»);
КонецЕсли;

Для явного преобразования ты можешь использовать функции: Число(), Строка(), Дата(), Булево(). Попробуй познакомиться с этими функциями на практике. Напиши несколько примеров и посмотри, как они работают.

Работа с коллекциями значений

Коллекции значений – наиболее часто используемые типы значений при разработке решений под платформу 1С:Предприятие. Самой простой коллекцией является Массив – тип данных, для хранения наборов значений одинакового типа. Если ты ни разу не сталкивался с этим словом, то представь, что тебе требуется объявить переменные со значениями от 1 до 100:

Переменная1 = 1;
Переменная2 = 2;
Переменная3 = 3;
…

Решение полностью рабочее, но ты только представь, что придется объявить 100 переменных. Вот это уже совсем некрасиво и неудобно. Куда лучше объявить массив из 100 элементов. Посмотрим на пример:

Массив = Новый Массив(99);
Массив[0] = 1;
Массив[1] = 2;
Массив.Добавить(3);
 
…

Помимо того, что вместо 100 имен переменных у тебя будет всего одно, при использовании массивов ты получаешь такую полезную возможность как перебор его элементов. Со ста разными именами переменных ты это не сделаешь при всем желании. Посмотрим пример:

Для сч = 0 По Массив.Количество() – 1 Цикл
 Сообщить(Массив[сч]); //Выведет «1»
КонецЦикла;

Обрати внимание на пример, в котором я объявлял новый массив. При инициализации переменной типа массив я указал в конструкторе (Новый Массив) значение 99. Этим действием я указал верхнюю границу количества элементов. Стоп! Я же хотел создать массив для хранения 100 элементов, почему тогда пришлось указать 99? Все просто. Счет элементов массива начинается с 0, а не единицы. Поэтому и получается, что указывая 99, мы на самом деле подразумеваем 100.

Массивы можно разделить на два вида: динамические и статические. В приведенном выше примере я описал статический массив. Он отличается от динамического тем, что имеет фиксированное количество элементов. Во время создания массива я сразу указал верхнюю границу элементов. Изменить это значение в процессе работы с массивом уже будет нельзя.

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

Массив = Новый Массив();
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
…

Чтобы перебрать элементы динамического массива можно воспользоваться уже знакомой нам конструкцией:

Для сч = 0 по Массив.Количество() – 1 Цикл
 Сообщить(Массив[сч]);
КонецЦикла;

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

МногомерныйМассив = Новый Массив (2, 4, 10);

В этом примере я объявил массив из двух элементов, каждый из которых является массивом из 4 элементов, каждый из которых является массивом из 10 элементов. Попытайся это переварить.

Списки значений

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

- Значение. Сюда записывается значение произвольного типа;
- Представление. Строковое представление значения;
- Пометка. Значение типа булево, определяющее установку пометки для значения;
- Картинка. В данную колонку можно записать значение типа «картинка»;

Для чего можно использовать список значений? Да много для чего! Если хочешь, чтобы юзер видел не сырое значение из списка, то заполняй колонку «представление» и в нее пиши нужный текст. Рассмотрим небольшой пример. Представь, что нам требуется перебрать все имеющиеся в конфигурации документы и вывести пользователю их имена. Причем не те имена, что указаны в поле «Имя» во время создания нового документа, а тот текст, который содержится в поле «Синоним» (как правило, в нем пишется полное название документа). Причем стоит учитывать, что реальное имя документа (из поля «Имя») нам также может пригодиться, поэтому его также необходимо сохранять. Код решения озвученной задачи смотри ниже.

//Создаем переменную типа СписокЗначений
СписокЗначений = Новый СписокЗначений;  
//На всякий случай сразу ее очищаем
СписокЗначений.Очистить();
 
//Начинаем перебирать все имеющиеся документы
Для Каждого Документ Из Метаданные.Документы Цикл
//Добавляем информацию об очередном документе в нашу переменную		
	СписокЗначений.Добавить(Документ.Имя, Документ.Синоним);
КонецЦикла;
 
//Теперь выводим все содержимое нашего списка значений
Для сч = 0 по СписокЗначений.Количество() - 1 Цикл
	Сообщить("Представление: " + СписокЗначений[сч].Представление + "; Значение: " + СписокЗначений[сч].Значение);
КонецЦикла;

Не будем вдаваться в подробности получения списка документов, т.к. это не относится к теме данной статьи, а посмотрим лишь, как происходит работа со списком значений. Итак, для того чтобы добавить новый элемент в список значений требуется воспользоваться методом «Добавить()». Он принимает несколько параметров:

- Значение (Произвольный тип) – в данный параметр записываются значения произвольного типа. Этот параметр является обязательным для заполнения.

- Представление (Тип данных – строка) – параметр не обязателен для заполнения. В него ты можешь записывать строковое представление для значения.

- Пометка (Тип данных – булево) – опять же, параметр не обязателен к заполнению, но при необходимости в него можно записывать значения типа булево, т.е. ИСТИНА/ЛОЖЬ.

- Картинка (Тип данных – картинка) – картинка, она и в Африке картинка.

В вышеприведенном примере я заполняю лишь первый и второй параметр, т.е. «Значение» (имя документа) и «Представление» (синоним документа). Остальные параметры просто игнорирую, т.к. в их использовании нет необходимости.

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

Переменная = СписокЗначений[4].Представление;

Получение значения/пометки/картинки делается аналогичным образом.

Таблица значений

По своей сущности тип данных ТаблицаЗначений похож на СписокЗначений. В качестве главного отличия можно выделить возможность создания произвольных колонок. Если в списке значений к твоим услугам лишь предопределенные колонки, то в таблице значений нет никаких ограничений. Требуется определенный набор колонок – взял и создал. Кроме колонок, доступны также фишки вроде группировки по значению, подсчета итогов по колонке и т.д.

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

//Создаем таблицу значений
ТаблицаЗначений = Новый ТаблицаЗначений;
 
//Определяем колонки
//Каждой колонке можно задать определенный тип данных.
//Рассмотрим этот вариант в следующий раз
ТаблицаЗначений.Колонки.Добавить("Товар");
ТаблицаЗначений.Колонки.Добавить("Количество");
ТаблицаЗначений.Колонки.Добавить("Сумма");
 
//Заполняем таблицу значений данными
НоваяСтрока = ТаблицаЗначений.Добавить();
//Записываем данные в кажду колонку
НоваяСтрока.Товар = "Огурец";
НоваяСтрока.Количество = 5;
НоваяСтрока.Сумма = 25;
 
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Товар = "Морковь";
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = 15.5;
 
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Товар = "Огурец";
НоваяСтрока.Количество = 9;
НоваяСтрока.Сумма = 45;
 
//Перебираем строки таблицы значений и выводим содержимое в окно служебных сообщений
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
	Сообщить("Строка таблицы значений: ");
	Сообщить("");
	Сообщить("Товар: " + СтрокаТЗ.Товар);
	Сообщить("Количество: " + СтрокаТЗ.Количество);
	Сообщить("Сумма: " + СтрокаТЗ.Сумма);
	Сообщить("-------------------");		
КонецЦикла;
 
//Посчитаем итоговую сумму по всем строкам
Сообщить("Всего товаров на сумму: " + ТаблицаЗначений.Итог("Сумма"));
Сообщить("Общее количество: " + ТаблицаЗначений.Итог("Количество"));
 
//Теперь посчитаем количество и суму за огорцы
ТаблицаЗначений.Свернуть("Товар", "Количество, Сумма");
 
Сообщить("--------------");
 
//После вывода, строка с огурцами будет одна, а не две
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
	Сообщить("Строка таблицы значений: ");
	Сообщить("");
	Сообщить("Товар: " + СтрокаТЗ.Товар);
	Сообщить("Количество: " + СтрокаТЗ.Количество);
	Сообщить("Сумма: " + СтрокаТЗ.Сумма);
	Сообщить("-------------------");		
КонецЦикла;

Результатом выполнения данного кода будет:

Строка таблицы значений:
Товар: Огурец
Количество: 5
Сумма: 25
-------------------
Строка таблицы значений:
Товар: Морковь
Количество: 10
Сумма: 15,5
-------------------
Строка таблицы значений:
Товар: Огурец
Количество: 9
Сумма: 45
-------------------
Всего товаров на сумму: 85,5
Общее количество: 24
--------------
Строка таблицы значений:
Товар: Огурец
Количество: 14
Сумма: 70
-------------------
Строка таблицы значений:
Товар: Морковь
Количество: 10
Сумма: 15,5
-------------------

Вот и все

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

Written by: Игорь Антонов aka Spider_NET

Комментарии

1 комментария(ев)
аватар: Новичок
Новичок
Дата: ЧТ, 26/04/2012 - 16:48
Звание: Наблюдатель
Сообщений: 1

Попыталась создать таблицу Значений по вышенамисанному примеру. Сразу выдается ошибка. Помогите что не так? Sad

{Обработка.ТипПеременной.Форма.Форма.Форма(6,32)}: Переменная не определена (Число)
Если ТипЗнч (ТекСтрока)= Тип (<<?>>Число)Тогда (Проверка: Тонкий клиент)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(4,16)}: Неопознанный оператор
манды.Источник<<?>>, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); (Проверка: Сервер)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(4,16)}: Неопознанный оператор
манды.Источник<<?>>, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); (Проверка: Тонкий клиент)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(9,8)}: Неопознанный оператор
Новая <<?>>строка.Товар="Огурец"; (Проверка: Сервер)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(10,8)}: Неопознанный оператор
Новая <<?>>строка.Количество="5"; (Проверка: Сервер)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(11,11)}: Неопознанный оператор
Новая <<?>>строка.Сумма="25"; (Проверка: Сервер)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(4,24)}: Тип не определен (ТаблицаЗначений)
ТаблицаЗначений=Новый <<?>>ТаблицаЗначений; (Проверка: Тонкий клиент)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(9,8)}: Неопознанный оператор
Новая <<?>>строка.Товар="Огурец"; (Проверка: Тонкий клиент)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(10,8)}: Неопознанный оператор
Новая <<?>>строка.Количество="5"; (Проверка: Тонкий клиент)
{Обработка.ТипПеременной.Команда.Команда1.МодульКоманды(11,11)}: Неопознанный оператор
Новая <<?>>строка.Сумма="25"; (Проверка: Тонкий клиент)