
- •Ведение
- •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.5.5.2 Таблица значений
Таблица значения — объект позволяющий строить динамические наборы значений и манипулировать ими. Он может быть наполнен значениями различных типов. Может иметь любое количество колонок и быть связанным с элементом «табличное поле».
Для создания таблицы значений используется конструктор «Новый»:
ТаблицаЗначение=Новый ТаблицаЗначений;
После этого можно создать колонки таблицы (при необходимости можно задать допустимые типы значений для колонки, заголовок и ширину колонки в символах).
//Создать нужные колонки
ТаблицаЗначений.Колонки.Добавить(«Фамилия»);
ТаблицаЗначений.Колонки.Добавить(«Возраст»);
Затем можно добавить новую строку и установить значения в колонках таблицы:
//Добавить новую строку и задать значения в колонках таблицы
НоваяСтрока=ТаблицаЗначений.Добавить();
НоваяСтрока.Фамилия= «Иванов»;
НоваяСтрока.Возраст=23;
или так:
//Добавить новую строку и задать значения в колонках таблицы
НоваяСтрока=ТаблицаЗначений.Добавить();
НоваяСтрока[«Фамилия»]= «Иванов»;
НоваяСтрока[«Возраст»]=23;
Если требуется найти первую строку таблицы значений «ТаблицаЗначений», где присутствует «ИскомоеЗначение», можно сделать так:
НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение);
Если требуется найти первую строку, где «ИскомоеЗначение» может быть найдено, например, в колонках «Поставщик» и «Покупатель», то:
НайденнаяСтрока=ТаблицаЗначений.Найти(ИскомоеЗначение,
«Поставщик,Покупатель»);
Если же нужно найти все строки, где в колонке «Сотрудник» присутствует искомое значение, то это можно выполнить при помощи метода «НайтиСтроки()»:
//Сформировать структуру отбора
СтруктураПоиска=Структура(«Сотрудник», ИскомоеЗначение);
//Найти строки
МассивНайденныхСтрок=
ТаблицаЗначений.НайтиСтроки(СтруктураПоиска);
Сначала создаем структуру поиска, каждый элемент которой будет содержать название колонки таблицы значений в качестве ключа и искомое значение в этой колонке - в качестве значения. Далее структуру поиска передаем в качестве параметра методу «НайтиСтроки()». Результат - массив строк таблицы значений, соответствующих структуре поиска.
Если в этом примере в структуру поиска добавить поиск нужного значения, например, еще и в колонке «Ответственный» - то в результате применения метода «НайтиСтроки()» получим все строки, где и «Сотрудник» и «Ответственный» равны искомому значению.
Поскольку здесь мы имеем дело с индексированной коллекцией, то можно использовать цикл перебора элементов коллекции или «цикл-счетчик». Например, чтобы сообщить значения колонки «Сотрудник» всех строк таблицы значений «ТаблицаСотрудников», можно использовать следующий код:
Для Каждого ТекущаяСтрока Из ТаблицаСотрудников Цикл
Сообщить(ТекущаяСтрока.Сотрудник);
КонецЦикла;
То же через «цикл-счетчик»:
СтаршийИндекс=ТаблицаСотрудников.Количество()-1;
Для Сч=0 по СтаршийИндекс Цикл
Сообщить(СписокСотрудниковp[Сч].Сотрудник);
КонецЦикла;
Удаление отдельных строк таблицы значений происходит с обязательным указанием удаляемой строки или индекса удаляемой строки. Если нужно удалить строку «УдаляемаяСтрока», входящую в таблицу значений «ТаблицаЗначений»:
ТаблицаЗначений.Удалить(УдаляемаяСтрока);
А так, например, будет удалена первая строка таблицы значений:
ТаблицаЗначений.Удалить(0);
Естественно, если указанный индекс будет выходить за границу индексов строк таблицы значений - получим сообщение об ошибке. Аналогично и для колонок. Только работать уже надо с коллекцией колонок таблицы значений. Доступ к ней - через свойство «Колонки» таблицы значений.
ТаблицаЗначений.Колонки.Удалить(УдаляемаяКолонка);
Или
ТаблицаЗначений.Колонки.Удалить(0);
Кроме того необходимо учитывать, что удаление строки (или колонки) из середины таблицы значений приведет к уменьшению на единицу индексов строк, стоявших после удаленной (эффект «смыкания рядов», вернее –«смыкание строк»).
Например, решим задачу удаления всех строк таблицы значений «ТаблицаЗначений», содержащих числовые значения хотя бы в одной колонке:
СтаршийИндексКолонок=ТаблицаЗначений.Колонки.Количество()-1;
Индекс=ТаблицаЗначений.Количество()-1;
Пока Индекс>=0 Цикл
Для Сч=0 По СтаршийИндексКолонок Цикл
Если ТипЗнч(ТаблицаЗначений[Индекс][Сч])=
Тип(«Число») Тогда
ТаблицаЗначений.Удалить(Индекс);
Прервать;
КонецЕсли;
КонецЦикла;
Индекс=Индекс-1;
КонецЦикла;
Сначала определяем самые старшие индексы строк и колонок таблицы значений. Цикл проверок и удалений строк будет выполняться, пока очередное значение индекса строки не окажется меньше нуля.
Внутри цикла по строкам делаем цикл-счетчик перебора индексов колонок. Во вложенном цикле определяем тип значения элемента находящегося в строке с текущим индексом и в очередной колонке. Если или «Список значений», «таблица значений», «дерево значений» это число - удаляем строку таблицы значений и прерываем вложенный цикл.
Кроме того, в любом случае на каждом шаге внешнего цикла уменьшаем на единицу значение переменной «Индекс».
В результате, поскольку перебор строк таблицы значений производится с конца, то эффект «смыкания рядов» будет актуален только для уже проверенных элементов.
Если имя колонки, для которой требуется установить значение, содержится в переменной, можно использовать оператор «[ ]»:
НоваяСтрока=ТаблицаЗначений.Добавить();
НоваяСтрока[ИмяКолонки]=Значение;
В вышеприведенном коде:
«ТаблицаЗначений» - имя таблицы значений;
«ИмяКолонки» - строковая переменная, содержащая имя колонки, по которой нужно заполнить значение;
«Значение» - переменная, содержащая само заполняемое значение.
Колонку «ФлагФискального Учета» в таблице значений «ТаблицаЗначений» необходимо заполнить значением «Ложь».
ТаблицаЗначений.ЗаполнитьЗначения(Ложь, «ФлагФискальногоУчета»);
Применяем для таблицы значений метод «ЗаполнитьЗначения()». Первым параметром передаем заполняемое значение. Вторым параметром - имя заполняемой колонки.
Если нужно заполнить несколько колонок значением – их имена указывают через запятую во втором параметре. Если не указать второй параметр - значением заполнятся все поля таблицы.
Если «ТаблицаПолучатель» на момент выполнения операции еще не существует, или ее предыдущие колонки сохранять не нужно, можно создать ее, как полную копию исходной:
ТаблицаПолучатель=ТаблицаИсходная.Скопировать();
Вариант второй: таблица «ТаблицаПолучатель» существует, и жалко терять ее колонки и ограничения на типы данных колонок. Но нужно заполнить данные по колонкам, имена которых совпадают с именами исходной таблицы.
Тогда можно так:
Для Каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл
НоваяСтрока=ТаблицаПолучатель.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсходнойТаблицы);
КонецЦикла;
Для каждой строки исходной таблицы добавляется новая строка в таблицу получатель и выполняется заполнение значений в тех колонках новой таблицы, имена которых совпадают с именами колонок в исходной таблице.
Если у таблиц не будет колонок с одинаковыми именами - таблица-получатель будет в результате содержать столько же строк с пустыми значениями, сколько строк было в таблице-источнике.
Если у каких-то одноименных колонок тип значения данных из таблицы-источника не попадет в массив разрешенных типов колонки таблицы-получателя - в таких полях получим пустые значения.
Рассмотрим третий случай. В случае одноименных колонок – колонку таблицы-получателя нужно привести в полное соответствие колонке таблицы-источника.
ОдноименныеКолонки=Новый Массив();
Для Каждого Колонка Из ИсходнаяТаблица.Колонки Цикл
СовпадающаяКолонка=ТаблицаПолучатель.Колонки.Найти(Колонка,Имя);
Если СовпадающаяКолонка<>Неопределено Тогда
//Получить свойства колонки
Индекс=ТаблицаПолучатель.Колонки.Индекс(СовпадающаяКолонка);
Имя=Колонка.Имя;
ТипЗначения=Колонка.ТипЗначения;
Заголовок=Колонка.Заголовок;
Ширина=Колонка.Ширина;
//Заменить колонки в таблице-получателе
ТаблицаПолучатель.Колонки.Удалить(Индекс);
ТаблицаПолучатель.Колонки.Вставить(Индекс,Имя,ТипЗначения,
Заголовок,Ширина);
//Добавить очередное имя совпадающих колонок в массив
ОдноименныеКолонки.Добавить(Колонка.Имя);
КонецЕсли;
КонецЦикла;
//Цикл перебора строк исходной таблицы.
Для каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл
//Добавить новую строку в таблицу-получатель
НоваяСтрока=ТаблицаПолучатель.Добавить();
//Заполнить значения в совпадающих ячейках
Для каждого ИияКолонки Из ОдноименныеКолонки Цикл
НоваяСтрока[ИмяКолонки]=СтрокаИсходнойТаблицы[ИмяКолонки];
КонецЦикла;
КонецЦикла;
Нам придется заменить колонку в таблице получателе на новую, чьи свойства полностью будут соответствовать колонке таблицы-источника.
Поэтому в случае обнаружения в таблице-получателе одноименной колонки собираем в переменных все свойства для новой колонки. Далее удаляем старую и создаем новую колонку.
Далее выполняем цикл перебора строк исходной таблицы. В цикле добавляем к таблице-получателю новую строку и открываем цикл перебора имен колонок в массиве совпадающих колонок.
Внутри этого вложенного цикла производим заполнение ячеек таблицы получателя данными ячейки таблицы-источника.
При добавлении колонки можно просто указать ее имя, а второй параметр метода «Добавить()» - не трогать. В этом случае тип данных колонки - произвольный.
//Добавить колонку без ограничений по типу
ТаблицаЗначений.Колонки.Добавить(«Объект»);
Можно заполнить значение второго параметра. Туда необходимо передавать описание разрешенного для колонки типа. Само описание можно получить при помощи конструктора, передав последнему в качестве параметра строковое название типа (если много типов – через запятую) или массив допустимых типов.
//Ограничения по типам данных колонки:
//Только элементы справочника «Контрагенты»
ТаблицаЗначений.Колонки.Добавить(«Контрагент»,
Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»));
Если среди типов разрешенных к заполнению данных колонки есть строка - можно ограничить ее разрядность (длину), указать использование переменной или фиксированной длинны. Все это обеспечивается созданием объекта при помощи конструктора «КвалификаторыСтроки». Далее этот объект будет использован в качестве одного из параметров конструктора «ОписаниеТипов».
//Подготовка и установка ограничений для данных типа «Строка»
КвалификаторыСтроки=Новый КвалификаторыСтроки(20,
ДопустимаяДлина.Переменная);
ДопустимыеТипы=Новый ОписаниеТипов(«Строка»,,
КвалификаторыСтроки);
ТаблицаЗначений.Колонки.Добавить(«ПримечаниеСтроковоеКороткое»,
ДопустимыеТипы);
Аналогичные действия можно осуществлять в отношении квалификаторов числа и даты. Обратите внимание, описание типов можно строить конструктором как с нуля, так и использовать как основу уже существующее описание типов.
//Расширение уже использованного ранее описания типов
КвалификаторыЧисла=Новый КвалификаторыЧисла(10,2,
ДопустимыйЗнак.Неотрицательный);
КвалификаторыДаты=Новый КвалификаторыДаты(ЧастиДаты,Дата);
РасширенныеДопустимыеТипы=Новый ОписаниеТипов(ДопустимыеТипы, «Число,Дата»,,КвалификаторыЧисла,КвалификаторыДаты);
ТаблицаЗначений.Колонки.Добавить(«Примечание»,
РасширенныеДопустимыеТипы);