Цикл 1с – Внутренний язык программирования 1С 8.3 для начинающих программистов: список значений в 1С

Содержание

Массивы в языке 1С 8.3, 8.2 (в примерах)

/// Как создать массив (сразу нужного размера) в 1с 8.3, 8.2
 
&НаКлиенте 
Процедура Пример1(Команда)
 
    // в массиве сразу 3 элемента
    Массив = Новый Массив(3);
 
    // инициализируем их значениями
    Массив[0] = 5;
    Массив[1] = Массив[0] * 2; // 10
    Массив[2] = Массив[1] * 2; // 20
 
    // выводим на печать
    Для Каждого ЭлементМассива из Массив Цикл
        Сообщить(ЭлементМассива); // 5 10 20
    КонецЦикла;
 
КонецПроцедуры
 
/// Как создать пустой массив (с последующим добавлением 
/// элементов) в 1с 8.3, 8.2
 
&НаКлиенте
Процедура Пример2(Команда)
 
    // в массиве 0 элементов
    Массив = Новый Массив;
 
    // добавляем последовательно три элемента
    Массив.Добавить(100); // (100)
    Массив.Добавить(300); // (100, 300)
    Массив.Добавить(500); // (100, 300, 500)
 
    // выводим на печать
    Для Каждого ЭлементМассива из Массив Цикл
        Сообщить(ЭлементМассива); // 100 300 500
    КонецЦикла;
 
КонецПроцедуры
 
/// Как обойти все элементы массива по индексу в 1с 8.3, 8.2
 
&НаКлиенте
Процедура Пример3(Команда)
 
    // инициализируем массив: (100, 300, 500)
    Массив = Новый Массив;
    Массив.Добавить(100);
    Массив.Добавить(300);
    Массив.Добавить(500);
 
    // пробегаемся от первого (с индексом 0) до последнего
    // элемента (с индексом Количество - 1).
    Для Индекс = 0 По Массив.Количество() - 1 Цикл
        Сообщить(Массив[Индекс]);
    КонецЦикла;
 
КонецПроцедуры
 
/// Массив может содержать элементы различных типов: числа,
/// строки и т.д. 
 
&НаКлиенте
Процедура Пример4(Команда)
 
    Массив = Новый Массив(4);
    Массив[0] = "HELP"; // ("HELP")
    Массив[1] = "ME"; // ("HELP", "ME")
    Массив[2] = "1C"; // ("HELP", "ME", "1C")
    Массив[3] = Формат(2013, "ЧГ=0"); // ("HELP", "ME", "1C", 2013)
 
    Для Каждого ЭлементМассива из Массив Цикл
        Сообщить(ЭлементМассива); // HELP ME 1C 2013
    КонецЦикла;
 
КонецПроцедуры
 
/// Как передать массив в качестве параметра функции в 1с 8.3, 8.2
 
&НаКлиенте
Функция Метод5(массивПереданныйПоСсылке)
 
    массивПереданныйПоСсылке[0] = 10;
    Возврат массивПереданныйПоСсылке[0] * 2;
 
КонецФункции
 
&НаКлиенте
Процедура Пример5(Команда)
 
    // инициализация массива из одного элемента: (13)
    Массив = Новый Массив(1);
    Массив[0] = 13;
 
    // значение первого элемента до вызова функции
    Сообщить(Массив[0]); // 13
 
    // массив ВСЕГДА передается в функцию ПО ССЫЛКЕ, значит,
    // изменяя массив внутри функции, мы меняем его снаружи
    Сообщить(Метод5(Массив)); // 20
 
    // значение первого элемента после вызова функции изменилось
    Сообщить(Массив[0]); // 10
 
КонецПроцедуры
 
/// Как вернуть массив в качестве результата работы функции
/// в 1с 8.3, 8.2
 
&НаКлиенте
Функция Метод6()
 
    // инициализация массива (СПАСИБО, ВАМ)
    массив = Новый Массив(2);
    массив[0] = "СПАСИБО";
    массив[1] = "ВАМ";
 
    Возврат массив;
 
КонецФункции
 
&НаКлиенте
Процедура Пример6(Команда)
 
    // инициализация переменной массивом, который возвращает и формирует
    // функция Метод6
    Массив = Метод6();
 
    // вывод на печать
    Для Каждого ЭлементМассива из Массив Цикл
        Сообщить(ЭлементМассива); // СПАСИБО ВАМ
    КонецЦикла;
 
КонецПроцедуры
 
/// Ещё пример на передачу массива в качестве параметра процедуры
/// в 1с 8.3, 8.2
 
&НаКлиенте
Процедура Метод7(Массив)
 
    Если Массив <> Неопределено И Массив.Количество() > 0 Тогда
        Сообщить(Массив[0]);
    КонецЕсли;
 
КонецПроцедуры
 
&НаКлиенте
Процедура Пример7(Команда)
 
    // инициализация массива: (10, 20)
    Массив = Новый Массив(2);
    Массив[0] = 10;
    Массив[1] = 20;
 
    // печать первого элемента, переданного массива
    Метод7(Массив); // 10
    Метод7(Неопределено); // ничего
    Метод7(Новый Массив); // ничего
 
КонецПроцедуры
 
/// Как получить последний элемент массива в 1с 8.3, 8.2
 
&НаКлиенте 
Процедура Пример8(Команда)
 
    // инициализация массива: ("Кошка", "Собака", "Пантера", "Тигр")
    Массив = Новый Массив;
    Массив.Добавить("Кошка");
    Массив.Добавить("Собака");
    Массив.Добавить("Пантера");
    Массив.Добавить("Тигр");
 
    Сообщить(Массив[Массив.Количество() - 1]); // Тигр
 
КонецПроцедуры
 
/// Использование многомерных массивов в 1с 8.3, 8.2
 
&НаКлиенте
Процедура Пример9(Команда)
 
    // ( ( (), () ), ( (), () ), ( (), () ) )
    Массив = Новый Массив(3, 2);
 
    // ( ( "Юрий", "Гагарин" ), ( (), () ), ( (), () ) )
    Массив[0][0] = "Юрий";
    Массив[0][1] = "Гагарин";
 
    // ( ( "Юрий", "Гагарин" ), ( "Герман", "Титов" ), ( (), () ) )
    Массив[1][0] = "Герман";
    Массив[1][1] = "Титов";
 
    // ( ( "Юрий", "Гагарин" ), ( "Герман", "Титов" ),
    //   ( "Валентина", "Терешкова" ) )
    Массив[2][0] = "Валентина";
    Массив[2][1] = "Терешкова";
 
    // обход всех элементов через конструкцию Для Каждого
 
    Для Каждого Строка Из Массив Цикл
        Для Каждого Элемент Из Строка Цикл
            Сообщить(Элемент);
        КонецЦикла;
        Сообщить(" ");
    КонецЦикла;
 
    Сообщить(" ");
 
    // обход всех элементов через индекс
 
    Для ИндексСтрока = 0 По Массив.Количество() - 1 Цикл
        Для ИндексСтолбец = 0 По Массив[ИндексСтрока].Количество() - 1 Цикл
            Сообщить(Массив[ИндексСтрока][ИндексСтолбец]);
        КонецЦикла;
        Сообщить(" ");
    КонецЦикла;
 
КонецПроцедуры
 
/// Вставка, удаление и очистка массива в 1с 8.3, 8.2
 
&НаКлиенте
Процедура Пример10(Команда)
 
    // инициализация пустого массива
    Массив  = Новый Массив;
 
    // вставка трёх элементов; каждый элемент вставляется в начало
    Массив.Вставить(0, 10); // (10)
    Массив.Вставить(0, 100); // (100, 10)
    Массив.Вставить(0, 1000); // (1000, 100, 10)
 
    // определение последнего индекса
    Сообщить(Массив.ВГраница()); // 2
 
    // вывод на печать
    Для Индекс = 0 по Массив.ВГраница() Цикл
        Сообщить(Массив[Индекс]); // 1000 100 10
    КонецЦикла;
 
    // удаление элемента со значением 100
    // для этого сначала находим индекс элемента
    // если не находим возвращаем Неопределено
    Индекс = Массив.Найти(100); // 1
    // и удаляем элемент по найденному индексу
    Массив.Удалить(Индекс); // (1000, 10)
 
    Сообщить(Массив.ВГраница()); // 1
 
    // удаление всех элементов из массива
    Массив.Очистить();
 
КонецПроцедуры
 
/// Как из обычного получить фиксированный (неизменяемый) 
/// массив в 1с 8.3, 8.2
 
&НаКлиенте
Процедура Пример11(Команда)
 
    Числа = Новый Массив;
    Числа.Добавить(1);
    Числа.Добавить(2);
    Числа.Добавить(3);
 
    ФиксированныеЧисла = Новый ФиксированныйМассив(Числа);
    // Получился константный массив на основе обычного:
    //  нельзя менять значения имеющихся элементов
    //  нельзя добавлять новые элементы
    //  нельзя удалять имеющиеся элементы
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Внутренний язык программирования 1С 8.3 для начинающих программистов: формат в 1С

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

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Внутренний язык программирования 1С 8.3 для начинающих программистов: формат в 1С

Автор уроков и преподаватель школы: Владимир Милькин

При программировании в 1С часто приходится выводить (в те же отчеты) значения различных типов (строки, даты, числа …). У каждого из значений есть различные представления.

К примеру, одну и ту же дату ‘01.01.2005’ можно представить в виде строки как:

  1. «01.01.2005»
  2. «1 января 2005»
  3. «01.01.05»

Всё это строковые представления одного и того же значения, для формирования которых в 1С используется специальная функция Формат.

Использование функции Формат в 1С

Отключаем группировку разрядов

Пусть нам требуется вывести число 10000.

Если мы напишем:

Сообщить(10000); // выводит 10 000

То число 10000 отобразится  с пробелами 10 000. Так получается потому, что 1С по умолчанию группирует цифры по 3 штуки (начиная справа) и выводит пробелы между ними.

Чтобы отменить это правило, воспользуемся функцией Формат:

Сообщить(Формат(10000, "ЧГ=0")); // выводит 10000

Первый параметр — это само значение, а второй — форматная строка. Её не нужно пытаться запомнить — просто нужно знать, где посмотреть пример или справку по этой функции (здесь или в синтакс-помощнике).

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

В приведенном выше примере форматная строка «ЧГ=0» имеет параметр ЧГ и значение 0. Такая комбинация отменяет группировку разрядов числа. И, как вы можете убедиться, теперь выводится 10000.

Выводим лидирующие нули

Также частой задачей является вывод лидирующих нулей перед цифрой. К примеру, пусть требуется вывести число 5 с лидирующим впереди нулём то есть в виде «05»:

Сообщить(Формат(5, "ЧЦ=2; ЧВН=")); // выводит 05

Давайте разберём форматную строку «ЧЦ=2; ЧВН=». Она состоит из двух форматных строк, разделенных точкой с запятой. Разберём каждую из них по отдельности.

Строка «ЧЦ=2» задаёт общее число отображаемых десятичных разрядов целой и дробной частей.  Таким образом общее число позиций, которое будет занимать число при выводе будет равно 2.

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

Комбинация двух форматных строк и даёт нужный нам результат «05», вместо «5».

Отлично. Идём дальше.

Меняем разделитель целой и дробной части

Предположим нам требуется выводить дробные числа с разделителем звёздочка вместо точки. То есть, чтобы 25.46 выводилось как «25*46»:

Сообщить(Формат(25.46, "ЧРД=*")); // выведет 25*46

Разберём форматную строку «ЧРД=*». ЧРД — имя парамера, которое я узнал из справки, * — значение этого параметра, которое и будет являться новым разделителем целой и дробной части вместо точки.

Общее представление даты

А что если мы хотим вывести дату ‘20050101’ в виде «01.01.2005»:

Сообщить(Формат('20050101', "ДЛФ=Д")); // выведет 01.01.2005

А что если мы хотим вывести дату как «1 января  2005 г.»:

Сообщить(Формат('20050101', "ДЛФ=ДД")); // выведет 1 января  2005 г.

Обе используемые форматные строки «ДЛФ=Д» и «ДЛФ=ДД» имеют один и тот же параметр ДЛФ, но вот значения у него различные. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. В первом случае (сокращенный вариант даты) — Д, а во втором (длинный вариант) ДД.

Представление дня недели даты

Если посмотреть календарь, то выяснится, что 1 января 2005 года было субботой. Вот как можно выводить описание дня недели по его дате:

Сообщить(Формат('20050101', "ДФ=дддд")); // выведет суббота

Форматная строка представляет из себя параметр ДФ и значение дддд, что и указывает функции Формат вывести длинное представление дня недели (обратите внимание как много букв «д» она содержит).

Представление месяца даты

Описание месяца по дате выводится так:

Сообщить(Формат('20050101', "ДФ=ММММ")); // выведет Январь

Форматная строка имеет тот же самый параметр ДФ, как и в предыдущем случае. Но вот значение отличается. Теперь оно равно ММММ.

Пройдите тест

Таблица значений в языке 1С 8.3, 8.2 (в примерах)

&НаСервере
Процедура ВыполнитьКодНаСервере()
 
    /// Как создать таблицу значений в 1с 8.3, 8.2
 
    // с таблицей значений можно работать только на сервере 
    Таб = Новый ТаблицаЗначений;    
 
    /// Как добавить колонки в таблицу значений в 1с 8.3, 8.2
 
    Таб.Колонки.Добавить("Фрукт");
    Таб.Колонки.Добавить("Цвет");
    Таб.Колонки.Добавить("Вкус");
 
    /// Как добавить строки в таблицу значений в 1с 8.3, 8.2
 
    Стр = Таб.Добавить();
    Стр.Фрукт = "Яблоко";
    Стр.Цвет = "Зелёный";
    Стр.Вкус = "Кислый";
 
    Стр = Таб.Добавить();
    Стр.Фрукт = "Банан";
    Стр.Цвет = "Желтый";
    Стр.Вкус = "Сладкий";
 
    Стр = Таб.Добавить();
    Стр.Фрукт = "Слива";
    Стр.Цвет = "Синий";
    Стр.Вкус = "Терпкий"; 
 
    /// Как добавить в таблицу значений колонку с
    /// описанием типа и заголовка в 1с 8.3, 8.2
 
    ОписаниеВеса = Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(12, 3));
 
    Таб.Колонки.Добавить("ВесФрукта", ОписаниеВеса, "Вес фрукта");
    Таб[0].ВесФрукта = 100.005;
    Таб[1].ВесФрукта = 60.010;
    Таб[2].ВесФрукта = 25.000;
 
    /// Как перечислить все строки в таблице значений в 1с 8.3, 8.2
 
    Для Каждого Стр Из Таб Цикл
        Сообщить(Стр.Фрукт + " " + Стр.Цвет + " " + Стр.Вкус +
            " " + Стр.ВесФрукта);
    КонецЦикла;
 
    /// Как перечислить все колонки в таблице значений
    /// в 1с 8.3, 8.2
 
    Для Каждого Колонка Из Таб.Колонки Цикл
        Сообщить(Колонка.Имя);
    КонецЦикла; 
 
    /// Как выгрузить колонку таблицы значений в массив в 1с 8.3, 8.2
 
    // выгрузка названий фруктов в массив
    МассивФруктов = Таб.ВыгрузитьКолонку("Фрукт");
 
    // ничего не измениться, так как массив не менялся
    Таб.ЗагрузитьКолонку(МассивФруктов, "Фрукт");
 
    /// Как заполнить значения в колонке для всех строк таблицы 
    /// значений в 1с 8.3, 8.2
 
    // обнулим вес во всех строках
    Таб.ЗаполнитьЗначения(0, "ВесФрукта");
 
    // выставим новые веса
    Таб[0].ВесФрукта = 100;
    Таб[1].ВесФрукта = 60;
    Таб[2].ВесФрукта = 25;
 
    /// Как в таблице значений посчитать итог по колонке в 1с 8.3, 8.2
 
    Сообщить(Таб.Итог("ВесФрукта")); // 185
 
    /// Как найти строку в таблице значений по значению в 1с 8.3, 8.2
 
    // найдём строчку с яблоком и покажем его цвет
    НайденнаяСтрока = Таб.Найти( "Яблоко" );
    Если НайденнаяСтрока <> Неопределено Тогда
        Сообщить(НайденнаяСтрока.Цвет); // Зелёный
    КонецЕсли;
 
    /// Как найти строку в таблице значений поиском значения
    /// в определенных колонках в 1с 8.3, 8.2
 
    // будем искать по слову "Кислый" в колонках вкус и цвет
    НайденнаяСтрока = Таб.Найти("Кислый", "Вкус, Цвет");
    Если НайденнаяСтрока <> Неопределено Тогда
        Сообщить(НайденнаяСтрока.Фрукт); // Яблоко
    КонецЕсли;
 
    // добавим ещё один зелёный фрукт
    Стр = Таб.Добавить();
    Стр.Фрукт = "Киви";
    Стр.Цвет = "Зелёный";
    Стр.Вкус = "Сладкий";
    Стр.ВесФрукта = 30;
 
    /// Как искать в таблице значений неуникальные значения
    /// в 1с 8.3, 8.2
 
    Отбор = Новый Структура;
    Отбор.Вставить("Цвет", "Зелёный");
    Строки = Таб.НайтиСтроки(Отбор);
    Для Каждого Стр Из Строки Цикл
        Сообщить(Стр.Фрукт); // Яблоко Киви
    КонецЦикла;
 
    /// Как сдвинуть строку таблицы значений в 1с 8.3, 8.2
 
    // сдвигаем первую строку на одну позицию вперёд
    Таб.Сдвинуть(0, 1);
 
    // и возвращаем обратно
    Таб.Сдвинуть(1, -1);
 
    /// Как создать копию таблицы значений в 1с 8.3, 8.2
 
    // полная копия
    КопияТаб = Таб.Скопировать();
 
    /// Как создать копию таблицы значений по нужным колонкам
    /// в 1с 8.3, 8.2
 
    // только две колонки будет Фрукт и Цвет
    КопияТаб = Таб.СкопироватьКолонки("Фрукт, Цвет");
 
    /// Как создать копию таблицы значений по отбору в 1с 8.3, 8.2
 
    Отбор = Новый Структура;
    Отбор.Вставить("Фрукт", "Яблоко");
 
    // таблица будет содержать только строчку с яблоком
    КопияТаб = Таб.Скопировать(Отбор);
 
    // таблица будет содержать цвет и вес яблока
    КопияТаб = Таб.Скопировать(Отбор, "Цвет, ВесФрукта");
 
    /// Как свернуть таблицу значений по колонке в 1с 8.3, 8.2
 
    // свернём по вкусу, просуммируем по весу
    Таб.Свернуть("Вкус", "ВесФрукта");
 
    /// Как отсортировать таблицу значений по колонке в 1с 8.3, 8.2
 
    Таб.Сортировать("ВесФрукта Возр");
 
    /// Как отсортировать таблицу значений по нескольким колонкам
    /// в 1с 8.3, 8.2
 
    Таб.Сортировать("ВесФрукта Возр, Вкус Убыв");
 
    /// Как удалить строку из таблицы значений в 1с 8.3, 8.2
 
    // по индексу или по значению
    Таб.Удалить(0);
 
КонецПроцедуры
 
/// Как программно вывести таблицу значений на
/// форму в 1с 8.3, 8.2 
 
// см. примеры использования этой функции ниже
 
// ТабВКоде - таблица значений, созданная программно
// ТабРеквизит - имя реквизита формы типа ТаблицаЗначений
// ТабНаФорме - имя элемента формы, связанного с ТабРеквизит 
 
&НаСервере
Процедура ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, ТабРеквизит, ТабНаФорме)
 
    // реквизит ТабРеквизит и соответствующий
    // ему элемент формы ТабНаФорме уже созданы
    // нами в визуальном режиме
 
    // 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит
 
    НовыеРеквизиты = Новый Массив;
 
    Для Каждого Колонка Из ТабВКоде.Колонки Цикл
         НовыеРеквизиты.Добавить(
            Новый РеквизитФормы(
                Колонка.Имя, Колонка.ТипЗначения,
                ТабРеквизит
            )
         );
    КонецЦикла;
 
    ИзменитьРеквизиты(НовыеРеквизиты);
 
    // 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме
 
    Для Каждого Колонка Из ТабВКоде.Колонки Цикл
 
        НовыйЭлемент = Элементы.Добавить(
            ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабНаФорме]
        );
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя;
    КонецЦикла;
 
    // 3. наконец, передаём данные из ТабВКоде в ТабРеквизит
 
    ЗначениеВРеквизитФормы(ТабВКоде, ТабРеквизит);
 
    // готово!    
 
КонецПроцедуры
 
&НаСервере
Процедура СоздатьТаблицуНаФормеНаСервере()
 
    // программно создаём таблицу значений ТабВКоде
 
    ТабВКоде = Новый ТаблицаЗначений;
 
    ОписаниеСтроки = Новый ОписаниеТипов("Строка");
    ОписаниеВеса = Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(12, 3));
 
    ТабВКоде.Колонки.Добавить("Фрукт", ОписаниеСтроки, "Имя фрукта");
    ТабВКоде.Колонки.Добавить("Цвет", ОписаниеСтроки, "Цвет фрукта");
    ТабВКоде.Колонки.Добавить("Вес", ОписаниеВеса, "Вес фрукта");
 
    Стр = ТабВКоде.Добавить();
    Стр.Фрукт = "Яблоко";
    Стр.Цвет = "Зелёный";
    Стр.Вес = 200;
 
    Стр = ТабВКоде.Добавить();
    Стр.Фрукт = "Банан";
    Стр.Цвет = "Желтый";
    Стр.Вес = 150;
 
    ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит1", "ТабНаФорме1");
 
КонецПроцедуры
 
/// Как программно вывести на форму результат запроса
/// в виде таблицы значений в 1с 8.3, 8.2
 
&НаСервере
Процедура ВывестиНаФормуРезультатЗапросаНаСервере()        
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Товары.Ссылка,
        |   Товары.ВерсияДанных,
        |   Товары.ПометкаУдаления,
        |   Товары.Код,
        |   Товары.Наименование,
        |   Товары.Цвет,
        |   Товары.ЕдиницаИзмерений,
        |   Товары.Предопределенный,
        |   Товары.ИмяПредопределенныхДанных
        |ИЗ
        |   Справочник.Товары КАК Товары";
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ТабВКоде = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой);   
 
    // функция ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме определена выше
    ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит2", "ТабНаФорме2");
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Цикл статей «Первые шаги в разработке на 1С» – Проект ‘Курсы 1С’

Флагманский продукт «1С:ERP Управление предприятием 2» на середину 2016 года содержал 5 млн. строк кода и около 10 тысяч программных модулей. Данная конфигурация разработана на платформе «1С:Предприятие 8», которую уже около 12 лет поддерживает и разрабатывает фирма «1С». И несмотря на столь солидный стаж, платформа продолжает включать в себя все новые и новые функциональные возможности, сохраняя при этом довольно высокий уровень обратной совместимости.

Эти качества обеспечили платформе «1С:Предприятие 8» поистине феноменальное положение: на текущий момент, по числу продаваемых лицензий в России, доля рынка «1С» составляет более (!) 80%. Это позволяет утверждать, что в настоящее время, с точки зрения предоставляемой разработчику функциональности, платформа «1С:Предприятие 8» стала базовой технологией в области автоматизации различных сфер бизнеса.

Если вы уже давно не имели дела с платформой 1С (последний раз видели редакцию 7.7 или 8.1), то вы можете даже не узнать систему, в которую она превратилась сегодня – в хорошем смысле этого слова.

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

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

Для полных новичков, решивших освоить разработку на каком-либо языке программирования, но еще не выбравших для себя что-то конкретное, мы рекомендуем почитать эту статью от руководителя разработки и главного архитектора системы «1С: Предприятие», Сергея Нуралиева.

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

Переходите к изучению статей
Переменные и операторыПроцедуры и функцииПримитивные типы данных и некоторые их функцииПонятие класса и объектаКак в 1С работать с универсальными коллекциямиПредопределенные элементы в «1С:Предприятие 8.3»Основные приемы работы в конфигуратореОтладка в платформе 1С:Предприятие 8Новые возможности конфигуратора платформы 1С:Предприятие 8.3Понятие контекста программного кодаМодули в Платформе 1С:Предприятие 8.3Основы поддержки типовых прикладных решенийУправляемый интерфейс 1С:Предприятие 8Подсистемы. Настройка интерфейса с помощью подсистемНастройка форм и возможности работы со спискамиКак в 1С вывести сообщение пользователю?Новый интерфейс Такси в 1С:Предприятие 8.3Как в 1С регистрировать ошибки платформы?Новое в управляемых формах в 1С:Предприятие 8.3Прочие новшества в 1С:Предприятие 8.3Как облегчить разработку в 1С:Предприятие 8.3?

Внутренний язык программирования 1С 8.3 для начинающих программистов: математика в 1С

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

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Внутренний язык программирования 1С 8.3 для начинающих программистов: математика в 1С

 Автор уроков и преподаватель школы: Владимир Милькин

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

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

Математические операции в 1С

Представим, что у нас есть число с дробной частью:

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

ОкругленнаяЦена = Окр(Цена, 1); // вернёт 100.4

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

В качестве результата округления мы получим 100.4. Но почему не 100.3?

Всё потому, что команда Окр делает округление к ближайшему целому. Другими словами, при округлении до N-го знака, мы смотрим на число, которое расположено следом (в позиции N + 1). И если это число < 5, то N-й знак сохраняет своё значение, иначе если это число >= 5, то N-й знак увеличивается на единицу.

В нашем случае мы округляем до первого знака, значит смотрим на второй знак. Там 8, она больше или равна 5, значит первый знак (там 3) мы увеличиваем на единицу. Получаем 100.4.

Отдельного рассмотрения требуют правила округления, если (N + 1)-й знак равен 5, а последующие знаки равны нулю.

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

Сообщить(Окр(100.350, 1, РежимОкругления.Окр15как10)); // вернёт 100.3
Сообщить(Окр(100.350, 1, РежимОкругления.Окр15как20)); // вернёт 100.4

Значение этого параметра по умолчанию равно РежимОкругления.Окр15как20 (округление в большую сторону).

Ещё раз обращаю ваше внимание, что третий параметр оказывает влияние на результат только тогда, когда мы:

  • округляем до N-го знака
  • N + 1 знак равен 5
  • а все знаки начиная с N + 2 равны нулю

А теперь давайте отбросим дробную часть числа, чтобы осталась только целая часть:

ЦелаяЧасть = Цел(Цена); // вернёт 100

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

Иногда при расчётах требуется возвести число в степень:

ДесятьВКубе = Pow(10, 3); // вернёт 1000

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

А порою нам требуется, наоборот, к примеру извлечь квадратный корень из числа:

КвадратныйКореньИз25 = Sqrt(25); // вернёт 5

Ещё задача. Пусть у нас имеется конечный набор чисел и нужно найти максимальное значение:

МаксимальноеЗначениеИзТрёхЧисел = Макс(10, 20, 30); // вернёт 30
МаксимальноеЗначениеИзДвухЧисел = Макс(0, -5); // вернёт 0

Количество параметров, которые можно передавать в функцию Макс для поиска максимального элемента неограниченно.

Функция Мин решает обратную задачу:

МинимальноеЗначениеИзТрёхЧисел = Мин(10, 20, 30); // вернёт 10
МинимальноеЗначениеИзДвухЧисел = Мин(0, -5); // вернёт -5

Ещё очень популярной задачей является генерация случайных чисел. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. В 1С это делается таким образом:

ГСЧ = Новый ГенераторСлучайныхЧисел();
Сообщить(ГСЧ.СлучайноеЧисло(0, 2));

Первой строкой мы создаём объект ГенераторСлучайныхЧисел и связываем с ним нашу переменную ГСЧ.

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

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

С более полным перечнем математических функций в 1С вы можете ознакомиться в справочнике по языку (ссылка).

Пройдите тест

а) Напишите программу, которая генерирует три случайные числа в диапазоне от 1 до 1000. Генератор случайных чисел инициализируете числом 2014 (об этом ниже). Затем каждое число возводится в 5 степень. Затем из каждого числа извлекается квадратный корень. Затем каждое число делится на 3. Затем каждое число округляется до второго знака в меньшую сторону. Затем каждое число умножается на 0.25. Затем от каждого числа отбрасывается дробная часть. И, наконец, находится сумма всех получившихся чисел, которая и выводится пользователю. Получившееся значение будет равно 849442.

Чтобы инициализировать генератор определённым числом (например, 2014) напишем:

Инициализация определённым числом позволит вам получить на своём компьютере ту же самую последовательность случайных чисел, что получил я. Это нужно, чтобы вы в конце выполнения программы получили тот же самый ответ, что и я  — 849442.

Внутренний язык программирования 1С 8.3 для начинающих программистов: список значений в 1С

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

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Внутренний язык программирования 1С 8.3 для начинающих программистов: список значений в 1С

Автор уроков и преподаватель школы: Владимир Милькин

Сегодня мы познакомимся с новым типом данных языка 1С, который называется СписокЗначений.

Список значений в языке 1С

Похож на массив

Список значений — это в общем тот же массив, с которым мы уже умеем работать (ссылка на урок). Но массив этот не простой, а волшебный! Он умеет делать некоторые вещи, которые не умеет делать обычный массив. Давайте рассмотрим некоторые из его возможностей.

Раз список значений — это некоторый аналог массива, то он тоже является коллекцией данных. И мы смело можем поместить в него набор чисел:

Список = Новый СписокЗначений; // создали список значений
Список.Добавить(10); // добавили в список число 10
Список.Добавить(0); // добавили в список число 0
Список.Добавить(-5);
Список.Добавить(23);

Его элементы не просто значения

Чтобы теперь вывести эти числа пользователю напишем:

// пробежимся циклом по каждому элементу списка
Для Каждого Элемент Из Список Цикл
    Сообщить(Элемент.Значение); // выводим значение элемента
КонецЦикла;

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

  • Значение (может иметь произвольный тип)
  • Представление (тип Строка)

Там есть и другие поля (например, Картинка), но они нас в этом уроке интересовать не будут.

И когда мы напишем…

Список.Добавить(10);

… в список добавится структура, у которой поле Значение равно 10.

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

Список.Добавить(10, "десять");

Тогда в список добавится структура со следующими значениями полей:

  • Значение (10)
  • Представление («десять»)

Убедиться в этом легко:

Для Каждого Элемент Из Список Цикл
    Сообщить(Элемент.Значение);
    Сообщить(Элемент.Представление);
КонецЦикла;

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

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

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

Список = Новый СписокЗначений;
Список.Добавить(1861, "Отмена рабства");
Список.Добавить(988, "Крещение Руси");
 
ВыбранныйЭлемент = Список.ВыбратьЭлемент("Выберите событие:");
Если ВыбранныйЭлемент <> Неопределено Тогда
    Сообщить("Это событие произошло в " + ВыбранныйЭлемент.Значение + " году.");
КонецЕсли;

Умеет сортировать

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

Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);

В случае с обычным массивом нам пришлось бы реализовывать один из алгоритмов сортировки (например, «пузырёк»).

Умеет искать

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

Число = 0;
ВвестиЧисло(Число); // ввели число от пользователя
 
НайденныйЭлемент = Список.НайтиПоЗначению(Число);
 
Если НайденныйЭлемент = Неопределено Тогда
    ОткрытьЗначение("Число " + Число + " в списке не найдено!");
Иначе
    ОткрытьЗначение("Число " + Число + " присутствует в списке. Вот оно: "
        + НайденныйЭлемент.Значение);
КонецЕсли;

Поддерживает вставку и удаление

Список значений, также как и массив, поддерживает вставку и удаление элементов:

Список.Вставить(0, 1000); // вставляем тысячу в самое начало списка
Список.Удалить(0); // и тут же удаляем её из списка
Список.Вставить(Список.Количество(), 13); // вставляем 13 в конец списка
Сообщить(Список[Список.Количество() - 1]); // выводим последний элемент списка (13)

Поддерживает квадратные скобки

Как вы уже поняли, нумерация элементов списка также идёт с нуля и мы можем обратиться к любому элементу по его индексу используя квадратные скобки:

Сообщить(Список[1].Значение); // вывели второй элемент списка

Таким образом, мы можем пробежаться по всем элементам списка ещё и так:

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

Умеет создавать свою копию

У списка значений есть просто шикарная возможность — он умеет сам создавать свою копию:

КопияСписка = Список.Скопировать(); // сделали копию списка
 
// теперь можем смело менять КопияСписка
// при этом исходный список меняться не будет
КопияСписка[0].Значение = 123456;

Умеет превращаться в массив

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

МассивЧисел = Список.ВыгрузитьЗначения(); // выгрузили в массив
 
Для А = 0 По МассивЧисел.Количество() - 1 Цикл
    Сообщить(МассивЧисел[А]); // не нужно указывать поле Значение
КонецЦикла;

Подводим итог

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

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

Пройдите тест

а) Необходимо ввести от пользователя 5 чисел, найти наибольшее и наименьшее из них и вывести их пользователю. В решении должен использоваться список значений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *