1. Для того, чтобы в табличной части после выбора номенклатурной позиции подставлялась цена, а при проставлении количества рассчитывалась общая сумма, необходимо: прописатьнужных свойствах соответствующих колонок имена обработчиков событий- 2. В понятие "Данные" для элементов управления формы не входят: переменные, определенные в модуле данной формы+ 3. Реквизит формы: доступен в контексте этой формы 1. Для обработки события у элемента управления можно определить: только один обработчик события+ 2. Как создать реквизит формы?: добавить элемент управления и указать в свойстве "Данные" имя нового реквизита- обоими способоами 3. Каким образом в режиме Конфигуратора визуально проверить действие привязок на то, как будет выглядеть форма при изменении ее размеров в режиме 1С:Предприятие 8.0? меню Форма пункт Проверить+ 4. Где размещается описание обработчика события "Нажатие" кнопки диалога: в модуле формы+ 5. При оформлении диалога формы можно определять... любое количество элементов формы, связанных с одним и тем же элементом данных+ 6. В свойство "Данные" элемента формы нельзя выбрать: реквизит, если он имеет тип "Хранилище значений"+ 7. Когда возникает событие "При активизации строки"?при переходе на другую строку списка+ 8. Как сделать невидимым в режиме Конфигуратора элемент формы Разделитель? выбрать значение Нет рамки для свойства Рамка элемента формы+ 9. Основной реквизит формы…отсутствует у форм произвольного типа+ 10. Обработчики событий в модуле формы можно определять: для табличных частей 11. При оформлении диалога формы можно определять... только один элемент формы, связанный с одним элементом данных- 12. В свойство "Данные" элемента формы нельзя выбрать: реквизит, если он имеет тип "Хранилище значений"+ 13. Нестандартный порядок расшифровки: доступен в модуле соответствующего объекта- 1. Обработчики событий в модуле формы можно определять: для реквизитов объекта- 2. Какой элемент управления позволяет изменить взаимное расположение полей? разделитель+ Для обращения в модуле формы (обработчике события) к данным текущей строки (выбранной пользователем) табличной части объекта необходимо: использовать свойства и методы формы, элементов формы -/обратиться напрямую по имени реквизита табличной части в контексте текущей строки-/обратиться через точку от имени табличной части (Товары.Номенклатура)- В модуле приложения...:нет ограничений на описание переменных, процедур, функций+ Можно ли программно удалить элемент формы в диалоге?: нельзя- /можно только в том случае, если он программно и добавлен Можно ли разрешить форме быть "прячущейся" (.РазрешитьСостояниеПрячущееся=Истина;)?: можно только до открытия формы+ К свойству объекта можно обратиться через:скобки: Объект[ИмяСвойства]- обоими При программном поиске элемента справочника в случае, если с указанными параметрами ничего не найдено, то метод возвратит… пустую ссылку+ Для обращения к предопределенному элементу справочника необходимо:найти его по имени: Справочники.ИмяСправочника.ИмяЭлемента+ В общих модулях...: нет ограничений на описание переменных, процедур, функций- Когда можно отказаться от записи объекта в обработчике события?: либо в "перед записью", либо "при записи": все+ При записи документа (в любой из форм документа)...: первоначально выполняется процедура "При записи" модуля объекта, затем - обработчик события "При записи" формы+ Для вывода значения переменной в табличный документ (на печать) /получить именованную область, записать значение переменной в параметр полученной именованной области и затем включить область в табличный документ+ Какую из ниже приведенных строк нельзя использовать в модуле внешнего соединения? СпрОбъект=Справочники.Номенклатура.СоздатьЭлемент()- При определении процедур и функций...: порядок следования описания процедур и функций значения не имеет+ 1. Ресурс у регистра сведений может иметь тип: любой + 2. Ресурс у регистра накопления может иметь тип: числовой+ 3. Подчиненный объект "Измерение" может быть у объектов вида: все+ 4. Табличные части могут быть у объектов вида: у всех + 5. При записи в регистр накопления дата движения: жестко привязывается к дате документа, если документ проводится оперативно - 6. Вариант проведения документа (оперативно или нет) ... для отслеживания варианта проведения необходимо обратиться к соответствующему методу глобального контекста -/в модуль проведения передается параметр с вариантом проведения 7. Для просмотра движений документа по какому-либо регистру, необходимо...: воспользоваться кнопкой "перейти" в панели инструментов журнала + 8. При определении справочника в конфигураторе было указано, что он редактируется "обоими способами". Может ли пользователь, работая с определенной формой списка изменить способ редактирования (с "в списке" на "в диалоге")?: не может - / кнопку 9. Режим непосредственного удаления в пользовательском режиме…: доступен для обоих видов объектов + 10. Набор текста в поле, имеющем агрегатный тип значения (справочник Номенклатура) ...: недопустим- 11. При проведении в Неоперативном режиме…при использовании данных из регистров автоматически получаются данные, актуальные только на момент проведения документа- / при использовании данных из регистров нужно получить данные, актуальные только на момент проведения документа 12. При указании свойства документа "Удалять движения" в состояние "Не удалять движения автоматически" …: автоматически снимает право "ОтменаПроведения"- при перепроведении документа перестают автоматически удаляться его старые движения - 13. Если документу в конфигураторе разрешено оперативное проведение, то... документ можно оформить только на текущую дату и текущее время - 14. При записи в регистр сведений (с периодичностью по регистратору) на произвольные даты (отличные от даты документа) в поле "Период" будет находиться: записываемая дата 15. Изменение границы рассчитанных остатков для соответствующих регистров накопления производится… по усмотрению пользователя+ При указании свойства документа "Удалять движения" в состояние "Не удалять движения автоматически" … :перестает выполняться интерактивное действие "Отмена проведения" (становится неактивным в контекстном меню)- К какой группе объектов конфигурации относится объект "Интерфейсы"? документы- Изменение границы рассчитанных остатков для соответствующих регистров накопления производится… по усмотрению пользователя+ При определении справочника в конфигураторе было указано, что он редактируется "обоими способами". Может ли пользователь, работая с определенной формой списка изменить способ редактирования (с "в списке" на "в диалоге")? : может, используя кнопку, расположенную в командной панели управления справочником+ В качестве регистратора у регистра сведений может выступать: любой объект- Справочник может быть подчинен: нескольким справочникам и планам видов характеристик+ При попытке записи в регистр сведений "Записи" со значениями измерений, комбинация которых уже прописана в регистре,... происходит замещение записи- Можно ли изменить набор свойств у объекта конфигурации? для каждого объекта конфигурации набор свойств жестко определен программой и не может быть изменен. Однако на этапе конфигурирования можно задать конкретные значения для каждого из свойств, определяя его поведение в режиме 1С:Предприятие+ Ключ может быть произвольного типа: у структуры- Какое из основных свойств объекта конфигурации позволяет представлять название объекта в окнах 1С:Предприятия в удобочитаемом виде (с использованием пробелов)? синоним+

п.(пзегт(папе разе(К, ч))

Встзазяет значение ч в объект п в позишпо, обоэмаченную ключом 1с.

Если уже существует иеюпорае значение, соответствующее ключу 1с, то оно не изменяется. Возвращает объект типа рат гешр::зтегатог, Ьоо1>, первый компонент которого указывает на элемент с заданным ключом, а второй означает, был ли всшвлен новый элемент. Обратите внимание на то, по пвраыетр вальсе ра1 г генерирует объект типа ра(г ск, ч», который преобразуется посрелстаом функции зпзегт в объект типа раз г

п.узпб(1с)

Возвращает птератор, который узшзывает на элемент (если такой сушествует), смпанный с ключом 1с. Если такой элемент не существует, возвращает значение п.епбО Генерирует сбьект тина раз г, который ссмермит кюоч и значение, с которым свезен этот юпоч, в позиции, обозначенной нтератором те. Таким образом, элемент те->Г(гьт имеет тип сопьт к и прглставвяет кюоч, а элемент те->ьесопб имеет тип у и прглставляет значение, соответствующее этому ключу

Б.З. Алгоритмы

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

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

Вкюочает сбъяввения лвя общих алгоритмов

ассппп1ате(Ь, е, т)

ассппп1ате(Ь, е, т, Г)

Опрепелен в заголовке. Создаст временный сбьект о1у такого же типа и с таким же значением, как у объекта т. Для ка:каото вхоанопз итератора те в диапазоне (Ь, е) вычисляет аду" = абу + *тт или абу" = Г(аб)", *зт), в зависимости от формы функции ассппп1ате, которая была вызвана. Результат прелстзаляет собой копию объекта абу. Обратите внимание на то, чго поскольку оператор "+" может быль перегруженным, даже первая форма функции ассппп1ате может работать с типами, отличными от встроенных арифмецгюскил типоа Например, мы можем использошть алгоритм ассппп1ате двя конкатеыщии всех строк в копюйнере

Б.З. Алгоритмы

Ь(па~у зевгсп(Ь, е, с)

Возвращает значение типа Ьоо1, оягачаюшее, принаалежит ли значение с (отсортированной) паслгловагельнасти, ограниченной однонаправленными итератсрами Ь и е

сору(Ь, е, б)

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

ерпв1(Ь, е, Ь2)

ерпв1(Ь, е, Ь2, р)

Воз~шашест значение типа Ьао1, означающее, равны ли элементы погледомпельност, зааднной входными итератарами Ь и е, элементам последовательности тато же размера, начало когсрой задано входным итератаром Ь2. Для проверки использует прспикат р или оператор "=", если предикат р не задан

Н 11(Ь, е, с)

Усганавливает элементы паслепоеательности, заданной псиными итератарами Ь и е, равными значению с. Возвращает чотб-значение г(пб(Ь, е, с)

г(п0 (г(Ь, е, р)

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

1ех(содгврш св1 сопрвге(Ь, е, Ь2, е2)

1ех(содгврп(св1 сопрвге(Ь, е, Ь2, е2, р)

Возврешает значение типа Ьоо1, означающее, меньше ли послеповательнасть элементов вдиапезоне [Ь, е) послепоеательности элементов в диапазоне [Ь2, е2). Для сравнения элементов используется преликат р или оператор "

пвх(с1, с2)

Возвращает бгпьшее (двя функпии пвх) или меньшее (ввя функпии ьпп) кз значений, заданных аргумепщми с1 и с2, которые дшпкны имеш пдигпковый тип пвх е1епепс(Ь. е) птп е1епепс(Ь, е) Возвращает итератор, указывающий на наибольший (наименьший) элемент в паслгпоеательнасти, заданной Однонаправленными игераго- рами Ь не

Приложение Б. Стандартная библиотека (краткий обзор)

Умолчания, ограничения и правила - это необязательные атрибуты, которые мож­но определять по колонкам и таблицам базы данных. Умолчания (зна­чения по умолчанию) - это значения, которые заносятся в определенную колонку. Ограничения (constraints) используются как способ идентифицирования допустимых значений для колонки (чтобы откло­нять недопустимые значения), а также как средство обеспечения целостности дан­ных в таблицах базы данных и между связанными таблицами. Ограничение только по одной колонке называется ограничением на значение (колонки):оно ограничивает значения только этой колонки. Ограничение, которое влияет на несколько колонок, называется ссылочным ограничением:в этом случае комбинация значений для колонок, указанных в данном ограничении, должна отвечать требованиям этого ограни­чения. Имеется пять типов ограничений: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY и CHECK.

Null-значение (null value) - это неизвестное значение, для которого применяется обозначение NULL. Null-значение в колонке обычно означает, что для данной строки этой колонки нет данных, потому что значение неизвестно, либо не имеет смысла, либо не задано или будет задано в будущем. Null-значения - это не пустые значения и не значения числа 0, их настоящие значения неизвестны (unknown), поэтому никакие два null-значения не являются равными.

Свойство IDENTITY . Когда вы создаете таблицу, вы можете задать одну из колонок как идентифицирующую колонку (identity column), добавив к определению колонки свойство IDENTITY. Если колонка создается со свойством IDENTITY, то SQL Server автоматически генерирует для этой колонки значение строки, рассчитываемое по начальному значе­нию и значению приращения. Начальное значениеявляется значением идентификации для первой строки, вставленной в таблицу. Приращение - это величина, на которую SQL Server увеличивает значение идентификации для последовательно вводимых строк. Каждый раз при вводе стро­ки SQL Server присваивает текущее значение идентификации элементу данных в колонке идентификации, вводимому в новую строку. Следующая введенная строка получит значение идентификации, большее, чем текущее максимальное значение идентификации на величину приращения. Идентифицирующие колонки обычно применяются в ограничениях первичного ключа в таблицах, благодаря которым возможна уникальная идентификация строк. Например, если вы зададите IDENTITY(1, 10), то значение идентифицирующей колонки для первой введенной строки будет равно 1, для второй строки будет равно 10, для третьей строки - 20, и т.д. Если начальное значение или приращение не задать, то для них будут применяться значения по умолчанию, равные 1 и 1. Идентифицирующие ко­лонки не могут содержать значения по умолчанию и для них не разрешено приме­нение null-значений. В каждой из таблиц может иметься только одна идентифици­рующая колонка.


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

SET IDENTITY INSERT имя.таблицы ON

При помощи этого оператора можно вставить строку и назначить нужное вам зна­чение идентифицирующей колонки. Закончив ввод строки, нужно отменить воз­можность вставки в идентифицирующую колонку при помощи такого оператора:

SET IDENTITYINSERT имя_таблицы OFF

После этого, SQL Server, в качестве начального значения, применяемого при добавлении следующих строк, возьмет самое большое значение из данной колонки.

Создание умолчания для колонки с помощью оператора CREATE TABLE является предпочтительным, стандартным методом. Следующий оператор создает в базе дан­ных MyDB таблицу, содержащую умолчания для обеих колонок, - columnA (типа char) и columnB (типа int):

CREATE TABLE MyTable

(columnA char(15) NULL DEFAULT "шт",

columnB int NULL DEFAULT 0)

Значение по умолчанию «шт» для колонки columnA совместимо с типом данных char этой колонки, и значение по умолчанию 0 для колонки columnB совместимо с типом данных int. Если при встав­ке новой строки в таблицу не указывается конкретное значение для одной или обеих колонок, то используется соответствующее значение по умолчанию. Поэтому един­ственным способом присваивания этим колонкам значения NULL является явная вставка NULL. Null-значения допустимы, поскольку для обеих колонок указан атрибут NULL. Если бы колонки были определены как NOT NULL, то вы не могли бы выполнять явную вставку значения NULL.

Ограничение PRIMARY KEY используется, чтобы задать первичный ключтаблицы, представляемый колонкой или набором колонок, уникальным образом идентифицирующих строку таблицы. Поскольку первичный ключ идентифицирует строку, соответствующая колонка никогда не содержит значения NULL. Если вы определяете ограничение PRIMARY KEY по набору коло­нок, это ограничение указывает, что комбинация значений этих колонок должна быть уникальной для каждой строки. Ограничение PRIMARY KEY не допускает дублированных значений. Если ограничение PRIMARY KEY присва­ивается колонке или набору колонок, то по этой колонке или колонкам первичного ключа автоматически создается уникальный индекс. Таблица может иметь только одно ограничение PRIMARY KEY. Колонка с атри­бутом IDENTITY хорошо подходит для первичного ключа. Следующий оператор T-SQL представляет один из способов задания колонки SSN как первичного ключа, когда вы определяете таблицу.

CREATE TABLE customer

midinit char(1) NULL,

last_name char(20) NOT NULL,

Cust_phone char(10) NULL)

Используя альтернативный способ, вы можете присвоить имя этому ограниче­нию, добавив ключевое слово CONSTRAINT. Чтобы присвоить имя PK_SSN ваше­му ограничению PRIMARY KEY, используйте следующий оператор:

CREATE TABLE customer

(first_name char(20) NOT NULL,

midinit char(1) NULL,

last_name char(20) NOT NULL,

SSN char(11) CONSTRAINT PK_SSN PRIMARY KEY,

cust_phone char(10) NULL)

Вы можете также задать ограничение PRIMARY KEY после того, как определе­ны все колонки таблицы. При использовании этого синтаксиса имя колонки долж­но быть заключено в круглые скобки и указано после предложения CONSTRAINT, как это показано в следующем операторе:

CREATE TABLE customer

(first_name char(20) NOT NULL,

midinit char(1) NULL,

last_name char(20) NOT NULL,

cust_phone char(10) NULL,

CONSTRAINT PK_SSN PRIMARY KEY (SSN))

Ограничение UNIQUE обеспечивает, что в колонке или наборе колонок не будут допускаться дублированные значения; иными словами, обеспечивается уникаль­ность значений в этой колонке или наборе колонок. Для поддержки этой уникаль­ности SQL Server создает по умолчанию уникальный индекс по колонке или колонкам, указанным в ограничении UNIQUE. Ограничение UNIQUE можно использовать для любой колонки, которая не яв­ляется частью ограничения PRIMARY KEY. Ограничение UNIQUE можно использовать для колонок, в которых разрешены null-значения, в то время как ограничения PRIMARY KEY нельзя использовать для таких колонок. На колонку с ограничением UNIQUE мо­жет ссылаться ограничение FOREIGN KEY. По одной таблице можно задавать несколько ограничений UNIQUE, пока общее число индексов для этой таблицы не превышает 250 индексов.

Чтобы создать ограничение UNIQUE по таблице с помощью T-SQL, используй­те оператор CREATE TABLE. Например, следующий оператор создает таблицу customer (покупатель) с ограничением UNIQUE по колонке SSN в виде индекса:

CREATE TABLE customer

(first_name char(20) NOT NULL,

midinit char(1) NULL,

last_name char(20) NOT NULL,

SSN char(11) NOT NULL UNIQUE CLUSTERED,

cust_phone char(10) NULL)

Ограничение CHECK используется, чтобы ограничить множество допустимых для колонки значений определенными значениями. Значения, которые используются при вставке в колонку или обновлении колонки, проверяются на истинность (зна­чение TRUE) указанного в ограничении булева условия поиска. Например, если бы нам нужно было ограничить диапазон возможных значений, допустимых для ко­лонки price (цена) таблицы items, величинами от $0,01 до $500,00, то мы использо­вали бы следующий оператор:

CREATE TABLE items

(itemname char(15) NOT NULL,

itemid smallint NOT NULL IDENTITY (1,1),

price smallmoney NULL,

item_desc varchar(30) NOT NULL DEFAULT "none",

CONSTRAINT PK_ itemid PRIMARY KEY (itemid),

CONSTRAINT CK_price CHECK (price >=0.01 AND price <= 500.00))

Создание и модифицирование ограничений с помощью Management Studio

Чтобы создать таблицу, раскройте в ле­вой панели Management Studio папку сервера и папку базы данных, щелкните правой кнопкой мыши на папке Tables (Таблицы) и затем выберите из контекстного меню пункт New Table (Создать таблицу). Чтобы появилось окно Design Table для какой-либо существующей таблицы, сначала щелкните на папке Tables, щелкните правой кнопкой мыши на имени этой таблицы в правой панели и затем выберите из кон­текстного меню пункт Design Table.

Чтобы указать, можно или нельзя использовать null-значения в какой-либо колон­ке, просто установите или сбросьте соответствующий флажок в колонке Allow Nulls (Разрешить null-значения) окна Design Table. Вы можете задать этот параметр при создании таблицы или при ее модифицировании.

Чтобы создать или модифицировать ограничение UNIQUE с помощью Management Studio , выполните следующие шаги:

1. В панели инструментов окна Design Table щелкните на кнопке Indexes/Keys.

  1. Появится следующее окно, позволяющее создавать, редактировать и удалять ограничения, связанные с первичными и уникальными ключами

Выберите имена колонок, которые хо­тите включить в ограничение и определите для него свойства.

Вы можете задать ограничение PRIMARY KEY по одной колонке или по несколь­ким колонкам. Эта колонка или колонки должны уникальным образом идентифи­цировать каждую строку таблицы. Чтобы задать ограничение PRIMARY KEY, вы­полните следующие шаги:

  1. В окне Design Table выберите колонку, щелкнув на одной из ячеек в ее строке. (Вы можете выбрать несколько колонок, удерживая клавишу Ctrl и щелкая на серых ячейках слева от имен колонок.)

  1. Щелкните правой кнопкой мыши на одной из выбранных колонок и выберите из контекстного меню пункт Set Primary Key (Задать первичный ключ). Слева от колонок, которые вы задали для первичного ключа, появится изображение не­большого ключа.
  2. Если вам нужно переместить ограничение PRIMARY KEY в другую колонку, просто задайте эту новую колонку как первичный ключ. От вас не требуется уда­лить сначала явным образом исходный первичный ключ - SQL Server удалит и снова создаст для вас индекс PRIMARY KEY. Вы можете также модифицировать индекс PRIMARY KEY в окне Properties. Ваши измене­ния начнут действовать после того, как вы сохраните вашу работу, щелкнув на кнопке Save в панели инструментов.

Чтобы создать ограничение CHECK с помощью окна Design Table, откройте это окно для таблицы, с которой хотите работать, и выполните следующие шаги.

1. Щелкните правой кнопкой мыши на окне Design Table и выберите из контекст­ного меню пункт Properties, чтобы появилось окно Properties. Щелкните на вкладке Check Constraints (Ограничения Check и щелкните на кнопке New для таблицы.

3. Обратите внимание на три флажка внизу этого окна. Установка флажка Check existing data on creation означает, что существующие данные таблицы будут проверяться на соответствие ограничению CHECK и если они не согласуются, то ограничение не будет создано. Установка флажка Enforce constraint for replication (Проверять ограничение для репликации) означает, что данное ограничение бу­дет проверяться при репликации данных. Установка флажка Enforce constraint for INSERTS and UPDATEs просто означает, что ограничение CHECK будет активизировано. Если не установить этот флажок, то данное ограничение будет создано, но оно не будет активизировано, т.е. не будет оказывать никакого влияния.

4. Щелкните на кнопке Close и затем щелкните на кнопке Save, чтобы сохранить новое ограничение. Чтобы модифицировать ограничение CHECK, используйте вкладку Check Constraint для изменения имени (Constraint name), выражения (Constraint expression) и флажков.

Вы можете также использовать вкладку Check Constraints для удаления ограни­чения CHECK, выбрав в списке Selected Constraint (Выбранное ограничение) имя ограничения, которое хотите удалить, и щелкнув на кнопке Delete.

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

  1. Название и цель работы
  2. Индивидуальное задание
  3. Скрипты на создание пользовательского типа данных и таблиц БД, в соответствии с индивидуальным заданием

Контрольные вопросы

  1. Перечень поддерживаемых типов данных?
  2. Пользовательский тип данных. Назначение и способы создания?
  3. Способы определения таблиц?
  4. Назначение умолчаний, правил и ограничений?
  5. Перечень поддерживаемых умолчаний, ограничений, правил?
  6. Способы назначений умолчаний, ограничений, правил
  7. Что представляют собой Null-значение?
  8. Свойство колонки IDENTITY?

О чем эта статья

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

  • Что такое универсальные коллекции, когда и в каких случаях их необходимо использовать?
  • Что общего у всех универсальных коллекций? Какие приемы можно использовать для работы со всеми ними?
  • Что такое массив, как и когда его использовать? Какие у него есть методы?
  • Зачем использовать структуру? В чем её отличие от массива?
  • В каких случаях использовать список значений? Как отобразить его на форме?
  • Соответствие – что это и когда его использовать? В чем преимущества относительно структуры?
  • Для чего используется таблица значений? Как описать ее структуру? Как добавить/удалить строки? Как вывести ее на форму?
  • Дерево значений – для чего используется? Как заполнить и вывести на форму? Как с ним работать?

Применимость

В статье рассматривается платформа 1С:Предприятие 8.3 актуальной редакции.

Как в 1С работать с универсальными коллекциями

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

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

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

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

Коллекция может создаваться в результате работы какой-либо функции (функция возвращает в качестве значения универсальную коллекцию).

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

Например: НашМассив = Новый Массив;

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

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

Соответствующее описание конструктора есть в синтакс-помощнике.

Таким образом, используя параметры конструктора, можно сразу задать желаемое поведение данного объекта.

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

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

Для универсальных коллекций существуют такие общие понятия, как индекс и номер. Каждый элемент коллекции имеет индекс. При этом индекс начинается с нуля.

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

Например, НашМассив . Обратите внимание, в этом случае система возвращает элемент Массива с индексом 3, а по порядку это четвертый элемент Массива.

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

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

Для всех коллекций используется обход элементов коллекции. Обход возможен двумя способами: циклом Для и циклом Для каждого из .

Для большинства универсальных коллекций применимы методы: Количество, Индекс, Добавить, Вставить, Удалить и Найти.

Количество – это функция, которая возвращает количество элементов коллекции. Она может использоваться перед циклом Для , как представлено на рисунке.

Метод Индекс существует не у всех коллекций, а только у тех, на элементы которой можно сослаться. В качестве примера можно привести ТаблицуЗначений .

ТаблицаЗначений – это определенная коллекция строк, в строках могут содержаться разные колонки с разными типами значений.

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

Метод Индекс позволяет определить, какой индекс соответствует данной строке (т.е. текущую позицию строки в таблице). Значения индекса начинаются с нуля.

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

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

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

Синтаксис: Вставить (,)

Первым параметром указывается индекс, в который будет вставлено новое значение. Т.е. мы, например, можем указать, что каждое значение нужно вставлять в начало списка (второй способ на рисунке выше).

Для удаления элементов из коллекции используется метод Удалить . В методе Удалить указывается по индексу, какой элемент мы будем удалять.

Синтаксис: Удалить()
Пример использования: НашМассив.Удалить(5);

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

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

Например, в ТаблицеЗначений можно указать те строки, те колонки, в которых нужно осуществлять поиск.

Если значение найдено, то данный метод возвращает индекс или определенную строку. Если значение не найдено, возвращается значение типа Неопределено . Применительно к Массиву возвращается Индекс , либо значение Неопределено .

Пример использования: НашаПеременная = НашМассив.Найти(8);

Универсальные коллекции можно очень быстро очищать, т.е. удалить абсолютно все элементы. Для этого используется метод Очистить() , который удаляет элементы Массива, строки ТаблицыЗначений , либо данные других коллекций.

Дополнительные методы для Массива

Метод ВГраница() возвращает количество элементов минус один. Т.е. если мы используем цикл Для , то вместо метода Количество можем сразу использовать метод Граница() .

В частности, переменную КоличествоВМассиве можно было определить иначе:

КоличествоВМассиве = НашМассив.ВГраница();
Тогда при описании самого цикла отнимать от данной переменной единицу не следует.

Метод Установить позволяет присвоить значение элементу Массива по индексу.

Синтаксис: Установить(,)

Пример: НашМассив.Установить (2,8);

Альтернативный вариант: НашМассив = 8;

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

Синтаксис: Получить()

Пример: НашаПеременная = НашМассив.Получить(2);

Альтернативный вариант: НашаПеременная = НашМассив;

Универсальная коллекция Структура

Структура, так же как и Массив, может иметь неограниченное количество элементов, но вот содержание элемента отличается от Массива.

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

Ключ – это строго строковый тип данных, который описывает значение. Например, Ключу «Код» может соответствовать значение 113; Ключу «Имя» значение «Вася». На само Значение ограничение типа данных не накладывается.

Структуру очень удобно использовать, если мы хотим создать некий список параметров. Если данная Структура называется НашаСтруктура , то обращаться к ее двум значениям мы будем следующим образом: НашаСтруктура.Код и НашаСтруктура.Имя.

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

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

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

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

Тогда гораздо удобнее записать все параметры в Структуру и именно ее и передавать. Т.е. происходит «упаковка» параметров процедур и функций.

Отдельно следует отметить, что в качестве Ключа в Структуре может выступать не абсолютно любая строка. Накладываются определенные ограничения.

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

Допустимо начало Ключа с буквы или знака подчеркивания. Таким образом, Ключ должен удовлетворять требованиям к созданию идентификаторов.

Отметим, чем еще Сруктура отличается от Массива. В Структуре есть метод Вставить , в Массиве есть два метода для вставки: Вставить (в определенную позицию) и Добавить (в конец списка). В Массиве все элементы являются упорядоченными.

Структура – это некое неупорядоченное множество. Именно поэтому для Структуры существует только метод вставки.

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

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

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

Как и Массив, конструктор Структуры может иметь параметры. Т.е. возможно описать само содержание Структуры, используя конструктор.

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

Например: НашаСтруктура = Новый Структура (“Код,Имя”, 133, “Вася”);

Через запятую перечисляются сначала имена Ключей, а потом, соответственно, в той же последовательности значения параметров.

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

Например: НашаСтруктура.Вставить(“ЧленовСемьи”,3);

Для Структуры характерен еще один метод, который используется достаточно часто. Это метод Свойство .

С помощью данного метода можно понять, а есть ли в этой Структуре такой элемент, у которого Ключ имеет такое-то имя.

Если существует такой элемент, то система вернет значение Истина, в противном случае – Ложь.

Например, выражение НашаСтруктура.Свойство (“ЧленовСемьи”) будет равно значению Истина. Этот метод применяется достаточно часто при анализе Структуры.

Как и для любой универсальной коллекции, допустимо обращение к свойствам Структуры по индексу. Но индекс для Структуры – это строковое значение.

Например: Сообщить(НашаСтруктура[“ЧленовСемьи”]);

Однако следует не забывать, что Структура – это не упорядоченное множество объектов, именно поэтому обращение по индексу 0, 1, 2 недопустимо.

Универсальная коллекция Список значений

СписокЗначений представляет собой линейный список элементов любого типа данных.

Каждый элемент состоит из нескольких значений. Схематично список значений можно представить в виде списка с четырьмя колонками.

Первая колонка – Отметка . Она имеет булевский тип данных и позволяет пользователю либо ставить флажки, либо их снимать.

Другая колонка – это картинка, которая может каким-то образом визуально изображать данный элемент, т.е. ставить в соответствие данной строке какую-либо картинку.

Третья колонка – само хранимое значение, т.е. это любой тип данных, причем в разных строках он может быть различным.

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

СписокЗначений – это тот объект, с которым может визуально работать пользователь. Т.е. СписокЗначений можно вывести на форму.

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

Найдем СписокЗначений в ситакс-помощнике. Конструктор СпискаЗначений не параметризованный (нельзя задать какие-то значения по умолчанию).

Есть такие методы, как:

  • Вставить(,) ;
  • Добавить(,);
  • Количество();
  • Индекс().

Есть и специальные методы, например, ВыгрузитьЗначения() . При этом создается Массив, в который копируется список значений. Например:

МассивЭлементов = СписокТиповЦен.ВызрузитьЗначения();

Существует и обратный метод:
СписокТиповЦен.ЗагрузитьЗначения(МассивЭлементов);

Существуют методы поиска:
НайтиПоЗначению(); НайтиПоИдентификатору().

Есть метод копирования:
КопияСписка = СписокТиповЦен.Скопировать();
Данный метод предназначен для того, чтобы сделать какую-то модификацию с копией.

Существуют методы:
СортироватьПоЗначению();
СортироватьПоПредставлению().

Методы ВыбратьЭлемент(,) и ОтметитьЭлементы () вызывают модальное диалоговое окно, которое останавливает выполнение алгоритма, пока пользователь не закроет данное окно.

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

Пример кода, вызываемого из модуля Управляемого приложения:

Отображение данного кода в пользовательском режиме (модальное диалоговое окно).

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

Создаем новую команду ЗапонитьПодарки , переносим на форму и определяем для нее обработчик действия.

В пользовательском режиме, при нажатии в форме обработки кнопки Заполнить подарки, появится заполненный список.

При желании список можно редактировать: какие-то элементы добавить, какие-то – удалить.

Универсальная коллекция Соответствие

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

Главное отличие в том, что в качестве Ключа может указываться любой тип данных, равно как и для значения. В виду этой особенности обращаться к значению соответствия необходимо по индексу, в качестве значения индекса указывается значение ключа.

В качестве ключа может быть тип данных, отличающихся от строки. Свойства и методы работы с Соответствием практически такие же, как у Структуры.

Конструктор Соответствия, в отличии от Структуры, не содержит возможности указания параметров.

Пример использования:

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

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

Например: НашеСоответствие = Новый Соответствие;
Соответствие = 999;

Т.е. если элемент в коллекции не присутствовал, то с помощью оператора присваивания он будет добавлен, а если присутствовал, то будет обновлен.

Это является отличием от Структуры.

Универсальная коллекция Таблица значений

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

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

Отличия ТаблицыЗначений от двухмерного Массива:

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

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

Итак, ТаблицаЗначений состоит из набора строк и набора колонок. И строки, и колонки представляют собой коллекции.

Т.е. внутри коллекции ТаблицаЗначений есть еще две коллекции. Обратимся к синтакс-помощнику и найдем ТаблицуЗначений .

Поддерживаемые типы данных: сама ТаблицаЗначений , которая состоит из строк. Каждая строка представлена типом данных СтрокаТаблицыЗначений , у которой есть свои свойства и свои методы. Имеется КоллекцияКолонок ТаблицыЗначений также обладает определенными свойствами.

Важный момент! Процедура, которая формирует ТаблицуЗначений , должна компилироваться & НаСервере.

Прежде, чем начать работать с ТаблицейЗначений , необходимо определить, какие в ней будут содержаться колонки (т.е. создать их). Синтаксис:

Добавить(,)
(необязательный)
Тип: Строка.
(необязательный)
Тип: ОписаниеТипов
(необязательный)
Тип: Строка.
(необязательный)
Тип: Число.

Например:

Для вызова данной процедуры будем использовать команду.

В описании ТаблицыЗначений в качестве элементов коллекции выступают именно СтрокиТаблицыЗначений .

В отличии от колонок, которые состоят только из свойств (Имя, Тип, Заголовок, Ширина), в СтрокеТаблицыЗначений существуют как свойства (обращение по имени колонки), так и методы (можно получать и устанавливать значение, работать с владельцами).

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

Чтобы присвоить значение колонке, мы через точку обращаемся по имени колонки или по индексу (с помощью квадратных скобок).

Для заполнения ТаблицыЗначений могут использоваться следующие методы:

Очистить() – для удаления всех строк из ТаблицыЗначений .

ЗаполнитьЗначения(,) – позволяет заполнить все колонки, либо выбранные колонки одним значением.
ЗагрузитьКолонку(,) – загружает колонку из массива.
ВыгрузитьКолонку() – выгружает колонку в массив.

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

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

Можно скопировать структуру ТаблицыЗначений . Для этого существует соответствующий метод СкопироватьКолонки() . Мы получим пустую ТаблицуЗначений с требуемой структурой.

В ТаблицеЗначений существует метод Итог() . Можно указать ту колонку, в которой нужно просуммировать числовые величины. Применительно к ранее показанному коду в Табло можно рассчитать значение: ТЗ.Итог(“Сумма”) .

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

Применительно к ранее показанному коду в Табло можно рассчитать значение: ТЗ.Свернуть(“ДеньНедели”,“Сумма”).

ТаблицуЗначений можно показать на пользовательском экране, чтобы с ней можно было совершать какие-либо действия. Но в отличии от СпискаЗначений из программного кода нельзя просто так вызвать таблицу на экран.

Чтобы отобразить ТаблицуЗначений на экране, создадим реквизит формы и присвоим ему тип данных ТаблицаЗначений .

После чего полученную таблицу следует вывести на форму.

В модуле формы в конце ранее составленного алгоритма (в Процедуре СозданиеТаблицыЗначений) следует дописать:
ЗначениеВДанныеФормы(ТЗ, Таблица);

Универсальная коллекция Дерево значений

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

Тоже может быть отражено на экране. Дерево значений в явном виде состоит из коллекции строк и коллекции колонок. В дереве существуют такие два свойства как Строки и Колонки.

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

Создадим соответствующую команду Дерево и ее процедуру обработки.

Создадим в котором одна родительская строка и две подчиненные.

Создадим реквизит формы ДерЗн (тип данных – ДеревоЗначений).

Для этого реквизита создадим колонки Год и Месяц.

Переместим соответствующий элемент ДерЗн на форму.

В конце Процедуры ДеревоНаСервере() допишем:

ЗначениеВДанныеФормы(ДеревоЗн, ДерЗн);

Проверим, что получилось в пользовательском режиме.

С помощью кнопки Добавить можно добавлять новые строки. Они могут также образовывать иерархию.

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

На этом мы завершаем наше первое знакомство с универсальными коллекциями.

В следующей статье рассмотрим, при помощи какого важного механизма разработчик может упростить обращение к элементу справочника из программного кода.