WWW.LIBRUS.DOBROTA.BIZ
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - собрание публикаций
 

Pages:     | 1 |   ...   | 2 | 3 || 5 |

«пособие разработчика. Примеры и типовые приемы Электронная книга в формате pdf; ISBN 978-5-9677-2043-7. Электронный аналог печатного издания «1С:Предприятие 8.2. Практическое пособие разработчика. ...»

-- [ Страница 4 ] --

В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам (рис. 22.16) .

Рис. 22.16. Список документов «Начисления сотрудникам»

Как мы видим, в списке показаны только документы № 1 и № 3, так как в документе № 2 начисляется премия .

Хотя это и не относится к вопросу ограничения доступа к данным, поясним по ходу еще один момент .

На рис. 22.16 мы видим внизу окна приложения панель истории .

Так получилось потому, что еще на третьем занятии, в момент заполнения данными первого справочника, мы задали ее отображение в конфигураторе. Затем мы убрали видимость этой панели, но уже в режиме 1С:Предприятие. Но, как уже говорилось, настройка панелей прикладного решения в режиме 1С:Предприятие относится только к тому пользователю, кто эту настройку выполнил, в то время как настройка отображения панелей в конфигураторе относится 670 1С:Предприятие 8.3. Практическое пособие разработчика к конфигурации в целом. В тот момент у нас еще не было заведено пользователей, поэтому панель истории стала опять видна. И так будет для каждого нового пользователя .

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

В режиме «Конфигуратор»

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

В появившемся окне Интерфейс клиентского приложения выделим элемент Панель истории в левом списке и нажмем кнопку Удалить в командной панели окна (рис. 22.17) .

Рис. 22.17. Настройка панелей прикладного решения в конфигураторе

Вернемся к вопросу ограничения доступа к данным .

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

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

Посмотрим на наше ограничение доступа к данным документа Начисления сотрудникам для роли Мастер .

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

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

Занятие 22 Тем самым мы разрешим документу отображаться в списке .

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

Добавим к ограничениям доступа еще одно условие .

В списке полей выберем поля:

Ссылка, ПометкаУдаления,

–  –  –

В ограничении доступа напишем ГДЕ ИСТИНА (рис. 22.18) .

Рис. 22.18. Установка ограничений доступа к данным для роли «Мастер»

Закроем окно редактирования прав .

672 1С:Предприятие 8.3. Практическое пособие разработчика В режиме «1С:Предприятие»

Обновим информационную базу, нажав F7, и запустим «1С:Предприятие» для пользователя с ролью Мастер, например, для пользователя Гусаков .

В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам (рис. 22.19) .

Рис. 22.19. Список документов «Начисления сотрудникам»

В списке документов мы увидим все документы начислений .

Документы № 1 и № 3 мы сможем открыть и просмотреть, но при попытке открыть документ № 2 мы получим сообщение о нарушении прав доступа (рис. 22.20) .





То есть мы добились того, чего хотели .

Теперь обратим внимание на следующий момент .

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

Занятие 22

Рис. 22.20. Сообщение о нарушении прав доступа к данным

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

Убедимся в этом .

Запустим «1С:Предприятие» от имени пользователя Администратор .

В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам. Откроем документ № 2 и скопируем любую его строку. В новой строке изменим вид расчета на Оклад. Проведем и закроем документ. Завершим сеанс работы .

Теперь запустим «1С:Предприятие» от имени пользователя Гусаков .

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

Откроем документ № 2. Документ откроется, и мы увидим все его строки .

674 1С:Предприятие 8.3. Практическое пособие разработчика В режиме «Конфигуратор»

Вернемся в конфигуратор .

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

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

Итак, откроем роль Мастер и перейдем на закладку Шаблоны ограничений (рис. 22.21) .

Рис. 22.21. Добавление шаблона ограничений доступа к данным для роли «Мастер»

Здесь добавим новый шаблон, назовем его ЕстьПремия .

Текст шаблона будет выглядеть следующим образом (листинг 22.2) .

листинг 22.2. Ограничение доступа к данным ВЫБРАТЬ ИЗ Документ.НачисленияСотрудникам.Начисления ГДЕ Документ.НачисленияСотрудникам.Начисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия) И Документ.НачисленияСотрудникам.Начисления.Ссылка = #Параметр(1).Ссылка

–  –  –

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

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

листинг 22.3. Ограничение доступа к данным И Документ.НачисленияСотрудникам.Начисления.Ссылка = #Параметр(1).Ссылка Вместо #Параметр(1) будет подставлена та строка, которую мы укажем при вызове этого шаблона в условии ограничения доступа .

Теперь вернемся на закладку Права .

В имеющемся ограничении прав доступа для прочих полей (в первой строке списка ограничений) заменим старый текст новым (листинг 22.4), рис. 22.22 .

листинг 22.4. Ограничение доступа к данным ДокНачисления ГДЕ НЕ 1 В (#ЕстьПремия("ДокНачисления")) Рис. 22.22. Установка ограничений доступа к данным для роли «Мастер»

676 1С:Предприятие 8.3. Практическое пособие разработчика Здесь с помощью конструкции #ЕстьПремия("ДокНачисления") мы обращаемся к нашему шаблону. Текст шаблона просто механически будет подставлен в это место, причем строка ДокНачисления заменит собой первый параметр шаблона (#Параметр(1)) .

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

Поэтому это условие (см. листинг 22.4) разрешит нам прочитать

ДокНачисления тогда, когда запрос из шаблона не возвращает 1:

ГДЕ НЕ 1 В (#ЕстьПремия(«ДокНачисления»)) То есть тогда, когда в табличной части нет начисления Премия .

Можно было бы записать это условие ограничения и без использования шаблонов .

Но, во-первых, такая запись была бы менее читаемой (листинг 22.5), а во-вторых, использование шаблонов позволяет выделить и не дублировать части условий ограничений, которые могут использоваться в разных условиях .

листинг 22.5. Ограничение доступа к данным ДокНачисления ГДЕ НЕ 1 В ( ВЫБРАТЬ ИЗ Документ.НачисленияСотрудникам.Начисления ГДЕ Документ.НачисленияСотрудникам.Начисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия) И Документ.НачисленияСотрудникам.Начисления.Ссылка = ДокНачисления.Ссылка)

Закроем окно редактирования прав. Проверим, как это работает .

В режиме «1С:Предприятие»

Обновим информационную базу, нажав F7, и запустим «1С:Предприятие» от имени пользователя Гусаков .

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

Как вы помните, в документе № 2 есть строки и с видом расчета Премия, и с видом расчета Оклад. Раньше этот документ у нас открывался .

Занятие 22 Попробуем открыть его теперь .

Мы получим сообщение о нарушении прав доступа, что нам и требовалось (см. рис. 22.20) .

В режиме «Конфигуратор»

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

Снимем для роли Мастер право Чтение для документа НачисленияСотрудникам. Снимем право Просмотр для подсистемы РасчетЗарплаты. Снимем право Чтение для справочника ВидыГрафиковРаботы и для плана видов расчета Основные начисления. Запустим «1С:Предприятие» от имени пользователя Администратор. В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам .

Откроем документ № 2 и удалим последнюю строку (которую мы добавляли). Проведем и закроем документ .

678 1С:Предприятие 8.3. Практическое пособие разработчика

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

; Для чего предназначен объект конфигурации «Роль»?

; Как создать роль, используя подсистемы конфигурации?

; Как создать список пользователей системы и определить их права?

; Чем аутентификация средствами «1С:Предприятия» отличается от аутентификации операционной системы?

; Как создать для роли ограничения доступа к данным на уровне записей и полей базы данных?

Занятие 23 Начальная страница и настройка командного интерфейса пРодолжительность Ориентировочная продолжительность занятия – 1 час 10 минут .

Настройка командного интерфейса разделов

В режиме «Конфигуратор»

В режиме «1С:Предприятие»

Раздел «Главное». Настройка начальной страницы

В режиме «Конфигуратор»

В режиме «1С:Предприятие»

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

680 1С:Предприятие 8.3. Практическое пособие разработчика На этом занятии мы придадим нашей конфигурации «товарный»

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

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

На самом деле от внешнего вида и организации интерфейса приложения напрямую зависит, насколько разработанное нами прикладное решение понравится пользователю .

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

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

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

В режиме «Конфигуратор»

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

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

А интерфейс остальных разделов будет разгружен за счет этой перестановки .

Занятие 23 Итак, откроем поочередно окно редактирования каждого справочника и на закладке Подсистемы отметим единственную подсистему Предприятие (рис. 23.1) .

Рис. 23.1. Выбор подсистемы, в которой будет отображаться справочник Это изменение относится также и к тем справочникам, для которых раньше не было установлено ни одной подсистемы (например, ВариантыНоменклатуры, Субконто и т. п.) .

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

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

Раскроем ветвь Подсистемы, выделим подсистему УчетМатериалов и вызовем из контекстного меню команду Открыть командный интерфейс (рис. 23.2) .

На подсистему УчетМатериалов имеют права пользователи с ролями Администратор, Директор, Мастер .

682 1С:Предприятие 8.3. Практическое пособие разработчика

Рис. 23.2. Вызов редактора командного интерфейса подсистемы

Зададим расположение и общую видимость команд подсистемы следующим образом:

С помощью мыши переместим команду Приходные накладные из группы Панель навигации.Обычное в группу команд Панель навигации.Важное. Это обусловлено тем, что в разделе Учет материалов наиболее часто пользователю может понадобиться создавать приходные накладные и просматривать их список. Команды из группы Важное будут выделены жирным шрифтом в панели команд раздела .

В группе Панель действий.Создать включим видимость команды Цена:создать и зададим следующий порядок расположения этих команд:

Приходная накладная: создать, Цена:создать .

Следующие группы команд оставим без изменения:

Группа Панель навигации.Обычное:

Цены на Номенклатуру .

Группа Панель навигации.См. также:

Остатки материалов, Занятие 23 Стоимость материалов, Продажи .

Группа Панель действий.Отчеты:

Материалы, Остатки материалов по свойствам .

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

Теперь настроим видимость команд по ролям, исходя из следующих соображений:

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

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

В результате командный интерфейс подсистемы примет вид (рис. 23.3) .

Рис. 23.3. Командный интерфейс подсистемы «УчетМатериалов»

684 1С:Предприятие 8.3. Практическое пособие разработчика Руководствуясь подобными соображениями, отредактируем командный интерфейс остальных подсистем .

На подсистему ОказаниеУслуг имеют права пользователи с ролями Администратор, Директор, Мастер .

Зададим расположение и общую видимость команд подсистемы следующим образом:

Группа Панель навигации.Важное:

Оказание услуг .

Группа Панель навигации.Обычное:

Цены на Номенклатуру .

Группа Панель навигации.См. также:

Остатки материалов, Стоимость материалов, Продажи .

Группа Панель действий.Создать:

Оказание услуги: создать, Цена:создать .

Группа Панель действий.Отчеты:

Материалы, Реестр документов Оказание услуги, Рейтинг услуг, Выручка мастеров, Перечень услуг, Рейтинг клиентов, Универсальный .

Настроим видимость команд по ролям, исходя из следующих соображений:

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

Команды создания документов Оказание услуги и новой цены (из группы Панель навигации.Создать) нужны только Мастеру .

Директор вообще может только просматривать документы, а Администратор не занимается массовым вводом данных, Занятие 23 при необходимости он может создать новые документы через их списки. Поэтому скроем эти команды для Администратора и Директора .

В результате командный интерфейс подсистемы примет вид (рис. 23.4) .

Рис. 23.4. Командный интерфейс подсистемы «ОказаниеУслуг»

На подсистему Бухгалтерия имеют права пользователи с ролями Администратор, Директор, Бухгалтер .

Зададим расположение и общую видимость команд подсистемы следующим образом:

Группа Панель навигации.Важное:

Управленческий, Основной план счетов, Ввод начальных остатков номенклатуры .

Группа Панель навигации.Обычное:

Приходные накладные, Оказание услуг, Цены на Номенклатуру .

Группа Панель навигации.См. также:

Виды субконто, 686 1С:Предприятие 8.3. Практическое пособие разработчика Остатки материалов, Стоимость материалов, Продажи .

Группа Панель действий.Создать: сделаем все команды невидимыми, так как в этом разделе не предполагается массового создания объектов .

Группа Панель действий.Отчеты:

Оборотно-сальдовая ведомость, Начисления сотрудникам, Материалы, Рейтинг услуг, Перечень услуг, Рейтинг клиентов, Остатки материалов по свойствам .

Настроим видимость команд по ролям, исходя из следующих соображений:

Просматривать полностью все движения в регистрах накопления (из группы Панель навигации.См. также) может понадобиться только Администратору, поэтому отключим видимость этих команд для Директора и Бухгалтера .

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

В результате командный интерфейс подсистемы примет вид (рис. 23.5) .

На подсистему РасчетЗарплаты имеют права пользователи с ролями Администратор, Директор, Расчетчик .

Зададим расположение и общую видимость команд подсистемы следующим образом:

Группа Панель навигации.Важное:

Начисления сотрудникам, Графики работы .

Группа Панель навигации.Обычное:

Виды расчетов, Начисления .

Занятие 23

Группа Панель действий.Создать:

Начисления сотрудникам: создать .

Группа Панель действий.Отчеты:

Начисления сотрудникам, Диаграмма начислений, Выручка мастеров .

Рис. 23.5. Командный интерфейс подсистемы «Бухгалтерия»

Настроим видимость команд по ролям, исходя из следующих соображений:

Команда для просмотра плана видов расчетов (из группы Панель навигации.Обычное) не понадобится Директору. Скроем эту команду для Директора .

Команда для анализа движений в регистре Начисления (из группы Панель навигации.Обычное) может понадобиться только Администратору. Поэтому скроем эту команду для Директора и Расчетчика .

688 1С:Предприятие 8.3. Практическое пособие разработчика Команда для создания документов Начисления сотрудникам (из группы Панель навигации.Создать) нужна только Расчетчику. Поэтому отключим видимость этой команды для Директора и Администратора. А для команд создания графиков работы и видов расчетов (ОсновныеНачисления) мы отключили общую видимость, так как массового ввода этих данных не предполагается .

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

В результате командный интерфейс подсистемы примет вид (рис.

23.6):

Рис. 23.6. Командный интерфейс подсистемы «РасчетЗарплаты»

На подсистему Предприятие имеют права все пользователи. В данном разделе будет отображаться нормативно справочная информация .

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

Занятие 23 В результате командный интерфейс подсистемы будет выглядеть следующим образом:

Группа Панель навигации.Важное:

Номенклатура, Клиенты, Сотрудники, Склады .

Группа Панель навигации.Обычное:

Варианты номенклатуры, Дополнительные свойства номенклатуры, Субконто, Виды графиков работы, Состав варианта номенклатуры .

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

В результате командный интерфейс подсистемы примет вид (рис. 23.7) .

Рис. 23.7. Командный интерфейс подсистемы «Предприятие»

690 1С:Предприятие 8.3. Практическое пособие разработчика В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

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

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

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

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

Рис. 23.8. Командный интерфейс раздела «Расчет зарплаты»

Группы команд в каждом разделе зрительно отделены друг от друга, а наиболее важные команды в панели команд разделов выделены жирным шрифтом. Те команды, которые не поместились в панели команд текущего раздела, содержатся в подменю Еще .

Итак, мы настроили командный интерфейс разделов согласно нашим представлениям о работе прикладного решения .

Однако если у пользователя – другие предпочтения, то в режиме 1С:Предприятие он может настраивать командный интерфейс по своему усмотрению. Для этого нужно вызвать меню функций раздела Занятие 23 из панели инструментов приложения (или дважды щелкнуть мышью на названии раздела) и выполнить команду Настройка навигации или Настройка действий (см. рис. 23.9) .

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

Рис. 23.9. Меню функций раздела «Бухгалтерия»

Затем, открыв Избранное из панели инструментов, можно также пометить наиболее важные из списка избранных элементов. Они будут помечены специальной пиктограммой (рис. 23.10). Также они будут выделены жирным шрифтом и расположены вверху списка избранного, чтобы пользователь мог быстро их найти .

Рис. 23.10. Список избранного для пользователя с ролью «Бухгалтер»

692 1С:Предприятие 8.3. Практическое пособие разработчика Раздел «Главное» .

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

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

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

При запуске «1С:Предприятия» раздел Главное становится активным по умолчанию и нужные формы сразу открываются в рабочей области приложения (рис. 23.11) .

Рис. 23.11. Раздел «Главное» для пользователя с ролью «Директор»

Занятие 23 Таким образом, пользователю не нужно ходить по разделам, искать в них нужную команду, а можно сразу начинать работать, предварительно включив компьютер и запустив «1С:Предприятие» .

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

В режиме «Конфигуратор»

Итак, начнем настраивать командный интерфейс раздела Главное .

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

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

Для роли Мастер наиболее важными командами будут команды для создания документов Приходная накладная и Оказание услуги, а также 694 1С:Предприятие 8.3. Практическое пособие разработчика команды для открытия отчетов Материалы и Выручка мастеров .

Для команд создания документов установим общую видимость и скроем эти команды для всех ролей, кроме Мастера. Для команд открытия отчетов снимем видимость для всех ролей, кроме Мастера и Директора (рис. 23.13) .

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

Для роли Бухгалтер вынесем в панель команд основного раздела команды для создания документа Ввод начальных остатков номенклатуры и просмотра отчета Оборотно-сальдовая ведомость .

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

Для команды открытия отчета оставим видимость только для Бухгалтера и Директора .

Для роли Директор приоритетными являются команды для просмотра самых важных отчетов: Материалы, Выручка мастеров, Начисления сотрудникам, Оборотно-сальдовая ведомость. Эти команды мы уже добавили в панель команд основного раздела и сделали их видимыми для Директора .

Занятие 23 Для Администратора панель команд основного раздела остается пока пустой, а позднее мы поместим туда команды управления обменом данными .

В результате окно настройки командного интерфейса основного раздела примет следующий вид (рис. 23.14) .

Рис. 23.14. Окно настройки командного интерфейса основного раздела Теперь выполним настройку начальной страницы .

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

Откроется окно настройки начальной страницы (рис. 23.15). Сначала вверху окна выберем шаблон рабочего стола Две колонки разной ширины (2:1) .

Рис. 23.15. Окно настройки начальной страницы 696 1С:Предприятие 8.3. Практическое пособие разработчика Это значит, что формы на начальной странице будут располагаться в две колонки, при этом левая колонка будет в два раза шире правой .

Можно выбрать другой шаблон, при котором колонки будут одинаковой ширины или будет всего одна колонка. Но кажется, что предпочтительнее первый вариант (2:1), так как в этом случае взгляд пользователя сразу будет падать на наиболее приоритетные для работы формы, которые мы расположим в левой колонке .

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

ВниМАние!

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

Итак, начнем настройку рабочего стола для роли Мастер .

Наше ООО «На все руки мастер» – фирма по оказанию услуг, и мастера имеют к этому непосредственное отношение. Поэтому логично, если для мастеров в левой колонке начальной страницы будет располагаться список документов об оказании услуг, а в правой колонке – список приходных накладных .

Перечисленные формы списка отсутствуют в конфигурации, поэтому создадим формы списка для объектов конфигурации:

документ ПриходнаяНакладная, документ ОказаниеУслуги .

По умолчанию в форме списка документов присутствуют только колонки Дата и Номер. Добавим вручную в форму списка документа ПриходнаяНакладная колонку Склад (рис. 23.16) .

Аналогично добавим в форму списка документа ОказаниеУслуги колонки Склад, Клиент, Мастер .

Теперь перейдем в окно настройки начальной страницы и над списком форм левой колонки нажмем Добавить .

Занятие 23 Рис. 23.16. Создание формы списка документа «Приходная накладная»

Выберем форму списка документа ОказаниеУслуги (рис. 23.17) .

–  –  –

Аналогичным образом в правую колонку добавим формы списка документа ПриходнаяНакладная .

Теперь для каждой из форм нажмем ссылку в колонке Видимость и установим видимость этих форм только для роли Мастер (рис. 23.18) .

698 1С:Предприятие 8.3. Практическое пособие разработчика Рис. 23.18. Настройка начальной страницы для пользователя с ролью «Мастер»

Теперь настроим начальную страницу для роли Бухгалтер .

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

Создадим форму отчета для отчета ОборотноСальдоваяВедомость .

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

Затем настроим начальную страницу для роли Расчетчик .

По роду деятельности расчетчик в основном пользуется документами и отчетами о начислениях сотрудникам. Расположим список документов о начислениях сотрудникам в правой колонке начальной страницы. А отчет о начислениях сотрудникам расчетчик всегда может открыть из панели команд раздела Главное .

Создадим форму списка документа НачисленияСотрудникам .

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

Затем настроим начальную страницу для роли Директор .

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

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

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

В результате окно настройки начальной страницы должно принять следующий вид (рис. 23.19) .

Рис. 23.19. Окно настройки начальной страницы

Если у пользователя на начальной странице видима только какая-то одна форма (например, у директора – отчет Выручка мастеров, у расчетчика – список документов о начислениях сотрудникам), то эти формы в интерфейсе приложения растягиваются на всю ширину начальной страницы, независимо от того, в какой колонке начальной страницы (правой или левой) они изначально находились в конфигураторе .

700 1С:Предприятие 8.3. Практическое пособие разработчика Если же для одной роли видимы несколько форм и все они расположены в какой-то одной колонке начальной страницы в конфигураторе, то в интерфейсе приложения на начальной странице они будут показаны друг под другом .

В режиме «1С:Предприятие»

Теперь, если мы зайдем в систему в режиме 1С:Предприятие, указав пользователя Назарова (с ролями Бухгалтер и Расчетчик), мы увидим такую начальную страницу (рис. 23.20) .

–  –  –

ВниМАние!

Чтобы зайти в режим 1С:Предприятие под различными пользователями, нужно выполнить обновление конфигурации и запустить «1С:Предприятие» еще раз, выбрав режим 1С:Предприятие (тонкий клиент) и нужного пользователя. Если вы, как обычно, запустите «1С:Предприятие» в режиме отладки, то есть из конфигуратора, то система будет считать, что вы заходите в программу под тем же пользователем, что и в конфигуратор, то есть Администратор .

–  –  –

зователю доступны разделы Бухгалтерия, Расчет зарплаты и Предприятие в соответствии с правами, которые мы установили для этих ролей на предыдущем занятии .

А для пользователя Деловой (с ролью Директор) начальная страница будет выглядеть следующим образом (рис. 23.21) .

Рис. 23.21. Начальная страница для пользователя с ролью «Директор»

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

Для пользователя Гусаков (с ролью Мастер) начальная страница будет выглядеть следующим образом (рис. 23.22) .

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

702 1С:Предприятие 8.3. Практическое пособие разработчика Рис. 23.22. Начальная страница для пользователя с ролью «Мастер»

Если теперь мастер откроет какой-то из документов, то слева от заголовка документа будет доступна кнопка Начальная страница (с иконкой домика) для перехода на начальную страницу (рис. 23.23) .

–  –  –

Таким образом, мы добились того, что при запуске «1С:Предприятия» для каждой роли, например для пользователя с ролью Мастер, на начальной странице сразу открываются формы списков документов, нужные ему для работы. А в панели команд раздела Главное находятся команды для создания этих документов и наиболее важные для Мастера отчеты .

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

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

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

Если же какой-то пользователь решит минимизировать командный интерфейс и тем самым расширить рабочее пространство, то он может скрыть все панели прикладного решения, кроме панели инструментов, по команде главного меню Вид Скрыть все панели (рис. 23.24) .

Рис. 23.24. Минималистичный командный интерфейс приложения В реальной конфигурации, конечно, роли пользователей и наполнение их начальных страниц будут другими. Это зависит от специфики работы предприятия и пожеланий заказчика .

704 1С:Предприятие 8.3. Практическое пособие разработчика На последних двух занятиях мы показали только принцип организации интерфейса прикладного решения по ролям и ограничения доступа к отдельным командам и разделам в целом в зависимости от прав пользователя .

Контрольные вопросы ; Как настроить командный интерфейс разделов приложения?

; Что такое раздел «Главное»?

; Как настроить командный интерфейс основного раздела?

; Что такое начальная страница?

; Как настроить начальную страницу для различных пользователей?

; Как настроить видимость команд по ролям?

Занятие 24

–  –  –

Общие сведения об обмене данными

Что такое план обмена

XML-сериализация

Запись/чтение документов XML

Универсальный механизм обмена данными

Константа для обмена данных

Доработка объектов конфигурации, участвующих в обмене

Добавление плана обмена

Процедуры обмена данными

Процедура записи данных

Процедура чтения данных

Проверка работы обмена данными

Запуск базы филиала

Механизм распределенных информационных баз

Основные сведения

Постановка задачи

Интерактивный обмен

Запуск базы отделения

Программный обмен

Изменение структуры узлов

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

706 1С:Предприятие 8.3. Практическое пособие разработчика На этом занятии мы познакомимся с механизмами обмена данными, которые содержит система «1С:Предприятие», и добавим в нашу конфигурацию возможность обмена данными с удаленными филиалами и отделениями .

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

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

Такая гибкость обмена данными достигается за счет того, что средства обмена данными «1С:Предприятия» могут использоваться в различных комбинациях. Кроме этого, формат обмена данными основан на языке XML, являющимся на сегодняшний день общепринятым средством представления данных .

К механизмам обмена данными могут быть отнесены:

Планы обмена, XML-сериализация, Средства чтения и записи документов XML .

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

Рис. 24.1. Схема взаимодействия механизмов обмена данными Занятие 24 При помощи планов обмена мы получаем информацию о том, какие элементы данных были изменены и в какой узел обмена их необходимо передать .

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

XML-сериализация позволяет преобразовать объект «1С:Предприятия» в последовательность данных, представленных в формате XML. Кроме этого, XML-сериализация выполняет и обратное преобразование – преобразует последовательность данных формата XML в объект «1С:Предприятия», при условии что имеется соответствующий тип «1С:Предприятия» .

Запись и чтение документов XML обеспечивают запись/чтение документов формата XML из встроенного языка .

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

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

Что такое план обмена Для того чтобы существовала возможность обмена какими-либо данными с кем-либо, необходимо некоторым образом идентифицировать тех, с кем мы будем обмениваться, и для каждого из них описать перечень обмена. Обе эти задачи позволяет решать объект конфигурации План обмена .

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

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

708 1С:Предприятие 8.3. Практическое пособие разработчика В одной конфигурации может существовать несколько планов обмена. Каждый план обмена определяет набор данных, которым будет производиться обмен в рамках данного плана, и сам механизм этого обмена .

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

УзнАй больше!

О структуре объектов встроенного языка, предназначенных для работы с планом обмена, можно прочитать в разделе «Краткий справочник разработчика. Планы обмена» на стр. 941 .

В обмене данными могут участвовать:

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

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

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

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

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

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

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

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

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

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

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

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

710 1С:Предприятие 8.3. Практическое пособие разработчика Сообщение с точки зрения плана обмена – это единица обмена информацией. Поэтому одной из важнейших составляющих плана обмена, помимо службы регистрации изменений, является инфраструктура сообщений .

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

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

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

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

XML-сериализация Термином XML-сериализация обозначается механизм, позволяющий представить объект «1С:Предприятия» в виде последовательности данных в формате XML. Кроме этого, XML-сериализация позволяет выполнить и обратное преобразование – представить последовательность данных формата XML в виде объекта «1С:Предприятия», если существует подходящий тип данных .

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

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

В результате XML-сериализации вся эта совокупность данных представляется в виде последовательности соответствующих данных формата XML .

Занятие 24 Вследствие обратного преобразования производится «сборка»

объекта при условии, что существует подходящий тип данных «1С:Предприятия» .

Запись/чтение документов XML В отличие от XML-сериализации, механизмы записи/чтения документов XML позволяют работать с данными формата XML на базовом уровне, без привязки к объектам «1С:Предприятия» .

В частности, они позволяют открывать файлы XML для чтения, читать данные из файлов, создавать новые файлы XML и записывать в них данные .

Универсальный механизм обмена данными Итак, наше ООО «На все руки мастер» открыло свой филиал в городе N и установило в нем такую же конфигурацию для учета работы филиала .

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

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

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

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

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

Теперь, когда создание новых элементов справочников и новых документов будет происходить в двух базах одновременно и независимо друг от друга, нам снова необходимо обеспечить уникальность 712 1С:Предприятие 8.3. Практическое пособие разработчика номеров кодов элементов справочников и номеров документов теперь уже «в пространстве» двух баз .

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

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

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

Для хранения префикса номеров мы используем объект конфигурации Константа .

Константа для обмена данных В режиме «Конфигуратор»

ВниМАние!

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

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

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

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

Откроем конфигуратор и добавим новый объект конфигурации Константа с именем ПрефиксНумерации .

Определим тип значения константы – Строка с фиксированной длиной 2 символа .

Занятие 24 Доработка объектов конфигурации, участвующих в обмене В режиме «Конфигуратор»

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

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

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

Добавим общий модуль Обмен .

В модуль поместим следующую функцию (листинг 24.1) .

листинг 24.1. Функция формирования префикса номера Функция ПолучитьПрефиксНомера() Экспорт Возврат Константы.ПрефиксНумерации.Получить();

КонецФункции Как вы видите, эта функция просто возвращает значение константы ПрефиксНумерации .

Теперь доработаем справочник Клиенты .

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

Добавим в него обработчик события ПриУстановкеНовогоКода (листинг 24.2) .

листинг 24.2. Обработчик события «ПриУстановкеНовогоКода»

Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс) Префикс = Обмен.ПолучитьПрефиксНомера();

КонецПроцедуры Событие ПриУстановкеНовогоКода возникает в момент, когда выполняется установка нового кода элемента справочника. Обратите внимание, что мы пишем этот код не в модуле формы, а в модуле 714 1С:Предприятие 8.3. Практическое пособие разработчика объекта, поскольку это событие возникает не для формы, а для объекта в целом .

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

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

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

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

В нашем случае это:

справочники:

Сотрудники, Склады, Номенклатура, ВариантыНоменклатуры, ДополнительныеСвойстваНоменклатуры, план видов характеристик: СвойстваНоменклатуры .

После этого у всех этих объектов и у справочника Клиенты нужно (в палитре свойств объекта конфигурации) увеличить длину кода до 11 символов .

Теперь займемся доработкой документов .

В модуль документа ПриходнаяНакладная добавим обработчик события ПриУстановкеНовогоНомера (листинг 24.3) .

листинг 24.3. Обработчик события «ПриУстановкеНовогоНомера»

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс) Префикс = Обмен.ПолучитьПрефиксНомера();

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

Добавление плана обмена В режиме «Конфигуратор»

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

Раскроем ветвь Общие дерева объектов конфигурации и добавим новый объект конфигурации План обмена с именем Филиалы, представление объекта – Филиал .

На закладке Данные создадим реквизит плана обмена Главный, имеющий тип Булево (рис. 24.2) .

Рис. 24.2. Реквизит плана обмена716 1С:Предприятие 8.3. Практическое пособие разработчика

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

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

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

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

Состав данных обмена должен выглядеть следующим образом (рис. 24.3) .

–  –  –

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

–  –  –

В окне элементов формы выделим корневой элемент Форма, вызовем из контекстного меню палитру его свойств и создадим обработчик события формы ПриСозданииНаСервере .

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

листинг 24.4. Обработчик события формы «ПриСозданииНаСервере»

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Объект.Ссылка = ПланыОбмена.Филиалы.ЭтотУзел() Тогда Элементы.Главный.Доступность = Ложь;

КонецЕсли;

КонецПроцедуры В этой процедуре мы используем метод менеджера плана обмена ЭтотУзел(), который возвращает ссылку на узел плана обмена, соответствующий данной информационной базе .

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

718 1С:Предприятие 8.3. Практическое пособие разработчика Суть этих действий будет заключаться в том, что при регистрации нового узла обмена мы должны будем сформировать для него все необходимые записи регистрации изменений для всех объектов конфигурации, входящих в данный план обмена. Это будет своего рода начальная синхронизация узла обмена всеми данными обмена .

Для этого на закладке Команды создадим команду ЗарегистрироватьИзменения .

В открывшейся палитре свойств нажмем кнопку открытия в строке Действие .

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

В модуле формы будут созданы шаблоны двух процедур:

клиентской процедуры ЗарегистрироватьИзменения() и серверной внеконтекстной процедуры ЗарегистрироватьИзмененияНаСервере(), которая вызывается из клиентской процедуры .

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

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

Поэтому изменим текст модуля следующим образом (листинг 24.5) .

листинг 24.5. Текст обработчика команды «ЗарегистрироватьИзменения»

&НаКлиенте Процедура ЗарегистрироватьИзменения(Команда) ЗарегистрироватьИзмененияНаСервере(Элементы.Список.ТекущаяСтрока);

В процедуру ЗарегистрироватьИзмененияНаСервере() мы поместим следующий текст (листинг 24.6) .

листинг 24.6. Процедура «ЗарегистрироватьИзмененияНаСервере»

&НаСервереБезКонтекста Процедура ЗарегистрироватьИзмененияНаСервере(Узел) // Регистрация изменений всех данных для узла .

ПланыОбмена.ЗарегистрироватьИзменения(Узел);

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

В этот метод передается ссылка на текущий узел плана обмена Филиалы .

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

В заключение перейдем на закладку Форма и перетащим команду ЗарегистрироватьИзменения из окна команд в командную панель формы .

В результате форма списка примет вид (рис. 24.5) .

Рис. 24.5. Форма списка плана обмена720 1С:Предприятие 8.3. Практическое пособие разработчика

Заметьте, что при перетаскивании команды в дерево элементов формы имя кнопки может не совпадать с именем команды, с которой она связана. В частности, при перетаскивании команды в командную панель формы к имени команды автоматически добавляется префикс «Форма». Поэтому кнопке присваивается имя ФормаЗарегистрироватьИзменения. Именно по этому имени мы будем обращаться к кнопке из встроенного языка (см. листинг 24.8) .

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

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

листинг 24.7. Функция «ПредопределенныйУзел()»

&НаСервереБезКонтекста Функция ПредопределенныйУзел(Узел) Возврат Узел = ПланыОбмена.Филиалы.ЭтотУзел();

КонецФункции Затем в окне элементов формы выделим элемент Список, вызовем его палитру свойств и создадим обработчик события ПриАктивизацииСтроки. Укажем, что событие будет обрабатываться только на клиенте .

Заполним обработчик следующим образом (листинг 24.8) .

листинг 24.8. Обработчик события «ПриАктивизацииСтроки()»

элемента формы «Список»

&НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) Если ПредопределенныйУзел(Элемент.ТекущаяСтрока) Тогда Элементы.ФормаЗарегистрироватьИзменения.Доступность = Ложь;

Иначе Элементы.ФормаЗарегистрироватьИзменения.Доступность = Истина;

–  –  –

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

На этом создание плана обмена завершено, и мы можем перейти непосредственно к созданию процедур обмена данными .

Процедуры обмена данными В режиме «Конфигуратор»

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

Добавим новый объект конфигурации с именем Обработка ОбменДанными. На закладке Формы создадим основную форму обработки. В окне редактора форм на закладке Команды создадим команду формы ВыполнитьОбмен. В строке Действие нажмем кнопку открытия .

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

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

Процедура ВыполнитьОбмен() автоматически будет заполнена следующим образом (листинг 24.9) .

листинг 24.9. Обработчик команды «ВыполнитьОбмен»

&НаКлиенте Процедура ВыполнитьОбмен(Команда) ВыполнитьОбменНаСервере();

КонецПроцедуры В процедуру ВыполнитьОбменНаСервере() поместим следующий текст (листинг 24.10) .

листинг 24.10. Создание процедуры «ВыполнитьОбменНаСервере»

&НаСервереБезКонтекста Процедура ВыполнитьОбменНаСервере() Экспорт ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();

Пока ВыборкаУзлов.Следующий() Цикл 722 1С:Предприятие 8.3. Практическое пособие разработчика // Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел) .

Если ВыборкаУзлов.Ссылка ПланыОбмена.Филиалы.ЭтотУзел() Тогда УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();

–  –  –

КонецПроцедуры Алгоритм работы этой процедуры заключается в следующем: в цикле мы перебираем узлы, которые содержатся в плане обмена Филиалы, и для всех узлов, кроме себя самого, производим сначала чтение сообщений, поступивших из других узлов обмена (процедуру ПрочитатьСообщенияСИзменениями мы создадим позднее) .

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

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

Рис. 24.6. Форма обработки Занятие 24 Процедура записи данных Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы .

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

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

листинг 24.11. Формирование имени файла в процедуре записи данных Процедура ЗаписатьСообщениеСИзменениями() Экспорт Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Каталог = КаталогВременныхФайлов();

// Сформировать имя временного файла .

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml";

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец выгрузки ------------";

Сообщение.Сообщить();

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

Для упрощения примера мы будем обмениваться сообщениями через каталог временных файлов. Имена сообщений стандартизованы и имеют вид MessageКодУзлаОтправителя_КодУзлаПолучателя.xml .

После этого обратимся к механизмам записи/чтения XML-документов и создадим новый объект – ЗаписьXML. С помощью него откроем новый XML-файл для записи, запишем в него объявление XML. В конце процедуры завершим запись XML и закроем файл (листинг 24.12) .

листинг 24.12. Создание объекта записи XML в процедуре записи данных Процедура ЗаписатьСообщениеСИзменениями() Экспорт Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

724 1С:Предприятие 8.3. Практическое пособие разработчика Каталог = КаталогВременныхФайлов();

// Сформировать имя временного файла .

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml";

// Создать объект записи XML // *** ЗаписьXML-документов .

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.Закрыть();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец выгрузки ------------";

Сообщение.Сообщить();

КонецПроцедуры Теперь мы обратимся к механизмам инфраструктуры сообщений и создадим новый объект ЗаписьСообщенияОбмена, метод которого НачатьЗапись() позволяет, кроме всего прочего, создать очередной номер сообщения и записать заголовок сообщения в XML. В конце процедуры мы опять же закончим запись сообщения (листинг 24.13) .

листинг 24.13. Создание очередного номера сообщения и запись заголовка сообщения в XML Процедура ЗаписатьСообщениеСИзменениями() Экспорт Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Каталог = КаталогВременныхФайлов();

// Сформировать имя временного файла .

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml";

// Создать объект записи XML .

// *** ЗаписьXML-документов .

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

ЗаписьXML.ЗаписатьОбъявлениеXML();

–  –  –

Сообщение.Сообщить();

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец выгрузки ------------";

Сообщение.Сообщить();

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

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

листинг 24.14. Получение выборки из записей регистрации изменений, предназначенных данному узлу Процедура ЗаписатьСообщениеСИзменениями() Экспорт Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Каталог = КаталогВременныхФайлов();

// Сформировать имя временного файла .

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml";

// Создать объект записи XML // *** ЗаписьXML-документов .

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

ЗаписьXML.ЗаписатьОбъявлениеXML();

// *** Инфраструктура сообщений .

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " Номер сообщения: " + ЗаписьСообщения.НомерСообщения;

Сообщение.Сообщить();

// Получить выборку измененных данных // *** Механизм регистрации изменений .

726 1С:Предприятие 8.3. Практическое пособие разработчика ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения .

Получатель,ЗаписьСообщения.НомерСообщения);

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец выгрузки ------------";

Сообщение.Сообщить();

КонецПроцедуры Теперь осталось только перебрать выборку записей в цикле и сериализовать их в открытый XML-файл (листинг 24.15) .

листинг 24.15. Перебор выборки записей и сериализация их в открытый XML-файл Процедура ЗаписатьСообщениеСИзменениями() Экспорт Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------»;

Сообщение.Сообщить();

Каталог = КаталогВременныхФайлов();

// Сформировать имя временного файла .

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml";

// Создать объект записи XML // *** ЗаписьXML-документов .

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

ЗаписьXML.ЗаписатьОбъявлениеXML();

// *** Инфраструктура сообщений .

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " Номер сообщения: " + ЗаписьСообщения.НомерСообщения;

Сообщение.Сообщить();

–  –  –

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец выгрузки ------------";

Сообщение.Сообщить();

КонецПроцедуры На этом создание процедуры записи данных обмена закончено .

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

листинг 24.16. Формирование имени файла, содержащего данные обмена Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

КонецПроцедуры Мы формируем имя файла, которое надеемся найти в этом каталоге, а затем, создав новый объект Файл с таким именем, проверяем, существует ли он. Если такого файла нет, мы завершаем работу процедуры .

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

Теперь добавим в процедуру команды чтения найденного файла с данными обмена (листинг 24.17) .

728 1С:Предприятие 8.3. Практическое пособие разработчика листинг 24.17. Добавление чтения найденного файла с данными обмена Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

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

листинг 24.18. Добавление чтения заголовка XML-сообщения Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

// *** Чтение документов XML // Попытаться открыть файл .

ЧтениеXML = Новый ЧтениеXML;

Попытка ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Невозможно открыть файл обмена данными.";

Сообщение.Сообщить();

–  –  –

КонецПопытки;

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

730 1С:Предприятие 8.3. Практическое пособие разработчика УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

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

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

листинг 24.19. Добавление проверки сообщения Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

// Сообщение предназначено не для этого узла .

Если ЧтениеСообщения.Отправитель Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

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

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

листинг 24.20. Удаление записей регистрации изменений для узла отправителя Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

// Сформировать имя файла .

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

732 1С:Предприятие 8.3. Практическое пособие разработчика

–  –  –

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

// Сообщение предназначено не для этого узла .

Если ЧтениеСообщения.Отправитель Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

// Удаляем регистрацию изменений для узла отправителя сообщения .

// *** Служба регистрации изменений .

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

–  –  –

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

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

листинг 24.21. Чтение данных из сообщения Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

// *** Чтение документов XML // Попытаться открыть файл .

ЧтениеXML = Новый ЧтениеXML;

Попытка ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Невозможно открыть файл обмена данными.";

Сообщение.Сообщить();

–  –  –

КонецПопытки;

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

// Сообщение предназначено не для этого узла .

Если ЧтениеСообщения.Отправитель Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

734 1С:Предприятие 8.3. Практическое пособие разработчика

–  –  –

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

КонецПроцедуры Чтение данных выполняется в цикле, причем мы снова обращаемся к механизмам XML-сериализации и методом глобального контекста ВозможностьЧтенияXML() получаем очередной тип данных XML из объекта ЧтениеXML и определяем, имеется ли соответствующий тип «1С:Предприятия». В случае успеха выполнение цикла продолжается .

И первое, что нам нужно сделать, – представить данные XML в виде некоторого значения, имеющего тип «1С:Предприятия». Для этого мы используем метод глобального контекста ПрочитатьXML(), листинг 24.22 .

листинг 24.22. Представление данных XML в виде значения, имеющего тип Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Невозможно открыть файл обмена данными.";

Сообщение.Сообщить();

–  –  –

КонецПопытки;

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

// Сообщение предназначено не для этого узла .

Если ЧтениеСообщения.Отправитель Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

// Удаляем регистрацию изменений для узла отправителя сообщения .

// *** Служба регистрации изменений .

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

// Читаем данные из сообщения *** XML-сериализация .

КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

КонецПроцедуры 736 1С:Предприятие 8.3. Практическое пособие разработчика В результате выполнения этого метода переменная Данные будет содержать объект «1С:Предприятия», соответствующий данным XML .

Теперь, после того как объект «1С:Предприятия» получен, следует разрешить возможную коллизию (листинг 24.23) .

листинг 24.23. Разрешение возможных коллизий Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

–  –  –

Если ЧтениеСообщения.Отправитель Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

// Удаляем регистрацию изменений для узла - отправителя сообщения .

// *** Служба регистрации изменений .

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

// Читаем данные из сообщения *** XML-сериализация .

КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

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

Теперь единственное, что нам осталось сделать, – записать полученные данные (листинг 24.24) .

738 1С:Предприятие 8.3. Практическое пособие разработчика листинг 24.24. Запись полученных данных Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов();

–  –  –

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = " – Считывается файл " + ИмяФайла;

Сообщение.Сообщить();

// Загрузить из найденного файла // *** Инфраструктура сообщений .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными – файла XML .

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

// Сообщение предназначено не для этого узла .

Если ЧтениеСообщения.Отправитель Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

–  –  –

// Записать полученные данные .

Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;

Данные.ОбменДанными.Загрузка = Истина;

Данные.Записать();

КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "-------- Конец загрузки ------------";

Сообщение.Сообщить();

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

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

На этом создание процедуры получения и обработки данных обмена закончено .

740 1С:Предприятие 8.3. Практическое пособие разработчика Проверка работы обмена данными В режиме «Конфигуратор»

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

В открывшемся окне свойств Дополнительно для этой формы укажем принадлежность формы к подсистеме Предприятие (рис. 24.7) .

Рис. 24.7. Окно «Дополнительно» формы констант «ОбщиеНастройки»

В окне редактирования объекта конфигурации План обмена Филиалы и объекта Обработка ОбменДанными на закладке Подсистемы также укажем их принадлежность к подсистеме Предприятие .

Затем настроим командный интерфейс подсистемы Предприятие, чтобы доступ к командам открытия плана обмена, обработки, а также формы констант имел только Администратор, и переместим команду Филиалы в самое начало группы Панель навигации.Важное. А также в группе команд Панель действий.Создать включим видимость у команды Филиал: создать только для роли Администратор.

Затем установим следующий порядок следования команд в группе Панель действий.Сервис:

Общие настройки, Обмен данными .

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

Обновим конфигурацию базы данных (F7). Затем сохраним в созданный каталог нашу конфигурацию, выполнив команду главного меню Конфигурация Сохранить конфигурацию в файл… Занятие 24

Рис. 24.8. Командный интерфейс подсистемы «Предприятие»

В режиме «1С:Предприятие»

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

Прежде всего, зададим значение константы Префикс нумерации – ЦБ .

Для этого выполним команду Общие настройки в подменю Сервис панели команд раздела Предприятие (рис. 24.9) .

Рис. 24.9. Значение константы «Префикс нумерации»

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

742 1С:Предприятие 8.3. Практическое пособие разработчика Для этого выполним команду Филиалы в панели команд раздела Предприятие. В списке планов обмена уже присутствует одна запись .

Откроем и отредактируем ее .

Код базы будет ЦБ, а наименование – Центральная база .

Не забудьте, что именно код идентифицирует узлы обмена в различных базах, поэтому в базе филиала мы будем создавать узлы с такими же кодами (рис. 24.10) .

–  –  –

Нажмем Записать и закрыть .

Затем нажмем кнопку Создать или воспользуемся командой Филиал в подменю Создать .

Создадим новый узел, который будет соответствовать базе филиала, присвоим ему код Фил и наименование Филиал (рис. 24.11) .

–  –  –

Выделим в списке новый узел Филиал и нажмем кнопку Зарегистрировать изменения .

Теперь вызовем обработку Обмен данными и нажмем Выполнить обмен .

В окне сообщений появится следующий текст (рис. 24.12) .

–  –  –

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

Запуск базы филиала Настало время перейти к базе филиала .

Запустим «1С:Предприятие» и добавим в список баз новую базу с пустой конфигурацией, которая будет расположена в созданном нами каталоге базы филиала. Для этого в окне запуска «1С:Предприятия» нажмем кнопку Добавить и выберем Создание новой информационной базы. Нажмем Далее .

В следующем окне выберем Создание информационной базы без конфигурации для … загрузки выгруженной ранее информационной базы .

Нажмем Далее, затем укажем наименование информационной базы, например, база Филиала .

Нажмем Далее, затем укажем каталог информационной базы, где находится сохраненная конфигурация, например, D:\ Практическое пособие разработчика 8.3\Филиал, нажмем Далее и затем Готово .

744 1С:Предприятие 8.3. Практическое пособие разработчика В режиме «Конфигуратор»

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

Теперь загрузим конфигурацию из файла (Конфигурация Загрузить конфигурацию из файла…) .

В окне выбора файла выберем каталог и имя файла, где находится сохраненная конфигурация, например, D:\Практическое пособие разработчика 8.3\Филиал\1Cv8.cf. На вопрос системы об обновлении конфигурации ответим утвердительно и в окне изменений структуры конфигурации нажмем Принять .

Теперь все объекты конфигурации перенесены из нашей центральной базы .

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

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

В нашем случае при открытии списка складов в базе филиала будет автоматически создан элемент справочника Склады, связанный с предопределенным элементом справочника с именем Основной .

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

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

Занятие 24 Чтобы избежать такой ситуации, откроем окно редактирования объекта конфигурации Справочник Склады, перейдем на закладку Прочее и установим свойство Обновление предопределенных данных в значение Не обновлять автоматически (рис. 24.13) .

Рис. 24.13. Редактирование свойств справочника «Склады»

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

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

Первым делом зададим значение константы ПрефиксНумерации – ФЛ (рис. 24.14) .

Рис. 24.14. Редактирование константы 746 1С:Предприятие 8.3. Практическое пособие разработчика Затем откроем план обмена Филиал и опишем предопределенный узел (узел текущей информационной базы). Для этого выполним команду Филиалы в панели команд раздела Предприятие .

В списке планов обмена уже присутствует одна запись. Откроем и отредактируем ее. Зададим код Фил и наименование Филиал (рис. 24.15) .

–  –  –

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

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

Занятие 24 Запустим обработку Обмен данными и нажмем Выполнить обмен .

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

–  –  –

пРиМеЧАние Чтобы увидеть клиентов, перенесенных из центральной базы, нужно обновить список клиентов (Еще Обновить – F5) .

Теперь проверим, как будет происходить обмен в другую сторону .

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

Обратите внимание, что нумерация кода нового клиента начинается с единицы и имеет префикс ФЛ .

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

748 1С:Предприятие 8.3. Практическое пособие разработчика Механизм распределенных информационных баз Механизм распределенных информационных баз является развитием универсального механизма обмена данными .

ВниМАние!

Если вы используете учебную версию платформы «1С:Предприятие 8.3», то воспроизвести этот пример не удастся, так как учебная версия не поддерживает работу с распределенными информационными базами .

Он реализует привычную по прежним версиям «1С:Предприятия»

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

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

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

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

В ходе создания примера мы рассмотрим оба варианта организации обмена в распределенных информационных базах .

Основные сведения Как мы уже говорили выше, распределенная информационная база должна иметь четко определенную древовидную структуру. Количество уровней в такой структуре не ограничено, главное – между двумя связанными узлами всегда должно быть определено отношение «главный – подчиненный» (рис. 24.18) .

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

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

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

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

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

750 1С:Предприятие 8.3. Практическое пособие разработчика Для любого подчиненного узла возможно создание начального образа – информационной базы, созданной на основании конфигурации и данных главного узла в соответствии с правилами, определяемыми планом обмена. Процедура создания начального образа узла может выполняться неоднократно, при этом удаляются все записи изменений в базе главного узла для подчиненного узла. Сразу после создания начальный образ готов к обмену с главным узлом .

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

Постановка задачи В качестве примера, на котором мы проиллюстрируем использование механизма распределенных информационных баз, будет создание нескольких отделений нашего ООО «На все руки мастер» .

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

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

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

Интерактивный обмен В режиме «Конфигуратор»

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

Для этого плана обмена мы установим свойство Распределенная информационная база (рис. 24.19) .

Занятие 24

–  –  –

На закладке Подсистемы укажем принадлежность плана обмена к подсистеме Предприятие .

В окне настройки командного интерфейса этой подсистемы перенесем команду для открытия плана обмена Отделения в группу Панель навигации.Важное (после команды Филиалы) и установим видимость этой команды только для роли Администратор. А также в группе команд Панель действий.Создать включим видимость у команды Отделение: создать только для роли Администратор .

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки. Откроем план обмена Отделения и зададим параметры центрального узла (предопределенный элемент плана обмена). Для этого выполним команду Отделения в панели команд раздела Предприятие .

В списке планов обмена уже присутствует одна запись. Это предопределенный узел нашей информационной базы. Откроем и отредактируем его .

Внесем код ЦБ и наименование Центральная база. После этого создадим новый узел с кодом Отд и наименованием Отделение .

Для созданного нами узла доступны три кнопки в командной панели формы плана обмена: Записать изменения, Прочитать изменения и Создать начальный образ (рис. 24.21) .

Рис. 24.21. Команды работы с распределенной информационной базой

–  –  –

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

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

Рис. 24.22. Создание начального образа информационной базы Вернемся в диалог создания начального образа информационной базы и нажмем Закрыть .

Система создаст в указанном каталоге начальный образ информационной базы нашего отделения .

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

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

Для этого в окне запуска «1С:Предприятия» нажмем кнопку Добавить и выберем Добавление существующей информационной базы .

754 1С:Предприятие 8.3. Практическое пособие разработчика Нажмем Далее, затем укажем наименование информационной базы, например, база Отделения. Нажмем Далее, затем укажем каталог информационной базы, например, D:\Практическое пособие разработчика 8.3\Отделение, нажмем Далее и затем Готово .

В режиме «Конфигуратор»

Откроем созданную нами конфигурацию база Отделения в режиме Конфигуратор .

Выполним команду главного меню Конфигурация Открыть конфигурацию. Мы видим, что конфигурация нашего отделения стала защищенной от изменений средствами управления распределенной информационной базой (рис. 24.23) .

–  –  –

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

Теперь проверим работу обмена данными .

Откроем список констант и зададим значение константы ПрефиксНумерации – ОТ .

подскАзкА Если занятие № 24 Обмен данными выполняется после занятия № 25 Функциональные опции, в панели разделов может быть не видно каких-то разделов, использующихся в данном узле (например, Бухгалтерия) .

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

После этого откроем справочник клиентов и добавим в него нового клиента .

756 1С:Предприятие 8.3. Практическое пособие разработчика Затем откроем план обмена Отделения, выделим узел Центральная база (тот узел, в который нужно передать изменения) и выполним команду Записать изменения. В появившемся окне нажмем Записать и сохранить в файл, на следующем шаге нажмем Сохранить и укажем имя файла сообщения (рис. 24.25) .

Рис. 24.25. Диалог записи сообщения с изменениями

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

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

Убедимся, что новый клиент, созданный в базе отделения, присутствует и в центральной базе. Закроем окно «1С:Предприятия» для центральной базы .

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

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

Занятие 24 После этого закроем окно «1С:Предприятия» и конфигуратор информационной базы отделения, запустим эту базу в режиме 1С:Предприятие и выполним чтение изменений от узла Центральная база .

По окончании чтения система выдаст следующее сообщение (рис. 24.26) .

Рис. 24.26. Системное сообщение

Закроем окно «1С:Предприятия», откроем конфигуратор базы отделения и увидим, что в основной конфигурации появилась новая константа НоваяКонстанта, а также новый предопределенный элемент в справочнике Склады с именем Офис. То есть изменения, внесенные в конфигурацию центральной базы, были автоматически перенесены в конфигурацию подчиненного узла .

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

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

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

Но самих данных, например, новой записи в справочнике Склады, связанной с предопределенным элементом Офис, мы пока не увидим .

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

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

758 1С:Предприятие 8.3. Практическое пособие разработчика Такой порядок принятия изменений не зависит от того, относятся измененные данные к существующим объектам конфигурации или к новым .

В заключение удалим объект НоваяКонстанта из дерева объектов нашей конфигурации. Также удалим предопределенный элемент Офис из справочника Склады .

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

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

В режиме «Конфигуратор»

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

На закладке Формы создадим основную форму обработки. В окне редактора форм на закладке Реквизиты добавим реквизит формы с типом ПолеВводаОтделение ПланОбменаСсылка.Отделения и перетащим его в окно элементов формы .

В открывшейся палитре свойств этого поля зададим заголовок – Отделение, вид поля (Поле ввода) оставим по умолчанию (рис. 24.27) .

Рис. 24.27. Редактирование формы обработки Занятие 24 Затем на закладке Команды поочередно создадим команды СоздатьНачальныйОбраз, ЗаписатьИзменения и ПрочитатьИзменения .

Нажмем кнопку открытия в строке Действие для каждой команды .

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

В результате форма обработки примет вид (рис. 24.28) .

Рис. 24.28. Форма обработки

Откроем палитру свойств кнопки СоздатьНачальныйОбраз и снимем флажок у свойства Доступность .

Таким образом, при открытии обработки кнопка будет недоступной, пока не выбран узел плана обмена в поле ПолеВводаОтделение .

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

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

760 1С:Предприятие 8.3. Практическое пособие разработчика листинг 24.25. Функция «ПредопределенныйУзел()»

&НаСервереБезКонтекста Функция ПредопределенныйУзел(Узел) Возврат Узел = ПланыОбмена.Отделения.ЭтотУзел();

КонецФункции Затем в окне элементов формы выделим элемент ПолеВводаОтделение, вызовем его палитру свойств и создадим клиентский обработчик события ОбработкаВыбора .

Заполним обработчик следующим образом (листинг 24.26) .

листинг 24.26. Процедура «ПолеВводаОтделениеОбработкаВыбора()»

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

Иначе Элементы.СоздатьНачальныйОбраз.Доступность = Истина;

КонецЕсли;

КонецПроцедуры В этой процедуре доступность кнопки СоздатьНачальныйОбраз определяется в зависимости от значения функции ПредопределенныйУзел(), в которую передается ссылка на выбранный узел (ВыбранноеЗначение) .

Теперь заполним обработчик команды СоздатьНачальныйОбраз следующим образом (листинг 24.27) .

листинг 24.27. Обработчик нажатия кнопки «Создать начальный образ»

&НаКлиенте Процедура СоздатьНачальныйОбраз(Команда) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

Диалог.Заголовок = "Укажите каталог информационной базы:";

Если Диалог.Выбрать() Тогда СоздатьНачальныйОбразНаСервере(ПолеВводаОтделение, Диалог.Каталог);

–  –  –

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

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

листинг 24.28. Процедура «СоздатьНачальныйОбразНаСервере»

&НаСервереБезКонтекста Процедура СоздатьНачальныйОбразНаСервере(Узел, КаталогСоединения) ПланыОбмена.СоздатьНачальныйОбраз(Узел, "File =""" + КаталогСоединения + """");

КонецПроцедуры Теперь создадим обработчик команды Записать изменения .

Текст обработчика будет выглядеть следующим образом (листинг 24.29) .

листинг 24.29. Обработчик нажатия кнопки «Записать изменения»

&НаКлиенте Процедура ЗаписатьИзменения(Команда) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Заголовок = "Укажите файл обмена:";

Если Диалог.Выбрать() Тогда ЗаписатьИзмененияНаСервере(ПолеВводаОтделение, Диалог.ПолноеИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Запись изменений завершена.";

Сообщение.Сообщить();

КонецЕсли;

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

762 1С:Предприятие 8.3. Практическое пособие разработчика В этой процедуре мы создаем объект ЗаписьXML для работы с этим файлом .

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

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

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

листинг 24.30. Процедура «ЗаписатьИзмененияНаСервере»

&НаСервереБезКонтекста Процедура ЗаписатьИзмененияНаСервере(Узел, ИмяФайла) // Создать и проинициализировать объект ЗаписьXML .

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

// Создать объект ЗаписьСообщенияОбмена и начать запись сообщения .

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Узел);

// Записать содержимое тела сообщения обмена данными распределенной ИБ .

ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);

// Закончить запись сообщения и запись XML .

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

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

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

И последним мы создадим обработчик команды Прочитать изменения .

Текст обработчика будет выглядеть следующим образом (листинг 24.31) .

листинг 24.31. Обработчик нажатия кнопки «Прочитать изменения»

&НаКлиенте Процедура ПрочитатьИзменения(Команда) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Заголовок = "Укажите файл обмена:";

Если Диалог.Выбрать() Тогда ПрочитатьИзмененияНаСервере(Диалог.ПолноеИмяФайла);

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Чтение изменений завершено.";

Сообщение.Сообщить();

КонецЕсли;

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

В этой процедуре мы создаем объект ЧтениеXML для работы с этим файлом. Затем создаем объект ЧтениеСообщенияОбмена для чтения сообщения, содержащегося в указанном файле .

Затем методом ПрочитатьИзменения() объекта ПланыОбменаМенеджер мы читаем полученное сообщение .

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

764 1С:Предприятие 8.3. Практическое пособие разработчика листинг 24.32. Процедура «ПрочитатьИзмененияНаСервере»

&НаСервереБезКонтекста Процедура ПрочитатьИзмененияНаСервере(ИмяФайла) // Создать и проинициализировать объект ЧтениеXML .

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.ОткрытьФайл(ИмяФайла);

// Создать объект ЧтениеСообщенияОбмена и начать чтение сообщения .

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

// Прочитать содержимое тела сообщения .

ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);

// Закончить чтение сообщения и чтение XML .

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

КонецПроцедуры В заключение на закладке Подсистемы укажем принадлежность обработки ОбменСОтделениями к подсистеме Предприятие .

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

Рис. 24.29. Настройка командного интерфейса основного раздела для администратора Занятие 24 А также расположим формы списка планов обмена Филиалы и Отделения на начальной странице администратора. Вызовем настройку начальной страницы (Открыть рабочую область начальной страницы) из контекстного меню корня дерева объектов конфигурации .

Создадим форму списка плана обмена Отделения. Добавим формы списка планов обмена Филиалы и Отделения в левую часть начальной страницы и зададим видимость этих форм только для роли Администратор (рис. 24.30) .

Рис. 24.30. Настройка начальной страницы для администратора Теперь выполним пример программного обмена данными .

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

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

766 1С:Предприятие 8.3. Практическое пособие разработчика Запустим «1С:Предприятие» для пользователя с ролью Администратор. Откроется начальная страница приложения (рис. 24.31) .

Рис. 24.31. Начальная страница «1С:Предприятия» для администратора Из командной панели раздела Главное, из подменю Сервис откроем форму обработки Обмен с отделениями. Выберем в поле ввода Отделение узел обмена Отделение, для которого мы хотим создать начальный образ нашей информационной базы (рис. 24.32) .

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

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

Затем откроем базу отделения (куда был выгружен начальный образ центральной базы) в конфигураторе. Создадим в ней пользователя с ролью Администратор и запустим «1С:Предприятие» .

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

Рис. 24.32. Пример программного обмена с отделениями Убедимся, что сотрудник центральной базы (с префиксом кода ЦБ) присутствует в базе отделения .

Следует лишь сделать несколько заключительных замечаний .

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

ПриОтправкеДанныхГлавному(),

ПриОтправкеДанныхПодчиненному(),

ПриПолученииДанныхОтГлавного(), ПриПолученииДанныхОтПодчиненного() .

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

Работу этих событий можно увидеть, добавив в модуль объекта План обмена Отделения следующий текст (листинг 24.33) .

768 1С:Предприятие 8.3. Практическое пособие разработчика листинг 24.33. Просмотр работы событий объекта «ПланОбменаОбъект»

Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента) Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "ПриОтправкеДанныхГлавному " + ЭлементДанных;

Сообщение.Сообщить();

КонецПроцедуры Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента) Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "ПриОтправкеДанныхПодчиненному " + ЭлементДанных;

Сообщение.Сообщить();

КонецПроцедуры Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "ПриПолученииДанныхОтГлавного " + ЭлементДанных;

Сообщение.Сообщить();

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "ПриПолученииДанныхОтПодчиненного " + ЭлементДанных;

Сообщение.Сообщить();

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

Параметр ОтправкаЭлемента позволяет управлять тем, какая информация будет помещена в сообщение.

Он может принимать три значения:

Авто – значение по умолчанию. Указывает на то, что элемент данных будет помещен в сообщение;

Удалить – в сообщение будет помещено значение, предназначенное для удаления этого элемента данных;

Игнорировать – в сообщение не будет помещено ничего, связанного с этим элементом данных .

Занятие 24 Параметр ПолучениеЭлемента позволяет указать, будет ли прочитанный элемент данных записан в базу данных или нет.

Параметр также может принимать три значения:

Авто – значение по умолчанию. Если элемент данных получен от главного узла, он будет записан всегда. Если элемент данных получен от подчиненного узла, он будет записан, только если не зарегистрированы изменения для этого элемента данных;

Принять – полученный элемент данных будет записан всегда;

Игнорировать – проигнорировать получение элемента данных и ничего не записывать .

Также в событиях получения данных существует третий параметр – ОтправкаНазад, имеющий тип Булево .

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

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

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

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

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

Для этого следует использовать метод УстановитьГлавныйУзел() объекта ПланыОбменаМенеджер .

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

770 1С:Предприятие 8.3. Практическое пособие разработчика Допустим, необходимо переместить один из подчиненных узлов в корень дерева (рис. 24.33) .

–  –  –

Для этого нужно выполнить следующие действия (листинг 24.34) .

листинг 24.34. Перемещение Узла2 в корень дерева // В информационной базе Узла2 .

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Неопределено);

// В информационной базе Узла1 .

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Узел2);

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

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

листинг 24.35. Перемещение Узла2 в корень дерева // В информационной базе Узла1 .

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Неопределено);

Занятие 24 Рис. 24.34. Отключение поддерева от распределенной информационной базы Кроме этого, мы можем создавать распределенную информационную базу из отдельных информационных баз с идентичной конфигурацией (рис. 24.35, листинг 24.36) .

–  –  –

листинг 24.36. Создание распределенной информационной базы из баз с идентичной конфигурацией // В информационных базах Узла2, Узла3 и Узла4 .

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Узел1);

772 1С:Предприятие 8.3. Практическое пособие разработчика Контрольные вопросы ; Какие средства входят в состав механизма универсального обмена данными?

; Для чего предназначен объект конфигурации «План обмена»?

; Каковы основные составляющие плана обмена?

; Что такое узлы плана обмена?

; Что такое состав плана обмена, и для каких элементов данных возможен обмен данными?

; Что такое авторегистрация?

; Для чего предназначен механизм регистрации изменений?

; Как работает инфраструктура сообщений?

; Каково назначение XML-сериализации?

; Для чего используется запись/чтение документов XML?

; Как создать план обмена?

; Как настроить конфигурацию для обмена данными?

; Как реализовать обмен данными в общем виде?

; Как реализовать обмен данными в распределенной информационной базе?

; Как программно управлять обменом данными в распределенной информационной базе?

; Особенности обмена данными, содержащими предопределенные элементы?

; Как изменить структуру дерева распределенной информационной базы?

Занятие 25 Функциональные опции пРодолжительность Ориентировочная продолжительность занятия – 30 минут .

Опции «Бухгалтерский учет» и «Расчет зарплаты»

В режиме «Конфигуратор»

В режиме «1С:Предприятие»

Опция «Учет клиентов»

В режиме «Конфигуратор»

В режиме «1С:Предприятие»

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

774 1С:Предприятие 8.3. Практическое пособие разработчика Вот мы и создали с вами небольшое прикладное решение, которое позволило автоматизировать работу нашей ремонтной фирмы ООО «На все руки мастер». Теперь настало время для одного чудесного превращения .

Дело в том, что наше прикладное решение настолько понравилось сотрудникам ООО «На все руки мастер», что они рассказали о нем своим соседям – косметическому салону «Королева красоты» .

Сотрудники салона посмотрели, как работает наше прикладное решение, и обратились к нам с просьбой автоматизировать и их салон тоже .

И мы, конечно же, с радостью согласились по одной простой причине:

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

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

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

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

В то же время в косметическом салоне может не потребоваться какая-то функциональность, которая уже есть в нашей конфигурации .

Что делать? Удалять ненужные объекты конфигурации, программный код?

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

Поэтому в «1С:Предприятии» существует механизм функциональных опций, который позволяет включать/выключать при внедрении целые блоки функциональности, не изменяя при этом саму конфигурацию .

Занятие 25 Функциональные опции позволяют разработчику выделить некоторую часть функциональности прикладного решения, которую можно оперативно включать или выключать на этапе внедрения и/или в процессе работы системы .

Опции «Бухгалтерский учет»

и «Расчет зарплаты»

Предположим, что косметический салон по каким-то причинам не ведет бухгалтерский учет и расчет заработной платы. Для отключения соответствующей функциональности мы создадим функциональные опции БухгалтерскийУчет и РасчетЗарплаты, установим их для соответствующих объектов конфигурации и отключим их в режиме 1С:Предприятие .

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

В режиме «Конфигуратор»

Поскольку значения функциональных опций обязательно должны где-то храниться, добавим сначала константы БухгалтерскийУчет и РасчетЗарплаты с типом Булево, в которых будут храниться значения функциональных опций (рис. 25.1) .

Рис. 25.1. Создание константы776 1С:Предприятие 8.3. Практическое пособие разработчика

Если значение константы Истина, значит, функциональная опция включена. Если значение Ложь, функциональная опция выключена .

Затем раскроем ветвь Общие, выделим ветвь Функциональные опции и создадим функциональные опции БухгалтерскийУчет и РасчетЗарплаты, указав в свойстве Хранение соответствующие константы (рис. 25.2) .

Рис. 25.2. Создание функциональной опции

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

К ведению бухгалтерского учета в нашей конфигурации относятся следующие объекты:

справочник Субконто, документ ВводНачальныхОстатковНоменклатуры, отчет ОборотноСальдоваяВедомость, план видов характеристик ВидыСубконто, план счетов Основной, регистр бухгалтерии Управленческий .

На закладке Состав отметим эти объекты для функциональной опции БухгалтерскийУчет (рис. 25.3) .

Занятие 25 Рис. 25.3. Состав объектов функциональной опции «Бухгалтерский учет»

К расчету заработной платы в нашей конфигурации относятся следующие объекты:

справочник ВидыГрафиковРаботы, документ НачисленияСотрудникам, отчет НачисленияСотрудникам, отчет Перерасчет, отчет ДиаграммаНачислений, план видов расчета ОсновныеНачисления, регистр сведений ГрафикиРаботы, регистр расчета Начисления .

На закладке Состав отметим эти объекты для функциональной опции РасчетЗарплаты .

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

778 1С:Предприятие 8.3. Практическое пособие разработчика Рис. 25.4. Значение функциональных опций для объектов бухгалтерского учета Таким образом, отображение объектов конфигурации в интерфейсе приложения зависит от того, включена связанная с ними функциональная опция (значение соответствующей константы – Истина) или нет .

У объектов, относящихся к расчету зарплаты, мы увидим включенной функциональную опцию РасчетЗарплаты на закладке Функциональные опции окна редактирования этих объектов .

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

пРиМеЧАние Если включить в состав функциональной опции какую-либо подсистему, то мы вообще не увидим соответствующего раздела в «1С:Предприятии», пока данная функциональная опция отключена .

–  –  –

Рис. 25.5. Установка функциональной опции для независимых объектов Теперь нам нужно добавить в нее новые константы, чтобы затем в пользовательском режиме открывать форму констант и изменять значение функциональных опций .

На закладке Реквизиты этой формы раскроем основной реквизит и перетащим константы НаборКонстант БухгалтерскийУчет и РасчетЗарплаты в окно элементов формы (рис. 25.6) .

Рис. 25.6. Редактирование общей формы констант 780 1С:Предприятие 8.3. Практическое пособие разработчика В режиме «1С:Предприятие»

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

В открывшейся форме констант мы видим, что обе константы имеют значение Ложь (рис. 25.7) .

–  –  –

Это значит, что соответствующие функциональные опции отключены .

И действительно, в разделах Бухгалтерия и Расчет зарплаты мы не видим команд для ведения бухучета и расчета заработной платы (рис. 25.8) .

–  –  –

Теперь если через некоторое время руководство косметического салона пожелает вести расчет зарплаты, то администратор включит соответствующую опцию Расчет зарплаты, и все!

–  –  –

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

В результате раздел Расчет зарплаты будет выглядеть следующим образом (рис. 25.10) .

Рис. 25.10. Интерфейс раздела «Расчет зарплаты»

782 1С:Предприятие 8.3. Практическое пособие разработчика А если мы включим и вторую функциональную опцию Бухгалтерский учет, то мы восстановим интерфейс прикладного решения, разработанный нами для фирмы ООО «На все руки мастер» .

Вот так быстро и легко происходит настройка прикладного решения под требования заказчика .

Опция «Учет клиентов»

Нужно отметить, что функциональные опции могут влиять не только на командный интерфейс приложения, но и на внешний вид форм, используемых в прикладном решении. Кроме этого, включение/ выключение функциональности можно выполнять и без перезапуска клиентского приложения. А если к этому прибавить возможности работы с функциональными опциями во встроенном языке, то становится понятным, что механизм функциональных опций может сделать процесс внедрения и настройки прикладного решения у заказчика простым и понятным даже для неопытного пользователя .

Рассмотрим еще один пример .

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

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

Также доработаем существующие функциональные опции, включив в них и подсистемы Бухгалтерия и РасчетЗарплаты, чтобы наше решение выглядело «законченным». Раз бухгалтерия не нужна, значит ее нет нигде .

В режиме «Конфигуратор»

Откроем состав функциональной опции БухгалтерскийУчет и добавим в него подсистему Бухгалтерия .

Аналогичным образом добавим в состав функциональной опции РасчетЗарплаты подсистему РасчетЗарплаты (рис. 25.11) .

Теперь займемся созданием новой функциональной опции .

Занятие 25

–  –  –

Добавим функциональную опцию УчетКлиентов и укажем, что ее значение будет храниться в константе УчетКлиентов (рис. 25.13) .

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

784 1С:Предприятие 8.3. Практическое пособие разработчика

–  –  –

Прежде всего – справочник Клиенты. Затем – реквизит Клиент документа ОказаниеУслуги. И в заключение – измерение Клиент регистра накопления Продажи (рис. 25.14) .

–  –  –

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

Прежде всего перенесем в состав элементов формы нашу новую константу УчетКлиентов (рис. 25.15) .

–  –  –

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

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

В открывшемся модуле формы, в обработчике события формы ПослеЗаписи напишем единственную строку (листинг 25.1) .

листинг 25.1. Обработчик события «ПослеЗаписи» формы &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) ОбновитьИнтерфейс();

КонецПроцедуры 786 1С:Предприятие 8.3. Практическое пособие разработчика ОбновитьИнтерфейс() – это метод глобального контекста, который обновляет командный интерфейс, начальную страницу и открытые формы с учетом текущих значений функциональных опций и их параметров .

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

Сейчас при открытии формы ОбщиеНастройки в режиме 1С:Предприятие форма, открытая в основном окне программы, блокируется. Так происходит потому, что по умолчанию конструктор форм установил для этой формы свойство РежимОткрытияОкна в значение Блокировать окно владельца .

Поэтому перейдем за закладку Форма, в дереве элементов формы выделим корневой элемент, в палитре свойств найдем свойство РежимОткрытияОкна и установим его в значение Независимый (рис .

25.16) .

–  –  –

В режиме «1С:Предприятие»

Запустим систему в режиме 1С:Предприятие. В разделе Главное выполним команду Общие настройки. Мы видим, что функциональная опция Учет клиентов отключена (рис. 25.17) .

Рис. 25.17. Функциональная опция «УчетКлиентов» отключена Проверим, как это скажется на документе Оказание услуги. Перейдем в раздел Оказание услуг и выполним команду Оказание услуг .

Откроем любой документ Оказание услуги, например № 2 (рис. 25.18) .

Рис. 25.18. Документ «Оказание услуги»

788 1С:Предприятие 8.3. Практическое пособие разработчика Мы видим, что в документе нет поля Клиент, а если в панели навигации формы перейти к движениям регистра Продажи, то мы не увидим колонки Клиент. Также в разделе Предприятие нет команды Клиенты .

Теперь вернемся в форму Общие настройки, установим флажок Учет клиентов и нажмем кнопку Записать .

Интерфейс прикладного решения изменится. Для примера откроем снова документ Оказание услуги № 2 (рис. 25.19) .

Рис. 25.19. Документ «Оказание услуги»

В документе появилось поле Клиент, в списке движений регистра Продажи появилась колонка Клиент, а в разделе Предприятие – команда Клиенты .

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

В заключение в форме Общие настройки включим все функциональные опции и нажмем кнопку Записать (рис. 25.20) .

Занятие 25

Рис. 25.20. Общие настройки прикладного решения

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

На этом мы фактически завершили разработку нашей конфигурации .

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

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

790 1С:Предприятие 8.3. Практическое пособие разработчика Контрольные вопросы ; Что такое функциональные опции, и зачем они нужны?

; Как с помощью функциональных опций изменять интерфейс прикладного решения?

Занятие 26

–  –  –

Организация подборов

Одиночный подбор

Множественный подбор

Подбор с использованием множественного выбора

Множественный подбор с использованием множественного выбора.................798 Использование метода «Оповестить о выборе()»

Особенности разработки в режиме без использования модальности

Теория

Как задать вопрос пользователю в команде формы

Как задать вопрос пользователю в обработчике события

Ввод на основании

Команда ввода на основании

Объекты, введенные на основании

Критерий отбора

Получение объектов, введенных на основании

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

792 1С:Предприятие 8.3. Практическое пособие разработчика На этом занятии речь пойдет о таких общих приемах разработки, как организация подборов, особенности разработки в режиме без использования модальности и ввод данных на основании .

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

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

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

Сама механика подбора не изменится .

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

Результат подбора будет доступен в обработчике события ОбработкаВыбора формы документа или элемента формы (в зависимости от того, чему мы подчиним форму справочника при открытии) .

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

когда в форме справочника будет выполнен интерактивный выбор;

когда в форме справочника будет вызван метод ОповеститьОВыборе() .

Различные способы подбора мы проиллюстрируем на примере подбора элементов справочника Номенклатура в документ ПриходнаяНакладная .

Занятие 26 Одиночный подбор При одиночном подборе форма справочника будет закрываться сразу после выбора элемента. Для выбора следующего элемента необходимо будет снова инициировать подбор .

В режиме «Конфигуратор»

Откроем форму документа ПриходнаяНакладная .

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

Шаблон обработчика команды заполнять пока не будем, а перейдем на закладку Форма и перетащим эту команду в окно элементов формы, в командную панель таблицы Материалы (рис. 26.1) .

–  –  –

В форме документа в обработчик команды Подбор добавим следующий текст (листинг 26.1) .

794 1С:Предприятие 8.3. Практическое пособие разработчика листинг 26.1. Обработчик нажатия кнопки «Подбор»

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

КонецПроцедуры В этой процедуре мы открываем форму выбора для справочника Номенклатура, указывая, что она подчинена таблице Материалы формы документа ПриходнаяНакладная (Элементы.Материалы) .

При выборе из формы выбора справочника выбранное значение будет передано в обработчик события ОбработкаВыбора таблицы формы Материалы, так как она является владельцем открытой формы выбора .

Поэтому откроем палитру свойств таблицы Материалы и создадим обработчик события ОбработкаВыбора (рис. 26.2). Укажем, что событие будет обрабатываться только на клиенте (листинг 26.2) .

–  –  –

листинг 26.2. Обработчик события «ОбработкаВыбора»

таблицы «Материалы»

&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Элементы.Материалы.ДобавитьСтроку();

Элементы.Материалы.ТекущиеДанные.Материал = ВыбранноеЗначение;

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

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

Перейдем в раздел Учет материалов, откроем список приходных накладных и создадим новую приходную накладную .

В командной панели списка материалов нажмем кнопку Подбор и двойным щелчком мыши подберем в накладную один материал .

Множественный подбор В режиме «Конфигуратор»

При множественном подборе форма справочника будет открыта до тех пор, пока пользователь не закроет ее интерактивно или не будет вызван метод формы Закрыть() .

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

листинг 26.3. Обработчик нажатия кнопки «Подбор»

&НаКлиенте Процедура Подбор(Команда)

–  –  –

КонецПроцедуры 796 1С:Предприятие 8.3. Практическое пособие разработчика При открытии формы мы используем ее параметры .

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

Такую структуру мы передаем в метод ОткрытьФорму() вторым параметром (переменная ПараметрыФормы) .

Предварительно мы эту структуру формируем. В ней у нас всего один элемент с ключом ЗакрыватьПриВыборе .

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

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

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

Перейдем в раздел Учет материалов, откроем список приходных накладных и создадим новую приходную накладную .

В командной панели списка материалов нажмем кнопку Подбор .

Двойным щелчком мыши подберем в накладную один материал, затем другой материал. Перейдем в группу Услуги и подберем несколько услуг .

Когда все желаемые товары и услуги будут выбраны, закроем окно с формой выбора .

Подбор с использованием множественного выбора В режиме «Конфигуратор»

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

Режим множественного выделения в списке устанавливается, как правило, во всех формах списков по умолчанию .

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

Занятие 26 Поэтому для того, чтобы в форме списка справочника Номенклатура можно было не только отметить, но и выбрать сразу несколько элементов, мы снова воспользуемся одним из параметров расширения формы динамического списка – МножественныйВыбор .

В форме документа ПриходнаяНакладная изменим текст обработчика команды Подбор следующим образом (листинг 26.4) .

листинг 26.4. Обработчик нажатия кнопки «Подбор»

&НаКлиенте Процедура Подбор(Команда) ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);

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

КонецПроцедуры При множественном выборе форма выбора будет возвращать уже не один элемент, а массив элементов .

Поэтому в обработчик события ОбработкаВыбора добавим обход массива переданных элементов (листинг 26.5) .

листинг 26.5. Обработчик события «ОбработкаВыбора»

таблицы «Материалы»

&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Для Каждого ВыбранныйЭлемент Из ВыбранноеЗначение Цикл НоваяСтрока = Объект.Материалы.Добавить();

НоваяСтрока.Материал = ВыбранныйЭлемент;

КонецЦикла;

КонецПроцедуры В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

Перейдем в раздел Учет материалов, откроем список приходных накладных и создадим новую приходную накладную .

В командной панели списка материалов нажмем кнопку Подбор .

Для удобства в открывшейся форме выбора справочника Номенклатура установим режим просмотра в виде списка – Еще Режим просмотра Список .

798 1С:Предприятие 8.3. Практическое пособие разработчика Удерживая клавишу Ctrl, выделим в списке несколько товаров и несколько услуг .

Нажмем кнопку Выбрать .

Отмеченные элементы появятся в табличной части документа .

Множественный подбор с использованием множественного выбора В режиме «Конфигуратор»

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

Для этого нам будет необходимо при открытии формы выбора установить оба параметра: ЗакрыватьПриВыборе и МножественныйВыбор .

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

листинг 26.6. Обработчик нажатия кнопки «Подбор»

&НаКлиенте Процедура Подбор(Команда) ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор", Ложь, Истина);

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

КонецПроцедуры В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

Перейдем в раздел Учет материалов, откроем список приходных накладных и создадим новую приходную накладную .

В командной панели списка материалов нажмем кнопку Подбор .

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

Занятие 26 Откроем группу Материалы Прочее, выделим в ней все материалы и нажмем кнопку Выбрать .

Закроем окно с формой выбора справочника Номенклатура .

Использование метода «Оповестить о выборе()»

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

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

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

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

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

800 1С:Предприятие 8.3. Практическое пособие разработчика Теория Прежде чем приступить к практической части, нужно сказать несколько слов о том, почему стандартно используется именно такой режим работы интерфейса .

Исторически сложилось так, что обычные «десктопные» приложения часто используют в своей работе модальные окна .

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

Однако с тех пор, как «1С:Предприятие» перестало быть «обычным десктопным приложением», с появлением веб-клиента и с переходом «1С:Предприятия» на мобильные платформы использование модальных окон стало вызывать много проблем .

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

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

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

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

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

Суть этих изменений проще всего увидеть на следующем примере .

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

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

–  –  –

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

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

802 1С:Предприятие 8.3. Практическое пособие разработчика Чтобы этого избежать, зададим вопрос пользователю в обработчике команды Подбор, но будем использовать не модальный метод Вопрос(), а его немодальный аналог ПоказатьВопрос() .

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

Эти методы имеют следующие особенности:

имена этих методов начинаются со слов Показать либо Начать, например ПоказатьВопрос() вместо Вопрос(), НачатьПомещениеФайла() вместо ПоместитьФайл() и т. п.;

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

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

–  –  –

Добавим в модуль формы документа следующий код (листинг 26.7) .

листинг 26.7. Обработчик нажатия кнопки «Подбор»

с предварительным вопросом пользователю &НаКлиенте Процедура ПодборВопрос(Команда) Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект);

ПоказатьВопрос(Оповещение, "Подобрать номенклатуру в документ?", РежимДиалогаВопрос.ДаНет);

Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);

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

КонецЕсли;

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

–  –  –

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

Перейдем в раздел Учет материалов, откроем список приходных накладных и создадим новую приходную накладную. В командной панели списка материалов нажмем кнопку Подбор .

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

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

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

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

Изменим текст обработчика команды Подбор следующим образом (листинг 26.8) .

листинг 26.8. Обработчик нажатия кнопки «Подбор»

&НаКлиенте Процедура Подбор(Команда)

–  –  –

Затем добавим в обработчик события ОбработкаВыбора таблицы Материалы открытие блокирующего окна с вопросом пользователю (листинг 26.9) .

листинг 26.9. Обработчик события «ОбработкаВыбора» таблицы «Материалы» с предварительным вопросом пользователю &НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

–  –  –

КонецПроцедуры Поясним этот код .

Используя переменную ОтветПередДобавлением, мы определяем, был ли получен ответ от пользователя .

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

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

А в третьем параметре в качестве дополнительного параметра передается массив выбранных значений номенклатуры (ВыбранноеЗначение) .

После этого с помощью немодального метода ПоказатьВопрос() отображается окно с вопросом пользователю. В этот метод 806 1С:Предприятие 8.3. Практическое пособие разработчика передается объект ОписаниеОповещения, указывающий на экспортную процедуру модуля (ДобавлениеЗавершение), которая будет выполнена после того, как пользователь сделает выбор в блокирующем окне .

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

листинг 26.10. Процедура – обработчик оповещения «ДобавлениеЗавершение()»

&НаКлиенте Процедура ДобавлениеЗавершение(Результат, СписокНоменклатуры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ОтветПередДобавлением = Истина;

–  –  –

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

Остается только объявить эту переменную в самом начале модуля формы (листинг 26.11) .

листинг 26.11. Объявление переменной в модуле формы &НаКлиенте Перем ОтветПередДобавлением;

Занятие 26 В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки .

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

пРиМеЧАние Проверить код конфигурации на предмет отсутствия модальных методов можно с помощью команды конфигуратора Конфигурация Проверка конфигурации... В окне параметров проверки нужно установить флажок Поиск использования модальности .

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

Для каждого объекта конфигурации Документ можно разрешить его ввод на основании других объектов базы данных и возможность являться основанием для других объектов .

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

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

Рассмотрим пример, когда документ ОказаниеУслуги будет вводиться на основании элемента справочника Клиенты .

808 1С:Предприятие 8.3. Практическое пособие разработчика Команда ввода на основании В режиме «Конфигуратор»

Откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги и добавим новый реквизит документа – ОбъектОснование с типом СправочникСсылка.Клиенты .

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

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

Нажмем кнопку Редактировать элемент списка над списком Вводится на основании и выберем справочник Клиенты (рис. 26.5) .

–  –  –

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

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

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

В модуле документа будет сформирован текст обработчика события ОбработкаЗаполнения (листинг 26.12) .

листинг 26.12. Обработчик события «ОбработкаЗаполнения»

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором .

// При повторном использовании конструктора внесенные вручную изменения будут утеряны!!!

Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда // Заполнение шапки Клиент = ДанныеЗаполнения.Ссылка;

ОбъектОснование = ДанныеЗаполнения.Ссылка;

КонецЕсли;

//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры 810 1С:Предприятие 8.3. Практическое пособие разработчика Как видите, для каждого типа объекта-основания формируется своя ветка условия Если…, в которой происходит заполнение реквизитов нового документа .

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и проверим работу ввода на основании .

Откроем список клиентов. Обратите внимание, что в командной панели формы списка справочника Клиенты появилась команда Создать на основании .

Выделив нужного клиента и выполнив команду Создать на основании Оказание услуги, создадим новый документ Оказание услуги, где в качестве клиента будет выбран выделенный в списке справочника клиент (рис. 26.7) .

Рис. 26.7. Создание документа «Оказание услуги» на основании клиента Введите самостоятельно еще несколько документов на основании какого-либо клиента .

–  –  –

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

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

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

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

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

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

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

В режиме «Конфигуратор»

Раскроем ветвь Общие и создадим новый объект конфигурации КритерийОтбора с именем ОказаниеУслуги .

На закладке Данные выберем тип используемого критерия – СправочникСсылка.Клиенты .

812 1С:Предприятие 8.3. Практическое пособие разработчика На закладке Состав в качестве объектов, входящих в критерий, выберем реквизит ОбъектОснование документа ОказаниеУслуги (рис. 26.8) .

Рис. 26.8. Состав критерия отбора «ОказаниеУслуги»

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

Создадим эту форму и на закладке Командный интерфейс установим видимость команды Оказание услуги (рис. 26.9) .

–  –  –

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и проверим работу критерия отбора .

В форме списка клиентов выделим клиента Роман, на основании которого мы создавали документы Оказание услуги .

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

Выполним эту команду (рис. 26.10) .

–  –  –

Мы видим в этом списке документы Оказание услуги, созданные на основании клиента Роман. К содержимому документа можно перейти, нажав соответствующую ссылку в списке документов .

814 1С:Предприятие 8.3. Практическое пособие разработчика Контрольные вопросы ; Что такое подбор?

; Как организовать различные виды подбора в табличную часть формы документа?

; Как задать вопрос пользователю в команде?

; Как задать вопрос пользователю в обработчике события формы?

; Чем модальные окна отличаются от блокирующих окон?

; Что такое ввод на основании?

; Как организовать ввод одних объектов конфигурации на основании других?

; Как с помощью критерия отбора вывести список объектов, введенных на основании текущего объекта?

Занятие 27

–  –  –

пРодолжительность Ориентировочная продолжительность занятия – 2 часа 10 минут .

Данные и элементы формы

Типы данных формы

Связанные списки

Оформление строк в форме списка

Вычисляемые колонки в списках

Список выбора для поля ввода

Форма выбора для поля, содержащего ссылочный реквизит

Проверка заполнения реквизитов

Автоматическая проверка заполнения

Программная проверка заполнения

Использование параметризованных команд

Открытие формы списка с заданным отбором

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

816 1С:Предприятие 8.3. Практическое пособие разработчика На этом занятии мы рассмотрим несколько типичных приемов работы с формами объектов .

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

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

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

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

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

Связь элементов формы с данными, которые они должны отображать, задается в свойстве ПутьКДанным .

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

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

Занятие 27

Рис. 27.1. Связь элементов формы с данными

Например, если основному реквизиту формы указать тип значения ДокументОбъект.ПриходнаяНакладная, то при закрытии формы программа будет запрашивать подтверждение записи и проведения документа. Если же основному реквизиту формы указать тип значения СправочникОбъект.Клиенты, то подобного подтверждения при закрытии формы возникать не будет .

Похожее влияние источники данных оказывают и на элементы формы .

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

То же самое справедливо и для элемента формы Командная панель .

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

818 1С:Предприятие 8.3. Практическое пособие разработчика Возможность связать форму и ее элементы с различными данными является причиной того, что у формы и ее элементов существует несколько расширений .

Расширение представляет собой набор дополнительных свойств, методов и событий, появляющихся у формы или у элемента формы .

Наличие того или иного расширения определяется либо типом данных, которые отображает форма/элемент, либо расположением элемента формы в других ее элементах .

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

Нажмем кнопку Далее и кроме полей Наименование и Код включим в состав таблицы Список еще одно поле – ВидНоменклатуры. И затем уже нажмем Готово (рис. 27.2) .

Рис. 27.2. Форма списка справочника «Номенклатура»

–  –  –

Поэтому к свойствам, методам и событиям объекта встроенного языка УправляемаяФорма добавляется Расширение динамического списка (рис. 27.4) .

Рис. 27.4. Контекст формы дополняется контекстом расширения динамического списка 820 1С:Предприятие 8.3. Практическое пособие разработчика В результате этого у формы появляются такие параметры, как ТекущаяСтрока, Отбор и т. п .

Теперь посмотрим на таблицу Список .

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

Рис. 27.5. Контекст таблицы дополняется контекстом расширения динамического списка В результате у таблицы Список появляются такие свойства, как АвтоОбновление, ОтображатьКорень и т. д .

И в заключение посмотрим на поле ВидНоменклатуры .

Это поле связано с реквизитом типа ПеречислениеСсылка.ВидыНоменклатуры и является полем ввода .

Поэтому к свойствам, методам и событиям объекта встроенного языка ПолеФормы добавляется Расширение поля ввода (рис. 27.6) .

В результате у поля ВидНоменклатуры появляются такие свойства, как БыстрыйВыбор, ВыделенныйТекст и т. д .

Занятие 27

–  –  –

Типы данных формы В управляемой форме можно выделить следующие категории типов, с которыми она работает:

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

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

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

Все типы прикладных объектов (такие как СправочникОбъект и т. д.) не существуют на стороне тонкого и веб-клиентов, они существуют только на сервере. Однако данные этих объектов нужно отображать в управляемых формах .

822 1С:Предприятие 8.3. Практическое пособие разработчика Поэтому для представления в форме данных этих прикладных типов введены специальные типы данных, предназначенные для работы именно в управляемых формах. Используются следующие типы данных:

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

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

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

ДанныеФормыДерево – объект предназначен для хранения иерархических данных .

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

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

ВниМАние!

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

–  –  –

В редакторе формы (у реквизитов формы) вместо имен этих типов обычно отображаются те прикладные типы, данные которых содержит реквизит .

Например, если реквизит Объект содержит данные элемента справочника Клиенты, то в колонке Тип отображается ненастоящий тип этого реквизита формы – ДанныеФормыСтруктура, а тип прикладного объекта, данные которого содержатся в этом реквизите – СправочникОбъект.Клиенты. Причем чтобы было понятно, что это «ненастоящий тип» реквизита, тип прикладного объекта показывается в круглых скобках .

Таким образом форма содержит некоторую «проекцию» данных прикладных объектов в виде своих собственных типов данных и автоматически выполняет преобразование между ними при необходимости .

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

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

ЗначениеВДанныеФормы() – преобразует объект прикладного типа в данные формы;

ДанныеФормыВЗначение() – преобразует данные формы в объект прикладного типа .

Аналогичные методы, предназначенные для конвертирования значений реквизитов формы в прикладные объекты и обратно, существуют и у самой управляемой формы:

ЗначениеВРеквизитФормы() – преобразует объект прикладного типа в реквизит управляемой формы;

РеквизитФормыВЗначение() – преобразует реквизит управляемой формы в значение прикладного типа .

Методы, работающие с прикладными объектами, доступны только в серверных процедурах формы .

При выполнении стандартных действий формы с основным реквизитом (открытие формы, выполнение стандартной команды Записать и т. д.) преобразование выполняется автоматически .

824 1С:Предприятие 8.3. Практическое пособие разработчика Приведем пример преобразования данных, которое может потребоваться в собственных алгоритмах .

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

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

ЗначениеВДанныеФормы(ОбъектТовар, ТоварДляМодификации);

КонецПроцедуры &НаКлиенте Процедура Записать() ЗаписатьНаСервере();

КонецПроцедуры &НаСервере Процедура ЗаписатьНаСервере()

–  –  –

КонецПроцедуры В некоторый момент работы формы мы решаем, что измененные данные нашего товара необходимо записать в базу данных, и тогда выполняем обратное преобразование данных формы в прикладной объект (ДанныеФормыВЗначение()) и записываем его .

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

Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме этого, метод РеквизитФормыВЗначение() выполняет установку соответствия Занятие 27 данных формы и объекта, которая используется при формировании сообщений .

Приведем пример использования этих методов. В серверной процедуре формы мы получаем прикладной объект из реквизита формы и выполняем метод этого прикладного объекта Пересчитать() .

Затем данные объекта, измененные в результате пересчета, преобразуем обратно в реквизит формы (листинг 27.2) .

листинг 27.2. Пример преобразования данных прикладных объектов в данные формы &НаСервере Процедура ПересчитатьНаСервере() // Преобразует реквизит Объект в прикладной объект .

Документ = РеквизитФормыВЗначение("Объект");

// Выполняет пересчет методом, определенным в модуле документа .

Документ.Пересчитать();

// Преобразует прикладной объект обратно в реквизит .

ЗначениеВРеквизитФормы(Документ, "Объект");

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

Это может быть, например, список подчиненного справочника;

регистры, в которых объект производит движения; регистры, где измерение с типом этого объекта указано как ведущее; критерии отбора, в которые входит этот тип; объекты, которые можно ввести на основании этого типа, и т. д .

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

Все перечисленные ситуации платформа контролирует автоматически. На основании информации, содержащейся в объектах конфигурации, платформа автоматически создает в формах объектов 826 1С:Предприятие 8.3. Практическое пособие разработчика команды для перехода к связанной информации. Некоторые такие команды она сразу же делает видимыми, и они появляются в форме .

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

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

Рассмотрим это на примере .

В режиме «Конфигуратор»

Для примера откроем форму документа ОказаниеУслуги. В левом верхнем окне перейдем на закладку Командный интерфейс .

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

Мы можем установить общую видимость для этих команд, а можем более точно настроить видимость этих команд для каждой отдельной роли, которая есть в нашей конфигурации (рис. 27.7) .

–  –  –

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

Например, выполним команду Стоимость материалов и перейдем к движениям, которые произвел в этом регистре наш документ (рис. 27.9) .

Рис. 27.9. Движения документа «Оказание услуги № 3»

по регистру «Стоимость материалов»

828 1С:Предприятие 8.3. Практическое пособие разработчика Оформление строк в форме списка Одним из полезных свойств формы списка является возможность настройки оформления его строк. Для иллюстрации этой возможности мы воспользуемся формой списка справочника Номенклатура и придадим ей нестандартный вид .

В режиме «Конфигуратор»

Откроем в конфигураторе форму списка справочника Номенклатура и создадим обработчик события формы ПриСозданииНаСервере .

Внесем в него следующий текст (листинг 27.3) .

листинг 27.3. Обработчик события формы «При открытии»

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) СписокСправочника = Элементы.Список;

// Задать режим отображения справочника .

СписокСправочника.Отображение = ОтображениеТаблицы.Список;

// Скрыть линии сетки .

СписокСправочника.ВертикальныеЛинии = Ложь;

СписокСправочника.ГоризонтальныеЛинии = Ложь;

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

Затем мы скрываем линии, разделяющие колонки и строки таблицы списка .

Теперь настроим условное оформление строк списка. Для этого вызовем палитру свойств основного реквизита формы Список .

В строке Настройка списка нажмем Открыть (рис. 27.10) .

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

Занятие 27

Рис. 27.10. Вызов настройки динамического списка

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

Сначала укажем Оформление для выделения полей .

Нажмем кнопку выбора в поле Оформление и установим сиреневый цвет фона (рис. 27.11) .

Рис. 27.11. Настройка условного оформления 830 1С:Предприятие 8.3. Практическое пособие разработчика Нажмем ОК. Затем укажем условие, при наступлении которого будет применяться оформление, то есть когда строки списка будут сиреневыми .

Нажмем кнопку выбора в поле Условие и в появившемся окне добавим Новый элемент отбора (рис. 27.12). Для этого нажмем кнопку Добавить и укажем в графе Левое значение – поле ВидНоменклатуры, в графе Вид сравнения – Равно, а в графе Правое значение выберем Перечисление.ВидыНоменклатры.Услуга .

–  –  –

Нажмем ОК .

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

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

Нажмем ОК .

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем список номенклатуры .

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

Занятие 27 Рис. 27.13. Список номенклатуры с заданным оформлением Рассмотрим также свойства пользовательских настроек списка, которые аналогичны для всех настроек динамического списка – Отбор, Порядок, Группировка и УсловноеОформление. Настройки динамических списков в платформе очень похожи на настройки отчетов, построенных с помощью системы компоновки данных .

В режиме «Конфигуратор»

По умолчанию в окне настроек (внизу на каждой из закладок: Отбор, Порядок, Группировка, УсловноеОформление) динамического списка в конфигураторе установлен флажок Включать в пользовательские настройки, а также свойство Режим редактирования установлено свойство Обычный (см. рис. 27.11) .

Это значит, что пользователь может изменить заданное оформление списка, выполнив команду Еще Настроить список… При этом откроется окно настройки динамического списка, аналогичное окну пользовательских настроек отчетов, где он может задать свое условное оформление списка и/или другие настройки (см. рис. 27.15) .

832 1С:Предприятие 8.3. Практическое пособие разработчика Если настройка требуется пользователю часто, то можно поместить настройку непосредственно в форме списка. Для этого нужно установить в окне настройки списка Режим редактирования в значение Быстрый доступ (рис. 27.14) .

Рис. 27.14. Свойства настроек условного оформления В режиме «1С:Предприятие»

При открытии списка в режиме 1С:Предприятие мы увидим следующий результат (рис. 27.15) .

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

Кроме того, он может вызвать окно пользовательских настроек по команде Еще Настроить список… и редактировать там условное оформление и другие настройки списка .

А также (как и в отчетах) пользователь может изменить состав настроек (Еще Изменить состав настроек…) согласно своим предпочтениям. То есть перенести какие-то настройки из списка быстрых настроек в обычные и наоборот .

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

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

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

Но выполняется это уже с помощью условного оформления самой формы. То есть в дереве элементов формы нужно выделить корневой элемент и в палитре свойств открыть ссылку УсловноеОформление .

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

834 1С:Предприятие 8.3. Практическое пособие разработчика Вычисляемые колонки в списках Необходимость вывода произвольных данных в колонках списка возникает, когда вместе с элементом списка нужно отобразить некоторую вычисляемую информацию .

Мы рассмотрим эту ситуацию на примере отображения актуальной цены в списке справочника Номенклатура .

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

–  –  –

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

Изменим его. Для этого нажмем кнопку Конструктор запроса (рис. 27.17) .

Рис. 27.17. Создание произвольного запроса для динамического списка Добавим в список таблиц Цены.СрезПоследних и выберем из нее поле Цена (рис. 27.18) .

–  –  –

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

836 1С:Предприятие 8.3. Практическое пособие разработчика Установим флажок Все у таблицы Справочник.Номенклатура и снимем его у таблицы Цены.СрезПоследних (рис. 27.19) .

–  –  –

Тем самым мы задаем, что в списке номенклатуры будут отражены все позиции, даже те, по которым не установлены цены .

Похожие действия мы уже выполняли на занятии № 13 «Отчеты»

для отчета «Перечень услуг» на стр. 390 .

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

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

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

Для этого перейдем на закладку Условное оформление. Там мы видим созданное нами ранее условное оформление для строк списка .

Нажмем кнопку Добавить в командной панели окна .

Сначала укажем Оформление для выделения полей. Нажмем кнопку выбора в поле Оформление и установим синий цвет текста .

Затем укажем условие, при наступлении которого будет применяться оформление, то есть когда текст в колонке Цена будет синим .

Нажмем кнопку выбора в поле Условие и в появившемся окне добавим Новый элемент отбора (рис. 27.20). Для этого нажмем кнопку Добавить и укажем в графе Левое значение – поле Цена, в графе Вид сравнения – Меньше, а в графе Правое значение выберем 500 .

Затем укажем список оформляемых полей. Нажмем кнопку выбора в поле Оформляемые поля, затем нажмем Добавить и выберем поле Цена (рис. 27.20) .

Занятие 27 Рис. 27.20. Настройка условного оформления динамического списка Нажмем ОК. Теперь нам осталось только перетащить поле Цена из окна реквизитов в окно элементов формы (рис. 27.21) .

–  –  –

Теперь зададим отдельно свойства для каждого созданного нами элемента настроек условного оформления .

Для этого выделим каждую настройку и нажмем кнопку Свойства элемента пользовательских настроек над списком настроек. У обеих 838 1С:Предприятие 8.3. Практическое пособие разработчика настроек установим флажок Включать в пользовательские настройки .

Зададим представление первой настройки как Услуги, второй – Низкая цена, а свойство Режим редактирования оставим без изменения в значении Быстрый доступ. Аналогичное свойство для настроек условного оформления в целом (внизу окна) вернем к значению Обычный (рис. 27.22) .

Рис. 27.22. Свойства настроек условного оформления

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем список номенклатуры. Мы видим, что вместе с номенклатурой выводится ее актуальная цена, причем цены на номенклатуру меньше 500 выделены синим цветом текста. А также строки номенклатуры, являющейся услугами, выделены сиреневым цветом фона .

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

В заключение обратим внимание на свойство динамического списка Автоматическое сохранение пользовательских настроек (см. рис. 27.16) .

Стандартно оно включено .

Занятие 27

Рис. 27.23. Список номенклатуры с заданным оформлением

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

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

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

Поля ввода, имеющие ссылочный тип, например, Склад, Сотрудник, по умолчанию имеют кнопку выбора. При нажатии этой кнопки открывается форма выбора объекта, на которую ссылается данное поле .

840 1С:Предприятие 8.3. Практическое пособие разработчика Но для полей других типов тоже бывает нужно выполнять выбор из нескольких предопределенных значений .

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

В режиме «Конфигуратор»

Сначала нужно добавить поле Адрес в форму элемента справочника Клиенты .

Для этого откроем в конфигураторе окно редактирования объекта конфигурации Справочник Клиенты и на закладке Данные добавим реквизит Адрес с типом Строка, длиной 25. Затем откроем форму элемента справочника Клиенты. Раскроем основной реквизит формы Объект и перетащим поле Адрес из окна реквизитов в окно элементов формы .

В открывшейся палитре свойств этого поля установим свойство РежимВыбораИзСписка. Затем нажмем кнопку выбора в строке СписокВыбора и, нажимая кнопку Добавить, создадим значения, например: Москва, Королев, Монино (рис. 27.24) .

–  –  –

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем форму редактирования клиента. В поле Адрес наберем «м», и система предложит на выбор два подходящих названия (рис. 27.25) .

Рис. 27.25. Выбор из заданного списка значений в поле ввода Аналогичные действия, которые мы выполнили в конфигураторе, можно выполнить и во встроенном языке. То есть в зависимости от некоторого алгоритма можно формировать список выбора для поля ввода динамически .

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

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

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

842 1С:Предприятие 8.3. Практическое пособие разработчика При нажатии кнопки выбора в этих полях по умолчанию открывается основная форма выбора соответствующих объектов конфигурации (справочника Клиенты, справочника Сотрудники и др.) .

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

В режиме «Конфигуратор»

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

Сначала эту форму нужно создать .

Откроем окно редактирования этого объекта конфигурации и перейдем на закладку Формы .

Мы видим, что у этого объекта вообще еще нет ни одной формы. Это значит, что все формы справочника в режиме 1С:Предприятие, в том числе и форма выбора, генерировались системой автоматически .

Нажмем кнопку Добавить (рис. 27.26) .

–  –  –

В открывшемся конструкторе формы выберем тип формы – Произвольная форма и зададим ее имя ФормаДляВыбора (рис. 27.27) .

Рис. 27.27. Создание произвольной формы справочника «Сотрудники»

–  –  –

Затем перетащим этот реквизит в окно элементов формы. Согласимся с предложением «Добавить колонки таблицы Список?». В форме появится таблица Список, отображающая список сотрудников .

Теперь немного изменим внешний вид формы .

В окне элементов формы раскроем таблицу Список и удалим поле Код .

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

Рис. 27.29. Установка свойств формы

Чтобы из таблицы, содержащей список сотрудников, можно было сделать выбор, откроем палитру свойств таблицы Список и установим флажок РежимВыбора (рис. 27.30) .

И в заключение зададим заголовок формы Выбор сотрудников, а флажок АвтоЗаголовок снимем, чтобы не отражался заголовок, заданный нами в расширенном представлении списка для справочника Сотрудники (рис. 27.31) .

Занятие 27

–  –  –

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

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

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

Мы хотим только показать принцип использования произвольной формы в качестве формы выбора .

846 1С:Предприятие 8.3. Практическое пособие разработчика Теперь откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги .

Вызовем палитру свойств реквизита Мастер и нажмем кнопку выбора в поле Форма выбора. Откроется список форм, созданных в конфигурации для объекта, на который ссылается данный реквизит. В данном случае для справочника Сотрудники, на который ссылается реквизит Мастер, создана одна форма – ФормаДляВыбора .

Выберем ее (рис. 27.32) .

Рис. 27.32. Установка формы выбора для ссылочного реквизита

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем один из документов Оказание услуги. Нажмем кнопку выбора в поле Мастер и в выпадающем списке, открывшемся под полем ввода, нажмем ссылку Показать все .

Откроется созданная нами произвольная форма с заголовком Выбор сотрудников (рис. 27.33) .

Таким образом, поскольку мы задали свойство Форма выбора на уровне реквизита Мастер, а не на уровне отдельной формы, в любой форме документа ОказаниеУслуги, где используется данный реквизит, при выборе в поле Мастер будет открываться наша специальная форма .

Занятие 27

–  –  –

Если очистить свойство Форма выбора для реквизита Мастер в документе ОказаниеУслуги, то в режиме 1С:Предприятие при выборе в поле Мастер будет открываться основная форма выбора справочника Сотрудники, автоматически сгенерированная системой .

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

Причем делается это не на уровне форм, а на уровне свойств реквизитов или в модуле объекта, к которому относится данный реквизит .

Таким образом, проверка заполнения реквизита будет производиться во всех формах, где используется этот реквизит .

Автоматическая проверка заполнения В режиме «Конфигуратор»

Для примера рассмотрим объект конфигурации Документ ОказаниеУслуги. Допустим, нам нужно контролировать заполнение реквизита НаборСвойств табличной части этого документа .

Откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги. Вызовем палитру свойств реквизита табличной части НаборСвойств и установим свойство Проверка заполнения в значение Выдавать ошибку .

848 1С:Предприятие 8.3. Практическое пособие разработчика

–  –  –

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем документ Оказание услуги № ЦБ000000001. В табличной части этого документа содержится одна строка с услугой Диагностика, для которой колонка Набор свойств не заполнена. При проведении этого документа будет выдано сообщение об ошибке, и документ не будет проведен (рис. 27.35) .

Рис. 27.35. Сообщение об ошибке

Программная проверка заполнения В режиме «Конфигуратор»

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

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

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

Откроем модуль документа ОказаниеУслуги и поместим в нем следующую процедуру (листинг 27.4) .

листинг 27.4. Обработчик события «ОбработкаПроверкиЗаполнения»

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Индекс = ПроверяемыеРеквизиты.Найти("ПереченьНоменклатуры.НаборСвойств");

Если Индекс Неопределено Тогда ПроверяемыеРеквизиты.Удалить(Индекс);

КонецЕсли;

Индекс = 0;

–  –  –

КонецПроцедуры Сначала мы находим реквизит табличной части НаборСвойств в массиве ПроверяемыеРеквизиты. Этот массив передается в обработчик и содержит массив проверяемых реквизитов, которым мы установили свойство Проверка заполнения в значение Выдавать ошибку во время разработки конфигурации. Если он найден, то удаляем его, так как мы будем выполнять проверку самостоятельно .

Затем мы в цикле обходим строки табличной части документа и формируем сообщения об ошибке только в том случае, если 850 1С:Предприятие 8.3. Практическое пособие разработчика номенклатура в табличной части является материалом и для нее не заполнена колонка НаборСвойств .

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

Если этот параметр закомментировать, сообщения об ошибке будут выдаваться, но документ будет проведен .

Для упрощения примера мы опять здесь используем обращение ПереченьНоменклатуры.Номенклатура.ВидНоменклатуры, хотя оптимальнее использовать запрос. Об этом подробно рассказывалось на занятии № 14 (стр. 417), поэтому мы не будем здесь рассматривать этот вопрос .

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем документ Оказание услуги № ЦБ000000001. В табличную часть этого документа добавим еще одну строку, содержащую какой-либо материал, и попробуем записать документ, нажав кнопку Провести. Для второй строки табличной части будет выдано сообщение об ошибке (рис. 27.36) .

–  –  –

Можно также программно добавить реквизит в массив проверяемых реквизитов (листинг 27.5) .

листинг 27.5. Добавление реквизита в массив проверяемых реквизитов ПроверяемыеРеквизиты.Добавить("ПереченьНоменклатуры.НаборСвойств");

Использование параметризованных команд Использование параметризованных команд в формах объектов позволяет при выполнении команды передать в обработчик команды какой-либо параметр, например значение ссылочного реквизита .

И затем использовать его, например, открыть с этим параметром форму отчета .

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

В режиме «Конфигуратор»

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

Для этого откроем окно редактирования этого объекта. На закладке Команды нажмем кнопку Добавить и создадим команду ОстаткиПоСкладу .

В открывшейся палитре свойств зададим Тип параметра команды – СправочникСсылка.Склады. В свойстве Группа укажем Командная панель формы.Важное (рис. 27.37) .

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

852 1С:Предприятие 8.3. Практическое пособие разработчика

–  –  –

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

листинг 27.6. Обработчик параметризованной команды &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

–  –  –

В процедуру ОбработкаКоманды() передается ПараметрКоманды, содержащий значение типа СправочникСсылка.Склады. Затем создается структура параметров формы (ПараметрыФормы): Отбор, КлючНазначенияИспользования, СформироватьПриОткрытии .

В параметр Отбор добавляется структура, содержащая элемент со значением, содержащимся в параметре команды Склад (ПараметрКоманды), параметр КлючНазначенияИспользования – "ОстаткиПоСкладу" определяет назначение использования формы, а параметру СформироватьПриОткрытии присваивается значение Истина, чтобы отчет формировался сразу после открытия .

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

Теперь поместим нашу команду в форму документа .

Как мы уже говорили, в формах документов ПриходнаяНакладная и ОказаниеУслуги содержится команда ОстаткиПоСкладу, так как они имеют реквизит Склад типа СправочникСсылка.Склады .

Откроем форму документа ОказаниеУслуги .

На закладке Команды перейдем в раздел Глобальные команды .

Здесь мы видим список глобальных параметризуемых команд, доступных в форме. В группе Параметризуемые раскроем строку Объект и перетащим нашу команду Отчет.Материалы.Команда.ОстаткиПоСкладу(Объект.Склад) в командную панель элементов формы .

В скобках у команды указано значение реквизита Склад (Объект.Склад), которое будет передаваться в команду при ее выполнении (рис. 27.38) .

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

854 1С:Предприятие 8.3. Практическое пособие разработчика

Рис. 27.38. Помещение параметризованной команды в форму

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем документ Оказание услуги № ЦБ000000001 .

Нажмем кнопку Остатки по складу и вызовем отчет Материалы. Форма отчета генерируется системой автоматически. Отчет будет выполнен сразу при открытии формы с отбором по складу Основной, указанному в форме документа (рис. 27.39) .

Закроем отчет. Если в форме документа мы изменим склад на Розничный, а затем выполним отчет нажатием кнопки Остатки по складу, то он будет сформирован с отбором по складу Розничный (в данном случае отчет будет пустой, так как у нас нет движений материалов по этому складу) .

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

Занятие 27 Рис. 27.39. Отчет «Материалы» с отбором по складу, указанному в документе Открытие формы списка с заданным отбором В заключение рассмотрим распространенный случай, когда требуется открыть форму списка с некоторым заранее установленным отбором .

На этом же примере мы поясним различие между фиксированными (программными) пользовательскими настройками и настройками динамического списка, сделанными в конфигураторе .

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

Похожую задачу мы уже решали с помощью критерия отбора и механизма ввода на основании (см. раздел «Получение объектов, введенных на основании» на стр. 811). Теперь выполним ее с помощью встроенного языка .

В режиме «Конфигуратор»

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

Для этого создадим форму списка справочника Сотрудники, затем создадим в ней команду ОказаниеУслуг и перетащим ее в командную 856 1С:Предприятие 8.3. Практическое пособие разработчика панель формы. В палитре свойств команды ОказаниеУслуг, в строке Действие создадим клиентский обработчик этой команды (рис. 27.40) .

–  –  –

В модуле формы заполним обработчик команды следующим образом (листинг 27.7) .

листинг 27.7. Обработчик команды «Оказание услуг»

&НаКлиенте Процедура ОказаниеУслуг(Команда) ПараметрыФормы = Новый Структура( "Отбор", Новый Структура("Мастер", Элементы.Список.ТекущаяСтрока));

ОткрытьФорму("Документ.ОказаниеУслуги.ФормаСписка", ПараметрыФормы,, Истина);

КонецПроцедуры Этот код очень похож на предыдущий листинг 27.6, в котором открывалась форма отчета с отбором по значению параметризованной команды. Только здесь в значение отбора для поля Мастер передается ссылка на текущий элемент списка сотрудников, которая содержится в свойстве ТекущаяСтрока таблицы формы Список, отображающей данные динамического списка. Затем этот отбор передается в параметры формы при открытии формы списка документов Оказание услуги .

Занятие 27 В режиме «1С:Предприятие»

Запустим «1С:Предприятие» и откроем список сотрудников. В форме списка появилась кнопка Оказание услуг. При ее нажатии открывается список документов об оказании услуг, где мастером является текущий сотрудник (рис. 27.41) .

Рис. 27.41. Отбор по мастеру в списке документов «Оказание услуги»

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

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

Следует различать три вида настроек динамического списка:

Фиксированные настройки, сделанные программным путем, помещаются в свойство динамического списка КомпоновщикНастроек.ФиксированныеНастройки;

Настройки, сделанные в конфигураторе, помещаются в свойство динамического списка КомпоновщикНастроек.Настройки;

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

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

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

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

В режиме «Конфигуратор»

Чтобы решить поставленную задачу, откроем форму списка документа ОказаниеУслуги, которую мы создали ранее. В редакторе формы создадим реквизиты формы ПрограммныйОтбор типа Булево и два реквизита произвольного типа – ПолеОтбора и ЗначениеОтбора .

Эти реквизиты будут хранить информацию о программном отборе в форме списка .

Затем создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 27.8) .

листинг 27.8. Обработчик события формы «ПриСозданииНаСервере»

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

ПолеОтбора = Новый ПолеКомпоновкиДанных("Мастер");

Параметры.Отбор.Свойство("Мастер", ЗначениеОтбора);

КонецЕсли

–  –  –

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

Если такой отбор установлен, то мы устанавливаем признак того, что форма была открыта с программным отбором, реквизит ПолеОтбора устанавливаем как поле компоновки данных с именем Мастер, а в реквизит ЗначениеОтбора помещаем соответствующее значение отбора из коллекции параметров формы .

Далее создадим обработчик события формы ПриОткрытии и заполним его следующим образом (листинг 27.9) .

листинг 27.9. Обработчик события формы «ПриОткрытии»

&НаКлиенте Процедура ПриОткрытии(Отказ) Если ПрограммныйОтбор = Истина Тогда ПрограммныеНастройки = Список.КомпоновщикНастроек.ФиксированныеНастройки;

Для Каждого ЭлементНастроек Из ПрограммныеНастройки.Отбор.Элементы Цикл Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда ПрограммныеНастройки.Отбор.Элементы.Удалить(ЭлементНастроек);

КонецЕсли;

КонецЦикла;

Настройки = Список.КомпоновщикНастроек.Настройки;

ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;

Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

КонецЕсли;

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

Сначала обходится коллекция элементов отбора фиксированных настроек компоновщика настроек динамического списка. Если в коллекции присутствует элемент отбора, в котором ЛевоеЗначение равно значению реквизита ПолеОтбора (т. е. установлен программный отбор по полю Мастер), то этот элемент удаляется .

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

860 1С:Предприятие 8.3. Практическое пособие разработчика Теперь осталось только удалить созданный элемент отбора при закрытии формы списка документа ОказаниеУслуги .

Для этого создадим обработчик события формы ПередЗакрытием и заполним его следующим образом (листинг 27.10) .

листинг 27.10. Обработчик события формы «ПередЗакрытием»

&НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

–  –  –

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

Коллекция элементов отбора настроек компоновщика настроек динамического списка КомпоновщикНастроек.Настройки.Отбор обходится в цикле. Если в коллекции присутствует элемент отбора, в котором ЛевоеЗначение равно значению реквизита ПолеОтбора, то этот элемент удаляется. Затем измененные настройки загружаются в компоновщик настроек .

В режиме «1С:Предприятие»

Запустим «1С:Предприятие», откроем список сотрудников и нажмем кнопку Оказание услуг. Откроется список документов об оказании услуг, где мастером является текущий сотрудник. Вызовем окно настройки списка, выполнив команду Еще Настроить список… В открывшемся окне мы видим добавленный нами отбор по полю Мастер, который пользователь может изменить или очистить (рис. 27.42) .

Занятие 27

Рис. 27.42. Окно настройки списка с заданным отбором

При закрытии формы списка этот отбор удаляется .

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

862 1С:Предприятие 8.3. Практическое пособие разработчика

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

; Как связаны данные и элементы формы?

; Что такое основной реквизит формы?

; Что такое расширения формы и ее элементов?

; Какие существуют типы данных у формы?

; Как выполнить преобразование данных прикладных объектов в данные формы?

; Что такое связанная информация, и как к ней перейти из формы?

; Как настроить условное оформление строк формы списка?

; Как установить форму выбора для ссылочного реквизита?

; Как установить автоматическую и программную проверку заполнения реквизитов?

; Что такое параметризованная команда?

; Как использовать параметризованные команды в формах?

; Как открыть форму списка с заданным отбором?

Занятие 28 Приемы редактирования форм пРодолжительность Ориентировочная продолжительность занятия – 2 часа .

Редактор формы

Разработка произвольной формы для редактирования документа «Оказание услуги»

Как добавить в форму переключатель – тумблер

В режиме «Конфигуратор»

В режиме «1С:Предприятие»

Как сгруппировать данные в списке

В режиме «Конфигуратор»

В режиме «1С:Предприятие»

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

864 1С:Предприятие 8.3. Практическое пособие разработчика До сих пор при разработке нашей конфигурации мы в основном пользовались формами, автоматически сконструированными конструктором формы для используемых нами объектов конфигурации или списков этих объектов. Иногда мы добавляли в эти формы кнопки для выполнения нужных нам команд, колонки в табличную часть и т. п .

На этом занятии мы обобщим полученные навыки и рассмотрим примеры разработки формы с нуля с использованием только визуальных средств, а точнее – редактора формы .

Редактор формы Редактор формы вам уже хорошо знаком по предыдущим занятиям .

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

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

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

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

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

Например, если основным реквизитом формы является документ, то в панели команд появляется стандартная команда Провести и закрыть, иначе – Записать и закрыть и т. д .

Занятие 28

–  –  –

В правой верхней части окна редактора формы на закладке Реквизиты можно задавать состав реквизитов формы и устанавливать их свойства. Основной реквизит формы (у реквизита установлен признак Основной реквизит) выделен жирным шрифтом и расположен первым в списке реквизитов. Он определяет функциональность формы (рис. 28.4) .

Рис. 28.4. Закладка «Реквизиты» редактора формы Занятие 28 После того как реквизиты связаны с элементами формы (свойство элементов ПутьКДанным), данные реквизитов начинают отображаться в форме. Путь к данным реквизита автоматически заполняется при перетаскивании реквизита в окно элементов формы .

При этом создается элемент формы подходящего вида для отображения данных реквизита. Поэтому вышеописанный способ (путем перетаскивания реквизитов) – самый простой и удобный способ конструирования формы. Вызвав контекстное меню элемента формы, по команде Перейти можно быстро перейти к реквизиту формы, который отображается этим элементом .

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

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

Рис. 28.5. Закладка «Команды» редактора формы

Команды, созданные разработчиком, в свойстве Действие должны быть связаны с процедурой – обработчиком команды, которая описывается в модуле формы на встроенном языке (см. рис. 28.6) .

При перетаскивании команды в окно элементов формы в форме создается элемент (кнопка или гиперссылка), связанный с командой (свойство элемента Команда). При нажатии на него будет выполняться 868 1С:Предприятие 8.3. Практическое пособие разработчика процедура, указанная как обработчик команды. Вызвав контекстное меню элемента формы, по команде Перейти можно быстро перейти к команде формы, связанной с этим элементом .

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

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

Внизу окна редактора формы находится закладка Модуль .

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

–  –  –

Разработка произвольной формы для редактирования документа «Оказание услуги»

В режиме «Конфигуратор»

У нас в конфигурации уже существует основная форма документа ОказаниеУслуги. Эта форма была создана еще на четвертом занятии в разделе «Форма документа» на стр. 137 с помощью конструктора формы (рис. 28.7) .

Рис. 28.7. Форма документа «ОказаниеУслуги» в редакторе формы

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

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

870 1С:Предприятие 8.3. Практическое пособие разработчика Кроме того, расположение всех элементов редактирования друг за другом делает форму довольно громоздкой, особенно при наличии большой табличной части .

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

Для решения этих задач мы разработаем форму для редактирования документа ОказаниеУслуги с нуля.

Попутно мы освоим (или повторим) основные приемы разработки форм:

как добавить в форму основной реквизит;

как добавить элементы формы, связанные с данным реквизитом;

как объединить элементы формы в группы;

как задать свойства группы и сделать группу свертываемой;

как добавить в форму многостраничную панель;

как добавить в форму табличную часть и выделить ее строки по условию;

как вывести итог по колонке табличной части .

Итак, начнем .

Откроем окно редактирования объекта Документ ОказаниеУслуги и на закладке Формы нажмем кнопку Добавить над списком форм (рис. 28.8) .

–  –  –

Нажмем Готово .

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

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

На закладке Реквизиты создадим реквизит формы с именем ДокументОбъект и типом ДокументОбъект.ОказаниеУслуги. И обязательно укажем, что реквизит будет основным, установив флажок Основной реквизит (рис. 28.10) .

Рис. 28.10. Окно редактора формы872 1С:Предприятие 8.3. Практическое пособие разработчика

Сразу после установки основного реквизита формы в окне предварительного просмотра в командной панели формы появляются кнопки для выполнения стандартных действий с документами (Провести и закрыть, Записать, Провести и т. п.) .

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

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

Однако стандартно они размещаются друг под другом, как и в форме, созданной конструктором (рис. 28.11) .



Pages:     | 1 |   ...   | 2 | 3 || 5 |



Похожие работы:

«Согласовано: ФГБУ ВНИИПО МЧС России ОС "ПОЖТЕСТ" ФГУП "ВНИИФТРИ" ОС ВСИ "ВНИИФТРИ" ЭТИКЕТКА Оповещатель пожарный взрывозащищенный речевой "РЗОР-Exm-10-Прометей", "РЗОР-Exm-15-Прометей", "РЗОР-Exm...»

«HT-120 HT-300 HT-3000 HT-500 HT-5000 Меры предосторожности Спецификация изделия может быть изменена без каких-либо обязательств со стороны производителя. Пользуясь весами, всегда соблюдайте следующие меры...»

«Статья № Уменьшение коррозии со стороны почвы на днище нефтяных резервуаров посредством летучих ингибиторов коррозии Тив Уайтед Cortec Corporation Директор по проектированию и полевому обслуживанию 4119 White Bear Parkway St. Paul, MN 55110 (штат Миннесота) Ксианминг (Энди) Ю Saudi Aramco Отдел складских операций P.O. Box 4151 Ra...»

«Оборудование для диагностики трубопроводных сетей КАТАЛОГ 2018-2019 Информация О КОМПАНИИ Команда ДТС специализируется на поставках оборудования для диагностики трубопроводных сетей и производстве передвижных лабораторий на его ос...»

«PERCo 194295, Санкт-Петербург, а/я 87 Телефон (812) 329-89-24, 329-89-25 Факс (812) 516-48-76 market@perco.ru, www.perco.ru Трипод PERCo-TTR-04CW-24 Назначение Электромеханический турникет PERCo-TTR-04CW-24 предназначен для обеспечения контроля доступа на проходных предприятий и организаций, в спортивнооздоровительны...»

«ОСНОВНОЕ РУКОВОДСТВО Беспроводная игровая мышь Razer Mamba™ обеспечивает свободу манипуляций, удовлетворяет самым строгим требованиям любителей компьютерных игр и обладает безукоризненным дизайном. Добавьте к этому списку гибкие ф...»

«УДК 656.223.2:51 А. А. Оленцевич 1, Ю. О. Гуд 1, Ю. И. Белоголов 1 Иркутский государственный университет путей сообщения НЕИСПОЛНЕНИЕ ТРЕБОВАНИЙ РЕГЛАМЕНТИРУЮЩИХ ДОКУМЕНТОВ, КАК ОД...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ТЕХНИЧЕСКОМУ РЕГУЛИРОВАНИЮ И МЕТРОЛОГИИ НАЦИОНАЛЬНЫЙ ГОСТ Р ЕН СТАНДАРТ 14109— РОССИЙСКОЙ ФЕДЕРАЦИИ Производные жиров и масел. Метиловые эфиры жирных кислот (FAME) ОПРЕДЕЛЕНИЕ СОДЕРЖАНИЯ КАЛИЯ МЕТОДОМ АТОМНО-АБСОРБЦИОННОЙ СПЕКТРОМЕТРИИ...»

«СИСТЕМНЫЙ АНАЛИЗ, УПРАВЛЕНИЕ И ОБРАБОТКА ИНФОРМАЦИИ УДК 004. 932.2.517. 968 МЕТОДЫ И АЛГОРИТМЫ ПОВЫШЕНИЯ КАЧЕСТВА СЛАБОКОНТРАСТНОГО 2D ИЗОБРАЖЕНИЯ, ОБНАРУЖИВАЕМОГО ОПТИКО-ЭЛЕКТРОННЫМ ПРИБОРОМ ДИНАМИЧЕСКОГО ОБЪЕКТА Катулев А.Н.*, Ма...»

«Долгова Ольга Эдуардовна МУРАВЬИНЫЕ АЛГОРИТМЫ ДЛЯ РЕШЕНИЯ ЗАДАЧ МАРШРУТИЗАЦИИ ТРАНСПОРТА Специальность 05.13.18 — “Математическое моделирование, численные методы и комплексы программ” Автореферат диссертации на соискание ученой степени кандидата...»

«Министерство образования и науки Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования "НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ" Школа базовой инженерной подготовки Направление 38.03.03 "Управление персоналом" Отделение социально-гума...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ТЕХНИЧЕСКОМУ РЕГУЛИРОВАНИЮ И МЕТРОЛОГИИ Р 50.1.115— Р Е К О М Е Н Д А Ц И И ПО СТАНДАРТИЗАЦИ И 2016 Информационная технология КРИПТОГРАФИЧЕСКАЯ ЗАЩИТА ИНФОРМ...»

«Регулятор измерительный МИНИТЕРМ 500 2008 г. Настоящее руководство по эксплуатации предназначено для ознакомления обслуживающего персонала с устройством, принципом действия, конструкци ей, порядком эксплуатации и обслуживания измерителей регуляторов типа МИНИТЕРМ 500. Приборы МИНИТЕРМ 500 могут выпускаться в различных мо дификациях, о...»

«IX Международная научно-практическая конференция "Инновационные технологии в машиностроении" ОЦЕНКА 2D ПАРАМЕТРОВ ШЕРОХОВАТОСТИ И ВОЛНИСТОСТИ ПОВЕРХНОСТИ ПОСЛЕ ОБРАБОТКИ РЕЗАНИЕМ СПЛАВА АМГ2 С УЛЬТРАМЕЛКОЗЕРНИСТОЙ СТРУКТУРОЙ А.В. Филиппов, к.т.н, ст.преп.1, н.с.2, Н.Н. Шамарин, асс.1, О.А. Подгор...»

«НАЦИОНАЛЬНАЯ АКАДЕМИЯ НАУК БЕЛАРУСИ МЕЖГОСУДАРСТВЕННЫЙ КООРДИНАЦИОННЫЙ СОВЕТ ПО ФИЗИКЕ ПРОЧНОСТИ И ПЛАСТИЧНОСТИ МАТЕРИАЛОВ МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ ГОСУДАРСТВЕННЫЙ КОМИТЕТ ПО НАУКЕ И ТЕХНОЛОГИЯМ РЕСПУБЛИКИ БЕЛАРУСЬ БЕЛОРУССКИЙ РЕСПУБЛИКАНСКИЙ ФОНД ФУНДАМЕНТАЛЬНЫХ ИССЛЕДОВА...»

«СЕКЦИЯ 2. ГОСУДАРСТВЕННОЕ УПРАВЛЕНИЕ ТРАНСФОРМАЦИОННЫМИ ПРОЦЕССАМИ В ЭКОНОМИКЕ ЭКОНОМЕТРИЧЕСКОЕ МОДЕЛИРОВАНИЕ И АНАЛИЗ ВЛИЯНИЯ САНКЦИОНИРОВАННЫХ ДЕЙСТВИЙ СТРАН ЗАПАДА ПО ОТНОШЕНИЮ К РОССИИ НА КРУПНЕЙШИЕ РОССИЙСКИЕ ПРЕДПРИЯТИЯ И ФИНАНСОВЫЕ РЫНКИ Ю.В. Аксенова Томский политехнический университет, г. Томск E-mail: julieaksenova@...»

«ГОСТ 433-73 ГОСУДАРСТВЕННЫЙ СТАНДАРТ СОЮЗА ССР КАБЕЛИ СИЛОВЫЕ С РЕЗИНОВОЙ ИЗОЛЯЦИЕЙ ТЕХНИЧЕСКИЕ УСЛОВИЯ Rubber-insulated power cables. Specifications Дата введения 01.01.75 ИНФОРМАЦИОННЫЕ ДАННЫЕ 1. РАЗРАБОТАН И ВНЕСЕН Министерством электротехнической промышленности СССР РАЗРАБОТЧИКИ А. Г. Григорьян, А. И. Ба...»

«Министерство образования и науки Российской Федерации федеральное государственное автономное образовательное учреждение высшего образования "НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ" Школа ИШПР Направление подготовки Нефтегазовое дело Отделение школы Отделение не...»

«ББК 74.113.8 Ж92 Руководитель проекта "Предшкольная пора" — член-корреспондент Российской академии образования, профессор Н.Ф. Виноградова Журова Л.Е.Азбука для дошкольников : играем со звуками и словами : Ж92 ра...»

«1 ПРИНЦИПЫ ФОРМИРОВАНИЯ АРХИТЕКТУРЫ СОВРЕМЕННЫХ МОРСКИХ ВОКЗАЛЬНЫХ КОМПЛЕКСОВ УДК 725.1:656.6 ББК 85.11:38.74 А.В. Королькова Московский архитектурный институт (государственная академия), Москва, Россия Аннотация В статье рассмотрены актуальные п...»







 
2019 www.librus.dobrota.biz - «Бесплатная электронная библиотека - собрание публикаций»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.