Работа со ссылками
Для взаимодействия со ссылками на объекты базы данных 1С реализовано два класса:
- ПеречислениеСсылка (для взаимодействия с перечислениями 1С);
- ОбъектСсылка (для взаимодействия с объектами коллекций 1С).
Ссылки используются для:
- непосредственно для передачи значений ссылочного типа между клиентским модулем и 1С в обоих направлениях;
- для доступа к контекстным данным объекта, на который указывает ссылка;
- для воссоздания контекста объекта с целью его модификации (только для ссылок на объекты).
"ОбъектСсылка" может ссылаться на:
- объект справочника (СправочникСсылка);
- объект документа (ДокументСсылка);
- объект плана видов характеристик (ПланВидовХарактеристикСсылка);
- объект плана счетов (ПланСчетовСсылка);
- объект плана видов расчета (ПланВидовРасчетаСсылка);
- объект бизнес-процесса (БизнесПроцессСсылка);
- объект задачи (ЗадачаСсылка).
Получение ссылок
Предопределенные значения
Ссылки на предопределенные значения хранятся в метаданных конфигурации на стороне клиентского модуля и могут быть получены без обращения к серверу. Для получения предопределенного значения достаточно обратиться к модулю менеджера соответствующей коллекции и указать имя предопределенного значения:
dynamic ндс18 = клиент.Перечисления.СтавкиНДС.НДС18;
dynamic видТовар = клиент.Справочники.ВидыНоменклатуры.Товары;
Получение из серверных методов
Ссылка на объект или перечисление может быть получена из серверного метода, возвращающего ссылку или структуру данных, содержащую ссылку:
dynamic телевизорСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор");
dynamic заказСсылка = клиент.Документы.ЗаказКлиента.НайтиПоНомеру("000000001", new DateTime(2019, 1, 1));
dynamic контрагентСсылка = клиент.Справочники.Контрагенты.НайтиПоКоду("000000002");
dynamic документы = клиент.КритерииОтбора.ДокументыКонтрагента.Найти(контрагентСсылка);
foreach (dynamic текДокСсылка in документы) {
Console.WriteLine(текДокСсылка);
}
Генерация ссылок
Ссылка на объект или перечисление может быть создана на стороне клиента. Создать ссылку можно:
- вызвав статический метод "СоздатьСсылку()" базового класса "Ссылка";
- вызвав метод "ПолучитьСсылку()" или "ПустаяСсылка()" модуля менеджера требуемой коллекции.
// Создаем пустую ссылку
dynamic пустаяСсылка = клиент.Справочники.Номенклатура.ПустаяСсылка();
// Создаем ссылку с указанием конкретного уникального идентификатора
dynamic известнаяСсылка1 = клиент.Справочники.Номенклатура.ПолучитьСсылку(new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7"));
dynamic известнаяСсылка2 = клиент.Справочники.Номенклатура.ПолучитьСсылку("5a32b6ab-4661-11e9-912a-38d547755ef7");
// Генерируем ссылку с новым уникальным идентификатором
dynamic новаяСсылка = клиент.Справочники.Номенклатура.ПолучитьСсылку(Guid.NewGuid());
// Создаем пустую ссылку
dynamic пустаяСсылка = Ссылка.СоздатьСсылку(клиент, "Справочник.Номенклатура");
// Создаем ссылку с указанием конкретного уникального идентификатора
dynamic известнаяСсылка = Ссылка.СоздатьСсылку(клиент, "Справочник.Номенклатура", new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7"));
// Генерируем ссылку с новым уникальным идентификатором
dynamic новаяСсылка = Ссылка.СоздатьСсылку(клиент, "Справочник.Номенклатура", Guid.NewGuid());
// Создаем пустую ссылку
dynamic пустаяСсылка = Ссылка.СоздатьСсылку(клиент, "Перечисление.СтавкиНДС");
// Создаем ссылку с указанием конкретного уникального идентификатора
dynamic известнаяСсылка = Ссылка.СоздатьСсылку(клиент, "Перечисление.СтавкиНДС", "НДС18");
Получение контекстных данных
Через ссылку на объект коллекции можно получить значения внутренних реквизитов и табличных частей объекта. Чтобы иметь возможность обращаться к контекстным данным ссылки, переменная ссылки должна быть объявлена как "dynamic". Контекстные данные объектов доступны только на чтение.
// Обращаемся к данным в объектном стиле
dynamic телевизорСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор");
string артикул = телевизорСсылка.Артикул;
dynamic производитель = телевизорСсылка.Производитель;
string иннПроизводителя = телевизорСсылка.Производитель.ИНН;
foreach (dynamic стр in телевизорСсылка.ДополнительныеРеквизиты) {
Console.WriteLine("{0}: {1}", стр.Свойство, стр.Значение);
}
// Обращаемся к данным через оператор "[]"
dynamic заказСсылка = клиент["Документы"]["ЗаказКлиента"].ПолучитьСсылку("5a32b6ab-4661-11e9-912a-38d547755ef7");
DateTime датаЗаказа = заказСсылка["Дата"];
dynamic контрагент = заказСсылка["Контрагент"];
string иннКонтрагента = заказСсылка["Контрагент"]["ИНН"];
foreach (dynamic стр in заказСсылка["Товары"]) {
Console.WriteLine("{0}: {1}", стр["Номенклатура"], стр["Количество"]);
}
ВАЖНО!
При обращении к любому атрибуту объекта через ссылку с сервера загружается полный набор данных объекта (данные всех реквизитов и табличных частей). Контекстные данные объекта ссылки хранятся на стороне клиента до тех пор, пока ссылка не будет уничтожена сборщиком мусора. Рекомендуется хранить ссылки до тех пор, пока их данные востребованы приложением. Все ссылки являются синглтонами, поэтому их поведение не зависит от способа получения самой ссылки.
Получение контекста объекта и редактирование данных
Через ссылку на объект может быть создан контекст объекта. Контекст объекта позволяет модифицировать данные объекта с последующей записью данных на стороне сервера.
dynamic товарСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Демо товар");
dynamic товарОбъект = товарСсылка.ПолучитьОбъект();
товарОбъект.Артикул = "Т-000123";
товарОбъект.Записать();
Console.WriteLine(товарСсылка.Артикул);
dynamic заказСсылка = клиент.Документы.ЗаказКлиента.НайтиПоНомеру("000000001", new DateTime(2019, 1, 1));
dynamic заказОбъект = заказСсылка.ПолучитьОбъект();
заказОбъект.Товары.Очистить();
dynamic стр = заказОбъект.Товары.Добавить();
стр.Номенклатура = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор");
стр.Количество = 2;
заказОбъект.Записать(РежимЗаписиДокумента.Проведение);
После записи контекста объекта происходит полная загрузка всех его контекстных данных. Более подробная информация о работе с контекстом объектов находится в разделе "Работа с объектами".