Предположим, при программном добавлении косметической процедуры в таблицу 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. Добавление процедуры в таблицу внешнего источника данных