Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Работа с функциями
Дальше: Функция внешней схемы

Собственная функция

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

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

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

Откроем окно редактирования источника данных Спа, содержащего эту таблицу, и на закладке Функции нажмем кнопку Добавить. В появившемся окне конструктора функций внешнего источника данных выберем пункт Вручную и нажмем Готово. Дадим функции имя ПолучитьМаксимальныйКлючТаблицы, укажем, что она возвращает значение типа Число (10, 0), а в поле Выражение в источнике данных напишем выражение: MAX(id) FROM spa.spa_treatments (рис. 2.34).

Рис. 2.34. Добавление собственной функции внешнего источника данных

Надо понимать, что при использовании функции во встроенном языке выражение, указанное в свойстве Выражение в источнике данных, будет использоваться в реальном запросе к базе данных. Это выражение непосредственно подставляется в конструкцию select <…>, поэтому слово «select» писать уже не нужно.

Теперь добавим в нашу конфигурацию еще одну общую команду ДобавитьСпаПроцедуру. Обработчик команды заполним следующим образом (листинг 2.3).

Листинг 2.3. Обработчик команды «ДобавитьСпаПроцедуру»

&НаКлиенте

Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

 

Оповещение = Новый ОписаниеОповещения("ПослеВводаСтроки", ЭтотОбъект);

ПоказатьВводСтроки(Оповещение, "Введите имя процедуры");

 

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

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

Листинг 2.4. Процедура «ПослеВводаСтроки»

&НаКлиенте

Процедура ПослеВводаСтроки(Строка, Параметры) Экспорт

 

Если НЕ Строка = Неопределено Тогда

ДобавитьПроцедуруВоВнешнийИсточник(Строка);

КонецЕсли;

 

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

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

Листинг 2.5. Процедура «ДобавитьПроцедуруВоВнешнийИсточник»

&НаСервере

Процедура ДобавитьПроцедуруВоВнешнийИсточник(СтрокаПроцедуры)

 

// Получить значение ключа с помощью функции ПолучитьМаксимальныйКлючТаблицы()

// внешнего источника данных Спа.

ЗначениеКлюча = ВнешниеИсточникиДанных.Спа.ПолучитьМаксимальныйКлючТаблицы() + 1;

 

// Создать менеджер таблицы spa_treatments внешнего источника данных Спа.

Процедуры = ВнешниеИсточникиДанных.Спа.Таблицы.spa_treatments;

 

// Найти запись в таблице spa_treatments по наименованию добавляемой процедуры.

Ссылка = Процедуры.НайтиПоПолю("description", СтрокаПроцедуры);

 

// Добавить новую процедуру в таблицу spa_treatments, если ее там еще нет.

Если Ссылка = Процедуры.ПустаяСсылка() ИЛИ Ссылка = Неопределено Тогда

НоваяПроцедура = Процедуры.СоздатьОбъект();

 

// Получить и установить изменяемые поля таблицы.

ИзменяемыеПоля = НоваяПроцедура.ПолучитьИзменяемыеПоля();

Если ИзменяемыеПоля.Найти("id") = Неопределено Тогда

// Включить ключевое поле в состав изменяемых полей для новой записи.

ИзменяемыеПоля.Добавить("id");

НоваяПроцедура.УстановитьИзменяемыеПоля(ИзменяемыеПоля);

КонецЕсли;

 

// Записать значение ключа в ключевое поле.

НоваяПроцедура.id = ЗначениеКлюча;

НоваяПроцедура.description = СтрокаПроцедуры;

НоваяПроцедура.Записать();

КонецЕсли;

 

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

В этой процедуре сначала мы получаем максимальное значение ключевого поля id в таблице spa_treatments с помощью функции ПолучитьМаксимальныйКлючТаблицы() внешнего источника данных Спа. И увеличиваем это значение на единицу.

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

Если такой процедуры в таблице еще нет, то она добавляется методом менеджера таблицы СоздатьОбъект(). При создании новой процедуры наряду с наименованием мы записываем получившееся новое значение ключа в ключевое поле (НоваяПроцедура.id = ЗначениеКлюча).

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

Рис. 2.35. Ошибка при записи в ключевое поле таблицы «spa_treatments»

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

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

Теперь все должно быть хорошо. Запустим «1С:Предприятие» и из меню Сервис выполним команду Добавить спа процедуру. В появившемся окне введем наименование новой процедуры и нажмем ОК. В результате введенная процедура со следующим по порядку значением ключевого поля появится в таблице spa_treatments внешнего источника данных (рис. 2.36).

Рис. 2.36. Добавление процедуры в таблицу внешнего источника данных

Назад: Работа с функциями
Дальше: Функция внешней схемы