АГРЕГАТНЫЕ ТИПЫ ДАННЫХ ОБЩЕГО НАЗНАЧЕНИЯ
3.1. ОБЩИЕ СВОЙСТВА АГРЕГАТНЫХ ТИПОВ ДАННЫХ 1С
В 1С помимо числовых, символьных данных и дат можно работать с объектами, относящимися к данным агрегатного типа. Всего в 1С определено около 30 агрегатных типов данных. Большинство из них приведено в табл. 3.1.
Агрегатные типы данных 1С
|
Таблица 3.1 |
|
Тип |
Раздел, где рассматривается или используется |
|
БухгалтерскиеИтоги |
- |
|
ВидРасчета, ГруппаРасчетов |
7.3, 7.8,7.10, 7.11,7.12 7.15 |
|
ВидСубконто |
- |
|
ГрупповойКонтекст |
1.13,5.2,5.4 |
|
Документ |
5.8,7.6,7.9 |
|
Журнал документов |
5.8.3,7.6.5,7.9.5 |
|
ЖурналРасчетов, РасчетныйПериод, ЗаписьЖурналаРасчетов |
7.1,7.2,7.4,7.13 |
|
Запрос |
5.11.3,7.4.7,7.17.4 |
|
Календарь, Праздники |
7.5 |
|
Картинка |
3.4.4 |
|
Константа |
1.7 |
|
КорректныеПроводки |
- |
|
Метаданные |
1.6, 1.7,4.1,7.5.2.3,9.3.1.2 |
|
Операция |
- |
|
Периодический |
Гл. 6,9.3.1.2 |
|
Перечисление |
1.13, Гл. 4, 7.3.3 |
|
ПланСчетов |
- |
|
Регистр |
- |
|
СписокЗначений, ТаблицаЗначений |
1.8,3.3,3.4,7.17.2 |
|
Справочник |
Гл. 5,7.3.7, 8.5.2 |
|
Счет |
- |
|
Текст |
1.10,7.17.3 |
|
Таблица |
1.9,5.11,7.17.2 |
|
Форма |
1.8, 1.9, 3.3.4, 3.4.2, 5.3.3.1, 5.3.3.2, 5.7, 5.8.2,
5.8.3, 5.8.4, 5.10.1-5.10.3, 7.4.3, 7.6, 7.9 |
|
ФС |
1.12,7.4.6 |
|
Xbase, Ключ |
7.4.6,9.3.2 |
|
Замечание. Язык 1С не предоставляет возможности для создания иных, кроме определенных в языке, агрегатных типов данных. Также нельзя изменить атрибуты (кроме реквизитов) и методы, используемые с объектами агрегатных типов.
Агрегатные типы, введенные 1С, позволяют строить модели, отражающие процессы в различных подразделениях предприятия, например на складе, в отделе снабжения или сбыта, бухгалтерии и др.
Агрегатные типы можно разделить на две группы.
В первую отнесем типы специального назначения, например Документ, Журнал-Расчетов, ПланСчетов и др. Объекты таких типов определены в конфигурации системы, поэтому, открыв ее, вы сможете просмотреть полный перечень типов первой группы и их разновидностей.
Создавая в программе тот или иной объект этой группы, прежде необходимо удостовериться, что он присутствует в конфигурации. Если это не так, то следующий код вызовет, если убрать конструкцию Попытка, ошибку исполнения, приводящую к оста- I нову вычислений:
// Невозможно создать объект Справочник.Сотрудники_2,
// поскольку его в конфигурации системы нет
// Для преодоления ошибки, чтобы избежать останова программы,
// используем конструкцию Попытка попытка
сСотр_2 = СоздатьОбъект(''Справочник.Сотруцники_2''); исключение
// Неудачная попытка создания объекта Справочник.Сотрулники_2 Сообщшъ(ОписаниеОшибкиО); конецПопытки;
После добавления в конфигурацию справочника Сотрудники_2 приведенный выше код имеет право на существование. Однако всякое изменение конфигурации связано с нарастанием проблем по ее обновлению, поэтому мы, имея скромный опыт по обустройству 1С, отложим до лучших времен рассмотрение подобных объектов.
Во второй группе агрегатных типов данных разместим типы общего назначения, такие, как Текст, СписокЗначений, ФС и др. Объекты этих типов называются внешними объектами (поскольку они не присутствуют в конфигурации). Они создаются на время исполнения программ для решения частных, предусмотренных алгоритмом задач. Функция ТипЗначения, заметим, возвращает для внешних объектов число 100. Например:
тЗнач = СоздатьОбъект("ТаблицаЗначений");
Сообщить(ТипЗначения(тЗнач)); //Напечатает 100
К одному и тому же агрегатному типу данных в 1С могут относиться разные объекты, отличающиеся в некоторых случаях структурой. Например, переменные сКД и сСотр, появившиеся в программе в результате исполнения кода
сКД = СоздагьОбъектО'Справочник.КддровыеДанные'');
сСотр = СоздатьОбьектС'Справочник.Сотрудники'');
имеют один тип - Справочник, но разную структуру, определяемую набором их реквизитов - компонентов агрегатного типа, значения которых хранятся в полях DBF- -файлов базы данных системы. Объекты одного типа будем в дальнейшем называть разновидностями типа.
Разновидности имеющихся в конфигурации типов можно вывести, использовав применяемые с метаданными методы (разд. 1.7.3).
процедура Выполнить( ) // Вывод списка справочников
ОчиститьОкноСообщенийО; // Выводятся идентификаторы справочников
для ин = 1 по Метаданные.Справочник( ) цикл
Сообщить(Метацанные. Справочник(ин). Идентификатор); конецЦикла; // для // Имеем в окне сообщений:
// Аттестация
// БазаДополнительныхНачислений // БазаНалогов
//...
конецПроцедуры // Выполнить
Замечание. Объект, например Справочник, можно создать без определения его вида, то есть так:
спр = СоздатьОбъект("Справочник"); // спр - объект типа Справочник неопределенного вида
В дальнейшем разновидность устанавливается и изменяется методом Вид, например
// Теперь спр - это объект с разновидностью типа Справочник.Сотрудники спр.Вид("Сотрудники");
Агрегатные типы данных первой группы описываются в конфигурации своими характеристиками, в качестве которых, например, для справочника Сотрудники используются следующие величины:
Идентификатор
Синоним
Комментарий
Владелец
КоличествоУровней
ДлинаКода
ДлинаНаименования
СерииКодов
ТипКода "Числовой"
ОсновноеПредставление
КонтрольУ никальности
АвтоНумерация
ГруппыВпереди
СпособРедактирования
ЕдинаяФормаЭлемента
ОсновнаяФорма
ОсновнаяФормаДляВыбора
ОбластьРаспространения
АвтоРегистрация
"Сотрудники"
"Список сотрудников предприятия"
"3"
"8"
"40"
"ВесьСправочник"
"ВВидеНаименования" " 1"
"2"
" 1" "ВДиалоге"
"0"
"Справочник.Сотрудники.ФормаСписка.Административная"
"Справочник.Сотрудники.ФормаСписка.ДляВвода"
'ВсеИнформационныеБазы"
" 1"
Идентификатор объекта задает его имя, которое, в частности, употребляется при вызове функции СоздатьОбъект.
Доступ к характеристикам типа можно получить, как мы видели, пользуясь методами для метаданных, ну и, конечно же, через предусмотренный в конфигурации интерфейс.
С каждым агрегатным типом связаны методы - процедуры и функции, позволяющие обрабатывать объекты агрегатного типа.
Изменять и/или добавлять имеющиеся в 1С для агрегатных типов данных методы нельзя; также не разрешается удалять, редактировать названия или добавлять характеристики агрегатных типов. Значения характеристик константой не являются.
Агрегатный тип имеет атрибуты - изменяемые величины, являющиеся компонентами разновидностей типа. Так, атрибутами объектов агрегатного типа Справочник являются в частности реквизиты справочника, которые ссылаются на поля DBF-файлов, хранящих используемые справочником данные. Например, справочник Сотрудники отображает данные, записанные в файл SC2.DBF и связанные с ним файлы. Имена (идентификаторы) реквизитов и соответствующих им полей DBF-файлов различаются. Реквизиты, в отличие от характеристик типа, могут удаляться, добавляться и редактироваться.
Перечень характеристик и атрибутов каждой разновидности типа первой группы можно выгрузить в текстовый файл, выбрав в конфигурации пункты меню Конфигурация - Описание структуры метаданных. Понятно, что разновидности одного и того же агрегатного типа имеют один и тот же набор характеристик (с разными значениями).
Список идентификаторов и представлений (описаний) реквизитов, например справочника Сотрудники, выведет в окно сообщений следующий, анализирующий метаданные код:
процедура Выполнить()
ОчиститьОкноСообщений();
видСпр = "Сотрудники"; // Вид справочника
Сообщить("Реквизиты справочника " + видСпр +
" (их идентификаторы и представления).");
для ин = 1 по Метаданные.Справочник(видСпр).Реквизит( ) никл
иден = Метаданные.Справочник(видСпр).Реквизит(ин).Идентификатор; предст = Метаданные. Справочник(видСпр).Реквизит(ин).Представление(); Сообщить(иден + " -" + предст);
конецЦикла; // Результат приведен после кода процедуры конецПроцедуры // Выполнить
Результат:
Реквизиты справочника Сотрудники (их идентификаторы и представления).
Оклад - Оклад Тариф - Тариф Разряд - Разряд
РазрядРабочих - Разряд рабочих ПроцентЕжемесПремии - % ежемес. премии Ставка - Ставка Категория - Категория ГрафикРаботы - График работы МестоРаботы - Место работы
Должность - Должность Подразделение - Подразделение формаТруда - Форма оплаты труда ТипСотрудника - Тип сотрудника ПрофСоюз - Членство в профсоюзе Аванс - Аванс
ОплачиватьПитание - ОплачиватьПитание
ОплачиватьПроезд - ОплачиватьПроезд
КоличествоАкций - Количество акций
ДатаСправки - ДатаСправки
СальдоПН - Сальдо по под. налогу
ВозвратПН - ВозвратПН
ДатьЛьготы - ДатъЛьготыі
ДатаРождения - ДатаРождения
СевернНадбавка - % северной надбавки
ДатаСевернСтажа - ДатаСевернСтажа
ДатаСтажаДляВыслугиЛет - ДатаСтажаДляВыслугиЛет
ПриказОприеме - ПриказОприеме
ПриказОбУвольнении - ПриказОбУвольнении •
СправкаНаНачРасч - СправкаНаНачРасч СправкаСПрМестаР - СправкаСПрМестаР РК - Районный коэффициент Военнослужащий - Военнослужащий ХО-ХО
СальдоПН_Фед - Сальдо по под. налогу в фед. бюдж.
БезВзнСРаботод - Взимать с работодателя взносы в фонды БезВзнССотр - Взимать с сотр. взносы в фонды КоэфОплаты - Коэф-т оплаты БезВзносовВПФР - БезВзносовВПФР БезВзносовВФСС - БезВзносовВФСС БезВзносовВФОМС - БезВзносовВФОМС Срочник - Срочник
ПодоходныйПосчитан - ПодоходныйПосчитан Замечания:
1. Наименование и Код являются заданными по умолчанию, не подлежащими переименованию атрибутами (реквизитами) любого справочника 1С. Атрибут Наименование удаляется, если его длина задается равной нулю. Атрибут Код удалению не подлежит.
2. Представление реквизита несет ту же нагрузку, что и синоним константы (разд. 1.7.1).
3. Значения объектов типа Справочник, Документ и Перечисление можно получить, вызвав встроенную функцию ВвестиЗначение, рассмотренную в разд. 2.5.
4. Идентификатор реквизита, например идентификатор Должность реквизита справочника Сотрудники, используется для доступа к значению реквизита. Для этого может быть пригоден следующий код (на примере разновидности типа Справоч-ник.Сотрудники):
сСотр = СоздатьОбъект("Справочник. Сотрудники");
// Устанавливаем дату, на которую выбираются периодические реквизиты справочника сСотр.ИспользоватьДату(РабочаяДата());
// Ищем сотрудника, фамилия которого начинается с подстроки стр стр = "Га";
// Значение второго параметра - нуль, следовательно,
// поиск осуществляем во всем справочнике
флаг = сСотр.НайтиПоНаименованию(стр, 0);
если флаг = 1 тогда // Сотрудник найден
// Наименование - атрибут справочника Сотрудники, Должность - его реквизит. Сообщить(сСотр.Наименование); // Вывод фамилии найденного сотрудника Сообщить(сСотр.Должность); // Должность сотрудника иначе
Предупреждение("Сотрудник, фамилия которого начинается с букв " + стр + " не найден.");
конецЕсли;
Изучение агрегатных типов мы начнем со списка и таблицы значений, объекты которых не фиксируются в конфигурации системы, но зато часто применяются в пользовательских программах. Однако прежде вновь вернемся к понятию "пустое значение", распространив его на все типы данных 1С.
3.2. ОБОБЩЕНИЕ ПУСТОГО ЗНАЧЕНИЯ
Переменная после ее объявления оператором Перем не определена, то есть имеет пустое значение, причем неопределенного типа. Например:
перем а;
// Напечатает 0, что соответствует неопределенному типу данных Сообщить(ТипЗначения(а));
Однако неопределенной переменной, употребив встроенную функцию Полу-читьПустоеЗначение, можно присвоить пустое значение некоторых имеющихся в 1С типов данных, таких, как Число;
Строка;
Дата;
Справочник;
Документ;
Счет;
ВидСубконто;
ВидРасчета;
Календарь.
Например:
// После объявления а - неопределенная переменная неопределенного типа перем а;
а = ПолучитьПустоеЗначение("Дата");
Сообщить(ТипЗначенияСтр(а)); // Напечатает Дата
а = ПолучтъПустоеЗшчение("ВидСубконто");
Сообщить(ТипЗначенияСтр(а)); // Напечатает ВидСубконто
Другие типы данных пустых значений не имеют. Например:
а = ПолучитьПустоеЗтчение("КорректныеПроводки");
// Напечатает 0, что соответствует неопределенному типу данных Сообщить(ТипЗначения(а));
Также пустое значение заданного типа можно получить, передав функции Полу-читьПустоеЗначение не имя типа, а имя разновидности типа, например
а = ПолучитьПустоеЗначение("ВидРасчета.ВыплатаЧерезБанк");
Сообщить(ТипЗначенияСтр(а)); // Напечатает ВидРасчета
При этом функция ПолучитьПустоеЗначение вернет верное значение агрегатного типа, даже если ее аргумент задает несуществующую разновидность типа. Например:
а= ПолучитьПустоеЗначение("Справочник.НетТакогоСправочника"); Сообщить(ТипЗначенияСтр(а)); // Напечатает Справочник
Добавим, что константа или определенная переменная символьного типа, если они содержат только пробелы, считаются пустыми, например
Сообщить(ПустоеЗначение(" ")); // Напечатает 1
Равное нулю число пустым не является, например
Сообщить(ПустоеЗначение(0)); // Напечатает 0
3.3. СПИСОК ЗНАЧЕНИЙ
3.3.1. СТРУКТУРА СПИСКА ЗНАЧЕНИЙ
Объекты типа СписокЗначений хранят таблицы с тремя столбцами (колонками), имеющими следующий смысл:
• значение; данные заносимые в этот столбец, могут быть любого, в том числе и агрегатного типа;
• представление значения - описание значения, или его смысл, или комментарий, или второе значение; данные этого столбца должны быть символьного типа; если это не так, то представление значения автоматически преобразовывается в символьный тип;
• пометка.
Второй столбец списка значений может не заполняться. При этом, правда, мы лишаемся методов, управляющих списком по представлению значения, таких, как Получить и Установить.
В последний столбец для каждого значения заносится число 1 или 0. В первом случае значение считается помеченным, во втором - нет. По умолчанию все заносимые в список значения не помечены.
Замечания:
1. В дальнейшем каждую строку хранимой в списке значений таблицы будем называть элементом списка.
2. В качестве значения элемента списка значений может выступать другой список значений (пример см. в разд. 2.8.5.5).
3.3.2. ПРИМЕР СПИСКА ЗНАЧЕНИЙ
Создадим для примера список значений, содержащий представленные в табл. 3.2. данные, отражающие некоторые сведения о подразделениях предприятия.
Таблица 3.2
Состав списка значений |
|
Код подразделения (значение элемента списка) |
Подразделение
(представление элемента списка) |
|
099 |
Отдел кадров |
|
100 |
Бухгалтерия |
|
111 |
Снабжение и сбыт |
|
001 |
Цех 1 |
|
002 |
Цех 2 |
|
011 |
Цех 11 |
|
|
Выполним для начала следующие действия: |
1. Занесем исходные данные в массивы кодПодр и имяПодр, а затем переместим их, используя метод ДобавитьЗначение, в список значений. Код подразделения используем для определения столбца значение, а название подразделения - для определения столбца представление значения формируемого списка значений. Эти действия произведем в процедуре Выполнить обработки Проба.
2. Для контроля выведем элементы списка в окно сообщений. Вывод осуществим в процедуре Контроль, в которой для определения числа элементов списка применяется метод РазмерСписка, а для доступа к элементу списка - метод Получить-Значение.
3. Отсортируем (метод Сортировать) список значений по кодам подразделений и вновь выполним вывод результата.
4. Вставим после 3-й позиции списка новый элемент (088, Цех 88), удалим предпоследний элемент списка и изменим имя подразделения, код которого равен 111, на новое имя, предварительно проверив, есть ли в списке элемент с таким кодом, сдвинем измененный элемент на одну позицию вверх и выведем модифицированный список. Для выполнения намеченных действий используем методы ВставитьЗначение, Удалить-Значение, НайтиЗначение, УстановитьЗначение и СдвинутьЗначение.
5. Вновь отсортируем список, но теперь уже по именам подразделений (метод Сор-тироватьПоПредставлению) и выполним вывод результата.
6. Выведем, вызывая метод ВыбратьЗначение, диалог со списком имен подразделений и выберем в нем Цех 88. Возвращенные методом значения (код цеха и его номер в списке значений) выведем в окно сообщений.
7. Преобразуем, используя метод ВСтрокуСРазделителями, итоговый список в текст.
// Предварительное описание процедуры Контроль процедура Контроль(сЗнач, этап) далее
процедура Выполнить() перем сЗнач, ин, поз;
перем кодПодр[20], подр[20]; // Векторы для имен подразделений и их кодов
перем код, нПодр; // Код подразделения и его номер
перем число Подр; // Число подразделений
перем стр; // Строка, в которую выгружается список значений
// Перед каждым запуском процедуры Выполнить будем очищать окно сообщений ОчиститьОкноСообщений();
|
'099"; |
подр[1] = |
"Отдел кадров"; |
|
100"; |
подр[2] = |
"Бухгалтерия"; |
|
111"; |
подр[3] = |
"Снабжение и сбыт |
|
’001"; |
подр[4] = |
"Цех 1"; |
|
002"; |
подр [5] = |
"Цех 2"; |
|
011"; |
подр[6] = |
"Цех 11"; |
[ числоПодр = 6; кодПодр[1] кодПодр[2] кодПодр[3] кодПодр[4] кодПодр[5] кодПодр[6]
// сЗнач - переменная (объект) типа СписокЗначений сЗнач = СоздатьОбъект("СписокЗначений"); для ин = 1 по числоПодр цикл
// Добавляем значение и его представление // (код подразделения и его название) в список значений сЗнач сЗнач.ДобавитьЗначение(кодПодр[ин], подр[ин]); конецЦикла; // для
Контроль(сЗнач, "Контрольный вывод начального списка.");
// Сортировка списка по возрастанию значений имен подразделений сЗнач.Сортировать();
Контроль(сЗнач, "Контрольный вывод отсортированного начального списка.");
// Вставка элемента (кода подразделения и его названия) после 3-го элемента списка сЗнач.ВставитьЗначение(4, "088", "Цех 88");
// Удаляем предпоследний элемент списка. Его номер равен сЗнач.РазмерСписка() - 1 сЗнач.УдалитьЗначение(сЗнач.РазмерСписка() - 1);
// Изменяем имя подразделения с кодом 111 на новое,
// если элемент с таком кодом присутствует в списке поз = сЗнач.НайтиЗначение("111");
если поз > 0 тогда // Если элемент найден
сЗнач.УстановитьЗначение(поз, "111", "Отдел снабжения и сбыта"); // Переместим измененный элемент на одну позицию вверх сЗнач.СдвинутьЗначение(-1, поз); иначе
Предупреждение("Подразделение с кодом 111 не найдено."); конецЕсли;
Контроль(сЗнач, "Контрольный вывод измененного списка.");
// Сортировка списка по возрастанию имен подразделений сЗнач.СортироватьПоПредставлению();
Контроль(сЗнач, "Контрольный вывод итогового отсортированного списка.");
// Окно выбора подразделения по его имени см. на рис. 3.1 // Установим курсор на строку, соответствующую подразделению Цех 1 // Для этого в переменную код установим код первого цеха код = "001";
флаг = сЗнач.ВыбратьЗначение(код, "Выбор подразделения", нПодр); Сообщить(РазделительСтрок + "Выбрано подразделение с кодом " + код + ". нПодр = " + нПодр); стр = сЗнач.ВстрокуСРазделителями();
Сообщить(РазделительСтрок +
"Значения элементов списка в виде строк с разделителем:" + стр); конецПроцедуры // Выполнить
процедура Контроль(сЗнач, этап) // Выводит список в окно сообщений
перем числоПодр; // Число подразделений
перем имяПодр, кодПодр; // Имя подразделения и его код
// Контрольный вывод списка сЗнач Сообщить(РазделительСтрок + этап);
числоПодр = сЗнач.РазмерСписка(); // Метод, возвращающий размер списка для ин = 1 по числоПодр цикл
// Метод ПолучитьЗначение вернет код подразделения с номером ин // и через параметр имяПодр - имя подразделения кодПодр = сЗнач.ПолучитьЗначение(ин, имяПодр);
// Тип параметра процедуры Сообщить всегда будет символьным, поскольку // выражение, задающее значение параметра, начинается с пустой строки Сообщить("" + кодПодр + " - " + имяПодр); конецЦикла; // для конецПроцедуры // Контроль
 |
|
Рис. 3.1. Диалог выбора значения списка по его представлению |
П осле последнего контрольного вывода в окно сообщений добавится следующий текст:
Контрольный вывод итогового отсортированного списка.
099 - Отдел кадров
111 - Отдел снабжения и сбыта
001 - Цех 1 011 - Цех 11
002 - Цех 2 088 - Цех 88
Выбрано подразделение с кодом 088; нПодр = 6
Значения элементов списка в виде строк с разделителем: "099","111","001","011","002","088"
Замечание. В списки значений часто переносятся данные об объектах агрегатного типа 1С, например при работе с разновидностью типа Справочник.Сотрудники в столбце значение можно разместить идентификаторы реквизитов справочника, а в столбце представление значения - представления реквизитов. Код получения идентификаторов реквизитов и их представлений см. в предшествующем разделе.
Число создаваемых в программе списков значений произвольно. Конечно, они должны иметь разные имена (по крайней мере в одной и той же области видимости). Для указания списка, с которым используется тот или иной метод, имя метода предваряется именем списка и разделяющей точкой, например
сЗнач.РазмерСписка()
3.3.3. МЕТОДЫ СПИСКА ЗНАЧЕНИЙ
Из примера видно, что методы списка значений, как это и полагается при работе с объектами подобного рода, позволяют добавлять, изменять, удалять, сортировать, находить, отображать и выбирать данные. Следует ожидать, что аналогичные методы мы обнаружим, работая, например, с таблицей значений или текстом. Полный список методов, применяемых со списком значений, приведен в табл. 3.3.
Таблица 3.3
Методы списка значений |
|
Метод |
Описание |
|
сЗнач.ДобавитьЗначение(знач, [пред]); |
Добавляет элемент со значением знач и представлением пред в конец списка |
сЗнач.ВставитьЗначение
(поз, знач, [пред], [кол]); |
Вставляет в список кол элементов со значением знач и представлением пред начиная с позиции поз списка. Должно выполняться условие 1 <= поз <= сЗнач.РазмерСписка() + 1 |
|
разы = сЗнач.РазмерСписка(); |
Возвращает число элементов в списке |
|
поз = сЗнач.НайтиЗначение(знач); |
Возвращает номер позиции элемента списка, имеющего значение знач, или нуль, если такого элемента в списке нет. При наличии в списке
нескольких элементов со значением знач
возвращается номер первого элемента, содержащего
искомое значение |
|
знач = сЗнач.ПолучитьЗначение (поз, [пред]); |
Возвращает значение элемента с номером поз и заносит в параметр пред, если он задан, представление этого элемента |
сЗнач.УстановитьЗначение
(поз, знач, [пред], [кол]); |
Заменяет кол раз существующие значения и представления элементов списка соответственно на знач и пред начиная с позиции поз. Значение параметра кол, если он опущен, равно единице |
|
|
Метод |
Описание |
|
знач = сЗнач.Получить(пред); |
Возвращает значение элемента списка по его представлению пред или пустое значение, если представление пред в списке не найдено |
|
сЗнач.Установить(пред), знач); |
Находит первый элемент списка с заданным представлением пред и заменяет существующее значение элемента списка на знач. Если элемент не найден, метод добавляет в конец списка новый элемент со значением знач и представлением пред |
|
сЗнач.УдалитьЗначение(поз, [кол]); |
Удаляет кол элементов списка начиная с указанной позиции. Значение параметра кол, если он опущен, равно единице. Если кол > 0 и указывает за пределы списка, то удаляются все элементы списка начиная с позиции поз. Если кол < 0, метод игнорируется |
|
сЗнач.УдалитьВсе( ); |
Удаляет все элементы списка. Эквивалентен вызову сЗнач.УдалитьЗначение(1, сЗнач.РазмерСписка()); |
|
сЗнач.Сортировать([напр], [поДате]); |
Сортирует элементы списка по их значениям. Если напр = 0 или опущен, то сортировка осуществляется по возрастанию значений, в противном случае -по убыванию. Если значения списка - это документы и по Дате = 1, то документы сортируются по дате, в противном случае - по значению |
сЗнач.СортироватьПоПредставлению
([напр]); |
Сортирует элементы списка по их представлениям. Если напр = 0 или опущен, то сортировка осуществляется по возрастанию значений, в противном случае - по убыванию |
|
сЗнач.СдвинутьЗначение(кол, поз); |
Перемещает элемент списка с позиции поз на кол позиций вниз, если кол > 0, или на кол позиций вверх, если кол < 0. Если параметр кол указывает на несуществующую позицию, то сдвиг выполняется либо в вершину списка, если кол < 0, либо в его конец, если кол > 0 |
|
флаг = сЗнач.Принадлежит(знач); |
Возвращает единицу, если в списке есть элемент, значение которого равно знач, или нуль -в противном случае |
флаг = сЗнач.ВыбратьЗначение
(знач, заг, [нПоз], [задержка], [способ]); |
Вызывает, если способ опущен или не равен 1 или 2, диалог, имеющий заголовок заг и содержащий список представлений элементов списка значений.
В диалоге (или окне со списком) курсор позиционирован на элементе со значением знач или на первом элементе, если значения знач в списке нет. После выбора представления и нажатия ОК возвращает 1, в параметр знач заносит значение выбранного элемента, а в параметр нПоз, если он задан, - его номер в списке. Если способ = 1, то окно для выбора отображается в виде меню, иначе, если способ = 2, окно отображается в виде небольшого списка. Смысл параметра задержка см. в табл. 2.3 |
|
Метод |
Описание |
флаг = сЗнач.ОтметитьЗначения
(знач, заг, [нПоз], [задержка]); |
Вызывает диалог (рис. 3.2), имеющий заголовок заг и содержащий список представлений элементов списка значений, и предоставляет возможность пометить или снять пометку с элемента списка.
В диалоге курсор позиционирован на элементе со значением знач или на первом элементе, если значения знач в списке нет. После выбора представления и нажатия ОК возвращает 1, в параметр знач заносит значение выбранного элемента, а в параметр нПоз, если он задан, -его номер в списке. Смысл параметра задержка см. в табл. 2.3 |
|
отметка = сЗнач.Пометка(поз, [флаг]); |
Помечает, если флаг = 1, элемент списка значений, имеющий позицию поз, или, если флаг = 0, снимает отметку с данного элемента. Если флаг опущен, то отметка элемента не изменяется. Возвращает значение отметки элемента (0 или 1), которое он
имел до вызова метода |
|
номерДо = сЗнач.ТекущаяСтрока ([номер]); |
Возвращает номер элемента списка, на котором находится курсор в элементе диалога Список или
Поле со списком, и устанавливает курсор, если задан параметр номер, на элемент списка, номер которого
совпадает со значением параметра |
|
стр = сЗнач.ВстрокуСРазделителями(); |
Преобразовывает значения списка в строку, содержащую заключенные в двойные кавычки значения списка, если они имеют нечисловой тип,
или числа, если значения списка числового типа |
|
сЗнач.ИзСтрокиСРазделителями(стр); |
Преобразовывает строку стр, содержащую разделенные запятыми последовательности символов или цифры в значения списка |
|
сЗнач.Выгрузить(знач, [поз], [кол]); |
Выгружает в список или таблицу значений знач кол элементов списка значений начиная с позиции поз этого списка. В результирующем списке (таблице) выгруженные элементы располагаются с первой позиции. При выгрузке в таблицу в ней добавляется новый столбец. Список значений, в который производится выгрузка, может быть создан функцией СоздатьОбъект, но должен быть пустым значением. Если знач не является списком или таблицей значений, то в результате выполнения процедуры Выгрузить, знач приобретет тип СписокЗначений |
 |
Рис. 3.2. Диалог после вызова сЗнач.ОтметитьЗначения (код,
"Пометка элементов списка"); сЗнач - список из приведенной вразд. 3.3.2 процедуры Выполнить; перед вызовом диалога выполнено присваивание: код = "100" |
Замечания:
1. Имя сЗнач списка значений, употребленное в табл. 3.3 перед названием методов, может быть произвольным.
2. Если метод может вызываться как функция, то он размещается в правой части оператора присваивания. Напомним, что любой метод может вызываться как процедура.
3. В методах для списка значений ПолучитьЗначение, УстановитьЗначение, УдалитьЗна-чение и Пометка должно выполняться условие 1 < =поз < =сЗнач.РазмерСписка().
4. Если в методах ВставитьЗначение, ПолучитьЗначение, УстановитьЗначение, Уда-литьЗначение и Пометка задана неверно позиция поз, то выводится сообщение "Индекс не входит в границы списка значений", метод игнорируется, вычисления продолжаются.
5. Если в методах СдвинутьЗначение и Выгрузить задана неверно позиция поз, то возникает завершающая работу программы ошибка исполнения, сопровождав-мая сообщением "Номер за пределами значения".
6. В документации по встроенному языку 1С указано, что метод СдвинутьЗначение перемещает значение списка на новую позицию. На самом деле на новую позицию перемещаются и значение, и представление, и пометка, то есть элемент списка. Аналогичные неточности присутствуют и при описании иных методов, например указывается, что метод УдалитьЗначение удаляет значения, в то время как он удаляет, если правильно заданы параметры, элементы списка.
Пример. Строка с разделителями преобразовывается в список значений сЗнач, в котором затем определяются представления и осуществляется, начиная со второго элемента, выгрузка списка сЗнач в список сЗнач2. Полученный список выводится приведений в разд. 3.3.2 процедурой Контроль.
перем сЗнач2;
// Не забываем о том, что присутствующие в символьной константе кавычки // должны повторяться дважды
стр = ......Цех 1"", ""НПК 20"", ""Отдел 48"", 24";
сЗнач.ИзСтрокиСРазделителями(стр);
// Текст процедуры Контроль см. в разд. 3.3.2
Контроль(сЗнач, "Контрольный вывод значений полученного из строки списка.");
// Определяем представление списка сЗнач, равным номеру элемента,
// которому это представление принадлежит. Значения элементов сохраняем для ин = 1 по сЗнач.РазмерСписка() цикл
сЗнач.УстановитьЗначение(ин, сЗнач.ПолучитьЗначение(ин), ин); конецЦикла;
// Переменная сЗнач2 объявлена оператором Перем. Без этого объявления ее // нельзя использовать в качестве фактического параметра процедуры Выгрузить сЗнач.Выгрузить(сЗнач2, 2); // Копирование осуществляем со второй позиции
Контроль(сЗнач2, "Контрольный вывод значений списка сЗнач2.");
Результат после второго вызова процедуры Контроль:
Контрольный вывод значений списка сЗнач2.
НПК 20 - 2 Отдел 48-3 24-4
3.3.4. СПИСОК ЗНАЧЕНИЙ КАК ЭЛЕМЕНТ ДИАЛОГА
Представления элементов списка значений могут отображаться в двух элементах
диалога: Список и Поле со списком, вставляемых в диалог в результате выбора на п а— V —“
нели Элементы диалога иконок
Вернемся вновь к обработке Проба, загрузим ее в конфигураторе, откроем закладку Диалог и приведем его к виду, представленному на рис. 3.3, дав идентификаторам элементов Список и Поле со списком соответственно имена сЗнач2 и сЗначЗ.
 |
|
Рис. 3.3. Диалог с двумя элементами для представления списка значений |
Переменные диалога сЗнач2 и сЗнач3 имеют тип СписокЗначений, и их не нужно создавать в программе, вызывая функцию СоздатьОбъект.
При вставке элемента сЗнач2 активизируем на закладке Дополнительно (рис. 3.4, а) флаг Список с пометками, а в поле Формула занесем текст Удаление( ). Для элемента сЗнач3 на закладке Дополнительно (рис. 3.4, б) зададим формулу Перенос().
Общие Дополнительно | Описание |
Формула: |Перенос!)
Г" Пропускать при вводе
Общие Дополнительно | Описание | формула: [Удаление!)
(? Список с пометками Г Пропускать при вводе
 |
|
Рис. 3.4. Дополнительные свойства элементов сЗнач2 и сЗначЗ |
Формулы Удаление( ) и Перенос( ) - это имена процедур модуля обработки. При необходимости в поле Формула (рис. 3.4, б) можно разместить имя процедуры (функции) глобального модуля системы.
Напишем теперь код, состоящий из процедур ПриОткрытии, Удаление, Перенося и Выполнить. Первая процедура формирует начальные значения списков сЗнач2 и сЗначЗ; вторая удаляет помеченные элементы списка сЗнач2 после двойного удара мыши по любому элементу списка или нажатия на Enter в момент расположения курсора на одном из элементов списка; третья переносит выбранные в списке сЗначЗ элементы в список сЗнач2. Процедура Выполнить, связанная с кнопкой диалога Пуск, восстанавливает, обращаясь к процедуре ПриОткрытии, начальные значения списков диалога.
// Инициализация списков сЗнач2 и сЗначЗ Начальный диалог приведен на рис. 3.5 // Векторы для имен подразделений и их кодов Число подразделений
процедура ПриОткрытии( ) перем ин; //
перем кодПодр[20], подр[20]; перем числоПодр; //
ОчиститьОкноСообщенийО; числоПодр = 6;
подр[1] = "Отдел кадров"; подр[2] = "Бухгалтерия"; подр[3] = "Снабжение и сбыт"; подр[4] = "Цех 1"; подр[5] = "Цех 2"; подр[6] = "Цех И";
Операторы необходимы для повторных вызовов процедуры
кодПодр[1] кодПодр[2] кодПодр[3] кодПодр[4] кодПодр[5] кодПодр[6] сЗнач2.УдалитьВсеО;
"099";
"100";
"111";
"001";
"002";
"ОН";
//
сЗначЗ.УдалитьВсеО;
для ин = 1 по числоПодр цикл
// Добавляем значение (код подразделения и его название) в список сЗнач2 сЗнач2.ДобавитьЗначение(кодПодр [ин], подр [ин]); конецЦикла; // для сЗнач2.Сортировать(); сЗнач2.Выгрузить(сЗначЗ); конецПроцедуры // ПриОткрытии
процедура Удаление() //Удаляет помеченные элементы списка сЗнач2
перем поз, размСпис;
// При удалении очередного элемента размер списка уменьшается на единицу // Этот факт отразим в переменной размСпис размСпис = сЗнач2.РазмерСписка(); поз = 1;
пока поз <= размСпис цикл
если сЗнач2.Пометка(поз) = 1 тогда сЗнач2.УдалитьЗначение(поз);
размСпис = размСпис - 1; // Размер списка сократился на единицу иначе
поз = поз + 1; // Наращиваем позицию, если нет удаления
конецЕсли; конецЦикла; // пока конецПроцедуры // Удаление
// Переносит выбранный элемент списка сЗначЗ в список сЗнач2 // Перенесенный элемент из сЗначЗ удаляется процедура Перенос() перем поз, код, имя;
поз = сЗначЗ.ТекущаяСтрока(); // Выбранная строка списка сЗначЗ
// Код и название выбранного в сЗначЗ подразделения код = сЗначЗ.ПолучитьЗначение(поз, имя);
сЗначЗ.УдалитьЗначение(поз); // Удаляем выбранное подразделение из сЗначЗ // Добавляем (переносим) удаленное из сЗначЗ подразделение в сЗнач2 сЗнач2.ДобавитьЗначение(код, имя); сЗнач2.Сортировать( ); конецПроцедуры // Перенос
// Восстанавливает первоначальные значения списков сЗнач2 и сЗначЗ процедура Выполнить()
ПриОткрытии (); конецПроцедуры // Выполнить
 |
|
Рис. 3.5. Диалог обработки Проба после исполнения процедуры ПриОткрытии |
Замечание. Список значений с пометками можно употреблять для создания интерфейсов, уподобляя каждый элемент списка флажку - Например, в отчете 1С анализ счета 20 используется список значений, представленный на рис. 3.6.
 |
|
Рис. 3.6. Список значений с пометками как элемент интерфейса |
Однако если число элементов диалога типа Флажок фиксированно, то число флажков в списке значений может быть переменным.
3.4. ТАБЛИЦА ЗНАЧЕНИЙ
3.4.1. АТРИБУТЫ ТАБЛИЦЫ ЗНАЧЕНИЙ
Таблица значений, в отличие от списка значений, может иметь произвольное число столбцов (колонок). Объект типа ТаблицаЗначений создается функцией Создать-Объект и имеет атрибуты номер Строки и идентификаторы столбцов. Первый содержит номер выбранной строки; идентификатор столбца - значение ячейки таблицы в выбранной строке. Например, если идентификатор первого столбца таблицы тЗнач имеет имя Код, то для изменения значения элемента этого столбца в пятой строке при -меним следующий код:
тЗнач.НомерСтроки = 5; // Переходим к строке 5 таблицы тЗнач
// Новое значение кода в пятой строке первого столбца таблицы тЗнач тЗнач.Код = "037";
Если в результате присваивания значение атрибута номерСтроки стало меньше нуля, то изменится код в первой строке; если оно стало больше числа строк в таблице, то код изменится в последней строке таблицы.
Если столбец при создании имени не получил, то в методах для таблицы значений ссылка на ячейку осуществляется по номеру столбца. Например, те же изменения, что и произведенные выше, обеспечит вызов
// Новое значение кода в пятой строке первого столбца таблицы тЗнач тЗнач.УстановитьЗначение(5, 1, "037");
Такое обращение возможно и в случае, когда столбец имеет имя. Однако недопустимо присваивание
тЗнач.1 = "037"; // тЗнач.1 - недопустимое имя
Поскольку имя тЗнач. 1 является недопустимым, то ошибка возникнет уже на этапе компиляции модуля.
Пример. В процедуре Выполнить обработки Проба создается таблица значений тЗнач, содержащая приведенные в табл. 3.4 данные; доступ к ячейкам таблицы осуществляется через имена идентификаторов столбцов; выбор строки производится в р е-зультате изменения значения атрибута номерСтроки.
Таблица 3.4
Состав таблицы значений |
|
Код подразделения |
Подразделение |
Число сотрудников |
|
099 |
Отдел кадров |
10 |
|
100 |
Бухгалтерия |
15 |
|
111 |
Снабжение и сбыт |
20 |
|
001 |
Цех 1 |
100 |
|
002 |
Цех 2 |
150 |
|
011 |
Цех 11 |
200 |
|
перем тЗнач; // тЗнач - переменная модуля
процедура Выполнить() // Отображает таблицу значений
// Перед каждым запуском процедуры Выполнить будем очищать окно сообщений ОчиститьОкноСообщенийО;
// Выведем номер текущей строки, используя атрибут номерСтроки Сообщить(тЗнач.НомерСтроки); // Напечатает 6 // Покажем таблицу значений, выделив в ней четвертую строку // Результат приведен на рис. 3.7
тЗнач.ВыбратьСтроку(4, "Первый просмотр таблицы значений"); тЗнач.НомерСтроки = 5; // Переходим к строке 5 таблицы тЗнач
// Новое значение кода в пятой строке первого столбца таблицы тЗнач тЗнач.Код = "037";
тЗнач.ВыбратьСтроку(, "Второй просмотр таблицы значений"); конецПроцедуры / Выполнить
процедура Заполнить( ) // Добавляет в таблицу значений строки и заполняет
перем ин, номСтроки; // их данными из векторов кодПодр, подр и колВо;
// Векторы для имен подразделений, их кодов и численности перем кодПодр [20], подр[20], колВо[20];
перем числоПодр; // Число подразделений
числоПодр = 6;
|
кодПодр[1] = |
"099" |
подр[1] = |
"Отдел кадров"; |
колВо [1] |
= 10; |
|
кодПодр[2] = |
”100”; |
подр[2] = |
"Бухгалтерия"; |
колВо[2] |
= 15; |
|
кодПодр[3] = |
"111"; |
подр[3] = |
"Снабжение и сбыт"; |
колВо [3] |
= 20; |
|
кодПодр[4] = |
"001"; |
подр[4] = |
"Цех 1"; |
колВо[4] |
= 100; |
|
кодПодр[5] = |
"002"; |
подр[5] = |
"Цех 2"; |
колВо [5] |
= 150; |
|
кодПодр[6] = |
"011"; |
подр[6] = |
"Цех 1 Г; |
" колВо [6] |
= 200; |
для ин = 1 по числоПодр цикл
тЗнач.НоваяСтрока(); // Добавляем новую строку
// Определяем, используя идентификаторы столбцов, ячейки новой строки тЗнач.Код = кодПодр [ин]; тЗнач.Имя = подр[ин]; тЗнач.Количество = колВо[ин]; конецЦикла; // для конецПроцедуры // Заполнить
процедура ПриОткрытии() // Формирует таблицу значений
// Формируем столбцы таблицы значений тЗнач.НоваяКолонка("Код", "Строка"); тЗнач.НоваяКолонка(" Имя", " Строка"); тЗнач.НоваяКолонка("Количество", "Число");
Заполнить(); // Заполняем таблицу значений данными
конецПроцедуры // ПриОткрытии
// Основная программа модуля обработки Проба состоит из одного оператора тЗнач = СоздатьОбъект("ТаблицаЗначений");
 |
|
Рис. 3.7. Таблица значений после цикла Для процедуры Заполнить |
Замечания:
1. Переменная тЗнач.НомерСтроки, если ее употребить в качестве первого параметра метода ВыбратьСтроку, например
тЗнач.ВыбратьСтроку(тЗнач.НомерСтроки, "Второй просмотр таблицы значений");
будет передана методу по значению, то есть номер выбранной строки не будет установлен в параметр тЗнач.НомерСтроки.
2. Таблица, приведенная на рис. 3.7, приобрела такой вид после появления диалоге и изменения в нем при помощи мыши ширины столбцов. Однако надлежащую используемую при отображении таблицы ширину столбца можно установить заранее, задав ее в методе НоваяКолонка, например, так:
// Формируем столбцы таблицы значений. Опуская имена необязательных параметров,
// сохраняем разделяющие их запятые
тЗнач.НоваяКолонка(''Код'', "Строка",,,, 10); // 10 - ширина первого столбца
тЗнач.НоваяКолонка(''Имя'', "Строка",,,, 20); тЗнач.НоваяКолонка(''Количество'', "Число",,,, 15);
3.4.2. РЕДАКТИРОВАНИЕ ТАБЛИЦЫ ЗНАЧЕНИЙ В ДИАЛОГЕ
Создадим в обработке Проба диалог, содержащий таблицу значений, дав ей имя тЗнач (рис. 3.8), и свяжем с таблицей процедуру Изменить, задав ее имя на закладке Дополнительно в поле Формула, в котором имя процедуры указывается с с охранением круглых скобок - Изменить().
 |
|
Рис. 3.8. Диалог для вывода списка подразделений в таблицу значений тЗнач |
Напишем код процедуры Изменить, позволяющий редактировать значение ячейки таблицы тЗнач, после двойного удара мышью по этой ячейке или после выбора ячейки и нажатия на клавишу Enter. Таблицу тЗнач заполним данными из табл. 3.4.
Алгоритм процедуры Изменить:
1. Определить, вызывая методы ТекущаяСтрока и ТекущаяКолонка, номер строки номСтроки и номер столбца номСтолбца, на пересечении которых находится редактируемая ячейка.
2. Используя метод ПолучитьПараметрыКолонки, определить тип данных столбца, с номером номСтолбца.
3. Вызвать диалог ввода данных найденного в п. 2 типа, используя функцию ВвестиЗначение, и задать в нем новое значение ячейки. При открытии диалога передать в него старое значение ячейки.
4. Записать, применив метод УстановитьЗначение, в редактируемую ячейку введен ное в п. 3 значение.
Также в модуль обработки войдут создающая таблицу процедура ПриОткрытии и инициализирующая таблицу процедура Заполнить, которую мы заимствуем из разд. 3.4.1. В процедуре Выполнить мы будем обращаться к процедуре Заполнить с тем, чтобы восстанавливать первоначальный вид таблицы значений.
процедура Изменить()
перем номСтроки, номСтолбца;
перем типДан, флаг; // Тип редактируемых данных
перем значен; // Значение редактируемой ячейки
номСтроки = тЗнач.ТекущаяСтрока(); тЗнач.ТекущаяКолонка(, номСтолбца); тЗнач.ПолучитьПараметрыКолонки(номСтолбца, типДан); значен = тЗнач.ПолучитьЗначение(номСтроки, номСтолбца);
// Передаем диалогу старое значение ячейки
флаг = ВвестиЗначение(значен, "Введите новое значение ячейки", типДан); если флаг = 1 тогда
тЗнач.УстановитьЗначение(номСтроки, номСтолбца, значен); конецЕсли;
конецПроцедуры // Изменить
процедура Заполнить() //
конецПроцедуры // Заполнить
Инициализирует таблицу значений // Берется из разд. 3.4.1
процедура ПриОткрытии() // Формирует таблицу значений
// Формируем столоцы таблицы значений. Опуская имена необязательных параметров,
// сохраняем разделяющие их запятые
тЗнач.НоваяКолонка("Код", "Строка",,,, 10); //10 - ширина первого столбца тЗнач.НоваяКолонка("Имя", "Строка",,,, 20); тЗнач.НоваяКолонка("Количество", "Число",,,, 15);
Заполнить(); // Заполняем таблицу значений данными
тЗнач.ТекущаяСтрока(З); // Позиционируем курсор на ячейку в третьей строке
тЗнач.ТекущаяКолонка(2); // и втором столбце таблицы значений
конецПроцедуры // ПриОткрытии
процедура Выполнить() // Восстанавливает таблицу значений
// Перед каждым запуском процедуры Выполнить будем очищать окно сообщений ОчиститьОкно Сообщений();
тЗнач.УдалитьСтроки(); // Удаляем все строки таблицы значений тЗнач
Заполнить();
// Заполняем ячейки таблицы значениями
// Диалог формы обработки Проба после ее загрузки приведен на рис. 3.9 конецПроцедуры
Диалог формы обработки Проба после ее загрузки приведен на рис. 3.9.
 |
|
Рис. 3.9. Таблица значений после загрузки обработки Проба Замечание. Ясно, что похожий механизм мы могли бы применить и для редакти |
рования элементов списка значений, рассмотренного в разд. 3.3.2.
3.4.3. ТЕКУЩАЯ СТРОКА ТАБЛИЦЫ ЗНАЧЕНИЙ
При работе с таблицей значений мы, обращаясь к идентификаторам столбцов, редактируем или читаем значения ячеек текущей строки. Так, если мы работаем с вышерассмотренной таблицей значений, то исполнение оператора
т.Знач.Код = "092";
приведет к изменению значения столбца под именем Код в текущей строке таблицы.
Номер текущей строки содержит атрибут номерСтроки. После создания таблицы номерСтроки = 0 в таблице просто нет строк. Однако такое же значение атрибут номерСтроки получит и при наличии в таблице значений строк после выполнения метода ВыбратьСтроки. В этом случае мы будем говорить: таблица значений позиционир о-вана до первой строки. Чтобы перейти на первую строку, достаточно вызвать метод ПолучитьСтроку, который, если не достигнута последняя строка, увеличивает номер текущей строки на единицу. Если же метод ПолучитьСтроку применяется, когда текущей является последняя строка, то таблица позиционируется вслед за ней, в атрибут номерСтроки устанавливается значение 0. Таким образом, по этому атрибуту, если он равен нулю, нельзя узнать, где мы находимся до первой строки таблицы значений или вслед за последней строкой. Приведенные сведения, иллюстрируются процедурой В ы-вестиНомСтроки, выводящей в окно сообщений значение атрибута номерСтроки. В процедуре переменная тЗнач - это любая таблица значений, например созданная и заполненная в разд. 3.4.2.
процедура ВывестиНомСтроки()
// тЗнач - переменная модуля, поэтому доступна в процедуре ВывестиНомСтроки // Позиционируемся перед первой строкой таблицы значений тЗнач тЗнач.ВыбратьСтроки();
// Напечатает 0, так как таблица позиционирована до первой строки Сообщить(тЗнач.НомерСтроки);
// Перебор строк таблицы значений начинается с ее первой строки пока тЗнач.ПолучитьСтрокуО = 1 цикл Сообщить(тЗнач.НомерСтроки); конецЦикла // пока
// Вновь напечатает 0, хотя таблица позиционирована вслед за последней строкой Сообщить(тЗнач.НомерСтроки); конецПроцедуры // ВывестиНомСтроки
Атрибут номерСтроки является ненадежным для определения номера текущей строки и в более широком смысле. Так, присваивание
тЗнач.номерСтроки = значение;
изменит значение атрибута, но не изменит номера текущей строки.
Кроме методов ВыбратьСтроки и ПолучитьСтроку, текущую строку изменяют методы ПолучитьСтрокуПоНомеру, НоваяСтрока и Сортировать. Метод СдвинутьСтр оку меняет текущую строку, если сдвигается текущая строка. В противном случае текущая строка сохраняется. Также текущая строка меняется при переносе курсора по строкам в элементе диалога Таблица значений.
Текущая строка становится неопределенной, когда:
• методы КоличествоСтрок или Свернуть уменьшают число строк до величины, меньшей чем значение (до применения метода) атрибута номерСтроки;
• метод УдалитьСтроку удаляет строку, номер которой меньше, чем значение (до применения метода) атрибута номерСтроки или равен ему.
Текущая строка становится равной нулю после выполнения методов Выбрать-Строки и Очистить.
3.4.4. МЕТОДЫ ТАБЛИЦЫ ЗНАЧЕНИЙ
Методы приведем в трех таблицах. В первой (табл. 3.5) перечислим сами методы с указанием их назначения; во второй (табл. 3.6) - синтаксис вызова методов, а в третьей (табл. 3.6) - описание (в алфавитном порядке) их параметров.
Таблица 3.5
Методы таблицы значений |
|
Метод |
Что делает |
|
КоличествоКолонок |
Устанавливает/возвращает число столбцов в таблице значений |
|
НоваяКолонка |
Добавляет в таблицу значений вслед за последним столбцом новый столбец |
|
ВставитьКолонку |
Вставляет в таблицу значений столбец с заданным номером |
|
УдалитьКолонку |
Удаляет заданный столбец из таблицы значений |
УстановитьПараметры
Колонки |
Изменяет параметры столбца |
ПолучитьПараметры
Колонки |
Возвращает номер или идентификатор столбца, а через параметры метода - параметры столбца таблицы значений |
|
КоличествоСтрок |
Устанавливает и/или возвращает число строк в таблице значений |
|
НоваяСтрока |
Добавляет строку в таблицу значений |
|
УдалитьСтроку |
Удаляет строку из таблицы значений |
|
УдалитьСтроки |
Удаляет все строки из таблицы значений |
|
ВыбратьСтроки |
Позиционирует таблицу значений до первой строки и позволяет перебирать, применяя метод ПолучитьСтроку, строки таблицы значений начиная с ее первой строки |
|
ПолучитьСтроку |
Осуществляет переход на следующую строку таблицы значений. Может употребляться как с методом ВыбратьСтроки, так и самостоятельно, например после метода
ПолучитьСтрокуПоНомеру (см. пример 2 после табл. 3.7) |
|
ВыбратьСтроку |
Открывает диалог, позволяющий выбрать строку в таблице значений. Значение атрибута номерСтроки после выбора строки в диалоге не меняется |
ПолучитьСтрокуПо
Номеру |
Позиционирует таблицу значений на заданную параметром номСтроки строку, которая после выполнения метода становится текущей |
|
СдвинутьСтроку |
Перемещает текущую или заданную параметром номСтроки строку таблицы значений на заданное число строк |
|
|
Метод |
Что делает |
|
УстановитьЗначение |
Устанавливает значение в заданной ячейке таблицы значений |
|
ПолучитьЗначение |
Возвращает значение ячейки таблицы значений |
|
НайтиЗначение |
Находит ячейку таблицы значений, содержащую заданное значение. Если в таблице несколько одинаковых значений, то находится первая от начала таблицы ячейка с искомым
значением |
|
Сортировать |
Сортирует таблицу значений. Правила сортировки задаются символьным выражение, содержащим идентификаторы и/или номера столбцов, например "КодПоставщика, +Материал, -3".
Если перемещается текущая строка, то и соответствующим образом меняется значение атрибута номерСтроки |
|
Очистить |
Удаляет из таблицы все строки и столбцы |
|
Итог |
Суммирует значения заданного столбца |
|
Заполнить |
Устанавливает значения в заданных столбцах таблицы значений в пределах заданного диапазона строк |
|
Свернуть |
Заменяет одинаковые в заданных столбцах строки на одну, суммируя данные в указанных столбцах. Таблица, к которой применяется метод, может быть неотсортированной |
|
Выгрузить |
Копирует таблицу значений или ее часть в другую таблицу значений или в столбец значение списка значений. Копирование осуществляется по строкам, если данные переносятся в список значений. После применения метода Выгрузить таблица значений, в которую выгружаются данные, будет содержать только те столбцы и строки, которые задаются параметрами метода |
|
Загрузить |
Копирует целиком одну таблицу в другую. После применения метода Загрузить таблица-приемник будет содержать только те столбцы и строки, которые имеет таблица-источник |
|
ВидимостьКолонки |
Отображает/скрывает столбцы таблицы значений, а также изменяет позицию указанного столбца. Метод оказывает воздействие на элемент диалога Таблица значений (рис. 3.9) и диалог, отображаемый методом ВыбратьСтроку |
|
ТекущаяСтрока . |
Устанавливает/возвращает в элементе диалога Таблица значений строку, в которой отображается курсор. Значение атрибута номерСтроки метод не меняет |
|
ТекущаяКолонка |
Устанавливает/возвращает в элементе диалога Таблица значений столбец, в котором отображается курсор. Результат применения методов ТекущаяСтрока и ТекущаяКолонка приведен на рис. 3.9 |
|
Фиксировать |
Делает недоступными в элементе диалога Таблица значений заданное число строк и столбцов |
Выводить
Пиктограммы |
Выводит в заданном столбце элемента диалога Таблица значений вместо занесенных в него данных пиктограммы из ВМР-файла, подсоединенного к элементу диалога в закладке Картинка в окне Свойства таблицы. Порядок создания и употребления пиктограмм разбирается в примере 8 после табл. 3.7 |
Таблица 3.6
Синтаксис вызова методов таблицы значений |
|
Синтаксис вызова |
Комментарий |
числоСтобцовДо =
тЗнач.КоличествоКолонок
([числоСтобцов]); |
Число столбцов не меняется, если параметр числоСтобцов не задан |
номНовСтолбца = тЗнач.НоваяКолонка
([иден], [тип], [длина], [точность], [заг], [ширина], [формат], [выравнивание]); |
Если тип не задан, то в добавляемом столбце можно хранить любой тип |
|
номНовСтолбца = тЗнач.ВставитьКолонку ([иден], [номНовСтолбца], [тип], [длина], [точность], [заг], [ширина], [формат], [выравнивание]); |
Если идентификатор не задан, то обращение к столбцу выполняется по его номеру |
|
тЗнач.УдалитьКолонку(иден | номСтолбца); |
В качестве параметра передается либо идентификатор, либо номер столбца |
тЗнач.УстановитьПараметрыКолонки (иден | номСтолбца,
[тип], [длина], [точность], [заг], [ширина], [формат], [выравнивание]); |
Значение параметра столбца сохраняется, если опущен соответствующий ему параметр метода |
иден | номСтолбца =
тЗнач.ПолучитьПараметрыКолонки (номСтолбца | иден, [тип], [длина], [точность],[заг], [ширина], [формат], [выравнивание]); |
Возвращает идентификатор столбца, если первый параметр - это номер столбца, и номер столбца, если первый параметр - это идентификатор столбца. Все параметры, кроме первого, являются выходными |
числоСтрокДо =
тЗнач.КоличествоСтрок
([числоСтрок]); |
Если числоСтрок > числоСтрокДо, то добавляемые в конец таблицы строки содержат пустые значения. Если числоСтрок < числоСтрокДо, то атрибут номерСтроки обнуляется. Число строк не меняется, если параметр метода опущен |
номНовойСтроки =
тЗнач.НоваяСтрока
([номНовойСтроки]); |
Если параметр номНовойСтроки отсутствует или больше числа строк в таблице, то строка добавляется в конец таблицы значений |
|
тЗнач.УдалитьСтроку([намСтроки]); |
Если параметр номСтроки не задан, то удаляется текущая строка. Изменение текущей строки осуществляется, например, методом ПолучитьСтрокуПоНомеру (разд. 3.4.3) |
|
тЗнач.УдалитьСтроки(); |
После выполнения значение атрибута номерСтроки равно нулю |
|
тЗнач.ВыбратьСтроки(); |
Часто предшествует методу ПолучитьСтроку |
|