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

Для взаимодействия со ссылками на объекты базы данных 1С реализовано два класса:

  • ПеречислениеСсылка (для взаимодействия с перечислениями 1С);
  • ОбъектСсылка (для взаимодействия с объектами коллекций 1С).

Ссылки используются для:

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

"ОбъектСсылка" может ссылаться на:

  • объект справочника (СправочникСсылка);
  • объект документа (ДокументСсылка);
  • объект плана видов характеристик (ПланВидовХарактеристикСсылка);
  • объект плана счетов (ПланСчетовСсылка);
  • объект плана видов расчета (ПланВидовРасчетаСсылка);
  • объект бизнес-процесса (БизнесПроцессСсылка);
  • объект задачи (ЗадачаСсылка).

Получение ссылок

Предопределенные значения

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

$ндс18 = $клиент->Перечисления->СтавкиНДС->НДС18;
$видТовар = $клиент->Справочники->ВидыНоменклатуры->Товары;

Получение из серверных методов

Ссылка на объект или перечисление может быть получена из серверного метода, возвращающего ссылку или структуру данных, содержащую ссылку:

$телевизорСсылка = $клиент->Справочники->Номенклатура->НайтиПоНаименованию("Телевизор");
$заказСсылка = $клиент->Документы->ЗаказКлиента->НайтиПоНомеру("000000001", new Дата("2019-01-01"));
$контрагентСсылка = $клиент->Справочники->Контрагенты->НайтиПоКоду("000000002");
$документы = $клиент->КритерииОтбора->ДокументыКонтрагента->Найти($контрагентСсылка);

foreach ($документы as $текДокСсылка) {
	echo("{$текДокСсылка} <br/>");
}

Генерация ссылок

Ссылка на объект или перечисление может быть создана на стороне клиента. Создать ссылку можно:

  • вызвав статический метод "СоздатьСсылку()" базового класса "Ссылка";
  • вызвав метод "ПолучитьСсылку()" или "ПустаяСсылка()" модуля менеджера требуемой коллекции.
// Создаем пустую ссылку
$пустаяСсылка = $клиент->Справочники->Номенклатура->ПустаяСсылка();

// Создаем ссылку с указанием конкретного уникального идентификатора 
$известнаяСсылка = $клиент->Справочники->Номенклатура->ПолучитьСсылку(new УникальныйИдентификатор("5a32b6ab-4661-11e9-912a-38d547755ef7"));

// Генерируем ссылку с новым уникальным идентификатором 
$новаяСсылка = $клиент->Справочники->Номенклатура->ПолучитьСсылку(new УникальныйИдентификатор());
// Создаем пустую ссылку 
$пустаяСсылка = Ссылка::СоздатьСсылку($клиент, "Справочник.Номенклатура");

// Создаем ссылку с указанием конкретного уникального идентификатора 
$известнаяСсылка = Ссылка::СоздатьСсылку($клиент, "Справочник.Номенклатура", new УникальныйИдентификатор("5a32b6ab-4661-11e9-912a-38d547755ef7"));

// Генерируем ссылку с новым уникальным идентификатором 
$новаяСсылка = Ссылка::СоздатьСсылку($клиент, "Справочник.Номенклатура", new УникальныйИдентификатор());
// Создаем пустую ссылку 
$пустаяСсылка = Ссылка::СоздатьСсылку($клиент, "Перечисление.СтавкиНДС");

// Создаем ссылку с указанием конкретного уникального идентификатора 
$известнаяСсылка = Ссылка::СоздатьСсылку($клиент, "Перечисление.СтавкиНДС", "НДС18");

Получение контекстных данных

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

// Обращаемся к данным в объектном стиле
$телевизорСсылка		= $клиент->Справочники->Номенклатура->НайтиПоНаименованию("Телевизор");

$артикул				= $телевизорСсылка->Артикул;
$производитель			= $телевизорСсылка->Производитель;
$иннПроизводителя		= $телевизорСсылка->Производитель->ИНН;

foreach ($телевизорСсылка->ДополнительныеРеквизиты as $стр) {
	echo("{$стр->Свойство}: {$стр->Значение} <br/>");
}

// Удаляем контекстные данные ссылки для экономии ресурсов, если они больше не нужны 
$клиент->Контекст()->ОчиститьДанныеОбъекта($телевизорСсылка);
// Обращаемся к данным через оператор "[]"
$заказСсылка	= $клиент["Документы"]["ЗаказКлиента"]->ПолучитьСсылку("5a32b6ab-4661-11e9-912a-38d547755ef7");

$датаЗаказа		= $заказСсылка["Дата"];
$контрагент		= $заказСсылка["Контрагент"];
$иннКонтрагента	= $заказСсылка["Контрагент"]["ИНН"];

foreach ($заказСсылка["Товары"] as $стр) {
	echo($стр["Номенклатура"].": ".$стр["Количество"]." <br/>");
}

// Удаляем контекстные данные ссылки для экономии ресурсов, если они больше не нужны 
$клиент->Контекст()->ОчиститьДанныеОбъекта($заказСсылка);

Получение контекста объекта и редактирование данных

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

$товарСсылка = $клиент->Справочники->Номенклатура->НайтиПоНаименованию("Демо товар");

$товарОбъект = $товарСсылка->ПолучитьОбъект();
$товарОбъект->Артикул = "Т-000123";
$товарОбъект->Записать();

echo($товарСсылка->Артикул);
$заказСсылка = $клиент->Документы->ЗаказКлиента->НайтиПоНомеру("000000001", new Дата("2019-01-01"));

$заказОбъект = $заказСсылка->ПолучитьОбъект();
$заказОбъект->Товары->Очистить();
$стр				= $заказОбъект->Товары->Добавить();
$стр->Номенклатура	= $клиент->Справочники->Номенклатура->НайтиПоНаименованию("Телевизор");
$стр->Количество	= 2;

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

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