Работа со ссылками

Для взаимодействия со ссылками на объекты базы данных 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;

заказОбъект.Записать(РежимЗаписиДокумента.Проведение);

После записи контекста объекта происходит полная загрузка всех его контекстных данных. Более подробная информация о работе с контекстом объектов находится в разделе "Работа с объектами".