Главная » Настройки » Передать параметры из формы форму 1с. Передача параметров в управляемые и обычные формы. Как открыть форму записи регистра сведений

Передать параметры из формы форму 1с. Передача параметров в управляемые и обычные формы. Как открыть форму записи регистра сведений

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

Перечислим предоставляемые системой параметры и их назначение:

  • РежимВыбора – форма открывается в режиме выбора. Предоставляется расширением управляемой формы динамического списка.
  • ТекущаяСтрока – строка, которая будет активизироваться в списке при открытии. Передается значение, идентифицирующее строку. Предоставляется расширением управляемой формы динамического списка.
  • ВыборГруппИЭлементов – по данному параметру устанавливается свойство ВыборГруппИЭлементов таблицы основного реквизита формы. Предоставляется расширением управляемой формы динамического списка.
  • РазрешитьВыборКорня – определяет возможность выбора корня в форме с динамическим списком, отображаемым в виде дерева. Предоставляется расширением управляемой формы динамического списка, отображаемого в виде дерева.
  • Отбор – отбор, устанавливаемый в динамическом списке. Представляет собой структуру. Имена элементов соответствуют именам полей, по которым производится отбор, а значения содержат значения отбора. Предоставляется расширением управляемой формы динамического списка.
  • Ключ – значение, идентифицирующее объект, редактируемый в форме. В случае отсутствия или неверного значения создается новый объект с использованием остальных параметров. Предоставляется расширениями форм объектов и менеджера записи регистра сведений.
  • ЗначениеКопирования – значение, идентифицирующее объект, который будет использован для копирования при создании нового объекта. Предоставляется расширениями форм объектов и менеджера записи регистра сведений.
  • ЗначенияЗаполнения – значения для заполнения реквизитов нового объекта. Представляет собой структуру. Имена элементов соответствуют именам реквизитов, а значения содержат данные, которыми будут заполняться указанные реквизиты. Предоставляется расширениями форм объектов и менеджера записи регистра сведений.
  • Основание – значение, идентифицирующее объект, который будет использован как основание при создании нового объекта вводом на основании. Предоставляется расширениями форм объектов.
  • ЭтоГруппа – определяет вид нового объекта: группа или элемент. Предоставляется расширениями форм объектов.

Пример работы с параметрами формы

Для демонстрации работы параметров формы рассмотрим реализацию выбора элемента в поле ввода. Сутью примера будет реализация механизма выбора элемента из списка на встроенном языке.

К моменту начала работы с примером нужно иметь конфигурацию, обладающую следующими свойствами:

  • Основной режим запуска – Управляемое приложение;
  • имеется справочник Товары с иерархией групп и элементов;
  • имеется справочник Аналоги с реквизитом ВыбранныйТовар типа СправочникСсылка.Товары;
  • оба справочника имеют управляемые формы элементов.

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

Добавим дополнительный флаг, который будет управлять закрытием формы выбора после выбора элемента. Назовем этот флаг ЗакрыватьПослеВыбора (тип Булево). Добавим его параметром формы ФормаВыбора справочника Товары.

Для того чтобы открыть форму выбора элемента, необходимо в форме элемента справочника Аналоги создать обработчик события НачалоВыбора у элемента формы ВыбранныйТовар:

&НаКлиенте

Процедура ВыбранныйТоварНачалоВыбора(Элемент, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ПараметрыВыбора = Новый Структура; ПараметрыВыбора.Вставить(«РежимВыбора», Истина); ПараметрыВыбора.Вставить(«ВыборГруппИЭлементов», ИспользованиеГруппИЭлементов.Элементы); ПараметрыВыбора.Вставить(«РазрешитьВыборКорня», Ложь); ПараметрыВыбора.Вставить(«ТекущаяСтрока», Объект.ВыбранныйТовар); ПараметрыВыбора.Вставить(«ЗакрыватьПослеВыбора», Ложь); ОткрытьФорму(«Справочник.Товары.ФормаВыбора», ПараметрыВыбора, Элементы.ВыбранныйТовар);

КонецПроцедуры

Следует отдельно остановиться на третьем параметре метода ОткрытьФорму(). Этот параметр определяет, кто будет владельцем формы выбора и кому будет приходить оповещение о сделанном выборе. В данном случае мы указали владельцем формы выбора сам элемент формы, но также мы можем указать этим параметром и саму форму. В этом случае будет необходимо реализовывать обработчик ОбработкаВыбора модуля формы и в нем решать, в какой реквизит формы помещать выбранные данные.

У нас есть обработка с вот такой основной формой:

Из этой формы нам нужно открыть некоторую дополнительную форму, при этом текст из поля формы должен передаваться в открываемую форму. Дополнительная форма имеет следующий вид:

Таким образом, при на нажатии на кнопку "Выполнить открывается дополнительная форма с уже введенным текстом в поле:

Рассмотрим способ решения подобной задачи.

Решение

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

1. Использование глобальной экспортной переменной модуля формы.

В основную форму для процедуры-обработчика кнопки "Выполнить" добавим следующий программный код:

Процедура КнопкаВыполнитьНажатие(Кнопка) Форма = ПолучитьФорму(" ДополнительнаяФорма " ) ; // "Текст" - это глобальная экспортная переменная модуля открываемой формы Форма. Текст = ЭлементыФормы. Текст. Значение; Форма. Открыть() ; КонецПроцедуры

Переменная текст добавлена в модуль открываемой формы вместе с обработчиком события "ПередОткрытием":

Перем Текст Экспорт ; // Переменная, в которую передается значение из другой формы Процедура ПередОткрытием(Отказ, СтандартнаяОбработка) ЭлементыФормы. ПереданныйТекст. Значение = Текст; КонецПроцедуры

Задача решена, причем достаточно просто!

2. Использование реквизита формы.

Для второго способа нам даже не нужно переписывать обработчики кнопки "Выполнить" и "ПередОткрытием". Все, что необходимо - это добавить в открываемую форму реквизит "Текст" с типом строка.

Выводы

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

Обработку с примером из статьи Вы можете скачать по ссылке .

Программное открытие форм в управляемом приложении 1С значительно отличается от их открытия в обычном приложении. Рассмотрим для начала старый метод. Он заключается в получении формы и ее последующем открытии в обычном или модальном режиме (при открытии в модальном режиме форма блокирует работу программы).

ПолучитьФорму() . Открыть()

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

Форма= ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаДокумента" ) ;
//Тут выполняем действия с формой
Форма. Открыть() ;

Надо учитывать, что при получении формы будет выполняться еще процедура события ПриСозданииНаСервере.

Рассмотрим другие методы, которые позволяют открывать формы в управляемом приложении 1С быстрее и удобнее. В зависимости от конкретной ситуации могут использоваться разные методы.

1. Как открыть форму объекта в управляемом приложении, если есть ссылка на него.

В этом случае все предельно просто.

СпрСсылка= Справочники. Номенклатура. НайтиПоКоду("000000001" ) ;
ОткрытьЗначение(СпрСсылка) ;

2. Как открыть форму выбора и получить потом выбранное значение.

Для этого существует функция ВвестиЗначение(). У функции 3 параметра:

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

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

Перем Значение;
Массив= новый массив;
Массив. Добавить(Тип("СправочникСсылка.Номенклатура" ) ) ;
Массив. Добавить(Тип("СправочникСсылка.Контрагенты" ) ) ;

ОписаниеТипов= новый ОписаниеТипов(Массив) ;

Рез= ВвестиЗначение(Значение, "Подсказка" , ОписаниеТипов) ;

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

Эта функция имеет довольно много параметров. Рассмотрим некоторые из них:

  • Имя формы — тут можно выбрать либо одну из стандартных форм объекта, например, ФормаВыбора или ФормаСписка . Или конкретную, созданную разработчиками форму.
  • Параметры — позволяет передать в форму в виде структуры некоторые параметры перед ее открытием, тем самым определив выводимые данные. Параметры могут представлять собой любые данные, которые можно передавать с клиента на сервер. Переданные при открытии формы параметры можно обработать в процедуре ПриСозданииНаСервере() у открываемой формы.
  • Режим открытия формы — имеет 3 варианта: независимый, блокировать весь интерфейс, блокировать форму владельца.

Рассмотрим, как применяется функция ОткрытьФорму() в различных ситуациях.

3. Как открыть форму существующего объекта

У каждой формы есть один ключевой реквизит. Он выделен жирным в списке реквизитов формы и обычно называется Объект у форм элементов справочников, документов. У других объектов название может быть другим. Для открытия формы существующего объекта нужно передать в открываемую форму параметр Ключ со значением в виде ссылки на объект.

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;
Параметр. Вставить("Ключ" , НайтиС() ) ;
ОткрытьФорму(, Параметр) ;
КонецПроцедуры

&НаСервере
Функция НайтиС() ;
Возврат Справочники. Контрагенты. НайтиПоРеквизиту ("ИНН" , "745107734623" )
КонецФункции

4. Как открыть форму нового объекта

Тут подойдет просто функция ОткрытьФорму() без всяких параметров.

&НаКлиенте
Процедура Команда1 (Команда)
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта" ) ;
КонецПроцедуры

5. Как открыть форму нового объекта и заполнить ее на основании чего-либо

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

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;
Параметр. Вставить("Основание" , СсылкаНаСчетПокупателю) ;
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта" , Параметр) ;
КонецПроцедуры

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

6. Как открыть форму и задать на ней отбор

Отбор на формах 1С может быть простым и сложным. Простой отбор предусматривает выражения типа Организация = ООО «Рога и копыта». Сложный отбор предполагает и другие типы сравнения, например, В списке . В данной статье рассмотрим организацию простого отбора, а сложному будет посвящена отдельная статья.

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

Например, откроем форму списка справочника НомераГТД и сделаем там отбор по владельцу — элементу справочника Номенклатура .

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;

Отбор= новый Структура;
Отбор. Вставить("Владелец" , СсылкаНаНоменклатуру) ;

Параметр. Вставить("Отбор" , Отбор) ;

ОткрытьФорму("Справочник.НомераГТД.ФормаСписка" , Параметр) ;
КонецПроцедуры

7. Как открыть форму записи регистра сведений

Для этого понадобится ключ записи регистра сведений.

Ключ записи — это значения всех измерений и период (если регистр периодический). То есть ключ записи — это параметры, по которым можно однозначно идентифицировать запись.

Алгоритм открытия следующий:

  1. Заносим в структуру данные ключа записи с необходимыми значениями.
  2. Помещаем полученную структуру в массив.
  3. Из массива создаем ключ записи.
  4. Передаем в открываемую форму параметр Ключ с ключом записи из п.3 в качестве значения.

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;

ПараметрыКлюча= новый Структура;
ПараметрыКлюча. Вставить("Номенклатура" , СсылкаНаНоменклатуру) ;
ПараметрыКлюча. Вставить("ТипЦены" , СсылкаНаТипЦен) ;
ПараметрыКлюча. Вставить("Период" , Дата) ;

МассивКлюча = Новый Массив;
МассивКлюча. Добавить(ПараметрыКлюча) ;

КлючЗаписи = Новый("РегистрСведенийКлючЗаписи.ЦеныНоменклатуры" , МассивКлюча) ;

Параметр. Вставить("Ключ" , КлючЗаписи) ;

ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи" , Параметр) ;
КонецПроцедуры

Печать (Ctrl+P)

Параметры формы

1. Общая информация

Параметры формы (закладка Параметры ) служат двум целям:
● Описать набор данных, которые будут влиять на открытие формы (параметризация формы). Для этого нужно перечислить все необходимые параметры и указать их типы.
● Определить параметры, которые будут влиять на ключ уникальности формы. Для этого необходимо установить свойство Ключевой параметр у тех параметров, которые должны участвовать в формировании ключа уникальности формы. При попытке открыть форму система производит поиск существующей формы с помощью сформированного ключа уникальности формы. Если в системе существует форма с полученным ключом
уникальности, возвращается именно эта форма; если нет – создается новая форма.
При вызове формы значения параметров, созданных разработчиком, можно указывать в структуре параметров наряду с системными параметрами форм (если таковые имеются).
Параметры формы можно передать в форму в момент ее создания. Анализ переданных параметров можно выполнить в событии ПриСозданииНаСервере() (коллекция Параметры является свойством объекта УправляемаяФорма ):

// В месте вызова.
// Формируем параметр формы .
Параметры = Новый Структура ();
Параметры.Вставить (“Важность”, ПредопределенноеЗначение (“Перечисление.Важность.Важно”));
// Открываем форму с указанием параметров.
ОткрытьФорму (“ОбщаяФорма.ФормаПросмотра”, Параметры );

// В модуле формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Важность = Перечисления.Важность.Важн о Тогда

КонецЕсли;
КонецПроцедуры

ВНИМАНИЕ ! После вызова обработчика события ПриСозданииНаСервере все неключевые параметры формы удаляются из коллекции Параметры .
Совет. Неключевые параметры формы, необходимые для дальнейшей работы, нужно сохранять в данных формы.

2. Стандартные параметры формы

Для того чтобы поддерживать автоматическое взаимодействие между формами, система предоставляет ряд стандартных параметров, которые используются для управления формами при их открытии. С помощью этих параметров системой реализуется в полях форм выбор из форм выбора, открытие форм объектов, работа стандартных команд и т. д. То есть они обеспечивают различные заложенные в систему сценарии работы интерфейса.
Но разработчик также может использовать эти параметры во встроенном языке, передавая их при вызове метода ОткрытьФорму().
Перечень стандартных параметров форм в зависимости от вида расширения формы можно посмотреть в разделах Встроенный язык – Интерфейс
(управляемый) – Управляемая форма – Расширение… встроенной справки.

3. Пример работы с параметрами формы

Для демонстрации работы параметров формы рассмотрим реализацию выбора элемента в поле ввода. Сутью примера будет реализация механизма выбора элемента из списка на встроенном языке.
К моменту начала работы с примером нужно иметь конфигурацию, обладающую следующими свойствами:
● имеется справочник Товары с иерархией групп и элементов;
● имеется справочник Аналоги с реквизитом ВыбранныйТовар типа СправочникСсылка.Товары ;
● оба справочника имеют формы элементов.
Теперь реализуем в этой конфигурации все механизмы, которые использует платформа для выбора элемента из списка, на встроенном языке. При этом мы увидим:
● как происходит использование стандартных параметров формы;
● каким образом их использует сама система;
● как их может использовать разработчик.
Добавим дополнительный параметр, который будет управлять закрытием формы выбора после выбора элемента. Назовем этот параметр ЗакрыватьПослеВыбора (тип Булево ). Добавим его в качестве параметра формы ФормаВыбора справочника Товары .
Для того чтобы открыть форму выбора элемента, необходимо в форме элемента справочника Аналоги создать обработчик события НачалоВыбора у элемента формы ВыбранныйТовар .

&НаКлиенте
Процедура ВыбранныйТоварНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ПараметрыВыбора = Новый Структура ;
ПараметрыВыбора.Вставить (“РежимВыбора”, Истина );
ПараметрыВыбора.Вставить (“ВыборГруппИЭлементов”, ИспользованиеГруппИЭлементов.Элементы );
ПараметрыВыбора.Вставить (“РазрешитьВыборКорня”, Ложь );
ПараметрыВыбора.Вставить (“ТекущаяСтрока”, Объект.ВыбранныйТовар );
ПараметрыВыбора.Вставить (“ЗакрыватьПослеВыбора”, Ложь );
ОткрытьФорму(“Справочник.Товары.ФормаВыбора”, ПараметрыВыбора , Элементы.ВыбранныйТовар );
КонецПроцедуры
Следует отдельно остановиться на третьем параметре метода ОткрытьФорму() . Этот параметр определяет, кто будет владельцем формы выбора и кому будет приходить оповещение о сделанном выборе. В данном случае мы указали владельцем формы выбора сам элемент формы, но также мы можем указать этим параметром и саму форму. В этом случае будет необходимо реализовывать обработчик ОбработкаВыбора модуля формы и в нем решать, в какой реквизит формы помещать выбранные данные.
ПРИМЕЧАНИЕ . Если мы не будем реализовывать обработчик события НачалоВыбора , то его действия выполнит сама система. Это справедливо и для всех дальнейших обработчиков, которые использованы в примере.
Теперь необходимо обработать переданные параметры в форме выбора. Сделаем это в обработчике ПриСозданииНаСервере () модуля формы выбора.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка )
СтандартнаяОбработка = Ложь ;
Элементы.Список.ВыборГруппИЭлементов = Параметры.ВыборГруппИЭлементов ;
Элементы.Список.РазрешитьВыборКорня = Параметры.РазрешитьВыборКорня ;
Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
ЗакрыватьПриВыборе = Параметры.ЗакрыватьПослеВыбора ;
КонецПроцедуры
Для того чтобы проверить работоспособность установленных нами параметров формы, установим, с помощью конфигуратора, у таблицы формы выбора Список свойство ВыборГруппИЭлементов в значение Группы (без применения параметра не будет доступен выбор элементов справочника).
ПРИМЕЧАНИЕ . Если у таблицы Список , отображающей список товаров, свойство РежимВыбора не будет установлено в значение Истина , то выбор товаров будет недоступен.
Теперь нам необходимо обработать выбор желаемого элемента в форме выбора. Для этого нужно определить обработчик события ВыборЗначения таблицы формы.

&НаКлиенте
Процедура СписокВыборЗначения(Элемент, СтандартнаяОбработка, Значение)
СтандартнаяОбработка = Ложь ;
ОповеститьОВыборе(Значение );
КонецПроцедуры
Нам осталось реализовать обработку выбора элемента в самом поле ввода. Для этого необходимо обработать событие ОбработкаВыбора нашего поля ввода ВыбранныйТовар.

&НаКлиенте
Процедура ВыбранныйТоварОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка )
СтандартнаяОбработка = Ложь ;
Объект.ВыбранныйТовар = ВыбранноеЗначение;
КонецПроцедуры
Мы самостоятельно реализовали системный механизм выбора значения в поле ввода на форме.
ВНИМАНИЕ! Данный пример не является законченным. Его единственным назначением является демонстрация механизмов работы с параметрами формы.
Если при создании параметров (обработчик ВыбранныйТоварНачалоВыбора()) заменить строку:

ПараметрыВыбора.Вставить (“ЗакрыватьПослеВыбора”, Истина );
на строку:
ПараметрыВыбора.Вставить (“ЗакрыватьПослеВыбора”, Ложь) ;
то форма выбора перестанет закрываться после того, как будет осуществлен выбор. Это можно использовать, например, для реализации формы подбора (выбор нескольких товаров без закрытия формы выбора).

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

Как передаются параметры в обычных формах

В обычных формах для передачи параметра было 2 возможности:
1) менее распространенный способ: в форме объекта на вкладке «Реквизиты» добавлялся реквизит, при необходимости определялся доступ визуальными средствами
2) более распространенный способ: в модуле формы объявлялась экспортная переменная и в обработчике «ПередОткрытием» значение обрабатывалось

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

Форма = Объект.ПолучитьФорму("ФормаВыбора",ВладелецФормы, КлючУникальности);
Форма.Параметр = ЗначениеПараметра;
Форма.Открыть();

Как передаются параметры в управляемых формах

В управляемых формах теперь есть возможность сразу передавать параметры при получении формы. Параметры передаются в виде структуры:

Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();

Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров. Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.

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

Для передачи специфического параметра манипуляций требуется сделать немного больше:

1) Определить в управляемой форме параметр.
В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство «Параметры», имеющее тип ДанныеФормыСтруктура)
2)Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.
Таким образом код будет иметь вид:
- В месте получения формы

Параметры = Новый Структура("НовыйПараметр",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);

В модуле управляемой формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("НовыйПараметр") Тогда
// здесь код обработки параметра
КонецЕсли;
КонецПроцедуры

Заключение

Возможно данная статья кому-то пригодится, с экономит время и убережет от лишнего кода. Для более детальной информации о полном списке параметров управляемой формы рекомендуется посмотреть справку «Интерфейс управляемый \ Управляемая форма».

[необходимо зарегистрироваться для просмотра ссылки]



Предыдущая статья: Следующая статья:

© 2015 .
О сайте | Контакты
| Карта сайта