- •Ведение
- •1 Основные теоретические сведения
- •1.1 Архитектура среды 1с:Предприятие
- •1.2 Разработка конфигурации
- •1.3 Инструменты разработки
- •1.3.1 Дерево конфигурации
- •1.3.2 Палитра свойств
- •1.3.2.1 Основные свойства
- •1.3.2.2 Группа свойств «Представление»
- •1.3.2.3 Группа свойств «Разработка»
- •1.3.3 Объектные и необъектные данные
- •1.3.4 Конструкторы
- •1.3.4 Редакторы
- •1.3.4.1 Редактор экранных форм
- •1.3.4.2 Редактор интерфейсов
- •1.3.4.3 Табличный редактор
- •1.3.4.4 Редактор программных модулей
- •1.3.5 Встроенный язык
- •1.3.6 Синтакс – помощник
- •1.3.7 Отладчик
- •1.3.8 Замер производительности
- •1.3.9 Механизм запросов
- •1.3.10 Работа с конфигурацией
- •1.3.10.1 Сохранение конфигурации
- •1.3.10.2 Обновление конфигурации
- •1.3.10.3 Сохранение конфигурации в файл
- •1.3.10.4 Создание резервной копии иб
- •1.3.10.5 Сравнение и объединение конфигураций
- •1.3.11 Работа в пользовательском режиме
- •1.3.12 Основная конфигурация и конфигурация базы данных
- •1.3.13 Средства групповой разработки
- •1.4 Объекты системы
- •1.4.1 Классификация объектов конфигурации
- •1.4.1.1 Прикладные объекты
- •1.4.1.2 Подчиненные объекты
- •1.4.2 Типы данных
- •1.4.3 Встроенный язык программирования
- •1.4.3.1 Виды модулей
- •1.4.3.2 Контекст выполнения модуля
- •1.4.3.3 Формат описания элементов языка
- •1.4.3.4 Формат программного модуля
- •1.4.3.5 Формат операторов
- •1.4.3.6 Имена переменных, процедур и функций
- •1.4.3.7 Зарезервированные слова
- •1.4.3.8 Структура программного модуля
- •1.4.3.9 Специальные символы, используемые в исходном тексте
- •1.4.3.10 Примитивные типы данных
- •1.4.3.10.2 Булево (Boolean)
- •1.4.3.10.3 Дата (Date)
- •1.4.3.10.4 Неопределено (Undefined)
- •1.4.3.10.5 Строка (String)
- •1.4.3.10.7 Число (Number)
- •1.4.3.11 Оператор присваивания
- •1.4.3.12 Выражения языка
- •1.4.3.12.1 Арифметические операции
- •1.4.3.12.2 Логические операции
- •1.4.3.12.3 Операции сравнения:
- •1.4.3.12.4 Булевы операции:
- •1.4.3.13 Оператор объявления переменной
- •1.4.3.14 Оператор условного выполнения
- •1.4.3.15 Операторы цикла
- •1.4.3.16 Оператор управления циклом
- •1.4.3.17 Оператор прерывания цикла
- •1.4.3.17 Оператор перехода
- •1.4.3.18 Оператор обработки исключительных ситуаций
- •1.4.3.19 Процедуры и функции
- •1.4.3.19.1 Описание процедур и функций
- •1.4.3.19.1.1 Процедура
- •1.4.3.19.1.2 Функция
- •1.4.3.19.1.3 Предварительное описание процедур и функций
- •1.4.3.19.2 Вызов процедур и функций. Передача параметров
- •1.4.4 Основные приемы работы с объектами в программе
- •1.4.4.1 Обращение к свойствам объектов
- •1.4.4.2 Дополнение контекста объектов и форм
- •1.4.4.3 Работа с прикладными объектами средствами встроенного языка
- •1.4.4.4 Специфические объекты
- •1.4.4.5 Взаимосвязь объектов
- •1.4.4.6 Иерархия объектов
- •1.4.5 Работа с коллекциями значений
- •1.4.5.1 Использование номеров и индексов
- •1.4.5.2 Массив
- •1.4.5.3 Структура
- •1.4.5.4 Соответствие
- •1.4.5.5 Список значений, таблица значений, дерево значений
- •1.4.5.5.1 Список значений
- •1.4.5.5.2 Таблица значений
- •1.4.5.5.3 Дерево значений
- •1.5 Варианты работы системы
- •1.5.1 Файл - серверный вариант
- •1.5.2 Клиент - серверный вариант
- •1.5.2.1 Сервер 1с:Предприятия
- •1.5.2.2 Безопасная зона
- •1.6 Постановка задачи
- •2.1.1.2 Подсистемы
- •2.1.1.3 Константы
- •2.1.1.4. Перечисления
- •2.1.2 Задание на лабораторную работу
- •2.1.3 Контрольные вопросы
- •2.2 Лабораторная работа № 2. Справочники.
- •2.2.1 Теоретические сведения
- •2.2.1.1 Создание справочника с табличной частью
- •2.2.1.2 Создание иерархического справочника
- •2.2.1.3 Создание справочника с предопределенными элементами
- •2.2.1.4 Создание подчиненного справочника
- •2.2.1.5 Создание формы для работы со связанными справочниками
- •2.2.2 Задание на лабораторную работу
- •2.2.3 Контрольные вопросы
- •2.3 Лабораторная работа № 3. Документы
- •2.3.1 Теоретические сведения
- •2.3.1.1 Проведение документа
- •2.3.1.2 Создание документа
- •2.3.1.3 Создание формы документа
- •2.3.1.4 Создание процедуры обработки события в модуле формы
- •2.3.1.5 Создание процедуры обработки события в общем модуле
- •2.3.1.6 Усовершенствование формы документа
- •2.3.1.7 Ввод документов на основании
- •2.3.2 Задание на лабораторную работу
- •2.3.3 Контрольные вопросы.
- •2.4 Лабораторная работа № 4. Регистры сведений
- •2.4.1 Теоретические сведения
- •2.4.1.1 Регистр сведений «КурсыВалют»
- •2.4.1.2 Отбор в диалоге
- •2.4.1.3 Чтение значения курса валют
- •2.4.1.4 Регистр сведений «Цены поставщиков»
- •2.4.1.5 Регистр сведений «Цены номенклатуры»
- •2.4.1.6 Создание функции РозничнаяЦена()
- •2.4.1.7 Автоматическое заполнение цены документа «ОказаниеУслуги»
- •2.4.2 Задание на лабораторную работу
- •2.4.3 Контрольные вопросы
- •2.5 Лабораторная работа № 5. Регистры накопления
- •2.5.1 Теоретические сведения
- •2.5.1.1 Проведение документа по нескольким регистрам
- •2.5.1.2 Регистр «Остатки номенклатуры»
- •2.5.1.2 Проведение документа «РасходнаяНакладная»
- •2.5.1.3 Оборотный регистр накопления «Продажи»
- •2.5.2 Задание на лабораторную работу
- •2.5.3 Контрольные вопросы
- •2.6 Лабораторная работа № 6. Журналы документов. Критерии отбора.
- •2.6.1 Теоретические сведения
- •2.6.1.1 Создание журнала документов
- •2.6.1.2 Создание критерия отбора
- •2.6.2 Задание на лабораторную работу
- •2.7.1.2 Макеты
- •2.7.1.2.1 Фиксация таблицы (шапки и боковика).
- •2.7.1.2.2 Защита от редактирования.
- •2.7.1.2.3 Перемещение по таблице.
- •2.7.1.2.4 Управление видом таблицы.
- •2.7.1.2.5 Масштабирование изображения.
- •2.7.1.3 Построение отчета
- •2.7.1.4 Печатная форма элемента справочника
- •2.7.1.5 Печатная форма списка справочника
- •2.7.1.6 Расшифровка ячейки печатной формы
- •2.7.1.7 Печатная форма документа
- •2.7.1.8 Печатная форма журнала документов
- •2.7.2 Задание на лабораторную работу
- •2.7.3 Контрольные вопросы
- •2.8 Лабораторная работа № 8. Отчеты и обработки.
- •2.8.1 Теоретические сведения
- •2.8.1.1 Создание отчета «Материалы»
- •2.8.1.2 Печать прайс-листа
- •2.8.1.3 Отчет «ЦеныПоставщиков» на заданную дату
- •2.8.2 Задание на лабораторную работу
- •2.8.3 Контрольные вопросы
- •Список литературы
1.4.4.6 Иерархия объектов
Разберемся с иерархией объектов, позволяющих из языка работать с наполнением справочников.
В схеме, представленной на рис. 1.15, приведены далеко не все объекты. Их полный перечень, состав свойств, методов, событий, взаимосвязь объектов можно просмотреть в документации и в Синтакс – помощнике.
Для того, чтобы «добраться» и прочитать наименования всех элементов справочника «Номенклатура» потребуется прописать следующий код:
Рис. 1.15 Взаимосвязь объектов, обслуживающих справочники
//На чтение
Выборка=Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл
Наим=Выборка. Наименование;
Сообщить(Наим); КонецЦикла;
Для выборки и переноса всех элементов в предопределенную группу //На запись
ПредопределеннаяГруппа=Справочники.Номенклатура.ДляПереноса;
Выборка=Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл
Если Выборка.Ссылка=ПредопределеннаяГруппа Тогда
Продолжить;
КонецЕсли;
ПолученныйОбъект=Выборка.ПолучитьОбъект();
ПолученныйОбъект.Родитель= ПредопределеннаяГруппа; ПолученныйОбъект.Записать();
КонецЦикла;
1.4.5 Работа с коллекциями значений
Универсальные коллекции значений предназначены для хранения временных наборов данных в течение сеанса работы пользователя. Они нe являются объектами информационной базы и служат для вспомогательного сбора, группировки, анализа и обработки информации.
Большинство коллекций имеют набор схожих методов и свойств, таких как «Количество()», «Индекс()», «Добавить()», «Удалить()» и т.д. В качестве свойств коллекции, как правило, выступают ее элементы. Для коллекций доступен обход элементов коллекции посредством конструкции «Для каждого … Из …Цикл». Для большинства коллекций доступно обращение к элементам коллекции с помощью оператора [<Аргумент>] (квадратные скобки). Как правило, в качестве аргумента передается индекс элемента коллекции. Индексирование элементов коллекции начинается с 0. Это означает, что индекс последнего элемента равен количеству элементов в коллекции минус 1.
1.4.5.1 Использование номеров и индексов
В языке системы 1С:Предприятие есть ряд объектов, отдельные части которых имеют нумерацию. К таким объектам, например, относится строка, символы которой имеют номер в строке, или табличный документ, строки и колонки которого имеют номер и т.п. При обращении к частям объектов обычно используется понятие «Номер». Номера начинаются с 1.
При обращении к элементам коллекций используется понятие «Индекс». Индексирование элементов коллекций начинается с 0.
1.4.5.2 Массив
Массив является универсальной коллекцией, то есть объектом, предназначенным для работы с временными наборами данных в течение сеанса работы пользователя.
Необходимость в его использовании возникает, когда требуется работать с временным набором данных. Чаще всего это промежуточные операции обработки информации: подготовка отборов, реализация поиска, подготовка группирования, передача параметров и т.д.
Массивы могут создаваться конструктором «Новый» или получаться в результате применения методов некоторых объектов.
Объекты этого типа представляют собой упорядоченную совокупность значений любого типа, в том числе и типа массив, что, в частности, позволяет организовывать многомерные массивы.
Данный объект является коллекцией значений. Для объекта доступен обход коллекции посредством оператора «Для каждого ... из ... Цикл». При обходе выбираются значения элементов массива. Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента передается индекс значения.
Создание массивов чаще всего происходит посредством оператора «Новый»:
Новый Массив(<КоличествоЭлементов1>,...,<КоличествоЭлементовN>)
Здесь
<КоличествоЭлементов1>,...,<КоличествоЭлементовN> - необязательный числовой параметр. Каждый параметр определяет количество элементов массива в соответствующем измерении. Может задаваться неограниченное количество параметров. Если ни один параметр не указан, создается одномерный массив с нулевым количеством элементов.
Конструктор позволяет создать массив из указанного количества элементов. Если задано несколько параметров, то будет создан массив, элементами которого являются массивы (и т.д. в зависимости от количества параметров). Фактически, конструктор позволяет создать массивы массивов, которые могут являться аналогом многомерного массива.
Пример:
М = Новый Массив(4);
где «М» - имя переменной, которая будет содержать созданный объект типа «Массив». После создания, к массиву можно добавлять произвольное количество элементов. Если же мы хотим создать массив с заранее определенной размерностью, то это можно сделать так:
СозданныйМассив=Новый Массив(10);
В результате в переменной «СозданныйМассив» будет создан массив с десятью значениями. Для такого массива можно потом сразу обращаться к любому из десяти значений (начиная с нулевого по девятое) для записи или для чтения. А при необходимости к такому массиву можно так же еще добавлять новые элементы. Первый же добавленный элемент получит индекс «10».
Массив является линейной динамической коллекцией с произвольным типом значений. Поэтому значениями массива могут выступать другие массивы, т.е. создание массива массивов и решает задачу создания многомерного массива.
Это можно делать при использовании конструктора массива:
ДвумерныйМассив=Новый Массив(2,8);
или в процессе добавления очередных элементов к массиву:
ДвумерныйМассив=Новый Массив;
МассивВторогоПорядка=Новый Массив(8);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);
И в том, и в другом случае мы решим задачу создания двумерного массива размерностью 2x8.
Чтение и запись значений такого массива можно производить посредством директивного указания индексов:
Значение=ДвумерныйМассив[2][5];
или при помощи метода «Получить()»:
Значение=ДвумерныйМассив.Получить(2).Получить(5);
Хотелось бы еще раз отметить, что создание массива определенной размерности конструктором ограничивает только количество возможных к заполнению значений массива, но не препятствует добавлению новых значений (в качестве которых могут выступать массивы произвольной размерности).
Рассмотрим, как выполняется добавление элементов к массиву. Допустим, массив, к которому нужно добавить значение из переменной «НовоеЗначение», называется «НашМассив».
Если нужно просто добавить очередной элемент (с индексом на единицу больше самого старшего) – действуем следующим образом:
НашМассив.Добавить(НовоеЗначение);
Если нужно, чтобы новые значения добавлялись с определенным индексом, то можно использовать метод «Вставить()»:
Массив=Новый Массив;
Массив.Вставить(5, «ООО Искра»);
Чтобы определить количество элементов массива «НашМассив» можно вызвать метод «Количество()»:
Размер=НашМассив.Количество();
Однако имейте в виду, поскольку индексация элементов массива начинается с нуля – значение переменной «Размер» будет на единицу больше значения самого старшего индекса.
Удаление отдельных элементов массива происходит с обязательным указанием индекса удаляемого элемента. Так, например, будет удален первый элемент массива:
МассивЭлементов.Удалить(0);
Естественно, если указанный индекс будет выходить за границы массива – получим сообщение об ошибке.
Кроме того, необходимо учитывать, что удаление элемента «из середины» массива приведет к уменьшению на единицу индексов элементов, стоявших «после» удаленного. Массив как бы «сомкнет ряды».
Поэтому, например, один из наиболее простых вариантов удаления всех числовых элементов массива может выглядеть так:
Индекс=МассивЭлементов.Вграница();
Пока Индекс>=0 Цикл
Если ТИПЗНЧ(МассивЭлементов[Индекс])=Тип(«Число») Тогда
МассивЭлементов.Удалить(Индекс);
КонецЕсли;
Индекс=Инднекс-1;
КонецЦикла;
Сначала определяем самый старший индекс элементов массива. Цикл проверок и удалений чисел будет выполняться, пока очередное значение индекса не окажется меньше нуля. В цикле определяем тип значения элемента с текущим индексом. Если это число – удаляем данный элемент. Кроме того, в любом случае уменьшаем на единицу значение переменной «Индекс». В результате, поскольку перебор элементов массива проводится с конца, эффект «смыкания рядов» будет производиться только для уже проверенных элементов.
Если требуется полное удаление элементов из массива, операция выполняется гораздо проще:
Массив.Очистить();
При обращении как для записи, так и для чтения элементов массива лучше пользоваться оператором [ ], указывая индекс элемента. Помните, что индексация начинается с нуля.
Пусть в переменную «ПервоеЗначение» нужно считать значение самого первого элемента массива, а в элемент массива с индексом «9» записать значение из переменной «ДесятоеЗначение»:
ПервоеЗначение=НашМассив[0];
НашМассив[9]=ДесятоеЗначение;
Аналогичных результатов можно добиться при помощи методов «Получить()» и «Установить()»:
ПервоеЗначение=НашМассив.Получить(0);
НашМассив.Установить(9,ДесятоеЗначение);
Замечание: в любом случае, чтобы иметь возможность обратиться к элементу массива, он должен уже существовать. Иначе получим ошибку с сообщением о том, что индекс находится за границами массива.
Если перебор элементов массива нужен для чтения данных из массива – проще всего организовывать посредством цикла перебора коллекции.
Например, чтобы вывести сообщения о каждом числе, найденном в массиве «МассивЭлементов», достаточно сделать следующее:
Для Каждого ЭлементМассива Из МассивЭлементов Цикл
Если ТипЗнч(ЭлементМассива)=Тип(«Число») Тогда
Сообщить(ЭлементМассива);
КонецЕсли;
КонецЦикла;
Обратите внимание, «ЭлементМассива» – это произвольное имя переменной, принимающей в себя очередное значение элемента коллекции при выполнении цикла.
Если же при переборе элементов массива нужно их редактировать, то для этого нужно работать еще и с индексами элементов. Лучше тогда использовать так называемый «цикл-счетчик».
Например, чтобы обнулить все числовые элементы массива, достаточно сделать следующее:
Для Сч=0 по МассивЭлементов.ВГраница() Цикл
Если ТипЗнч(МассивЭлементов[Сч])=Тип(«Число») Тогда
МассивЭлементов[Сч]=0;
КонецЕсли;
КонецЦикла;
«Сч» – это переменная, принимающее очередное значение счетчика на каждом выполнении цикла. Именно из нее и будем считывать значение индекса очередного элемента массива. Значение самого большого индекса массива определяется посредством метода «ВГраница()».
Для получения копии массива в другом объекте (массиве) необходимо создать новый массив (массив–копию) конструктором. Далее в цикле перебора элементов исходного массива добавлять эти элементы в массив–копию.
Функция СкопироватьМассив(ИсходныйМассив)
МассивКопия=Новый Массив;
Для Каждого Элемент Из ИсходныйМассив Цикл
МассивКопия.Добавить(Элемент) ;
КонецЦикла;
Возврат МассивКопия;
КонецФункции
Пример работы с массивом:
М = Новый Массив(4); Сообщить("Количество: " +М.Количество()); Сообщить("Наибольший индекс массива: " +М.ВГраница()); М.Удалить(2); Сообщить("Количество после удаления: "+М.Количество()); // Этот элемент массива имеет тип Строка: М.Добавить("Добавили строку"); // Этот элемент массива имеет тип Число: М.Добавить(123.45); Сообщить("Количество после добавления: " +М.Количество()); // Добавим элемент по индексу, большему, чем: ВГраница(): М.Вставить(8,"Метод добавил 4 новых элемента"); Сообщить("Количество после добавления: "+М.Количество))); // Массив может хранить разные типы данных: Сообщить("Типы элементов: "+Символы.ПС+ " Для 3-го элемента: "+ТипЗнч(М[3])+Символы.ПС+ " Для 4-го элемента: "+ТипЗнч(М[4])+Символы.ПС+ " Для 5-го элемента: "+ТипЗнч(М[5]));
Результат выполнения:
Количество: 4 Наибольший индекс массива: 3 Количество после удаления: 3 Количество после добавления: 5 Количество после добавления: 9 Типы элементов: Для 3-го элемента: Строка Для 4-го элемента: Число Для 5-го элемента: Неопределено