Работа со ссылками
Для взаимодействия со ссылками на объекты базы данных 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;
$заказОбъект->Записать(РежимЗаписиДокумента::Проведение());
После записи контекста объекта происходит полная загрузка всех его контекстных данных. Более подробная информация о работе с контекстом объектов находится в разделе "Работа с объектами".